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.Individual;
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.CheckBox;
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 proper names.
029 *
030 * @author Tobias Kuhn
031 */
032 public class ProperNameForm extends FormPane {
033
034 private static final long serialVersionUID = 7860047859937196093L;
035
036 private TextField nameField = new TextField(this);
037 private CheckBox nameDefArtCheckBox = new CheckBox();
038 private TextField abbrevField = new TextField(this);
039 private CheckBox abbrevDefArtCheckBox = new CheckBox();
040
041 private Individual ind;
042
043 /**
044 * Creates a new proper name form.
045 *
046 * @param ind The individual that is represented by the proper name.
047 * @param window The host window of the form.
048 * @param wiki The wiki instance.
049 * @param actionListener The actionlistener.
050 */
051 public ProperNameForm(Individual ind, WindowPane window, Wiki wiki, ActionListener actionListener) {
052 super(window, wiki, actionListener);
053 this.ind = ind;
054
055 setIconRow("individual",
056 "Every proper name represents a certain individual. " +
057 "The country \"Switzerland\", the person \"Bob Dylan\", the river \"Nile\", " +
058 "and the organization \"United Nations\" are typical examples. " +
059 "Some proper names are used with \"the\" (\"the Nile\", \"the United Nations\") " +
060 "and others are not (\"Switzerland\", \"Bob Dylan\"). " +
061 "Proper names can have an abbreviation that has the same meaning as the longer proper name."
062 );
063 addRow("proper name", nameField, "examples: Switzerland, Bob Dylan, Nile, United Nations", true);
064 addRow("... used with \"the\"", nameDefArtCheckBox, "examples: the Nile, the United Nations", false);
065 addRow("abbreviation", abbrevField, "examples: CH, UN", false);
066 addRow("... used with \"the\"", abbrevDefArtCheckBox, "example: the UN", false);
067
068 nameField.setText(ind.getPrettyWord(1));
069 nameDefArtCheckBox.setSelected(ind.hasDefiniteArticle(0));
070 abbrevField.setText(ind.getAbbreviation());
071 abbrevDefArtCheckBox.setSelected(ind.hasDefiniteArticle(2));
072
073 ApplicationInstance.getActive().setFocusedComponent(nameField);
074 }
075
076 /**
077 * Creates a new creator window for proper names.
078 *
079 * @param wiki The wiki instance.
080 * @param actionListener The actionlistener.
081 * @return The new creator window.
082 */
083 public static WordEditorWindow createCreatorWindow(Wiki wiki, ActionListener actionListener) {
084 WordEditorWindow creatorWindow = WordEditorWindow.createCreatorWindow();
085 creatorWindow.addTab(new ProperNameForm(new Individual(), creatorWindow, wiki, actionListener));
086 return creatorWindow;
087 }
088
089 /**
090 * Creates a new editor window for proper names.
091 *
092 * @param ind The individual that is represented by the proper name that should be edited.
093 * @param wiki The wiki instance.
094 * @return The new editor window.
095 */
096 public static WordEditorWindow createEditorWindow(Individual ind, Wiki wiki) {
097 WordEditorWindow editorWindow = WordEditorWindow.createEditorWindow();
098 editorWindow.addTab(new ProperNameForm(ind, editorWindow, wiki, wiki));
099 return editorWindow;
100 }
101
102 protected void save() {
103 Wiki wiki = getWiki();
104 String name = normalize(nameField.getText());
105 String abbrev = normalize(abbrevField.getText());
106 boolean nameDefArt = nameDefArtCheckBox.isSelected();
107 boolean abbrevDefArt = abbrevDefArtCheckBox.isSelected();
108
109 if (name.toLowerCase().startsWith("the_")) {
110 name = name.substring(4);
111 nameDefArt = true;
112 }
113 if (abbrev.toLowerCase().startsWith("the_")) {
114 abbrev = abbrev.substring(4);
115 abbrevDefArt = true;
116 }
117 String nameP = name.replace("_", " ");
118 String abbrevP = abbrev.replace("_", " ");
119
120 if (name.equals("")) {
121 wiki.log("edit", "error: no word defined");
122 showErrorMessage("No proper name defined: Please specify a name.");
123 return;
124 }
125 if (!isValidString(name) || !isValidString(abbrev)) {
126 wiki.log("edit", "error: word contains invalid character");
127 showErrorMessage("Invalid character: Only a-z, A-Z, 0-9, -, and spaces are allowed, " +
128 "and the first character must be one of a-z A-Z.");
129 return;
130 }
131 if (FunctionWords.isFunctionWord(name)) {
132 wiki.log("edit", "error: word is predefined");
133 showErrorMessage("'" + nameP + "' is a predefined word and cannot be used here.");
134 return;
135 }
136 if (FunctionWords.isFunctionWord(abbrev)) {
137 wiki.log("edit", "error: word is predefined");
138 showErrorMessage("'" + abbrevP + "' is a predefined word and cannot be used here.");
139 return;
140 }
141 if (abbrev.length() >= name.length()) {
142 wiki.log("edit", "error: abbreviation is not shorter than the full proper name");
143 showErrorMessage("The abbreviation has to be shorter than the full proper name.");
144 return;
145 }
146 OntologyElement oe = wiki.getOntology().get(name);
147 if (oe != null && oe != ind) {
148 wiki.log("edit", "error: word is already used");
149 showErrorMessage("The word '" + nameP + "' is already used. Please use a different one.");
150 return;
151 }
152 oe = wiki.getOntology().get(abbrev);
153 if (oe != null && oe != ind) {
154 wiki.log("edit", "error: word is already used");
155 showErrorMessage("The word '" + abbrevP + "' is already used. Please use a different one.");
156 return;
157 }
158 String word = name;
159 if (nameDefArt) {
160 word = "the " + name;
161 }
162 String abbrevWord = abbrev;
163 if (abbrev.equals("")) {
164 abbrev = null;
165 abbrevWord = null;
166 } else {
167 if (abbrevDefArt) {
168 abbrevWord = "the " + abbrev;
169 }
170 }
171 ind.setWords(word, name, abbrevWord, abbrev);
172 wiki.log("edit", "proper name: " + word + " / " + abbrevWord);
173 if (ind.getOntology() == null) {
174 ind.registerAt(getWiki().getOntology());
175 }
176 finished(ind);
177 }
178
179 public String toString() {
180 return "Proper Name";
181 }
182
183 }