diff options
Diffstat (limited to 'toolkit/components/autocomplete/nsAutoCompleteController.h')
-rw-r--r-- | toolkit/components/autocomplete/nsAutoCompleteController.h | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/toolkit/components/autocomplete/nsAutoCompleteController.h b/toolkit/components/autocomplete/nsAutoCompleteController.h new file mode 100644 index 000000000..62aa980f6 --- /dev/null +++ b/toolkit/components/autocomplete/nsAutoCompleteController.h @@ -0,0 +1,176 @@ +/* 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/. */ + +#ifndef __nsAutoCompleteController__ +#define __nsAutoCompleteController__ + +#include "nsIAutoCompleteController.h" + +#include "nsCOMPtr.h" +#include "nsIAutoCompleteInput.h" +#include "nsIAutoCompletePopup.h" +#include "nsIAutoCompleteResult.h" +#include "nsIAutoCompleteSearch.h" +#include "nsString.h" +#include "nsITreeView.h" +#include "nsITreeSelection.h" +#include "nsITimer.h" +#include "nsTArray.h" +#include "nsCOMArray.h" +#include "nsCycleCollectionParticipant.h" + +class nsAutoCompleteController final : public nsIAutoCompleteController, + public nsIAutoCompleteObserver, + public nsITimerCallback, + public nsITreeView +{ +public: + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsAutoCompleteController, + nsIAutoCompleteController) + NS_DECL_NSIAUTOCOMPLETECONTROLLER + NS_DECL_NSIAUTOCOMPLETEOBSERVER + NS_DECL_NSITREEVIEW + NS_DECL_NSITIMERCALLBACK + + nsAutoCompleteController(); + +protected: + virtual ~nsAutoCompleteController(); + + nsresult OpenPopup(); + nsresult ClosePopup(); + + nsresult StartSearch(uint16_t aSearchType); + + nsresult BeforeSearches(); + nsresult StartSearches(); + void AfterSearches(); + nsresult ClearSearchTimer(); + void MaybeCompletePlaceholder(); + + void HandleSearchResult(nsIAutoCompleteSearch *aSearch, + nsIAutoCompleteResult *aResult); + nsresult ProcessResult(int32_t aSearchIndex, nsIAutoCompleteResult *aResult); + nsresult PostSearchCleanup(); + + nsresult EnterMatch(bool aIsPopupSelection, + nsIDOMEvent *aEvent); + nsresult RevertTextValue(); + + nsresult CompleteDefaultIndex(int32_t aResultIndex); + nsresult CompleteValue(nsString &aValue); + + nsresult GetResultAt(int32_t aIndex, nsIAutoCompleteResult** aResult, + int32_t* aRowIndex); + nsresult GetResultValueAt(int32_t aIndex, bool aGetFinalValue, + nsAString & _retval); + nsresult GetResultLabelAt(int32_t aIndex, nsAString & _retval); +private: + nsresult GetResultValueLabelAt(int32_t aIndex, bool aGetFinalValue, + bool aGetValue, nsAString & _retval); +protected: + + /** + * Gets and validates the defaultComplete result and the relative + * defaultIndex value. + * + * @param aResultIndex + * Index of the defaultComplete result to be used. Pass -1 to search + * for the first result providing a valid defaultIndex. + * @param _result + * The found result. + * @param _defaultIndex + * The defaultIndex relative to _result. + */ + nsresult GetDefaultCompleteResult(int32_t aResultIndex, + nsIAutoCompleteResult** _result, + int32_t* _defaultIndex); + + /** + * Gets the defaultComplete value to be suggested to the user. + * + * @param aResultIndex + * Index of the defaultComplete result to be used. + * @param aPreserveCasing + * Whether user casing should be preserved. + * @param _retval + * The value to be completed. + */ + nsresult GetDefaultCompleteValue(int32_t aResultIndex, bool aPreserveCasing, + nsAString &_retval); + + /** + * Gets the defaultComplete value to be used when the user confirms the + * current match. + * The value is returned only if it case-insensitively matches the current + * input text, otherwise the method returns NS_ERROR_FAILURE. + * This happens because we don't want to replace text if the user backspaces + * just before Enter. + * + * @param _retval + * The value to be completed. + */ + nsresult GetFinalDefaultCompleteValue(nsAString &_retval); + + nsresult ClearResults(); + + nsresult RowIndexToSearch(int32_t aRowIndex, + int32_t *aSearchIndex, int32_t *aItemIndex); + + // members ////////////////////////////////////////// + + nsCOMPtr<nsIAutoCompleteInput> mInput; + + nsCOMArray<nsIAutoCompleteSearch> mSearches; + // This is used as a sparse array, always use SafeObjectAt to access it. + nsCOMArray<nsIAutoCompleteResult> mResults; + // Temporarily keeps the results alive while invoking startSearch() for each + // search. This is needed to allow the searches to reuse the previous result, + // since otherwise the first search clears mResults. + nsCOMArray<nsIAutoCompleteResult> mResultCache; + + nsCOMPtr<nsITimer> mTimer; + nsCOMPtr<nsITreeSelection> mSelection; + nsCOMPtr<nsITreeBoxObject> mTree; + + nsString mSearchString; + nsString mPlaceholderCompletionString; + bool mDefaultIndexCompleted; + bool mPopupClosedByCompositionStart; + + // Whether autofill is allowed for the next search. May be retrieved by the + // search through the "prohibit-autofill" searchParam. + bool mProhibitAutoFill; + + // Indicates whether the user cleared the autofilled part, returning to the + // originally entered search string. + bool mUserClearedAutoFill; + + // Indicates whether clearing the autofilled string should issue a new search. + bool mClearingAutoFillSearchesAgain; + + enum CompositionState { + eCompositionState_None, + eCompositionState_Composing, + eCompositionState_Committing + }; + CompositionState mCompositionState; + uint16_t mSearchStatus; + uint32_t mRowCount; + uint32_t mSearchesOngoing; + uint32_t mSearchesFailed; + bool mFirstSearchResult; + uint32_t mImmediateSearchesCount; + // The index of the match on the popup that was selected using the keyboard, + // if the completeselectedindex attribute is set. + // This is used to distinguish that selection (which would have been put in + // the input on being selected) from a moused-over selectedIndex value. This + // distinction is used to prevent mouse moves from inadvertently changing + // what happens once the user hits Enter on the keyboard. + // See bug 1043584 for more details. + int32_t mCompletedSelectionIndex; +}; + +#endif /* __nsAutoCompleteController__ */ |