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 }