/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_cui.hxx"
#include <com/sun/star/embed/Aspects.hpp>

#include <pastedlg.hxx>
#include <svtools/svmedit.hxx>
#include <svtools/insdlg.hxx>
#include <vcl/dialog.hxx>
#include <vcl/button.hxx>
#include <vcl/fixed.hxx>
#include <vcl/group.hxx>
#include <vcl/lstbox.hxx>
#include <vcl/msgbox.hxx>
#include "svuidlg.hrc"
#include <sot/formats.hxx>
#include <sot/stg.hxx>
#include <svtools/sores.hxx>
#include <vcl/svapp.hxx>

#include <dialmgr.hxx>

SvPasteObjectDialog::SvPasteObjectDialog( Window* pParent )

    : ModalDialog( pParent, CUI_RES( MD_PASTE_OBJECT ) ),
    aFtSource( this, CUI_RES( FT_SOURCE ) ),
    aFtObjectSource( this, CUI_RES( FT_OBJECT_SOURCE ) ),
    aRbPaste( this, CUI_RES( RB_PASTE ) ),
    aRbPasteLink( this, CUI_RES( RB_PASTE_LINK ) ),
    aCbDisplayAsIcon( this, CUI_RES( CB_DISPLAY_AS_ICON ) ),
    aPbChangeIcon( this, CUI_RES( PB_CHANGE_ICON ) ),
    aFlChoice( this, CUI_RES( FL_CHOICE ) ),
    aLbInsertList( this, CUI_RES( LB_INSERT_LIST ) ),
    aOKButton1( this, CUI_RES( 1 ) ),
    aCancelButton1( this, CUI_RES( 1 ) ),
    aHelpButton1( this, CUI_RES( 1 ) ),
    aSObject( CUI_RES( S_OBJECT ) )
{
    FreeResource();
	SetHelpId( HID_PASTE_DLG );
	SetUniqueId( HID_PASTE_DLG );

	Font aFont = aFtObjectSource.GetFont();
	aFont.SetWeight( WEIGHT_LIGHT );
	aFtObjectSource.SetFont( aFont );
	aOKButton1.Disable();

    ObjectLB().SetSelectHdl( LINK( this, SvPasteObjectDialog, SelectHdl ) );
    ObjectLB().SetDoubleClickHdl( LINK( this, SvPasteObjectDialog, DoubleClickHdl ) );
	SetDefault();

	aLbInsertList.SetAccessibleName(aFlChoice.GetText());
}

void SvPasteObjectDialog::SelectObject()
{
	if ( aLbInsertList.GetEntryCount() &&
		 !aRbPaste.IsVisible() && !aRbPasteLink.IsVisible() )
	{
		aLbInsertList.SelectEntryPos(0);
		SelectHdl( &aLbInsertList );
	}
}

IMPL_LINK( SvPasteObjectDialog, SelectHdl, ListBox *, pListBox )
{
	(void)pListBox;

	if ( !aOKButton1.IsEnabled() )
		aOKButton1.Enable();
	return 0;
}

IMPL_LINK_INLINE_START( SvPasteObjectDialog, DoubleClickHdl, ListBox *, pListBox )
{
	(void)pListBox;

	EndDialog( RET_OK );
	return 0;
}
IMPL_LINK_INLINE_END( SvPasteObjectDialog, DoubleClickHdl, ListBox *, pListBox )

void SvPasteObjectDialog::SetDefault()
{
	bLink   = sal_False;
    nAspect = (sal_uInt16)::com::sun::star::embed::Aspects::MSOLE_CONTENT;
}

SvPasteObjectDialog::~SvPasteObjectDialog()
{
	void * pStr = aSupplementTable.First();
	while( pStr )
	{
		delete (String *)pStr;
		pStr = aSupplementTable.Next();
	}
}

/*************************************************************************
|*    SvPasteObjectDialog::Insert()
|*
|*    Beschreibung
|*    Ersterstellung    MM 14.06.94
|*    Letzte Aenderung  KA 16.03.2001
*************************************************************************/
void SvPasteObjectDialog::Insert( SotFormatStringId nFormat, const String& rFormatName )
{
	String * pStr = new String( rFormatName );
	if( !aSupplementTable.Insert( nFormat, pStr ) )
		delete pStr;
}

