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

#include "BezierObjectBar.hxx"
#include <sfx2/app.hxx>
#include <sfx2/msg.hxx>

#include <sfx2/viewfrm.hxx>
#include <sfx2/objface.hxx>

#include <svx/svxids.hrc>
#include <svl/eitem.hxx>
#include <sfx2/request.hxx>
#include <svx/svdopath.hxx>
#include <svl/aeitem.hxx>
#include <svx/svdundo.hxx>
#include <sfx2/dispatch.hxx>


#include "sdresid.hxx"



#include "res_bmp.hrc"
#include "glob.hrc"
#include "strings.hrc"

#include "DrawDocShell.hxx"
#include "ViewShell.hxx"
#include "Window.hxx"
#include "drawview.hxx"
#include "drawdoc.hxx"
#include "sdresid.hxx"
#include "fusel.hxx"
#include "fuconbez.hxx"


using namespace sd;
#define BezierObjectBar
#include "sdslots.hxx"

namespace sd {

/*************************************************************************
|*
|* Standardinterface deklarieren (Die Slotmap darf nicht leer sein)
|*
\************************************************************************/



SFX_IMPL_INTERFACE(BezierObjectBar, ::SfxShell, SdResId(STR_BEZIEROBJECTBARSHELL))
{
}

TYPEINIT1(BezierObjectBar, ::SfxShell);

/*************************************************************************
|*
|* Standard-Konstruktor
|*
\************************************************************************/

BezierObjectBar::BezierObjectBar(
    ViewShell* pSdViewShell,
    ::sd::View* pSdView)
    : SfxShell(pSdViewShell->GetViewShell()),
      mpView(pSdView),
      mpViewSh(pSdViewShell)
{
	DrawDocShell* pDocShell = mpViewSh->GetDocSh();
	SetPool(&pDocShell->GetPool());
	SetUndoManager(pDocShell->GetUndoManager());
	SetRepeatTarget(mpView);

	SetHelpId( SD_IF_SDDRAWBEZIEROBJECTBAR );
}

/*************************************************************************
|*
|* Destruktor
|*
\************************************************************************/

BezierObjectBar::~BezierObjectBar()
{
	SetRepeatTarget(NULL);
}


/*************************************************************************
|*
|* Status der Attribut-Items
|*
\************************************************************************/

void BezierObjectBar::GetAttrState(SfxItemSet& rSet)
{
	SfxItemSet aAttrSet( mpView->GetDoc()->GetPool() );
	mpView->GetAttributes( aAttrSet );
	rSet.Put(aAttrSet, sal_False); // <- sal_False, damit DontCare-Status uebernommen wird

	FunctionReference xFunc( mpViewSh->GetCurrentFunction() );

	if(xFunc.is())
	{
		if(xFunc->ISA(FuSelection))
		{
			sal_uInt16 nEditMode = static_cast<FuSelection*>(xFunc.get())->GetEditMode();
			rSet.Put(SfxBoolItem(nEditMode, sal_True));
		}
		else if (xFunc->ISA(FuConstructBezierPolygon))
		{
			sal_uInt16 nEditMode = static_cast<FuConstructBezierPolygon*>(xFunc.get())->GetEditMode();
			rSet.Put(SfxBoolItem(nEditMode, sal_True));
		}
	}

	if(!mpView->IsMoveAllowed() || !mpView->IsResizeAllowed())
	{
		// #i77187# if object is move and/or size protected, do not allow point editing at all
		rSet.DisableItem(SID_BEZIER_MOVE);
		rSet.DisableItem(SID_BEZIER_INSERT);

		rSet.DisableItem(SID_BEZIER_DELETE);
		rSet.DisableItem(SID_BEZIER_CUTLINE);
		rSet.DisableItem(SID_BEZIER_CONVERT);

		rSet.DisableItem(SID_BEZIER_EDGE);
		rSet.DisableItem(SID_BEZIER_SMOOTH);
		rSet.DisableItem(SID_BEZIER_SYMMTR);

		rSet.DisableItem(SID_BEZIER_CLOSE);

		rSet.DisableItem(SID_BEZIER_ELIMINATE_POINTS);
	}
	else
	{
		IPolyPolygonEditorController* pIPPEC = 0;
		if( mpView->GetMarkedObjectList().GetMarkCount() )
			pIPPEC = mpView;
		else
			pIPPEC = dynamic_cast< IPolyPolygonEditorController* >( mpView->getSmartTags().getSelected().get() );

		if ( !pIPPEC || !pIPPEC->IsRipUpAtMarkedPointsPossible())
		{
			rSet.DisableItem(SID_BEZIER_CUTLINE);
		}
		if (!pIPPEC || !pIPPEC->IsDeleteMarkedPointsPossible())
		{
			rSet.DisableItem(SID_BEZIER_DELETE);
		}
		if (!pIPPEC || !pIPPEC->IsSetMarkedSegmentsKindPossible())
		{
			rSet.DisableItem(SID_BEZIER_CONVERT);
		}
		else
		{
			SdrPathSegmentKind eSegm = pIPPEC->GetMarkedSegmentsKind();
			switch (eSegm)
			{
				case SDRPATHSEGMENT_DONTCARE: rSet.InvalidateItem(SID_BEZIER_CONVERT); break;
				case SDRPATHSEGMENT_LINE    : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,sal_False)); break; // Button reingedrueckt = Kurve
				case SDRPATHSEGMENT_CURVE   : rSet.Put(SfxBoolItem(SID_BEZIER_CONVERT,sal_True));  break;
				default: break;
			}
		}
		if (!pIPPEC || !pIPPEC->IsSetMarkedPointsSmoothPossible())
		{
			rSet.DisableItem(SID_BEZIER_EDGE);
			rSet.DisableItem(SID_BEZIER_SMOOTH);
			rSet.DisableItem(SID_BEZIER_SYMMTR);
		}
		else
		{
			SdrPathSmoothKind eSmooth = pIPPEC->GetMarkedPointsSmooth();
			switch (eSmooth)
			{
				case SDRPATHSMOOTH_DONTCARE  : break;
				case SDRPATHSMOOTH_ANGULAR   : rSet.Put(SfxBoolItem(SID_BEZIER_EDGE,  sal_True)); break;
				case SDRPATHSMOOTH_ASYMMETRIC: rSet.Put(SfxBoolItem(SID_BEZIER_SMOOTH,sal_True)); break;
				case SDRPATHSMOOTH_SYMMETRIC : rSet.Put(SfxBoolItem(SID_BEZIER_SYMMTR,sal_True)); break;
			}
		}
		if (!pIPPEC || !pIPPEC->IsOpenCloseMarkedObjectsPossible())
		{
			rSet.DisableItem(SID_BEZIER_CLOSE);
		}
		else
		{
			SdrObjClosedKind eClose = pIPPEC->GetMarkedObjectsClosedState();
			switch (eClose)
			{
				case SDROBJCLOSED_DONTCARE: rSet.InvalidateItem(SID_BEZIER_CLOSE); break;
				case SDROBJCLOSED_OPEN    : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,sal_False)); break;
				case SDROBJCLOSED_CLOSED  : rSet.Put(SfxBoolItem(SID_BEZIER_CLOSE,sal_True)); break;
				default: break;
			}
		}

		if(pIPPEC == mpView)
			rSet.Put(SfxBoolItem(SID_BEZIER_ELIMINATE_POINTS, mpView->IsEliminatePolyPoints()));
		else
			rSet.DisableItem( SID_BEZIER_ELIMINATE_POINTS ); // only works for views
	}
}


