Back to index

wims  3.65+svn20090927
Mfd2SubstitutionLayout.java
Go to the documentation of this file.
00001 /*
00002 $Id: Mfd2SubstitutionLayout.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.Display;
00034 import fr.ove.openmath.jome.ctrlview.bidim.DisplayLayout;
00035 import fr.ove.openmath.jome.ctrlview.bidim.selection.events.SelectionEvent;
00036 import fr.ove.openmath.jome.model.*;
00037 
00048 public class Mfd2SubstitutionLayout extends HorizontalLayout {
00057     public void initDisplay(Display displayToLay) {
00058         super.initDisplay(displayToLay);
00059         
00060         // On ajoute un display d'opérateur.
00061         SymbolDisplay arrow = new SymbolDisplay(this.displayToLay.getGraphicContext(), new ImageSymbol("LeftArrow", this.displayToLay));
00062         
00063         // On met un listener à l'opérateur.
00064         // En fait, il n'y en a pas besoin, dans le sens où il n'y a pas spécifiquement de fts qui
00065         // écoute le comportement de ce display. Néanmoins, il s'avère nécessaire qu'il en ait
00066         // un, par exemple lors de l'iconification, car c'est le display qui reçoit la demande
00067         // d'iconification qui envoie l'événement correspondant à la FTS. Or si ce display n'a pas
00068         // d'écouteur, alors pb. Par cohérence, l'écouteur du display d'opérateur, est le fts qui
00069         // représente cette opération. Par contre, la fts en question, n'écoute pas le display
00070         // d'opérateur.
00071         arrow.addControlListener(this.displayToLay.getListener());
00072         arrow.setIsSymbolOperatorDisplay(true);
00073         this.displayToLay.add(arrow);
00074     }
00075     
00079     public void validateSelection() {
00080     }
00081     
00086     public void validateDeselection(Display display) {
00087     }
00088     
00094     public Dimension computeAttributes() {
00095         Dimension dim = super.computeAttributes();
00096         
00097         Display arrow = (Display) displayToLay.getComponent(0);
00098         Display left = (Display) displayToLay.getComponent(1);
00099         Display right = (Display) displayToLay.getComponent(2);
00100         arrow.setShiftX(left.getShiftX() + left.getWidth());
00101         left.setShiftX(-(arrow.getShiftX() + arrow.getWidth()));
00102         right.setShiftX(arrow.getWidth());
00103         
00104         return dim;
00105     }
00106     
00110     public void rebuildDisplay() {
00111         Display tmp;
00112         Display listDisplay[] = new Display[2];  // y en a 2 (en ne comptant pas celui de la flèche)
00113         
00114         for (int i = 0; i < 3; i++) {
00115             tmp = (Display) displayToLay.getComponent(i);
00116             if (!tmp.isSymbolOperatorDisplay()) {
00117                 // A voir !!!!!
00118                 // Mais il semblerai que bon, sinon à la (re)construction du display il se base
00119                 // sur des anciennes valeurs, et donc pas tarrible niveau affichage.
00120                 tmp.setLocation(0, 0);
00121                 listDisplay[((FormulaTreeStructure) tmp.getListener()).getRank()] = tmp;
00122             }
00123         }
00124         
00125         // Pour que la flèche soient gardée, on la met temporairement comme un display "classique".
00126         // Autrement dit, ce n'est plus un display d'opérateur.
00127         ((Display) displayToLay.getComponent(0)).setIsSymbolOperatorDisplay(false);
00128         
00129         // ATTENTION : ici, on enlève les displays fils de display, mais on ne les enlève pas de la liste
00130         // des listeners de la fts qu'il sont en train d'écouter. Exception faite pour les displays d'opérateur.
00131         displayToLay.removeAllDisplays();
00132                 
00133         // On remet la flèche dans un état qui est le sien, i.e. display d'opérateur.
00134         ((Display) displayToLay.getComponent(0)).setIsSymbolOperatorDisplay(true);
00135         
00136         for (int i = 0; i < 2; i++)
00137             displayToLay.add(listDisplay[i]);
00138             
00139         // La taille des displays est probablement différente de ceux qui étaient
00140         // précédemment. On demande alors le recalcul des display ancêtres.
00141         displayToLay.computeAncestorsAttributes();
00142     }
00143    
00144 }