1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.templating.editor.client.model.focus;
35
36 import info.magnolia.templating.editor.client.dom.MgnlElement;
37 import info.magnolia.templating.editor.client.model.ModelStorage;
38
39 import java.util.List;
40
41 import com.google.gwt.dom.client.Element;
42 import com.google.gwt.dom.client.Style.Unit;
43
44
45
46
47 public class FocusModelImpl implements FocusModel {
48
49 private ModelStorage storage;
50
51 public FocusModelImpl(ModelStorage storage) {
52 super();
53 this.storage = storage;
54 }
55
56 @Override
57 public void onMouseUp(Element element) {
58
59 }
60
61 @Override
62 public void onMouseUp(MgnlElement mgnlElement) {
63
64 hideRoot();
65 if (storage.getSelectedMgnlElement() != null) {
66 deSelect(storage.getSelectedMgnlElement());
67 }
68 select(mgnlElement);
69
70 storage.setSelectedMgnlElement(mgnlElement);
71 }
72
73 @Override
74 public void onMouseDown(Element element) {
75
76
77 }
78
79 @Override
80 public void reset() {
81 deSelect();
82 showRoot();
83 computeOverlay();
84 }
85
86 protected void select(MgnlElement mgnlElement) {
87
88 if (mgnlElement != null) {
89
90 if (storage.getOverlay(mgnlElement) != null) {
91 storage.getOverlay(mgnlElement).setVisible(false);
92 }
93 if (storage.getEditBar(mgnlElement) != null) {
94 storage.getEditBar(mgnlElement).setVisible(true);
95 }
96
97 for (MgnlElement component : mgnlElement.getComponents()) {
98 if (storage.getOverlay(component) != null) {
99 storage.getOverlay(component).setVisible(false);
100 }
101 if (storage.getEditBar(component) != null) {
102 storage.getEditBar(component).setVisible(true);
103 }
104
105 }
106 for (MgnlElement parentArea = mgnlElement.getParentArea(); parentArea != null; parentArea= parentArea.getParentArea()) {
107 if (storage.getOverlay(parentArea) != null) {
108 storage.getOverlay(parentArea).setVisible(false);
109
110 }
111 }
112 computeOverlay();
113 }
114 }
115
116 public void deSelect() {
117 if (storage.getSelectedMgnlElement() != null) {
118 deSelect(storage.getSelectedMgnlElement());
119 }
120 }
121
122 public void deSelect(MgnlElement mgnlElement) {
123 mgnlElement = mgnlElement.getRoot();
124 if (mgnlElement != null) {
125
126 if (storage.getOverlay(mgnlElement) != null) {
127 storage.getOverlay(mgnlElement).setVisible(true);
128
129 }
130 for (MgnlElement descendant : mgnlElement.getDescendants()) {
131 if (storage.getOverlay(descendant) != null) {
132 storage.getOverlay(descendant).setVisible(true);
133
134 }
135 if (storage.getEditBar(descendant) != null) {
136 if (!descendant.getParent().equals(mgnlElement)) {
137 storage.getEditBar(descendant).setVisible(false);
138 }
139
140 }
141
142 }
143 computeOverlay();
144
145 }
146 }
147
148 public void showRoot() {
149 for (MgnlElement root : storage.getRootElements()) {
150 if (storage.getEditBar(root) != null) {
151 storage.getEditBar(root).setVisible(true);
152
153 }
154 }
155 }
156 public void hideRoot() {
157 for (MgnlElement root : storage.getRootElements()) {
158 if (root != null && storage.getEditBar(root) != null) {
159 storage.getEditBar(root).setVisible(false);
160
161 }
162 }
163 }
164
165 public void computeOverlay () {
166 for (MgnlElement root : storage.getRootElements()) {
167 List<MgnlElement> mgnlElements = root.getDescendants();
168 mgnlElements.add(root);
169 for (MgnlElement mgnlElement : mgnlElements) {
170
171 if (storage.getOverlay(mgnlElement) == null) {
172 continue;
173 }
174
175 Element firstElement = mgnlElement.getFirstElement();
176 if (firstElement == null) {
177 continue;
178 }
179 storage.getOverlay(mgnlElement).getElement().getStyle().setTop(firstElement.getAbsoluteTop(), Unit.PX);
180 storage.getOverlay(mgnlElement).getElement().getStyle().setLeft(firstElement.getAbsoluteLeft(), Unit.PX);
181 storage.getOverlay(mgnlElement).getElement().getStyle().setWidth(firstElement.getAbsoluteRight() - firstElement.getAbsoluteLeft(), Unit.PX);
182
183 Element lastElement = mgnlElement.getLastElement();
184 if (lastElement != null) {
185 storage.getOverlay(mgnlElement).getElement().getStyle().setHeight(lastElement.getAbsoluteBottom() - storage.getOverlay(mgnlElement).getElement().getAbsoluteTop(), Unit.PX);
186 }
187 }
188 }
189 }
190
191 }