/**************************************************************
 * 
 * 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_sc.hxx"

#include <svx/svxdlg.hxx> //CHINA001
#include <svx/dialogs.hrc> //CHINA001

#include "scitems.hxx"

#include <editeng/eeitem.hxx>
#include <svx/fontwork.hxx>
//#include <svx/labdlg.hxx>	CHINA001
#include <svl/srchitem.hxx>
#include <svx/tabarea.hxx>
#include <svx/tabline.hxx>
//CHINA001 #include <svx/transfrm.hxx>
#include <sfx2/app.hxx>
#include <sfx2/objface.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/request.hxx>
#include <sfx2/dispatch.hxx>
#include <svl/whiter.hxx>
#include <vcl/msgbox.hxx>

#include "drawsh.hxx"
#include "drwlayer.hxx"
#include "sc.hrc"
#include "viewdata.hxx"
#include "document.hxx"
#include "docpool.hxx"
#include "drawview.hxx"
#include "scresid.hxx"
#include <svx/svdobj.hxx>
//add header of cui CHINA001
#include <svx/svxdlg.hxx>
#include <svx/dialogs.hrc>
#include <svx/drawitem.hxx>
#include <svx/xtable.hxx>
#include "tabvwsh.hxx"
#include <sfx2/bindings.hxx>

#define ScDrawShell
#include "scslots.hxx"

#include "userdat.hxx"
#include <sfx2/objsh.hxx>
#include <svl/macitem.hxx>
#include <sfx2/evntconf.hxx>
#include <sfx2/viewsh.hxx>
#include <com/sun/star/util/XModifiable.hpp>
#include <com/sun/star/frame/XFrame.hpp>

//------------------------------------------------------------------

TYPEINIT1( ScDrawShell, SfxShell );

SFX_IMPL_INTERFACE(ScDrawShell, SfxShell, ScResId(SCSTR_DRAWSHELL) )
{
	SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT|SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_SERVER,
								ScResId(RID_DRAW_OBJECTBAR) );
	SFX_POPUPMENU_REGISTRATION( ScResId(RID_POPUP_DRAW) );
	SFX_CHILDWINDOW_REGISTRATION( SvxFontWorkChildWindow::GetChildWindowId() );
}


// abschalten der nicht erwuenschten Acceleratoren:

void ScDrawShell::StateDisableItems( SfxItemSet &rSet )
{
	SfxWhichIter aIter(rSet);
	sal_uInt16 nWhich = aIter.FirstWhich();

	while (nWhich)
	{
		rSet.DisableItem( nWhich );
		nWhich = aIter.NextWhich();
	}
}

void lcl_setModified( SfxObjectShell*  pShell )
{
    if ( pShell )
    {
        com::sun::star::uno::Reference< com::sun::star::util::XModifiable > xModif( pShell->GetModel(), com::sun::star::uno::UNO_QUERY );
        if ( xModif.is() )
            xModif->setModified( sal_True );
    }
}

void ScDrawShell::ExecDrawAttr( SfxRequest& rReq )
{
	sal_uInt16				nSlot		= rReq.GetSlot();
	Window* 			pWin		= pViewData->GetActiveWin();
//	SfxViewFrame*		pViewFrame	= SfxViewShell::Current()->GetViewFrame(); //!!! koennte knallen
	ScDrawView* 		pView		= pViewData->GetScDrawView();
	SdrModel*			pDoc		= pViewData->GetDocument()->GetDrawLayer();

    const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
    sal_uLong nMarkCount = rMarkList.GetMarkCount();
    SdrObject* pSingleSelectedObj = NULL;
    if ( nMarkCount > 0 )
        pSingleSelectedObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();

	switch ( nSlot )
	{
        case SID_ASSIGNMACRO:
            {
                if ( pSingleSelectedObj )
                    ExecuteMacroAssign( pSingleSelectedObj, pWin );
            }
            break;

		case SID_TEXT_STANDARD:	// Harte Textattributierung loeschen
			{
				SfxItemSet aEmptyAttr(GetPool(), EE_ITEMS_START, EE_ITEMS_END);
				pView->SetAttributes(aEmptyAttr, sal_True);
			}
			break;

		case SID_ATTR_LINE_STYLE:
		case SID_ATTR_LINEEND_STYLE:
        case SID_ATTR_LINE_START:
        case SID_ATTR_LINE_END:
		case SID_ATTR_LINE_DASH:
		case SID_ATTR_LINE_WIDTH:
		case SID_ATTR_LINE_COLOR:
        case SID_ATTR_LINE_TRANSPARENCE:
        case SID_ATTR_LINE_JOINT:
        case SID_ATTR_LINE_CAP:
		case SID_ATTR_FILL_STYLE:
		case SID_ATTR_FILL_COLOR:
		case SID_ATTR_FILL_GRADIENT:
		case SID_ATTR_FILL_HATCH:
		case SID_ATTR_FILL_BITMAP:
		case SID_ATTR_FILL_TRANSPARENCE:
		case SID_ATTR_FILL_FLOATTRANSPARENCE:

		// #i25616#
		case SID_ATTR_FILL_SHADOW:
			{
				// Wenn ToolBar vertikal :
				if ( !rReq.GetArgs() )
				{
					switch ( nSlot )
					{
						case SID_ATTR_LINE_STYLE:
						case SID_ATTR_LINE_DASH:
						case SID_ATTR_LINE_WIDTH:
						case SID_ATTR_LINE_COLOR:
                        case SID_ATTR_LINE_TRANSPARENCE:
                        case SID_ATTR_LINE_JOINT:
                        case SID_ATTR_LINE_CAP:
							ExecuteLineDlg( rReq );
							break;

						case SID_ATTR_FILL_STYLE:
						case SID_ATTR_FILL_COLOR:
						case SID_ATTR_FILL_GRADIENT:
						case SID_ATTR_FILL_HATCH:
						case SID_ATTR_FILL_BITMAP:
		                case SID_ATTR_FILL_TRANSPARENCE:
		                case SID_ATTR_FILL_FLOATTRANSPARENCE:

						// #i25616#
						case SID_ATTR_FILL_SHADOW:

							ExecuteAreaDlg( rReq );
							break;

						default:
							break;
					}

					//=====
					return;
					//=====
				}

				if( pView->AreObjectsMarked() )
					pView->SetAttrToMarked( *rReq.GetArgs(), sal_False );
				else
					pView->SetDefaultAttr( *rReq.GetArgs(), sal_False);
				pView->InvalidateAttribs();
			}
			break;

		case SID_ATTRIBUTES_LINE:
			ExecuteLineDlg( rReq );
			break;

		case SID_ATTRIBUTES_AREA:
			ExecuteAreaDlg( rReq );
			break;

		case SID_DRAWTEXT_ATTR_DLG:
			ExecuteTextAttrDlg( rReq );
			break;

#ifdef ISSUE66550_HLINK_FOR_SHAPES
        case SID_DRAW_HLINK_EDIT:
            if ( pSingleSelectedObj )
                pViewData->GetDispatcher().Execute( SID_HYPERLINK_DIALOG );
            break;

        case SID_DRAW_HLINK_DELETE:
            if ( pSingleSelectedObj )
                SetHlinkForObject( pSingleSelectedObj, rtl::OUString() );
            break;

        case SID_OPEN_HYPERLINK:
            if ( nMarkCount == 1 )
            {
                SdrObject* pObj = rMarkList.GetMark( 0 )->GetMarkedSdrObj();
                if ( pObj->IsGroupObject() )
                {
                    SdrPageView* pPV = 0;
                    SdrObject* pHit = 0;
                    if ( pView->PickObj( pWin->PixelToLogic( pViewData->GetMousePosPixel() ), pView->getHitTolLog(), pHit, pPV, SDRSEARCH_DEEP ) )
                        pObj = pHit;
                }

                ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj );
                if ( pInfo && (pInfo->GetHlink().getLength() > 0) )
                    ScGlobal::OpenURL( pInfo->GetHlink(), String::EmptyString() );
            }
            break;
#endif

		case SID_ATTR_TRANSFORM:
        {
			{
				if ( pView->AreObjectsMarked() )
				{
					const SfxItemSet* pArgs = rReq.GetArgs();

					if( !pArgs )
					{
                        // const SdrMarkList& rMarkList = pView->GetMarkedObjectList();
						if( rMarkList.GetMark(0) != 0 )
						{
							SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
							if( pObj->GetObjIdentifier() == OBJ_CAPTION )
							{
								// --------- Itemset fuer Caption --------
								SfxItemSet aNewAttr(pDoc->GetItemPool());
								pView->GetAttributes(aNewAttr);
								// --------- Itemset fuer Groesse und Position --------
								SfxItemSet aNewGeoAttr(pView->GetGeoAttrFromMarked());

								//SvxCaptionTabDialog* pDlg = new SvxCaptionTabDialog(pWin, pView);
								//change for cui CHINA001
								SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
								if ( pFact )
								{
									SfxAbstractTabDialog *pDlg = pFact->CreateCaptionDialog( pWin, pView );

									const sal_uInt16* pRange = pDlg->GetInputRanges( *aNewAttr.GetPool() );
									SfxItemSet aCombSet( *aNewAttr.GetPool(), pRange );
									aCombSet.Put( aNewAttr );
									aCombSet.Put( aNewGeoAttr );
									pDlg->SetInputSet( &aCombSet );

									if (pDlg->Execute() == RET_OK)
									{
										rReq.Done(*(pDlg->GetOutputItemSet()));
										pView->SetAttributes(*pDlg->GetOutputItemSet());
										pView->SetGeoAttrToMarked(*pDlg->GetOutputItemSet());
                                    }

									delete pDlg;
								}// change for cui
							}
							else
							{
								SfxItemSet aNewAttr(pView->GetGeoAttrFromMarked());
								//CHINA001 SvxTransformTabDialog* pDlg = new SvxTransformTabDialog(pWin, &aNewAttr, pView);
								SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
								if(pFact)
								{
									SfxAbstractTabDialog* pDlg = pFact->CreateSvxTransformTabDialog( pWin, &aNewAttr,pView );
									DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
									if (pDlg->Execute() == RET_OK)
									{
										rReq.Done(*(pDlg->GetOutputItemSet()));
										pView->SetGeoAttrToMarked(*pDlg->GetOutputItemSet());
									}
									delete pDlg;
								}
							}
						}


					}
					else
						pView->SetGeoAttrToMarked( *pArgs );
				}
			}

            ScTabViewShell* pViewShell = pViewData->GetViewShell();
            SfxBindings& rBindings=pViewShell->GetViewFrame()->GetBindings();
            rBindings.Invalidate(SID_ATTR_TRANSFORM_WIDTH);
            rBindings.Invalidate(SID_ATTR_TRANSFORM_HEIGHT);
            rBindings.Invalidate(SID_ATTR_TRANSFORM_POS_X);
            rBindings.Invalidate(SID_ATTR_TRANSFORM_POS_Y);
            rBindings.Invalidate(SID_ATTR_TRANSFORM_ANGLE);
            rBindings.Invalidate(SID_ATTR_TRANSFORM_ROT_X);
            rBindings.Invalidate(SID_ATTR_TRANSFORM_ROT_Y);
            rBindings.Invalidate(SID_ATTR_TRANSFORM_AUTOWIDTH);
            rBindings.Invalidate(SID_ATTR_TRANSFORM_AUTOHEIGHT);
            break;
        }
        
		default:
			break;
	}
}

void ScDrawShell::ExecuteMacroAssign( SdrObject* pObj, Window* pWin )
{
    SvxMacroItem aItem ( SFX_APP()->GetPool().GetWhich( SID_ATTR_MACROITEM ) );
    ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj, sal_True );
    if ( pInfo->GetMacro().getLength() > 0 )
    {
        SvxMacroTableDtor aTab;
        String sMacro(  pInfo->GetMacro() );
        aTab.Insert( SFX_EVENT_MOUSECLICK_OBJECT, new SvxMacro( sMacro, String() ) );
        aItem.SetMacroTable( aTab );
    }

	// create empty itemset for macro-dlg
    SfxItemSet* pItemSet = new SfxItemSet(SFX_APP()->GetPool(), SID_ATTR_MACROITEM, SID_ATTR_MACROITEM, SID_EVENTCONFIG, SID_EVENTCONFIG, 0 );
    pItemSet->Put ( aItem, SID_ATTR_MACROITEM );

	SfxEventNamesItem aNamesItem(SID_EVENTCONFIG);
	aNamesItem.AddEvent( ScResId(RID_SCSTR_ONCLICK), String(), SFX_EVENT_MOUSECLICK_OBJECT );
	pItemSet->Put( aNamesItem, SID_EVENTCONFIG );

	com::sun::star::uno::Reference < com::sun::star::frame::XFrame > xFrame;
	if (GetViewShell())
		xFrame = GetViewShell()->GetViewFrame()->GetFrame().GetFrameInterface();

	SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
	SfxAbstractDialog* pMacroDlg = pFact->CreateSfxDialog( pWin, *pItemSet, xFrame, SID_EVENTCONFIG );
	if ( pMacroDlg && pMacroDlg->Execute() == RET_OK )
    {
        const SfxItemSet* pOutSet = pMacroDlg->GetOutputItemSet();
        const SfxPoolItem* pItem;
        if( SFX_ITEM_SET == pOutSet->GetItemState( SID_ATTR_MACROITEM, sal_False, &pItem ))
        {
            rtl::OUString sMacro;
            SvxMacro* pMacro = ((SvxMacroItem*)pItem)->GetMacroTable().Get( SFX_EVENT_MOUSECLICK_OBJECT );
            if ( pMacro )
				sMacro = pMacro->GetMacName();

            if ( pObj->IsGroupObject() )
            {
                SdrObjList* pOL = pObj->GetSubList();
                sal_uLong nObj = pOL->GetObjCount();
                for ( sal_uLong index=0; index<nObj; ++index )
                {
                    pInfo = ScDrawLayer::GetMacroInfo( pOL->GetObj(index), sal_True );
                    pInfo->SetMacro( sMacro );
                }
            }
            else
                pInfo->SetMacro( sMacro );
            lcl_setModified( GetObjectShell() );
        }
    }

	delete pMacroDlg;
	delete pItemSet;
}

void ScDrawShell::ExecuteLineDlg( SfxRequest& rReq, sal_uInt16 nTabPage )
{
	ScDrawView*			pView		= pViewData->GetScDrawView();
	sal_Bool 				bHasMarked	= pView->AreObjectsMarked();
	const SdrObject* 	pObj		= NULL;
	const SdrMarkList&	rMarkList	= pView->GetMarkedObjectList();

	if( rMarkList.GetMarkCount() == 1 )
		pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();

	SfxItemSet	aNewAttr( pView->GetDefaultAttr() );
	if( bHasMarked )
		pView->MergeAttrFromMarked( aNewAttr, sal_False );

//CHINA001	SvxLineTabDialog* pDlg
//CHINA001	= new SvxLineTabDialog( pViewData->GetDialogParent(),
//CHINA001	&aNewAttr,
//CHINA001	pViewData->GetDocument()->GetDrawLayer(),
//CHINA001	pObj,
//CHINA001	bHasMarked );
		SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
		DBG_ASSERT(pFact, "Dialogdiet Factory fail!");//CHINA001
		SfxAbstractTabDialog * pDlg = pFact->CreateSvxLineTabDialog( pViewData->GetDialogParent(),
					&aNewAttr,
				pViewData->GetDocument()->GetDrawLayer(),
				pObj,
				bHasMarked);
		DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
	if ( nTabPage != 0xffff )
		pDlg->SetCurPageId( nTabPage );

	if ( pDlg->Execute() == RET_OK )
	{
		if( bHasMarked )
			pView->SetAttrToMarked( *pDlg->GetOutputItemSet(), sal_False );
		else
			pView->SetDefaultAttr( *pDlg->GetOutputItemSet(), sal_False );

		pView->InvalidateAttribs();
		rReq.Done();
	}

	delete pDlg;
}

void ScDrawShell::ExecuteAreaDlg( SfxRequest& rReq, sal_uInt16 nTabPage )
{
	ScDrawView*	pView		= pViewData->GetScDrawView();
	sal_Bool		bHasMarked	= pView->AreObjectsMarked();

	SfxItemSet	aNewAttr( pView->GetDefaultAttr() );
	if( bHasMarked )
		pView->MergeAttrFromMarked( aNewAttr, sal_False );

	//CHINA001 SvxAreaTabDialog* pDlg
	//CHINA001 	= new SvxAreaTabDialog( pViewData->GetDialogParent(),
//CHINA001 								&aNewAttr,
//CHINA001 								pViewData->GetDocument()->GetDrawLayer(),
//CHINA001 								pView );

	SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
	DBG_ASSERT(pFact, "Dialogdiet Factory fail!");//CHINA001
	AbstractSvxAreaTabDialog * pDlg = pFact->CreateSvxAreaTabDialog( pViewData->GetDialogParent(),
																	&aNewAttr,
															pViewData->GetDocument()->GetDrawLayer(),
															pView);
	DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001

    // #i74099# by default, the dialog deletes the current color table if a different one is loaded
    // (see SwDrawShell::ExecDrawDlg)
    // const SvxColorTableItem* pColorItem = static_cast<const SvxColorTableItem*>( pViewData->GetSfxDocShell()->GetItem(SID_COLOR_TABLE) );

	if ( nTabPage != 0xffff )
		pDlg->SetCurPageId( nTabPage );

	if ( pDlg->Execute() == RET_OK )
	{
		if( bHasMarked )
			pView->SetAttrToMarked( *pDlg->GetOutputItemSet(), sal_False );
		else
			pView->SetDefaultAttr( *pDlg->GetOutputItemSet(), sal_False );

		pView->InvalidateAttribs();
		rReq.Done();
	}

	delete pDlg;
}

void ScDrawShell::ExecuteTextAttrDlg( SfxRequest& rReq, sal_uInt16 /* nTabPage */ )
{
	ScDrawView*	pView		= pViewData->GetScDrawView();
	sal_Bool		bHasMarked	= pView->AreObjectsMarked();
	SfxItemSet	aNewAttr	( pView->GetDefaultAttr() );

	if( bHasMarked )
		pView->MergeAttrFromMarked( aNewAttr, sal_False );

	SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
	SfxAbstractTabDialog *pDlg = pFact->CreateTextTabDialog( pViewData->GetDialogParent(), &aNewAttr, pView );

	sal_uInt16 nResult = pDlg->Execute();

	if ( RET_OK == nResult )
	{
		if ( bHasMarked )
			pView->SetAttributes( *pDlg->GetOutputItemSet() );
		else
			pView->SetDefaultAttr( *pDlg->GetOutputItemSet(), sal_False );

		pView->InvalidateAttribs();
		rReq.Done();
	}
	delete( pDlg );
}

#ifdef ISSUE66550_HLINK_FOR_SHAPES
void ScDrawShell::SetHlinkForObject( SdrObject* pObj, const rtl::OUString& rHlnk )
{
    if ( pObj )
    {
        ScMacroInfo* pInfo = ScDrawLayer::GetMacroInfo( pObj, sal_True );
        pInfo->SetHlink( rHlnk );
        lcl_setModified( GetObjectShell() );
    }
}
#endif

