Ignore:
Timestamp:
Jun 2, 2002, 9:34:36 PM (23 years ago)
Author:
sandervl
Message:

added ole drag and drop (wps -> odin app) support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/ole32/ole2.c

    r8441 r8553  
    5757  HWND          hwndTarget;
    5858  IDropTarget*    dropTarget;
     59#ifdef __WIN32OS2__
     60  BOOL          fDragEnter;
     61  DWORD         dwEffect;
     62  IDataObject * pDataObject;
     63  HDROP         hDrop;
     64#endif
    5965  struct tagDropTargetNode* prevDropTarget;
    6066  struct tagDropTargetNode* nextDropTarget;
     
    22182224  }
    22192225}
     2226#ifdef __WIN32OS2__
     2227#include <dbglog.h>
     2228
     2229/***********************************************************************
     2230*   IEnumFORMATETC implementation
     2231*/
     2232
     2233typedef struct
     2234{
     2235    /* IUnknown fields */
     2236    ICOM_VFIELD(IEnumFORMATETC);
     2237    DWORD                        ref;
     2238    /* IEnumFORMATETC fields */
     2239    UINT        posFmt;
     2240    UINT        countFmt;
     2241    LPFORMATETC pFmt;
     2242} IEnumFORMATETCImpl;
     2243
     2244static HRESULT WINAPI IEnumFORMATETC_fnQueryInterface(LPENUMFORMATETC iface, REFIID riid, LPVOID* ppvObj);
     2245static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPENUMFORMATETC iface);
     2246static ULONG WINAPI IEnumFORMATETC_fnRelease(LPENUMFORMATETC iface);
     2247static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, FORMATETC* rgelt, ULONG* pceltFethed);
     2248static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt);
     2249static HRESULT WINAPI IEnumFORMATETC_fnReset(LPENUMFORMATETC iface);
     2250static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMATETC* ppenum);
     2251
     2252static struct ICOM_VTABLE(IEnumFORMATETC) efvt =
     2253{
     2254    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     2255    IEnumFORMATETC_fnQueryInterface,
     2256    IEnumFORMATETC_fnAddRef,
     2257    IEnumFORMATETC_fnRelease,
     2258    IEnumFORMATETC_fnNext,
     2259    IEnumFORMATETC_fnSkip,
     2260    IEnumFORMATETC_fnReset,
     2261    IEnumFORMATETC_fnClone
     2262};
     2263
     2264LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[])
     2265{
     2266        IEnumFORMATETCImpl* ef;
     2267        DWORD size=cfmt * sizeof(FORMATETC);
     2268       
     2269        ef=(IEnumFORMATETCImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IEnumFORMATETCImpl));
     2270
     2271        if(ef)
     2272        {
     2273          ef->ref=1;
     2274          ICOM_VTBL(ef)=&efvt;
     2275
     2276          ef->countFmt = cfmt;
     2277          ef->pFmt = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
     2278
     2279          if (ef->pFmt)
     2280          {
     2281            memcpy(ef->pFmt, afmt, size);
     2282          }
     2283        }
     2284
     2285        TRACE("(%p)->(%u,%p)\n",ef, cfmt, afmt);
     2286        return (LPENUMFORMATETC)ef;
     2287}
     2288
     2289static HRESULT WINAPI IEnumFORMATETC_fnQueryInterface(LPENUMFORMATETC iface, REFIID riid, LPVOID* ppvObj)
     2290{
     2291        ICOM_THIS(IEnumFORMATETCImpl,iface);
     2292        TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj);
     2293
     2294        *ppvObj = NULL;
     2295
     2296        if(IsEqualIID(riid, &IID_IUnknown))
     2297        {
     2298          *ppvObj = This;
     2299        }
     2300        else if(IsEqualIID(riid, &IID_IEnumFORMATETC))
     2301        {
     2302          *ppvObj = (IEnumFORMATETC*)This;
     2303        }   
     2304
     2305        if(*ppvObj)
     2306        {
     2307          IUnknown_AddRef((IUnknown*)(*ppvObj));
     2308          TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
     2309          return S_OK;
     2310        }
     2311        TRACE("-- Interface: E_NOINTERFACE\n");
     2312        return E_NOINTERFACE;
     2313
     2314}
     2315
     2316static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPENUMFORMATETC iface)
     2317{
     2318        ICOM_THIS(IEnumFORMATETCImpl,iface);
     2319        TRACE("(%p)->(count=%lu)\n",This, This->ref);
     2320        return ++(This->ref);
     2321}
     2322
     2323static ULONG WINAPI IEnumFORMATETC_fnRelease(LPENUMFORMATETC iface)
     2324{
     2325        ICOM_THIS(IEnumFORMATETCImpl,iface);
     2326        TRACE("(%p)->()\n",This);
     2327
     2328    if (!--(This->ref))
     2329        {
     2330          TRACE(" destroying IEnumFORMATETC(%p)\n",This);
     2331          if (This->pFmt)
     2332          {
     2333            HeapFree(GetProcessHeap(),0, This->pFmt);
     2334          }
     2335          HeapFree(GetProcessHeap(),0,This);
     2336          return 0;
     2337        }
     2338        return This->ref;
     2339}
     2340
     2341static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, FORMATETC *rgelt, ULONG *pceltFethed)
     2342{
     2343        ICOM_THIS(IEnumFORMATETCImpl,iface);
     2344        int i;
     2345
     2346        TRACE("(%p)->(%lu,%p)\n", This, celt, rgelt);
     2347
     2348        if(!This->pFmt)return S_FALSE;
     2349        if(!rgelt) return E_INVALIDARG;
     2350        if (pceltFethed)  *pceltFethed = 0;
     2351
     2352        for(i = 0; This->posFmt < This->countFmt && celt > i; i++)
     2353        {
     2354          *rgelt++ = This->pFmt[This->posFmt++];
     2355        }
     2356
     2357        if (pceltFethed) *pceltFethed = i;
     2358
     2359        return ((i == celt) ? S_OK : S_FALSE);
     2360}
     2361
     2362static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt)
     2363{
     2364        ICOM_THIS(IEnumFORMATETCImpl,iface);
     2365        TRACE("(%p)->(num=%lu)\n", This, celt);
     2366
     2367        if((This->posFmt + celt) >= This->countFmt) return S_FALSE;
     2368        This->posFmt += celt;
     2369        return S_OK;
     2370}
     2371
     2372static HRESULT WINAPI IEnumFORMATETC_fnReset(LPENUMFORMATETC iface)
     2373{
     2374        ICOM_THIS(IEnumFORMATETCImpl,iface);
     2375        TRACE("(%p)->()\n", This);
     2376
     2377    This->posFmt = 0;
     2378    return S_OK;
     2379}
     2380
     2381static HRESULT WINAPI IEnumFORMATETC_fnClone(LPENUMFORMATETC iface, LPENUMFORMATETC* ppenum)
     2382{
     2383        ICOM_THIS(IEnumFORMATETCImpl,iface);
     2384        TRACE("(%p)->(ppenum=%p)\n", This, ppenum);
     2385
     2386        if (!ppenum) return E_INVALIDARG;
     2387        *ppenum = IEnumFORMATETC_Constructor(This->countFmt, This->pFmt);
     2388        return S_OK;
     2389}
     2390
     2391/***********************************************************************
     2392*   IDataObject implementation
     2393*/
     2394
     2395
     2396typedef struct
     2397{
     2398        /* IUnknown fields */
     2399        ICOM_VFIELD(IDataObject);
     2400        DWORD           ref;
     2401
     2402        /* IDataObject fields */
     2403    LPFORMATETC pFormatEtc;
     2404    LPSTGMEDIUM pStgMedium;
     2405    DWORD       cDataCount;
     2406} IDataObjectImpl;
     2407
     2408static struct ICOM_VTABLE(IDataObject) dtovt;
     2409
     2410/**************************************************************************
     2411*  IDataObject_Constructor
     2412*/
     2413LPDATAOBJECT IDataObject_Constructor()
     2414{
     2415        IDataObjectImpl* dto;
     2416
     2417        dto = (IDataObjectImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDataObjectImpl));
     2418
     2419        if (dto)
     2420        {
     2421          dto->ref = 1;
     2422          ICOM_VTBL(dto) = &dtovt;
     2423        }
     2424       
     2425        return (LPDATAOBJECT)dto;
     2426}
     2427
     2428/***************************************************************************
     2429*  IDataObject_QueryInterface
     2430*/
     2431static HRESULT WINAPI IDataObject_fnQueryInterface(LPDATAOBJECT iface, REFIID riid, LPVOID * ppvObj)
     2432{
     2433        ICOM_THIS(IDataObjectImpl,iface);
     2434        dprintf(("IDataObject_fnQueryInterface (%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj));
     2435
     2436        *ppvObj = NULL;
     2437
     2438        if(IsEqualIID(riid, &IID_IUnknown))          /*IUnknown*/
     2439        {
     2440            *ppvObj = This;
     2441        }
     2442        else if(IsEqualIID(riid, &IID_IDataObject))  /*IDataObject*/
     2443        {
     2444            *ppvObj = (IDataObject*)This;
     2445        }   
     2446
     2447        if(*ppvObj)
     2448        {
     2449            IUnknown_AddRef((IUnknown*)*ppvObj);     
     2450            TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj);
     2451            return S_OK;
     2452        }
     2453        TRACE("-- Interface: E_NOINTERFACE\n");
     2454        return E_NOINTERFACE;
     2455}
     2456
     2457/**************************************************************************
     2458*  IDataObject_AddRef
     2459*/
     2460static ULONG WINAPI IDataObject_fnAddRef(LPDATAOBJECT iface)
     2461{
     2462        ICOM_THIS(IDataObjectImpl,iface);
     2463
     2464        dprintf(("IDataObject_fnAddRef (%p)->(count=%lu)\n",This, This->ref));
     2465
     2466        return ++(This->ref);
     2467}
     2468
     2469/**************************************************************************
     2470*  IDataObject_Release
     2471*/
     2472static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface)
     2473{
     2474        ICOM_THIS(IDataObjectImpl,iface);
     2475        dprintf(("IDataObject_fnRelease (%p)->()\n",This));
     2476
     2477    if (!--(This->ref))
     2478        {
     2479          TRACE(" destroying IDataObject(%p)\n",This);
     2480          HeapFree(GetProcessHeap(),0,This);
     2481          return 0;
     2482        }
     2483        return This->ref;
     2484}
     2485
     2486/**************************************************************************
     2487* IDataObject_fnGetData
     2488*/
     2489static HRESULT WINAPI IDataObject_fnGetData(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, STGMEDIUM *pmedium)
     2490{
     2491    int i;
     2492
     2493        ICOM_THIS(IDataObjectImpl,iface);
     2494
     2495    if(pformatetcIn == NULL || pmedium == NULL)
     2496        return E_INVALIDARG;
     2497
     2498    dprintf(("IDataObject_fnGetData %x %x", pformatetcIn, pmedium));
     2499
     2500        if(pformatetcIn->cfFormat != CF_HDROP)
     2501        {
     2502        FIXME("-- expected clipformat not implemented\n");
     2503        return (E_INVALIDARG);
     2504    }
     2505
     2506        /* check our formats table what we have */
     2507        for (i=0; i<This->cDataCount; i++)
     2508        {
     2509            if ((This->pFormatEtc[i].cfFormat == pformatetcIn->cfFormat)
     2510                 && (This->pFormatEtc[i].tymed == pformatetcIn->tymed))
     2511            {
     2512            pmedium->u.hGlobal = This->pStgMedium[i].u.hGlobal;
     2513                break;
     2514            }
     2515        }
     2516        if (pmedium->u.hGlobal)
     2517        {
     2518            pmedium->tymed = TYMED_HGLOBAL;
     2519            pmedium->pUnkForRelease = NULL;
     2520            return S_OK;
     2521        }
     2522        return E_OUTOFMEMORY;
     2523}
     2524
     2525static HRESULT WINAPI IDataObject_fnGetDataHere(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium)
     2526{
     2527        ICOM_THIS(IDataObjectImpl,iface);
     2528       
     2529    dprintf(("IDataObject_fnGetDataHere %x %x STUB", pformatetc, pmedium));
     2530        return E_NOTIMPL;
     2531}
     2532
     2533static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC pformatetc)
     2534{
     2535        ICOM_THIS(IDataObjectImpl,iface);
     2536        UINT i;
     2537       
     2538        dprintf(("IDataObject_fnQueryGetData (%p)->(fmt=0x%08x tym=0x%08lx)\n", This, pformatetc->cfFormat, pformatetc->tymed));
     2539       
     2540        if(!(DVASPECT_CONTENT & pformatetc->dwAspect))
     2541          return DV_E_DVASPECT;
     2542
     2543    if(This->pFormatEtc == NULL) {
     2544        return DV_E_TYMED;
     2545    }
     2546        /* check our formats table what we have */
     2547        for (i=0; i<This->cDataCount; i++)
     2548        {
     2549            if ((This->pFormatEtc[i].cfFormat == pformatetc->cfFormat)
     2550                && (This->pFormatEtc[i].tymed == pformatetc->tymed))
     2551            {
     2552            return S_OK;
     2553            }
     2554        }
     2555
     2556        return DV_E_TYMED;
     2557}
     2558
     2559static HRESULT WINAPI IDataObject_fnGetCanonicalFormatEtc(LPDATAOBJECT iface, LPFORMATETC pformatectIn, LPFORMATETC pformatetcOut)
     2560{
     2561        ICOM_THIS(IDataObjectImpl,iface);
     2562       
     2563    dprintf(("IDataObject_fnGetCanonicalFormatEtc STUB"));
     2564    return DATA_S_SAMEFORMATETC;
     2565}
     2566
     2567static HRESULT WINAPI IDataObject_fnSetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
     2568{
     2569    LPFORMATETC pfeNew, pfeTemp;
     2570    LPSTGMEDIUM psmNew, psmTemp;
     2571        ICOM_THIS(IDataObjectImpl,iface);
     2572
     2573    //no need for more than one item
     2574    if(This->cDataCount != 0) {
     2575        DebugInt3();
     2576        return E_OUTOFMEMORY;
     2577    }
     2578    This->cDataCount++;
     2579
     2580    pfeNew = malloc(sizeof(FORMATETC) * This->cDataCount);
     2581    psmNew = malloc(sizeof(STGMEDIUM) * This->cDataCount);
     2582
     2583    if(pfeNew && psmNew)
     2584    {
     2585        memset(pfeNew, 0, sizeof(FORMATETC) * This->cDataCount);
     2586        memset(psmNew, 0, sizeof(STGMEDIUM) * This->cDataCount);
     2587   
     2588        /* copy the existing data */
     2589        if(This->pFormatEtc)
     2590        {
     2591            memcpy(pfeNew, This->pFormatEtc, sizeof(FORMATETC) * (This->cDataCount - 1));
     2592        }
     2593        if(This->pStgMedium)
     2594        {
     2595            memcpy(psmNew, This->pStgMedium, sizeof(STGMEDIUM) * (This->cDataCount - 1));
     2596        }
     2597   
     2598        /* add the new data */
     2599        pfeNew[This->cDataCount - 1] = *pformatetc;
     2600        if(fRelease)
     2601        {
     2602            psmNew[This->cDataCount - 1] = *pmedium;
     2603        }
     2604        else
     2605        {
     2606            DebugInt3();
     2607//            CopyStgMedium(pmedium, &psmNew[This->cDataCount - 1]);
     2608        }
     2609
     2610        pfeTemp = This->pFormatEtc;
     2611        This->pFormatEtc = pfeNew;
     2612        pfeNew = pfeTemp;
     2613
     2614        psmTemp = This->pStgMedium;
     2615        This->pStgMedium = psmNew;
     2616        psmNew = psmTemp;
     2617    }
     2618
     2619    if(pfeNew)
     2620        free(pfeNew);
     2621
     2622    if(psmNew)
     2623        free(psmNew);
     2624
     2625    if(This->pFormatEtc && This->pStgMedium)
     2626        return S_OK;
     2627
     2628    return E_OUTOFMEMORY;
     2629}
     2630
     2631static HRESULT WINAPI IDataObject_fnEnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc)
     2632{
     2633        ICOM_THIS(IDataObjectImpl,iface);
     2634
     2635        TRACE("(%p)->()\n", This);
     2636        *ppenumFormatEtc=NULL;
     2637
     2638        /* only get data */
     2639        if (DATADIR_GET == dwDirection)
     2640        {
     2641          *ppenumFormatEtc = IEnumFORMATETC_Constructor(This->cDataCount, This->pFormatEtc);
     2642          return (*ppenumFormatEtc) ? S_OK : E_FAIL;
     2643        }
     2644       
     2645        return E_NOTIMPL;
     2646}
     2647
     2648static HRESULT WINAPI IDataObject_fnDAdvise(LPDATAOBJECT iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
     2649{
     2650        ICOM_THIS(IDataObjectImpl,iface);
     2651
     2652    dprintf(("IDataObject_fnDAdvise STUB"));
     2653        return E_NOTIMPL;
     2654}
     2655static HRESULT WINAPI IDataObject_fnDUnadvise(LPDATAOBJECT iface, DWORD dwConnection)
     2656{
     2657        ICOM_THIS(IDataObjectImpl,iface);
     2658   
     2659    dprintf(("IDataObject_fnDUnadvise STUB"));
     2660        return E_NOTIMPL;
     2661}
     2662static HRESULT WINAPI IDataObject_fnEnumDAdvise(LPDATAOBJECT iface, IEnumSTATDATA **ppenumAdvise)
     2663{
     2664        ICOM_THIS(IDataObjectImpl,iface);
     2665   
     2666    dprintf(("IDataObject_fnEnumDAdvise STUB"));
     2667    return OLE_E_ADVISENOTSUPPORTED;
     2668}
     2669
     2670static struct ICOM_VTABLE(IDataObject) dtovt =
     2671{
     2672        ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     2673        IDataObject_fnQueryInterface,
     2674        IDataObject_fnAddRef,
     2675        IDataObject_fnRelease,
     2676        IDataObject_fnGetData,
     2677        IDataObject_fnGetDataHere,
     2678        IDataObject_fnQueryGetData,
     2679        IDataObject_fnGetCanonicalFormatEtc,
     2680        IDataObject_fnSetData,
     2681        IDataObject_fnEnumFormatEtc,
     2682        IDataObject_fnDAdvise,
     2683        IDataObject_fnDUnadvise,
     2684        IDataObject_fnEnumDAdvise
     2685};
     2686
     2687//******************************************************************************
     2688//******************************************************************************
     2689BOOL WINAPI OLEDD_AcceptsDragDrop(HWND hwnd)
     2690{
     2691    DropTargetNode *pTarget;
     2692
     2693    /*
     2694     * Find-out if there is a drag target under the mouse
     2695     */
     2696    HWND nexttar = hwnd;
     2697    do {
     2698        pTarget = OLEDD_FindDropTarget(nexttar);
     2699    }
     2700    while(!pTarget && (nexttar = GetParent(nexttar)) != 0);
     2701
     2702    if(pTarget != NULL) {
     2703        dprintf(("OLEDD_AcceptsDragDrop %x accepted", hwnd));
     2704        return TRUE;
     2705    }
     2706    dprintf(("OLEDD_AcceptsDragDrop %x refused", hwnd));
     2707    return FALSE;
     2708}
     2709//******************************************************************************
     2710//******************************************************************************
     2711BOOL WINAPI OLEDD_DropFiles(HWND hwnd)
     2712{
     2713    DropTargetNode *pTarget;
     2714    DWORD           keyState = 0;
     2715    POINTL          mousePosParam;
     2716    POINT           mousePos;
     2717    HWND            nexttar = hwnd;
     2718
     2719    dprintf(("OLEDD_DropFiles %x", hwnd));
     2720
     2721    do {
     2722        pTarget = OLEDD_FindDropTarget(nexttar);
     2723    }
     2724    while(!pTarget && (nexttar = GetParent(nexttar)) != 0);
     2725    if(pTarget == NULL) {
     2726        return FALSE;
     2727    }
     2728   
     2729    /*
     2730     * The documentation tells me that the coordinate should be in the target
     2731     * window's coordinate space. However, the tests I made tell me the
     2732     * coordinates should be in screen coordinates.
     2733     */
     2734    GetCursorPos(&mousePos);
     2735    mousePosParam.x = mousePos.x;
     2736    mousePosParam.y = mousePos.y;
     2737   
     2738    if(GetKeyState(VK_SHIFT)   & 0x8000) keyState |= MK_SHIFT;
     2739    if(GetKeyState(VK_CONTROL) & 0x8000) keyState |= MK_CONTROL;
     2740    if(GetKeyState(VK_MENU)    & 0x8000) keyState |= MK_ALT;
     2741    if(GetKeyState(VK_LBUTTON) & 0x8000) keyState |= MK_LBUTTON;
     2742    if(GetKeyState(VK_RBUTTON) & 0x8000) keyState |= MK_RBUTTON;
     2743    if(GetKeyState(VK_MBUTTON) & 0x8000) keyState |= MK_MBUTTON;
     2744
     2745    return IDropTarget_Drop(pTarget->dropTarget, pTarget->pDataObject,
     2746                            keyState, mousePosParam, &pTarget->dwEffect) == S_OK;
     2747}
     2748//******************************************************************************
     2749//******************************************************************************
     2750BOOL WIN32API OLEDD_DragOver(HWND hwnd, DWORD dwEffect)
     2751{
     2752    DropTargetNode *pTarget;
     2753    DWORD           keyState = 0;
     2754    POINTL          mousePosParam;
     2755    POINT           mousePos;
     2756    HWND            nexttar = hwnd;
     2757
     2758    dprintf(("OLEDD_DragOver %x %d", hwnd, dwEffect));
     2759
     2760    do {
     2761        pTarget = OLEDD_FindDropTarget(nexttar);
     2762    }
     2763    while(!pTarget && (nexttar = GetParent(nexttar)) != 0);
     2764    if(pTarget == NULL) {
     2765        return FALSE;
     2766    }
     2767   
     2768    /*
     2769     * The documentation tells me that the coordinate should be in the target
     2770     * window's coordinate space. However, the tests I made tell me the
     2771     * coordinates should be in screen coordinates.
     2772     */
     2773    GetCursorPos(&mousePos);
     2774    mousePosParam.x = mousePos.x;
     2775    mousePosParam.y = mousePos.y;
     2776   
     2777    if(GetKeyState(VK_SHIFT)   & 0x8000) keyState |= MK_SHIFT;
     2778    if(GetKeyState(VK_CONTROL) & 0x8000) keyState |= MK_CONTROL;
     2779    if(GetKeyState(VK_MENU)    & 0x8000) keyState |= MK_ALT;
     2780    if(GetKeyState(VK_LBUTTON) & 0x8000) keyState |= MK_LBUTTON;
     2781    if(GetKeyState(VK_RBUTTON) & 0x8000) keyState |= MK_RBUTTON;
     2782    if(GetKeyState(VK_MBUTTON) & 0x8000) keyState |= MK_MBUTTON;
     2783    return IDropTarget_DragOver(pTarget->dropTarget, keyState, mousePosParam, &dwEffect) == S_OK;
     2784}
     2785//******************************************************************************
     2786//******************************************************************************
     2787BOOL WIN32API OLEDD_DragEnter(HWND hwnd, HDROP hDrop, DWORD dwEffect)
     2788{
     2789    FORMATETC       fe;
     2790    STGMEDIUM       medium;
     2791    DropTargetNode *pTarget;
     2792    DWORD           keyState = 0;
     2793    POINTL          mousePosParam;
     2794    POINT           mousePos;
     2795    HWND            nexttar = hwnd;
     2796
     2797    dprintf(("OLEDD_DragEnter %x %x %d", hwnd, hDrop, dwEffect));
     2798
     2799    do {
     2800        pTarget = OLEDD_FindDropTarget(nexttar);
     2801    }
     2802    while(!pTarget && (nexttar = GetParent(nexttar)) != 0);
     2803    if(pTarget == NULL) {
     2804        return FALSE;
     2805    }
     2806   
     2807    /*
     2808     * The documentation tells me that the coordinate should be in the target
     2809     * window's coordinate space. However, the tests I made tell me the
     2810     * coordinates should be in screen coordinates.
     2811     */
     2812    GetCursorPos(&mousePos);
     2813    mousePosParam.x = mousePos.x;
     2814    mousePosParam.y = mousePos.y;
     2815   
     2816    if(GetKeyState(VK_SHIFT)   & 0x8000) keyState |= MK_SHIFT;
     2817    if(GetKeyState(VK_CONTROL) & 0x8000) keyState |= MK_CONTROL;
     2818    if(GetKeyState(VK_MENU)    & 0x8000) keyState |= MK_ALT;
     2819    if(GetKeyState(VK_LBUTTON) & 0x8000) keyState |= MK_LBUTTON;
     2820    if(GetKeyState(VK_RBUTTON) & 0x8000) keyState |= MK_RBUTTON;
     2821    if(GetKeyState(VK_MBUTTON) & 0x8000) keyState |= MK_MBUTTON;
     2822
     2823    fe.cfFormat = CF_HDROP;
     2824    fe.ptd      = NULL;
     2825    fe.dwAspect = DVASPECT_CONTENT; 
     2826    fe.lindex   = -1;
     2827    fe.tymed    = TYMED_HGLOBAL;
     2828
     2829    medium.u.hGlobal      = hDrop;
     2830    medium.tymed          = TYMED_HGLOBAL;
     2831    medium.pUnkForRelease = NULL;
     2832
     2833    pTarget->fDragEnter = TRUE;
     2834    pTarget->dwEffect   = dwEffect;
     2835
     2836    //just in case dragleave wasn't called...
     2837    if(pTarget->hDrop) {
     2838        GlobalFree(pTarget->hDrop);
     2839    }
     2840    if(pTarget->pDataObject) {
     2841        IDataObject_Release(pTarget->pDataObject);
     2842    }
     2843
     2844    pTarget->hDrop      = hDrop;
     2845    pTarget->pDataObject = IDataObject_Constructor();
     2846    IDataObject_AddRef(pTarget->pDataObject);
     2847    IDataObject_SetData(pTarget->pDataObject, &fe, &medium, TRUE);
     2848    return IDropTarget_DragEnter(pTarget->dropTarget, pTarget->pDataObject, keyState, mousePosParam, &dwEffect) == S_OK;
     2849}
     2850//******************************************************************************
     2851//******************************************************************************
     2852BOOL WIN32API OLEDD_DragLeave(HWND hwnd)
     2853{
     2854    DropTargetNode *pTarget;
     2855
     2856    dprintf(("OLEDD_DragLeave %x", hwnd));
     2857
     2858    pTarget = OLEDD_FindDropTarget(hwnd);
     2859    if(pTarget == NULL) {
     2860        return FALSE;
     2861    }
     2862    pTarget->fDragEnter = FALSE;
     2863    if(pTarget->hDrop) {
     2864        GlobalFree(pTarget->hDrop);
     2865        pTarget->hDrop = 0;
     2866    }
     2867    if(pTarget->pDataObject) {
     2868        IDataObject_Release(pTarget->pDataObject);
     2869        pTarget->pDataObject = NULL;
     2870    }
     2871    return IDropTarget_DragLeave(pTarget->dropTarget) == S_OK;
     2872}
     2873//******************************************************************************
     2874//******************************************************************************
     2875#endif
     2876
    22202877#ifndef __WIN32OS2__
    22212878/******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.