Bumping manifests a=b2g-bump
[gecko.git] / dom / xul / nsXULControllers.cpp
blob11b61d38427f159ad7406f636b39517ead6a28d3
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 /*
8 This file provides the implementation for the XUL "controllers"
9 object.
13 #include "nsString.h"
15 #include "nsIControllers.h"
16 #include "nsIDOMElement.h"
17 #include "nsXULControllers.h"
18 #include "nsDOMClassInfoID.h"
19 #include "nsIController.h"
21 //----------------------------------------------------------------------
23 nsXULControllers::nsXULControllers()
24 : mCurControllerID(0)
28 nsXULControllers::~nsXULControllers(void)
30 DeleteControllers();
33 void
34 nsXULControllers::DeleteControllers()
36 uint32_t count = mControllers.Length();
37 for (uint32_t i = 0; i < count; i++)
39 nsXULControllerData* controllerData = mControllers.ElementAt(i);
40 delete controllerData; // releases the nsIController
43 mControllers.Clear();
47 nsresult
48 NS_NewXULControllers(nsISupports* aOuter, REFNSIID aIID, void** aResult)
50 NS_PRECONDITION(aOuter == nullptr, "no aggregation");
51 if (aOuter)
52 return NS_ERROR_NO_AGGREGATION;
54 nsXULControllers* controllers = new nsXULControllers();
55 if (! controllers)
56 return NS_ERROR_OUT_OF_MEMORY;
58 nsresult rv;
59 NS_ADDREF(controllers);
60 rv = controllers->QueryInterface(aIID, aResult);
61 NS_RELEASE(controllers);
62 return rv;
65 NS_IMPL_CYCLE_COLLECTION_CLASS(nsXULControllers)
67 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXULControllers)
68 tmp->DeleteControllers();
69 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
70 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXULControllers)
72 uint32_t i, count = tmp->mControllers.Length();
73 for (i = 0; i < count; ++i) {
74 nsXULControllerData* controllerData = tmp->mControllers[i];
75 if (controllerData) {
76 cb.NoteXPCOMChild(controllerData->mController);
80 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
82 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsXULControllers)
83 NS_INTERFACE_MAP_ENTRY(nsIControllers)
84 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIControllers)
85 NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(XULControllers)
86 NS_INTERFACE_MAP_END
88 NS_IMPL_CYCLE_COLLECTING_ADDREF(nsXULControllers)
89 NS_IMPL_CYCLE_COLLECTING_RELEASE(nsXULControllers)
91 NS_IMETHODIMP
92 nsXULControllers::GetControllerForCommand(const char *aCommand, nsIController** _retval)
94 NS_ENSURE_ARG_POINTER(_retval);
95 *_retval = nullptr;
97 uint32_t count = mControllers.Length();
98 for (uint32_t i=0; i < count; i++)
100 nsXULControllerData* controllerData = mControllers.ElementAt(i);
101 if (controllerData)
103 nsCOMPtr<nsIController> controller;
104 controllerData->GetController(getter_AddRefs(controller));
105 if (controller)
107 bool supportsCommand;
108 controller->SupportsCommand(aCommand, &supportsCommand);
109 if (supportsCommand) {
110 *_retval = controller;
111 NS_ADDREF(*_retval);
112 return NS_OK;
118 return NS_OK;
121 NS_IMETHODIMP
122 nsXULControllers::InsertControllerAt(uint32_t aIndex, nsIController *controller)
124 nsXULControllerData* controllerData = new nsXULControllerData(++mCurControllerID, controller);
125 if (!controllerData) return NS_ERROR_OUT_OF_MEMORY;
126 #ifdef DEBUG
127 nsXULControllerData** inserted =
128 #endif
129 mControllers.InsertElementAt(aIndex, controllerData);
130 NS_ASSERTION(inserted != nullptr, "Insertion of controller failed");
131 return NS_OK;
134 NS_IMETHODIMP
135 nsXULControllers::RemoveControllerAt(uint32_t aIndex, nsIController **_retval)
137 NS_ENSURE_ARG_POINTER(_retval);
138 *_retval = nullptr;
140 nsXULControllerData* controllerData = mControllers.SafeElementAt(aIndex);
141 if (!controllerData) return NS_ERROR_FAILURE;
143 mControllers.RemoveElementAt(aIndex);
145 controllerData->GetController(_retval);
146 delete controllerData;
148 return NS_OK;
152 NS_IMETHODIMP
153 nsXULControllers::GetControllerAt(uint32_t aIndex, nsIController **_retval)
155 NS_ENSURE_ARG_POINTER(_retval);
156 *_retval = nullptr;
158 nsXULControllerData* controllerData = mControllers.SafeElementAt(aIndex);
159 if (!controllerData) return NS_ERROR_FAILURE;
161 return controllerData->GetController(_retval); // does the addref
164 NS_IMETHODIMP
165 nsXULControllers::AppendController(nsIController *controller)
167 // This assigns controller IDs starting at 1 so we can use 0 to test if an ID was obtained
168 nsXULControllerData* controllerData = new nsXULControllerData(++mCurControllerID, controller);
169 if (!controllerData) return NS_ERROR_OUT_OF_MEMORY;
171 #ifdef DEBUG
172 nsXULControllerData** appended =
173 #endif
174 mControllers.AppendElement(controllerData);
175 NS_ASSERTION(appended != nullptr, "Appending controller failed");
176 return NS_OK;
179 NS_IMETHODIMP
180 nsXULControllers::RemoveController(nsIController *controller)
182 // first get the identity pointer
183 nsCOMPtr<nsISupports> controllerSup(do_QueryInterface(controller));
184 // then find it
185 uint32_t count = mControllers.Length();
186 for (uint32_t i = 0; i < count; i++)
188 nsXULControllerData* controllerData = mControllers.ElementAt(i);
189 if (controllerData)
191 nsCOMPtr<nsIController> thisController;
192 controllerData->GetController(getter_AddRefs(thisController));
193 nsCOMPtr<nsISupports> thisControllerSup(do_QueryInterface(thisController)); // get identity
194 if (thisControllerSup == controllerSup)
196 mControllers.RemoveElementAt(i);
197 delete controllerData;
198 return NS_OK;
202 return NS_ERROR_FAILURE; // right thing to return if no controller found?
205 /* unsigned long getControllerId (in nsIController controller); */
206 NS_IMETHODIMP
207 nsXULControllers::GetControllerId(nsIController *controller, uint32_t *_retval)
209 NS_ENSURE_ARG_POINTER(_retval);
211 uint32_t count = mControllers.Length();
212 for (uint32_t i = 0; i < count; i++)
214 nsXULControllerData* controllerData = mControllers.ElementAt(i);
215 if (controllerData)
217 nsCOMPtr<nsIController> thisController;
218 controllerData->GetController(getter_AddRefs(thisController));
219 if (thisController.get() == controller)
221 *_retval = controllerData->GetControllerID();
222 return NS_OK;
226 return NS_ERROR_FAILURE; // none found
229 /* nsIController getControllerById (in unsigned long controllerID); */
230 NS_IMETHODIMP
231 nsXULControllers::GetControllerById(uint32_t controllerID, nsIController **_retval)
233 NS_ENSURE_ARG_POINTER(_retval);
235 uint32_t count = mControllers.Length();
236 for (uint32_t i = 0; i < count; i++)
238 nsXULControllerData* controllerData = mControllers.ElementAt(i);
239 if (controllerData && controllerData->GetControllerID() == controllerID)
241 return controllerData->GetController(_retval);
244 return NS_ERROR_FAILURE; // none found
247 NS_IMETHODIMP
248 nsXULControllers::GetControllerCount(uint32_t *_retval)
250 NS_ENSURE_ARG_POINTER(_retval);
251 *_retval = mControllers.Length();
252 return NS_OK;