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    }