Back to index

wims  3.65+svn20090927
VarDiffLayout.java
Go to the documentation of this file.
00001 /*
00002 $Id: VarDiffLayout.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 
00046 public class VarDiffLayout extends HorizontalLayout {
00050     private boolean isPartial;
00051     
00056     public VarDiffLayout(boolean isPartial) {
00057         this.isPartial = isPartial;
00058     }
00059     
00068     public void initDisplay(Display displayToLay) {
00069         super.initDisplay(displayToLay);
00070 
00071         FormulaTreeStructure fts = (FormulaTreeStructure) this.displayToLay.getListener();
00072         
00073         Display d;
00074         // Si dériveé partielle, on ajoute un SymbolDisplay avec un delta. Sinon, un StringDisplay avec un "d"
00075         if (isPartial) {
00076             d = new SymbolDisplay(this.displayToLay.getGraphicContext(), new ImageSymbol("delta", this.displayToLay));
00077             // Le display est le display d'un opérateur (on peut le considérer comme tel)
00078             d.setIsSymbolOperatorDisplay(true);
00079         }
00080         else {
00081             d = new StringDisplay(this.displayToLay.getGraphicContext(), "d", true);
00082         }
00083         
00084         this.displayToLay.add(d, d, 0);
00085         
00086         // On met un listener au display du d/delta
00087         // En fait, il n'y en a pas besoin, dans le sens où il n'y a pas spécifiquement de fts qui
00088         // écoute le comportement de ce display. Néanmoins, il s'avère nécessaire qu'il en ait
00089         // un, par exemple lors de l'iconification, car c'est le display qui reçoit la demande
00090         // d'iconification qui envoie l'événement correspondant à la FTS. Or si ce display n'a pas
00091         // d'écouteur, alors pb. Par cohérence, l'écouteur du display d'opérateur, est le fts qui
00092         // représente cette opération. Par contre, la fts en question, n'écoute pas le display
00093         // d'opérateur.
00094         d.addControlListener(fts);
00095     }
00096     
00100     public void validateSelection() {
00101         SelectionEvent selEvt = new SelectionEvent(displayToLay);
00102 
00103         // La validité de la sélection est triviale.
00104         // Si un des displays est sélectionné alors on sélectionne tout.
00105         Display d = (Display) displayToLay.getComponent(0);
00106         Display v = (Display) displayToLay.getComponent(1);
00107         if (d.isSelected() || v.isSelected()) {
00108             // Sélectionne le display.
00109             displayToLay.select();
00110             // On purge la liste des éléments sélectionnés.
00111             selEvt.setAction(SelectionEvent.PURGE, null);
00112             displayToLay.fireSelectionEvent(selEvt);
00113             // On y ajoute os parenthèses
00114             selEvt.setAction(SelectionEvent.ADD, displayToLay);
00115             displayToLay.fireSelectionEvent(selEvt);
00116         }
00117 
00118         // On a vérifié la validité de la sélection de la puissance. On doit maitenant
00119         // la contrôler au niveau supérieur, au niveau du père.
00120         Display display = displayToLay;
00121         if (display.getParent() instanceof Display) {
00122             display = (Display) display.getParent();
00123             //if (!(display.getListener() instanceof Formula))
00124             FormulaTreeStructure fts = (FormulaTreeStructure) display.getListener();
00125             if (fts.getFather() != null)
00126                 ((DisplayLayout) display.getLayout()).validateSelection();
00127         }
00128 
00129         // On met à jour l'affichage.
00130         display.repaint();
00131     }
00132     
00137     public void validateDeselection(Display display) {
00138         Display father = displayToLay;
00139         Display tmp;
00140         SelectionEvent selEvt = new SelectionEvent(father);
00141         
00142         // En fait, comme quand "d/delta" ou la variable (puissance ou pas) est sélectionné on sélectionne tout,
00143         // quand on désélectionne l'un ou l'autre, on désélectionne tout.
00144         if (father.isSelected()) {
00145             father.deselect();
00146             // On enlève le display père de la liste des display sélectionnés.
00147             selEvt.setAction(SelectionEvent.REMOVE, father);
00148             father.fireSelectionEvent(selEvt);            
00149             
00150             // Comme pour la sélection, on contrôle la validité de la désélection.
00151             if (father.getParent() instanceof Display) {
00152                 father = (Display) father.getParent();
00153                 //if (!(display.getListener() instanceof Formula))
00154                 FormulaTreeStructure fts = (FormulaTreeStructure) father.getListener();
00155                 if (fts.getFather() != null)
00156                     ((DisplayLayout) father.getLayout()).validateDeselection(displayToLay);
00157             }
00158             
00159             // Hé oui, on contrôle la validité de la sélection... dans une désélection.
00160             // Toujours le même pb, est-ce que le nouvel état de la sélection (après
00161             // désélection donc) est syntaxiquement cohérent ?
00162             validateSelection();
00163             
00164             // On met à jour l'affichage.
00165             father.repaint();
00166         }        
00167     }
00168         
00172     public void rebuildDisplay() {
00173         // La taille des displays est probablement différente de ceux qui étaient
00174         // précédemment. On demande alors le recalcul des display ancêtres.
00175         displayToLay.computeAncestorsAttributes();
00176     }
00177 
00178 }