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;
016
017 import java.util.Collections;
018 import java.util.List;
019
020 import nextapp.echo2.app.Color;
021 import nextapp.echo2.app.Column;
022 import nextapp.echo2.app.Component;
023 import nextapp.echo2.app.Font;
024 import nextapp.echo2.app.Insets;
025 import nextapp.echo2.app.ResourceImageReference;
026 import nextapp.echo2.app.Row;
027 import nextapp.echo2.app.event.ActionEvent;
028 import nextapp.echo2.app.event.ActionListener;
029 import ch.uzh.ifi.attempto.acewiki.Task;
030 import ch.uzh.ifi.attempto.acewiki.Wiki;
031 import ch.uzh.ifi.attempto.acewiki.core.ontology.Individual;
032 import ch.uzh.ifi.attempto.acewiki.core.ontology.OntologyElement;
033 import ch.uzh.ifi.attempto.acewiki.core.ontology.Sentence;
034 import ch.uzh.ifi.attempto.acewiki.core.text.OntologyTextElement;
035 import ch.uzh.ifi.attempto.acewiki.gui.editor.SentenceEditorHandler;
036 import ch.uzh.ifi.attempto.acewiki.gui.page.ArticlePage;
037 import ch.uzh.ifi.attempto.acewiki.gui.page.LogicPage;
038 import ch.uzh.ifi.attempto.acewiki.gui.page.SentencePage;
039 import ch.uzh.ifi.attempto.acewiki.gui.page.WikiPage;
040 import ch.uzh.ifi.attempto.echocomp.DelayedComponent;
041 import ch.uzh.ifi.attempto.echocomp.HSpace;
042 import ch.uzh.ifi.attempto.echocomp.Label;
043 import ch.uzh.ifi.attempto.echocomp.MessageWindow;
044 import ch.uzh.ifi.attempto.echocomp.SolidLabel;
045 import ch.uzh.ifi.attempto.echocomp.VSpace;
046 import ch.uzh.ifi.attempto.preditor.text.TextElement;
047
048 /**
049 * This class represents a text row that consists of a drop down menu and an ACE text.
050 *
051 * @author Tobias Kuhn
052 */
053 public class TextRow extends Column implements ActionListener {
054
055 private static final long serialVersionUID = -540135972060005725L;
056
057 private Sentence sentence;
058 private Wiki wiki;
059 private WikiPage hostPage;
060
061 private Row sentenceRow = new Row();
062 private DropDownMenu dropDown;
063
064 /**
065 * Creates a new text row. The host page is the page that contains the text row (which is
066 * not necessarily the owner page of the sentence).
067 *
068 * @param sentence The sentence to be shown.
069 * @param hostPage The host page of the text row.
070 */
071 public TextRow(Sentence sentence, WikiPage hostPage) {
072 this.sentence = sentence;
073 this.hostPage = hostPage;
074 this.wiki = hostPage.getWiki();
075 update();
076 }
077
078 private void update() {
079 if (sentence.isInferred()) {
080 dropDown = new DropDownMenu("light-blue", this);
081 } else if (sentence.isReasonerParticipant() || sentence.isQuestion()) {
082 dropDown = new DropDownMenu("blue", this);
083 } else {
084 dropDown = new DropDownMenu("red", this);
085 }
086 if (!sentence.isIntegrated() && !sentence.isInferred()) {
087 dropDown.addMenuEntry("Reassert");
088 dropDown.addMenuSeparator();
089 }
090 if (!sentence.isInferred()) {
091 dropDown.addMenuEntry("Edit...");
092 }
093 if (hostPage instanceof ArticlePage) {
094 dropDown.addMenuEntry("Add...");
095 }
096 if (!sentence.isInferred()) {
097 dropDown.addMenuEntry("Delete");
098 }
099 dropDown.addMenuSeparator();
100 dropDown.addMenuEntry("Details");
101 dropDown.addMenuEntry("Logic");
102
103 Row r = new Row();
104 Color color = Color.BLACK;
105 boolean isRed = !sentence.isIntegrated() && !sentence.isInferred() && !sentence.isQuestion();
106 if (isRed) {
107 color = new Color(193, 0, 0);
108 }
109 for (TextElement e : sentence.getTextElements()) {
110 if (!e.getText().matches("[.?]") && r.getComponentCount() > 0) {
111 r.add(new HSpace());
112 }
113 if (e instanceof OntologyTextElement) {
114 // Proper names with definite articles are handled differently:
115 // The "the" is not a part of the link. Probably, this should be done at a different place...
116 OntologyElement oe = ((OntologyTextElement) e).getOntologyElement();
117 if (oe instanceof Individual && ((Individual) oe).hasDefiniteArticle()) {
118 SolidLabel l = new SolidLabel(e.getText().substring(0, 3));
119 l.setForeground(color);
120 r.add(l);
121 r.add(new HSpace());
122 r.add(new WikiLink(oe, oe.getPrettyWord(1), wiki, isRed));
123 } else {
124 r.add(new WikiLink(((OntologyTextElement) e), wiki, isRed));
125 }
126 } else {
127 SolidLabel l = new SolidLabel(e.getText());
128 l.setForeground(color);
129 r.add(l);
130 }
131 }
132
133 removeAll();
134 sentenceRow.removeAll();
135 sentenceRow.add(dropDown);
136 sentenceRow.add(new HSpace(5));
137 sentenceRow.add(r);
138 sentenceRow.add(new HSpace(10));
139 add(sentenceRow);
140
141 if (sentence.isQuestion() && hostPage instanceof ArticlePage) {
142
143 Column answerColumn = new Column();
144 answerColumn.setInsets(new Insets(20, 0, 0, 0));
145 add(answerColumn);
146
147 if (sentence.isAnswerCached()) {
148
149 Column column = new Column();
150 List<Individual> individuals = sentence.getAnswer();
151 if (individuals.size() > 0) {
152 Collections.sort(individuals);
153 for (Individual ind : individuals) {
154 Row answerRow = new Row();
155 answerRow.add(new ListItem(new WikiLink(ind, wiki)));
156 column.add(answerRow);
157 }
158 } else {
159 column.add(new SolidLabel("(no answer found)", Font.ITALIC, 10));
160 }
161 column.add(new VSpace(4));
162 answerColumn.add(column);
163
164 } else {
165 answerColumn.add(new DelayedComponent(new Label(new ResourceImageReference("ch/uzh/ifi/attempto/acewiki/gui/img/wait.gif"))) {
166
167 private static final long serialVersionUID = 7865984138467729544L;
168
169 public Component initComponent() {
170 Column column = new Column();
171 List<Individual> individuals = sentence.getAnswer();
172 if (individuals.size() > 0) {
173 Collections.sort(individuals);
174 for (Individual ind : individuals) {
175 Row answerRow = new Row();
176 answerRow.add(new ListItem(new WikiLink(ind, wiki)));
177 column.add(answerRow);
178 }
179 } else {
180 column.add(new SolidLabel("(no answer found)", Font.ITALIC, 10));
181 }
182 column.add(new VSpace(4));
183
184 return column;
185 }
186
187 });
188 }
189
190 }
191 }
192
193 public void actionPerformed(ActionEvent e) {
194 if (e.getActionCommand().equals("Edit...")) {
195 wiki.log("page", "dropdown: edit sentence: " + sentence.getText());
196 ArticlePage page = ArticlePage.create(sentence.getOwner(), wiki);
197 wiki.showPage(page);
198 page.edit(sentence);
199 } else if (e.getActionCommand().equals("Add...")) {
200 wiki.log("page", "dropdown: add sentence");
201 wiki.showWindow(SentenceEditorHandler.generatePreditorAddWindow(sentence, (ArticlePage) hostPage));
202 } else if (e.getActionCommand().equals("Delete")) {
203 wiki.log("page", "dropdown: delete sentence: " + sentence.getText());
204 wiki.showWindow(new MessageWindow("Delete", "Do you really want to delete this sentence?", null, this, "Yes", "No"));
205 } else if (e.getActionCommand().equals("Reassert")) {
206 int success = sentence.reassert();
207 if (success == 1) {
208 wiki.showWindow(new MessageWindow("Conflict", "A sentence is in conflict with the current knowledge. For that reason, it cannot be added to the knowledge base.", "OK"));
209 } else if (success == 2) {
210 wiki.showWindow(new MessageWindow("Error", "A sentence could not be added to the knowledge base because the knowledge base got too complex.", "OK"));
211 }
212 if (sentence.isIntegrated()) {
213 update();
214 }
215 } else if (e.getActionCommand().equals("Details")) {
216 wiki.log("page", "dropdown: details sentence: " + sentence.getText());
217 wiki.showPage(new SentencePage(wiki, sentence));
218 } else if (e.getActionCommand().equals("Logic")) {
219 wiki.log("page", "dropdown: logic sentence: " + sentence.getText());
220 wiki.showPage(new LogicPage(wiki, sentence));
221 } else if (e.getSource() instanceof MessageWindow && e.getActionCommand().equals("Yes")) {
222 wiki.log("page", "dropdown: delete confirmed: " + sentence.getText());
223
224 wiki.enqueueTaskShowingWaitWindow(
225 "Updating",
226 "The sentence is being removed from the knowledge base...",
227 new Task() {
228 public void run() {
229 sentence.getOwner().remove(sentence);
230 }
231 public void updateGUI() {
232 wiki.update();
233 wiki.refresh();
234 }
235 }
236 );
237 }
238 }
239
240 }