001 // This file is part of the Attempto Java Packages.
002 // Copyright 2008, Attempto Group, University of Zurich (see http://attempto.ifi.uzh.ch).
003 //
004 // The Attempto Java Packages is free software: you can redistribute it and/or modify it under the
005 // terms of the GNU Lesser General Public License as published by the Free Software Foundation,
006 // either version 3 of the License, or (at your option) any later version.
007 //
008 // The Attempto Java Packages is distributed in the hope that it will be useful, but WITHOUT ANY
009 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
010 // PURPOSE. See the GNU Lesser General Public License for more details.
011 //
012 // You should have received a copy of the GNU Lesser General Public License along with the Attempto
013 // Java Packages. If not, see http://www.gnu.org/licenses/.
014
015 package ch.uzh.ifi.attempto.acewiki.gui.page;
016
017 import java.util.ArrayList;
018 import java.util.Collections;
019
020 import nextapp.echo2.app.Column;
021 import nextapp.echo2.app.Extent;
022 import nextapp.echo2.app.Font;
023 import nextapp.echo2.app.Insets;
024 import nextapp.echo2.app.event.ActionEvent;
025 import nextapp.echo2.app.event.ActionListener;
026 import ch.uzh.ifi.attempto.acewiki.Wiki;
027 import ch.uzh.ifi.attempto.acewiki.core.ontology.OntologyElement;
028 import ch.uzh.ifi.attempto.acewiki.gui.IndexBar;
029 import ch.uzh.ifi.attempto.acewiki.gui.ListItem;
030 import ch.uzh.ifi.attempto.acewiki.gui.Title;
031 import ch.uzh.ifi.attempto.acewiki.gui.WikiLink;
032 import ch.uzh.ifi.attempto.echocomp.SolidLabel;
033 import ch.uzh.ifi.attempto.echocomp.VSpace;
034
035 /**
036 * This class represents an page that shows an index of all articles that exist in the wiki.
037 *
038 * @author Tobias Kuhn
039 */
040 public class IndexPage extends WikiPage implements ActionListener {
041
042 private static final long serialVersionUID = 6061966610996079528L;
043
044 private static final int pageSize = 25;
045
046 private String chosenChar = "A";
047 private int chosenPage = 0;
048 private ArrayList<OntologyElement> matchingElements;
049
050 private Column indexColumn = new Column();
051 private IndexBar letterIndexBar;
052 private IndexBar numberIndexBar;
053
054 /**
055 * Creates a new index page.
056 *
057 * @param wiki The wiki instance.
058 */
059 public IndexPage(Wiki wiki) {
060 super(wiki, new Title("Index", true));
061
062 addTab("Main Page", this);
063 addSelectedTab("Index");
064 addTab("Search", this);
065
066 add(new VSpace(20));
067
068 letterIndexBar = new IndexBar("First letter:", this);
069 add(letterIndexBar);
070
071 numberIndexBar = new IndexBar("Page:", 0, this);
072 add(numberIndexBar);
073
074 indexColumn.setInsets(new Insets(10, 5, 5, 20));
075 indexColumn.setCellSpacing(new Extent(2));
076 add(indexColumn);
077
078 update();
079 }
080
081 protected void doUpdate() {
082 ArrayList<OntologyElement> elements = new ArrayList<OntologyElement>(getWiki().getOntologyElements());
083 Collections.sort(elements);
084
085 indexColumn.removeAll();
086
087 matchingElements = new ArrayList<OntologyElement>();
088 for (OntologyElement e : elements) {
089 if (e.getHeadword().toUpperCase().startsWith(chosenChar)) {
090 matchingElements.add(e);
091 }
092 }
093 if (matchingElements.size() == 0) {
094 numberIndexBar.setVisible(false);
095 indexColumn.add(new SolidLabel("(no entry starting with '" + chosenChar + "')", Font.ITALIC, 10));
096 } else {
097 int i = ((matchingElements.size()-1) / pageSize) + 1;
098 if (chosenPage > i) chosenPage = 0;
099 numberIndexBar.setNumbers(i);
100 numberIndexBar.setActiveButton(chosenPage);
101 updatePage();
102 }
103 }
104
105 private void updatePage() {
106 indexColumn.removeAll();
107
108 numberIndexBar.setVisible(matchingElements.size() > pageSize);
109
110 int max = matchingElements.size();
111 if (max > (chosenPage + 1) * pageSize) max = (chosenPage + 1) * pageSize;
112
113 for (int i = chosenPage * pageSize; i < max; i++) {
114 indexColumn.add(new ListItem(new WikiLink(matchingElements.get(i), getWiki())));
115 }
116 }
117
118 public void actionPerformed(ActionEvent e) {
119 if (e.getSource() == letterIndexBar) {
120 chosenChar = e.getActionCommand();
121 log("page", "pressed: first letter " + chosenChar);
122 chosenPage = 0;
123 update();
124 } else if (e.getSource() == numberIndexBar) {
125 chosenPage = Integer.parseInt(e.getActionCommand()) - 1;
126 log("page", "pressed: page " + (chosenPage+1));
127 updatePage();
128 } else if ("Main Page".equals(e.getActionCommand())) {
129 getWiki().showStartPage();
130 } else if ("Search".equals(e.getActionCommand())) {
131 getWiki().showSearchPage();
132 }
133 }
134
135 public boolean equals(Object obj) {
136 return obj instanceof IndexPage;
137 }
138
139 public String toString() {
140 return "-INDEX-";
141 }
142
143 }