/*
 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
 * Copyright (C) 2007, Holger Hans Peter Freyther
 * Copyright (C) 2011, 2012 Collabora Ltd.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2.1
 *  of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free
 *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 *  Boston, MA 02110-1301 USA
 */

#ifndef ClipboardClutter_h
#define ClipboardClutter_h

#include "CachedImageClient.h"
#include "Clipboard.h"
#include "DataObjectClutter.h"

namespace WebCore {
    class CachedImage;
    class Frame;

    class ClipboardClutter : public Clipboard, public CachedImageClient {
        WTF_MAKE_FAST_ALLOCATED;
    public:
        static PassRefPtr<ClipboardClutter> create(ClipboardAccessPolicy policy, Frame* frame)
        {
            return adoptRef(new ClipboardClutter(policy, frame));
        }

        static PassRefPtr<ClipboardClutter> create(ClipboardAccessPolicy policy, PassRefPtr<DataObjectClutter> dataObject, ClipboardType clipboardType, Frame* frame)
        {
            return adoptRef(new ClipboardClutter(policy, dataObject, clipboardType, frame));
        }
        virtual ~ClipboardClutter();

        void clearData(const String&);
        void clearAllData();
        String getData(const String&) const;
        bool setData(const String&, const String&);

        virtual ListHashSet<String> types() const;
        virtual PassRefPtr<FileList> files() const;

        void setDragImage(CachedImage*, const IntPoint&);
        void setDragImageElement(Node*, const IntPoint&);
        void setDragImage(CachedImage*, Node*, const IntPoint&);

        virtual DragImageRef createDragImage(IntPoint&) const;
        virtual void declareAndWriteDragImage(Element*, const KURL&, const String&, Frame*);
        virtual void writeURL(const KURL&, const String&, Frame*);
        virtual void writeRange(Range*, Frame*);
        virtual void writePlainText(const String&);

        virtual bool hasData();

        PassRefPtr<DataObjectClutter> dataObject() { return m_dataObject; }

    private:
        ClipboardClutter(ClipboardAccessPolicy, Frame*);
        ClipboardClutter(ClipboardAccessPolicy, PassRefPtr<DataObjectClutter>, ClipboardType, Frame*);

        RefPtr<DataObjectClutter> m_dataObject;
        Frame* m_frame;
    };
}

#endif
