Back to index

wims  3.65+svn20090927
SlotLayout.java
Go to the documentation of this file.
00001 /*
00002 $Id: SlotLayout.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.DisplayLayout;
00033 import fr.ove.openmath.jome.ctrlview.bidim.Display;
00034 import fr.ove.openmath.jome.ctrlview.bidim.selection.events.SelectionEvent;
00035 import fr.ove.openmath.jome.model.*;
00036 
00043 public class SlotLayout extends DisplayLayout {
00049     public Dimension computeAttributes() {
00050         updateLevel(displayToLay.getLevel());
00051         
00052         Display display = (Display) displayToLay.getComponent(0);
00053         display.setSize(display.getPreferredSize());
00054         int width = display.getShiftX() + display.getWidth();
00055         int height = display.getShiftY() + display.getHeight();
00056 
00057         displayToLay.setAscent(display.getShiftY() + display.getAscent());
00058         displayToLay.setDescent(height - display.getAscent());
00059         
00060         displayToLay.setSize(width , height);
00061         displayToLay.setComputeAttributes(false);
00062         
00063         return new Dimension(width , height);
00064     }
00065     
00069     public void validateSelection() {
00070         Display childDisplay = (Display) displayToLay.getComponent(0);
00071         if (childDisplay.isSelected()) {
00072             displayToLay.setSelected();
00073             SelectionEvent selEvt = new SelectionEvent(displayToLay);
00074             // On purge la liste des éléments sélectionnés.
00075             selEvt.setAction(SelectionEvent.PURGE, null);
00076             displayToLay.fireSelectionEvent(selEvt);
00077             // On y ajoute notre puissance.
00078             selEvt.setAction(SelectionEvent.ADD, displayToLay);
00079             displayToLay.fireSelectionEvent(selEvt);
00080         }
00081         
00082         // Puisque le slot n'est juste qu'un display ne possédant aucune propriété particulière,
00083         // sa sélection est automatiquement valide, on regarde au niveau de son père.
00084         Display display = displayToLay;
00085         if (display.getParent() instanceof Display) {
00086             display = (Display) display.getParent();
00087             FormulaTreeStructure fts = (FormulaTreeStructure) display.getListener();
00088             if (fts.getFather() != null) // Si fts est la racine de la formule alors la sélection à déjà été validée
00089                 ((DisplayLayout) display.getLayout()).validateSelection();
00090         }
00091 
00092         // On met à jour l'affichage.
00093         display.repaint();
00094     }
00095     
00100     public void validateDeselection(Display display) {
00101         Display father = displayToLay;
00102         SelectionEvent selEvt = new SelectionEvent(father);
00103         
00104         if (father.isSelected()) {
00105             father.setNotSelected();
00106             // On enlève le display père de la liste des display sélectionnés.
00107             selEvt.setAction(SelectionEvent.REMOVE, father);
00108             father.fireSelectionEvent(selEvt);
00109         
00110             // Comme pour la sélection, on contrôle la validité de la désélection.
00111             if (father.getParent() instanceof Display) {
00112                 father = (Display) father.getParent();
00113                 //if (!(display.getListener() instanceof Formula))
00114                 FormulaTreeStructure fts = (FormulaTreeStructure) display.getListener();
00115                 if (fts.getFather() != null) // Si fts est la racine de la formule alors la désélection à déjà été validée
00116                     ((DisplayLayout) father.getLayout()).validateDeselection(displayToLay);
00117             }
00118             
00119             // Hé oui, on contrôle la validité de la sélection... dans une désélection.
00120             // Toujours le même pb, est-ce que le nouvel état de la sélection (après
00121             // désélection donc) est syntaxiquement cohérent ?
00122             validateSelection();
00123             
00124             // On met à jour l'affichage.
00125             father.repaint();
00126         }
00127     }
00128 
00132     public void rebuildDisplay() {
00133         // La taille des displays est probablement différente de ceux qui étaient
00134         // précédemment. On demande alors le recalcul des display ancêtres.
00135         displayToLay.computeAncestorsAttributes();
00136     }
00137    
00138     // #################################################
00139     // ### Implémentation des différentes interfaces ###
00140     // #################################################
00141 
00142     // ***************************************************
00143     // *** Implémentation de l'interface LayoutManager ***
00144 
00145 
00146     /*
00147      * Lays out the container in the specified panel.
00148      * @param parent the component which needs to be laid out
00149      */
00150      public void layoutContainer(Container parent) {
00151         // Ca c'est parce que c'est le layout manager de la formule. Et comme personne ne dit au container
00152         // contenant la formule, que la taille de la formule a besoin d'être recalculée, il faut bien le
00153         // faire qque part. Chaque display informe son père qu'il doit être recalculé, mais la formule ne
00154         // le fait pas pour le sien.
00155         parent.setSize(parent.getPreferredSize());
00156 
00157         Display display = (Display) parent.getComponent(0);
00158         display.setSize(display.getPreferredSize());
00159         display.setLocation(display.getShiftX(), display.getShiftY());
00160 
00161         // On place maintenant les éventuels display enfants du display courant
00162         display.doLayout();
00163     }
00164 
00165     // *** Fin de l'interface LayoutManager ***
00166     // ****************************************
00167 }