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 import java.util.List; 020 021 import nextapp.echo2.app.Column; 022 import nextapp.echo2.app.Component; 023 import nextapp.echo2.app.Extent; 024 import nextapp.echo2.app.Font; 025 import nextapp.echo2.app.Insets; 026 import nextapp.echo2.app.ResourceImageReference; 027 import nextapp.echo2.app.Row; 028 import nextapp.echo2.app.event.ActionEvent; 029 import nextapp.echo2.app.event.ActionListener; 030 import ch.uzh.ifi.attempto.acewiki.core.ontology.Concept; 031 import ch.uzh.ifi.attempto.acewiki.core.ontology.Sentence; 032 import ch.uzh.ifi.attempto.acewiki.gui.IndexBar; 033 import ch.uzh.ifi.attempto.acewiki.gui.TextRow; 034 import ch.uzh.ifi.attempto.acewiki.gui.Title; 035 import ch.uzh.ifi.attempto.echocomp.DelayedComponent; 036 import ch.uzh.ifi.attempto.echocomp.Label; 037 import ch.uzh.ifi.attempto.echocomp.SolidLabel; 038 import ch.uzh.ifi.attempto.echocomp.VSpace; 039 040 /** 041 * This class represents a page that shows the super-concepts and sub-concepts for a given concept. 042 * Such super- and sub-concept relations are called "hierarchy" in AceWiki. 043 * 044 * @author Tobias Kuhn 045 */ 046 public class HierarchyPage extends WikiPage implements ActionListener { 047 048 private static final long serialVersionUID = 3126817139010810197L; 049 050 private static final int pageSize = 15; 051 052 private ConceptPage page; 053 054 private Column upHierarchyColumn = new Column(); 055 private Column downHierarchyColumn = new Column(); 056 private int upChosenPage = 0; 057 private int downChosenPage = 0; 058 059 /** 060 * Creates a new hierarchy page. 061 * 062 * @param page The main page that contains the article. 063 */ 064 public HierarchyPage(ConceptPage page) { 065 super(page.getWiki(), new Title(page.getOntologyElement().getHeadword(), "- Hierarchy")); 066 this.page = page; 067 068 addTab("Article", this); 069 addTab("Noun", this); 070 addTab("References", this); 071 addTab("Individuals", this); 072 addSelectedTab("Hierarchy"); 073 074 add(new VSpace(12)); 075 076 addHeadline("Upward"); 077 add(new VSpace(5)); 078 add(upHierarchyColumn); 079 080 addHeadline("Downward"); 081 add(new VSpace(5)); 082 add(downHierarchyColumn); 083 } 084 085 protected void doUpdate() { 086 getTitle().setText(page.getOntologyElement().getHeadword()); 087 upHierarchyColumn.removeAll(); 088 downHierarchyColumn.removeAll(); 089 090 Column waitComp1 = new Column(); 091 waitComp1.setInsets(new Insets(10, 0, 0, 0)); 092 waitComp1.add(new Label(new ResourceImageReference("ch/uzh/ifi/attempto/acewiki/gui/img/wait.gif"))); 093 094 Concept c = (Concept) page.getOntologyElement(); 095 096 if (c.areSuperConceptsCached()) { 097 upHierarchyColumn.add(new HierarchyComponent(true)); 098 } else { 099 upHierarchyColumn.add(new DelayedComponent(waitComp1) { 100 101 private static final long serialVersionUID = -5068057863490522605L; 102 103 public Component initComponent() { 104 return new HierarchyComponent(true); 105 } 106 107 }); 108 } 109 110 Column waitComp2 = new Column(); 111 waitComp2.setInsets(new Insets(10, 0, 0, 0)); 112 waitComp2.add(new Label(new ResourceImageReference("ch/uzh/ifi/attempto/acewiki/gui/img/wait.gif"))); 113 114 if (c.areSubConceptsCached()) { 115 downHierarchyColumn.add(new HierarchyComponent(false)); 116 } else { 117 downHierarchyColumn.add(new DelayedComponent(waitComp2) { 118 119 private static final long serialVersionUID = 2782291841490690030L; 120 121 public Component initComponent() { 122 return new HierarchyComponent(false); 123 } 124 125 }); 126 } 127 } 128 129 public void actionPerformed(ActionEvent e) { 130 if ("Article".equals(e.getActionCommand())) { 131 log("page", "pressed: article"); 132 getWiki().showPage(page); 133 } else if ("Noun".equals(e.getActionCommand())) { 134 log("page", "pressed: word"); 135 getWiki().showPage(new WordPage(page)); 136 } else if ("References".equals(e.getActionCommand())) { 137 log("page", "pressed: references"); 138 getWiki().showPage(new ReferencesPage(page)); 139 } else if ("Individuals".equals(e.getActionCommand())) { 140 log("page", "pressed: individuals"); 141 getWiki().showPage(new IndividualsPage(page)); 142 } 143 } 144 145 public boolean equals(Object obj) { 146 if (obj instanceof HierarchyPage) { 147 return page.equals(((HierarchyPage) obj).page); 148 } 149 return false; 150 } 151 152 public boolean isExpired() { 153 return page.isExpired(); 154 } 155 156 public String toString() { 157 return "-IND- " + page.getOntologyElement().getWord(); 158 } 159 160 private class HierarchyComponent extends Column implements ActionListener { 161 162 private static final long serialVersionUID = 6461817187189387351L; 163 164 private boolean up; 165 private Column column = new Column(); 166 private IndexBar indexBar; 167 private ArrayList<Sentence> sentences; 168 169 170 public HierarchyComponent(boolean up) { 171 this.up = up; 172 indexBar = new IndexBar("Page:", 0, this); 173 add(indexBar); 174 column.setInsets(new Insets(10, 2, 5, 10)); 175 column.setCellSpacing(new Extent(2)); 176 add(column); 177 178 Concept concept = (Concept) page.getOntologyElement(); 179 List<Concept> concepts; 180 181 if (up) { 182 concepts = concept.getSuperConcepts(); 183 } else { 184 concepts = concept.getSubConcepts(); 185 } 186 sentences = new ArrayList<Sentence>(); 187 Collections.sort(concepts); 188 for (Concept c : concepts) { 189 if (up) { 190 sentences.add(new Sentence("Every " + concept.getWord() + " is a " + c.getWord() + ".", concept.getOntology())); 191 } else { 192 sentences.add(new Sentence("Every " + c.getWord() + " is a " + concept.getWord() + ".", concept.getOntology())); 193 } 194 } 195 196 updatePage(); 197 } 198 199 private void updatePage() { 200 column.removeAll(); 201 202 String t; 203 int chosenPage; 204 if (up) { 205 t = "upward"; 206 chosenPage = upChosenPage; 207 } else { 208 t = "downward"; 209 chosenPage = downChosenPage; 210 } 211 212 if (sentences.size() == 0) { 213 indexBar.setVisible(false); 214 column.add(new SolidLabel("(" + t + " hierarchy is empty)", Font.ITALIC, 10)); 215 } else { 216 int i = ((sentences.size()-1) / pageSize) + 1; 217 if (chosenPage > i) chosenPage = 0; 218 indexBar.setNumbers(i); 219 indexBar.setActiveButton(chosenPage); 220 } 221 222 indexBar.setVisible(sentences.size() > pageSize); 223 224 int max = sentences.size(); 225 if (max > (chosenPage + 1) * pageSize) max = (chosenPage + 1) * pageSize; 226 for (int i = chosenPage * pageSize; i < max; i++) { 227 Row r = new Row(); 228 r.add(new TextRow(sentences.get(i), HierarchyPage.this)); 229 column.add(r); 230 } 231 } 232 233 public void actionPerformed(ActionEvent e) { 234 if (e.getSource() == indexBar) { 235 if (up) { 236 upChosenPage = Integer.parseInt(e.getActionCommand()) - 1; 237 log("page", "pressed: page up:" + (upChosenPage+1)); 238 updatePage(); 239 } else { 240 downChosenPage = Integer.parseInt(e.getActionCommand()) - 1; 241 log("page", "pressed: page down:" + (downChosenPage+1)); 242 updatePage(); 243 } 244 } 245 } 246 247 } 248 249 }