/**************************************************************
 *
 * 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 "Ruler.hxx"
#include <svl/ptitem.hxx>
#include <svx/ruler.hxx>
#ifndef _SVXIDS_HXX //autogen
#include <svx/svxids.hrc>
#endif
#include <sfx2/ctrlitem.hxx>
#include <sfx2/bindings.hxx>


#include "View.hxx"
#include "DrawViewShell.hxx"
#include "Window.hxx"

#include "helpids.h"

namespace sd {

/*************************************************************************
|*
|* Controller-Item fuer Ruler
|*
\************************************************************************/

class RulerCtrlItem : public SfxControllerItem
{
	Ruler &rRuler;

 protected:
	virtual void StateChanged( sal_uInt16 nSId, SfxItemState eState,
								const SfxPoolItem* pItem );

 public:
	RulerCtrlItem(sal_uInt16 nId, Ruler& rRlr, SfxBindings& rBind);
};

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

RulerCtrlItem::RulerCtrlItem(sal_uInt16 _nId, Ruler& rRlr, SfxBindings& rBind)
: SfxControllerItem(_nId, rBind)
, rRuler(rRlr)
{
}


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

void RulerCtrlItem::StateChanged( sal_uInt16 nSId, SfxItemState, const SfxPoolItem* pState )
{
	switch( nSId )
	{
		case SID_RULER_NULL_OFFSET:
		{
			const SfxPointItem* pItem = dynamic_cast< const SfxPointItem* >(pState);
			DBG_ASSERT(pState ? pItem != NULL : sal_True, "SfxPointItem erwartet");
			if ( pItem )
				rRuler.SetNullOffset(pItem->GetValue());
		}
		break;
	}
}


/*************************************************************************
|*
|* Konstruktor
|*
\************************************************************************/

Ruler::Ruler( DrawViewShell& rViewSh, ::Window* pParent, ::sd::Window* pWin, sal_uInt16 nRulerFlags,  SfxBindings& rBindings, WinBits nWinStyle)
: SvxRuler(pParent, pWin, nRulerFlags, rBindings, nWinStyle)
, pSdWin(pWin)
, pDrViewShell(&rViewSh)
{
	rBindings.EnterRegistrations();
	pCtrlItem = new RulerCtrlItem(SID_RULER_NULL_OFFSET, *this, rBindings);
	rBindings.LeaveRegistrations();

	if ( nWinStyle & WB_HSCROLL )
	{
		bHorz = sal_True;
		SetHelpId( HID_SD_RULER_HORIZONTAL );
	}
	else
	{
		bHorz = sal_False;
		SetHelpId( HID_SD_RULER_VERTICAL );
	}
}

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

Ruler::~Ruler()
{
	SfxBindings& rBindings = pCtrlItem->GetBindings();
	rBindings.EnterRegistrations();
	delete pCtrlItem;
	rBindings.LeaveRegistrations();
}

/*************************************************************************
|*
|* MouseButtonDown-Handler
|*
\************************************************************************/

void Ruler::MouseButtonDown(const MouseEvent& rMEvt)
{
	Point aMPos = rMEvt.GetPosPixel();
	RulerType eType = GetType(aMPos);

	if ( !pDrViewShell->GetView()->IsTextEdit() &&
		rMEvt.IsLeft() && rMEvt.GetClicks() == 1 &&
		(eType == RULER_TYPE_DONTKNOW || eType == RULER_TYPE_OUTSIDE) )
	{
		pDrViewShell->StartRulerDrag(*this, rMEvt);
	}
	else
		SvxRuler::MouseButtonDown(rMEvt);
}

/*************************************************************************
|*
|* MouseMove-Handler
|*
\************************************************************************/

void Ruler::MouseMove(const MouseEvent& rMEvt)
{
	SvxRuler::MouseMove(rMEvt);
}

/*************************************************************************
|*
|* MouseButtonUp-Handler
|*
\************************************************************************/

void Ruler::MouseButtonUp(const MouseEvent& rMEvt)
{
	SvxRuler::MouseButtonUp(rMEvt);
}

/*************************************************************************
|*
|* NullOffset setzen
|*
\************************************************************************/

void Ruler::SetNullOffset(const Point& rOffset)
{
	long nOffset;

	if ( bHorz )	nOffset = rOffset.X();
	else			nOffset = rOffset.Y();

	SetNullOffsetLogic(nOffset);
}

/*************************************************************************
|*
|* Command event
|*
\************************************************************************/

void Ruler::Command(const CommandEvent& rCEvt)
{
	if( rCEvt.GetCommand() == COMMAND_CONTEXTMENU &&
		!pDrViewShell->GetView()->IsTextEdit() )
	{
		SvxRuler::Command( rCEvt );
	}
}

/*************************************************************************
|*
|* ExtraDown
|*
\************************************************************************/

void Ruler::ExtraDown()
{
	if( !pDrViewShell->GetView()->IsTextEdit() )
		SvxRuler::ExtraDown();
}

} // end of namespace sd
