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 java.util.ArrayList;
018    import java.util.Collections;
019    import java.util.HashMap;
020    import java.util.List;
021    
022    import nextapp.echo.app.Column;
023    import nextapp.echo.app.Extent;
024    import nextapp.echo.app.Font;
025    import nextapp.echo.app.Insets;
026    import nextapp.echo.app.event.ActionEvent;
027    import nextapp.echo.app.event.ActionListener;
028    import ch.uzh.ifi.attempto.acewiki.Wiki;
029    import ch.uzh.ifi.attempto.acewiki.core.LanguageUtils;
030    import ch.uzh.ifi.attempto.acewiki.core.OntologyElement;
031    import ch.uzh.ifi.attempto.echocomp.SolidLabel;
032    import ch.uzh.ifi.attempto.echocomp.VSpace;
033    
034    /**
035     * This class represents an page that shows an index of all articles that exist in the wiki.
036     * 
037     * @author Tobias Kuhn
038     */
039    public class IndexPage extends WikiPage implements ActionListener {
040    
041            private static final long serialVersionUID = 6061966610996079528L;
042            
043            private static final int pageSize = 50;
044            
045            private String chosenChar = "A";
046            private int chosenPage = 0;
047            private HashMap<String, OntologyElement> entries = new HashMap<String, OntologyElement>();
048            
049            private Column indexColumn = new Column();
050            private IndexBar letterIndexBar;
051            private IndexBar numberIndexBar;
052            
053            /**
054             * Creates a new index page.
055             * 
056             * @param wiki The wiki instance.
057             */
058            public IndexPage(Wiki wiki) {
059                    super(wiki);
060                    
061                    addTab("Main Page", this);
062                    addSelectedTab("Index");
063                    addTab("Search", this);
064                    addTab("About", this);
065                    
066                    add(new Title("Index", true));
067                    addHorizontalLine();
068                    add(new VSpace(20));
069                    
070                    letterIndexBar = new IndexBar("First letter:", this);
071                    add(letterIndexBar);
072                    
073                    numberIndexBar = new IndexBar("Page:", 0, this);
074                    add(numberIndexBar);
075                    
076                    indexColumn.setInsets(new Insets(10, 5, 5, 20));
077                    indexColumn.setCellSpacing(new Extent(2));
078                    add(indexColumn);
079            }
080            
081            protected void doUpdate() {
082                    indexColumn.removeAll();
083                    
084                    entries.clear();
085                    for (OntologyElement e : getWiki().getOntologyElements()) {
086                            for (String indexWord : e.getHeadwords()) {
087                                    if (indexWord.toUpperCase().startsWith(chosenChar)) {
088                                            entries.put(indexWord, e);
089                                    }
090                            }
091                    }
092                    
093                    if (entries.size() == 0) {
094                            numberIndexBar.setVisible(false);
095                            indexColumn.add(new SolidLabel(
096                                            "(no entry starting with '" + chosenChar + "')",
097                                            Font.ITALIC,
098                                            10
099                                    ));
100                    } else {
101                            int i = ((entries.size()-1) / pageSize) + 1;
102                            if (chosenPage > i) chosenPage = 0;
103                            numberIndexBar.setNumbers(i);
104                            numberIndexBar.setActiveButton(chosenPage);
105                            updatePage();
106                    }
107            }
108            
109            private void updatePage() {
110                    indexColumn.removeAll();
111                    
112                    List<String> indexWords = new ArrayList<String>(entries.keySet());
113                    Collections.sort(indexWords, String.CASE_INSENSITIVE_ORDER);
114                    
115                    numberIndexBar.setVisible(entries.size() > pageSize);
116                    
117                    int max = entries.size();
118                    if (max > (chosenPage + 1) * pageSize) max = (chosenPage + 1) * pageSize;
119                    
120                    for (int i = chosenPage * pageSize; i < max; i++) {
121                            String t = indexWords.get(i);
122                            OntologyElement el = entries.get(t);
123                            t = LanguageUtils.getPrettyPrinted(t);
124                            indexColumn.add(new ListItem(new WikiLink(el, t, getWiki(), false)));
125                    }
126            }
127            
128            public void actionPerformed(ActionEvent e) {
129                    if (e.getSource() == letterIndexBar) {
130                            chosenChar = e.getActionCommand();
131                            log("page", "pressed: first letter " + chosenChar);
132                            chosenPage = 0;
133                            update();
134                    } else if (e.getSource() == numberIndexBar) {
135                            chosenPage = Integer.parseInt(e.getActionCommand()) - 1;
136                            log("page", "pressed: page " + (chosenPage+1));
137                            updatePage();
138                    } else if ("Main Page".equals(e.getActionCommand())) {
139                            getWiki().showStartPage();
140                    } else if ("Search".equals(e.getActionCommand())) {
141                            getWiki().showSearchPage();
142                    } else if ("About".equals(e.getActionCommand())) {
143                            getWiki().showAboutPage();
144                    }
145            }
146            
147            public boolean equals(Object obj) {
148                    return obj instanceof IndexPage;
149            }
150            
151            public String toString() {
152                    return "-INDEX-";
153            }
154    
155    }