/**************************************************************
 *
 * 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_sfx2.hxx"
#include <com/sun/star/container/XChild.hpp>
#include <com/sun/star/embed/XEmbedObjectCreator.hpp>
#include <com/sun/star/embed/XComponentSupplier.hpp>
#include <com/sun/star/embed/XEmbedPersist.hpp>
#include <com/sun/star/util/XCloseable.hpp>
#include <com/sun/star/embed/EmbedStates.hpp>

#include <sfx2/objsh.hxx>
#include <sfx2/app.hxx>
#include "objshimp.hxx"
#include <sfx2/sfx.hrc>
#include <sfx2/event.hxx>

#include <comphelper/seqstream.hxx>
#include <comphelper/processfactory.hxx>
#include <comphelper/storagehelper.hxx>
#include <svtools/embedtransfer.hxx>
#include <vcl/outdev.hxx>
#include <vcl/gdimtf.hxx>

using namespace ::com::sun::star;

// -----------------------------------------------------------------------
// TODO/LATER: this workaround must be replaced by API in future if possible
SfxObjectShell* SfxObjectShell::GetParentShellByModel_Impl()
{
	SfxObjectShell* pResult = NULL;

	try {
		uno::Reference< container::XChild > xChildModel( GetModel(), uno::UNO_QUERY );
		if ( xChildModel.is() )
		{
			uno::Reference< lang::XUnoTunnel > xParentTunnel( xChildModel->getParent(), uno::UNO_QUERY );
			if ( xParentTunnel.is() )
			{
				SvGlobalName aSfxIdent( SFX_GLOBAL_CLASSID );
				pResult = reinterpret_cast<SfxObjectShell*>(xParentTunnel->getSomething(
                                                uno::Sequence< sal_Int8 >( aSfxIdent.GetByteSequence() ) ) );
			}
		}
	}
	catch( uno::Exception& )
	{
		// TODO: error handling
	}

	return pResult;
}

// -----------------------------------------------------------------------
Printer* SfxObjectShell::GetDocumentPrinter()
{
	SfxObjectShell* pParent = GetParentShellByModel_Impl();
	if ( pParent )
		return pParent->GetDocumentPrinter();
	return NULL;
}

// -----------------------------------------------------------------------
OutputDevice* SfxObjectShell::GetDocumentRefDev()
{
	SfxObjectShell* pParent = GetParentShellByModel_Impl();
	if ( pParent )
		return pParent->GetDocumentRefDev();
	return NULL;
}

// -----------------------------------------------------------------------
void SfxObjectShell::OnDocumentPrinterChanged( Printer* /*pNewPrinter*/ )
{
	// virtual method
}

// -----------------------------------------------------------------------
Rectangle SfxObjectShell::GetVisArea( sal_uInt16 nAspect ) const
{
	if( nAspect == ASPECT_CONTENT )
		return pImp->m_aVisArea;
	else if( nAspect == ASPECT_THUMBNAIL )
	{
		Rectangle aRect;
		aRect.SetSize( OutputDevice::LogicToLogic( Size( 5000, 5000 ),
										 MAP_100TH_MM, GetMapUnit() ) );
		return aRect;
	}
	return Rectangle();
}

// -----------------------------------------------------------------------
const Rectangle& SfxObjectShell::GetVisArea() const
{
	pImp->m_aVisArea = GetVisArea( ASPECT_CONTENT );
	return pImp->m_aVisArea;
}

