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.OfRole;
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 of-constructs.
028 *
029 * @author Tobias Kuhn
030 */
031 public class NounOfForm extends FormPane {
032
033 private static final long serialVersionUID = -6544810970331235077L;
034
035 private TextField nounField = new TextField(this);
036
037 private OfRole role;
038
039 /**
040 * Creates a new form for of-constructs.
041 *
042 * @param role The role that is represented by the of-construct.
043 * @param window The host window of the form.
044 * @param wiki The wiki instance.
045 * @param actionListener The actionlistener.
046 */
047 public NounOfForm(OfRole role, WindowPane window, Wiki wiki, ActionListener actionListener) {
048 super(window, wiki, actionListener);
049 this.role = role;
050
051 setIconRow("role",
052 "Every of-construct represents a certain relation between things. " +
053 "For example, the of-construct \"child of\" relates persons to their parents. " +
054 "Every of-construct consists of a noun plus the preposition \"of\", " +
055 "for example \"part of\", \"child of\", \"owner of\", etc."
056 );
057 addRow("noun", nounField, "examples: part, child, owner", true);
058
059 nounField.setText(role.getPrettyNoun());
060
061 ApplicationInstance.getActive().setFocusedComponent(nounField);
062 }
063
064 /**
065 * Creates a new creator window for of-constructs.
066 *
067 * @param wiki The wiki instance.
068 * @param actionListener The actionlistener.
069 * @return The new creator window.
070 */
071 public static WordEditorWindow createCreatorWindow(Wiki wiki, ActionListener actionListener) {
072 WordEditorWindow creatorWindow = WordEditorWindow.createCreatorWindow();
073 creatorWindow.addTab(new NounOfForm(new OfRole(), creatorWindow, wiki, actionListener));
074 return creatorWindow;
075 }
076
077 /**
078 * Creates a new editor window for of-constructs.
079 *
080 * @param role The role that is represented by the of-construct that should be edited.
081 * @param wiki The wiki instance.
082 * @return The new editor window.
083 */
084 public static WordEditorWindow createEditorWindow(OfRole role, Wiki wiki) {
085 WordEditorWindow editorWindow = WordEditorWindow.createEditorWindow();
086 editorWindow.addTab(new NounOfForm(role, editorWindow, wiki, wiki));
087 return editorWindow;
088 }
089
090 protected void save() {
091 Wiki wiki = getWiki();
092 String name = normalize(nounField.getText());
093 if (name.toLowerCase().endsWith("_of")) {
094 name = name.substring(0, name.length()-3);
095 }
096 String nameP = name.replace("_", " ");
097
098 if (name.equals("")) {
099 wiki.log("edit", "error: no word defined");
100 showErrorMessage("No noun defined: Please specify the singular form of a noun.");
101 return;
102 }
103 if (!isValidString(name)) {
104 wiki.log("edit", "error: word contains invalid character");
105 showErrorMessage("Invalid character: Only a-z, A-Z, 0-9, -, and spaces are allowed, " +
106 "and the first character must be one of a-z A-Z.");
107 return;
108 }
109 if (FunctionWords.isFunctionWord(name)) {
110 wiki.log("edit", "error: word is predefined");
111 showErrorMessage("'" + nameP + "' is a predefined word and cannot be used here.");
112 return;
113 }
114 OntologyElement oe = wiki.getOntology().get(name + " of");
115 if (oe != null && oe != role) {
116 wiki.log("edit", "error: word is already used");
117 showErrorMessage("The word '" + nameP + "' is already used. Please use a different one.");
118 return;
119 }
120 role.setWords(name);
121 wiki.log("edit", "of-construct: " + name);
122 if (role.getOntology() == null) {
123 role.registerAt(getWiki().getOntology());
124 }
125 finished(role);
126 }
127
128 public String toString() {
129 return "Of-Construct";
130 }
131
132 }