Back to index

wims  3.65+svn20090927
UnaryOperatorLayout.java
Go to the documentation of this file.
00001 /*
00002 $Id: UnaryOperatorLayout.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.ctrlview.bidim;
00030 
00031 import java.awt.*;
00032 import fr.ove.openmath.jome.ctrlview.bidim.*;
00033 import fr.ove.openmath.jome.ctrlview.bidim.selection.events.SelectionEvent;
00034 import fr.ove.openmath.jome.model.*;
00035 
00042 public abstract class UnaryOperatorLayout extends HorizontalLayout implements OperatorDisplayCreator {
00051     public void initDisplay(Display displayToLay) {
00052         super.initDisplay(displayToLay);
00053         
00054         // On récupère le fts associé (listener) au display.
00055         FormulaTreeStructure fts = (FormulaTreeStructure) displayToLay.getListener();
00056         
00057         Display displayOperator = createOperatorDisplay();
00058         
00059         // On met un listener à l'opérateur.
00060         // En fait, il n'y en a pas besoin, dans le sens où il n'y a pas spécifiquement de fts qui
00061         // écoute le comportement de ce display. Néanmoins, il s'avère nécessaire qu'il en ait
00062         // un, par exemple lors de l'iconification, car c'est le display qui reçoit la demande
00063         // d'iconification qui envoie l'événement correspondant à la FTS. Or si ce display n'a pas
00064         // d'écouteur, alors pb. Par cohérence, l'écouteur du display d'opérateur, est le fts qui
00065         // représente cette opération. Par contre, la fts en question, n'écoute pas le display
00066         // d'opérateur.
00067         displayOperator.addControlListener(fts);
00068         
00069         // On ajoute le display d'opérateur en première position
00070         //display.add(stringDisplay, stringDisplay, 0); 
00071         // A priori, display ne contient rien, donc un add(stringDisplay) suffit.
00072         this.displayToLay.add(displayOperator);
00073         
00074         this.displayToLay.computeAncestorsAttributes();
00075     }
00076     
00080     public void validateSelection() {
00081         SelectionEvent selEvt = new SelectionEvent(displayToLay);
00082 
00083         // La validité de la sélection est triviale.
00084         // Si le display de l'opérateur ou si le display de l'opérande est
00085         // sélectionné, on sélectionne tout le display.
00086         Display op = (Display) displayToLay.getComponent(0);
00087         Display opRand = (Display) displayToLay.getComponent(1);
00088         if (op.isSelected() || opRand.isSelected()) {
00089             displayToLay.select();
00090             // On purge la liste des éléments sélectionnés.
00091             selEvt.setAction(SelectionEvent.PURGE, null);
00092             displayToLay.fireSelectionEvent(selEvt);
00093             // On y ajoute l'instance dans la liste des sélectionnés
00094             selEvt.setAction(SelectionEvent.ADD, displayToLay);
00095             displayToLay.fireSelectionEvent(selEvt);
00096         }
00097         
00098         // On a vérifié la validité de la sélection de l'opérateur. On doit maitenant
00099         // la contrôler au niveau supérieur, au niveau du père.
00100         Display display = displayToLay;
00101         if (displayToLay.getParent() instanceof Display) {
00102             display = (Display) displayToLay.getParent();
00103             FormulaTreeStructure fts = (FormulaTreeStructure) display.getListener();
00104             if (fts.getFather() != null)
00105                 ((DisplayLayout) display.getLayout()).validateSelection();
00106         }
00107 
00108         // On met à jour l'affichage.
00109         display.repaint();
00110     }             
00111     
00116     public void validateDeselection(Display display) {
00117         // father est le display de l'opérateur unaire.
00118         Display father = displayToLay;
00119         Display tmp;
00120         SelectionEvent selEvt = new SelectionEvent(father);
00121         
00122         // Si l'opérateur en entier est sélectionné, il faut le désélectionner
00123         if (father.isSelected()) {
00124             father.deselect();
00125             // On enlève le display père de la liste des display sélectionnés.
00126             selEvt.setAction(SelectionEvent.REMOVE, father);
00127             father.fireSelectionEvent(selEvt);
00128             
00129             // Comme pour la sélection, on contrôle la validité de la désélection.
00130             if (father.getParent() instanceof Display) {
00131                 father = (Display) father.getParent();
00132                 FormulaTreeStructure fts = (FormulaTreeStructure) father.getListener();
00133                 if (fts.getFather() != null)
00134                     ((DisplayLayout) father.getLayout()).validateDeselection(displayToLay);
00135             }
00136             
00137             // Hé oui, on contrôle la validité de la sélection... dans une désélection.
00138             // Toujours le même pb, est-ce que le nouvel état de la sélection (après
00139             // désélection donc) est syntaxiquement cohérent ?
00140             validateSelection();
00141             
00142             // On met à jour l'affichage.
00143             father.repaint();
00144         }        
00145     }
00146     
00150     public void rebuildDisplay() {
00151         // La taille des displays est probablement différente de ceux qui étaient
00152         // précédemment. On demande alors le recalcul des display ancêtres.
00153         displayToLay.computeAncestorsAttributes();
00154     }
00155 }