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.ui.vaadin.tabsheet;
35
36 import info.magnolia.ui.vaadin.common.ComponentIterator;
37 import info.magnolia.ui.vaadin.gwt.client.tabsheet.connector.MagnoliaTabSheetState;
38 import info.magnolia.ui.vaadin.gwt.client.tabsheet.rpc.MagnoliaTabSheetClientRpc;
39 import info.magnolia.ui.vaadin.gwt.client.tabsheet.rpc.MagnoliaTabSheetServerRpc;
40 import info.magnolia.ui.vaadin.gwt.client.tabsheet.util.CollectionUtil;
41
42 import java.util.Iterator;
43 import java.util.LinkedList;
44 import java.util.List;
45
46 import com.vaadin.shared.Connector;
47 import com.vaadin.ui.AbstractComponentContainer;
48 import com.vaadin.ui.Component;
49
50
51
52
53 public class MagnoliaTabSheet extends AbstractComponentContainer {
54
55 private final List<MagnoliaTab> tabs = new LinkedList<MagnoliaTab>();
56
57 public MagnoliaTabSheet() {
58 super();
59 setImmediate(true);
60 registerRpc(new MagnoliaTabSheetServerRpc() {
61 @Override
62 public void setActiveTab(Connector tabConnector) {
63 MagnoliaTabSheet.this.setActiveTab((MagnoliaTab) tabConnector);
64 }
65
66 @Override
67 public void closeTab(Connector tabConnector) {
68 MagnoliaTabSheet.this.closeTab((MagnoliaTab) tabConnector);
69 }
70
71 @Override
72 public void setShowAll() {
73 MagnoliaTabSheet.this.showAll();
74 }
75 });
76 }
77
78 protected void showAll() {
79 Iterator<Component> it = iterator();
80 while (it.hasNext()) {
81 MagnoliaTab tabIt = (MagnoliaTab) it.next();
82 if (tabIt.getContent() != null) {
83 tabIt.getContent().setVisible(true);
84 }
85 }
86 getState().activeTab = null;
87 getState().showAllEnabled = true;
88 }
89
90 @Override
91 public void addComponent(final Component c) {
92 if (c instanceof MagnoliaTab) {
93 doAddTab((MagnoliaTab) c);
94 } else {
95 addTab("", c);
96 }
97 }
98
99 public MagnoliaTab addTab(final String caption, final Component c) {
100 final MagnoliaTab tab = new MagnoliaTab(caption, c);
101 doAddTab(tab);
102 return tab;
103 }
104
105 @Override
106 protected MagnoliaTabSheetState getState() {
107 return (MagnoliaTabSheetState) super.getState();
108 }
109
110 @Override
111 protected MagnoliaTabSheetState getState(boolean markDirty) {
112 return (MagnoliaTabSheetState) super.getState(markDirty);
113 }
114
115 public void showAllTab(boolean showAll, String label) {
116 getState().showAllEnabled = showAll;
117 getState().showAllLabel = label;
118 }
119
120 protected void closeTab(MagnoliaTab tab) {
121 if (getState().activeTab == tab) {
122 final MagnoliaTab nextTab = getNextTab(tab);
123 if (nextTab != null && nextTab != tab) {
124 setActiveTab(nextTab);
125 }
126 }
127 removeComponent(tab);
128 }
129
130 protected void doAddTab(final MagnoliaTab tab) {
131 super.addComponent(tab);
132 tabs.add(tab);
133 if (getState().activeTab == null) {
134 setActiveTab(tab);
135 } else {
136 updateTabContentVisibility();
137 }
138 }
139
140 public MagnoliaTab getActiveTab() {
141 return (MagnoliaTab) getState(false).activeTab;
142 }
143
144 public MagnoliaTab getNextTab(final MagnoliaTab tab) {
145 return CollectionUtil.getNext(tabs, tab);
146 }
147
148 @Override
149 public void removeComponent(final Component c) {
150 if (c instanceof MagnoliaTab) {
151 final MagnoliaTab tab = (MagnoliaTab) c;
152 super.removeComponent(c);
153 tabs.remove(tab);
154 markAsDirty();
155 }
156 }
157
158 public void setActiveTab(final MagnoliaTab tab) {
159 getState().activeTab = tab;
160 updateTabContentVisibility();
161 }
162
163 private void updateTabContentVisibility() {
164 Iterator<Component> it = iterator();
165 while (it.hasNext()) {
166 MagnoliaTab tabIt = (MagnoliaTab) it.next();
167 if (tabIt.getContent() != null) {
168 tabIt.getContent().setVisible(tabIt == getState().activeTab);
169 }
170 }
171 }
172
173 @Override
174 public void replaceComponent(Component oldComponent, Component newComponent) {
175 }
176
177
178 @Override
179 public int getComponentCount() {
180 return tabs.size();
181 }
182
183 @Override
184 public Iterator<Component> iterator() {
185 return new ComponentIterator<MagnoliaTab>(tabs.iterator());
186 }
187
188
189
190
191
192 public void closeTabFromServer(MagnoliaTab tab) {
193 getRpcProxy(MagnoliaTabSheetClientRpc.class).closeTab(tab);
194 }
195
196 public void setLogo(String logo, String bgcolor) {
197 getState().logo = logo;
198 getState().logoBgColor = bgcolor;
199 }
200
201 public void setName(String name) {
202 getState().name = name;
203 }
204 }