2 * Copyright (C) 2004 Apple Computer, Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
26 #ifndef __htmlediting_h__
27 #define __htmlediting_h__
29 #include "dom_nodeimpl.h"
31 #include "qvaluelist.h"
32 #include "selection.h"
36 class CSSMutableStyleDeclarationImpl;
38 class DocumentFragmentImpl;
39 class HTMLElementImpl;
47 class VisiblePosition;
49 //------------------------------------------------------------------------------------------
52 class EditCommandPtr : public SharedPtr<EditCommand>
56 EditCommandPtr(EditCommand *);
57 EditCommandPtr(const EditCommandPtr &);
60 EditCommandPtr &operator=(const EditCommandPtr &);
62 bool isCompositeStep() const;
68 DOM::DocumentImpl * const document() const;
70 khtml::Selection startingSelection() const;
71 khtml::Selection endingSelection() const;
73 void setStartingSelection(const khtml::Selection &s) const;
74 void setEndingSelection(const khtml::Selection &s) const;
76 DOM::CSSMutableStyleDeclarationImpl *typingStyle() const;
77 void setTypingStyle(DOM::CSSMutableStyleDeclarationImpl *) const;
79 EditCommandPtr parent() const;
80 void setParent(const EditCommandPtr &) const;
82 bool isInsertTextCommand() const;
83 bool isInsertLineBreakCommand() const;
84 bool isTypingCommand() const;
86 static EditCommandPtr &emptyCommand();
89 //------------------------------------------------------------------------------------------
94 enum ELegacyHTMLStyles { DoNotUseLegacyHTMLStyles, UseLegacyHTMLStyles };
96 explicit StyleChange(DOM::CSSStyleDeclarationImpl *, ELegacyHTMLStyles usesLegacyStyles=UseLegacyHTMLStyles);
97 StyleChange(DOM::CSSStyleDeclarationImpl *, const DOM::Position &, ELegacyHTMLStyles usesLegacyStyles=UseLegacyHTMLStyles);
99 DOM::DOMString cssStyle() const { return m_cssStyle; }
100 bool applyBold() const { return m_applyBold; }
101 bool applyItalic() const { return m_applyItalic; }
102 bool usesLegacyStyles() const { return m_usesLegacyStyles; }
105 void init(DOM::CSSStyleDeclarationImpl *, const DOM::Position &);
106 bool checkForLegacyHTMLStyleChange(const DOM::CSSProperty *);
107 static bool currentlyHasStyle(const DOM::Position &, const DOM::CSSProperty *);
109 DOM::DOMString m_cssStyle;
112 bool m_usesLegacyStyles;
115 //------------------------------------------------------------------------------------------
118 class EditCommand : public Shared<EditCommand>
121 EditCommand(DOM::DocumentImpl *);
122 virtual ~EditCommand();
124 bool isCompositeStep() const { return m_parent != 0; }
125 EditCommand *parent() const { return m_parent; }
126 void setParent(EditCommand *parent) { m_parent = parent; }
128 enum ECommandState { NotApplied, Applied };
134 virtual void doApply() = 0;
135 virtual void doUnapply() = 0;
136 virtual void doReapply(); // calls doApply()
138 virtual DOM::DocumentImpl * const document() const { return m_document; }
140 khtml::Selection startingSelection() const { return m_startingSelection; }
141 khtml::Selection endingSelection() const { return m_endingSelection; }
143 void setEndingSelectionNeedsLayout(bool flag=true) { m_endingSelection.setNeedsLayout(flag); }
145 ECommandState state() const { return m_state; }
146 void setState(ECommandState state) { m_state = state; }
148 void setStartingSelection(const khtml::Selection &s);
149 void setEndingSelection(const khtml::Selection &s);
151 DOM::CSSMutableStyleDeclarationImpl *typingStyle() const { return m_typingStyle; };
152 void setTypingStyle(DOM::CSSMutableStyleDeclarationImpl *);
154 virtual bool isInsertTextCommand() const;
155 virtual bool isTypingCommand() const;
158 void assignTypingStyle(DOM::CSSMutableStyleDeclarationImpl *);
160 virtual bool preservesTypingStyle() const;
162 DOM::DocumentImpl *m_document;
163 ECommandState m_state;
164 khtml::Selection m_startingSelection;
165 khtml::Selection m_endingSelection;
166 DOM::CSSMutableStyleDeclarationImpl *m_typingStyle;
167 EditCommand *m_parent;
170 //------------------------------------------------------------------------------------------
171 // CompositeEditCommand
173 class CompositeEditCommand : public EditCommand
176 CompositeEditCommand(DOM::DocumentImpl *);
178 virtual void doUnapply();
179 virtual void doReapply();
183 // sugary-sweet convenience functions to help create and apply edit commands in composite commands
185 void appendNode(DOM::NodeImpl *appendChild, DOM::NodeImpl *parentNode);
186 void applyCommandToComposite(EditCommandPtr &);
187 void deleteKeyPressed();
188 void deleteSelection(bool smartDelete=false, bool mergeBlocksAfterDelete=true);
189 void deleteSelection(const khtml::Selection &selection, bool smartDelete=false, bool mergeBlocksAfterDelete=true);
190 void deleteTextFromNode(DOM::TextImpl *node, long offset, long count);
191 void inputText(const DOM::DOMString &text, bool selectInsertedText = false);
192 void insertNodeAfter(DOM::NodeImpl *insertChild, DOM::NodeImpl *refChild);
193 void insertNodeAt(DOM::NodeImpl *insertChild, DOM::NodeImpl *refChild, long offset);
194 void insertNodeBefore(DOM::NodeImpl *insertChild, DOM::NodeImpl *refChild);
195 void insertParagraphSeparator();
196 void insertTextIntoNode(DOM::TextImpl *node, long offset, const DOM::DOMString &text);
197 void joinTextNodes(DOM::TextImpl *text1, DOM::TextImpl *text2);
198 void rebalanceWhitespace();
199 void removeCSSProperty(DOM::CSSStyleDeclarationImpl *, int property);
200 void removeFullySelectedNode(DOM::NodeImpl *);
201 void removeNodeAttribute(DOM::ElementImpl *, int attribute);
202 void removeNode(DOM::NodeImpl *removeChild);
203 void removeNodePreservingChildren(DOM::NodeImpl *node);
204 void replaceTextInNode(DOM::TextImpl *node, long offset, long count, const DOM::DOMString &replacementText);
205 void setNodeAttribute(DOM::ElementImpl *, int attribute, const DOM::DOMString &);
206 void splitTextNode(DOM::TextImpl *text, long offset);
208 DOM::NodeImpl *applyTypingStyle(DOM::NodeImpl *) const;
210 void deleteInsignificantText(DOM::TextImpl *, int start, int end);
211 void deleteInsignificantText(const DOM::Position &start, const DOM::Position &end);
212 void deleteInsignificantTextDownstream(const DOM::Position &);
214 void insertBlockPlaceholderIfNeeded(DOM::NodeImpl *);
215 bool removeBlockPlaceholderIfNeeded(DOM::NodeImpl *);
217 QValueList<EditCommandPtr> m_cmds;
220 //==========================================================================================
222 //------------------------------------------------------------------------------------------
225 class AppendNodeCommand : public EditCommand
228 AppendNodeCommand(DOM::DocumentImpl *, DOM::NodeImpl *appendChild, DOM::NodeImpl *parentNode);
229 virtual ~AppendNodeCommand();
231 virtual void doApply();
232 virtual void doUnapply();
234 DOM::NodeImpl *appendChild() const { return m_appendChild; }
235 DOM::NodeImpl *parentNode() const { return m_parentNode; }
238 DOM::NodeImpl *m_appendChild;
239 DOM::NodeImpl *m_parentNode;
242 //------------------------------------------------------------------------------------------
245 class ApplyStyleCommand : public CompositeEditCommand
248 ApplyStyleCommand(DOM::DocumentImpl *, DOM::CSSStyleDeclarationImpl *style);
249 virtual ~ApplyStyleCommand();
251 virtual void doApply();
253 DOM::CSSMutableStyleDeclarationImpl *style() const { return m_style; }
256 // style-removal helpers
257 bool isHTMLStyleNode(DOM::CSSMutableStyleDeclarationImpl *, DOM::HTMLElementImpl *);
258 void removeHTMLStyleNode(DOM::HTMLElementImpl *);
259 void removeCSSStyle(DOM::CSSMutableStyleDeclarationImpl *, DOM::HTMLElementImpl *);
260 void removeBlockStyle(DOM::CSSMutableStyleDeclarationImpl *, const DOM::Position &start, const DOM::Position &end);
261 void removeInlineStyle(DOM::CSSMutableStyleDeclarationImpl *, const DOM::Position &start, const DOM::Position &end);
262 bool nodeFullySelected(DOM::NodeImpl *, const DOM::Position &start, const DOM::Position &end) const;
264 // style-application helpers
265 void applyBlockStyle(DOM::CSSMutableStyleDeclarationImpl *);
266 void applyInlineStyle(DOM::CSSMutableStyleDeclarationImpl *);
267 void addBlockStyleIfNeeded(DOM::CSSMutableStyleDeclarationImpl *, DOM::HTMLElementImpl *);
268 void addInlineStyleIfNeeded(DOM::CSSMutableStyleDeclarationImpl *, DOM::NodeImpl *start, DOM::NodeImpl *end);
269 bool splitTextAtStartIfNeeded(const DOM::Position &start, const DOM::Position &end);
270 DOM::NodeImpl *splitTextAtEndIfNeeded(const DOM::Position &start, const DOM::Position &end);
271 void surroundNodeRangeWithElement(DOM::NodeImpl *start, DOM::NodeImpl *end, DOM::ElementImpl *element);
272 DOM::Position positionInsertionPoint(DOM::Position);
274 DOM::CSSMutableStyleDeclarationImpl *m_style;
277 //------------------------------------------------------------------------------------------
278 // DeleteFromTextNodeCommand
280 class DeleteFromTextNodeCommand : public EditCommand
283 DeleteFromTextNodeCommand(DOM::DocumentImpl *document, DOM::TextImpl *node, long offset, long count);
284 virtual ~DeleteFromTextNodeCommand();
286 virtual void doApply();
287 virtual void doUnapply();
289 DOM::TextImpl *node() const { return m_node; }
290 long offset() const { return m_offset; }
291 long count() const { return m_count; }
294 DOM::TextImpl *m_node;
297 DOM::DOMString m_text;
300 //------------------------------------------------------------------------------------------
301 // DeleteSelectionCommand
303 class DeleteSelectionCommand : public CompositeEditCommand
306 DeleteSelectionCommand(DOM::DocumentImpl *document, bool smartDelete=false, bool mergeBlocksAfterDelete=true);
307 DeleteSelectionCommand(DOM::DocumentImpl *document, const khtml::Selection &selection, bool smartDelete=false, bool mergeBlocksAfterDelete=true);
309 virtual void doApply();
312 virtual bool preservesTypingStyle() const;
314 void initializePositionData();
315 void saveTypingStyleState();
316 bool handleSpecialCaseAllContentDelete();
317 bool handleSpecialCaseBRDelete();
318 void handleGeneralDelete();
319 void fixupWhitespace();
320 void moveNodesAfterNode();
321 void calculateEndingPosition();
322 void calculateTypingStyleAfterDelete();
323 void clearTransientState();
325 bool m_hasSelectionToDelete;
327 bool m_mergeBlocksAfterDelete;
328 bool m_trailingWhitespaceValid;
330 // This data is transient and should be cleared at the end of the doApply function.
331 khtml::Selection m_selectionToDelete;
332 DOM::Position m_upstreamStart;
333 DOM::Position m_downstreamStart;
334 DOM::Position m_upstreamEnd;
335 DOM::Position m_downstreamEnd;
336 DOM::Position m_endingPosition;
337 DOM::Position m_leadingWhitespace;
338 DOM::Position m_trailingWhitespace;
339 DOM::NodeImpl *m_startBlock;
340 DOM::NodeImpl *m_endBlock;
341 DOM::NodeImpl *m_startNode;
342 DOM::CSSMutableStyleDeclarationImpl *m_typingStyle;
345 //------------------------------------------------------------------------------------------
346 // InsertIntoTextNode
348 class InsertIntoTextNode : public EditCommand
351 InsertIntoTextNode(DOM::DocumentImpl *document, DOM::TextImpl *, long, const DOM::DOMString &);
352 virtual ~InsertIntoTextNode();
354 virtual void doApply();
355 virtual void doUnapply();
357 DOM::TextImpl *node() const { return m_node; }
358 long offset() const { return m_offset; }
359 DOM::DOMString text() const { return m_text; }
362 DOM::TextImpl *m_node;
364 DOM::DOMString m_text;
367 //------------------------------------------------------------------------------------------
368 // InsertNodeBeforeCommand
370 class InsertNodeBeforeCommand : public EditCommand
373 InsertNodeBeforeCommand(DOM::DocumentImpl *, DOM::NodeImpl *insertChild, DOM::NodeImpl *refChild);
374 virtual ~InsertNodeBeforeCommand();
376 virtual void doApply();
377 virtual void doUnapply();
379 DOM::NodeImpl *insertChild() const { return m_insertChild; }
380 DOM::NodeImpl *refChild() const { return m_refChild; }
383 DOM::NodeImpl *m_insertChild;
384 DOM::NodeImpl *m_refChild;
387 //------------------------------------------------------------------------------------------
388 // InsertLineBreakCommand
390 class InsertLineBreakCommand : public CompositeEditCommand
393 InsertLineBreakCommand(DOM::DocumentImpl *document);
395 virtual void doApply();
398 void insertNodeAfterPosition(DOM::NodeImpl *node, const DOM::Position &pos);
399 void insertNodeBeforePosition(DOM::NodeImpl *node, const DOM::Position &pos);
402 //------------------------------------------------------------------------------------------
403 // InsertParagraphSeparatorCommand
405 class InsertParagraphSeparatorCommand : public CompositeEditCommand
408 InsertParagraphSeparatorCommand(DOM::DocumentImpl *document);
409 virtual ~InsertParagraphSeparatorCommand();
411 virtual void doApply();
414 QPtrList<DOM::NodeImpl> ancestors;
415 QPtrList<DOM::NodeImpl> clonedNodes;
418 //------------------------------------------------------------------------------------------
419 // InsertParagraphSeparatorInQuotedContentCommand
421 class InsertParagraphSeparatorInQuotedContentCommand : public CompositeEditCommand
424 InsertParagraphSeparatorInQuotedContentCommand(DOM::DocumentImpl *);
425 virtual ~InsertParagraphSeparatorInQuotedContentCommand();
427 virtual void doApply();
430 bool isMailBlockquote(const DOM::NodeImpl *) const;
432 QPtrList<DOM::NodeImpl> ancestors;
433 QPtrList<DOM::NodeImpl> clonedNodes;
434 DOM::ElementImpl *m_breakNode;
437 //------------------------------------------------------------------------------------------
440 class InsertTextCommand : public CompositeEditCommand
443 InsertTextCommand(DOM::DocumentImpl *document);
445 virtual void doApply();
447 void deleteCharacter();
448 void input(const DOM::DOMString &text, bool selectInsertedText = false);
450 unsigned long charactersAdded() const { return m_charactersAdded; }
453 virtual bool isInsertTextCommand() const;
455 DOM::Position prepareForTextInsertion(bool adjustDownstream);
456 void insertSpace(DOM::TextImpl *textNode, unsigned long offset);
458 unsigned long m_charactersAdded;
461 //------------------------------------------------------------------------------------------
462 // JoinTextNodesCommand
464 class JoinTextNodesCommand : public EditCommand
467 JoinTextNodesCommand(DOM::DocumentImpl *, DOM::TextImpl *, DOM::TextImpl *);
468 virtual ~JoinTextNodesCommand();
470 virtual void doApply();
471 virtual void doUnapply();
473 DOM::TextImpl *firstNode() const { return m_text1; }
474 DOM::TextImpl *secondNode() const { return m_text2; }
477 DOM::TextImpl *m_text1;
478 DOM::TextImpl *m_text2;
479 unsigned long m_offset;
482 //------------------------------------------------------------------------------------------
483 // MoveSelectionCommand
485 class MoveSelectionCommand : public CompositeEditCommand
488 MoveSelectionCommand(DOM::DocumentImpl *document, DOM::DocumentFragmentImpl *fragment, DOM::Position &position, bool smartMove=false);
489 virtual ~MoveSelectionCommand();
491 virtual void doApply();
494 DOM::DocumentFragmentImpl *m_fragment;
495 DOM::Position m_position;
499 //------------------------------------------------------------------------------------------
500 // RebalanceWhitespaceCommand
502 class RebalanceWhitespaceCommand : public EditCommand
505 RebalanceWhitespaceCommand(DOM::DocumentImpl *, const DOM::Position &);
506 virtual ~RebalanceWhitespaceCommand();
508 virtual void doApply();
509 virtual void doUnapply();
512 enum { InvalidOffset = -1 };
514 virtual bool preservesTypingStyle() const;
516 DOM::DOMString m_beforeString;
517 DOM::DOMString m_afterString;
518 DOM::Position m_position;
519 long m_upstreamOffset;
520 long m_downstreamOffset;
523 //------------------------------------------------------------------------------------------
524 // RemoveCSSPropertyCommand
526 class RemoveCSSPropertyCommand : public EditCommand
529 RemoveCSSPropertyCommand(DOM::DocumentImpl *, DOM::CSSStyleDeclarationImpl *, int property);
530 virtual ~RemoveCSSPropertyCommand();
532 virtual void doApply();
533 virtual void doUnapply();
535 DOM::CSSMutableStyleDeclarationImpl *styleDeclaration() const { return m_decl; }
536 int property() const { return m_property; }
539 DOM::CSSMutableStyleDeclarationImpl *m_decl;
541 DOM::DOMString m_oldValue;
545 //------------------------------------------------------------------------------------------
546 // RemoveNodeAttributeCommand
548 class RemoveNodeAttributeCommand : public EditCommand
551 RemoveNodeAttributeCommand(DOM::DocumentImpl *, DOM::ElementImpl *, DOM::NodeImpl::Id attribute);
552 virtual ~RemoveNodeAttributeCommand();
554 virtual void doApply();
555 virtual void doUnapply();
557 DOM::ElementImpl *element() const { return m_element; }
558 DOM::NodeImpl::Id attribute() const { return m_attribute; }
561 DOM::ElementImpl *m_element;
562 DOM::NodeImpl::Id m_attribute;
563 DOM::DOMString m_oldValue;
566 //------------------------------------------------------------------------------------------
569 class RemoveNodeCommand : public EditCommand
572 RemoveNodeCommand(DOM::DocumentImpl *, DOM::NodeImpl *);
573 virtual ~RemoveNodeCommand();
575 virtual void doApply();
576 virtual void doUnapply();
578 DOM::NodeImpl *node() const { return m_removeChild; }
581 DOM::NodeImpl *m_parent;
582 DOM::NodeImpl *m_removeChild;
583 DOM::NodeImpl *m_refChild;
586 //------------------------------------------------------------------------------------------
587 // RemoveNodePreservingChildrenCommand
589 class RemoveNodePreservingChildrenCommand : public CompositeEditCommand
592 RemoveNodePreservingChildrenCommand(DOM::DocumentImpl *, DOM::NodeImpl *);
593 virtual ~RemoveNodePreservingChildrenCommand();
595 virtual void doApply();
597 DOM::NodeImpl *node() const { return m_node; }
600 DOM::NodeImpl *m_node;
603 //------------------------------------------------------------------------------------------
604 // ReplaceSelectionCommand
606 // --- ReplacementFragment helper class
608 class ReplacementFragment
611 ReplacementFragment(DOM::DocumentFragmentImpl *fragment);
612 ~ReplacementFragment();
614 enum EFragmentType { EmptyFragment, SingleTextNodeFragment, TreeFragment };
616 DOM::DocumentFragmentImpl *root() const { return m_fragment; }
617 DOM::NodeImpl *firstChild() const;
618 DOM::NodeImpl *lastChild() const;
620 DOM::NodeImpl *mergeStartNode() const;
621 DOM::NodeImpl *mergeEndNode() const;
623 void pruneEmptyNodes();
625 EFragmentType type() const { return m_type; }
626 bool isEmpty() const { return m_type == EmptyFragment; }
627 bool isSingleTextNode() const { return m_type == SingleTextNodeFragment; }
628 bool isTreeFragment() const { return m_type == TreeFragment; }
630 bool hasMoreThanOneBlock() const { return m_hasMoreThanOneBlock; }
631 bool hasInterchangeNewlineComment() const { return m_hasInterchangeNewlineComment; }
634 // no copy construction or assignment
635 ReplacementFragment(const ReplacementFragment &);
636 ReplacementFragment &operator=(const ReplacementFragment &);
638 static bool isInterchangeNewlineComment(const DOM::NodeImpl *);
639 static bool isInterchangeConvertedSpaceSpan(const DOM::NodeImpl *);
641 // A couple simple DOM helpers
642 void removeNode(DOM::NodeImpl *);
643 void insertNodeBefore(DOM::NodeImpl *node, DOM::NodeImpl *refNode);
645 EFragmentType m_type;
646 DOM::DocumentFragmentImpl *m_fragment;
647 bool m_hasInterchangeNewlineComment;
648 bool m_hasMoreThanOneBlock;
651 // free-floating helper functions
652 bool isProbablyBlock(const DOM::NodeImpl *);
653 bool isComment(const DOM::NodeImpl *);
655 class ReplaceSelectionCommand : public CompositeEditCommand
658 ReplaceSelectionCommand(DOM::DocumentImpl *document, DOM::DocumentFragmentImpl *fragment, bool selectReplacement=true, bool smartReplace=false);
659 virtual ~ReplaceSelectionCommand();
661 virtual void doApply();
664 void completeHTMLReplacement(const DOM::Position &, const DOM::Position &);
665 void completeHTMLReplacement(DOM::NodeImpl *, DOM::NodeImpl *);
667 ReplacementFragment m_fragment;
668 bool m_selectReplacement;
672 //------------------------------------------------------------------------------------------
673 // SetNodeAttributeCommand
675 class SetNodeAttributeCommand : public EditCommand
678 SetNodeAttributeCommand(DOM::DocumentImpl *, DOM::ElementImpl *, DOM::NodeImpl::Id attribute, const DOM::DOMString &value);
679 virtual ~SetNodeAttributeCommand();
681 virtual void doApply();
682 virtual void doUnapply();
684 DOM::ElementImpl *element() const { return m_element; }
685 DOM::NodeImpl::Id attribute() const { return m_attribute; }
686 DOM::DOMString value() const { return m_value; }
689 DOM::ElementImpl *m_element;
690 DOM::NodeImpl::Id m_attribute;
691 DOM::DOMString m_value;
692 DOM::DOMString m_oldValue;
695 //------------------------------------------------------------------------------------------
696 // SplitTextNodeCommand
698 class SplitTextNodeCommand : public EditCommand
701 SplitTextNodeCommand(DOM::DocumentImpl *, DOM::TextImpl *, long);
702 virtual ~SplitTextNodeCommand();
704 virtual void doApply();
705 virtual void doUnapply();
707 DOM::TextImpl *node() const { return m_text2; }
708 long offset() const { return m_offset; }
711 DOM::TextImpl *m_text1;
712 DOM::TextImpl *m_text2;
713 unsigned long m_offset;
716 //------------------------------------------------------------------------------------------
719 class TypingCommand : public CompositeEditCommand
722 enum ETypingCommand {
726 InsertParagraphSeparator,
727 InsertParagraphSeparatorInQuotedContent,
730 TypingCommand(DOM::DocumentImpl *document, ETypingCommand, const DOM::DOMString &text = "", bool selectInsertedText = false);
732 static void deleteKeyPressed(DOM::DocumentImpl *);
733 static void insertText(DOM::DocumentImpl *, const DOM::DOMString &, bool selectInsertedText = false);
734 static void insertLineBreak(DOM::DocumentImpl *);
735 static void insertParagraphSeparator(DOM::DocumentImpl *);
736 static void insertParagraphSeparatorInQuotedContent(DOM::DocumentImpl *);
737 static bool isOpenForMoreTypingCommand(const EditCommandPtr &);
738 static void closeTyping(const EditCommandPtr &);
740 virtual void doApply();
742 bool openForMoreTyping() const { return m_openForMoreTyping; }
743 void closeTyping() { m_openForMoreTyping = false; }
745 void insertText(const DOM::DOMString &text, bool selectInsertedText);
746 void insertLineBreak();
747 void insertParagraphSeparatorInQuotedContent();
748 void insertParagraphSeparator();
749 void deleteKeyPressed();
752 virtual bool isTypingCommand() const;
753 virtual bool preservesTypingStyle() const;
755 void issueCommandForDeleteKey();
756 void removeCommand(const EditCommandPtr &);
757 void markMisspellingsAfterTyping();
758 void typingAddedToOpenCommand();
760 ETypingCommand m_commandType;
761 DOM::DOMString m_textToInsert;
762 bool m_openForMoreTyping;
764 bool m_selectInsertedText;
767 //------------------------------------------------------------------------------------------
769 } // end namespace khtml