AlternativeTextController.h [plain text]
#pragma once
#include "AlternativeTextClient.h"
#include "DocumentMarker.h"
#include "FrameSelection.h"
#include "Range.h"
#include "TextChecking.h"
#include "Timer.h"
#include "VisibleSelection.h"
#include <wtf/Noncopyable.h>
namespace WebCore {
class CompositeEditCommand;
class EditorClient;
class EditCommand;
class EditCommandComposition;
class Event;
class Frame;
class TextCheckerClient;
struct DictationAlternative;
class AlternativeTextDetails : public RefCounted<AlternativeTextDetails> {
public:
virtual ~AlternativeTextDetails() { }
};
struct AlternativeTextInfo {
RefPtr<Range> rangeWithAlternative;
bool isActive;
AlternativeTextType type;
String originalText;
RefPtr<AlternativeTextDetails> details;
};
struct TextCheckingResult;
#if USE(AUTOCORRECTION_PANEL)
#define UNLESS_ENABLED(functionBody) \
;\
#else
#define UNLESS_ENABLED(functionBody) functionBody
#endif
class AlternativeTextController {
WTF_MAKE_NONCOPYABLE(AlternativeTextController);
WTF_MAKE_FAST_ALLOCATED;
public:
explicit AlternativeTextController(Frame& frame) UNLESS_ENABLED( : m_frame(frame) { })
~AlternativeTextController() UNLESS_ENABLED({ })
void startAlternativeTextUITimer(AlternativeTextType) UNLESS_ENABLED({ })
void stopAlternativeTextUITimer() UNLESS_ENABLED({ })
void dismiss(ReasonForDismissingAlternativeText) UNLESS_ENABLED({ })
void show(Range& rangeToReplace, const String& replacement) UNLESS_ENABLED({ UNUSED_PARAM(rangeToReplace); UNUSED_PARAM(replacement); })
bool applyAutocorrectionBeforeTypingIfAppropriate() UNLESS_ENABLED({ return false; })
void respondToUnappliedSpellCorrection(const VisibleSelection&, const String& corrected, const String& correction) UNLESS_ENABLED({ UNUSED_PARAM(corrected); UNUSED_PARAM(correction); })
void respondToAppliedEditing(CompositeEditCommand*) UNLESS_ENABLED({ })
void respondToUnappliedEditing(EditCommandComposition*) UNLESS_ENABLED({ })
void respondToChangedSelection(const VisibleSelection& oldSelection) UNLESS_ENABLED({ UNUSED_PARAM(oldSelection); })
void stopPendingCorrection(const VisibleSelection& oldSelection) UNLESS_ENABLED({ UNUSED_PARAM(oldSelection); })
void applyPendingCorrection(const VisibleSelection& selectionAfterTyping) UNLESS_ENABLED({ UNUSED_PARAM(selectionAfterTyping); })
void handleAlternativeTextUIResult(const String& result) UNLESS_ENABLED({ UNUSED_PARAM(result); })
void handleCancelOperation() UNLESS_ENABLED({ })
bool hasPendingCorrection() const UNLESS_ENABLED({ return false; })
bool isSpellingMarkerAllowed(Range& misspellingRange) const UNLESS_ENABLED({ UNUSED_PARAM(misspellingRange); return true; })
bool isAutomaticSpellingCorrectionEnabled() UNLESS_ENABLED({ return false; })
bool shouldRemoveMarkersUponEditing();
void recordAutocorrectionResponse(AutocorrectionResponse, const String& replacedString, Range* replacementRange) UNLESS_ENABLED({ UNUSED_PARAM(replacedString); UNUSED_PARAM(replacementRange); })
void markReversed(Range& changedRange) UNLESS_ENABLED({ UNUSED_PARAM(changedRange); })
void markCorrection(Range& replacedRange, const String& replacedString) UNLESS_ENABLED({ UNUSED_PARAM(replacedRange); UNUSED_PARAM(replacedString); })
bool processMarkersOnTextToBeReplacedByResult(const TextCheckingResult&, Range& rangeToBeReplaced, const String& stringToBeReplaced) UNLESS_ENABLED({ UNUSED_PARAM(rangeToBeReplaced); UNUSED_PARAM(stringToBeReplaced); return true; });
void deletedAutocorrectionAtPosition(const Position&, const String& originalString) UNLESS_ENABLED({ UNUSED_PARAM(originalString); })
bool insertDictatedText(const String&, const Vector<DictationAlternative>&, Event*);
void removeDictationAlternativesForMarker(const DocumentMarker&);
Vector<String> dictationAlternativesForMarker(const DocumentMarker&);
void applyDictationAlternative(const String& alternativeString);
private:
#if USE(AUTOCORRECTION_PANEL)
String dismissSoon(ReasonForDismissingAlternativeText);
void applyAlternativeTextToRange(const Range&, const String& alternative, AlternativeTextType, const Vector<DocumentMarker::MarkerType>&);
void timerFired();
void recordSpellcheckerResponseForModifiedCorrection(Range& rangeOfCorrection, const String& corrected, const String& correction);
String markerDescriptionForAppliedAlternativeText(AlternativeTextType, DocumentMarker::MarkerType);
bool shouldStartTimerFor(const DocumentMarker&, int endOffset) const;
bool respondToMarkerAtEndOfWord(const DocumentMarker&, const Position& endOfWordPosition);
AlternativeTextClient* alternativeTextClient();
EditorClient* editorClient();
TextCheckerClient* textChecker();
FloatRect rootViewRectForRange(const Range*) const;
void markPrecedingWhitespaceForDeletedAutocorrectionAfterCommand(EditCommand*);
Timer m_timer;
AlternativeTextInfo m_alternativeTextInfo;
bool m_isDismissedByEditing;
String m_originalStringForLastDeletedAutocorrection;
Position m_positionForLastDeletedAutocorrection;
#endif
Frame& m_frame;
};
#undef UNLESS_ENABLED
inline bool AlternativeTextController::shouldRemoveMarkersUponEditing()
{
#if USE(MARKER_REMOVAL_UPON_EDITING)
return true;
#else
return false;
#endif
}
}