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 }