Ignore:
Timestamp:
Dec 25, 2009, 12:21:47 AM (16 years ago)
Author:
Dmitry A. Kuminov
Message:

gui: More DnD code typed in.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gui/kernel/qmime.h

    r347 r439  
    111111
    112112/*
    113   Encapsulation of conversion between MIME and OS/2 PM clipboard.
     113  Encapsulation of conversion between MIME and OS/2 PM clipboard formats and
     114  between MIME and Direct Manipulation (DND) objects.
    114115*/
    115116
    116117typedef unsigned long ULONG;
     118
     119class QPMCoopDragWorker;
    117120
    118121class Q_GUI_EXPORT QPMMime
    119122{
    120123public:
     124
     125#if !defined(QT_NO_DRAGANDDROP)
     126
     127    class DragWorker
     128    {
     129    public:
     130        DragWorker() : data(0) {}
     131        virtual ~DragWorker() {}
     132
     133        const QMimeData *source() const { return src; }
     134
     135        virtual void init() {}
     136        // methods always implemented
     137        virtual bool cleanup( bool isCancelled) = 0;
     138        virtual bool isExclusive() const = 0;
     139        virtual ULONG itemCount() const = 0;
     140        virtual HWND hwnd() const = 0;
     141        // methods implemented if isExclusive() == TRUE and itemCount() == 0
     142        virtual DRAGINFO *createDragInfo(const char *name, USHORT supportedOps)
     143                                        { return NULL; }
     144        // methods implemented if itemCount() >= 0
     145        virtual QByteArray composeFormatString() { return QByteArray(); }
     146        virtual bool prepare(const char *drm, const char *drf, DRAGITEM *item,
     147                             ULONG itemIndex) { return FALSE; }
     148        virtual void defaultFileType(const char *&type, const char *&ext) {};
     149
     150    private:
     151        const QMimeData *src;
     152        friend class QPMCoopDragWorker;
     153        friend class QDragManager;
     154    };
     155
     156    class DefaultDragWorker : public DragWorker, public QPMObjectWindow
     157    {
     158    private:
     159        DefaultDragWorker(bool exclusive);
     160    public:
     161        virtual ~DefaultDragWorker();
     162
     163        // DragpWorker interface
     164        bool cleanup(bool isCancelled);
     165        bool isExclusive() const;
     166        ULONG itemCount() const;
     167        HWND hwnd() const { return QPMObjectWindow::hwnd(); }
     168        QByteArray composeFormatString();
     169        bool prepare(const char *drm, const char *drf, DRAGITEM *item,
     170                     ULONG itemIndex);
     171        void defaultFileType(const char *&type, const char *&ext);
     172
     173        // QPMObjectWindow interface
     174        MRESULT message(ULONG msg, MPARAM mp1, MPARAM mp2);
     175
     176        class Provider
     177        {
     178        public:
     179            virtual const char *format( const char *drf ) const = 0;
     180            virtual bool provide(const char *drf, const QByteArray &allData,
     181                                 ULONG itemIndex, QByteArray &itemData) = 0;
     182            virtual void fileType(const char *drf, const char *&type,
     183                                  const char *&ext) {};
     184        };
     185
     186        bool addProvider(const char *drf, Provider *provider,
     187                         ULONG itemCount = 1);
     188
     189        static bool canRender(const char *drm);
     190
     191    private:
     192        struct Data;
     193        Data *d;
     194        friend class QPMMime;
     195    };
     196
     197    class DropWorker
     198    {
     199    public:
     200        DropWorker() : nfo(0) {}
     201        virtual ~DropWorker() {}
     202
     203        DRAGINFO *info() const { return nfo; }
     204
     205        virtual void init() {}
     206        virtual void cleanup(bool isAccepted, bool isActAccepted) {}
     207        virtual bool isExclusive() const = 0;
     208
     209        virtual bool hasFormat(const QString &mimeType) const = 0;
     210        virtual QStringList formats() const = 0;
     211        virtual QVariant retrieveData(const QString &mimeType, QVariant::Type type) const = 0;
     212
     213    private:
     214        DRAGINFO *nfo;
     215        friend class QPMDragData;
     216    };
     217
     218    class DefaultDropWorker : public DropWorker, public QPMObjectWindow
     219    {
     220    private:
     221        DefaultDropWorker();
     222    public:
     223        virtual ~DefaultDropWorker();
     224
     225        // DropWorker interface
     226        void cleanup(bool isAccepted, bool isActAccepted);
     227        bool isExclusive() const;
     228        bool hasFormat(const QString &mimeType) const;
     229        QStringList formats() const;
     230        QVariant retrieveData(const QString &mimeType, QVariant::Type type) const;
     231
     232        // QPMObjectWindow interface
     233        MRESULT message(ULONG msg, MPARAM mp1, MPARAM mp2);
     234
     235        class Provider
     236        {
     237        public:
     238            virtual const char *drf(const QString &mimeType) const = 0;
     239            virtual bool provide(const QString &mimeType, ULONG itemIndex,
     240                                 const QByteArray &itemData,
     241                                 QByteArray &allData) = 0;
     242        };
     243
     244        bool addProvider(const QString &mimeType, Provider *provider);
     245        bool addExclusiveProvider(const QString &mimeType, Provider *provider);
     246
     247        static bool canRender(DRAGITEM *item, const char *drf );
     248        static bool getSupportedRMFs(DRAGITEM *item, QPtrList<QStrList> &list);
     249
     250    private:
     251        struct Data;
     252        Data *d;
     253        friend class QPMMime;
     254    };
     255
     256#endif // !QT_NO_DRAGANDDROP
     257
    121258    QPMMime();
    122259    virtual ~QPMMime();
     
    139276                                       QVariant::Type preferredType) const = 0;
    140277
     278#if !defined(QT_NO_DRAGANDDROP)
     279    // Direct Manipulation (DND) converter interface
     280    virtual DragWorker *dragWorkerFor(const QString &mimeType,
     281                                      QMimeData *mimeData) { return 0; }
     282    virtual DropWorker *dropWorkerFor(DRAGINFO *info) { return 0; }
     283#endif // !QT_NO_DRAGANDDROP
     284
    141285protected:
    142286
     
    148292
    149293    static QString formatName(ULONG format);
     294
     295#if !defined(QT_NO_DRAGANDDROP)
     296    static QByteArray queryHSTR(HSTR hstr);
     297    static QByteArray querySourceNameFull(DRAGITEM *item);
     298    static bool canTargetRenderAsOS2File(DRAGITEM *item, QByteArray *fullName = 0);
     299    static bool parseRMFs(HSTR rmfs, QList<QList<QByteArray> > &list);
     300    static bool parseRMF(HSTR rmf, QByteArray &mechanism, QByteArray &format);
     301
     302    static DefaultDragWorker *defaultCoopDragWorker();
     303    static DefaultDragWorker *defaultExclDragWorker();
     304    static DefaultDropWorker *defaultDropWorker();
     305#endif // !QT_NO_DRAGANDDROP
    150306
    151307private:
Note: See TracChangeset for help on using the changeset viewer.