Back to index

wims  3.65+svn20090927
Bracket.java
Go to the documentation of this file.
00001 /*
00002 $Id: Bracket.java,v 1.3 2003/02/18 11:48:47 sander Exp $
00003 */
00004 
00005 
00006 /*
00007 Copyright (C) 2001-2002 Mainline Project (I3S - ESSI - CNRS -UNSA)
00008 
00009 This library is free software; you can redistribute it and/or
00010 modify it under the terms of the GNU Lesser General Public
00011 License as published by the Free Software Foundation; either
00012 version 2.1 of the License, or (at your option) any later version.
00013 
00014 This library is distributed in the hope that it will be useful,
00015 but WITHOUT ANY WARRANTY; without even the implied warranty of
00016 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017 Lesser General Public License for more details.
00018 
00019 You should have received a copy of the GNU Lesser General Public
00020 License along with this library; if not, write to the Free Software
00021 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00022 
00023 For further information on the GNU Lesser General Public License,
00024 see: http://www.gnu.org/copyleft/lesser.html
00025 For further information on this library, contact: mainline@essi.fr
00026 */
00027 
00028 
00029 package fr.ove.openmath.jome.model;
00030 
00031 import java.util.*;
00032 import fr.ove.openmath.jome.model.FormulaTreeStructure;
00033 import fr.ove.openmath.jome.model.events.ModelEvent;
00034 import fr.ove.openmath.jome.model.evaluation.*;
00035 
00042 public class Bracket extends UnaryOperator {
00043     private boolean isVisible = true;
00044     
00048     public Bracket() {
00049         setResourceIdentifier("OPEN_PAREN");
00050         setValue("(");
00051         setAsOperatorPriority(resourcesManager.getAsOperatorPriority("bracketPriorities"));
00052         setAsOperandPriority(resourcesManager.getAsOperandPriority("bracketPriorities"));
00053     }
00054     
00062     public FormulaTreeStructure goTo(int priority) {
00063         FormulaTreeStructure current = this;
00064 
00065         // Si le test est vrai, c'est qu'on est déjà sur un tel noeud.
00066         // Cela veut dire que l'on est en train de fermer des parenthèses successives
00067         // Ex: ((2+3))
00068         // Ce qui c'est passé: on a eu un goto avec la première ). On se retrouve alors
00069         // sur le noeud représentant les secondes parenthèses, c'est à dire l'instance courante.
00070         // Donc l'appel de ce goto a pour but de fermer les parenthèses représentées par l'instance
00071         // courante. On retourne donc simplement le père. Sinon, on remonte.
00072         if (current.getAsOperatorPriority() == priority)
00073             return (FormulaTreeStructure) current.getFather();
00074         else
00075             current = (FormulaTreeStructure) current.getFather();
00076 
00077         while ((current.getAsOperatorPriority() != priority) &&
00078                 (((FormulaTreeStructure)current.getFather()).getAsOperatorPriority() != 0))
00079             current = (FormulaTreeStructure) current.getFather();
00080 
00081         return current;
00082     }
00083 
00091     public FormulaTreeStructure insert(FormulaTreeStructure current) {
00092         // On recherche la position d'insertion de notre instance.
00093         current = findLocation(current);
00094 
00095         if (current.getFather() == null) {
00096             // On commence la saisie de la formule, on ajoute l'instance courante telle
00097             // qu'elle dansla formule.
00098             current.addChild(this);
00099 
00100         }
00101         else { // 2 possibilités s'offrent à nous !!!
00102             if ((current.getAsOperatorPriority() == resourcesManager.getAsOperatorPriority("constantPriorities")) &&
00103                 current.isTemplate()) {
00104                 // Le cas classique (on va même dire normal !!!)
00105                 // La position d'insertion est un template.
00106                 // On doit remplacer le template par l'instance courante (nos parenthèses)
00107                 int rank = current.getRank();
00108                 FormulaTreeStructure father = (FormulaTreeStructure) current.getFather();
00109                 father.addChild(this, rank);
00110                 father.removeChild(current);
00111 
00112                 // On regarde quel est le type de father. Si c'est une Fraction, les parenthèses
00113                 // ne sont pas visibles.
00114                 if (father.getAsOperatorPriority() ==  resourcesManager.getAsOperatorPriority("dividePriorities"))
00115                     isVisible = false;
00116             }
00117             else {
00118                 // Le cas pas classique
00119                 // La position d'insertion n'est pas un template.
00120                 // On créé une multiplication implicite.
00121                 current = (new Multiplication()).insert(current);
00122                 // On insère nos parenthèses
00123                 current = insert(current);
00124                 // On retourne le dernier point d'insertion.
00125                 return current;
00126             }
00127         }
00128 
00129         // On ajoute un template à nos parenthèses.
00130         VariableOrNumber template = new VariableOrNumber();
00131         addChild(template);
00132 
00133         // On retourne le dernier point d'insertion.
00134         return template;
00135 
00136     }
00137     
00141     public String createLinear(String linear) {
00142         linear += "(" + ((FormulaTreeStructure) getChild(0)).createLinear("") + ")";
00143 
00144         return linear;
00145     }
00146 
00150     public String evaluate() {
00151         return "(" + ((FormulaTreeStructure) getChild(0)).evaluate() + ")";
00152     }
00153 
00158     public boolean isVisible() {
00159         return isVisible;
00160     }
00161 
00166     public void setIsVisible(boolean isVisible) {
00167         this.isVisible = isVisible;
00168     }
00169     
00176     public String getIconName() {
00177         // On surcharge cette méthode pour que l'icône de la parenthèse soit en fait l'icône
00178         // de ce qu'elle contient.
00179         return ((FormulaTreeStructure) getChild(0)).getIconName();
00180     }
00181 }