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 }