/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWebEngine module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef UI_DELEGATES_MANAGER_H
#define UI_DELEGATES_MANAGER_H

#include "api/qquickwebengineaction_p.h"
#include "qglobal.h"
#include "web_contents_adapter.h"
#include "web_contents_adapter_client.h"

#include <QCoreApplication>
#include <QExplicitlySharedDataPointer>
#include <QPoint>
#include <QSharedPointer>

#define FOR_EACH_COMPONENT_TYPE(F, SEPARATOR) \
    F(Menu, menu) SEPARATOR \
    F(MenuItem, menuItem) SEPARATOR \
    F(MenuSeparator, menuSeparator) SEPARATOR \
    F(AlertDialog, alertDialog) SEPARATOR \
    F(ColorDialog, colorDialog) SEPARATOR \
    F(ConfirmDialog, confirmDialog) SEPARATOR \
    F(PromptDialog, promptDialog) SEPARATOR \
    F(FilePicker, filePicker) SEPARATOR \
    F(AuthenticationDialog, authenticationDialog) SEPARATOR \
    F(ToolTip, toolTip) SEPARATOR \
    F(TouchHandle, touchHandle) SEPARATOR \
    F(TouchSelectionMenu, touchSelectionMenu) SEPARATOR \

#define COMMA_SEPARATOR ,
#define SEMICOLON_SEPARATOR ;
#define ENUM_DECLARATION(TYPE, COMPONENT) \
    TYPE
#define MEMBER_DECLARATION(TYPE, COMPONENT) \
    QQmlComponent *COMPONENT##Component

QT_BEGIN_NAMESPACE
class QQmlContext;
class QQmlComponent;
class QQuickItem;
class QQuickWebEngineView;
class QQmlEngine;
QT_END_NAMESPACE

namespace QtWebEngineCore {
class AuthenticationDialogController;
class JavaScriptDialogController;
class FilePickerController;
class TouchSelectionMenuController;

const char *defaultPropertyName(QObject *obj);

class UIDelegatesManager
{
    Q_DECLARE_TR_FUNCTIONS(UIDelegatesManager)
public:
    enum ComponentType {
        Invalid = -1,
        FOR_EACH_COMPONENT_TYPE(ENUM_DECLARATION, COMMA_SEPARATOR)
        ComponentTypeCount
    };

    UIDelegatesManager(QQuickWebEngineView *);
    virtual ~UIDelegatesManager();

    virtual bool initializeImportDirs(QStringList &dirs, QQmlEngine *engine);
    virtual void addMenuItem(QQuickWebEngineAction *action, QObject *menu,
                             bool checkable = false, bool checked = true);
    void addMenuSeparator(QObject *menu);
    virtual QObject *addMenu(QObject *parentMenu, const QString &title,
                             const QPoint &pos = QPoint());
    QQmlContext *creationContextForComponent(QQmlComponent *);
    void showColorDialog(QSharedPointer<ColorChooserController>);
    void showDialog(QSharedPointer<JavaScriptDialogController>);
    void showDialog(QSharedPointer<AuthenticationDialogController>);
    void showFilePicker(QSharedPointer<FilePickerController>);
    virtual void showMenu(QObject *menu);
    void showToolTip(const QString &text);
    QQuickItem *createTouchHandle();
    void showTouchSelectionMenu(TouchSelectionMenuController *, const QRect &, const int spacing);
    void hideTouchSelectionMenu();

protected:
    bool ensureComponentLoaded(ComponentType);

    QQuickWebEngineView *m_view;
    QScopedPointer<QObject> m_toolTip;
    QStringList m_importDirs;
    QScopedPointer<QObject> m_touchSelectionMenu;

    FOR_EACH_COMPONENT_TYPE(MEMBER_DECLARATION, SEMICOLON_SEPARATOR)

    Q_DISABLE_COPY(UIDelegatesManager)

};

// delegate manager for qtquickcontrols2 with fallback to qtquickcontrols1

class UI2DelegatesManager : public UIDelegatesManager
{
public:
    UI2DelegatesManager(QQuickWebEngineView *);
    bool initializeImportDirs(QStringList &dirs, QQmlEngine *engine) override;
    QObject *addMenu(QObject *parentMenu, const QString &title,
                     const QPoint &pos = QPoint()) override;
    void addMenuItem(QQuickWebEngineAction *action, QObject *menu,
                     bool checkable = false, bool checked = false) override;
    void showMenu(QObject *menu) override;
    Q_DISABLE_COPY(UI2DelegatesManager)

};

} // namespace QtWebEngineCore

#endif // UI_DELEGATES_MANAGER_H
