// 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.Extent; import nextapp.echo.app.Font; import nextapp.echo.app.Insets; import nextapp.echo.app.Row; import nextapp.echo.app.event.ActionEvent; import nextapp.echo.app.event.ActionListener; import ch.uzh.ifi.attempto.acewiki.Wiki; import ch.uzh.ifi.attempto.acewiki.core.Article; import ch.uzh.ifi.attempto.acewiki.core.Comment; import ch.uzh.ifi.attempto.acewiki.core.Concept; import ch.uzh.ifi.attempto.acewiki.core.GeneralTopic; import ch.uzh.ifi.attempto.acewiki.core.Individual; import ch.uzh.ifi.attempto.acewiki.core.ModuleElement; import ch.uzh.ifi.attempto.acewiki.core.OntologyElement; import ch.uzh.ifi.attempto.acewiki.core.Relation; import ch.uzh.ifi.attempto.acewiki.core.Sentence; import ch.uzh.ifi.attempto.acewiki.core.Statement; import ch.uzh.ifi.attempto.acewiki.core.TopicElement; import ch.uzh.ifi.attempto.echocomp.MessageWindow; import ch.uzh.ifi.attempto.echocomp.SolidLabel; import ch.uzh.ifi.attempto.echocomp.TextFieldWindow; /** * This class stands for a wiki page that represents an ontology element and shows the * article of this ontology element. * * @author Tobias Kuhn */ public abstract class ArticlePage extends WikiPage implements ActionListener { private static final long serialVersionUID = -297830105047433502L; private Column textColumn = new Column(); private StatementMenu dropDown; private Title title; /** * Creates a new article page. * * @param wiki The wiki instance. * @param ontologyElement The ontology element whose article should be shown. */ protected ArticlePage(Wiki wiki, OntologyElement ontologyElement) { super(wiki); if (!(ontologyElement.getInternalType().equals(GeneralTopic.MAINPAGE_TYPE))) { title = new Title(getHeading(ontologyElement), ontologyElement.getType(), this); } else { title = new Title("", true, null, null); } add(title); addHorizontalLine(); textColumn.setInsets(new Insets(10, 20, 0, 50)); textColumn.setCellSpacing(new Extent(2)); add(textColumn); } /** * Creates an article page for the given ontology element. * * @param oe The ontology element for which an article page should be created. * @param wiki The wiki instance. * @return The new article page. */ public static ArticlePage create(OntologyElement oe, Wiki wiki) { if (oe instanceof Individual) { return new IndividualPage((Individual) oe, wiki); } else if (oe instanceof Concept) { return new ConceptPage((Concept) oe, wiki); } else if (oe instanceof Relation) { return new RelationPage((Relation) oe, wiki); } else if (oe instanceof TopicElement) { if (oe.getInternalType().equals(GeneralTopic.MAINPAGE_TYPE)) { return new StartPage(wiki); } else { return new GeneralPage((TopicElement) oe, wiki); } } else if (oe instanceof ModuleElement) { return new ModulePage((ModuleElement) oe, wiki); } return null; } /** * Returns the ontology element of this article page. * * @return The ontology element. */ public abstract OntologyElement getOntologyElement(); /** * Returns the article object. * * @return The article. */ public Article getArticle() { return getOntologyElement().getArticle(); } protected void doUpdate() { setTabRow(TabRow.getArticleTabRow(getOntologyElement(), TabRow.TAB_ARTICLE, getWiki())); updateTextColumn(); } protected void updateTextColumn() { dropDown = new StatementMenu(StatementMenu.EMPTY_TYPE, getWiki(), this); dropDown.addMenuEntry("acewiki_statementmenu_addsent", "acewiki_statementmenu_addsenttooltip"); if (getWiki().getConfig().isCommentingEnabled()) { dropDown.addMenuEntry("acewiki_statementmenu_addcomm", "acewiki_statementmenu_addcommtooltip"); } if ("on".equals(getWiki().getConfig().getParameter("advanced_commands")) && getWiki().hasUserRight("advanced_commands")) { dropDown.addMenuSeparator(); dropDown.addMenuEntry("Shuffle statements", "Shuffle the statements of this article"); dropDown.addMenuEntry("Copy content from ...", "Copy the content from another article"); } textColumn.removeAll(); for (Statement s : getArticle().getStatements()) { if (s instanceof Sentence) { textColumn.add(new SentenceComponent((Sentence) s, this)); } else if (s instanceof Comment && !getWiki().getConfig().isCommentHidingEnabled()) { textColumn.add(new CommentComponent((Comment) s, this)); } } if (getArticle().getStatements().size() == 0) { textColumn.add(new SolidLabel(getWiki().getGUIText("acewiki_article_empty"), Font.ITALIC, 10)); } if (!getWiki().getConfig().isReadOnly()) { Row addButtonRow = new Row(); addButtonRow.add(dropDown); textColumn.add(addButtonRow); } } public boolean equals(Object obj) { if (obj instanceof ArticlePage) { return getOntologyElement() == ((ArticlePage) obj).getOntologyElement(); } return false; } public String toString() { return getOntologyElement().getWord(); } public boolean isExpired() { return !getWiki().getOntology().contains(getOntologyElement()); } /** * Returns the title object of this page. * * @return The title. */ protected Title getTitle() { return title; } protected Column getTextColumn() { return textColumn; } protected StatementMenu getDropDown() { return dropDown; } public void actionPerformed(ActionEvent e) { String c = e.getActionCommand(); Object src = e.getSource(); if (c.equals("acewiki_statementmenu_addsent")) { log("page", "dropdown: add sentence"); if (!getWiki().isEditable()) { getWiki().showLoginWindow(); } else { getWiki().showWindow(SentenceEditorHandler.generateCreationWindow(null, this)); } } else if (c.equals("acewiki_statementmenu_addcomm")) { log("page", "dropdown: add comment"); if (!getWiki().isEditable()) { getWiki().showLoginWindow(); } else { getWiki().showWindow(CommentEditorHandler.generateCreationWindow(null, this)); } } else if (c.equals("Shuffle statements")) { log("page", "dropdown: shuffle statements"); if (!getWiki().isEditable()) { getWiki().showLoginWindow(); } else { getArticle().shuffleStatements(); update(); } } else if (c.equals("Copy content from ...")) { log("page", "dropdown: copy content"); if (!getWiki().isEditable()) { getWiki().showLoginWindow(); } else { getWiki().showWindow(new TextFieldWindow("Copy content", "From article:", this)); } } else if (src instanceof TextFieldWindow) { TextFieldWindow tfw = (TextFieldWindow) src; if (tfw.getTitle().equals("Copy content") && c.equals("OK")) { OntologyElement oe = getWiki().getOntology().getElement(tfw.getText()); if (oe == null) { getWiki().showWindow(new MessageWindow("Error", "Element not found.", "OK")); } else { for (Statement st : oe.getArticle().getStatements()) { getArticle().addCopiedStatement(null, st.copyFor(getArticle())); } update(); } } } else if (src == title) { getWiki().showEditorWindow(getOntologyElement()); } } }