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 handleClick(Element element) {
58
59 }
60
61 @Override
62 public void handleClick (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 reset() {
75 deSelect();
76 showRoot();
77 computeOverlay();
78 }
79
80 protected void select(MgnlElement mgnlElement) {
81
82 if (mgnlElement != null) {
83
84 if (storage.getOverlay(mgnlElement) != null) {
85 storage.getOverlay(mgnlElement).setVisible(false);
86 }
87 if (mgnlElement != null) {
88 if (storage.getEditBar(mgnlElement) != null) {
89 storage.getEditBar(mgnlElement).setVisible(true);
90 }
91 }
92
93 for (MgnlElement component : mgnlElement.getComponents()) {
94 if (storage.getOverlay(component) != null) {
95 storage.getOverlay(component).setVisible(false);
96 }
97 if (storage.getEditBar(component) != null) {
98 storage.getEditBar(component).setVisible(true);
99 }
100
101 }
102 for (MgnlElement parentArea = mgnlElement.getParentArea(); parentArea != null; parentArea= parentArea.getParentArea()) {
103 if (storage.getOverlay(parentArea) != null) {
104 storage.getOverlay(parentArea).setVisible(false);
105
106 }
107 }
108 computeOverlay();
109 }
110 }
111
112 public void deSelect() {
113 if (storage.getSelectedMgnlElement() != null) {
114 deSelect(storage.getSelectedMgnlElement());
115 }
116 }
117
118 public void deSelect(MgnlElement mgnlElement) {
119 mgnlElement = mgnlElement.getRoot();
120 if (mgnlElement != null) {
121
122 if (storage.getOverlay(mgnlElement) != null) {
123 storage.getOverlay(mgnlElement).setVisible(true);
124
125 }
126 for (MgnlElement descendant : mgnlElement.getDescendants()) {
127 if (storage.getOverlay(descendant) != null) {
128 storage.getOverlay(descendant).setVisible(true);
129
130 }
131 if (storage.getEditBar(descendant) != null) {
132 if (!descendant.getParent().equals(mgnlElement)) {
133 storage.getEditBar(descendant).setVisible(false);
134 }
135
136 }
137
138 }
139 computeOverlay();
140
141 }
142 }
143
144 public void showRoot() {
145 for (MgnlElement root : storage.getRootElements()) {
146 if (storage.getEditBar(root) != null) {
147 storage.getEditBar(root).setVisible(true);
148
149 }
150 }
151 }
152 public void hideRoot() {
153 for (MgnlElement root : storage.getRootElements()) {
154 if (root != null && storage.getEditBar(root) != null) {
155 storage.getEditBar(root).setVisible(false);
156
157 }
158 }
159 }
160
161 public void computeOverlay () {
162 for (MgnlElement root : storage.getRootElements()) {
163 List<MgnlElement> mgnlElements = root.getDescendants();
164 mgnlElements.add(root);
165 for (MgnlElement mgnlElement : mgnlElements) {
166
167 if (storage.getOverlay(mgnlElement) == null) {
168 continue;
169 }
170
171 Element firstElement = mgnlElement.getFirstElement();
172 if (firstElement == null) {
173 continue;
174 }
175 storage.getOverlay(mgnlElement).getElement().getStyle().setTop(firstElement.getAbsoluteTop(), Unit.PX);
176 storage.getOverlay(mgnlElement).getElement().getStyle().setLeft(firstElement.getAbsoluteLeft(), Unit.PX);
177 storage.getOverlay(mgnlElement).getElement().getStyle().setWidth(firstElement.getAbsoluteRight() - firstElement.getAbsoluteLeft(), Unit.PX);
178
179 Element lastElement = mgnlElement.getLastElement();
180 if (lastElement != null) {
181 storage.getOverlay(mgnlElement).getElement().getStyle().setHeight(lastElement.getAbsoluteBottom() - storage.getOverlay(mgnlElement).getElement().getAbsoluteTop(), Unit.PX);
182 }
183 }
184 }
185 }
186 }