123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #include "nsString.h"
- #include "nsReadableUtils.h"
- #include "nsTArray.h"
- #include "nsISimpleEnumerator.h"
- #include "nsXPCOM.h"
- #include "nsSupportsPrimitives.h"
- #include "nsIComponentManager.h"
- #include "nsCommandGroup.h"
- #include "nsIControllerCommand.h"
- #include "nsCRT.h"
- class nsGroupsEnumerator : public nsISimpleEnumerator
- {
- public:
- explicit nsGroupsEnumerator(
- nsControllerCommandGroup::GroupsHashtable& aInHashTable);
- NS_DECL_ISUPPORTS
- NS_DECL_NSISIMPLEENUMERATOR
- protected:
- virtual ~nsGroupsEnumerator();
- nsresult Initialize();
- protected:
- nsControllerCommandGroup::GroupsHashtable& mHashTable;
- int32_t mIndex;
- const char** mGroupNames; // array of pointers to char16_t* in the hash table
- bool mInitted;
- };
- /* Implementation file */
- NS_IMPL_ISUPPORTS(nsGroupsEnumerator, nsISimpleEnumerator)
- nsGroupsEnumerator::nsGroupsEnumerator(
- nsControllerCommandGroup::GroupsHashtable& aInHashTable)
- : mHashTable(aInHashTable)
- , mIndex(-1)
- , mGroupNames(nullptr)
- , mInitted(false)
- {
- }
- nsGroupsEnumerator::~nsGroupsEnumerator()
- {
- delete[] mGroupNames;
- }
- NS_IMETHODIMP
- nsGroupsEnumerator::HasMoreElements(bool* aResult)
- {
- nsresult rv = NS_OK;
- NS_ENSURE_ARG_POINTER(aResult);
- if (!mInitted) {
- rv = Initialize();
- if (NS_FAILED(rv)) {
- return rv;
- }
- }
- *aResult = (mIndex < static_cast<int32_t>(mHashTable.Count()) - 1);
- return NS_OK;
- }
- NS_IMETHODIMP
- nsGroupsEnumerator::GetNext(nsISupports** aResult)
- {
- nsresult rv = NS_OK;
- NS_ENSURE_ARG_POINTER(aResult);
- if (!mInitted) {
- rv = Initialize();
- if (NS_FAILED(rv)) {
- return rv;
- }
- }
- mIndex++;
- if (mIndex >= static_cast<int32_t>(mHashTable.Count())) {
- return NS_ERROR_FAILURE;
- }
- const char* thisGroupName = mGroupNames[mIndex];
- nsCOMPtr<nsISupportsCString> supportsString =
- do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID, &rv);
- if (NS_FAILED(rv)) {
- return rv;
- }
- supportsString->SetData(nsDependentCString(thisGroupName));
- return CallQueryInterface(supportsString, aResult);
- }
- nsresult
- nsGroupsEnumerator::Initialize()
- {
- if (mInitted) {
- return NS_OK;
- }
- mGroupNames = new const char*[mHashTable.Count()];
- if (!mGroupNames) {
- return NS_ERROR_OUT_OF_MEMORY;
- }
- mIndex = 0;
- for (auto iter = mHashTable.Iter(); !iter.Done(); iter.Next()) {
- mGroupNames[mIndex] = iter.Key().Data();
- mIndex++;
- }
- mIndex = -1;
- mInitted = true;
- return NS_OK;
- }
- class nsNamedGroupEnumerator : public nsISimpleEnumerator
- {
- public:
- explicit nsNamedGroupEnumerator(nsTArray<nsCString>* aInArray);
- NS_DECL_ISUPPORTS
- NS_DECL_NSISIMPLEENUMERATOR
- protected:
- virtual ~nsNamedGroupEnumerator();
- nsTArray<nsCString>* mGroupArray;
- int32_t mIndex;
- };
- nsNamedGroupEnumerator::nsNamedGroupEnumerator(nsTArray<nsCString>* aInArray)
- : mGroupArray(aInArray)
- , mIndex(-1)
- {
- }
- nsNamedGroupEnumerator::~nsNamedGroupEnumerator()
- {
- }
- NS_IMPL_ISUPPORTS(nsNamedGroupEnumerator, nsISimpleEnumerator)
- NS_IMETHODIMP
- nsNamedGroupEnumerator::HasMoreElements(bool* aResult)
- {
- NS_ENSURE_ARG_POINTER(aResult);
- int32_t arrayLen = mGroupArray ? mGroupArray->Length() : 0;
- *aResult = (mIndex < arrayLen - 1);
- return NS_OK;
- }
- NS_IMETHODIMP
- nsNamedGroupEnumerator::GetNext(nsISupports** aResult)
- {
- NS_ENSURE_ARG_POINTER(aResult);
- if (!mGroupArray) {
- return NS_ERROR_FAILURE;
- }
- mIndex++;
- if (mIndex >= int32_t(mGroupArray->Length())) {
- return NS_ERROR_FAILURE;
- }
- const nsCString& thisGroupName = mGroupArray->ElementAt(mIndex);
- nsresult rv;
- nsCOMPtr<nsISupportsCString> supportsString =
- do_CreateInstance(NS_SUPPORTS_CSTRING_CONTRACTID, &rv);
- if (NS_FAILED(rv)) {
- return rv;
- }
- supportsString->SetData(thisGroupName);
- return CallQueryInterface(supportsString, aResult);
- }
- NS_IMPL_ISUPPORTS(nsControllerCommandGroup, nsIControllerCommandGroup)
- nsControllerCommandGroup::nsControllerCommandGroup()
- {
- }
- nsControllerCommandGroup::~nsControllerCommandGroup()
- {
- ClearGroupsHash();
- }
- void
- nsControllerCommandGroup::ClearGroupsHash()
- {
- mGroupsHash.Clear();
- }
- NS_IMETHODIMP
- nsControllerCommandGroup::AddCommandToGroup(const char* aCommand,
- const char* aGroup)
- {
- nsDependentCString groupKey(aGroup);
- nsTArray<nsCString>* commandList = mGroupsHash.Get(groupKey);
- if (!commandList) {
- // make this list
- commandList = new AutoTArray<nsCString, 8>;
- mGroupsHash.Put(groupKey, commandList);
- }
- #ifdef DEBUG
- nsCString* appended =
- #endif
- commandList->AppendElement(aCommand);
- NS_ASSERTION(appended, "Append failed");
- return NS_OK;
- }
- NS_IMETHODIMP
- nsControllerCommandGroup::RemoveCommandFromGroup(const char* aCommand,
- const char* aGroup)
- {
- nsDependentCString groupKey(aGroup);
- nsTArray<nsCString>* commandList = mGroupsHash.Get(groupKey);
- if (!commandList) {
- return NS_OK; // no group
- }
- uint32_t numEntries = commandList->Length();
- for (uint32_t i = 0; i < numEntries; i++) {
- nsCString commandString = commandList->ElementAt(i);
- if (nsDependentCString(aCommand) != commandString) {
- commandList->RemoveElementAt(i);
- break;
- }
- }
- return NS_OK;
- }
- NS_IMETHODIMP
- nsControllerCommandGroup::IsCommandInGroup(const char* aCommand,
- const char* aGroup, bool* aResult)
- {
- NS_ENSURE_ARG_POINTER(aResult);
- *aResult = false;
- nsDependentCString groupKey(aGroup);
- nsTArray<nsCString>* commandList = mGroupsHash.Get(groupKey);
- if (!commandList) {
- return NS_OK; // no group
- }
- uint32_t numEntries = commandList->Length();
- for (uint32_t i = 0; i < numEntries; i++) {
- nsCString commandString = commandList->ElementAt(i);
- if (nsDependentCString(aCommand) != commandString) {
- *aResult = true;
- break;
- }
- }
- return NS_OK;
- }
- NS_IMETHODIMP
- nsControllerCommandGroup::GetGroupsEnumerator(nsISimpleEnumerator** aResult)
- {
- RefPtr<nsGroupsEnumerator> groupsEnum = new nsGroupsEnumerator(mGroupsHash);
- groupsEnum.forget(aResult);
- return NS_OK;
- }
- NS_IMETHODIMP
- nsControllerCommandGroup::GetEnumeratorForGroup(const char* aGroup,
- nsISimpleEnumerator** aResult)
- {
- nsDependentCString groupKey(aGroup);
- nsTArray<nsCString>* commandList = mGroupsHash.Get(groupKey); // may be null
- RefPtr<nsNamedGroupEnumerator> theGroupEnum =
- new nsNamedGroupEnumerator(commandList);
- theGroupEnum.forget(aResult);
- return NS_OK;
- }
|