1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 #include "nsIControllerCommand.h"
9 #include "nsControllerCommandTable.h"
10 #include "nsGlobalWindowCommands.h"
11 #include "mozilla/EditorController.h"
12 #include "mozilla/HTMLEditorController.h"
14 // this value is used to size the hash table. Just a sensible upper bound
15 #define NUM_COMMANDS_LENGTH 32
17 nsControllerCommandTable::nsControllerCommandTable()
18 : mCommandsTable(NUM_COMMANDS_LENGTH
), mMutable(true) {}
20 nsControllerCommandTable::~nsControllerCommandTable() = default;
22 NS_IMPL_ISUPPORTS(nsControllerCommandTable
, nsIControllerCommandTable
,
23 nsISupportsWeakReference
)
26 nsControllerCommandTable::MakeImmutable(void) {
32 nsControllerCommandTable::RegisterCommand(const char* aCommandName
,
33 nsIControllerCommand
* aCommand
) {
34 NS_ENSURE_TRUE(mMutable
, NS_ERROR_FAILURE
);
36 mCommandsTable
.InsertOrUpdate(nsDependentCString(aCommandName
), aCommand
);
42 nsControllerCommandTable::UnregisterCommand(const char* aCommandName
,
43 nsIControllerCommand
* aCommand
) {
44 NS_ENSURE_TRUE(mMutable
, NS_ERROR_FAILURE
);
46 nsDependentCString
commandKey(aCommandName
);
47 if (!mCommandsTable
.Get(commandKey
, nullptr)) {
48 return NS_ERROR_FAILURE
;
51 mCommandsTable
.Remove(commandKey
);
56 nsControllerCommandTable::FindCommandHandler(const char* aCommandName
,
57 nsIControllerCommand
** aResult
) {
58 NS_ENSURE_ARG_POINTER(aResult
);
62 nsCOMPtr
<nsIControllerCommand
> foundCommand
;
63 mCommandsTable
.Get(nsDependentCString(aCommandName
),
64 getter_AddRefs(foundCommand
));
66 return NS_ERROR_FAILURE
;
69 foundCommand
.forget(aResult
);
74 nsControllerCommandTable::IsCommandEnabled(const char* aCommandName
,
75 nsISupports
* aCommandRefCon
,
77 NS_ENSURE_ARG_POINTER(aResult
);
81 nsCOMPtr
<nsIControllerCommand
> commandHandler
;
82 FindCommandHandler(aCommandName
, getter_AddRefs(commandHandler
));
83 if (!commandHandler
) {
85 "Controller command table asked about a command that it does "
90 return commandHandler
->IsCommandEnabled(aCommandName
, aCommandRefCon
,
95 nsControllerCommandTable::UpdateCommandState(const char* aCommandName
,
96 nsISupports
* aCommandRefCon
) {
97 nsCOMPtr
<nsIControllerCommand
> commandHandler
;
98 FindCommandHandler(aCommandName
, getter_AddRefs(commandHandler
));
99 if (!commandHandler
) {
101 "Controller command table asked to update the state of a "
102 "command that it does not handle");
106 return NS_ERROR_NOT_IMPLEMENTED
;
110 nsControllerCommandTable::SupportsCommand(const char* aCommandName
,
111 nsISupports
* aCommandRefCon
,
113 NS_ENSURE_ARG_POINTER(aResult
);
115 // XXX: need to check the readonly and disabled states
119 nsCOMPtr
<nsIControllerCommand
> commandHandler
;
120 FindCommandHandler(aCommandName
, getter_AddRefs(commandHandler
));
122 *aResult
= (commandHandler
.get() != nullptr);
127 nsControllerCommandTable::DoCommand(const char* aCommandName
,
128 nsISupports
* aCommandRefCon
) {
129 nsCOMPtr
<nsIControllerCommand
> commandHandler
;
130 FindCommandHandler(aCommandName
, getter_AddRefs(commandHandler
));
131 if (!commandHandler
) {
133 "Controller command table asked to do a command that it does "
138 return commandHandler
->DoCommand(aCommandName
, aCommandRefCon
);
142 nsControllerCommandTable::DoCommandParams(const char* aCommandName
,
143 nsICommandParams
* aParams
,
144 nsISupports
* aCommandRefCon
) {
145 nsCOMPtr
<nsIControllerCommand
> commandHandler
;
146 FindCommandHandler(aCommandName
, getter_AddRefs(commandHandler
));
147 if (!commandHandler
) {
149 "Controller command table asked to do a command that it does "
153 return commandHandler
->DoCommandParams(aCommandName
, aParams
, aCommandRefCon
);
157 nsControllerCommandTable::GetCommandState(const char* aCommandName
,
158 nsICommandParams
* aParams
,
159 nsISupports
* aCommandRefCon
) {
160 nsCOMPtr
<nsIControllerCommand
> commandHandler
;
161 FindCommandHandler(aCommandName
, getter_AddRefs(commandHandler
));
162 if (!commandHandler
) {
164 "Controller command table asked to do a command that it does "
168 return commandHandler
->GetCommandStateParams(aCommandName
, aParams
,
173 nsControllerCommandTable::GetSupportedCommands(nsTArray
<nsCString
>& aCommands
) {
174 mozilla::AppendToArray(aCommands
, mCommandsTable
.Keys());
179 using CommandTableRegistrar
= nsresult (*)(nsControllerCommandTable
*);
181 static already_AddRefed
<nsControllerCommandTable
>
182 CreateCommandTableWithCommands(CommandTableRegistrar aRegistrar
) {
183 RefPtr
<nsControllerCommandTable
> commandTable
=
184 new nsControllerCommandTable();
186 nsresult rv
= aRegistrar(commandTable
);
187 if (NS_FAILED(rv
)) return nullptr;
189 // we don't know here whether we're being created as an instance,
190 // or a service, so we can't become immutable
192 return commandTable
.forget();
196 already_AddRefed
<nsControllerCommandTable
>
197 nsControllerCommandTable::CreateEditorCommandTable() {
198 return CreateCommandTableWithCommands(
199 mozilla::EditorController::RegisterEditorCommands
);
203 already_AddRefed
<nsControllerCommandTable
>
204 nsControllerCommandTable::CreateEditingCommandTable() {
205 return CreateCommandTableWithCommands(
206 mozilla::EditorController::RegisterEditingCommands
);
210 already_AddRefed
<nsControllerCommandTable
>
211 nsControllerCommandTable::CreateHTMLEditorCommandTable() {
212 return CreateCommandTableWithCommands(
213 mozilla::HTMLEditorController::RegisterHTMLEditorCommands
);
217 already_AddRefed
<nsControllerCommandTable
>
218 nsControllerCommandTable::CreateHTMLEditorDocStateCommandTable() {
219 return CreateCommandTableWithCommands(
220 mozilla::HTMLEditorController::RegisterEditorDocStateCommands
);
224 already_AddRefed
<nsControllerCommandTable
>
225 nsControllerCommandTable::CreateWindowCommandTable() {
226 return CreateCommandTableWithCommands(
227 nsWindowCommandRegistration::RegisterWindowCommands
);