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 }