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 nextapp.echo.app.Column;
018 import nextapp.echo.app.Row;
019 import nextapp.echo.app.event.ActionEvent;
020 import nextapp.echo.app.event.ActionListener;
021 import ch.uzh.ifi.attempto.acewiki.Task;
022 import ch.uzh.ifi.attempto.acewiki.Wiki;
023 import ch.uzh.ifi.attempto.acewiki.core.InconsistencyException;
024 import ch.uzh.ifi.attempto.acewiki.core.OntologyElement;
025 import ch.uzh.ifi.attempto.acewiki.core.Question;
026 import ch.uzh.ifi.attempto.acewiki.core.Sentence;
027 import ch.uzh.ifi.attempto.echocomp.HSpace;
028 import ch.uzh.ifi.attempto.echocomp.MessageWindow;
029
030 /**
031 * This class represents a sentence component consisting of a drop down menu and the sentence text.
032 *
033 * @author Tobias Kuhn
034 */
035 public class SentenceComponent extends Column implements ActionListener {
036
037 private static final long serialVersionUID = -540135972060005725L;
038
039 private Sentence sentence;
040 private Wiki wiki;
041 private WikiPage hostPage;
042
043 private Row sentenceRow = new Row();
044 private StatementMenu dropDown;
045 private RecalcIcon recalcIcon;
046
047 /**
048 * Creates a new sentence component. The host page is the page that contains the text row
049 * (which is not necessarily the owner page of the sentence).
050 *
051 * @param sentence The sentence to be shown.
052 * @param hostPage The host page of the text row.
053 */
054 public SentenceComponent(Sentence sentence, WikiPage hostPage) {
055 this.sentence = sentence;
056 this.hostPage = hostPage;
057 this.wiki = hostPage.getWiki();
058 this.recalcIcon = new RecalcIcon("The answer to this question is being updated.");
059 update();
060 }
061
062 private void update() {
063 if (sentence.isImmutable()) {
064 dropDown = new StatementMenu(StatementMenu.INFERRED_TYPE, wiki, this);
065 } else if (sentence instanceof Question) {
066 dropDown = new StatementMenu(StatementMenu.QUESTION_TYPE, wiki, this);
067 } else if (sentence.isReasonable()) {
068 dropDown = new StatementMenu(StatementMenu.REASONING_TYPE, wiki, this);
069 } else {
070 dropDown = new StatementMenu(StatementMenu.NOREASONING_TYPE, wiki, this);
071 }
072
073 if (!wiki.isReadOnly() && !sentence.isImmutable()) {
074 dropDown.addMenuEntry("Edit...", "Edit this sentence");
075 if (sentence.isReasonable()) {
076 if (sentence.isIntegrated()) {
077 dropDown.addMenuEntry("Retract", "Retract this sentence from the knowledge base");
078 } else {
079 dropDown.addMenuEntry("Reassert", "Reassert this sentence in the knowledge base");
080 }
081 }
082 dropDown.addMenuEntry("Delete", "Delete this sentence from the article");
083 }
084
085 dropDown.addMenuEntry("Show Details", "Show the details of this sentence");
086
087 if (!wiki.isReadOnly() && hostPage instanceof ArticlePage) {
088 dropDown.addMenuSeparator();
089 dropDown.addMenuEntry("Add Sentence...", "Add a new sentence here");
090 dropDown.addMenuEntry("Add Comment...", "Add a new comment here");
091 }
092
093
094 boolean isRed = !sentence.isIntegrated() && !sentence.isImmutable() && !(sentence instanceof Question);
095
096 removeAll();
097 sentenceRow.removeAll();
098 sentenceRow.add(dropDown);
099 sentenceRow.add(new HSpace(5));
100 sentenceRow.add(new TextRow(sentence.getTextElements(wiki.getLanguage()), wiki, isRed));
101 sentenceRow.add(new HSpace(5));
102 sentenceRow.add(recalcIcon);
103 recalcIcon.setVisible(false);
104 sentenceRow.add(new HSpace(5));
105 add(sentenceRow);
106
107 // Question Answering:
108 if (sentence instanceof Question && hostPage instanceof ArticlePage) {
109 add(new AnswerList(wiki, (Question) sentence, recalcIcon));
110 }
111 }
112
113 public void actionPerformed(ActionEvent e) {
114 if (e.getActionCommand().equals("Edit...")) {
115 log("dropdown: edit sentence:");
116 if (!wiki.isEditable()) {
117 wiki.showLoginWindow();
118 } else {
119 OntologyElement el = sentence.getArticle().getOntologyElement();
120 ArticlePage page = ArticlePage.create(el, wiki);
121 wiki.showPage(page);
122 wiki.showWindow(SentenceEditorHandler.generateEditWindow(sentence, page));
123 }
124 } else if (e.getActionCommand().equals("Add Sentence...")) {
125 log("dropdown: add sentence");
126 if (!wiki.isEditable()) {
127 wiki.showLoginWindow();
128 } else {
129 wiki.showWindow(SentenceEditorHandler.generateCreationWindow(
130 sentence,
131 (ArticlePage) hostPage
132 ));
133 }
134 } else if (e.getActionCommand().equals("Add Comment...")) {
135 log("dropdown: add comment");
136 if (!wiki.isEditable()) {
137 wiki.showLoginWindow();
138 } else {
139 wiki.showWindow(CommentEditorHandler.generateCreationWindow(
140 sentence,
141 (ArticlePage) hostPage
142 ));
143 }
144 } else if (e.getActionCommand().equals("Delete")) {
145 log("dropdown: delete sentence:");
146 if (!wiki.isEditable()) {
147 wiki.showLoginWindow();
148 } else {
149 wiki.showWindow(new MessageWindow(
150 "Delete",
151 "Do you really want to delete this sentence?",
152 null,
153 this,
154 "Yes",
155 "No"
156 ));
157 }
158 } else if (e.getActionCommand().equals("Reassert")) {
159 log("dropdown: reassert:");
160 if (!wiki.isEditable()) {
161 wiki.showLoginWindow();
162 } else {
163 try {
164 wiki.getOntology().reassert(sentence);
165 } catch (InconsistencyException ex) {
166 wiki.showWindow(new MessageWindow(
167 "Conflict",
168 "The sentence is in conflict with the current knowledge. For that " +
169 "reason, it cannot be added to the knowledge base.",
170 "OK"
171 ));
172 }
173 if (sentence.isIntegrated()) {
174 update();
175 hostPage.update();
176 }
177 }
178 } else if (e.getActionCommand().equals("Retract")) {
179 log("dropdown: retract:");
180 if (!wiki.isEditable()) {
181 wiki.showLoginWindow();
182 } else {
183 wiki.getOntology().retract(sentence);
184 update();
185 hostPage.update();
186 }
187 } else if (e.getActionCommand().equals("Show Details")) {
188 log("dropdown: details sentence:");
189 wiki.showPage(new SentencePage(wiki, sentence));
190 } else if (e.getSource() instanceof MessageWindow && e.getActionCommand().equals("Yes")) {
191 log("dropdown: delete confirmed:");
192
193 wiki.enqueueStrongAsyncTask(
194 "Updating",
195 "The sentence is being removed from the knowledge base...",
196 new Task() {
197 public void run() {
198 sentence.getArticle().remove(sentence);
199 }
200 public void updateGUI() {
201 wiki.update();
202 wiki.refresh();
203 }
204 }
205 );
206 }
207 }
208
209 private void log(String text) {
210 if (text.endsWith(":")) {
211 text += " " + sentence.getText(wiki.getEngine().getLanguages()[0]);
212 }
213 wiki.log("page", text);
214 }
215
216 }