Back to index

wims  3.65+svn20090927
InfixOperatorLayout.java
Go to the documentation of this file.
00001 /*
00002 $Id: InfixOperatorLayout.java,v 1.3 2003/02/18 11:48:46 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.ctrlview.bidim;
00030 
00031 import java.awt.*;
00032 import java.util.*;
00033 import fr.ove.openmath.jome.ctrlview.bidim.*;
00034 import fr.ove.openmath.jome.model.*;
00035 
00043 public abstract class InfixOperatorLayout extends HorizontalLayout implements OperatorDisplayCreator {    
00047     protected boolean insertOperatorDisplay = true;
00048     
00055     protected int prevNbComponent = 0;
00056     
00061     protected void insertOperatorDisplay() {
00062         Display current, next, displayOperator;
00063         FormulaTreeStructure fatherFts = (FormulaTreeStructure) displayToLay.getListener();
00064         FormulaTreeStructure fts;
00065         int nbComponent = displayToLay.getComponentCount();
00066         
00067         // On parcourre tous les components présents dans le display.
00068         for (int i = 1; i < nbComponent; i++) {
00069             // la référence sur le component courant
00070             current = (Display) displayToLay.getComponent(i - 1);
00071             // la référence sur le suivant
00072             next = (Display) displayToLay.getComponent(i);
00073             
00074             // Si le courant est un display d'opérateur alors on continue
00075             if (current.isSymbolOperatorDisplay())
00076                 continue;
00077                 
00078             // Si le suivant n'est pas un display d'opérateur alors 2 cas
00079             if (!next.isSymbolOperatorDisplay()) {
00080                 // On ajoute un display d'opérateur.
00081                 displayOperator = createOperatorDisplay();
00082                 displayToLay.add(displayOperator, displayOperator, i);
00083                 
00084                 // On met un listener à l'opérateur.
00085                 // En fait, il n'y en a pas besoin, dans le sens où il n'y a pas spécifiquement de fts qui
00086                 // écoute le comportement de ce display. Néanmoins, il s'avère nécessaire qu'il en ait
00087                 // un, par exemple lors de l'iconification, car c'est le display qui reçoit la demande
00088                 // d'iconification qui envoie l'événement correspondant à la FTS. Or si ce display n'a pas
00089                 // d'écouteur, alors pb. Par cohérence, l'écouteur du display d'opérateur, est le fts qui
00090                 // représente cette opération. Par contre, la fts en question, n'écoute pas le display
00091                 // d'opérateur.
00092                 displayOperator.addControlListener(fatherFts);
00093                 i++;
00094                 nbComponent++;
00095             }
00096         }
00097         
00098         // Mise à jour des rangs des displays
00099         displayToLay.adjustRank();
00100         // Mise à jour du nombre de components présents dans le display.
00101         prevNbComponent = displayToLay.getComponentCount();
00102         // On n'a plus besoin d'insérer des displays d'opérateur.
00103         insertOperatorDisplay = false;
00104         // On fait en sorte que la mise à niveau des displays (opérateurs) soit faite.
00105         displayToLay.setUpdateLevel(true);
00106         // On a rajouté un display, on demande le recalcul de tous les ancêtres
00107         // de l'instance.
00108         displayToLay.computeAncestorsAttributes();
00109     }
00110     
00116     public Dimension computeAttributes() {
00117         // On regarde si le nombre de component dans le display a changé depuis
00118         // la dernière fois. Si oui, il faut contrôler s'il ne faut pas ajouter
00119         // des display d'opérateur.
00120         if (insertOperatorDisplay || (prevNbComponent != displayToLay.getComponentCount()))
00121             insertOperatorDisplay();
00122             
00123         return super.computeAttributes();
00124     }
00125         
00129     public void rebuildDisplay() {
00130         Display tmp;
00131         int nbDisplay = ((FormulaTreeStructure) displayToLay.getListener()).getNbChildren();
00132         Display listDisplay[] = new Display[nbDisplay];
00133         
00134         int count = displayToLay.getComponentCount();
00135         for (int i = 0; i < count; i++) {
00136             tmp = (Display) displayToLay.getComponent(i);
00137             if (!tmp.isSymbolOperatorDisplay()) {
00138                 // A voir !!!!!
00139                 // Mais il semblerai que bon, sinon à la (re)construction du display il se base
00140                 // sur des anciennes valeurs, et donc pas terrible niveau affichage.
00141                 tmp.setLocation(0, 0);
00142                 listDisplay[((FormulaTreeStructure) tmp.getListener()).getRank()] = tmp;
00143             }
00144         }
00145         
00146         // ATTENTION : ici, on enlève les displays fils de display, mais on ne les enlève pas de la liste
00147         // des listeners de la fts qu'il sont en train d'écouter. Exception faite pour les displays d'opérateur.
00148         displayToLay.removeAllDisplays();
00149                 
00150         for (int i = 0; i < nbDisplay; i++)
00151             displayToLay.add(listDisplay[i]);
00152             
00153         // On a reconstruit le display, il faut maintenant insérer les displays d'opérateur.
00154         insertOperatorDisplay = true;
00155         
00156         // La taille des displays est probablement différente de ceux qui étaient
00157         // précédemment. On demande alors le recalcul des display ancêtres.
00158         displayToLay.computeAncestorsAttributes();
00159     }
00160 }