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