001    // This file is part of the Attempto Java Packages.
002    // Copyright 2008, Attempto Group, University of Zurich (see http://attempto.ifi.uzh.ch).
003    //
004    // The Attempto Java Packages is free software: you can redistribute it and/or modify it under the
005    // terms of the GNU Lesser General Public License as published by the Free Software Foundation,
006    // either version 3 of the License, or (at your option) any later version.
007    //
008    // The Attempto Java Packages is distributed in the hope that it will be useful, but WITHOUT ANY
009    // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
010    // PURPOSE. See the GNU Lesser General Public License for more details.
011    //
012    // You should have received a copy of the GNU Lesser General Public License along with the Attempto
013    // Java Packages. If not, see http://www.gnu.org/licenses/.
014    
015    package ch.uzh.ifi.attempto.acewiki.gui.page;
016    
017    import ch.uzh.ifi.attempto.acewiki.Wiki;
018    import ch.uzh.ifi.attempto.acewiki.gui.Title;
019    import ch.uzh.ifi.attempto.echocomp.HSpace;
020    import ch.uzh.ifi.attempto.echocomp.Label;
021    import ch.uzh.ifi.attempto.echocomp.SmallButton;
022    import ch.uzh.ifi.attempto.echocomp.Style;
023    import ch.uzh.ifi.attempto.echocomp.VSpace;
024    import nextapp.echo2.app.Border;
025    import nextapp.echo2.app.Button;
026    import nextapp.echo2.app.Color;
027    import nextapp.echo2.app.Column;
028    import nextapp.echo2.app.Extent;
029    import nextapp.echo2.app.Font;
030    import nextapp.echo2.app.Insets;
031    import nextapp.echo2.app.Row;
032    import nextapp.echo2.app.event.ActionListener;
033    
034    /**
035     * This is the superclass of all page classes. It represents a wiki page of AceWiki.
036     * 
037     * @author Tobias Kuhn
038     */
039    public abstract class WikiPage extends Column {
040            
041            private Wiki wiki;
042            private Title title;
043            private Row tabRow;
044            
045            /**
046             * Initializes a new wiki page.
047             * 
048             * @param wiki The wiki instance.
049             * @param title The title component.
050             */
051            public WikiPage(Wiki wiki, Title title) {
052                    this.wiki = wiki;
053                    this.title = title;
054                    
055                    tabRow = new Row();
056                    tabRow.setInsets(new Insets(10, 0, 0, 0));
057                    add(tabRow);
058                    add(new VSpace(20));
059                    add(title);
060                    addHorizontalLine();
061            }
062            
063            /**
064             * Checks whether the page still exists and updates the page content.
065             */
066            public final void update() {
067                    if (isExpired()) {
068                            removeAll();
069                            add(new ErrorPage(wiki, "This article does no longer exist."));
070                    } else {
071                            doUpdate();
072                    }
073            }
074            
075            /**
076             * Updates the page content.
077             */
078            protected void doUpdate() {}
079            
080            /**
081             * Returns the wiki instance this page belongs to.
082             * 
083             * @return The wiki instance.
084             */
085            public Wiki getWiki() {
086                    return wiki;
087            }
088            
089            /**
090             * Returns the title component.
091             * 
092             * @return The title component.
093             */
094            protected Title getTitle() {
095                    return title;
096            }
097            
098            /**
099             * Writes a log entry.
100             * 
101             * @param type The type of the log entry.
102             * @param text The log text.
103             */
104            protected void log(String type, String text) {
105                    wiki.log(type, text);
106            }
107            
108            /**
109             * Checks if the page has expired. A page has expired it represents an ontology
110             * element that has been deleted.
111             * 
112             * @return true if the page has expired.
113             */
114            public boolean isExpired() {
115                    return false;
116            }
117            
118            /**
119             * Adds a new tab to the tab row.
120             * 
121             * @param tabName The name of the tab.
122             * @param actionCommand The action command that is given to the action event object.
123             * @param actionListener The actionlistener.
124             */
125            protected void addTab(String tabName, String actionCommand, ActionListener actionListener) {
126                    SmallButton b = new SmallButton(tabName, actionListener, true);
127                    if (actionCommand != null) {
128                            b.setActionCommand(actionCommand);
129                    }
130                    tabRow.add(b);
131                    tabRow.add(new HSpace(8));
132                    tabRow.add(createTabSeparator());
133                    tabRow.add(new HSpace(8));
134            }
135            
136            /**
137             * Adds a new tab to the tab row.
138             * 
139             * @param tabName The name of the tab.
140             * @param actionListener The actionlistener.
141             */
142            protected void addTab(String tabName, ActionListener actionListener) {
143                    addTab(tabName, null, actionListener);
144            }
145            
146            /**
147             * Adds a new tab to the tab row that is currently selected.
148             * 
149             * @param tabName The name of the tab.
150             */
151            protected void addSelectedTab(String tabName) {
152                    tabRow.add(new SmallButton(tabName, null, false));
153                    tabRow.add(new HSpace(8));
154                    tabRow.add(createTabSeparator());
155                    tabRow.add(new HSpace(8));
156            }
157            
158            private Button createTabSeparator() {
159                    Button tabSeparator = new Button();
160                    tabSeparator.setBorder(new Border(1, Color.DARKGRAY, Border.STYLE_SOLID));
161                    tabSeparator.setHeight(new Extent(12));
162                    return tabSeparator;
163            }
164            
165            /**
166             * Adds a horizontal line to the page content.
167             */
168            protected void addHorizontalLine() {
169                    Column horizontalLine = new Column();
170                    horizontalLine.setInsets(new Insets(10, 0, 10, 0));
171                    Column c = new Column();
172                    c.setBackground(Color.DARKGRAY);
173                    c.setInsets(new Insets(0, 1, 0, 0));
174                    horizontalLine.add(c);
175                    add(horizontalLine);
176            }
177            
178            /**
179             * Adds a headline to the page content.
180             * 
181             * @param text The headline text.
182             */
183            protected void addHeadline(String text) {
184                    Row headline = new Row();
185                    headline.setInsets(new Insets(10, 10, 0, 0));
186                    Label title = new Label(text);
187                    title.setFont(new Font(Style.fontTypeface, Font.ITALIC | Font.UNDERLINE, new Extent(13)));
188                    title.setLineWrap(false);
189                    headline.add(title);
190                    add(headline);
191            }
192    
193            public abstract boolean equals(Object obj);
194    
195    }