/**************************************************************
 * 
 * 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_sw.hxx"
#include <basic/basmgr.hxx>
#include <svtools/imapobj.hxx>
#include <svl/urihelper.hxx>
#include <unotools/securityoptions.hxx>
#include <vcl/help.hxx>
#include <svx/svdview.hxx>
#include <fmturl.hxx>
#include <frmfmt.hxx>
#include <doc.hxx>
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#include <shellres.hxx>
#include <viewimp.hxx>
#include <pagefrm.hxx>
#include <cntfrm.hxx>
#include <rootfrm.hxx>
#include <frmatr.hxx>
#include <viewsh.hxx>
#include <drawdoc.hxx>
#include <dpage.hxx>
#include <dcontact.hxx>
#include <dflyobj.hxx>
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#include <usrfld.hxx>
#include <flyfrm.hxx>
#include <ndnotxt.hxx>
#include <grfatr.hxx>
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>

using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::drawing;
using namespace ::com::sun::star::frame;

SwDPage::SwDPage(SwDrawDocument& rNewModel, sal_Bool bMasterPage) :
	FmFormPage(rNewModel, 0, bMasterPage),
	pGridLst( 0 ),
	rDoc(rNewModel.GetDoc())
{
}


SwDPage::~SwDPage()
{
	delete pGridLst;
}

/*************************************************************************
|*
|*	SwDPage::ReplaceObject()
|*
|*	Ersterstellung		MA 07. Aug. 95
|*	Letzte Aenderung	MA 07. Aug. 95
|*
*************************************************************************/

SdrObject*  SwDPage::ReplaceObject( SdrObject* pNewObj, sal_uLong nObjNum )
{
	SdrObject *pOld = GetObj( nObjNum );
	ASSERT( pOld, "Oups, Object not replaced" );
	SdrObjUserCall* pContact;
	if ( 0 != ( pContact = GetUserCall(pOld) ) &&
		 RES_DRAWFRMFMT == ((SwContact*)pContact)->GetFmt()->Which())
		((SwDrawContact*)pContact)->ChangeMasterObject( pNewObj );
	return FmFormPage::ReplaceObject( pNewObj, nObjNum );
}

/*************************************************************************
|*
|*	SwDPage::GetGridFrameList()
|*
|*	Ersterstellung		MA 04. Sep. 95
|*	Letzte Aenderung	MA 15. Feb. 96
|*
*************************************************************************/

void InsertGridFrame( SdrPageGridFrameList *pLst, const SwFrm *pPg )
{
	SwRect aPrt( pPg->Prt() );
	aPrt += pPg->Frm().Pos();
	const Rectangle aUser( aPrt.SVRect() );
	const Rectangle aPaper( pPg->Frm().SVRect() );
	pLst->Insert( SdrPageGridFrame( aPaper, aUser ) );
}


const SdrPageGridFrameList*  SwDPage::GetGridFrameList(
						const SdrPageView* pPV, const Rectangle *pRect ) const
{
	ViewShell *pSh = ((SwDrawDocument*)GetModel())->GetDoc().GetCurrentViewShell();	//swmod 071108//swmod 071225
	if ( pSh )
	{
		while ( pSh->Imp()->GetPageView() != pPV )
			pSh = (ViewShell*)pSh->GetNext();
		if ( pSh )
		{
			if ( pGridLst )
				((SwDPage*)this)->pGridLst->Clear();
			else
				((SwDPage*)this)->pGridLst = new SdrPageGridFrameList;

			if ( pRect )
			{
				//Das Drawing verlang alle Seiten, die mit dem Rect ueberlappen.
				const SwRect aRect( *pRect );
				const SwFrm *pPg = pSh->GetLayout()->Lower();
				do
				{	if ( pPg->Frm().IsOver( aRect ) )
						::InsertGridFrame( ((SwDPage*)this)->pGridLst, pPg );
					pPg = pPg->GetNext();
				} while ( pPg );
			}
			else
			{
				//Das Drawing verlangt alle sichbaren Seiten
				const SwFrm *pPg = pSh->Imp()->GetFirstVisPage();
				if ( pPg )
					do
					{	::InsertGridFrame( ((SwDPage*)this)->pGridLst, pPg );
						pPg = pPg->GetNext();
					} while ( pPg && pPg->Frm().IsOver( pSh->VisArea() ) );
			}
		}
	}
	return pGridLst;
}

