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.NounConcept;
021 import ch.uzh.ifi.attempto.acewiki.core.ontology.OntologyElement;
022 import ch.uzh.ifi.attempto.ape.FunctionWords;
023 import ch.uzh.ifi.attempto.echocomp.TextField;
024 import ch.uzh.ifi.attempto.echocomp.WindowPane;
025
026 /**
027 * This class represents a form to create or modify nouns.
028 *
029 * @author Tobias Kuhn
030 */
031 public class NounForm extends FormPane {
032
033 private static final long serialVersionUID = 172544159284997517L;
034
035 private TextField singularField = new TextField();
036 private TextField pluralField = new TextField();
037
038 private NounConcept concept;
039 private int wordNumber;
040
041 /**
042 * Creates a new noun form.
043 *
044 * @param concept The concept that is represented by the noun.
045 * @param wordNumber The word form id (only used if called from the sentence editor).
046 * @param window The host window of the form.
047 * @param wiki The wiki instance.
048 * @param actionListener
049 */
050 public NounForm(NounConcept concept, int wordNumber, WindowPane window, Wiki wiki, ActionListener actionListener) {
051 super(window, wiki, actionListener);
052 this.concept = concept;
053 this.wordNumber = wordNumber;
054
055 setIconRow("concept",
056 "Every noun represents a certain type of things. " +
057 "For example, the noun \"credit card\" stands for all things that are credit cards. " +
058 "Every noun has a singular form and a plural form."
059 );
060 addRow("singular", singularField, "examples: woman, credit card, process", true);
061 addRow("plural", pluralField, "examples: women, credit cards, processes", true);
062
063 singularField.setText(concept.getPrettyWord(0));
064 pluralField.setText(concept.getPrettyWord(1));
065
066 ApplicationInstance.getActive().setFocusedComponent(singularField);
067 }
068
069 /**
070 * Creates a new creator window for nouns.
071 *
072 * @param wordNumber The word form id (only used if called from the sentence editor).
073 * @param wiki The wiki instance.
074 * @param actionListener The actionlistener.
075 * @return The new creator window.
076 */
077 public static WordEditorWindow createCreatorWindow(int wordNumber, Wiki wiki, ActionListener actionListener) {
078 WordEditorWindow creatorWindow = WordEditorWindow.createCreatorWindow();
079 creatorWindow.addTab(new NounForm(new NounConcept(), wordNumber, creatorWindow, wiki, actionListener));
080 return creatorWindow;
081 }
082
083 /**
084 * Creates a new editor window for nouns.
085 *
086 * @param concept The concept that is represented by the noun that should be edited.
087 * @param wiki The wiki instance.
088 * @return The new editor window.
089 */
090 public static WordEditorWindow createEditorWindow(NounConcept concept, Wiki wiki) {
091 WordEditorWindow editorWindow = WordEditorWindow.createEditorWindow();
092 editorWindow.addTab(new NounForm(concept, 0, editorWindow, wiki, wiki));
093 return editorWindow;
094 }
095
096 protected void save() {
097 Wiki wiki = getWiki();
098 String singular = normalize(singularField.getText());
099 String plural = normalize(pluralField.getText());
100 String singularP = singular.replace("_", " ");
101 String pluralP = plural.replace("_", " ");
102
103 if (singular.equals(plural)) {
104 wiki.log("edit", "error: singular and plural form have to be distinct.");
105 showErrorMessage("Singular and plural form have to be distinct.");
106 return;
107 }
108 if (singular.equals("")) {
109 wiki.log("edit", "error: no word defined");
110 showErrorMessage("No singular form defined: Please specify the singular form.");
111 return;
112 }
113 if (!isValidString(singular)) {
114 wiki.log("edit", "error: word contains invalid character");
115 showErrorMessage("Invalid character: Only a-z, A-Z, 0-9, -, and spaces are allowed, " +
116 "and the first character must be one of a-z A-Z.");
117 return;
118 }
119 if (FunctionWords.isFunctionWord(singular)) {
120 wiki.log("edit", "error: word is predefined");
121 showErrorMessage("'" + singularP + "' is a predefined word and cannot be used here.");
122 return;
123 }
124 OntologyElement oe = wiki.getOntology().get(singular);
125 if (oe != null && oe != concept) {
126 wiki.log("edit", "error: word is already used");
127 showErrorMessage("The word '" + singularP + "' is already used. Please use a different one.");
128 return;
129 }
130 if (plural.equals("")) {
131 wiki.log("edit", "error: no word defined");
132 showErrorMessage("No plural form defined: Please specify the plural form.");
133 return;
134 }
135 if (!isValidString(plural)) {
136 wiki.log("edit", "error: word contains invalid character");
137 showErrorMessage("Invalid character: Only a-z, A-Z, 0-9, -, and spaces are allowed, " +
138 "and the first character must be one of a-z A-Z.");
139 return;
140 }
141 if (FunctionWords.isFunctionWord(plural)) {
142 wiki.log("edit", "error: word is predefined");
143 showErrorMessage("'" + pluralP + "' is a predefined word and cannot be used here.");
144 return;
145 }
146 oe = wiki.getOntology().get(plural);
147 if (oe != null && oe != concept) {
148 wiki.log("edit", "error: word is already used");
149 showErrorMessage("The word '" + pluralP + "' is already used. Please use a different one.");
150 return;
151 }
152 concept.setWords(singular, plural);
153 wiki.log("edit", "noun: " + singular + " / " + plural);
154 if (concept.getOntology() == null) {
155 concept.registerAt(getWiki().getOntology());
156 }
157 finished(concept, wordNumber);
158 }
159
160 public String toString() {
161 return "Noun";
162 }
163
164 }