// -----------------------------------------------------------------------
void SfxObjectShell::SetVisArea( const Rectangle & rVisArea )
{
    if( pImp->m_aVisArea != rVisArea )
	{
        pImp->m_aVisArea = rVisArea;
        if ( GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
        {
			if ( IsEnableSetModified() )
            	SetModified( sal_True );

           	SFX_APP()->NotifyEvent(SfxEventHint( SFX_EVENT_VISAREACHANGED, GlobalEventConfig::GetEventName(STR_EVENT_VISAREACHANGED), this));

            /*
            Size aSize (GetVisArea().GetSize());
            if ( GetIPEnv() && GetIPEnv()->GetEditWin() )
                ViewChanged( ASPECT_CONTENT );
            */


            // OutPlace die Gr"o\se des MDI-Fensters anpassen
            // Unbedingt den Gr"o\senvergleich machen, spart nicht nur Zeit, sondern
            // vermeidet auch Rundungsfehler !
            /*
                // in case of ole outplace editing the frame should be found
                SfxViewFrame* pFrameToResize = pFrame ? pFrame : SfxViewFrame::GetFirst( GetObjectShell() );

                if ( pFrameToResize && !pIPF && rRect.GetSize() != aSize &&
                    !pFrameToResize->IsAdjustPosSizePixelLocked_Impl() )

                {
                    // Zuerst die logischen Koordinaten von IP-Objekt und EditWindow
                    // ber"ucksichtigen
                    SfxViewShell *pShell = pFrameToResize->GetViewShell();
                    Window *pWindow = pShell->GetWindow();

                    // Da in den Applikationen bei der R"ucktransformation immer die
                    // Eckpunkte tranformiert werden und nicht die Size (um die Ecken
                    // alignen zu k"onnen), transformieren wir hier auch die Punkte, um
                    // m"oglichst wenig Rundungsfehler zu erhalten.
                    Rectangle aRect = pWindow->LogicToPixel( rRect );
                    Size aSize = aRect.GetSize();
                    pShell->GetWindow()->SetSizePixel( aSize );
                    pFrameToResize->DoAdjustPosSizePixel( pShell, Point(), aSize );
                }

            // bei InPlace die View skalieren
            if ( GetIPEnv() && GetIPEnv()->GetEditWin() && !bDisableViewScaling && pIPF )
                pIPF->GetEnv_Impl()->MakeScale( rRect.GetSize(), GetMapUnit(),
                            pIPF->GetViewShell()->GetWindow()->GetOutputSizePixel() );
           */
        }
    }
}

// -----------------------------------------------------------------------
void SfxObjectShell::SetVisAreaSize( const Size & rVisSize )
{
	SetVisArea( Rectangle( GetVisArea().TopLeft(), rVisSize ) );
}

// -----------------------------------------------------------------------
sal_uIntPtr SfxObjectShell::GetMiscStatus() const
{
	return 0;
}

// -----------------------------------------------------------------------
MapUnit SfxObjectShell::GetMapUnit() const
{
	return pImp->m_nMapUnit;
}

// -----------------------------------------------------------------------
void SfxObjectShell::SetMapUnit( MapUnit nMapUnit )
{
	pImp->m_nMapUnit = nMapUnit;
}

// -----------------------------------------------------------------------
void SfxObjectShell::FillTransferableObjectDescriptor( TransferableObjectDescriptor& rDesc ) const
{
	sal_uInt32 nClipFormat;
	String aAppName, aShortName;
	FillClass( &rDesc.maClassName, &nClipFormat, &aAppName, &rDesc.maTypeName, &aShortName, SOFFICE_FILEFORMAT_CURRENT );

	rDesc.mnViewAspect = ASPECT_CONTENT;
	rDesc.mnOle2Misc = GetMiscStatus();
	rDesc.maSize = OutputDevice::LogicToLogic( GetVisArea().GetSize(), GetMapUnit(), MAP_100TH_MM );
	rDesc.maDragStartPos = Point();
	rDesc.maDisplayName = String();
	rDesc.mbCanLink = sal_False;
}

// -----------------------------------------------------------------------
void SfxObjectShell::DoDraw( OutputDevice* pDev,
							const Point & rObjPos,
							const Size & rSize,
							const JobSetup & rSetup,
							sal_uInt16 nAspect )
{
	MapMode aMod = pDev->GetMapMode();
	Size aSize = GetVisArea( nAspect ).GetSize();
	MapMode aWilliMode( GetMapUnit() );
	aSize = pDev->LogicToLogic( aSize, &aWilliMode, &aMod );
	if( aSize.Width() && aSize.Height() )
	{
		Fraction aXF( rSize.Width(), aSize.Width() );
		Fraction aYF( rSize.Height(), aSize.Height() );

//REMOVE			Point aOrg = rObjPos;
//REMOVE			aMod.SetMapUnit( MAP_100TH_MM );
//REMOVE			aSize = pDev->LogicToLogic( GetVisArea( nAspect ).GetSize(), &aMod, &aWilliMode );
		DoDraw_Impl( pDev, rObjPos, aXF, aYF, rSetup, nAspect );
	}
}

// -----------------------------------------------------------------------
void SfxObjectShell::DoDraw_Impl( OutputDevice* pDev,
							   const Point & rViewPos,
							   const Fraction & rScaleX,
							   const Fraction & rScaleY,
							   const JobSetup & rSetup,
							   sal_uInt16 nAspect )
{
	Rectangle aVisArea  = GetVisArea( nAspect );
	// MapUnit des Ziels
	MapMode aMapMode( GetMapUnit() );
	aMapMode.SetScaleX( rScaleX );
	aMapMode.SetScaleY( rScaleY );

	// Ziel in Pixel
	Point aOrg	 = pDev->LogicToLogic( rViewPos, NULL, &aMapMode );
	Point aDelta = aOrg - aVisArea.TopLeft();

	// Origin entsprechend zum sichtbaren Bereich verschieben
	// Origin mit Scale setzen
	aMapMode.SetOrigin( aDelta );

	// Deviceeinstellungen sichern
	pDev->Push();

	Region aRegion;
	if( pDev->IsClipRegion() && pDev->GetOutDevType() != OUTDEV_PRINTER )
	{
		aRegion = pDev->GetClipRegion();
		aRegion = pDev->LogicToPixel( aRegion );
	}
	pDev->SetRelativeMapMode( aMapMode );

	GDIMetaFile * pMtf = pDev->GetConnectMetaFile();
	if( pMtf )
	{
		if( pMtf->IsRecord() && pDev->GetOutDevType() != OUTDEV_PRINTER )
			pMtf->Stop();
		else
			pMtf = NULL;
	}
// #ifndef UNX
	if( pDev->IsClipRegion() && pDev->GetOutDevType() != OUTDEV_PRINTER )
// #endif
	{
		aRegion = pDev->PixelToLogic( aRegion );
		pDev->SetClipRegion( aRegion );
	}
	if( pMtf )
		pMtf->Record( pDev );

//REMOVE		SvOutPlaceObjectRef xOutRef( this );
//REMOVE		if ( xOutRef.Is() )
//REMOVE			xOutRef->DrawObject( pDev, rSetup, rSize, nAspect );
//REMOVE		else
		Draw( pDev, rSetup, nAspect );
//REMOVE		DrawHatch( pDev, aVisArea.TopLeft(), aVisArea.GetSize() );

	// Deviceeinstellungen wieder herstellen
	pDev->Pop();

}

comphelper::EmbeddedObjectContainer& SfxObjectShell::GetEmbeddedObjectContainer() const
{
    if ( !pImp->mpObjectContainer )
        pImp->mpObjectContainer = new comphelper::EmbeddedObjectContainer( ((SfxObjectShell*)this)->GetStorage(), GetModel() );
    return *pImp->mpObjectContainer;
}

void SfxObjectShell::ClearEmbeddedObjects()
{
    // frees alle space taken by embedded objects
    DELETEZ( pImp->mpObjectContainer );
}
