DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (5b81998bb7ab)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef _NSDATAOBJCOLLECTION_H_
#define _NSDATAOBJCOLLECTION_H_

#include <oleidl.h>

#include "nsString.h"
#include "nsTArray.h"
#include "nsAutoPtr.h"
#include "nsDataObj.h"
#include "mozilla/Attributes.h"

class CEnumFormatEtc;

#define MULTI_MIME "Mozilla/IDataObjectCollectionFormat"

EXTERN_C const IID IID_IDataObjCollection;

// An interface to make sure we have the right kind of object for D&D
// this way we can filter out collection objects that aren't ours
class nsIDataObjCollection : public IUnknown {
public:
  
};

/*
 * This ole registered class is used to facilitate drag-drop of objects which
 * can be adapted by an object derived from CfDragDrop. The CfDragDrop is
 * associated with instances via SetDragDrop().
 */
 
class nsDataObjCollection MOZ_FINAL : public nsIDataObjCollection, public nsDataObj
{
  public:
    nsDataObjCollection();
    ~nsDataObjCollection();

  public: // IUnknown methods - see iunknown.h for documentation
    STDMETHODIMP_(ULONG) AddRef        ();
    STDMETHODIMP       QueryInterface(REFIID, void**);
    STDMETHODIMP_(ULONG) Release       ();

  public: // DataGet and DataSet helper methods
    virtual HRESULT AddSetFormat(FORMATETC&  FE);
    virtual HRESULT AddGetFormat(FORMATETC&  FE);

    virtual HRESULT GetFile(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
    virtual HRESULT GetText(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
    virtual HRESULT GetFileDescriptors(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
    virtual HRESULT GetFileContents(LPFORMATETC pFE, LPSTGMEDIUM pSTM);
    virtual HRESULT GetFirstSupporting(LPFORMATETC pFE, LPSTGMEDIUM pSTM);

    // support for clipboard
    void AddDataFlavor(const char * aDataFlavor, LPFORMATETC aFE);

    // from nsPIDataObjCollection
    void AddDataObject(IDataObject * aDataObj);
    int32_t GetNumDataObjects() { return mDataObjects.Length(); }
    nsDataObj* GetDataObjectAt(uint32_t aItem)
            { return mDataObjects.SafeElementAt(aItem, nsRefPtr<nsDataObj>()); }

    // Return the registered OLE class ID of this object's CfDataObj.
    CLSID GetClassID() const;

  public:
    // Store data in pSTM according to the format specified by pFE, if the
    // format is supported (supported formats are specified in CfDragDrop::
    // GetFormats) and return NOERROR; otherwise return DATA_E_FORMATETC. It
    // is the callers responsibility to free pSTM if NOERROR is returned.
    STDMETHODIMP GetData  (LPFORMATETC pFE, LPSTGMEDIUM pSTM);

    // Similar to GetData except that the caller allocates the structure
    // referenced by pSTM.
    STDMETHODIMP GetDataHere (LPFORMATETC pFE, LPSTGMEDIUM pSTM);

    // Returns S_TRUE if this object supports the format specified by pSTM,
    // S_FALSE otherwise.
    STDMETHODIMP QueryGetData (LPFORMATETC pFE);

    // Set pCanonFE to the canonical format of pFE if one exists and return
    // NOERROR, otherwise return DATA_S_SAMEFORMATETC. A canonical format
    // implies an identical rendering.
    STDMETHODIMP GetCanonicalFormatEtc (LPFORMATETC pFE, LPFORMATETC pCanonFE);

    // Set this objects data according to the format specified by pFE and
    // the storage medium specified by pSTM and return NOERROR, if the format
    // is supported. If release is TRUE this object must release the storage
    // associated with pSTM.
    STDMETHODIMP SetData  (LPFORMATETC pFE, LPSTGMEDIUM pSTM, BOOL release);

    // Set ppEnum to an IEnumFORMATETC object which will iterate all of the
    // data formats that this object supports. direction is either DATADIR_GET
    // or DATADIR_SET.
    STDMETHODIMP EnumFormatEtc  (DWORD direction, LPENUMFORMATETC* ppEnum);

    // Set up an advisory connection to this object based on the format specified
    // by pFE, flags, and the pAdvise. Set pConn to the established advise
    // connection.
    STDMETHODIMP DAdvise  (LPFORMATETC pFE, DWORD flags, LPADVISESINK pAdvise,
                   DWORD* pConn);

    // Turn off advising of a previous call to DAdvise which set pConn.
    STDMETHODIMP DUnadvise (DWORD pConn);

    // Set ppEnum to an IEnumSTATDATA object which will iterate over the
    // existing objects which have established advisory connections to this
      // object.
    STDMETHODIMP EnumDAdvise (LPENUMSTATDATA *ppEnum);

  public:
    // Set the adapter to dragDrop 
    //void SetDragDrop(CfDragDrop& dragDrop);

    // Return the adapter
    //CfDragDrop& GetDragDrop() const;

  protected:
    BOOL FormatsMatch(const FORMATETC& source, const FORMATETC& target) const;

    ULONG m_cRef;              // the reference count

    // nsDataObjCollection owns and ref counts CEnumFormatEtc
    CEnumFormatEtc   * m_enumFE;

    nsTArray<nsRefPtr<nsDataObj> > mDataObjects;
    
    BOOL mIsAsyncMode;
    BOOL mIsInOperation;
};

#endif  //