tenfourfox/toolkit/components/typeaheadfind/nsTypeAheadFind.h
Cameron Kaiser c9b2922b70 hello FPR
2017-04-19 00:56:45 -07:00

133 lines
4.5 KiB
C++

/* -*- Mode: C++; tab-width: 2; 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 "nsCycleCollectionParticipant.h"
#include "nsISelectionController.h"
#include "nsIController.h"
#include "nsIControllers.h"
#include "nsIObserver.h"
#include "nsUnicharUtils.h"
#include "nsIFind.h"
#include "nsIWebBrowserFind.h"
#include "nsWeakReference.h"
#include "nsISelection.h"
#include "nsIDOMRange.h"
#include "nsIDocShellTreeItem.h"
#include "nsITypeAheadFind.h"
#include "nsISound.h"
class nsIPresShell;
class nsPresContext;
#define TYPEAHEADFIND_NOTFOUND_WAV_URL \
"chrome://global/content/notfound.wav"
class nsTypeAheadFind : public nsITypeAheadFind,
public nsIObserver,
public nsSupportsWeakReference
{
public:
nsTypeAheadFind();
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_NSITYPEAHEADFIND
NS_DECL_NSIOBSERVER
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsTypeAheadFind, nsITypeAheadFind)
protected:
virtual ~nsTypeAheadFind();
nsresult PrefsReset();
void SaveFind();
void PlayNotFoundSound();
nsresult GetWebBrowserFind(nsIDocShell *aDocShell,
nsIWebBrowserFind **aWebBrowserFind);
void RangeStartsInsideLink(nsIDOMRange *aRange, nsIPresShell *aPresShell,
bool *aIsInsideLink, bool *aIsStartingLink);
void GetSelection(nsIPresShell *aPresShell, nsISelectionController **aSelCon,
nsISelection **aDomSel);
// *aNewRange may not be collapsed. If you want to collapse it in a
// particular way, you need to do it yourself.
bool IsRangeVisible(nsIPresShell *aPresShell, nsPresContext *aPresContext,
nsIDOMRange *aRange, bool aMustBeVisible,
bool aGetTopVisibleLeaf, nsIDOMRange **aNewRange,
bool *aUsesIndependentSelection);
nsresult FindItNow(nsIPresShell *aPresShell, bool aIsLinksOnly,
bool aIsFirstVisiblePreferred, bool aFindPrev,
uint16_t* aResult);
nsresult GetSearchContainers(nsISupports *aContainer,
nsISelectionController *aSelectionController,
bool aIsFirstVisiblePreferred,
bool aFindPrev, nsIPresShell **aPresShell,
nsPresContext **aPresContext);
// Get the pres shell from mPresShell and return it only if it is still
// attached to the DOM window.
already_AddRefed<nsIPresShell> GetPresShell();
void ReleaseStrongMemberVariables();
// Current find state
nsString mTypeAheadBuffer;
nsCString mNotFoundSoundURL;
// PRBools are used instead of PRPackedBools because the address of the
// boolean variable is getting passed into a method.
bool mStartLinksOnlyPref;
bool mCaretBrowsingOn;
bool mDidAddObservers;
nsCOMPtr<nsIDOMElement> mFoundLink; // Most recent elem found, if a link
nsCOMPtr<nsIDOMElement> mFoundEditable; // Most recent elem found, if editable
nsCOMPtr<nsIDOMRange> mFoundRange; // Most recent range found
nsCOMPtr<nsIDOMWindow> mCurrentWindow;
// mLastFindLength is the character length of the last find string. It is used for
// disabling the "not found" sound when using backspace or delete
uint32_t mLastFindLength;
// Sound is played asynchronously on some platforms.
// If we destroy mSoundInterface before sound has played, it won't play
nsCOMPtr<nsISound> mSoundInterface;
bool mIsSoundInitialized;
// where selection was when user started the find
nsCOMPtr<nsIDOMRange> mStartFindRange;
nsCOMPtr<nsIDOMRange> mSearchRange;
nsCOMPtr<nsIDOMRange> mStartPointRange;
nsCOMPtr<nsIDOMRange> mEndPointRange;
// Cached useful interfaces
nsCOMPtr<nsIFind> mFind;
bool mCaseSensitive;
bool EnsureFind() {
if (mFind) {
return true;
}
mFind = do_CreateInstance("@mozilla.org/embedcomp/rangefind;1");
if (!mFind) {
return false;
}
mFind->SetCaseSensitive(mCaseSensitive);
mFind->SetWordBreaker(nullptr);
return true;
}
nsCOMPtr<nsIWebBrowserFind> mWebBrowserFind;
// The focused content window that we're listening to and its cached objects
nsWeakPtr mDocShell;
nsWeakPtr mPresShell;
nsWeakPtr mSelectionController;
// Most recent match's controller
};