181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch/* 281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) 2011 Apple Inc. All rights reserved. 381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Redistribution and use in source and binary forms, with or without 581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * modification, are permitted provided that the following conditions 681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * are met: 781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 1. Redistributions of source code must retain the above copyright 881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * notice, this list of conditions and the following disclaimer. 981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * notice, this list of conditions and the following disclaimer in the 1181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * documentation and/or other materials provided with the distribution. 1281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * 1381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 1481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 1781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 1881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 1981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 2181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch */ 2581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 2681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "config.h" 2781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "SpellingCorrectionCommand.h" 2881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "SpellingCorrectionController.h" 3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "DocumentFragment.h" 3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "Frame.h" 3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "ReplaceSelectionCommand.h" 3381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "SetSelectionCommand.h" 3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "TextIterator.h" 3581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "markup.h" 3681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochnamespace WebCore { 3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if SUPPORT_AUTOCORRECTION_PANEL 4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// On Mac OS X, we use this command to keep track of user undoing a correction for the first time. 4181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// This information is needed by spell checking service to update user specific data. 4281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochclass SpellingCorrectionRecordUndoCommand : public SimpleEditCommand { 4381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochpublic: 4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch static PassRefPtr<SpellingCorrectionRecordUndoCommand> create(Document* document, const String& corrected, const String& correction) 4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 4681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return adoptRef(new SpellingCorrectionRecordUndoCommand(document, corrected, correction)); 4781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 4881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochprivate: 4981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch SpellingCorrectionRecordUndoCommand(Document* document, const String& corrected, const String& correction) 5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch : SimpleEditCommand(document) 5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_corrected(corrected) 5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_correction(correction) 5381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_hasBeenUndone(false) 5481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 5581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 5781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch virtual void doApply() 5881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 5981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 6081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch virtual void doUnapply() 6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch { 6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_hasBeenUndone) { 6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch document()->frame()->editor()->unappliedSpellCorrection(startingSelection(), m_corrected, m_correction); 6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_hasBeenUndone = true; 6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 6881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 6981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 7081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch String m_corrected; 7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch String m_correction; 7281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch bool m_hasBeenUndone; 7381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}; 7481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 7581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 7681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochSpellingCorrectionCommand::SpellingCorrectionCommand(PassRefPtr<Range> rangeToBeCorrected, const String& correction) 7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch : CompositeEditCommand(rangeToBeCorrected->startContainer()->document()) 7881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_rangeToBeCorrected(rangeToBeCorrected) 7981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_selectionToBeCorrected(m_rangeToBeCorrected.get()) 8081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch , m_correction(correction) 8181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 8281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 8381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid SpellingCorrectionCommand::doApply() 8581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch m_corrected = plainText(m_rangeToBeCorrected.get()); 8781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!m_corrected.length()) 8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!document()->frame()->selection()->shouldChangeSelection(m_selectionToBeCorrected)) 9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch RefPtr<DocumentFragment> fragment = createFragmentFromText(m_rangeToBeCorrected.get(), m_correction); 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!fragment) 9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return; 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch applyCommandToComposite(SetSelectionCommand::create(m_selectionToBeCorrected, SelectionController::SpellCorrectionTriggered | SelectionController::CloseTyping | SelectionController::ClearTypingStyle)); 9881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if SUPPORT_AUTOCORRECTION_PANEL 9981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch applyCommandToComposite(SpellingCorrectionRecordUndoCommand::create(document(), m_corrected, m_correction)); 10081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#endif 10181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch applyCommandToComposite(ReplaceSelectionCommand::create(document(), fragment, ReplaceSelectionCommand::MatchStyle | ReplaceSelectionCommand::PreventNesting, EditActionPaste)); 10281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 10381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochbool SpellingCorrectionCommand::shouldRetainAutocorrectionIndicator() const 10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{ 10681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return true; 10781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} 10881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 10981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch} // namespace WebCore 110