Back to index

wims  3.65+svn20090927
WidthProcessor.java
Go to the documentation of this file.
00001 /*
00002 $Id: WidthProcessor.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 
00046 public class WidthProcessor extends ProcessorImpl implements WidthProcessorInterface {
00050     private Vector widthList = new Vector();
00051     
00055     private boolean isListValid = false;
00056     
00062     private int view = -1;
00063             
00067     public WidthProcessor(Formula formula) {
00068         super(formula);
00069     }
00070     
00077     public void setWidthLevel(int widthLevel) {
00078         setLevel(widthLevel);
00079     }
00080     
00086     public int getWidthLevel() {
00087         return getLevel();
00088     }
00089     
00094     public void setView(int view) {
00095         this.view = view;
00096     }
00097     
00101     public int getView() {
00102         return view;
00103     }
00104     
00105     
00109     public Vector getWidthList() {
00110         if (!isListValid) {
00111             buildWidthList(getFormula());
00112             isListValid = true;
00113         }
00114         return widthList;
00115     }
00116     
00120     public int getBiggestWidth() {
00121         return ((Integer) widthList.lastElement()).intValue();
00122     }
00123     
00127     public void doProcess() {
00128         Formula formula = getFormula();
00129         
00130         if (formula != null) {
00131             switch (getProcessingId()) {
00132                 case COMPUTE :
00133                     // La liste des Strahler n'est (a priori) plus à jour.
00134                     buildWidthList(formula);
00135                     break;
00136                 case SIMPLE_ICONIFICATION :
00137                     // Iconifie les parties de la formule qui ont un nombre de Strahler inférieur
00138                     // à celui spécifié.
00139                     setUpdateDisplay(true);
00140                     iconifyTheFTS(formula, getLevel());
00141                     setUpdateDisplay(false);
00142                     break;
00143                 case RECURSIVE_ICONIFICATION :
00144                     // Iconifie les parties de la formule qui ont un nombre de Strahler inférieur
00145                     // à celui spécifié. Iconification récursive.
00146                     setUpdateDisplay(true);
00147                     iconifyAllTheFTS(formula, getLevel());
00148                     setUpdateDisplay(false);
00149                     break;
00150                 case COMPUTE_AND_ICONIFY :
00151                     // La liste des Strahler n'est (a priori) plus à jour.
00152                     buildWidthList(formula);
00153                     // Iconifie les parties de la formule qui ont un nombre de Strahler inférieur
00154                     // à celui spécifié. Iconification récursive.
00155                     // Le defaut est que l'on icionifie à une valeur correspondant à peu près à la
00156                     // valeur moyenne du Strahler max calculé.
00157                     int width = getBiggestWidth() / 2;
00158                     // Maintenant on regarde dans la liste des width, le width valide immédiatement
00159                     // supérieur à la valeur correpsondant à la moitié du plus grand.
00160                     int count = widthList.size();
00161                     int tmp;
00162                     for (int i = 0; i < count; i++ ) {
00163                         tmp = ((Integer) widthList.elementAt(i)).intValue();
00164                         if (tmp > width) {
00165                             width = tmp;
00166                             break;
00167                         }
00168                         
00169                     }
00170                     setLevel(width);
00171                     view = width / 2; // On ne visualise que la moitié de fils de l'opérateur
00172                     iconifyAllTheFTS(formula, width);
00173             }
00174         }
00175     }
00176     
00182     private void iconifyTheFTS(FormulaTreeStructure fts, int width) {
00183         // On parcourt tous les enfants de l'instance et on descend dans toute l'arboresnce
00184         // jusqu'au feuilles. (DFS) Arrivée à la feuille, on teste la valeur du strahler et si
00185         // elle est inférieure à celle spécifiée, on iconifie.
00186         // On réitère le process sur tous les enfants.
00187         FormulaTreeStructure child = null;
00188         int ftsWidth = fts.getNbChildren();
00189         if ((ftsWidth > 0) && (ftsWidth >= width))
00190             iconify(fts, width);
00191                         
00192         int count = fts.getNbChildren();
00193         for (int i = 0; i < count; i++) 
00194             iconifyTheFTS((FormulaTreeStructure) fts.getChild(i), width);
00195     }
00196     
00202     private void iconifyAllTheFTS(FormulaTreeStructure fts, int width) {
00203         // On parcourt tous les enfants de l'instance et on descend dans toute l'arboresnce
00204         // jusqu'au feuilles. (DFS) Arrivée à la feuille, on teste la valeur du strahler et si
00205         // elle est inférieure à celle spécifiée, on iconifie.
00206         // On réitère le process sur tous les enfants.
00207         int ftsWidth = fts.getNbChildren();
00208         if (ftsWidth > 0) {
00209             for (Enumeration e = fts.getChildren().elements(); e.hasMoreElements(); ) 
00210                 iconifyAllTheFTS((FormulaTreeStructure) e.nextElement(), width);
00211                 
00212             if (ftsWidth >= width)
00213                 iconify(fts, width);
00214         }
00215     }
00216     
00221     private void iconify(FormulaTreeStructure fts, int width) {
00222         int count = fts.getNbChildren();
00223         Icon icon = new Icon(fts);
00224         // On ajoute notre instance à iconifier dans Icon (<=> on iconfie l'instance)
00225         FormulaTreeStructure child;
00226         // On ajout notre icone
00227         fts.addChild(icon);
00236         for (int i = view; i < count; i++)
00237             icon.addIconified((FormulaTreeStructure) fts.getChild(i));
00238             
00239         for (int i = view; i < count; ) {
00240             fts.removeChild((FormulaTreeStructure) fts.getChild(i));
00241             count--;
00242         }
00243         
00244         if (getUpdateDisplay()) {
00245             // On ajoute un display pour notre icon.
00246             ModelEvent modelEvent = new ModelEvent(fts);
00247             modelEvent.setAction(ModelEvent.ADD, icon);
00248             fts.fireModelEvent(modelEvent);
00249         }
00250     }
00251     
00255     private void buildWidthList(FormulaTreeStructure fts) {
00256         int width = fts.getNbChildren();
00257         
00258         if (width > 1)
00259             addNewWidth(width);
00260             
00261         for (int i = 0; i < width; i++)
00262             buildWidthList((FormulaTreeStructure) fts.getChild(i));
00263     }
00264     
00269     private void addNewWidth(int width) {
00270         int currentWidth;
00271         
00272         if (widthList.size() == 0)
00273             widthList.addElement(new Integer(width));
00274         else {
00275             for (int i = 0; i < widthList.size(); i++) {
00276                 currentWidth = ((Integer) widthList.elementAt(i)).intValue();
00277                 if (width == currentWidth)
00278                     return;
00279                 else if (width < currentWidth) {
00280                     widthList.insertElementAt(new Integer(width), i);
00281                     return;
00282                 }
00283             }
00284             widthList.addElement(new Integer(width));
00285         }
00286     }
00287     
00288     public static void main(String args[]) {
00289         String exp = "a*z*e*r*r*t*(t+2+2+2+2+2+2+2+6+6+6+6+6+6)*1*6*6*6*6*6*6+2+3+4+5+6+7+8+9+10+11+12+13+14";
00290         Formula formula = new Formula();
00291         formula.setDoProcessing(true);
00292         
00293         WidthProcessor p = new WidthProcessor(formula);
00294         formula.setProcessor(p);
00295         
00296         fr.ove.openmath.jome.ctrlview.bidim.FormulaDisplay display = new fr.ove.openmath.jome.ctrlview.bidim.FormulaDisplay();
00297         formula.addModelListener(display);
00298         display.addControlListener(formula);
00299         
00300         java.awt.Frame f = new java.awt.Frame();
00301         f.setLayout(new java.awt.BorderLayout());
00302         f.setBounds(50, 50, 250, 80);
00303         f.add("Center", display);
00304         f.setVisible(true);
00305         
00306         fr.ove.openmath.jome.ctrl.linear.LinearParser linearParser = new fr.ove.openmath.jome.ctrl.linear.LinearParser();
00307         linearParser.addLinearParserListener(formula);
00308         linearParser.parse(exp);
00309         System.out.println("la formule saisie est : \t\t" + exp);
00310         System.out.println("la formule construite est : \t\t" + formula.getLinear());
00311     }    
00312 }