/*************************************************************************
|*
|* Bearbeitung der SfxRequests
|*
\************************************************************************/

void BezierObjectBar::Execute(SfxRequest& rReq)
{
	sal_uInt16 nSId = rReq.GetSlot();

	switch (nSId)
	{
		case SID_BEZIER_CUTLINE:
		case SID_BEZIER_CONVERT:
		case SID_BEZIER_DELETE:
		case SID_BEZIER_EDGE:
		case SID_BEZIER_SMOOTH:
		case SID_BEZIER_SYMMTR:
		case SID_BEZIER_CLOSE:
		{
			const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();

			IPolyPolygonEditorController* pIPPEC = 0;
			if( rMarkList.GetMarkCount() )
				pIPPEC = mpView;
			else
				pIPPEC = dynamic_cast< IPolyPolygonEditorController* >( mpView->getSmartTags().getSelected().get() );

			if( pIPPEC && !mpView->IsAction())
			{
				switch (nSId)
				{
					case SID_BEZIER_DELETE:
						pIPPEC->DeleteMarkedPoints();
						break;

					case SID_BEZIER_CUTLINE:
						pIPPEC->RipUpAtMarkedPoints();
						break;

					case SID_BEZIER_CONVERT:
					{
						pIPPEC->SetMarkedSegmentsKind(SDRPATHSEGMENT_TOGGLE);
						break;
					}

					case SID_BEZIER_EDGE:
					case SID_BEZIER_SMOOTH:
					case SID_BEZIER_SYMMTR:
					{
						SdrPathSmoothKind eKind;

						switch (nSId)
						{
							default:
							case SID_BEZIER_EDGE:   eKind = SDRPATHSMOOTH_ANGULAR; break;
							case SID_BEZIER_SMOOTH: eKind = SDRPATHSMOOTH_ASYMMETRIC; break;
							case SID_BEZIER_SYMMTR: eKind = SDRPATHSMOOTH_SYMMETRIC; break;
						}

						pIPPEC->SetMarkedPointsSmooth(eKind);
						break;
					}

					case SID_BEZIER_CLOSE:
					{
						SdrPathObj* pPathObj = (SdrPathObj*) rMarkList.GetMark(0)->GetMarkedSdrObj();
						const bool bUndo = mpView->IsUndoEnabled();
						if( bUndo )
							mpView->BegUndo(String(SdResId(STR_UNDO_BEZCLOSE)));

						mpView->UnmarkAllPoints();

						if( bUndo )
							mpView->AddUndo(mpView->GetModel()->GetSdrUndoFactory().CreateUndoGeoObject(*pPathObj));

						pPathObj->ToggleClosed();

						if( bUndo )
							mpView->EndUndo();
						break;
					}
				}
			}

			if( (pIPPEC == mpView) && !mpView->AreObjectsMarked() )
				mpViewSh->GetViewFrame()->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON);

			rReq.Ignore();
		}
		break;

		case SID_BEZIER_ELIMINATE_POINTS:
		{
			mpView->SetEliminatePolyPoints(!mpView->IsEliminatePolyPoints());
			Invalidate(SID_BEZIER_ELIMINATE_POINTS);
			rReq.Done();
		}
		break;

		case SID_BEZIER_MOVE:
		case SID_BEZIER_INSERT:
		{
			FunctionReference xFunc( mpViewSh->GetCurrentFunction() );

			if(xFunc.is())
			{
				if(xFunc->ISA(FuSelection))
				{
					static_cast<FuSelection*>(xFunc.get())->SetEditMode(rReq.GetSlot());
				}
				else if(xFunc->ISA(FuConstructBezierPolygon))
				{
					static_cast<FuConstructBezierPolygon*>(xFunc.get())->SetEditMode(rReq.GetSlot());
				}
			}

			rReq.Ignore ();
		}
		break;

		default:
		break;
	}

	Invalidate();
}


} // end of namespace sd
