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.CheckBox; 019 import nextapp.echo2.app.ResourceImageReference; 020 import nextapp.echo2.app.event.ActionListener; 021 import ch.uzh.ifi.attempto.acewiki.Wiki; 022 import ch.uzh.ifi.attempto.acewiki.core.ontology.Individual; 023 import ch.uzh.ifi.attempto.acewiki.core.ontology.OntologyElement; 024 import ch.uzh.ifi.attempto.ape.FunctionWords; 025 import ch.uzh.ifi.attempto.echocomp.TextField; 026 import ch.uzh.ifi.attempto.echocomp.WindowPane; 027 028 /** 029 * This class represents a form to create or modify proper names. 030 * 031 * @author Tobias Kuhn 032 */ 033 public class ProperNameForm extends FormPane { 034 035 private static final long serialVersionUID = 7860047859937196093L; 036 037 private TextField nameField = new TextField(); 038 private CheckBox defArticleCheckBox = new CheckBox(); 039 040 private Individual ind; 041 042 /** 043 * Creates a new proper name form. 044 * 045 * @param ind The individual that is represented by the proper name. 046 * @param window The host window of the form. 047 * @param wiki The wiki instance. 048 * @param actionListener The actionlistener. 049 */ 050 public ProperNameForm(Individual ind, WindowPane window, Wiki wiki, ActionListener actionListener) { 051 super(window, wiki, actionListener); 052 this.ind = ind; 053 054 setIconRow("individual", 055 "Every proper name represents a certain individual. " + 056 "The country \"Switzerland\", the person \"Bob Dylan\", the river \"Nile\", " + 057 "and the organization \"United Nations\" are typical examples for such individuals. " + 058 "Some proper names require a definite article (\"the Nile\", \"the United Nations\") " + 059 "and others do not (\"Switzerland\", \"Bob Dylan\")." 060 ); 061 addRow("proper name", nameField, "examples: Switzerland, Bob Dylan, Nile, United Nations", true); 062 addRow("definite article", defArticleCheckBox, "examples: the Nile, the United Nations", false); 063 064 nameField.setText(ind.getPrettyWord(1)); 065 defArticleCheckBox.setSelected(ind.hasDefiniteArticle()); 066 defArticleCheckBox.setStateIcon(new ResourceImageReference("ch/uzh/ifi/attempto/acewiki/gui/img/notchecked.png")); 067 defArticleCheckBox.setSelectedStateIcon(new ResourceImageReference("ch/uzh/ifi/attempto/acewiki/gui/img/checked.png")); 068 069 ApplicationInstance.getActive().setFocusedComponent(nameField); 070 } 071 072 /** 073 * Creates a new creator window for proper names. 074 * 075 * @param wiki The wiki instance. 076 * @param actionListener The actionlistener. 077 * @return The new creator window. 078 */ 079 public static WordEditorWindow createCreatorWindow(Wiki wiki, ActionListener actionListener) { 080 WordEditorWindow creatorWindow = WordEditorWindow.createCreatorWindow(); 081 creatorWindow.addTab(new ProperNameForm(new Individual(), creatorWindow, wiki, actionListener)); 082 return creatorWindow; 083 } 084 085 /** 086 * Creates a new editor window for proper names. 087 * 088 * @param ind The individual that is represented by the proper name that should be edited. 089 * @param wiki The wiki instance. 090 * @return The new editor window. 091 */ 092 public static WordEditorWindow createEditorWindow(Individual ind, Wiki wiki) { 093 WordEditorWindow editorWindow = WordEditorWindow.createEditorWindow(); 094 editorWindow.addTab(new ProperNameForm(ind, editorWindow, wiki, wiki)); 095 return editorWindow; 096 } 097 098 protected void save() { 099 Wiki wiki = getWiki(); 100 String name = normalize(nameField.getText()); 101 if (name.toLowerCase().startsWith("the_")) { 102 name = name.substring(4); 103 } 104 String nameP = name.replace("_", " "); 105 106 if (name.equals("")) { 107 wiki.log("edit", "error: no word defined"); 108 showErrorMessage("No proper name defined: Please specify a name."); 109 return; 110 } 111 if (!isValidString(name)) { 112 wiki.log("edit", "error: word contains invalid character"); 113 showErrorMessage("Invalid character: Only a-z, A-Z, 0-9, -, and spaces are allowed, " + 114 "and the first character must be one of a-z A-Z."); 115 return; 116 } 117 if (FunctionWords.isFunctionWord(name)) { 118 wiki.log("edit", "error: word is predefined"); 119 showErrorMessage("'" + nameP + "' is a predefined word and cannot be used here."); 120 return; 121 } 122 OntologyElement oe = wiki.getOntology().get(name); 123 if (oe != null && oe != ind) { 124 wiki.log("edit", "error: word is already used"); 125 showErrorMessage("The word '" + nameP + "' is already used. Please use a different one."); 126 return; 127 } 128 String word = name; 129 if (defArticleCheckBox.isSelected()) { 130 word = "the " + name; 131 } 132 ind.setWords(word, name); 133 wiki.log("edit", "proper name: " + word); 134 if (ind.getOntology() == null) { 135 ind.registerAt(getWiki().getOntology()); 136 } 137 finished(ind); 138 } 139 140 public String toString() { 141 return "Proper Name"; 142 } 143 144 }