/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/


#ifndef _WINDOW_HXX_
#define _WINDOW_HXX_
#include <atlbase.h>
extern CComModule _Module;
#include<atlcom.h>
#include<atlctl.h>
#include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
#include <com/sun/star/datatransfer/dnd/XDragSource.hpp>
#include <com/sun/star/datatransfer/XTransferable.hpp>
#include <com/sun/star/uno/Reference.h>
#include "../../source/inc/DtObjFactory.hxx"


using namespace com::sun::star::uno;
using namespace com::sun::star::datatransfer::dnd;
using namespace com::sun::star::datatransfer;

struct ThreadData
{
	Reference<XDragSource> source;
	Reference<XTransferable> transferable;
	HANDLE evtThreadReady;
};

class AWindow: public CWindowImpl<AWindow, CWindow,
	  CWinTraits<WS_CAPTION |WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0> >
{
	TCHAR m_strName[80];
	Reference<XDropTarget> m_xDropTarget;
	Reference<XDragSource> m_xDragSource;
	BOOL m_isMTA;

	HWND m_hwndEdit;

	CDTransObjFactory m_aDataConverter;

public:
	AWindow(LPCTSTR strName)
	{
		RECT rcPos= {0,0,200,200};
		Create(0, rcPos, strName);
	}
	AWindow(LPCTSTR strName, RECT pos, BOOL mta=FALSE): m_isMTA( mta)
	{
		Create(0, pos, strName);
	}

	~AWindow()
	{
		if(m_hWnd)
			DestroyWindow();
	}


	BEGIN_MSG_MAP(AWindow)
		MESSAGE_HANDLER( WM_CLOSE, OnClose)
		MESSAGE_HANDLER( WM_CREATE, OnCreate)
		MESSAGE_RANGE_HANDLER( WM_MOUSEFIRST,  WM_MOUSELAST, OnMouseAction)
		MESSAGE_HANDLER( WM_TIMER, OnTimer)
		MESSAGE_HANDLER( WM_SIZE, OnSize)
		MESSAGE_HANDLER( WM_SETFOCUS, OnFocus)

	END_MSG_MAP()

	LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnMouseAction(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
	LRESULT OnFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

};

#endif
