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.editor;
016
017 import nextapp.echo2.app.ApplicationInstance;
018 import nextapp.echo2.app.event.ActionListener;
019 import ch.uzh.ifi.attempto.acewiki.Wiki;
020 import ch.uzh.ifi.attempto.acewiki.core.ontology.Ontology;
021 import ch.uzh.ifi.attempto.acewiki.core.ontology.OntologyElement;
022 import ch.uzh.ifi.attempto.acewiki.core.ontology.VerbRole;
023 import ch.uzh.ifi.attempto.ape.FunctionWords;
024 import ch.uzh.ifi.attempto.echocomp.TextField;
025 import ch.uzh.ifi.attempto.echocomp.WindowPane;
026
027 /**
028 * This class represents a form to create or modify verbs.
029 *
030 * @author Tobias Kuhn
031 */
032 public class VerbForm extends FormPane {
033
034 private static final long serialVersionUID = 5050205540719470842L;
035
036 private TextField thirdSgField = new TextField();
037 private TextField infField = new TextField();
038 private TextField pastPartField = new TextField();
039
040 private VerbRole verbRole;
041 private int wordNumber;
042
043 /**
044 * Creates a new verb form.
045 *
046 * @param verbRole The role that is represented by the verb.
047 * @param wordNumber The word form id (only used if called from the sentence editor).
048 * @param window The host window of the form.
049 * @param wiki The wiki instance.
050 * @param actionListener The actionlistener.
051 */
052 public VerbForm(VerbRole verbRole, int wordNumber, WindowPane window, Wiki wiki, ActionListener actionListener) {
053 super(window, wiki, actionListener);
054 this.verbRole = verbRole;
055 this.wordNumber = wordNumber;
056
057 setIconRow("role",
058 "Every verb represents a certain relation between things. " +
059 "For example, the verb \"owns\" relates persons to their possessions. " +
060 "Every verb has a third singular form, a bare infinitive form, and an optional past participle form."
061 );
062 addRow("third singular", thirdSgField, "examples: owns, applies to, touches", true);
063 addRow("bare infinitive", infField, "examples: own, apply to, touch", true);
064 addRow("past participle", pastPartField, "examples: owned, applied to, touched", false);
065
066 thirdSgField.setText(verbRole.getPrettyWord(0));
067 infField.setText(verbRole.getPrettyWord(1));
068 pastPartField.setText(verbRole.getPrettyPastPart());
069
070 ApplicationInstance.getActive().setFocusedComponent(thirdSgField);
071 }
072
073 /**
074 * Creates a new creator window for verbs.
075 *
076 * @param wordNumber The word form id (only used if called from the sentence editor).
077 * @param wiki The wiki instance.
078 * @param actionListener The actionlistener.
079 * @return The new creator window.
080 */
081 public static WordEditorWindow createCreatorWindow(int wordNumber, Wiki wiki, ActionListener actionListener) {
082 WordEditorWindow creatorWindow = WordEditorWindow.createCreatorWindow();
083 creatorWindow.addTab(new VerbForm(new VerbRole(), wordNumber, creatorWindow, wiki, actionListener));
084 return creatorWindow;
085 }
086
087 /**
088 * Creates a new editor window for verbs.
089 *
090 * @param role The role that is represented by the verb that should be edited.
091 * @param wiki The wiki instance.
092 * @return The new editor window.
093 */
094 public static WordEditorWindow createEditorWindow(VerbRole role, Wiki wiki) {
095 WordEditorWindow editorWindow = WordEditorWindow.createEditorWindow();
096 editorWindow.addTab(new VerbForm(role, 0, editorWindow, wiki, wiki));
097 return editorWindow;
098 }
099
100 protected void save() {
101 Wiki wiki = getWiki();
102 String thirdSg = normalize(thirdSgField.getText());
103 String inf = normalize(infField.getText());
104 String pastPart = normalize(pastPartField.getText());
105 if (pastPart.toLowerCase().endsWith("_by")) {
106 pastPart = pastPart.substring(0, pastPart.length()-3);
107 }
108 String thirdSgP = thirdSg.replace("_", " ");
109 String infP = inf.replace("_", " ");
110 String pastPartP = pastPart.replace("_", " ");
111
112 Ontology ontology = wiki.getOntology();
113
114 // check whether all necessary fields are filled-in
115 if (thirdSg.equals("")) {
116 wiki.log("edit", "error: no third singular defined");
117 showErrorMessage("No third singular defined: Please define the third singular form.");
118 return;
119 }
120 if (inf.equals("")) {
121 wiki.log("edit", "error: no infinitive defined");
122 showErrorMessage("No bare infinitive defined: Please define the bare infinitive form.");
123 return;
124 }
125 if (pastPart.equals("") && wordNumber == 2) {
126 wiki.log("edit", "error: no past participle defined");
127 showErrorMessage("No past participle defined: Please define the past participle form.");
128 return;
129 }
130 if (pastPart.equals("") && !ontology.getReferences(verbRole, 2).isEmpty()) {
131 wiki.log("edit", "error: cannot remove past participle");
132 showErrorMessage("The past participle form cannot be removed because there are sentences that are using it.");
133 return;
134 }
135
136 // check whether the words contain only valid characters
137 if (!isValidString(thirdSg) || !isValidString(inf) || !isValidString(pastPart)) {
138 wiki.log("edit", "error: word contains invalid character");
139 showErrorMessage("Invalid character used: Only a-z, A-Z, 0-9, -, and spaces are allowed, " +
140 "and the first character must be one of a-z A-Z.");
141 return;
142 }
143
144 // check whether a word is a predefined function word
145 if (FunctionWords.isFunctionWord(thirdSg)) {
146 wiki.log("edit", "error: word is predefined");
147 showErrorMessage("'" + thirdSgP + "' is a predefined word and cannot be used here.");
148 return;
149 }
150 if (FunctionWords.isFunctionWord(inf)) {
151 wiki.log("edit", "error: word is predefined");
152 showErrorMessage("'" + infP + "' is a predefined word and cannot be used here.");
153 return;
154 }
155 if (FunctionWords.isFunctionWord(pastPart)) {
156 wiki.log("edit", "error: word is predefined");
157 showErrorMessage("'" + pastPartP + "' is a predefined word and cannot be used here.");
158 return;
159 }
160
161 // check whether all word forms are distinct
162 if (thirdSg.equals(inf)) {
163 wiki.log("edit", "error: the singular and plural forms have to be distinct.");
164 showErrorMessage("The singular and plural forms have to be distinct.");
165 return;
166 }
167
168 // check whether a word is already defined
169 OntologyElement oe1 = ontology.get(thirdSg);
170 if (oe1 != null && oe1 != verbRole) {
171 wiki.log("edit", "error: word is already used");
172 showErrorMessage("The word '" + thirdSgP + "' is already used. Please use a different one.");
173 return;
174 }
175 OntologyElement oe2 = ontology.get(inf);
176 if (oe2 != null && oe2 != verbRole) {
177 wiki.log("edit", "error: word is already used");
178 showErrorMessage("The word '" + infP + "' is already used. Please use a different one.");
179 return;
180 }
181 OntologyElement oe3 = ontology.get(pastPart);
182 if (oe3 != null && oe3 != verbRole) {
183 wiki.log("edit", "error: word is already used");
184 showErrorMessage("The word '" + pastPartP + "' is already used. Please use a different one.");
185 return;
186 }
187
188 if (pastPart.equals("")) pastPart = null;
189 verbRole.setWords(thirdSg, inf, pastPart);
190
191 wiki.log("edit", "verb: " + thirdSg + " / " + inf + " / " + pastPart);
192 if (verbRole.getOntology() == null) {
193 verbRole.registerAt(getWiki().getOntology());
194 }
195 finished(verbRole, wordNumber);
196 }
197
198 public String toString() {
199 return "Verb";
200 }
201
202 }