001 // This file is part of AceWiki.
002 // Copyright 2008-2012, AceWiki developers.
003 //
004 // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
005 // Lesser General Public License as published by the Free Software Foundation, either version 3 of
006 // the License, or (at your option) any later version.
007 //
008 // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
009 // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
010 // Lesser General Public License for more details.
011 //
012 // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
013 // not, see http://www.gnu.org/licenses/.
014
015 package ch.uzh.ifi.attempto.acewiki.gui;
016
017 import java.util.ArrayList;
018 import java.util.List;
019
020 import nextapp.echo.app.Color;
021 import nextapp.echo.app.Column;
022 import nextapp.echo.app.Extent;
023 import nextapp.echo.app.Font;
024 import nextapp.echo.app.Insets;
025 import nextapp.echo.app.Row;
026 import nextapp.echo.app.event.ActionEvent;
027 import nextapp.echo.app.event.ActionListener;
028 import ch.uzh.ifi.attempto.acewiki.Wiki;
029 import ch.uzh.ifi.attempto.acewiki.core.Article;
030 import ch.uzh.ifi.attempto.acewiki.core.LanguageUtils;
031 import ch.uzh.ifi.attempto.acewiki.core.OntologyElement;
032 import ch.uzh.ifi.attempto.acewiki.core.Sentence;
033 import ch.uzh.ifi.attempto.echocomp.HSpace;
034 import ch.uzh.ifi.attempto.echocomp.SolidLabel;
035 import ch.uzh.ifi.attempto.echocomp.VSpace;
036
037 /**
038 * This class represents a page that shows all references for a certain ontology element.
039 *
040 * @author Tobias Kuhn
041 */
042 public class ReferencesPage extends WikiPage implements ActionListener {
043
044 private static final long serialVersionUID = 1025665226113017153L;
045
046 private static final int pageSize = 50;
047
048 private ArticlePage page;
049 private Column referenceColumn = new Column();
050 private IndexBar indexBar;
051 private List<Sentence> sentences;
052 private int chosenPage = 0;
053 private Title title;
054
055 /**
056 * Creates a new references page.
057 *
058 * @param page The main page that contains the article.
059 */
060 public ReferencesPage(ArticlePage page) {
061 super(page.getWiki());
062 this.page = page;
063
064 addTab("Article", this);
065 addSelectedTab("References");
066 if (page instanceof ConceptPage) {
067 addTab("Individuals", this);
068 addTab("Hierarchy", this);
069 }
070 if (page instanceof IndividualPage) {
071 addTab("Assignments", this);
072 }
073
074 OntologyElement oe = page.getOntologyElement();
075 title = new Title(getHeading(oe), "- References", oe.getType(), this);
076 add(title);
077 addHorizontalLine();
078 add(new VSpace(18));
079
080 indexBar = new IndexBar("Page:", 0, this);
081 add(indexBar);
082
083 referenceColumn.setInsets(new Insets(10, 2, 5, 20));
084 referenceColumn.setCellSpacing(new Extent(2));
085 add(referenceColumn);
086 }
087
088 protected void doUpdate() {
089 title.setText(getHeading(page.getOntologyElement()));
090 referenceColumn.removeAll();
091 List<OntologyElement> ontologyElements = getWiki().getOntologyElements();
092 sentences = new ArrayList<Sentence>();
093 LanguageUtils.sortOntologyElements(ontologyElements);
094 for (OntologyElement oe : ontologyElements) {
095 if (oe == page.getOntologyElement()) continue;
096 for (Sentence s : oe.getArticle().getSentences()) {
097 if (s.contains(page.getOntologyElement())) {
098 sentences.add(s);
099 }
100 }
101 }
102 if (sentences.size() == 0) {
103 indexBar.setVisible(false);
104 String h = LanguageUtils.getPrettyPrinted(page.getOntologyElement().getHeadwords()[0]);
105 referenceColumn.add(new SolidLabel(
106 "(no other article refers to '" + h + "')",
107 Font.ITALIC,
108 10
109 ));
110 } else {
111 int i = ((sentences.size()-1) / pageSize) + 1;
112 if (chosenPage > i) chosenPage = 0;
113 indexBar.setNumbers(i);
114 indexBar.setActiveButton(chosenPage);
115 updatePage();
116 }
117 }
118
119 private void updatePage() {
120 referenceColumn.removeAll();
121
122 indexBar.setVisible(sentences.size() > pageSize);
123
124 int max = sentences.size();
125 if (max > (chosenPage + 1) * pageSize) max = (chosenPage + 1) * pageSize;
126
127 Article a = null;
128 for (int i = chosenPage * pageSize; i < max; i++) {
129 Sentence s = sentences.get(i);
130 if (a != s.getArticle()) {
131 a = s.getArticle();
132 Row r = new Row();
133 Column c = new Column();
134 c.add(new WikiLink(a.getOntologyElement(), getWiki()));
135 Row line = new Row();
136 line.setBackground(Color.DARKGRAY);
137 line.setInsets(new Insets(0, 1, 0, 0));
138 c.add(line);
139 r.add(c);
140 if (i > 0 && sentences.get(i-1).getArticle() == a) {
141 r.add(new HSpace());
142 r.add(new SolidLabel("(continued)", Font.ITALIC, 10));
143 }
144 referenceColumn.add(new VSpace());
145 referenceColumn.add(r);
146 }
147 Row r = new Row();
148 r.add(new SentenceComponent(s, this));
149 referenceColumn.add(r);
150 }
151 }
152
153 public void actionPerformed(ActionEvent e) {
154 Wiki wiki = getWiki();
155 if ("Article".equals(e.getActionCommand())) {
156 log("page", "pressed: article");
157 wiki.showPage(page);
158 } else if ("Individuals".equals(e.getActionCommand())) {
159 log("page", "pressed: individuals");
160 wiki.showPage(new IndividualsPage((ConceptPage) page));
161 } else if ("Hierarchy".equals(e.getActionCommand())) {
162 log("page", "pressed: hierarchy");
163 wiki.showPage(new HierarchyPage((ConceptPage) page));
164 } else if ("Assignments".equals(e.getActionCommand())) {
165 log("page", "pressed: assignments");
166 wiki.showPage(new AssignmentsPage((IndividualPage) page));
167 } else if (e.getSource() == indexBar) {
168 chosenPage = Integer.parseInt(e.getActionCommand()) - 1;
169 log("page", "pressed: page " + (chosenPage+1));
170 updatePage();
171 } else if (e.getSource() == title) {
172 wiki.showEditorWindow(page.getOntologyElement());
173 }
174 }
175
176 public boolean equals(Object obj) {
177 if (obj instanceof ReferencesPage) {
178 return page.equals(((ReferencesPage) obj).page);
179 }
180 return false;
181 }
182
183 public boolean isExpired() {
184 return page.isExpired();
185 }
186
187 public String toString() {
188 return "-REF- " + page.getOntologyElement().getWord();
189 }
190
191 }