Back to index

wims  3.65+svn20090927
DepthProcessor.java
Go to the documentation of this file.
00001 /*
00002 $Id: DepthProcessor.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.processor;
00030 
00031 import fr.ove.openmath.jome.model.*;
00032 import fr.ove.openmath.jome.model.events.*;
00033 import java.util.*;
00034 import java.awt.*;
00035 
00042 public class DepthProcessor extends ProcessorImpl implements DepthProcessorInterface {
00046     private int maxDepthValue = 0;
00047     
00052     public DepthProcessor(Formula formula) {
00053         super(formula);
00054     }
00055     
00062     public void setDepthLevel(int depthLevel) {
00063         setLevel(depthLevel);
00064     }
00065     
00071     public int getDepthLevel() {
00072         return getLevel();
00073     }
00074     
00078     public int getMaxDepthValue() {
00079         return maxDepthValue;
00080     }
00081         
00085     public void doProcess() {
00086         Formula formula = getFormula();
00087         
00088         if (formula != null) {
00089             switch (getProcessingId()) {
00090                 case COMPUTE :
00091                     // En fait le calcul de la profondeur est fait à la construction de la formule.
00092                     // donc rien de particulier à faire ici, si ce n'est affecter la valeur de la 
00093                     // profondeur max de l'arbre de la formule.
00094                     maxDepthValue = 0; // initialisation
00095                     computeMaxDepthValue(formula); // calcul.
00096                     break;
00097                 case SIMPLE_ICONIFICATION :
00098                     // Iconifie les parties de la formule qui ont une profondeur supérieure
00099                     // à celle spécifiée.
00100                     setUpdateDisplay(true);
00101                     iconifyTheFTS(formula, getLevel());
00102                     setUpdateDisplay(false);
00103                     break;
00104                 case RECURSIVE_ICONIFICATION :
00105                     // Iconifie les parties de la formule qui ont une profondeur supérieure
00106                     // à celle spécifiée. Iconification récursive.
00107                     setUpdateDisplay(true);
00108                     iconifyAllTheFTS(formula, getLevel());
00109                     setUpdateDisplay(false);
00110                     break;
00111                 case COMPUTE_AND_ICONIFY :
00112                     // En fait le calcul de la profondeur est fait à la construction de la formule.
00113                     // donc rien de particulier à faire ici, si ce n'est affecter la valeur de la 
00114                     // profondeur max de l'arbre de la formule.
00115                     maxDepthValue = 0; // initialisation
00116                     computeMaxDepthValue(formula); // calcul.
00117                     // Iconifie les parties de la formule qui ont une profondeur supérieure
00118                     // à celle spécifié. Iconification récursive.
00119                     // Le defaut est que l'on icionifie à une valeur correspondant à peu près à la
00120                     // moitié de la profondeur de l'arbre.
00121                     setLevel(maxDepthValue / 2);
00122                     iconifyAllTheFTS(formula, getLevel());
00123             }
00124         }
00125     }
00126     
00132     private void iconifyTheFTS(FormulaTreeStructure fts, int depth) {
00133         // On parcourt tous les enfants de l'instance et on descend dans toute l'arboresnce
00134         // jusqu'au feuilles. (DFS) Arrivée à la feuille, on teste la valeur de la profondeur et si
00135         // elle est spérieure à celle spécifiée, on iconifie.
00136         // On réitère le process sur tous les enfants.
00137         FormulaTreeStructure child = null;
00138         
00139         /*
00140         if (fts.getNbChildren() > 0) {
00141             for (Enumeration e = fts.getChildren().elements(); e.hasMoreElements(); ) {
00142                 child = (FormulaTreeStructure) e.nextElement();
00143                 if (child.getDepth() < depth)
00144                     iconifyTheFTS(child, depth);
00145                 else
00146                     if (child.getNbChildren() > 0) // Si child n'est pas une feuille (i.e. constante), on iconifie
00147                         iconify(child, depth);
00148             }
00149         }
00150         */
00151         
00152         if (fts.isIcon()) {
00153             FormulaTreeStructure father = (FormulaTreeStructure) fts.getFather();
00154             fts.uniconify();
00155             
00156             // On envoie maintenant un événement comme quoi il faut reconstruire
00157             // l'affichage.
00158             ModelEvent modelEvent = new ModelEvent(father);
00159             modelEvent.setAction(ModelEvent.REBUILD, null);
00160             father.fireModelEvent(modelEvent);
00161             
00162             iconifyTheFTS(father, depth);
00163         }
00164         
00165         if (fts.getDepth() < depth) {
00166             if (fts.getNbChildren() > 0) {
00167                 for (Enumeration e = fts.getChildren().elements(); e.hasMoreElements(); )
00168                         iconifyTheFTS((FormulaTreeStructure) e.nextElement(), depth);
00169             }
00170         }
00171         else {
00172             if (fts.getNbChildren() > 0)
00173                 iconify(fts, depth);
00174         }
00175         
00176     }
00177     
00183     private void iconifyAllTheFTS(FormulaTreeStructure fts, int depth) {
00184         // On parcourt tous les enfants de l'instance et on descend dans toute l'arboresnce
00185         // jusqu'au feuilles. (DFS) Arrivée à la feuille, on teste la valeur du strahler et si
00186         // elle est inférieure à celle spécifiée, on iconifie.
00187         // On réitère le process sur tous les enfants.
00188         if (fts.getNbChildren() > 0) {
00189             for (Enumeration e = fts.getChildren().elements(); e.hasMoreElements(); ) 
00190                 iconifyAllTheFTS((FormulaTreeStructure) e.nextElement(), depth);
00191 
00192             if (fts.getDepth() >= depth)
00193                 iconify(fts, depth);
00194         }
00195     }
00196     
00201     private void iconify(FormulaTreeStructure fts, int depth) {
00202         if (fts.getFather() != null) {
00203             Icon icon = new Icon(fts);
00204             // On ajoute notre instance à iconifier dans Icon (<=> on iconfie l'instance)
00205             icon.addIconified(fts);
00206             // On insère maintenant notre icon à la place de fts.
00207             // On prend le père de l'instance.
00208             FormulaTreeStructure father = (FormulaTreeStructure) fts.getFather();
00209             // On insère notre icone à la place de l'instance
00210             father.addChild(icon, fts.getRank());
00211             // On enlève l'instance de la liste des enfants de father.
00212             father.removeChild(fts);
00213             
00214             if (getUpdateDisplay()) {
00215                 // On ajoute un display pour notre icon.
00216                 ModelEvent modelEvent = new ModelEvent(father);
00217                 modelEvent.setAction(ModelEvent.ADD, icon);
00218                 father.fireModelEvent(modelEvent);
00219             }
00220         }
00221     }
00222     
00226     private void computeMaxDepthValue(FormulaTreeStructure fts) {
00227         if (fts.getNbChildren() > 0) {
00228             for (Enumeration e = fts.getChildren().elements(); e.hasMoreElements(); ) 
00229                 computeMaxDepthValue((FormulaTreeStructure) e.nextElement());
00230         }
00231         
00232         maxDepthValue = (int) Math.max(fts.getDepth(), maxDepthValue);
00233     }
00234         
00235     public static void main(String args[]) {
00236         String exp = "1+2/3*(4+3/5)^2+2/((3+5^9)*(1+2+3))";
00237         Formula formula = new Formula();
00238         formula.setDoProcessing(true);
00239         
00240         DepthProcessor p = new DepthProcessor(formula);
00241         //p.setLevel(3);
00242         formula.setProcessor(p);
00243         
00244         fr.ove.openmath.jome.ctrlview.bidim.FormulaDisplay display = new fr.ove.openmath.jome.ctrlview.bidim.FormulaDisplay();
00245         formula.addModelListener(display);
00246         display.addControlListener(formula);
00247         
00248         java.awt.Frame f = new java.awt.Frame();
00249         f.setLayout(new java.awt.BorderLayout());
00250         f.setBounds(50, 50, 250, 80);
00251         f.add("Center", display);
00252         f.setVisible(true);
00253         
00254         fr.ove.openmath.jome.ctrl.linear.LinearParser linearParser = new fr.ove.openmath.jome.ctrl.linear.LinearParser();
00255         linearParser.addLinearParserListener(formula);
00256         linearParser.parse(exp);
00257         System.out.println("la formule saisie est : \t\t" + exp);
00258         System.out.println("la formule construite est : \t\t" + formula.getLinear());
00259     }    
00260 }