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/. */
8 This file provides the implementation for the XUL "controllers"
15 #include "nsIControllers.h"
16 #include "nsIDOMElement.h"
17 #include "nsXULControllers.h"
18 #include "nsDOMClassInfoID.h"
19 #include "nsIController.h"
21 //----------------------------------------------------------------------
23 nsXULControllers::nsXULControllers()
28 nsXULControllers::~nsXULControllers(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
48 NS_NewXULControllers(nsISupports
* aOuter
, REFNSIID aIID
, void** aResult
)
50 NS_PRECONDITION(aOuter
== nullptr, "no aggregation");
52 return NS_ERROR_NO_AGGREGATION
;
54 nsXULControllers
* controllers
= new nsXULControllers();
56 return NS_ERROR_OUT_OF_MEMORY
;
59 NS_ADDREF(controllers
);
60 rv
= controllers
->QueryInterface(aIID
, aResult
);
61 NS_RELEASE(controllers
);
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
];
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
)
88 NS_IMPL_CYCLE_COLLECTING_ADDREF(nsXULControllers
)
89 NS_IMPL_CYCLE_COLLECTING_RELEASE(nsXULControllers
)
92 nsXULControllers::GetControllerForCommand(const char *aCommand
, nsIController
** _retval
)
94 NS_ENSURE_ARG_POINTER(_retval
);
97 uint32_t count
= mControllers
.Length();
98 for (uint32_t i
=0; i
< count
; i
++)
100 nsXULControllerData
* controllerData
= mControllers
.ElementAt(i
);
103 nsCOMPtr
<nsIController
> controller
;
104 controllerData
->GetController(getter_AddRefs(controller
));
107 bool supportsCommand
;
108 controller
->SupportsCommand(aCommand
, &supportsCommand
);
109 if (supportsCommand
) {
110 *_retval
= controller
;
122 nsXULControllers::InsertControllerAt(uint32_t aIndex
, nsIController
*controller
)
124 nsXULControllerData
* controllerData
= new nsXULControllerData(++mCurControllerID
, controller
);
125 if (!controllerData
) return NS_ERROR_OUT_OF_MEMORY
;
127 nsXULControllerData
** inserted
=
129 mControllers
.InsertElementAt(aIndex
, controllerData
);
130 NS_ASSERTION(inserted
!= nullptr, "Insertion of controller failed");
135 nsXULControllers::RemoveControllerAt(uint32_t aIndex
, nsIController
**_retval
)
137 NS_ENSURE_ARG_POINTER(_retval
);
140 nsXULControllerData
* controllerData
= mControllers
.SafeElementAt(aIndex
);
141 if (!controllerData
) return NS_ERROR_FAILURE
;
143 mControllers
.RemoveElementAt(aIndex
);
145 controllerData
->GetController(_retval
);
146 delete controllerData
;
153 nsXULControllers::GetControllerAt(uint32_t aIndex
, nsIController
**_retval
)
155 NS_ENSURE_ARG_POINTER(_retval
);
158 nsXULControllerData
* controllerData
= mControllers
.SafeElementAt(aIndex
);
159 if (!controllerData
) return NS_ERROR_FAILURE
;
161 return controllerData
->GetController(_retval
); // does the addref
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
;
172 nsXULControllerData
** appended
=
174 mControllers
.AppendElement(controllerData
);
175 NS_ASSERTION(appended
!= nullptr, "Appending controller failed");
180 nsXULControllers::RemoveController(nsIController
*controller
)
182 // first get the identity pointer
183 nsCOMPtr
<nsISupports
> controllerSup(do_QueryInterface(controller
));
185 uint32_t count
= mControllers
.Length();
186 for (uint32_t i
= 0; i
< count
; i
++)
188 nsXULControllerData
* controllerData
= mControllers
.ElementAt(i
);
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
;
202 return NS_ERROR_FAILURE
; // right thing to return if no controller found?
205 /* unsigned long getControllerId (in nsIController controller); */
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
);
217 nsCOMPtr
<nsIController
> thisController
;
218 controllerData
->GetController(getter_AddRefs(thisController
));
219 if (thisController
.get() == controller
)
221 *_retval
= controllerData
->GetControllerID();
226 return NS_ERROR_FAILURE
; // none found
229 /* nsIController getControllerById (in unsigned long controllerID); */
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
248 nsXULControllers::GetControllerCount(uint32_t *_retval
)
250 NS_ENSURE_ARG_POINTER(_retval
);
251 *_retval
= mControllers
.Length();