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.preditor;
016
017 import java.util.ArrayList;
018 import java.util.List;
019
020 import nextapp.echo.app.Alignment;
021 import nextapp.echo.app.ApplicationInstance;
022 import nextapp.echo.app.Border;
023 import nextapp.echo.app.Color;
024 import nextapp.echo.app.Column;
025 import nextapp.echo.app.Component;
026 import nextapp.echo.app.ContentPane;
027 import nextapp.echo.app.Extent;
028 import nextapp.echo.app.Font;
029 import nextapp.echo.app.Grid;
030 import nextapp.echo.app.Insets;
031 import nextapp.echo.app.Row;
032 import nextapp.echo.app.WindowPane;
033 import nextapp.echo.app.event.ActionEvent;
034 import nextapp.echo.app.event.ActionListener;
035 import nextapp.echo.app.layout.GridLayoutData;
036 import ch.uzh.ifi.attempto.echocomp.GeneralButton;
037 import ch.uzh.ifi.attempto.echocomp.Label;
038 import ch.uzh.ifi.attempto.echocomp.SolidLabel;
039 import ch.uzh.ifi.attempto.echocomp.TextField;
040
041 /**
042 * This class represents a form that appears within a tab of the word editor window. Such a form
043 * contains the form elements for a certain class of words.
044 *
045 * @author Tobias Kuhn
046 */
047 public class WordEditorForm extends ContentPane implements ActionListener {
048
049 private static final long serialVersionUID = 5886665203518065212L;
050
051 private ActionListener actionListener;
052 private WindowPane parentWindow;
053 private Row buttonBar;
054 private String title = "";
055 private Column column;
056 private Row explanationRow;
057 private List<Component> formElements = new ArrayList<Component>();
058 private List<Component> requiredFormElements = new ArrayList<Component>();
059
060 /**
061 * Creates a new word editor form.
062 *
063 * @param parentWindow The parent window.
064 * @param actionListener The action-listener.
065 */
066 public WordEditorForm(WindowPane parentWindow, ActionListener actionListener) {
067 this.parentWindow = parentWindow;
068 this.actionListener = actionListener;
069
070 Column borderCol = new Column();
071 borderCol.setBorder(new Border(1, Color.BLACK, Border.STYLE_INSET));
072
073 Grid grid = new Grid(1);
074 grid.setRowHeight(0, new Extent(parentWindow.getHeight().getValue()-160));
075 grid.setRowHeight(1, new Extent(30));
076
077 column = new Column();
078 column.setInsets(new Insets(10, 20, 0, 0));
079 column.setCellSpacing(new Extent(10));
080 GridLayoutData gridLayout = new GridLayoutData();
081 gridLayout.setAlignment(new Alignment(Alignment.LEFT, Alignment.TOP));
082 column.setLayoutData(gridLayout);
083 grid.add(column);
084
085 explanationRow = new Row();
086 column.add(explanationRow);
087
088 Row footerRow = new Row();
089 footerRow.setInsets(new Insets(10, 0, 0, 0));
090 footerRow.add(new Label("* required field", Font.ITALIC, 11));
091 grid.add(footerRow);
092
093 buttonBar = new Row();
094 buttonBar.setAlignment(new Alignment(Alignment.RIGHT, Alignment.CENTER));
095 buttonBar.setInsets(new Insets(10, 10, 10, 10));
096 buttonBar.setCellSpacing(new Extent(5));
097 grid.add(buttonBar);
098
099 addButton("OK");
100 addButton("Cancel");
101
102 borderCol.add(grid);
103 add(borderCol);
104 }
105
106 /**
107 * Creates a new word editor form.
108 *
109 * @param title The title of the word editor form.
110 * @param parentWindow The parent window.
111 * @param actionListener The action-listener.
112 */
113 public WordEditorForm(String title, WindowPane parentWindow, ActionListener actionListener) {
114 this(parentWindow, actionListener);
115 setTitle(title);
116 }
117
118 /**
119 * Sets the title of this form.
120 *
121 * @param title The title.
122 */
123 public void setTitle(String title) {
124 this.title = title;
125 }
126
127 /**
128 * Returns the title of the word editor form.
129 *
130 * @return The title.
131 */
132 public String getTitle() {
133 return title;
134 }
135
136 /**
137 * Return the parent window of this form.
138 *
139 * @return The parent window.
140 */
141 public WindowPane getParentWindow() {
142 return parentWindow;
143 }
144
145 /**
146 * Returns the action-listener.
147 *
148 * @return The action-listener.
149 */
150 public ActionListener getActionListener() {
151 return actionListener;
152 }
153
154 /**
155 * Adds a button to the button bar.
156 *
157 * @param buttonText The text of the button.
158 */
159 public void addButton(String buttonText) {
160 buttonBar.add(new GeneralButton(buttonText, 70, this));
161 }
162
163 /**
164 * Removes all existing buttons and adds the given buttons to the button bar.
165 *
166 * @param buttonTexts The texts for the buttons.
167 */
168 public void setButtons(String... buttonTexts) {
169 buttonBar.removeAll();
170 for (String t : buttonTexts) {
171 addButton(t);
172 }
173 }
174
175 /**
176 * Adds a new row to the form.
177 *
178 * @param labelText The text for the label shown on the left hand side of the component.
179 * @param formElement The component, i.e. a text field.
180 * @param explanation An explanation text shown under the component.
181 * @param required Defines whether the component should be marked as required.
182 */
183 public void addRow(String labelText, Component formElement, String explanation,
184 boolean required) {
185 Grid grid = new Grid(3);
186 grid.setInsets(new Insets(0, 0, 5, 0));
187 grid.setColumnWidth(0, new Extent(140));
188 grid.add(new SolidLabel(labelText, Font.ITALIC));
189 formElements.add(formElement);
190 if (formElement instanceof TextField) {
191 TextField tf = (TextField) formElement;
192 tf.setWidth(new Extent(parentWindow.getWidth().getValue()-223));
193 tf.setActionCommand("OK");
194 }
195 grid.add(formElement);
196 if (required) {
197 requiredFormElements.add(formElement);
198 grid.add(new Label("*", Font.ITALIC, 11));
199 } else {
200 grid.add(new Label());
201 }
202 grid.add(new Label());
203 grid.add(new Label(explanation, Font.ITALIC, 11));
204 column.add(grid);
205 }
206
207 /**
208 * Sets the explanation component. The explanation component is shown above the form elements
209 * and should explain how these form elements have to be used.
210 *
211 * @param comp The graphical component.
212 */
213 public void setExplanationComponent(Component comp) {
214 explanationRow.removeAll();
215 explanationRow.add(comp);
216 }
217
218 /**
219 * Returns all form elements.
220 *
221 * @return A list of all form elements.
222 */
223 public List<Component> getFormElements() {
224 return formElements;
225 }
226
227 /**
228 * Returns all form elements that are marked as required.
229 *
230 * @return A list of all required form elements.
231 */
232 public List<Component> getRequiredFormElements() {
233 return requiredFormElements;
234 }
235
236 /**
237 * Returns the content of all form elements that are text fields.
238 *
239 * @return A list of the content of all form elements that are text fields.
240 */
241 public List<String> getRequiredTextFieldContents() {
242 List<String> textContents = new ArrayList<String>();
243 for (Component comp : requiredFormElements) {
244 if (comp instanceof TextField) {
245 textContents.add(((TextField) comp).getText());
246 }
247 }
248 return textContents;
249 }
250
251 /**
252 * This method sets the focus on the first enabled text field of this form.
253 */
254 protected void doFocus() {
255 doFocus(this);
256 }
257
258 private boolean doFocus(Component c) {
259 if (c instanceof TextField) {
260 TextField tf = (TextField) c;
261 if (tf.isEnabled()) {
262 ApplicationInstance.getActive().setFocusedComponent(tf);
263 return true;
264 } else {
265 return false;
266 }
267 } else {
268 for (Component child : c.getComponents()) {
269 boolean b = doFocus(child);
270 if (b) return true;
271 }
272 }
273 return false;
274 }
275
276 public void actionPerformed(ActionEvent e) {
277 actionListener.actionPerformed(new ActionEvent(parentWindow, e.getActionCommand()));
278 }
279
280 }