/**************************************************************
 *
 * 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_svx.hxx"
#include <svx/e3dsceneupdater.hxx>
#include <drawinglayer/geometry/viewinformation3d.hxx>
#include <svx/obj3d.hxx>
#include <svx/scene3d.hxx>
#include <svx/sdr/contact/viewcontactofe3dscene.hxx>

//////////////////////////////////////////////////////////////////////////////

E3DModifySceneSnapRectUpdater::E3DModifySceneSnapRectUpdater(const SdrObject* pObject)
:	mpScene(0),
	mpViewInformation3D(0)
{
	// Secure old 3D transformation stack before modification
    if(pObject)
    {
        const E3dObject* pE3dObject = dynamic_cast< const E3dObject* >(pObject);

        if(pE3dObject)
        {
            mpScene = pE3dObject->GetScene();

            if(mpScene && mpScene->GetScene() == mpScene)
	        {
		        // if there is a scene and it's the outmost scene, get current 3D range
		        const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(mpScene->GetViewContact());
		        const basegfx::B3DRange aAllContentRange(rVCScene.getAllContentRange3D());

		        if(aAllContentRange.isEmpty())
		        {
			        // no content, nothing to do
			        mpScene = 0;
		        }
		        else
		        {
			        // secure current 3D transformation stack
			        mpViewInformation3D = new drawinglayer::geometry::ViewInformation3D(rVCScene.getViewInformation3D(aAllContentRange));
		        }
	        }
        }
    }
}

E3DModifySceneSnapRectUpdater::~E3DModifySceneSnapRectUpdater()
{
	if(mpScene && mpViewInformation3D)
	{
		// after changing parts of the scene, use the secured last 3d transformation stack and the new content
		// range to calculate a new, eventually expanded or shrunk, 2D geometry for the scene and apply it.
		// Get new content range
		const sdr::contact::ViewContactOfE3dScene& rVCScene = static_cast< sdr::contact::ViewContactOfE3dScene& >(mpScene->GetViewContact());
		basegfx::B3DRange aAllContentRange(rVCScene.getAllContentRange3D());

        // only change when there is still content; else let scene stay at old SnapRect
        if(!aAllContentRange.isEmpty())
        {
		    // check if object transform of scene has changed
		    if(mpViewInformation3D->getObjectTransformation() != mpScene->GetTransform())
		    {
			    // If Yes, it needs to be updated since it's - for historical reasons -
			    // part of the basic 3d transformation stack of the scene
			    drawinglayer::geometry::ViewInformation3D* pNew = new drawinglayer::geometry::ViewInformation3D(
				    mpScene->GetTransform(), // replace object transformation with new local transform
				    mpViewInformation3D->getOrientation(),
				    mpViewInformation3D->getProjection(),
				    mpViewInformation3D->getDeviceToView(),
				    mpViewInformation3D->getViewTime(),
				    mpViewInformation3D->getExtendedInformationSequence());
                delete mpViewInformation3D;
                mpViewInformation3D = pNew;
            }

		    // transform content range to scene-relative coordinates using old 3d transformation stack
		    aAllContentRange.transform(mpViewInformation3D->getObjectToView());

		    // build 2d relative content range
		    basegfx::B2DRange aSnapRange(
			    aAllContentRange.getMinX(), aAllContentRange.getMinY(),
			    aAllContentRange.getMaxX(), aAllContentRange.getMaxY());

		    // transform to 2D world coordinates using scene's 2D transformation
		    aSnapRange.transform(rVCScene.getObjectTransformation());

		    // snap to (old) integer
		    const Rectangle aNewSnapRect(
			    sal_Int32(floor(aSnapRange.getMinX())), sal_Int32(floor(aSnapRange.getMinY())),
			    sal_Int32(ceil(aSnapRange.getMaxX())), sal_Int32(ceil(aSnapRange.getMaxY())));

		    // set as new SnapRect and invalidate bound volume
            if(mpScene->GetSnapRect() != aNewSnapRect)
            {
    	        mpScene->SetSnapRect(aNewSnapRect);
	    	    mpScene->InvalidateBoundVolume();
            }
        }
	}

    delete mpViewInformation3D;
}

//////////////////////////////////////////////////////////////////////////////
// eof