sal_uLong SvPasteObjectDialog::GetFormat( const TransferableDataHelper& rHelper,
                                      const DataFlavorExVector* pFormats,
                                      const TransferableObjectDescriptor* )
{
    //TODO/LATER: why is the Descriptor never used?!
	TransferableObjectDescriptor aDesc;
    if( rHelper.HasFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) )
	    ((TransferableDataHelper&)rHelper).GetTransferableObjectDescriptor(
								SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aDesc );
    if ( !pFormats )
        pFormats = &rHelper.GetDataFlavorExVector();

	//Dialogbox erzeugen und fuellen
	String aSourceName, aTypeName;
	sal_uLong nSelFormat = 0;
	SvGlobalName aEmptyNm;

    ObjectLB().SetUpdateMode( sal_False );

    DataFlavorExVector::iterator aIter( ((DataFlavorExVector&)*pFormats).begin() ),
                                 aEnd( ((DataFlavorExVector&)*pFormats).end() );
	while( aIter != aEnd )
	{
		::com::sun::star::datatransfer::DataFlavor aFlavor( *aIter );
		SotFormatStringId nFormat = (*aIter++).mnSotId;

		String*	pName = (String*) aSupplementTable.Get( nFormat );
		String aName;

#ifdef WNT
/*
		if( !pName &&
			( nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE_OLE || nFormat == SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE ) )
		{
			sal_Bool IsClipboardObject_Impl( SotDataObject * );
			if( IsClipboardObject_Impl( pDataObj ) )
			{
				IDataObject * pDO = NULL;
				OleGetClipboard( &pDO );
				if( pDO )
				{
					FORMATETC fe;
					STGMEDIUM stm;
					(fe).cfFormat=RegisterClipboardFormat( "Object Descriptor" );
					(fe).dwAspect=DVASPECT_CONTENT;
					(fe).ptd=NULL;
					(fe).tymed=TYMED_HGLOBAL;
					(fe).lindex=-1;

					if (SUCCEEDED(pDO->GetData(&fe, &stm)))
					{
						LPOBJECTDESCRIPTOR pOD=(LPOBJECTDESCRIPTOR)GlobalLock(stm.hGlobal);
						if( pOD->dwFullUserTypeName )
						{
							OLECHAR * pN = (OLECHAR *)(((sal_uInt8 *)pOD) + pOD->dwFullUserTypeName);
							aName.Append( pN );
							pName = &aName;
							// set format to ole object
							nFormat = SOT_FORMATSTR_ID_EMBED_SOURCE_OLE;
						}
						if( pOD->dwSrcOfCopy )
						{
							OLECHAR * pN = (OLECHAR *)(((sal_uInt8 *)pOD) + pOD->dwSrcOfCopy);
							aSourceName.Append( *pN++ );
						}
						else
							aSourceName = String( ResId( STR_UNKNOWN_SOURCE, SOAPP->GetResMgr() ) );
						GlobalUnlock(stm.hGlobal);
						ReleaseStgMedium(&stm);
					}
				}
			}
		}
*/
#endif

		// if there is an "Embed Source" or and "Embedded Object" on the
		// Clipboard we read the Description and the Source of this object
		// from an accompanied "Object Descriptor" format on the clipboard
		// Remember: these formats mostly appear together on the clipboard
		if ( !pName )
		{
            SvPasteObjectHelper::GetEmbeddedName(rHelper,aName,aSourceName,nFormat);
			if ( aName.Len() )
				pName = &aName;
		}


		if( pName )
		{
			aName = *pName;

			if( SOT_FORMATSTR_ID_EMBED_SOURCE == nFormat )
			{
                if( aDesc.maClassName != aEmptyNm )                                {
					aSourceName = aDesc.maDisplayName;

					if( aDesc.maClassName == aObjClassName )
						aName = aObjName;
					else
						aName = aTypeName = aDesc.maTypeName;
				}
			}
			else if( SOT_FORMATSTR_ID_LINK_SOURCE == nFormat )
			{
                PasteLink().Enable();
				continue;
			}
			else if( !aName.Len() )
                aName = SvPasteObjectHelper::GetSotFormatUIName( nFormat );

            if( LISTBOX_ENTRY_NOTFOUND == ObjectLB().GetEntryPos( aName ) )
                ObjectLB().SetEntryData(
                    ObjectLB().InsertEntry( aName ), (void*) nFormat );
		}
	}

	if( !aTypeName.Len() && !aSourceName.Len() )
	{
		if( aDesc.maClassName != aEmptyNm )
		{
			aSourceName = aDesc.maDisplayName;
			aTypeName = aDesc.maTypeName;
		}

		if( !aTypeName.Len() && !aSourceName.Len() )
        {
            com::sun::star::lang::Locale aLocale = Application::GetSettings().GetUILocale();
            ResMgr* pMgr = ResMgr::CreateResMgr( "svt", aLocale );
            // global resource from svtools (former so3 resource)
            if( pMgr )
                aSourceName = String( ResId( STR_UNKNOWN_SOURCE, *pMgr ) );
            delete pMgr;
        }
	}

    ObjectLB().SetUpdateMode( sal_True );
    SelectObject();

	if( aSourceName.Len() )
	{
		if( aTypeName.Len() )
			aTypeName += '\n';

		aTypeName += aSourceName;
		aTypeName.ConvertLineEnd();
	}

    ObjectSource().SetText( aTypeName );

	SetDefault();

    if( Dialog::Execute() == RET_OK )
	{
        bLink = PasteLink().IsChecked();

        if( AsIconBox().IsChecked() )
            nAspect = (sal_uInt16)com::sun::star::embed::Aspects::MSOLE_ICON;

        nSelFormat  = (sal_uLong)ObjectLB().GetEntryData( ObjectLB().GetSelectEntryPos() );
	}

	return nSelFormat;
}

void SvPasteObjectDialog::SetObjName( const SvGlobalName & rClass, const String & rObjName )
{
    aObjClassName = rClass;
    aObjName = rObjName;
}