blob: 0abdc2d6760703d16d599110fa8063dd6bb04b49 [file] [log] [blame]
/*
* Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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 General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#ifndef AWT_DND_DS_H
#define AWT_DND_DS_H
#include <Ole2.h>
#include <jni.h>
#include <jvm.h>
#include <jni_util.h>
#include "awt_Object.h"
#include "awt_Component.h"
#include "awt_Window.h"
class AwtCursor;
/**
* Drag Source code
*/
class AwtDragSource : virtual public IDropSource, virtual public IDataObject {
public:
AwtDragSource(JNIEnv* env, jobject peer, jobject component,
jobject transferable, jobject trigger,
jint actions, jlongArray formats, jobject formatMap);
virtual ~AwtDragSource();
// IUnknown
virtual HRESULT __stdcall QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
virtual ULONG __stdcall AddRef(void);
virtual ULONG __stdcall Release(void);
// IDropSource
virtual HRESULT __stdcall QueryContinueDrag(BOOL fEscapeKeyPressed, DWORD grfKeyState);
virtual HRESULT __stdcall GiveFeedback(DWORD dwEffect);
// IDataObject
virtual HRESULT __stdcall GetData(FORMATETC __RPC_FAR *pFormatEtc, STGMEDIUM __RPC_FAR *pmedium);
virtual HRESULT __stdcall GetDataHere(FORMATETC __RPC_FAR *pFormatEtc, STGMEDIUM __RPC_FAR *pmedium);
virtual HRESULT __stdcall QueryGetData(FORMATETC __RPC_FAR *pFormatEtc);
virtual HRESULT __stdcall GetCanonicalFormatEtc(FORMATETC __RPC_FAR *pFormatEtcIn, FORMATETC __RPC_FAR *pFormatEtcOut);
virtual HRESULT __stdcall SetData(FORMATETC __RPC_FAR *pFormatEtc, STGMEDIUM __RPC_FAR *pmedium, BOOL fRelease);
virtual HRESULT __stdcall EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC *__RPC_FAR *ppenumFormatEtc);
virtual HRESULT __stdcall DAdvise(FORMATETC __RPC_FAR *pFormatEtc, DWORD advf, IAdviseSink __RPC_FAR *pAdvSink, DWORD __RPC_FAR *pdwConnection);
virtual HRESULT __stdcall DUnadvise(DWORD dwConnection);
virtual HRESULT __stdcall EnumDAdvise(IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise);
// AwtDragSource
static void StartDrag(
AwtDragSource* self,
jobject cursor,
jintArray imageData,
jint imageWidth,
jint imageHeight,
jint x,
jint y);
HRESULT ChangeCursor();
void SetCursor(jobject cursor);
INLINE unsigned int getNTypes() { return m_ntypes; }
INLINE FORMATETC getType(unsigned int i) { return m_types[i]; }
INLINE jobject GetPeer() { return m_peer; }
INLINE void Signal() { ::ReleaseMutex(m_mutex); }
virtual HRESULT __stdcall GetProcessId(FORMATETC __RPC_FAR *pFormatEtc, STGMEDIUM __RPC_FAR *pmedium);
protected:
INLINE void WaitUntilSignalled(BOOL retain) {
do {
// nothing ...
} while(::WaitForSingleObject(m_mutex, INFINITE) == WAIT_FAILED);
if (!retain) ::ReleaseMutex(m_mutex);
}
static void _DoDragDrop(void* param);
HRESULT __stdcall MatchFormatEtc(FORMATETC __RPC_FAR *pFormatEtcIn, FORMATETC *cacheEnt);
private:
void LoadCache(jlongArray formats);
void UnloadCache();
static int __cdecl _compar(const void *, const void *);
static void call_dSCenter(JNIEnv* env, jobject self, jint targetActions,
jint modifiers, jint x, jint y);
static void call_dSCmotion(JNIEnv* env, jobject self,
jint targetActions, jint modifiers,
jint x, jint y);
static void call_dSCchanged(JNIEnv* env, jobject self,
jint targetActions, jint modifiers,
jint x, jint y);
static void call_dSCmouseMoved(JNIEnv* env, jobject self,
jint targetActions, jint modifiers,
jint x, jint y);
static void call_dSCexit(JNIEnv* env, jobject self, jint x, jint y);
static void call_dSCddfinished(JNIEnv* env, jobject self,
jboolean success, jint operations,
jint x, jint y);
protected:
class ADSIEnumFormatEtc : public virtual IEnumFORMATETC {
public:
ADSIEnumFormatEtc(AwtDragSource* parent);
virtual ~ADSIEnumFormatEtc();
// IUnknown
virtual HRESULT __stdcall QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
virtual ULONG __stdcall AddRef(void);
virtual ULONG __stdcall Release(void);
// IEnumFORMATETC
virtual HRESULT _stdcall Next(ULONG celt, FORMATETC __RPC_FAR *rgelt, ULONG __RPC_FAR *pceltFetched);
virtual HRESULT _stdcall Skip(ULONG celt);
virtual HRESULT _stdcall Reset();
virtual HRESULT _stdcall Clone(IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenum);
private:
AwtDragSource* m_parent;
ULONG m_refs;
unsigned int m_idx;
};
class ADSIStreamProxy : public virtual IStream {
private:
ADSIStreamProxy(ADSIStreamProxy* cloneof);
public:
ADSIStreamProxy(AwtDragSource* parent, jbyteArray buffer, jint len);
virtual ~ADSIStreamProxy();
// IUnknown
virtual HRESULT __stdcall QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
virtual ULONG __stdcall AddRef(void);
virtual ULONG __stdcall Release(void);
// IStream
virtual HRESULT __stdcall Read(void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead);
virtual HRESULT __stdcall Write(const void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbWritten);
virtual HRESULT __stdcall Seek(LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER __RPC_FAR *plibNewPosition);
virtual HRESULT __stdcall SetSize(ULARGE_INTEGER libNewSize);
virtual HRESULT __stdcall CopyTo(IStream __RPC_FAR *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER __RPC_FAR *pcbRead, ULARGE_INTEGER __RPC_FAR *pcbWritten);
virtual HRESULT __stdcall Commit(DWORD grfCommitFlags);
virtual HRESULT __stdcall Revert();
virtual HRESULT __stdcall LockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType);
virtual HRESULT __stdcall UnlockRegion(ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType);
virtual HRESULT __stdcall Stat(STATSTG __RPC_FAR *pstatstg, DWORD grfStatFlag);
virtual HRESULT __stdcall Clone(IStream __RPC_FAR *__RPC_FAR *ppstm);
protected:
AwtDragSource* m_parent;
signed char* m_buffer;
unsigned int m_off;
unsigned int m_blen;
STATSTG m_statstg;
ADSIStreamProxy* m_cloneof;
ULONG m_refs;
};
public:
static const UINT PROCESS_ID_FORMAT;
private:
// instance vars ...
jobject m_peer;
jint m_initmods;
jint m_lastmods;
HWND m_droptarget;
int m_enterpending;
jint m_actions;
FORMATETC* m_types;
unsigned int m_ntypes;
ULONG m_refs;
AwtCursor* m_cursor;
HANDLE m_mutex;
jobject m_component;
jobject m_transferable;
jobject m_formatMap;
POINT m_dragPoint;
POINT m_dropPoint;
BOOL m_fNC;
BOOL m_bRestoreNodropCustomCursor;//CR 6480706 - MS Bug on hold
DWORD m_dwPerformedDropEffect;
// static's ...
static jclass dSCClazz;
static jclass awtIEClazz;
static jmethodID dSCdragenter;
static jmethodID dSCdragmotion;
static jmethodID dSCopschanged;
static jmethodID dSCdragexit;
static jmethodID dSCddfinish;
static jfieldID awtIEmods;
};
extern const CLIPFORMAT CF_PERFORMEDDROPEFFECT;
extern const CLIPFORMAT CF_FILEGROUPDESCRIPTORA;
extern const CLIPFORMAT CF_FILEGROUPDESCRIPTORW;
extern const CLIPFORMAT CF_FILECONTENTS;
#endif /* AWT_DND_DS_H */