Back to index

wims  3.65+svn20090927
VariableOrNumber.java
Go to the documentation of this file.
00001 /*
00002 $Id: VariableOrNumber.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 fr.ove.openmath.jome.model.*;
00032 import fr.ove.openmath.jome.model.events.*;
00033 import fr.ove.openmath.jome.model.evaluation.*;
00034 
00043 public class VariableOrNumber extends Constant {
00047     private boolean isNumber; 
00048     
00053     private boolean isInteger;
00054     
00060     private boolean isRequestVariable = false;  // à voir plus tard mais probablement à virer.
00061     
00062 
00067     public VariableOrNumber() {
00068         this("VARIABLE", "[?]", false, false);
00069         setIsTemplate(true);
00070     }
00071     
00079     public VariableOrNumber(String resourceIdentifier, String value, boolean isNumber, boolean isInteger) {
00080         super();
00081         setResourceIdentifier(resourceIdentifier);
00082         setValue(value);
00083         this.isNumber = isNumber;
00084         this.isInteger = isInteger;
00085     }
00086     
00092     public void setIsNumber(boolean isNumber) {
00093         this.isNumber = isNumber;
00094     }
00095     
00100     public boolean isNumber() {
00101         return isNumber;
00102     }
00103     
00109     public void setIsInteger(boolean isInteger) {
00110         this.isInteger = isInteger;
00111     }
00112     
00117     public boolean isInteger() {
00118         return isInteger;
00119     }
00120 
00124     public void setIsRequestVariable(boolean isRequestVariable) {
00125         this.isRequestVariable = isRequestVariable;
00126     }
00127     
00132     public boolean isRequestVariable() {
00133         return isRequestVariable;
00134     }
00135 
00143     public FormulaTreeStructure insert(FormulaTreeStructure current) {
00144         if (isTemplate()) {
00145             if (isRequestVariable)
00146                 return super.insert(current);
00147                 
00148             // Si l'instance que l'on doit insérer est un template, alors on l'insère
00149             // directement à la position courante (heuu... on sait ce qu'on fait ;o) )
00150             current.addChild(this);
00151             return this;
00152         }
00153         else {  // L'instance n'est pas un template.
00154             if (current.getAsOperatorPriority() == resourcesManager.getAsOperatorPriority("constantPriorities")) {
00155                 // A ce stade 2 solutions. Soit :
00156                 //  * current est un template, alors encore 2 possibilités. Soit :
00157                 //      - current est une request variable, alors si l'instance est une variable, c'est qu'on
00158                 //        est en train de saisir sa valeur. Sinon, c'est une erreur syntaxique, on remplace
00159                 //        la request variable, par l'instance.
00160                 //      - current n'est pas une request variable, on remplace current par l'instance
00161                 //  * current n'est pas un template, il faut donc créer une multiplication implicite.
00162                 if (current.isTemplate()) {
00163                     if (((VariableOrNumber) current).isRequestVariable && !isNumber) {
00164                         current.setIsTemplate(false);
00165                         ((VariableOrNumber) current).setValue(getValue());
00166                         return current;
00167                     }
00168                     else {
00169                         FormulaTreeStructure father = (FormulaTreeStructure) current.getFather();
00170                         father.addChild(this, current.getRank());
00171                         father.removeChild(current);
00172                         return this;
00173                     }                    
00174                 }
00175                 else {// on créé donc une multiplication implicite.
00176                     current = (new Multiplication()).insert(current);
00177                     current = insert(current);
00178                     return current;
00179                 }
00180             }
00181             else { // On est dans le cas de l'insertion courante d'une constante dans la FTS
00182                 if ((current.getFather() == null) && (current.getNbChildren() == 0)) {
00183                     // On est dans ce cas là, seulement au tout début de la saisie de la 
00184                     // formule. On est obligé de faire ce test à cause de la multiplication
00185                     // implicite avec les parenthèses (Ex: (a+b)c ==> (a+b)*c, dans ce cas là,
00186                     // current.getNbChildren() est != de 0)
00187                     //On insère directement à la position courante
00188                     current.addChild(this);
00189                     
00190                     return this;
00191                 }
00192                 else { // On est dans aucun des cas précédents, on créé donc une
00193                     // multiplication implicite.
00194                     current = (new Multiplication()).insert(current);
00195                     current = insert(current);
00196                     return current;
00197                 }
00198             }
00199         }
00200     }
00201     
00205     public String createLinear(String linear) {
00206         if (isRequestVariable)
00207             linear += "?";
00208             
00209         if (!isTemplate())
00210             linear += getValue();
00211             
00212         return linear;
00213     }
00214 }