View Javadoc

1   package fr.ove.openmath.jome.ctrlview.bidim;
2   
3   import java.awt.*;
4   import fr.ove.openmath.jome.ctrlview.bidim.Display;
5   import fr.ove.openmath.jome.ctrlview.bidim.DisplayLayout;
6   import fr.ove.openmath.jome.ctrlview.bidim.HorizontalLayout;
7   import fr.ove.openmath.jome.ctrlview.bidim.selection.events.SelectionEvent;
8   import fr.ove.openmath.jome.model.*;
9   
10  /***
11  * A layout manager that lays components horyzontally, but the last one in the
12  * list, is treated as a superscript or an underscript in the inherited classes.
13  * (There is a shift calculated)
14  *
15  * @author © 1999 DIRAT Laurent
16  * @version 2.0 19/07/1999
17  */
18  public abstract class ScriptLayout extends HorizontalLayout {
19      /***
20      * Updates the level of the display that is layed out.<BR>
21      * @param level the level put to the display
22      */
23      public void updateLevel(int level) {
24          Display tmp;
25          
26          // Pour Èviter de refaire le calcul plusieurs fois....
27          if (displayToLay.getUpdateLevel()) {
28              // On met le niveau adÈquat
29              displayToLay.setLevel(level);
30              // On scale le display en fonction du niveau
31              displayToLay.scaleDisplay();
32              // On n'a plus besoin de mettre ? jour le niveau de l'instance
33              displayToLay.setUpdateLevel(false);
34              
35              // Le premier display fils possËde le mÍme niveau que son pËre.
36              tmp = (Display) displayToLay.getComponent(0);
37              ((DisplayLayout) tmp.getLayout()).updateLevel(level);
38              
39              // Le deuxiËme display fils possËde le mÍme niveau que la base + 1.
40              // (on applique une rÈduction de taille)
41              tmp = (Display) displayToLay.getComponent(1);
42              ((DisplayLayout) tmp.getLayout()).updateLevel(level+1);
43          }
44      }
45      
46      /***
47      * Checks the validity of the selection.
48      */
49      public void validateSelection() {
50          SelectionEvent selEvt = new SelectionEvent(displayToLay);
51  
52          // La validitÈ de la sÈlection est triviale.
53          // Si un des ÈlÈments de la puissance est sÈlectionnÈ, alors la sÈlection
54          // de l'autre ÈlÈment entraÓne la sÈlection de toute la puissance.
55          Display base = (Display) displayToLay.getComponent(0);
56          Display script = (Display) displayToLay.getComponent(1);
57          if (base.gotSelectedElements() && script.gotSelectedElements()) {
58              displayToLay.select();
59              // On purge la liste des ÈlÈments sÈlectionnÈs.
60              selEvt.setAction(SelectionEvent.PURGE, null);
61              displayToLay.fireSelectionEvent(selEvt);
62              // On y ajoute notre puissance.
63              selEvt.setAction(SelectionEvent.ADD, displayToLay);
64              displayToLay.fireSelectionEvent(selEvt);
65          }
66          
67          // On a vÈrifiÈ la validitÈ de la sÈlection de la puissance. On doit maitenant
68          // la contrÙler au niveau supÈrieur, au niveau du pËre.
69          // Ex : on a l'expression A+B^C et on a A dÈj? sÈlectionnÈ. On sÈlectionne C.
70          // D'un pt de vue sÈmantique (oui, on va dire Áa comme Áa) A et C ne peuvent
71          // Ítre sÈlectionnÈs sÈparÈment. Tout doit Ítre sÈlectionnÈ. Et Áa, c'est la 
72          // validation de la sÈlection qui va le dÈterminer. oufff....
73          Display display = displayToLay;
74          if (displayToLay.getParent() instanceof Display) {
75              display = (Display) displayToLay.getParent();
76              FormulaTreeStructure fts = (FormulaTreeStructure) display.getListener();
77              if (fts.getFather() != null) // Si fts n'est pas la racine de la formule, on valide la sÈlection
78                  ((DisplayLayout) display.getLayout()).validateSelection();
79          }
80  
81          // On met ? jour l'affichage.
82          display.repaint();
83      }
84      
85      /***
86      * Checks the validity of the deselection.
87      * @param display the display to deselect.
88      */
89      public void validateDeselection(Display display) {
90          Display tmp;
91          SelectionEvent selEvt = new SelectionEvent(displayToLay);
92          
93          if (displayToLay.isSelected()) {
94              // On dÈsÈlectionne la puissance
95              displayToLay.setNotSelected();
96              // On enlËve le display pËre de la liste des display sÈlectionnÈs.
97              selEvt.setAction(SelectionEvent.REMOVE, displayToLay);
98              displayToLay.fireSelectionEvent(selEvt);
99              
100             // Si la puissance toute entiËre Ètait sÈlectionnÈe, donc prÈsente dans la liste
101             // des ÈlÈments sÈlectionnÈ. Ce n'est pas le cas de la base et de l'exposant.
102             // Donc en fonction de cela, il faut y ajouter l'ÈlÈment adÈquat
103             if (((Display) displayToLay.getComponent(0)).isSelected())
104                 // On a demandÈ la dÈsÈlection en cliquant sur l'exposant, ce qui revient
105                 // ? sÈlectionner uniquement la base.
106                 // On l'ajoute donc dans la liste des display sÈlectionnÈs.
107                 selEvt.setAction(SelectionEvent.ADD, (Display) displayToLay.getComponent(0));
108             else
109                 // On a demandÈ la dÈsÈlection en cliquant sur la base, ce qui revient
110                 // ? sÈlectionner uniquement l'exposant.
111                 // On l'ajoute donc dans la liste des display sÈlectionnÈs.
112                 selEvt.setAction(SelectionEvent.ADD, (Display) displayToLay.getComponent(1));
113 
114             displayToLay.fireSelectionEvent(selEvt);
115 
116             // Comme pour la sÈlection, on contrÙle la validitÈ de la dÈsÈlection.
117             Display father = displayToLay;
118             if (displayToLay.getParent() instanceof Display) {
119                 father = (Display) displayToLay.getParent();
120                 FormulaTreeStructure fts = (FormulaTreeStructure) father.getListener();
121                 if (fts.getFather() != null)
122                     ((DisplayLayout) father.getLayout()).validateDeselection(displayToLay);
123             }
124             // HÈ oui, on contrÙle la validitÈ de la sÈlection... dans une dÈsÈlection.
125             // Toujours le mÍme pb, est-ce que le nouvel Ètat de la sÈlection (aprËs
126             // dÈsÈlection donc) est syntaxiquement cohÈrent ?
127             validateSelection();
128             
129             // On met ? jour l'affichage.
130             father.repaint();
131         }        
132     }
133     
134     /***
135     * The display needs to be rebuilt. We do this.
136     */
137     public void rebuildDisplay() {
138         Display tmp;
139         Display base = null;
140         Display script = null;
141         // On parcourre la liste des displays pour trouver qui est qui.
142         for (int i = 0; i < 2; i++) {
143             tmp = (Display) displayToLay.getComponent(i);
144             // On fait les initialisations qui s'imposent pour le bon repositionnement de chacun.
145             tmp.setLocation(0,0);
146             if (((FormulaTreeStructure) tmp.getListener()).getRank() == 0)
147                 base = tmp;
148             else 
149                 script = tmp;
150         }
151         // On a retrouvÈ qui est qui, on reconstruit le display pour tout mettre
152         // ? la bonne position.
153         displayToLay.removeAllDisplays();
154         displayToLay.add(base);
155         displayToLay.add(script);
156         // La taille des displays est probablement diffÈrente de ceux qui Ètaient
157         // prÈcÈdemment. On demande alors le recalcul des display ancÍtres.
158         displayToLay.computeAncestorsAttributes();
159     }
160 }