/****************************************************************************
 **
 ** Copyright (C) 2016 Ivan Vizir <define-true-false@yandex.com>
 ** Copyright (C) 2016 The Qt Company Ltd.
 ** Contact: https://www.qt.io/licensing/
 **
 ** This file is part of the QtWinExtras 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 QWINJUMPLIST_P_H
#define QWINJUMPLIST_P_H

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists purely as an
// implementation detail.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//

#include "qwinjumplist.h"
#include "winshobjidl_p.h"

QT_BEGIN_NAMESPACE

class QWinJumpListPrivate
{
    Q_DECLARE_PUBLIC(QWinJumpList)

public:
    static QWinJumpListPrivate *get(QWinJumpList *list)
    {
        return list->d_func();
    }

    static void warning(const char *function, HRESULT hresult);
    static QString iconsDirPath();

    void invalidate();
    void _q_rebuild();
    void destroy();

    bool beginList();
    bool commitList();

    void appendKnownCategory(KNOWNDESTCATEGORY category);
    void appendCustomCategory(QWinJumpListCategory *category);
    void appendTasks(const QList<QWinJumpListItem *> &items);

    static QList<QWinJumpListItem *> fromComCollection(IObjectArray *array);
    static IObjectCollection *toComCollection(const QList<QWinJumpListItem *> &list);
    static QWinJumpListItem *fromIShellLink(IShellLinkW *link);
    static QWinJumpListItem *fromIShellItem(IShellItem2 *shellitem);
    static IUnknown *toICustomDestinationListItem(const QWinJumpListItem *item);
    static IShellLinkW *toIShellLink(const QWinJumpListItem *item);
    static IShellItem2 *toIShellItem(const QWinJumpListItem *item);
    static IShellLinkW *makeSeparatorShellItem();

    QWinJumpList *q_ptr = nullptr;
    ICustomDestinationList *pDestList = nullptr;
    QWinJumpListCategory *recent = nullptr;
    QWinJumpListCategory *frequent = nullptr;
    QWinJumpListCategory *tasks = nullptr;
    QList<QWinJumpListCategory *> categories;
    QString identifier;
    bool dirty = false;
};

QT_END_NAMESPACE

#endif // QWINJUMPLIST_P_H
