/*
 * Copyright (C) 2010-2020 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "config.h"
#include "ContextMenuItem.h"

#include "ContextMenu.h"

#if ENABLE(CONTEXT_MENUS)

namespace WebCore {

ContextMenuItem::ContextMenuItem(ContextMenuItemType type, ContextMenuAction action, const String& title, ContextMenu* subMenu)
    : m_type(type)
    , m_action(action)
    , m_title(title)
    , m_enabled(true)
    , m_checked(false)
    , m_indentationLevel(0)
{
    if (subMenu)
        setSubMenu(subMenu);
}

ContextMenuItem::ContextMenuItem(ContextMenuItemType type, ContextMenuAction action, const String& title, bool enabled, bool checked, unsigned indentationLevel)
    : m_type(type)
    , m_action(action)
    , m_title(title)
    , m_enabled(enabled)
    , m_checked(checked)
    , m_indentationLevel(indentationLevel)
{
}
        
ContextMenuItem::ContextMenuItem(ContextMenuAction action, const String& title, bool enabled, bool checked, const Vector<ContextMenuItem>& subMenuItems, unsigned indentationLevel)
    : m_type(SubmenuType)
    , m_action(action)
    , m_title(title)
    , m_enabled(enabled)
    , m_checked(checked)
    , m_indentationLevel(indentationLevel)
    , m_subMenuItems(subMenuItems)
{
}

ContextMenuItem::ContextMenuItem()
    : m_type(SeparatorType)
    , m_action(ContextMenuItemTagNoAction)
    , m_enabled(false)
    , m_checked(false)
    , m_indentationLevel(0)
{
}

ContextMenuItem::~ContextMenuItem() = default;

bool ContextMenuItem::isNull() const
{
    // FIXME: This is a bit of a hack. Cross-platform ContextMenuItem users need a concrete way to track "isNull".
    return m_action == ContextMenuItemTagNoAction && m_title.isNull() && m_subMenuItems.isEmpty();
}

void ContextMenuItem::setSubMenu(ContextMenu* subMenu)
{
    if (subMenu) {
        m_type = SubmenuType;
        m_subMenuItems = subMenu->items();
    } else {
        m_type = ActionType;
        m_subMenuItems.clear();
    }
}

void ContextMenuItem::setType(ContextMenuItemType type)
{
    m_type = type;
}

ContextMenuItemType ContextMenuItem::type() const
{
    return m_type;
}

void ContextMenuItem::setAction(ContextMenuAction action)
{
    m_action = action;
}

ContextMenuAction ContextMenuItem::action() const
{
    return m_action;
}

void ContextMenuItem::setIndentationLevel(unsigned indentationLevel)
{
    m_indentationLevel = indentationLevel;
}

unsigned ContextMenuItem::indentationLevel() const
{
    return m_indentationLevel;
}

void ContextMenuItem::setChecked(bool checked)
{
    m_checked = checked;
}

bool ContextMenuItem::checked() const
{
    return m_checked;
}

void ContextMenuItem::setEnabled(bool enabled)
{
    m_enabled = enabled;
}

bool ContextMenuItem::enabled() const
{
    return m_enabled;
}

bool isValidContextMenuAction(ContextMenuAction action)
{
    switch (action) {
    case ContextMenuAction::ContextMenuItemTagNoAction:
    case ContextMenuAction::ContextMenuItemTagOpenLinkInNewWindow:
    case ContextMenuAction::ContextMenuItemTagDownloadLinkToDisk:
    case ContextMenuAction::ContextMenuItemTagCopyLinkToClipboard:
    case ContextMenuAction::ContextMenuItemTagOpenImageInNewWindow:
    case ContextMenuAction::ContextMenuItemTagDownloadImageToDisk:
    case ContextMenuAction::ContextMenuItemTagCopyImageToClipboard:
#if PLATFORM(GTK)
    case ContextMenuAction::ContextMenuItemTagCopyImageUrlToClipboard:
#endif
    case ContextMenuAction::ContextMenuItemTagOpenFrameInNewWindow:
    case ContextMenuAction::ContextMenuItemTagCopy:
    case ContextMenuAction::ContextMenuItemTagGoBack:
    case ContextMenuAction::ContextMenuItemTagGoForward:
    case ContextMenuAction::ContextMenuItemTagStop:
    case ContextMenuAction::ContextMenuItemTagReload:
    case ContextMenuAction::ContextMenuItemTagCut:
    case ContextMenuAction::ContextMenuItemTagPaste:
#if PLATFORM(GTK)
    case ContextMenuAction::ContextMenuItemTagPasteAsPlainText:
    case ContextMenuAction::ContextMenuItemTagDelete:
    case ContextMenuAction::ContextMenuItemTagSelectAll:
    case ContextMenuAction::ContextMenuItemTagInputMethods:
    case ContextMenuAction::ContextMenuItemTagUnicode:
    case ContextMenuAction::ContextMenuItemTagUnicodeInsertLRMMark:
    case ContextMenuAction::ContextMenuItemTagUnicodeInsertRLMMark:
    case ContextMenuAction::ContextMenuItemTagUnicodeInsertLREMark:
    case ContextMenuAction::ContextMenuItemTagUnicodeInsertRLEMark:
    case ContextMenuAction::ContextMenuItemTagUnicodeInsertLROMark:
    case ContextMenuAction::ContextMenuItemTagUnicodeInsertRLOMark:
    case ContextMenuAction::ContextMenuItemTagUnicodeInsertPDFMark:
    case ContextMenuAction::ContextMenuItemTagUnicodeInsertZWSMark:
    case ContextMenuAction::ContextMenuItemTagUnicodeInsertZWJMark:
    case ContextMenuAction::ContextMenuItemTagUnicodeInsertZWNJMark:
    case ContextMenuAction::ContextMenuItemTagInsertEmoji:
#endif
    case ContextMenuAction::ContextMenuItemTagSpellingGuess:
    case ContextMenuAction::ContextMenuItemTagNoGuessesFound:
    case ContextMenuAction::ContextMenuItemTagIgnoreSpelling:
    case ContextMenuAction::ContextMenuItemTagLearnSpelling:
    case ContextMenuAction::ContextMenuItemTagOther:
    case ContextMenuAction::ContextMenuItemTagSearchInSpotlight:
    case ContextMenuAction::ContextMenuItemTagSearchWeb:
    case ContextMenuAction::ContextMenuItemTagLookUpInDictionary:
    case ContextMenuAction::ContextMenuItemTagOpenWithDefaultApplication:
    case ContextMenuAction::ContextMenuItemPDFActualSize:
    case ContextMenuAction::ContextMenuItemPDFZoomIn:
    case ContextMenuAction::ContextMenuItemPDFZoomOut:
    case ContextMenuAction::ContextMenuItemPDFAutoSize:
    case ContextMenuAction::ContextMenuItemPDFSinglePage:
    case ContextMenuAction::ContextMenuItemPDFFacingPages:
    case ContextMenuAction::ContextMenuItemPDFContinuous:
    case ContextMenuAction::ContextMenuItemPDFNextPage:
    case ContextMenuAction::ContextMenuItemPDFPreviousPage:
    case ContextMenuAction::ContextMenuItemTagOpenLink:
    case ContextMenuAction::ContextMenuItemTagIgnoreGrammar:
    case ContextMenuAction::ContextMenuItemTagSpellingMenu:
    case ContextMenuAction::ContextMenuItemTagShowSpellingPanel:
    case ContextMenuAction::ContextMenuItemTagCheckSpelling:
    case ContextMenuAction::ContextMenuItemTagCheckSpellingWhileTyping:
    case ContextMenuAction::ContextMenuItemTagCheckGrammarWithSpelling:
    case ContextMenuAction::ContextMenuItemTagFontMenu:
    case ContextMenuAction::ContextMenuItemTagShowFonts:
    case ContextMenuAction::ContextMenuItemTagBold:
    case ContextMenuAction::ContextMenuItemTagItalic:
    case ContextMenuAction::ContextMenuItemTagUnderline:
    case ContextMenuAction::ContextMenuItemTagOutline:
    case ContextMenuAction::ContextMenuItemTagStyles:
    case ContextMenuAction::ContextMenuItemTagShowColors:
    case ContextMenuAction::ContextMenuItemTagSpeechMenu:
    case ContextMenuAction::ContextMenuItemTagStartSpeaking:
    case ContextMenuAction::ContextMenuItemTagStopSpeaking:
    case ContextMenuAction::ContextMenuItemTagWritingDirectionMenu:
    case ContextMenuAction::ContextMenuItemTagDefaultDirection:
    case ContextMenuAction::ContextMenuItemTagLeftToRight:
    case ContextMenuAction::ContextMenuItemTagRightToLeft:
    case ContextMenuAction::ContextMenuItemTagPDFSinglePageScrolling:
    case ContextMenuAction::ContextMenuItemTagPDFFacingPagesScrolling:
    case ContextMenuAction::ContextMenuItemTagInspectElement:
    case ContextMenuAction::ContextMenuItemTagTextDirectionMenu:
    case ContextMenuAction::ContextMenuItemTagTextDirectionDefault:
    case ContextMenuAction::ContextMenuItemTagTextDirectionLeftToRight:
    case ContextMenuAction::ContextMenuItemTagTextDirectionRightToLeft:
    case ContextMenuAction::ContextMenuItemTagAddHighlightToCurrentQuickNote:
    case ContextMenuAction::ContextMenuItemTagAddHighlightToNewQuickNote:
#if PLATFORM(COCOA)
    case ContextMenuAction::ContextMenuItemTagCorrectSpellingAutomatically:
    case ContextMenuAction::ContextMenuItemTagSubstitutionsMenu:
    case ContextMenuAction::ContextMenuItemTagShowSubstitutions:
    case ContextMenuAction::ContextMenuItemTagSmartCopyPaste:
    case ContextMenuAction::ContextMenuItemTagSmartQuotes:
    case ContextMenuAction::ContextMenuItemTagSmartDashes:
    case ContextMenuAction::ContextMenuItemTagSmartLinks:
    case ContextMenuAction::ContextMenuItemTagTextReplacement:
    case ContextMenuAction::ContextMenuItemTagTransformationsMenu:
    case ContextMenuAction::ContextMenuItemTagMakeUpperCase:
    case ContextMenuAction::ContextMenuItemTagMakeLowerCase:
    case ContextMenuAction::ContextMenuItemTagCapitalize:
    case ContextMenuAction::ContextMenuItemTagChangeBack:
#endif
    case ContextMenuAction::ContextMenuItemTagOpenMediaInNewWindow:
    case ContextMenuAction::ContextMenuItemTagDownloadMediaToDisk:
    case ContextMenuAction::ContextMenuItemTagCopyMediaLinkToClipboard:
    case ContextMenuAction::ContextMenuItemTagToggleMediaControls:
    case ContextMenuAction::ContextMenuItemTagToggleMediaLoop:
    case ContextMenuAction::ContextMenuItemTagEnterVideoFullscreen:
    case ContextMenuAction::ContextMenuItemTagMediaPlayPause:
    case ContextMenuAction::ContextMenuItemTagMediaMute:
    case ContextMenuAction::ContextMenuItemTagDictationAlternative:
    case ContextMenuAction::ContextMenuItemTagToggleVideoFullscreen:
    case ContextMenuAction::ContextMenuItemTagShareMenu:
    case ContextMenuAction::ContextMenuItemTagToggleVideoEnhancedFullscreen:
    case ContextMenuAction::ContextMenuItemTagQuickLookImage:
    case ContextMenuAction::ContextMenuItemTagTranslate:
    case ContextMenuAction::ContextMenuItemBaseCustomTag:
    case ContextMenuAction::ContextMenuItemLastCustomTag:
    case ContextMenuAction::ContextMenuItemBaseApplicationTag:
        return true;
    }

    if (action > ContextMenuAction::ContextMenuItemBaseCustomTag && action < ContextMenuAction::ContextMenuItemLastCustomTag)
        return true;

    if (action > ContextMenuAction::ContextMenuItemBaseApplicationTag)
        return true;

    return false;
}

} // namespace WebCore

#endif // ENABLE(CONTEXT_MENUS)
