#pragma once

#include "DockManager.h"

#include <QAction>
#include <QMap>

namespace QtAdsUtl
{

class DockInDockWidget;
class DockInDockManager : public ads::CDockManager
{
    Q_OBJECT

    typedef ads::CDockManager baseClass;

public:
    DockInDockManager( DockInDockWidget& parent );
    ~DockInDockManager() override; 

    void fillViewMenu( QMenu* menu, const std::vector<DockInDockManager*>& moveTo );
    void fillMoveMenu( QMenu* menu, const std::vector<DockInDockManager*>& moveTo );

    void addPerspectiveRec( const QString& name );
    void openPerspectiveRec( const QString& name );
    void removePerspectivesRec();
    void loadPerspectivesRec(QSettings& Settings);
    void savePerspectivesRec(QSettings& Settings) const;

    static DockInDockManager* dockInAManager( ads::CDockWidget* widget );

    inline DockInDockWidget& parent() { return m_parent; }

    void childManagers( std::vector<DockInDockManager*>& managers, bool rec ) const;
    std::vector<DockInDockManager*> allManagers( bool includeThis, bool rec ) const;
    std::vector<std::pair<DockInDockManager*,ads::CDockWidget*>> allDockWidgets( bool includeThis, bool rec ) const;

    QString getGroupName();
    QString getPersistGroupName();
    static QString getGroupNameFromPersistGroupName( QString persistGroupName );

    QMap<QString,QStringList> getGroupContents();

    ads::CDockAreaWidget* getInsertDefaultPos();

    std::vector<ads::CDockWidget*> getWidgetsInGUIOrder() const;

private:
    DockInDockWidget& m_parent;
};

class CreateChildDockAction : public QAction
{
    Q_OBJECT
public:
    CreateChildDockAction( DockInDockWidget& dockInDock, QMenu* menu );

public slots:
    void createGroup();

private:
    DockInDockWidget& m_dockInDock;
};

class DestroyGroupAction : public QAction
{
    Q_OBJECT
public:
    DestroyGroupAction( DockInDockWidget* widget, QMenu* menu );

public slots:
    void destroyGroup();

private:
    DockInDockWidget* m_widget;
};

class MoveDockWidgetAction : public QAction
{
    Q_OBJECT
public:
    MoveDockWidgetAction( ads::CDockWidget* widget, DockInDockManager* moveTo, QMenu* menu );

    static void move( ads::CDockWidget* widget, DockInDockManager* moveTo );

public slots:
    void move();

private:
    ads::CDockWidget* m_widget;
    DockInDockManager* m_moveTo;
};

}