/**************************************************************
 * 
 * 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 _SWDTFLVR_HXX
#define _SWDTFLVR_HXX

#include <sfx2/objsh.hxx>

#include <svtools/transfer.hxx>
#include <vcl/graph.hxx>
#include <sfx2/lnkbase.hxx>
#include <com/sun/star/embed/XEmbeddedObject.hpp>

class Graphic;
class ImageMap;
class INetBookmark;
class INetImage;
class SwDoc;
class SwDocFac;
class SwTextBlocks;
class SwWrtShell;
class SvxClipboardFmtItem;
class ViewShell;
class SwView_Impl;

typedef sal_uInt16 TransferBufferType;
namespace nsTransferBufferType
{
	const sal_uInt16 TRNSFR_NONE 			= 0x0000;
	const sal_uInt16 TRNSFR_DOCUMENT		= 0x0001;
	const sal_uInt16 TRNSFR_DOCUMENT_WORD	= 0x0002;
	const sal_uInt16 TRNSFR_GRAPHIC			= 0x0004;
	const sal_uInt16 TRNSFR_TABELLE			= 0x0008;
	const sal_uInt16 TRNSFR_DDELINK			= 0x0010;
	const sal_uInt16 TRNSFR_OLE				= 0x0020;
	const sal_uInt16 TRNSFR_INETFLD			= 0x0040;
	const sal_uInt16 TRNSFR_DRAWING			= 0x0081;	//Drawing ist auch intern!
}

#define DATA_FLAVOR 	::com::sun::star::datatransfer::DataFlavor

class SwTransferable : public TransferableHelper
{
    friend class SwView_Impl;
    SfxObjectShellLock             aDocShellRef;
	TransferableDataHelper			aOleData;
	TransferableObjectDescriptor	aObjDesc;
    ::sfx2::SvBaseLinkRef            refDdeLink;

	SwWrtShell 		*pWrtShell;
	/* #96392# Added pCreatorView to distinguish SwFrameShell from
       SwWrtShell. */
	const ViewShell       *pCreatorView;
	SwDocFac		*pClpDocFac;
	Graphic			*pClpGraphic, *pClpBitmap, *pOrigGrf;
	INetBookmark	*pBkmk;		// URL und Beschreibung!
	ImageMap		*pImageMap;
	INetImage		*pTargetURL;

	TransferBufferType eBufferType;

	sal_Bool bOldIdle	:1; //D&D Idle flag from the viewsettings
	sal_Bool bCleanUp 	:1; //D&D cleanup after Drop (not by internal Drop)

	// helper methods for the copy
    com::sun::star::uno::Reference < com::sun::star::embed::XEmbeddedObject > FindOLEObj( sal_Int64& nAspect ) const;
	Graphic* FindOLEReplacementGraphic() const;
	void DeleteSelection();

	// helper methods for the paste
	static SwTransferable* GetSwTransferable( const TransferableDataHelper& rData );
	static void SetSelInShell( SwWrtShell& , sal_Bool , const Point* );
	static sal_Bool _CheckForURLOrLNKFile( TransferableDataHelper& rData,
								String& rFileName, String* pTitle = 0 );
	static int _TestAllowedFormat( const TransferableDataHelper& rData,
										sal_uLong nFormat, sal_uInt16 nDestination );

	static int _PasteFileContent( TransferableDataHelper&,
									SwWrtShell& rSh, sal_uLong nFmt, sal_Bool bMsg );
	static int _PasteOLE( TransferableDataHelper& rData, SwWrtShell& rSh,
							sal_uLong nFmt, sal_uInt8 nActionFlags, sal_Bool bMsg );
	static int _PasteTargetURL( TransferableDataHelper& rData, SwWrtShell& rSh,
						sal_uInt16 nAction, const Point* pPt, sal_Bool bInsertGRF );

	static int _PasteDDE( TransferableDataHelper& rData, SwWrtShell& rWrtShell,
							sal_Bool bReReadGrf, sal_Bool bMsg );

	static int _PasteSdrFormat(  TransferableDataHelper& rData,
									SwWrtShell& rSh, sal_uInt16 nAction,
									const Point* pPt, sal_uInt8 nActionFlags, bool bNeedToSelectBeforePaste);

	static int _PasteGrf( TransferableDataHelper& rData, SwWrtShell& rSh,
								sal_uLong nFmt, sal_uInt16 nAction, const Point* pPt,
								sal_uInt8 nActionFlags, sal_Int8 nDropAction, bool bNeedToSelectBeforePaste);

	static int _PasteImageMap( TransferableDataHelper& rData,
									SwWrtShell& rSh );

	static int _PasteAsHyperlink( TransferableDataHelper& rData,
										SwWrtShell& rSh, sal_uLong nFmt );

	static int _PasteFileName( TransferableDataHelper& rData,
							SwWrtShell& rSh, sal_uLong nFmt, sal_uInt16 nAction,
							const Point* pPt, sal_uInt8 nActionFlags, sal_Bool bMsg );

	static int _PasteDBData( TransferableDataHelper& rData, SwWrtShell& rSh,
							sal_uLong nFmt, sal_Bool bLink, const Point* pDragPt,
							sal_Bool bMsg );

	static int _PasteFileList( TransferableDataHelper& rData,
								SwWrtShell& rSh, sal_Bool bLink,
								const Point* pPt, sal_Bool bMsg );

	int PrivateDrop( SwWrtShell& rSh, const Point& rDragPt, sal_Bool bMove,
						sal_Bool bIsXSelection );
	int PrivatePaste( SwWrtShell& rShell );

	void SetDataForDragAndDrop( const Point& rSttPos );

									// not available
									SwTransferable();
									SwTransferable( const SwTransferable& );
	SwTransferable&					operator=( const SwTransferable& );

