1 /* 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef Editor_h 27 #define Editor_h 28 29 #include "core/clipboard/ClipboardAccessPolicy.h" 30 #include "core/dom/DocumentMarker.h" 31 #include "core/editing/EditAction.h" 32 #include "core/editing/EditingBehavior.h" 33 #include "core/editing/FindOptions.h" 34 #include "core/editing/FrameSelection.h" 35 #include "core/editing/TextIterator.h" 36 #include "core/editing/VisibleSelection.h" 37 #include "core/editing/WritingDirection.h" 38 #include "core/frame/FrameDestructionObserver.h" 39 #include "platform/PasteMode.h" 40 #include "platform/heap/Handle.h" 41 42 namespace WebCore { 43 44 class Clipboard; 45 class CompositeEditCommand; 46 class EditCommand; 47 class EditCommandComposition; 48 class EditorClient; 49 class EditorInternalCommand; 50 class LocalFrame; 51 class HTMLElement; 52 class HitTestResult; 53 class KillRing; 54 class Pasteboard; 55 class SharedBuffer; 56 class SimpleFontData; 57 class SpellChecker; 58 class StylePropertySet; 59 class Text; 60 class TextEvent; 61 class UndoStack; 62 63 enum EditorCommandSource { CommandFromMenuOrKeyBinding, CommandFromDOM, CommandFromDOMWithUserInterface }; 64 enum EditorParagraphSeparator { EditorParagraphSeparatorIsDiv, EditorParagraphSeparatorIsP }; 65 66 class Editor FINAL : public NoBaseWillBeGarbageCollectedFinalized<Editor> { 67 WTF_MAKE_NONCOPYABLE(Editor); 68 public: 69 static PassOwnPtrWillBeRawPtr<Editor> create(LocalFrame&); 70 ~Editor(); 71 72 EditorClient& client() const; 73 74 LocalFrame& frame() const { return m_frame; } 75 76 CompositeEditCommand* lastEditCommand() { return m_lastEditCommand.get(); } 77 78 void handleKeyboardEvent(KeyboardEvent*); 79 bool handleTextEvent(TextEvent*); 80 81 bool canEdit() const; 82 bool canEditRichly() const; 83 84 bool canDHTMLCut(); 85 bool canDHTMLCopy(); 86 bool canDHTMLPaste(); 87 88 bool canCut() const; 89 bool canCopy() const; 90 bool canPaste() const; 91 bool canDelete() const; 92 bool canSmartCopyOrDelete() const; 93 94 void cut(); 95 void copy(); 96 void paste(); 97 void pasteAsPlainText(); 98 void performDelete(); 99 100 static void countEvent(ExecutionContext*, const Event*); 101 void copyImage(const HitTestResult&); 102 103 void indent(); 104 void outdent(); 105 void transpose(); 106 107 bool shouldDeleteRange(Range*) const; 108 109 void respondToChangedContents(const VisibleSelection& endingSelection); 110 111 bool selectionStartHasStyle(CSSPropertyID, const String& value) const; 112 TriState selectionHasStyle(CSSPropertyID, const String& value) const; 113 String selectionStartCSSPropertyValue(CSSPropertyID); 114 115 TriState selectionUnorderedListState() const; 116 TriState selectionOrderedListState() const; 117 118 void removeFormattingAndStyle(); 119 120 void clearLastEditCommand(); 121 122 bool deleteWithDirection(SelectionDirection, TextGranularity, bool killRing, bool isTypingAction); 123 void deleteSelectionWithSmartDelete(bool smartDelete); 124 125 void applyStyle(StylePropertySet*, EditAction = EditActionUnspecified); 126 void applyParagraphStyle(StylePropertySet*, EditAction = EditActionUnspecified); 127 void applyStyleToSelection(StylePropertySet*, EditAction); 128 void applyParagraphStyleToSelection(StylePropertySet*, EditAction); 129 130 void appliedEditing(PassRefPtrWillBeRawPtr<CompositeEditCommand>); 131 void unappliedEditing(PassRefPtrWillBeRawPtr<EditCommandComposition>); 132 void reappliedEditing(PassRefPtrWillBeRawPtr<EditCommandComposition>); 133 134 void setShouldStyleWithCSS(bool flag) { m_shouldStyleWithCSS = flag; } 135 bool shouldStyleWithCSS() const { return m_shouldStyleWithCSS; } 136 137 class Command { 138 public: 139 Command(); 140 Command(const EditorInternalCommand*, EditorCommandSource, PassRefPtr<LocalFrame>); 141 142 bool execute(const String& parameter = String(), Event* triggeringEvent = 0) const; 143 bool execute(Event* triggeringEvent) const; 144 145 bool isSupported() const; 146 bool isEnabled(Event* triggeringEvent = 0) const; 147 148 TriState state(Event* triggeringEvent = 0) const; 149 String value(Event* triggeringEvent = 0) const; 150 151 bool isTextInsertion() const; 152 153 // Returns 0 if this Command is not supported. 154 int idForHistogram() const; 155 private: 156 const EditorInternalCommand* m_command; 157 EditorCommandSource m_source; 158 RefPtr<LocalFrame> m_frame; 159 }; 160 Command command(const String& commandName); // Command source is CommandFromMenuOrKeyBinding. 161 Command command(const String& commandName, EditorCommandSource); 162 163 bool insertText(const String&, Event* triggeringEvent); 164 bool insertTextWithoutSendingTextEvent(const String&, bool selectInsertedText, TextEvent* triggeringEvent); 165 bool insertLineBreak(); 166 bool insertParagraphSeparator(); 167 168 bool isOverwriteModeEnabled() const { return m_overwriteModeEnabled; } 169 void toggleOverwriteModeEnabled(); 170 171 bool canUndo(); 172 void undo(); 173 bool canRedo(); 174 void redo(); 175 176 void setBaseWritingDirection(WritingDirection); 177 178 // smartInsertDeleteEnabled and selectTrailingWhitespaceEnabled are 179 // mutually exclusive, meaning that enabling one will disable the other. 180 bool smartInsertDeleteEnabled() const; 181 bool isSelectTrailingWhitespaceEnabled() const; 182 183 bool preventRevealSelection() const { return m_preventRevealSelection; } 184 185 void setStartNewKillRingSequence(bool); 186 187 void clear(); 188 189 VisibleSelection selectionForCommand(Event*); 190 191 KillRing& killRing() const { return *m_killRing; } 192 193 EditingBehavior behavior() const; 194 195 PassRefPtrWillBeRawPtr<Range> selectedRange(); 196 197 void addToKillRing(Range*, bool prepend); 198 199 void pasteAsFragment(PassRefPtrWillBeRawPtr<DocumentFragment>, bool smartReplace, bool matchStyle); 200 void pasteAsPlainText(const String&, bool smartReplace); 201 202 Node* findEventTargetFrom(const VisibleSelection&) const; 203 204 bool findString(const String&, FindOptions); 205 // FIXME: Switch callers over to the FindOptions version and retire this one. 206 bool findString(const String&, bool forward, bool caseFlag, bool wrapFlag, bool startInSelection); 207 208 PassRefPtrWillBeRawPtr<Range> findStringAndScrollToVisible(const String&, Range*, FindOptions); 209 210 const VisibleSelection& mark() const; // Mark, to be used as emacs uses it. 211 void setMark(const VisibleSelection&); 212 213 void computeAndSetTypingStyle(StylePropertySet* , EditAction = EditActionUnspecified); 214 215 IntRect firstRectForRange(Range*) const; 216 217 void respondToChangedSelection(const VisibleSelection& oldSelection, FrameSelection::SetSelectionOptions); 218 219 bool markedTextMatchesAreHighlighted() const; 220 void setMarkedTextMatchesAreHighlighted(bool); 221 222 void replaceSelectionWithFragment(PassRefPtrWillBeRawPtr<DocumentFragment>, bool selectReplacement, bool smartReplace, bool matchStyle); 223 void replaceSelectionWithText(const String&, bool selectReplacement, bool smartReplace); 224 225 EditorParagraphSeparator defaultParagraphSeparator() const { return m_defaultParagraphSeparator; } 226 void setDefaultParagraphSeparator(EditorParagraphSeparator separator) { m_defaultParagraphSeparator = separator; } 227 228 class RevealSelectionScope { 229 WTF_MAKE_NONCOPYABLE(RevealSelectionScope); 230 public: 231 RevealSelectionScope(Editor*); 232 ~RevealSelectionScope(); 233 private: 234 Editor* m_editor; 235 }; 236 friend class RevealSelectionScope; 237 238 void trace(Visitor*); 239 240 private: 241 LocalFrame& m_frame; 242 RefPtrWillBeMember<CompositeEditCommand> m_lastEditCommand; 243 int m_preventRevealSelection; 244 bool m_shouldStartNewKillRingSequence; 245 bool m_shouldStyleWithCSS; 246 const OwnPtr<KillRing> m_killRing; 247 VisibleSelection m_mark; 248 bool m_areMarkedTextMatchesHighlighted; 249 EditorParagraphSeparator m_defaultParagraphSeparator; 250 bool m_overwriteModeEnabled; 251 252 explicit Editor(LocalFrame&); 253 254 bool canDeleteRange(Range*) const; 255 256 UndoStack* undoStack() const; 257 258 bool tryDHTMLCopy(); 259 bool tryDHTMLCut(); 260 bool tryDHTMLPaste(PasteMode); 261 262 bool canSmartReplaceWithPasteboard(Pasteboard*); 263 void pasteAsPlainTextWithPasteboard(Pasteboard*); 264 void pasteWithPasteboard(Pasteboard*); 265 void writeSelectionToPasteboard(Pasteboard*, Range*, const String& plainText); 266 bool dispatchCPPEvent(const AtomicString&, ClipboardAccessPolicy, PasteMode = AllMimeTypes); 267 268 void revealSelectionAfterEditingOperation(const ScrollAlignment& = ScrollAlignment::alignCenterIfNeeded, RevealExtentOption = DoNotRevealExtent); 269 void changeSelectionAfterCommand(const VisibleSelection& newSelection, FrameSelection::SetSelectionOptions); 270 void notifyComponentsOnChangedSelection(const VisibleSelection& oldSelection, FrameSelection::SetSelectionOptions); 271 272 Node* findEventTargetFromSelection() const; 273 274 PassRefPtrWillBeRawPtr<Range> rangeOfString(const String&, Range*, FindOptions); 275 276 SpellChecker& spellChecker() const; 277 278 bool handleEditingKeyboardEvent(WebCore::KeyboardEvent*); 279 }; 280 281 inline void Editor::setStartNewKillRingSequence(bool flag) 282 { 283 m_shouldStartNewKillRingSequence = flag; 284 } 285 286 inline const VisibleSelection& Editor::mark() const 287 { 288 return m_mark; 289 } 290 291 inline void Editor::setMark(const VisibleSelection& selection) 292 { 293 m_mark = selection; 294 } 295 296 inline bool Editor::markedTextMatchesAreHighlighted() const 297 { 298 return m_areMarkedTextMatchesHighlighted; 299 } 300 301 302 } // namespace WebCore 303 304 #endif // Editor_h 305