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.Extent;
019 import nextapp.echo.app.Font;
020 import nextapp.echo.app.Insets;
021 import nextapp.echo.app.Row;
022 import nextapp.echo.app.event.ActionEvent;
023 import nextapp.echo.app.event.ActionListener;
024 import ch.uzh.ifi.attempto.acewiki.Wiki;
025 import ch.uzh.ifi.attempto.acewiki.core.Article;
026 import ch.uzh.ifi.attempto.acewiki.core.Comment;
027 import ch.uzh.ifi.attempto.acewiki.core.Concept;
028 import ch.uzh.ifi.attempto.acewiki.core.DummyOntologyElement;
029 import ch.uzh.ifi.attempto.acewiki.core.Individual;
030 import ch.uzh.ifi.attempto.acewiki.core.OntologyElement;
031 import ch.uzh.ifi.attempto.acewiki.core.Relation;
032 import ch.uzh.ifi.attempto.acewiki.core.Sentence;
033 import ch.uzh.ifi.attempto.acewiki.core.Statement;
034 import ch.uzh.ifi.attempto.echocomp.SolidLabel;
035
036 /**
037 * This class stands for a wiki page that represents an ontology element and shows the
038 * article of this ontology element.
039 *
040 * @author Tobias Kuhn
041 */
042 public abstract class ArticlePage extends WikiPage implements ActionListener {
043
044 private static final long serialVersionUID = -297830105047433502L;
045
046 private Column textColumn = new Column();
047 private StatementMenu dropDown = new StatementMenu(StatementMenu.EMPTY_TYPE, getWiki(), this);
048 private Title title;
049
050 /**
051 * Creates a new article page.
052 *
053 * @param wiki The wiki instance.
054 * @param ontologyElement The ontology element whose article should be shown.
055 */
056 protected ArticlePage(Wiki wiki, OntologyElement ontologyElement) {
057 super(wiki);
058
059 if (!(ontologyElement instanceof DummyOntologyElement)) {
060 addSelectedTab("Article");
061 addTab("References", this);
062 title = new Title(getHeading(ontologyElement), ontologyElement.getType(), this);
063 } else {
064 title = new Title("", true, null, null);
065 }
066
067 add(title);
068 addHorizontalLine();
069
070 dropDown.addMenuEntry("Add Sentence...", "Add a new sentence here");
071 dropDown.addMenuEntry("Add Comment...", "Add a new comment here");
072
073 textColumn.setInsets(new Insets(10, 20, 0, 50));
074 textColumn.setCellSpacing(new Extent(2));
075 add(textColumn);
076 }
077
078 /**
079 * Creates an article page for the given ontology element.
080 *
081 * @param oe The ontology element for which an article page should be created.
082 * @param wiki The wiki instance.
083 * @return The new article page.
084 */
085 public static ArticlePage create(OntologyElement oe, Wiki wiki) {
086 if (oe instanceof Individual) {
087 return new IndividualPage((Individual) oe, wiki);
088 } else if (oe instanceof Concept) {
089 return new ConceptPage((Concept) oe, wiki);
090 } else if (oe instanceof Relation) {
091 return new RelationPage((Relation) oe, wiki);
092 } else if (oe instanceof DummyOntologyElement) {
093 return new StartPage(wiki);
094 }
095 return null;
096 }
097
098 /**
099 * Returns the ontology element of this article page.
100 *
101 * @return The ontology element.
102 */
103 public abstract OntologyElement getOntologyElement();
104
105 /**
106 * Returns the article object.
107 *
108 * @return The article.
109 */
110 public Article getArticle() {
111 return getOntologyElement().getArticle();
112 }
113
114 protected void doUpdate() {
115 textColumn.removeAll();
116
117 for (Statement s : getArticle().getStatements()) {
118 if (s instanceof Sentence) {
119 textColumn.add(new SentenceComponent((Sentence) s, this));
120 } else if (s instanceof Comment) {
121 textColumn.add(new CommentComponent((Comment) s, this));
122 }
123 }
124
125 if (getArticle().getStatements().size() == 0) {
126 textColumn.add(new SolidLabel("(article is empty)", Font.ITALIC, 10));
127 }
128
129 if (!getWiki().isReadOnly()) {
130 Row addButtonRow = new Row();
131 addButtonRow.add(dropDown);
132 textColumn.add(addButtonRow);
133 }
134 }
135
136 public boolean equals(Object obj) {
137 if (obj instanceof ArticlePage) {
138 return getOntologyElement() == ((ArticlePage) obj).getOntologyElement();
139 }
140 return false;
141 }
142
143 public String toString() {
144 return getOntologyElement().getWord();
145 }
146
147 public boolean isExpired() {
148 return !getWiki().getOntology().contains(getOntologyElement());
149 }
150
151 /**
152 * Returns the title object of this page.
153 *
154 * @return The title.
155 */
156 protected Title getTitle() {
157 return title;
158 }
159
160 public void actionPerformed(ActionEvent e) {
161 if (e.getActionCommand().equals("Add Sentence...")) {
162 getWiki().log("page", "dropdown: add sentence");
163 if (!getWiki().isEditable()) {
164 getWiki().showLoginWindow();
165 } else {
166 getWiki().showWindow(SentenceEditorHandler.generateCreationWindow(null, this));
167 }
168 } else if (e.getActionCommand().equals("Add Comment...")) {
169 getWiki().log("page", "dropdown: add comment");
170 if (!getWiki().isEditable()) {
171 getWiki().showLoginWindow();
172 } else {
173 getWiki().showWindow(CommentEditorHandler.generateCreationWindow(null, this));
174 }
175 } else if ("References".equals(e.getActionCommand())) {
176 log("page", "pressed: references");
177 getWiki().showPage(new ReferencesPage(this));
178 } else if (e.getSource() == title) {
179 getWiki().showEditorWindow(getOntologyElement());
180 }
181 }
182
183 }