protected:
	virtual void		AddSupportedFormats();
	virtual sal_Bool	GetData( const DATA_FLAVOR& rFlavor );
	virtual sal_Bool	WriteObject( SotStorageStreamRef& rxOStm,
										void* pUserObject,
										sal_uInt32 nUserObjectId,
										const DATA_FLAVOR& rFlavor );
	virtual void 		DragFinished( sal_Int8 nDropAction );
	virtual void		ObjectReleased();

    using TransferableHelper::StartDrag;

public:
	SwTransferable( SwWrtShell& );
	virtual ~SwTransferable();

	static sal_uInt16 GetSotDestination( const SwWrtShell& rSh, const Point* = 0 );

	// set properties on the document, like PageMargin, VisArea.
	// And set real Size
    static void InitOle( SfxObjectShell* pDoc, SwDoc& rDoc );

	// copy - methods and helper methods for the copy
	int	 Cut();
	int	 Copy( sal_Bool bIsCut = sal_False );
    int  PrepareForCopy( sal_Bool bIsCut = sal_False );
	int  CalculateAndCopy();				// special for Calculator
	int  CopyGlossary( SwTextBlocks& rGlossary, const String& rStr );

	// remove the DDE-Link format promise
	void RemoveDDELinkFormat( const Window& rWin );

	// paste - methods and helper methods for the paste
	static sal_Bool	IsPaste( const SwWrtShell&, const TransferableDataHelper& );
	static int Paste( SwWrtShell&, TransferableDataHelper& );
	static int PasteData( TransferableDataHelper& rData,
						  SwWrtShell& rSh, sal_uInt16 nAction, sal_uLong nFormat,
						  sal_uInt16 nDestination, sal_Bool bIsPasteFmt,
                          sal_Bool bIsDefault,
                          const Point* pDDPos = 0, sal_Int8 nDropAction = 0,
						  sal_Bool bPasteSelection = sal_False );

	static sal_Bool IsPasteSpecial( const SwWrtShell& rWrtShell,
								const TransferableDataHelper& );
    static int PasteUnformatted( SwWrtShell& rSh, TransferableDataHelper& );
    static int PasteSpecial( SwWrtShell& rSh, TransferableDataHelper&, sal_uLong& rFormatUsed );
	static int PasteFormat( SwWrtShell& rSh, TransferableDataHelper& rData,
							 sal_uLong nFormat );

	static void FillClipFmtItem( const SwWrtShell& rSh,
								const TransferableDataHelper& rData,
								SvxClipboardFmtItem & rToFill );

	// Interfaces for Drag & Drop
	void StartDrag( Window* pWin, const Point& rPos );
	
	SwWrtShell* GetShell()				{ return pWrtShell; }
	void SetCleanUp( sal_Bool bFlag )		{ bCleanUp = bFlag; }

	// Interfaces for Selection
	/* #96392# Added pCreator to distinguish SwFrameShell from SwWrtShell. */
	static void CreateSelection( SwWrtShell & rSh,
								 const ViewShell * pCreator = NULL );
	static void ClearSelection( SwWrtShell& rSh,
								const ViewShell * pCreator = NULL );

    // the related SwView is being closed and the SwTransferable is invalid now
    void    Invalidate() {pWrtShell = 0;}
    static const ::com::sun::star::uno::Sequence< sal_Int8 >& getUnoTunnelId();

    virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw( ::com::sun::star::uno::RuntimeException );
};


#endif
