1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/xul/document/src/nsXULControllers.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,256 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +/* 1.10 + 1.11 + This file provides the implementation for the XUL "controllers" 1.12 + object. 1.13 + 1.14 +*/ 1.15 + 1.16 +#include "nsString.h" 1.17 + 1.18 +#include "nsIControllers.h" 1.19 +#include "nsIDOMElement.h" 1.20 +#include "nsXULControllers.h" 1.21 +#include "nsDOMClassInfoID.h" 1.22 +#include "nsIController.h" 1.23 + 1.24 +//---------------------------------------------------------------------- 1.25 + 1.26 +nsXULControllers::nsXULControllers() 1.27 +: mCurControllerID(0) 1.28 +{ 1.29 +} 1.30 + 1.31 +nsXULControllers::~nsXULControllers(void) 1.32 +{ 1.33 + DeleteControllers(); 1.34 +} 1.35 + 1.36 +void 1.37 +nsXULControllers::DeleteControllers() 1.38 +{ 1.39 + uint32_t count = mControllers.Length(); 1.40 + for (uint32_t i = 0; i < count; i++) 1.41 + { 1.42 + nsXULControllerData* controllerData = mControllers.ElementAt(i); 1.43 + delete controllerData; // releases the nsIController 1.44 + } 1.45 + 1.46 + mControllers.Clear(); 1.47 +} 1.48 + 1.49 + 1.50 +nsresult 1.51 +NS_NewXULControllers(nsISupports* aOuter, REFNSIID aIID, void** aResult) 1.52 +{ 1.53 + NS_PRECONDITION(aOuter == nullptr, "no aggregation"); 1.54 + if (aOuter) 1.55 + return NS_ERROR_NO_AGGREGATION; 1.56 + 1.57 + nsXULControllers* controllers = new nsXULControllers(); 1.58 + if (! controllers) 1.59 + return NS_ERROR_OUT_OF_MEMORY; 1.60 + 1.61 + nsresult rv; 1.62 + NS_ADDREF(controllers); 1.63 + rv = controllers->QueryInterface(aIID, aResult); 1.64 + NS_RELEASE(controllers); 1.65 + return rv; 1.66 +} 1.67 + 1.68 +NS_IMPL_CYCLE_COLLECTION_CLASS(nsXULControllers) 1.69 + 1.70 +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsXULControllers) 1.71 + tmp->DeleteControllers(); 1.72 +NS_IMPL_CYCLE_COLLECTION_UNLINK_END 1.73 +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsXULControllers) 1.74 + { 1.75 + uint32_t i, count = tmp->mControllers.Length(); 1.76 + for (i = 0; i < count; ++i) { 1.77 + nsXULControllerData* controllerData = tmp->mControllers[i]; 1.78 + if (controllerData) { 1.79 + cb.NoteXPCOMChild(controllerData->mController); 1.80 + } 1.81 + } 1.82 + } 1.83 +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END 1.84 + 1.85 +DOMCI_DATA(XULControllers, nsXULControllers) 1.86 + 1.87 +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsXULControllers) 1.88 + NS_INTERFACE_MAP_ENTRY(nsIControllers) 1.89 + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIControllers) 1.90 + NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(XULControllers) 1.91 +NS_INTERFACE_MAP_END 1.92 + 1.93 +NS_IMPL_CYCLE_COLLECTING_ADDREF(nsXULControllers) 1.94 +NS_IMPL_CYCLE_COLLECTING_RELEASE(nsXULControllers) 1.95 + 1.96 +NS_IMETHODIMP 1.97 +nsXULControllers::GetControllerForCommand(const char *aCommand, nsIController** _retval) 1.98 +{ 1.99 + NS_ENSURE_ARG_POINTER(_retval); 1.100 + *_retval = nullptr; 1.101 + 1.102 + uint32_t count = mControllers.Length(); 1.103 + for (uint32_t i=0; i < count; i++) 1.104 + { 1.105 + nsXULControllerData* controllerData = mControllers.ElementAt(i); 1.106 + if (controllerData) 1.107 + { 1.108 + nsCOMPtr<nsIController> controller; 1.109 + controllerData->GetController(getter_AddRefs(controller)); 1.110 + if (controller) 1.111 + { 1.112 + bool supportsCommand; 1.113 + controller->SupportsCommand(aCommand, &supportsCommand); 1.114 + if (supportsCommand) { 1.115 + *_retval = controller; 1.116 + NS_ADDREF(*_retval); 1.117 + return NS_OK; 1.118 + } 1.119 + } 1.120 + } 1.121 + } 1.122 + 1.123 + return NS_OK; 1.124 +} 1.125 + 1.126 +NS_IMETHODIMP 1.127 +nsXULControllers::InsertControllerAt(uint32_t aIndex, nsIController *controller) 1.128 +{ 1.129 + nsXULControllerData* controllerData = new nsXULControllerData(++mCurControllerID, controller); 1.130 + if (!controllerData) return NS_ERROR_OUT_OF_MEMORY; 1.131 +#ifdef DEBUG 1.132 + nsXULControllerData** inserted = 1.133 +#endif 1.134 + mControllers.InsertElementAt(aIndex, controllerData); 1.135 + NS_ASSERTION(inserted != nullptr, "Insertion of controller failed"); 1.136 + return NS_OK; 1.137 +} 1.138 + 1.139 +NS_IMETHODIMP 1.140 +nsXULControllers::RemoveControllerAt(uint32_t aIndex, nsIController **_retval) 1.141 +{ 1.142 + NS_ENSURE_ARG_POINTER(_retval); 1.143 + *_retval = nullptr; 1.144 + 1.145 + nsXULControllerData* controllerData = mControllers.SafeElementAt(aIndex); 1.146 + if (!controllerData) return NS_ERROR_FAILURE; 1.147 + 1.148 + mControllers.RemoveElementAt(aIndex); 1.149 + 1.150 + controllerData->GetController(_retval); 1.151 + delete controllerData; 1.152 + 1.153 + return NS_OK; 1.154 +} 1.155 + 1.156 + 1.157 +NS_IMETHODIMP 1.158 +nsXULControllers::GetControllerAt(uint32_t aIndex, nsIController **_retval) 1.159 +{ 1.160 + NS_ENSURE_ARG_POINTER(_retval); 1.161 + *_retval = nullptr; 1.162 + 1.163 + nsXULControllerData* controllerData = mControllers.SafeElementAt(aIndex); 1.164 + if (!controllerData) return NS_ERROR_FAILURE; 1.165 + 1.166 + return controllerData->GetController(_retval); // does the addref 1.167 +} 1.168 + 1.169 +NS_IMETHODIMP 1.170 +nsXULControllers::AppendController(nsIController *controller) 1.171 +{ 1.172 + // This assigns controller IDs starting at 1 so we can use 0 to test if an ID was obtained 1.173 + nsXULControllerData* controllerData = new nsXULControllerData(++mCurControllerID, controller); 1.174 + if (!controllerData) return NS_ERROR_OUT_OF_MEMORY; 1.175 + 1.176 +#ifdef DEBUG 1.177 + nsXULControllerData** appended = 1.178 +#endif 1.179 + mControllers.AppendElement(controllerData); 1.180 + NS_ASSERTION(appended != nullptr, "Appending controller failed"); 1.181 + return NS_OK; 1.182 +} 1.183 + 1.184 +NS_IMETHODIMP 1.185 +nsXULControllers::RemoveController(nsIController *controller) 1.186 +{ 1.187 + // first get the identity pointer 1.188 + nsCOMPtr<nsISupports> controllerSup(do_QueryInterface(controller)); 1.189 + // then find it 1.190 + uint32_t count = mControllers.Length(); 1.191 + for (uint32_t i = 0; i < count; i++) 1.192 + { 1.193 + nsXULControllerData* controllerData = mControllers.ElementAt(i); 1.194 + if (controllerData) 1.195 + { 1.196 + nsCOMPtr<nsIController> thisController; 1.197 + controllerData->GetController(getter_AddRefs(thisController)); 1.198 + nsCOMPtr<nsISupports> thisControllerSup(do_QueryInterface(thisController)); // get identity 1.199 + if (thisControllerSup == controllerSup) 1.200 + { 1.201 + mControllers.RemoveElementAt(i); 1.202 + delete controllerData; 1.203 + return NS_OK; 1.204 + } 1.205 + } 1.206 + } 1.207 + return NS_ERROR_FAILURE; // right thing to return if no controller found? 1.208 +} 1.209 + 1.210 +/* unsigned long getControllerId (in nsIController controller); */ 1.211 +NS_IMETHODIMP 1.212 +nsXULControllers::GetControllerId(nsIController *controller, uint32_t *_retval) 1.213 +{ 1.214 + NS_ENSURE_ARG_POINTER(_retval); 1.215 + 1.216 + uint32_t count = mControllers.Length(); 1.217 + for (uint32_t i = 0; i < count; i++) 1.218 + { 1.219 + nsXULControllerData* controllerData = mControllers.ElementAt(i); 1.220 + if (controllerData) 1.221 + { 1.222 + nsCOMPtr<nsIController> thisController; 1.223 + controllerData->GetController(getter_AddRefs(thisController)); 1.224 + if (thisController.get() == controller) 1.225 + { 1.226 + *_retval = controllerData->GetControllerID(); 1.227 + return NS_OK; 1.228 + } 1.229 + } 1.230 + } 1.231 + return NS_ERROR_FAILURE; // none found 1.232 +} 1.233 + 1.234 +/* nsIController getControllerById (in unsigned long controllerID); */ 1.235 +NS_IMETHODIMP 1.236 +nsXULControllers::GetControllerById(uint32_t controllerID, nsIController **_retval) 1.237 +{ 1.238 + NS_ENSURE_ARG_POINTER(_retval); 1.239 + 1.240 + uint32_t count = mControllers.Length(); 1.241 + for (uint32_t i = 0; i < count; i++) 1.242 + { 1.243 + nsXULControllerData* controllerData = mControllers.ElementAt(i); 1.244 + if (controllerData && controllerData->GetControllerID() == controllerID) 1.245 + { 1.246 + return controllerData->GetController(_retval); 1.247 + } 1.248 + } 1.249 + return NS_ERROR_FAILURE; // none found 1.250 +} 1.251 + 1.252 +NS_IMETHODIMP 1.253 +nsXULControllers::GetControllerCount(uint32_t *_retval) 1.254 +{ 1.255 + NS_ENSURE_ARG_POINTER(_retval); 1.256 + *_retval = mControllers.Length(); 1.257 + return NS_OK; 1.258 +} 1.259 +