1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_dtrans.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #if defined _MSC_VER 32*cdf0e10cSrcweir #pragma warning(push,1) 33*cdf0e10cSrcweir #endif 34*cdf0e10cSrcweir #include <windows.h> 35*cdf0e10cSrcweir #include <comdef.h> 36*cdf0e10cSrcweir #include <tchar.h> 37*cdf0e10cSrcweir #include <atlbase.h> 38*cdf0e10cSrcweir CComModule _Module; 39*cdf0e10cSrcweir #include<atlcom.h> 40*cdf0e10cSrcweir #include<atlimpl.cpp> 41*cdf0e10cSrcweir #if defined _MSC_VER 42*cdf0e10cSrcweir #pragma warning(pop) 43*cdf0e10cSrcweir #endif 44*cdf0e10cSrcweir #include <com/sun/star/uno/Reference.h> 45*cdf0e10cSrcweir #include <com/sun/star/lang/XInitialization.hpp> 46*cdf0e10cSrcweir #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> 47*cdf0e10cSrcweir #include <com/sun/star/datatransfer/dnd/DNDConstants.hpp> 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir #include <com/sun/star/lang/XInitialization.hpp> 50*cdf0e10cSrcweir #include <com/sun/star/lang/XComponent.hpp> 51*cdf0e10cSrcweir #include <rtl/process.h> 52*cdf0e10cSrcweir #include <cppuhelper/servicefactory.hxx> 53*cdf0e10cSrcweir //#include "transferable.hxx" 54*cdf0e10cSrcweir #include "sourcelistener.hxx" 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir #include "atlwindow.hxx" 58*cdf0e10cSrcweir BEGIN_OBJECT_MAP(ObjectMap) 59*cdf0e10cSrcweir END_OBJECT_MAP() 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir using namespace com::sun::star::lang; 62*cdf0e10cSrcweir using namespace com::sun::star::datatransfer; 63*cdf0e10cSrcweir using namespace com::sun::star::uno; 64*cdf0e10cSrcweir using namespace com::sun::star::datatransfer::dnd; 65*cdf0e10cSrcweir using namespace com::sun::star::datatransfer::dnd::DNDConstants; 66*cdf0e10cSrcweir using namespace rtl; 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir // defined in atlwindow.hxx 69*cdf0e10cSrcweir // #define WM_SOURCE_INIT WM_APP+100 70*cdf0e10cSrcweir // #define WM_SOURCE_STARTDRAG WM_APP+101 71*cdf0e10cSrcweir #define WM_CREATE_MTA_WND 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir HRESULT doTest(); 74*cdf0e10cSrcweir DWORD WINAPI MTAFunc( void* threadData); 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir Reference< XMultiServiceFactory > MultiServiceFactory; 77*cdf0e10cSrcweir //int APIENTRY WinMain(HINSTANCE hInstance, 78*cdf0e10cSrcweir // HINSTANCE hPrevInstance, 79*cdf0e10cSrcweir // LPSTR lpCmdLine, 80*cdf0e10cSrcweir // int nCmdShow) 81*cdf0e10cSrcweir //int _tmain( int argc, TCHAR *argv[ ], TCHAR *envp[ ] ) 82*cdf0e10cSrcweir int main( int argc, char *argv[ ], char *envp[ ] ) 83*cdf0e10cSrcweir { 84*cdf0e10cSrcweir HRESULT hr; 85*cdf0e10cSrcweir if( FAILED( hr=CoInitialize(NULL ))) 86*cdf0e10cSrcweir { 87*cdf0e10cSrcweir _tprintf(_T("CoInitialize failed \n")); 88*cdf0e10cSrcweir return -1; 89*cdf0e10cSrcweir } 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir _Module.Init( ObjectMap, GetModuleHandle( NULL)); 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir if( FAILED(hr=doTest())) 95*cdf0e10cSrcweir { 96*cdf0e10cSrcweir _com_error err( hr); 97*cdf0e10cSrcweir const TCHAR * errMsg= err.ErrorMessage(); 98*cdf0e10cSrcweir // MessageBox( NULL, errMsg, "Test failed", MB_ICONERROR); 99*cdf0e10cSrcweir } 100*cdf0e10cSrcweir 101*cdf0e10cSrcweir 102*cdf0e10cSrcweir _Module.Term(); 103*cdf0e10cSrcweir CoUninitialize(); 104*cdf0e10cSrcweir return 0; 105*cdf0e10cSrcweir } 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir HRESULT doTest() 108*cdf0e10cSrcweir { 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir MultiServiceFactory= createRegistryServiceFactory( OUString(L"types.rdb"), OUString( L"services.rdb") , sal_True); 111*cdf0e10cSrcweir 112*cdf0e10cSrcweir // create the MTA thread that is used to realize MTA calls to the services 113*cdf0e10cSrcweir // We create the thread and wait until the thread has created its message queue 114*cdf0e10cSrcweir HANDLE evt= CreateEvent(NULL, FALSE, FALSE, NULL); 115*cdf0e10cSrcweir DWORD threadIdMTA=0; 116*cdf0e10cSrcweir HANDLE hMTAThread= CreateThread( NULL, 0, MTAFunc, &evt, 0, &threadIdMTA); 117*cdf0e10cSrcweir WaitForSingleObject( evt, INFINITE); 118*cdf0e10cSrcweir CloseHandle(evt); 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir 121*cdf0e10cSrcweir HRESULT hr= S_OK; 122*cdf0e10cSrcweir RECT pos1={0,0,300,200}; 123*cdf0e10cSrcweir AWindow win(_T("DnD starting in Ole STA"), threadIdMTA, pos1); 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir RECT pos2={ 0, 205, 300, 405}; 126*cdf0e10cSrcweir AWindow win2( _T("DnD starting in MTA"), threadIdMTA, pos2, true); 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir // win3 and win4 call initialize from an MTA but they are created in an STA 129*cdf0e10cSrcweir RECT pos3={300,0,600,200}; 130*cdf0e10cSrcweir AWindow win3(_T("DnD starting in OLE STA"), threadIdMTA, pos3, false, true); 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir RECT pos4={ 300, 205, 600, 405}; 133*cdf0e10cSrcweir AWindow win24( _T("DnD starting in Ole MTA"), threadIdMTA, pos4, true, true); 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir 136*cdf0e10cSrcweir MSG msg; 137*cdf0e10cSrcweir while( GetMessage(&msg, (HWND)NULL, 0, 0) ) 138*cdf0e10cSrcweir { 139*cdf0e10cSrcweir TranslateMessage( &msg); 140*cdf0e10cSrcweir DispatchMessage( &msg); 141*cdf0e10cSrcweir } 142*cdf0e10cSrcweir 143*cdf0e10cSrcweir // Shut down the MTA thread 144*cdf0e10cSrcweir PostThreadMessage( threadIdMTA, WM_QUIT, 0, 0); 145*cdf0e10cSrcweir WaitForSingleObject(hMTAThread, INFINITE); 146*cdf0e10cSrcweir CloseHandle(hMTAThread); 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir return S_OK; 149*cdf0e10cSrcweir } 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir extern Reference<XMultiServiceFactory> MultiServiceFactory; 152*cdf0e10cSrcweir DWORD WINAPI MTAFunc( void* threadData) 153*cdf0e10cSrcweir { 154*cdf0e10cSrcweir HRESULT hr= S_OK; 155*cdf0e10cSrcweir hr= CoInitializeEx( NULL, COINIT_MULTITHREADED); 156*cdf0e10cSrcweir ATLASSERT( FAILED(hr) ); 157*cdf0e10cSrcweir MSG msg; 158*cdf0e10cSrcweir // force the creation of a message queue 159*cdf0e10cSrcweir PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); 160*cdf0e10cSrcweir SetEvent( *(HANDLE*)threadData ); 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir RECT pos={0, 406, 300, 605}; 163*cdf0e10cSrcweir AWindow win(_T("DnD, full MTA"), GetCurrentThreadId(), pos, false, true); 164*cdf0e10cSrcweir // ThreadData data= *( ThreadData*)pParams; 165*cdf0e10cSrcweir // SetEvent(data.evtThreadReady); 166*cdf0e10cSrcweir while( GetMessage(&msg, (HWND)NULL, 0, 0) ) 167*cdf0e10cSrcweir { 168*cdf0e10cSrcweir switch( msg.message) 169*cdf0e10cSrcweir { 170*cdf0e10cSrcweir case WM_SOURCE_INIT: 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir InitializationData* pData= (InitializationData*)msg.wParam; 173*cdf0e10cSrcweir Any any; 174*cdf0e10cSrcweir any <<= (sal_uInt32) pData->hWnd; 175*cdf0e10cSrcweir pData->xInit->initialize( Sequence<Any>( &any, 1)); 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir CoTaskMemFree( pData); 178*cdf0e10cSrcweir break; 179*cdf0e10cSrcweir } 180*cdf0e10cSrcweir case WM_SOURCE_STARTDRAG: 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir // wParam contains necessary data 183*cdf0e10cSrcweir StartDragData* pData= (StartDragData*)msg.wParam; 184*cdf0e10cSrcweir Sequence<DataFlavor> seq= pData->transferable->getTransferDataFlavors(); 185*cdf0e10cSrcweir // have a look what flavours are supported 186*cdf0e10cSrcweir for( int i=0; i<seq.getLength(); i++) 187*cdf0e10cSrcweir { 188*cdf0e10cSrcweir DataFlavor d= seq[i]; 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir pData->source->startDrag( DragGestureEvent(), 191*cdf0e10cSrcweir ACTION_LINK|ACTION_MOVE|ACTION_COPY, 192*cdf0e10cSrcweir 0, 193*cdf0e10cSrcweir 0, 194*cdf0e10cSrcweir pData->transferable, 195*cdf0e10cSrcweir Reference<XDragSourceListener>( static_cast<XDragSourceListener*> 196*cdf0e10cSrcweir ( new DragSourceListener()))); 197*cdf0e10cSrcweir CoTaskMemFree( pData); 198*cdf0e10cSrcweir break; 199*cdf0e10cSrcweir } 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir } // end switch 202*cdf0e10cSrcweir 203*cdf0e10cSrcweir TranslateMessage( &msg); 204*cdf0e10cSrcweir DispatchMessage( &msg); 205*cdf0e10cSrcweir } 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir CoUninitialize(); 209*cdf0e10cSrcweir return 0; 210*cdf0e10cSrcweir } 211