sal_Bool SwDPage::RequestHelp( Window* pWindow, SdrView* pView,
						   const HelpEvent& rEvt )
{
	sal_Bool bWeiter = sal_True;

	if( rEvt.GetMode() & ( HELPMODE_QUICK | HELPMODE_BALLOON ))
	{
		Point aPos( rEvt.GetMousePosPixel() );
		aPos = pWindow->ScreenToOutputPixel( aPos );
		aPos = pWindow->PixelToLogic( aPos );

		SdrPageView* pPV;
		SdrObject* pObj;
		if( pView->PickObj( aPos, 0, pObj, pPV, SDRSEARCH_PICKMACRO ) &&
			 pObj->ISA(SwVirtFlyDrawObj) )
		{
			SwFlyFrm *pFly = ((SwVirtFlyDrawObj*)pObj)->GetFlyFrm();
			const SwFmtURL &rURL = pFly->GetFmt()->GetURL();
			String sTxt;
			if( rURL.GetMap() )
			{
                IMapObject *pTmpObj = pFly->GetFmt()->GetIMapObject( aPos, pFly );
                if( pTmpObj )
				{
                    sTxt = pTmpObj->GetAltText();
					if ( !sTxt.Len() )
                        sTxt = URIHelper::removePassword( pTmpObj->GetURL(),
										INetURLObject::WAS_ENCODED,
			   							INetURLObject::DECODE_UNAMBIGUOUS);
				}
			}
			else if ( rURL.GetURL().Len() )
			{
				sTxt = URIHelper::removePassword( rURL.GetURL(),
										INetURLObject::WAS_ENCODED,
			   							INetURLObject::DECODE_UNAMBIGUOUS);

				if( rURL.IsServerMap() )
				{
					// dann die rel. Pixel Position anhaengen !!
					Point aPt( aPos );
					aPt -= pFly->Frm().Pos();
					// ohne MapMode-Offset !!!!!
					// ohne MapMode-Offset, ohne Offset, o ... !!!!!
					aPt = pWindow->LogicToPixel(
							aPt, MapMode( MAP_TWIP ) );
					((( sTxt += '?' ) += String::CreateFromInt32( aPt.X() ))
							 += ',' ) += String::CreateFromInt32( aPt.Y() );
				}
			}

			if ( sTxt.Len() )
			{
                // --> OD 2007-07-26 #i80029#
                sal_Bool bExecHyperlinks = rDoc.GetDocShell()->IsReadOnly();
                if ( !bExecHyperlinks )
                {
                    SvtSecurityOptions aSecOpts;
                    bExecHyperlinks = !aSecOpts.IsOptionSet( SvtSecurityOptions::E_CTRLCLICK_HYPERLINK );

                    if ( !bExecHyperlinks )
                    {
                        sTxt.InsertAscii( ": ", 0 );
                        sTxt.Insert( ViewShell::GetShellRes()->aHyperlinkClick, 0 );
                    }
                }

                // <--

				if( rEvt.GetMode() & HELPMODE_BALLOON )
				{
					Help::ShowBalloon( pWindow, rEvt.GetMousePosPixel(), sTxt );
                }
                else
                {
			// dann zeige die Hilfe mal an:
					Rectangle aRect( rEvt.GetMousePosPixel(), Size(1,1) );
					Help::ShowQuickHelp( pWindow, aRect, sTxt );
				}
				bWeiter = sal_False;
			}
		}
	}

	if( bWeiter )
		bWeiter = !FmFormPage::RequestHelp( pWindow, pView, rEvt );

	return bWeiter;
}
/* -----------------------------27.11.00 07:35--------------------------------

 ---------------------------------------------------------------------------*/
Reference< XInterface > SwDPage::createUnoPage()
{
	Reference < XInterface > xRet;
	SwDocShell* pDocShell = rDoc.GetDocShell();
	if ( pDocShell )
	{
		Reference<XModel> xModel = pDocShell->GetBaseModel();
		Reference<XDrawPageSupplier> xPageSupp(xModel, UNO_QUERY);
		xRet = xPageSupp->getDrawPage();
	}
	return xRet;
}