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.List;
018
019 import nextapp.echo.app.Column;
020 import nextapp.echo.app.Extent;
021 import nextapp.echo.app.Font;
022 import nextapp.echo.app.Insets;
023 import nextapp.echo.app.Row;
024 import nextapp.echo.app.event.ActionEvent;
025 import nextapp.echo.app.event.ActionListener;
026 import ch.uzh.ifi.attempto.acewiki.Wiki;
027 import ch.uzh.ifi.attempto.acewiki.core.OntologyElement;
028 import ch.uzh.ifi.attempto.acewiki.core.WordIndex;
029 import ch.uzh.ifi.attempto.echocomp.GeneralButton;
030 import ch.uzh.ifi.attempto.echocomp.SolidLabel;
031 import ch.uzh.ifi.attempto.echocomp.TextField;
032 import ch.uzh.ifi.attempto.echocomp.VSpace;
033
034 /**
035 * This class represents a page on which the user can search for articles.
036 *
037 * @author Tobias Kuhn
038 */
039 public class SearchPage extends WikiPage implements ActionListener {
040
041 private static final long serialVersionUID = 7192145568847087174L;
042
043 private static final int pageSize = 50;
044
045 private int chosenPage = 0;
046 private List<OntologyElement> searchResult;
047
048 private Column resultColumn = new Column();
049 private IndexBar indexBar;
050 private TextField textField;
051
052 /**
053 * Creates a new search page.
054 *
055 * @param wiki The wiki instance.
056 * @param text The search text.
057 */
058 public SearchPage(Wiki wiki, String text) {
059 super(wiki);
060
061 addTab("Main Page", this);
062 addTab("Index", this);
063 addSelectedTab("Search");
064 addTab("About", this);
065
066 add(new Title("Search", true));
067 addHorizontalLine();
068 add(new VSpace(15));
069
070 addHeadline("Search word");
071 add(new VSpace(10));
072
073 Row textFieldRow = new Row();
074 textFieldRow.setInsets(new Insets(10, 0));
075 textFieldRow.setCellSpacing(new Extent(5));
076 textFieldRow.add(textField = new TextField(this));
077 textField.setWidth(new Extent(300));
078 textField.addActionListener(this);
079 textField.setText(text);
080 textFieldRow.add(new GeneralButton("Search", this));
081 add(textFieldRow);
082
083 add(new VSpace(15));
084
085 addHeadline("Results");
086 add(new VSpace(10));
087
088 indexBar = new IndexBar("Page:", 0, this);
089 add(indexBar);
090
091 resultColumn.setInsets(new Insets(10, 2, 5, 20));
092 resultColumn.setCellSpacing(new Extent(2));
093 add(resultColumn);
094
095 update();
096 }
097
098 protected void doUpdate() {
099 getWiki().getApplication().setFocusedComponent(textField);
100
101 resultColumn.removeAll();
102 if (textField.getText().length() == 0) {
103 indexBar.setVisible(false);
104 resultColumn.add(new SolidLabel("(enter a search text)", Font.ITALIC, 10));
105 return;
106 }
107
108 WordIndex index = getWiki().getEngine().getWordIndex();
109 searchResult = index.searchForElements(textField.getText());
110
111 if (searchResult.size() == 0) {
112 indexBar.setVisible(false);
113 resultColumn.add(new SolidLabel("(nothing found)", Font.ITALIC, 10));
114 } else {
115 int i = ((searchResult.size()-1) / pageSize) + 1;
116 if (chosenPage > i) chosenPage = 0;
117 indexBar.setNumbers(i);
118 indexBar.setActiveButton(chosenPage);
119 updatePage();
120 }
121 }
122
123 private void updatePage() {
124 resultColumn.removeAll();
125
126 indexBar.setVisible(searchResult.size() > pageSize);
127
128 int max = searchResult.size();
129 if (max > (chosenPage + 1) * pageSize) max = (chosenPage + 1) * pageSize;
130
131 for (int i = chosenPage * pageSize; i < max; i++) {
132 resultColumn.add(new ListItem(new WikiLink(searchResult.get(i), getWiki())));
133 }
134 }
135
136 public void actionPerformed(ActionEvent e) {
137 if (e.getSource() == indexBar) {
138 chosenPage = Integer.parseInt(e.getActionCommand()) - 1;
139 log("page", "pressed: page " + (chosenPage+1));
140 updatePage();
141 } else if ("Main Page".equals(e.getActionCommand())) {
142 getWiki().showStartPage();
143 } else if ("Index".equals(e.getActionCommand())) {
144 getWiki().showIndexPage();
145 } else if ("About".equals(e.getActionCommand())) {
146 getWiki().showAboutPage();
147 } else {
148 log("page", "search for " + textField.getText());
149 update();
150 }
151 }
152
153 public boolean equals(Object obj) {
154 return obj instanceof SearchPage;
155 }
156
157 public String toString() {
158 return "-SEARCH-";
159 }
160
161 }