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 }