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.Border;
018 import nextapp.echo.app.Button;
019 import nextapp.echo.app.Color;
020 import nextapp.echo.app.Column;
021 import nextapp.echo.app.Component;
022 import nextapp.echo.app.Extent;
023 import nextapp.echo.app.Font;
024 import nextapp.echo.app.Insets;
025 import nextapp.echo.app.Row;
026 import nextapp.echo.app.event.ActionListener;
027 import ch.uzh.ifi.attempto.acewiki.Wiki;
028 import ch.uzh.ifi.attempto.acewiki.core.LanguageUtils;
029 import ch.uzh.ifi.attempto.acewiki.core.OntologyElement;
030 import ch.uzh.ifi.attempto.echocomp.HSpace;
031 import ch.uzh.ifi.attempto.echocomp.Label;
032 import ch.uzh.ifi.attempto.echocomp.SmallButton;
033 import ch.uzh.ifi.attempto.echocomp.Style;
034 import ch.uzh.ifi.attempto.echocomp.VSpace;
035
036 /**
037 * This is the superclass of all page classes. It represents a wiki page of AceWiki.
038 *
039 * @author Tobias Kuhn
040 */
041 public abstract class WikiPage extends Column {
042
043 private static final long serialVersionUID = -1972548696966691981L;
044
045 private Wiki wiki;
046 private Row tabRow;
047
048 /**
049 * Initializes a new wiki page.
050 *
051 * @param wiki The wiki instance.
052 */
053 public WikiPage(Wiki wiki) {
054 this.wiki = wiki;
055
056 setInsets(new Insets(0, 0, 0, 40));
057
058 tabRow = new Row();
059 tabRow.setInsets(new Insets(10, 0, 0, 0));
060 add(tabRow);
061 add(new VSpace(20));
062 }
063
064 /**
065 * Checks whether the page still exists and updates the page content.
066 */
067 public final void update() {
068 if (isExpired()) {
069 removeAll();
070 add(new ErrorPage(wiki, "This article does no longer exist."));
071 } else {
072 doUpdate();
073 }
074 }
075
076 /**
077 * Updates the page content.
078 */
079 protected void doUpdate() {}
080
081 /**
082 * Returns the wiki instance this page belongs to.
083 *
084 * @return The wiki instance.
085 */
086 public Wiki getWiki() {
087 return wiki;
088 }
089
090 /**
091 * Writes a log entry.
092 *
093 * @param type The type of the log entry.
094 * @param text The log text.
095 */
096 protected void log(String type, String text) {
097 wiki.log(type, text);
098 }
099
100 /**
101 * Checks if the page has expired. A page has expired it represents an ontology
102 * element that has been deleted.
103 *
104 * @return true if the page has expired.
105 */
106 public boolean isExpired() {
107 return false;
108 }
109
110 /**
111 * Adds a new tab to the tab row.
112 *
113 * @param tabName The name of the tab.
114 * @param actionListener The actionlistener.
115 */
116 protected void addTab(String tabName, ActionListener actionListener) {
117 SmallButton b = new SmallButton(tabName, actionListener, true);
118 b.setActionCommand(tabName);
119 tabRow.add(b);
120 tabRow.add(new HSpace(8));
121 tabRow.add(createTabSeparator());
122 tabRow.add(new HSpace(8));
123 }
124
125 /**
126 * Adds a new tab to the tab row that is currently selected.
127 *
128 * @param tabName The name of the tab.
129 */
130 protected void addSelectedTab(String tabName) {
131 tabRow.add(new SmallButton(tabName, null, false));
132 tabRow.add(new HSpace(8));
133 tabRow.add(createTabSeparator());
134 tabRow.add(new HSpace(8));
135 }
136
137 private Button createTabSeparator() {
138 Button tabSeparator = new Button();
139 tabSeparator.setBorder(new Border(1, Color.DARKGRAY, Border.STYLE_SOLID));
140 tabSeparator.setHeight(new Extent(12));
141 return tabSeparator;
142 }
143
144 /**
145 * Adds a horizontal line to the page content.
146 */
147 protected void addHorizontalLine() {
148 Column horizontalLine = new Column();
149 horizontalLine.setInsets(new Insets(10, 0, 10, 0));
150 Column c = new Column();
151 c.setBackground(Color.DARKGRAY);
152 c.setInsets(new Insets(0, 1, 0, 0));
153 horizontalLine.add(c);
154 add(horizontalLine);
155 }
156
157 /**
158 * Adds a headline to the page content.
159 *
160 * @param text The headline text.
161 */
162 protected void addHeadline(String text) {
163 addHeadline(text, null);
164 }
165
166 /**
167 * Adds a headline to the page content. The component is shown after the headline text.
168 *
169 * @param text The headline text.
170 * @param comp
171 */
172 protected void addHeadline(String text, Component comp) {
173 Row headline = new Row();
174 headline.setInsets(new Insets(10, 10, 10, 0));
175 headline.setCellSpacing(new Extent(5));
176 Label title = new Label(text);
177 title.setFont(new Font(Style.fontTypeface, Font.ITALIC | Font.UNDERLINE, new Extent(13)));
178 title.setLineWrap(false);
179 headline.add(title);
180 if (comp != null) {
181 headline.add(comp);
182 }
183 add(headline);
184 }
185
186 /**
187 * Returns the heading text for the given ontology element.
188 *
189 * @param oe The ontology element.
190 * @return The heading.
191 */
192 protected String getHeading(OntologyElement oe) {
193 return LanguageUtils.getHeading(oe);
194 }
195
196 public abstract boolean equals(Object obj);
197
198 }