1 /***
2 * Ambient - A music player for the Android platform
3 Copyright (C) 2007 Martin Vysny
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 package sk.baka.ambient.activity.main;
20
21 import java.util.ArrayList;
22 import java.util.List;
23
24 import sk.baka.ambient.ActionsEnum;
25 import sk.baka.ambient.commons.SimpleBus;
26 import android.util.Log;
27
28 /***
29 * Groups given controllers together and allows group operations over them.
30 *
31 * @author Martin Vysny
32 */
33 public final class ControllerGroup {
34 /***
35 * Creates new group controller.
36 */
37 public ControllerGroup() {
38 super();
39 }
40
41 private final List<AbstractController> controllers = new ArrayList<AbstractController>();
42 private final List<ActionsEnum> actions = new ArrayList<ActionsEnum>();
43
44 /***
45 * Registers a controller to this group.
46 *
47 * @param controller
48 * the controller to register.
49 * @param action
50 * action which triggers visibility of this controller.
51 */
52 public void add(final AbstractController controller,
53 final ActionsEnum action) {
54 controllers.add(controller);
55 actions.add(action);
56 }
57
58 /***
59 * Destroys all controllers. Exceptions are catched and logged.
60 */
61 public void destroy() {
62 for (final AbstractController c : controllers) {
63 try {
64 c.destroy();
65 } catch (Exception ex) {
66 Log.e(ControllerGroup.class.getSimpleName(),
67 "Error destroying controller: " + ex.getMessage(), ex);
68 }
69 }
70 controllers.clear();
71 actions.clear();
72 }
73
74 /***
75 * Hides all other controllers and flips the visibility of given controller.
76 *
77 * @param controller
78 * the controller to show/hide. If <code>null</code> then all
79 * controllers are hidden.
80 * @param visibility
81 * set this visibility for the controller. If <code>null</code>
82 * then the visibility is flipped.
83 */
84 public void flipVisibility(final AbstractController controller,
85 final Boolean visibility) {
86 for (final AbstractController c : controllers) {
87 if (c != controller) {
88 c.hide();
89 } else {
90 if (visibility == null) {
91 c.flipVisibility();
92 } else {
93 c.setVisibility(visibility);
94 }
95 }
96 }
97 }
98
99 /***
100 * Returns the visible controller.
101 *
102 * @return index of the visible controller or <code>-1</code> if no such
103 * controller exists.
104 */
105 public int getVisibleControllerIndex() {
106 for (int i = 0; i < controllers.size(); i++) {
107 if (controllers.get(i).isVisible())
108 return i;
109 }
110 return -1;
111 }
112
113 /***
114 * Returns the visible controller.
115 *
116 * @return index of the visible controller or <code>-1</code> if no such
117 * controller exists.
118 */
119 public AbstractController getVisibleController() {
120 for (int i = 0; i < controllers.size(); i++) {
121 final AbstractController c = controllers.get(i);
122 if (c.isVisible()) {
123 return c;
124 }
125 }
126 return null;
127 }
128
129 /***
130 * Returns action which triggers visibility of this controller.
131 *
132 * @param controller
133 * the controller, may be <code>null</code>.
134 * @return the action or <code>null</code> if no such controller exists or
135 * it has no action attached.
136 */
137 public ActionsEnum getActionForController(
138 final AbstractController controller) {
139 final int index = controllers.indexOf(controller);
140 if (index < 0) {
141 return null;
142 }
143 return actions.get(index);
144 }
145
146 /***
147 * Unregisters all controllers from given bus.
148 *
149 * @param bus
150 * the bus to unregister controllers from.
151 */
152 public void unregister(final SimpleBus bus) {
153 for (final AbstractController c : controllers) {
154 bus.removeHandler(c);
155 }
156 }
157
158 /***
159 * Registers all controllers from given bus. Invokes
160 * {@link AbstractController#update(sk.baka.ambient.commons.Interval)} on
161 * all controllers.
162 *
163 * @param bus
164 * the bus to unregister controllers from.
165 */
166 public void registerAndUpdate(final SimpleBus bus) {
167 for (final AbstractController c : controllers) {
168 bus.addHandler(c);
169 c.update(null);
170 }
171 }
172
173 /***
174 * Returns controller present at given index. Returns <code>null</code> if
175 * the index is invalid.
176 *
177 * @param index
178 * the index
179 * @return controller instance or <code>null</code>.
180 */
181 public AbstractController get(int index) {
182 return ((index < 0) || (index >= controllers.size())) ? null
183 : controllers.get(index);
184 }
185
186 /***
187 * Returns first controller with given class (or subclass of given class).
188 *
189 * @param <T>
190 * the controller type
191 * @param clazz
192 * the controller class
193 * @return non-<code>null</code> controller instance.
194 * @throws IllegalArgumentException
195 * if no such controller exists.
196 */
197 public <T extends AbstractController> T getController(final Class<T> clazz) {
198 for (final AbstractController c : controllers) {
199 if (clazz.isInstance(c)) {
200 return clazz.cast(c);
201 }
202 }
203 throw new IllegalArgumentException("No such controller: "
204 + clazz.getName());
205 }
206
207 public void zoom(boolean zoom) {
208 for (final AbstractController c : controllers) {
209 c.zoom(zoom);
210 }
211 }
212 }