// This file is part of AceWiki. // Copyright 2008-2013, AceWiki developers. // // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU // Lesser General Public License as published by the Free Software Foundation, either version 3 of // the License, or (at your option) any later version. // // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If // not, see http://www.gnu.org/licenses/. package ch.uzh.ifi.attempto.acewiki.gui; import nextapp.echo.app.Column; import nextapp.echo.app.Row; import nextapp.echo.app.event.ActionEvent; import nextapp.echo.app.event.ActionListener; import ch.uzh.ifi.attempto.acewiki.Task; import ch.uzh.ifi.attempto.acewiki.Wiki; import ch.uzh.ifi.attempto.acewiki.core.Article; import ch.uzh.ifi.attempto.acewiki.core.InconsistencyException; import ch.uzh.ifi.attempto.acewiki.core.OntologyElement; import ch.uzh.ifi.attempto.acewiki.core.Question; import ch.uzh.ifi.attempto.acewiki.core.Sentence; import ch.uzh.ifi.attempto.echocomp.HSpace; import ch.uzh.ifi.attempto.echocomp.MessageWindow; import ch.uzh.ifi.attempto.echocomp.SmallButton; import com.google.common.collect.ImmutableSet; /** * This class represents a sentence component consisting of a drop down menu and the sentence text. * * @author Tobias Kuhn */ public class SentenceComponent extends Column implements ActionListener { private static final long serialVersionUID = -540135972060005725L; private static final ImmutableSet<String> EDIT_ACTIONS = new ImmutableSet.Builder<String>() .add("acewiki_statementmenu_edit") .add("acewiki_statementmenu_addsent") .add("acewiki_statementmenu_addcomm") .add("acewiki_statementmenu_reassert") .add("acewiki_statementmenu_retract") .add("acewiki_statementmenu_delete") .build(); private Sentence sentence; private Wiki wiki; private WikiPage hostPage; private Row sentenceRow = new Row(); private StatementMenu dropDown; private RecalcIcon recalcIcon; private SmallButton alternativesButton; /** * Creates a new sentence component. The host page is the page that contains the text row * (which is not necessarily the owner page of the sentence). * * @param sentence The sentence to be shown. * @param hostPage The host page of the text row. */ public SentenceComponent(Sentence sentence, WikiPage hostPage) { this.sentence = sentence; this.hostPage = hostPage; this.wiki = hostPage.getWiki(); this.recalcIcon = new RecalcIcon(wiki.getGUIText("acewiki_answer_recalctooltip")); update(); } private void update() { if (sentence.isImmutable()) { dropDown = new StatementMenu(StatementMenu.INFERRED_TYPE, wiki, this); } else if (sentence instanceof Question) { dropDown = new StatementMenu(StatementMenu.QUESTION_TYPE, wiki, this); } else if (sentence.isReasonable()) { dropDown = new StatementMenu(StatementMenu.REASONING_TYPE, wiki, this); } else { dropDown = new StatementMenu(StatementMenu.NOREASONING_TYPE, wiki, this); } if (!wiki.getConfig().isReadOnly() && !sentence.isImmutable()) { dropDown.addMenuEntry("acewiki_statementmenu_edit", "acewiki_statementmenu_editsenttooltip"); if (wiki.isRetractReassertActivated() && sentence.isReasonable()) { if (sentence.isIntegrated()) { dropDown.addMenuEntry("acewiki_statementmenu_retract", "acewiki_statementmenu_retracttooltip"); } else { dropDown.addMenuEntry("acewiki_statementmenu_reassert", "acewiki_statementmenu_reasserttooltip"); } } dropDown.addMenuEntry("acewiki_statementmenu_delete", "acewiki_statementmenu_delsenttooltip"); } if (sentence.getTextContainer(wiki.getLanguage()).size() > 1) { dropDown.addMenuEntry("acewiki_statementmenu_alternatives", "acewiki_statementmenu_alternativestooltip"); } if (wiki.getConfig().isDetailsPageEnabled()) { dropDown.addMenuEntry("acewiki_statementmenu_details", "acewiki_statementmenu_detailstooltip"); } if (wiki.isTranslationsPageActivated()) { dropDown.addMenuEntry("acewiki_statementmenu_transl", "acewiki_statementmenu_transltooltip"); } if (!wiki.getConfig().isReadOnly() && hostPage instanceof ArticlePage) { dropDown.addMenuSeparator(); dropDown.addMenuEntry("acewiki_statementmenu_addsent", "acewiki_statementmenu_addsenttooltip"); if (wiki.getConfig().isCommentingEnabled()) { dropDown.addMenuEntry("acewiki_statementmenu_addcomm", "acewiki_statementmenu_addcommtooltip"); } } boolean isRed = !sentence.isIntegrated() && !sentence.isImmutable() && !(sentence instanceof Question); removeAll(); sentenceRow.removeAll(); sentenceRow.add(dropDown); sentenceRow.add(new HSpace(5)); sentenceRow.add(new TextRow(sentence.getTextElements(wiki.getLanguage()), wiki, isRed)); int a = sentence.getTextContainer(wiki.getLanguage()).size(); if (a > 1) { // The sentence has more than one alternative sentenceRow.add(new HSpace(10)); String t = wiki.getGUIText("acewiki_statement_alternatives"); sentenceRow.add(alternativesButton = new SmallButton("(" + a + " " + t + ")", this)); } sentenceRow.add(new HSpace(5)); sentenceRow.add(recalcIcon); recalcIcon.setVisible(false); sentenceRow.add(new HSpace(5)); add(sentenceRow); // Question Answering: if (sentence instanceof Question && hostPage instanceof ArticlePage) { add(new AnswerList(wiki, (Question) sentence, recalcIcon)); } } public void actionPerformed(ActionEvent e) { String c = e.getActionCommand(); Object src = e.getSource(); if (!wiki.isEditable() && EDIT_ACTIONS.contains(c)) { wiki.showLoginWindow(); return; } if ("acewiki_statementmenu_edit".equals(c)) { log("dropdown: edit sentence:"); OntologyElement el = sentence.getArticle().getOntologyElement(); ArticlePage page = ArticlePage.create(el, wiki); wiki.showPage(page); wiki.showWindow(SentenceEditorHandler.generateEditWindow(sentence, page)); } else if ("acewiki_statementmenu_addsent".equals(c)) { log("dropdown: add sentence"); wiki.showWindow(SentenceEditorHandler.generateCreationWindow( sentence, (ArticlePage) hostPage )); } else if ("acewiki_statementmenu_addcomm".equals(c)) { log("dropdown: add comment"); wiki.showWindow(CommentEditorHandler.generateCreationWindow( sentence, (ArticlePage) hostPage )); } else if ("acewiki_statementmenu_delete".equals(c)) { log("dropdown: delete sentence:"); wiki.showWindow(new MessageWindow( "acewiki_message_delstatementtitle", "acewiki_message_delsentence", null, this, "general_action_yes", "general_action_no" )); } else if ("acewiki_statementmenu_reassert".equals(c)) { log("dropdown: reassert:"); try { wiki.getOntology().reassert(sentence); } catch (InconsistencyException ex) { wiki.showWindow(new MessageWindow( "acewiki_message_conflicttitle", "acewiki_message_conflict", "general_action_ok" )); } if (sentence.isIntegrated()) { update(); hostPage.update(); } } else if ("acewiki_statementmenu_retract".equals(c)) { log("dropdown: retract:"); wiki.getOntology().retract(sentence); update(); hostPage.update(); } else if ("acewiki_statementmenu_details".equals(c)) { log("dropdown: details sentence:"); wiki.showPage(new DetailsPage(wiki, sentence)); } else if ("acewiki_statementmenu_transl".equals(c)) { log("dropdown: translations sentence:"); wiki.showPage(new TranslationsPage(wiki, sentence)); } else if ("acewiki_statementmenu_alternatives".equals(c) || src == alternativesButton) { log("dropdown: alternatives:"); wiki.showWindow(new AlternativesWindow(sentence, wiki)); } else if (src instanceof MessageWindow && "general_action_yes".equals(c)) { log("dropdown: delete confirmed:"); wiki.enqueueStrongAsyncTask( wiki.getGUIText("acewiki_message_updatetitle"), wiki.getGUIText("acewiki_message_update"), new Task() { public void run() { Article a = sentence.getArticle(); wiki.log("edit", "remove statement of " + a.getOntologyElement().getWord() + ": " + sentence.getText(wiki.getLanguage()) + " (" + sentence.getText(a.getOntology().getLoggingLanguage()) + ")"); a.remove(sentence); } public void updateGUI() { wiki.update(); wiki.refresh(); } } ); } } private void log(String text) { if (text.endsWith(":")) { text += " " + sentence.getText(wiki.getOntology().getLoggingLanguage()); } wiki.log("page", text); } }