void TypingCommand::insertText(Document* document, const String& text, const VisibleSelection& selectionForInsertion, bool selectInsertedText, bool insertedTextIsComposition) { ASSERT(document); RefPtr<Frame> frame = document->frame(); ASSERT(frame); VisibleSelection currentSelection = frame->selection()->selection(); bool changeSelection = currentSelection != selectionForInsertion; String newText = text; Node* startNode = selectionForInsertion.start().node(); if (startNode && startNode->rootEditableElement() && !insertedTextIsComposition) { // Send BeforeTextInsertedEvent. The event handler will update text if necessary. ExceptionCode ec = 0; RefPtr<BeforeTextInsertedEvent> evt = BeforeTextInsertedEvent::create(text); startNode->rootEditableElement()->dispatchEvent(evt, ec); newText = evt->text(); } if (newText.isEmpty()) return; // Set the starting and ending selection appropriately if we are using a selection // that is different from the current selection. In the future, we should change EditCommand // to deal with custom selections in a general way that can be used by all of the commands. RefPtr<EditCommand> lastEditCommand = frame->editor()->lastEditCommand(); if (isOpenForMoreTypingCommand(lastEditCommand.get())) { TypingCommand* lastTypingCommand = static_cast<TypingCommand*>(lastEditCommand.get()); if (changeSelection) { lastTypingCommand->setStartingSelection(selectionForInsertion); lastTypingCommand->setEndingSelection(selectionForInsertion); } lastTypingCommand->insertText(newText, selectInsertedText); if (changeSelection) { lastTypingCommand->setEndingSelection(currentSelection); frame->selection()->setSelection(currentSelection); } return; } RefPtr<TypingCommand> cmd = TypingCommand::create(document, InsertText, newText, selectInsertedText); if (changeSelection) { cmd->setStartingSelection(selectionForInsertion); cmd->setEndingSelection(selectionForInsertion); } applyCommand(cmd); if (changeSelection) { cmd->setEndingSelection(currentSelection); frame->selection()->setSelection(currentSelection); } }
void TypingCommand::insertParagraphSeparator(Document *document, Options options) { ASSERT(document); Frame* frame = document->frame(); ASSERT(frame); EditCommand* lastEditCommand = frame->editor()->lastEditCommand(); if (isOpenForMoreTypingCommand(lastEditCommand)) { TypingCommand* lastTypingCommand = static_cast<TypingCommand*>(lastEditCommand); lastTypingCommand->setShouldRetainAutocorrectionIndicator(options & RetainAutocorrectionIndicator); lastTypingCommand->insertParagraphSeparator(); return; } applyCommand(TypingCommand::create(document, InsertParagraphSeparator, "", options)); }
void TypingCommand::deleteKeyPressed(Document *document, Options options, TextGranularity granularity) { ASSERT(document); Frame* frame = document->frame(); ASSERT(frame); EditCommand* lastEditCommand = frame->editor()->lastEditCommand(); if (granularity == CharacterGranularity && isOpenForMoreTypingCommand(lastEditCommand)) { TypingCommand* lastTypingCommand = static_cast<TypingCommand*>(lastEditCommand); updateSelectionIfDifferentFromCurrentSelection(lastTypingCommand, frame); lastTypingCommand->setShouldPreventSpellChecking(options & PreventSpellChecking); lastTypingCommand->deleteKeyPressed(granularity, options & KillRing); return; } TypingCommand::create(document, DeleteKey, "", options, granularity)->apply(); }
void TypingCommand::deleteSelection(Document* document, Options options) { ASSERT(document); Frame* frame = document->frame(); ASSERT(frame); if (!frame->selection()->isRange()) return; EditCommand* lastEditCommand = frame->editor()->lastEditCommand(); if (isOpenForMoreTypingCommand(lastEditCommand)) { TypingCommand* lastTypingCommand = static_cast<TypingCommand*>(lastEditCommand); lastTypingCommand->setShouldPreventSpellChecking(options & PreventSpellChecking); lastTypingCommand->deleteSelection(options & SmartDelete); return; } TypingCommand::create(document, DeleteSelection, "", options)->apply(); }