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.Individual;
032 import ch.uzh.ifi.attempto.acewiki.core.ontology.Sentence;
033 import ch.uzh.ifi.attempto.acewiki.gui.IndexBar;
034 import ch.uzh.ifi.attempto.acewiki.gui.TextRow;
035 import ch.uzh.ifi.attempto.acewiki.gui.Title;
036 import ch.uzh.ifi.attempto.echocomp.DelayedComponent;
037 import ch.uzh.ifi.attempto.echocomp.Label;
038 import ch.uzh.ifi.attempto.echocomp.SolidLabel;
039 import ch.uzh.ifi.attempto.echocomp.VSpace;
040
041 /**
042 * This class represents a page that shows to which concepts a certain individual belongs.
043 * Such concept memberships are called "assignments" in AceWiki.
044 *
045 * @author Tobias Kuhn
046 */
047 public class AssignmentsPage extends WikiPage implements ActionListener {
048
049 private static final long serialVersionUID = -6955789540998283993L;
050
051 private static final int pageSize = 20;
052
053 private IndividualPage page;
054 private Column assignmentsColumn = new Column();
055 private int chosenPage = 0;
056
057 /**
058 * Creates a new assignments page.
059 *
060 * @param page The main page that contains the article.
061 */
062 public AssignmentsPage(IndividualPage page) {
063 super(page.getWiki(), new Title(page.getOntologyElement().getHeadword(), "- Assignments"));
064 this.page = page;
065
066 addTab("Article", this);
067 addTab("Proper Name", this);
068 addTab("References", this);
069 addSelectedTab("Assignments");
070
071 add(new VSpace(18));
072 add(assignmentsColumn);
073 }
074
075 protected void doUpdate() {
076 getTitle().setText(page.getOntologyElement().getHeadword());
077 assignmentsColumn.removeAll();
078
079 Column waitComp = new Column();
080 waitComp.setInsets(new Insets(10, 0, 0, 0));
081 waitComp.add(new Label(new ResourceImageReference("ch/uzh/ifi/attempto/acewiki/gui/img/wait.gif")));
082
083 if (((Individual) page.getOntologyElement()).areConceptsCached()) {
084 assignmentsColumn.add(new AssignmentsComponent());
085 } else {
086 assignmentsColumn.add(new DelayedComponent(waitComp) {
087
088 private static final long serialVersionUID = 5909558908521223531L;
089
090 public Component initComponent() {
091 return new AssignmentsComponent();
092 }
093
094 });
095 }
096 }
097
098 public void actionPerformed(ActionEvent e) {
099 if ("Article".equals(e.getActionCommand())) {
100 log("page", "pressed: article");
101 getWiki().showPage(page);
102 } else if ("Proper Name".equals(e.getActionCommand())) {
103 log("page", "pressed: word");
104 getWiki().showPage(new WordPage(page));
105 } else if ("References".equals(e.getActionCommand())) {
106 log("page", "pressed: references");
107 getWiki().showPage(new ReferencesPage(page));
108 }
109 }
110
111 public boolean equals(Object obj) {
112 if (obj instanceof AssignmentsPage) {
113 return page.equals(((AssignmentsPage) obj).page);
114 }
115 return false;
116 }
117
118 public boolean isExpired() {
119 return page.isExpired();
120 }
121
122 public String toString() {
123 return "-ASS- " + page.getOntologyElement().getWord();
124 }
125
126
127 private class AssignmentsComponent extends Column implements ActionListener {
128
129 private static final long serialVersionUID = -441448088305771435L;
130
131 private Column sentencesColumn = new Column();
132 private IndexBar indexBar;
133 private ArrayList<Sentence> sentences;
134
135 public AssignmentsComponent() {
136 indexBar = new IndexBar("Page:", 0, this);
137 add(indexBar);
138
139 sentencesColumn.setInsets(new Insets(10, 2, 5, 20));
140 sentencesColumn.setCellSpacing(new Extent(2));
141 add(sentencesColumn);
142
143 Individual ind = (Individual) page.getOntologyElement();
144 List<Concept> concepts = ind.getConcepts();
145 sentences = new ArrayList<Sentence>();
146 Collections.sort(concepts);
147 for (Concept c : concepts) {
148 sentences.add(new Sentence(ind.getWord(2) + " is a " + c.getWord() + ".", ind.getOntology()));
149 }
150 if (sentences.size() == 0) {
151 indexBar.setVisible(false);
152 sentencesColumn.add(new SolidLabel("(no assignment found)", Font.ITALIC, 10));
153 } else {
154 int i = ((sentences.size()-1) / pageSize) + 1;
155 if (chosenPage > i) chosenPage = 0;
156 indexBar.setNumbers(i);
157 indexBar.setActiveButton(chosenPage);
158 updatePage();
159 }
160 }
161
162 private void updatePage() {
163 sentencesColumn.removeAll();
164
165 indexBar.setVisible(sentences.size() > pageSize);
166
167 int max = sentences.size();
168 if (max > (chosenPage + 1) * pageSize) max = (chosenPage + 1) * pageSize;
169
170 for (int i = chosenPage * pageSize; i < max; i++) {
171 Row r = new Row();
172 r.add(new TextRow(sentences.get(i), AssignmentsPage.this));
173 sentencesColumn.add(r);
174 }
175 }
176
177 public void actionPerformed(ActionEvent e) {
178 if (e.getSource() == indexBar) {
179 chosenPage = Integer.parseInt(e.getActionCommand()) - 1;
180 log("page", "pressed: page " + (chosenPage+1));
181 updatePage();
182 }
183 }
184
185 }
186
187 }