blob: 2307381f65b88361546a67afeb2ada859ec605b0 [file] [log] [blame]
/**************************************************************
*
* 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 "ViewShell.hxx"
#include "smarttag.hxx"
#include "Window.hxx"
#include "View.hxx"
namespace sd
{
// ====================================================================
SmartTag::SmartTag( ::sd::View& rView )
: mrView( rView )
, mbSelected( false )
{
SmartTagReference xThis( this );
mrView.getSmartTags().add( xThis );
}
// --------------------------------------------------------------------
SmartTag::~SmartTag()
{
}
// --------------------------------------------------------------------
bool SmartTag::MouseButtonDown( const MouseEvent&, SmartHdl& )
{
return false;
}
/** returns true if the SmartTag consumes this event. */
bool SmartTag::KeyInput( const KeyEvent& /*rKEvt*/ )
{
return false;
}
/** returns true if the SmartTag consumes this event. */
bool SmartTag::RequestHelp( const HelpEvent& /*rHEvt*/ )
{
return false;
}
/** returns true if the SmartTag consumes this event. */
bool SmartTag::Command( const CommandEvent& /*rCEvt*/ )
{
return false;
}
// --------------------------------------------------------------------
void SmartTag::addCustomHandles( SdrHdlList& /*rHandlerList*/ )
{
}
// --------------------------------------------------------------------
void SmartTag::select()
{
mbSelected = true;
}
// --------------------------------------------------------------------
void SmartTag::deselect()
{
mbSelected = false;
}
// --------------------------------------------------------------------
bool SmartTag::isSelected() const
{
return mbSelected;
}
// --------------------------------------------------------------------
void SmartTag::disposing()
{
SmartTagReference xThis( this );
mrView.getSmartTags().remove( xThis );
}
// --------------------------------------------------------------------
bool SmartTag::getContext( SdrViewContext& /*rContext*/ )
{
return false;
}
// --------------------------------------------------------------------
sal_uLong SmartTag::GetMarkablePointCount() const
{
return 0;
}
// --------------------------------------------------------------------
sal_uLong SmartTag::GetMarkedPointCount() const
{
return 0;
}
// --------------------------------------------------------------------
sal_Bool SmartTag::MarkPoint(SdrHdl& /*rHdl*/, sal_Bool /*bUnmark*/ )
{
return sal_False;
}
// --------------------------------------------------------------------
sal_Bool SmartTag::MarkPoints(const Rectangle* /*pRect*/, sal_Bool /*bUnmark*/ )
{
return sal_False;
}
// --------------------------------------------------------------------
void SmartTag::CheckPossibilities()
{
}
// ====================================================================
SmartTagSet::SmartTagSet( View& rView )
: mrView( rView )
{
}
// --------------------------------------------------------------------
SmartTagSet::~SmartTagSet()
{
}
// --------------------------------------------------------------------
void SmartTagSet::add( const SmartTagReference& xTag )
{
maSet.insert( xTag );
mrView.InvalidateAllWin();
if( xTag == mxMouseOverTag )
mxMouseOverTag.clear();
if( xTag == mxSelectedTag )
mxSelectedTag.clear();
}
// --------------------------------------------------------------------
void SmartTagSet::remove( const SmartTagReference& xTag )
{
std::set< SmartTagReference >::iterator aIter( maSet.find( xTag ) );
if( aIter != maSet.end() )
maSet.erase( aIter );
mrView.InvalidateAllWin();
if( xTag == mxMouseOverTag )
mxMouseOverTag.clear();
if( xTag == mxSelectedTag )
mxSelectedTag.clear();
}
// --------------------------------------------------------------------
void SmartTagSet::Dispose()
{
std::set< SmartTagReference > aSet;
aSet.swap( maSet );
for( std::set< SmartTagReference >::iterator aIter( aSet.begin() ); aIter != aSet.end(); )
(*aIter++)->Dispose();
mrView.InvalidateAllWin();
mxMouseOverTag.clear();
mxSelectedTag.clear();
}
// --------------------------------------------------------------------
void SmartTagSet::select( const SmartTagReference& xTag )
{
if( mxSelectedTag != xTag )
{
if( mxSelectedTag.is() )
mxSelectedTag->deselect();
mxSelectedTag = xTag;
mxSelectedTag->select();
mrView.SetPossibilitiesDirty();
if( mrView.GetMarkedObjectCount() > 0 )
mrView.UnmarkAllObj();
else
mrView.updateHandles();
}
}
// --------------------------------------------------------------------
void SmartTagSet::deselect()
{
if( mxSelectedTag.is() )
{
mxSelectedTag->deselect();
mxSelectedTag.clear();
mrView.SetPossibilitiesDirty();
mrView.updateHandles();
}
}
// --------------------------------------------------------------------
bool SmartTagSet::MouseButtonDown( const MouseEvent& rMEvt )
{
Point aMDPos( mrView.GetViewShell()->GetActiveWindow()->PixelToLogic( rMEvt.GetPosPixel() ) );
SdrHdl* pHdl = mrView.PickHandle(aMDPos);
// check if a smart tag is selected and no handle is hit
if( mxSelectedTag.is() && !pHdl )
{
// deselect smart tag
deselect();
return false;
}
// if a smart tag handle is hit, foreward event to its smart tag
SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( pHdl );
if(pSmartHdl && pSmartHdl->getTag().is() )
{
SmartTagReference xTag( pSmartHdl->getTag() );
return xTag->MouseButtonDown( rMEvt, *pSmartHdl );
}
return false;
}
// --------------------------------------------------------------------
bool SmartTagSet::KeyInput( const KeyEvent& rKEvt )
{
if( mxSelectedTag.is() )
return mxSelectedTag->KeyInput( rKEvt );
else if( rKEvt.GetKeyCode().GetCode() == KEY_SPACE )
{
SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( mrView.GetHdlList().GetFocusHdl() );
if( pSmartHdl )
{
const_cast< SdrHdlList& >( mrView.GetHdlList() ).ResetFocusHdl();
SmartTagReference xTag( pSmartHdl->getTag() );
select( xTag );
return true;
}
}
return false;
}
// --------------------------------------------------------------------
bool SmartTagSet::RequestHelp( const HelpEvent& rHEvt )
{
Point aMDPos( mrView.GetViewShell()->GetActiveWindow()->PixelToLogic( rHEvt.GetMousePosPixel() ) );
SdrHdl* pHdl = mrView.PickHandle(aMDPos);
if( pHdl )
{
// if a smart tag handle is hit, foreward event to its smart tag
SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( pHdl );
if(pSmartHdl && pSmartHdl->getTag().is() )
{
SmartTagReference xTag( pSmartHdl->getTag() );
return xTag->RequestHelp( rHEvt );
}
}
return false;
}
// --------------------------------------------------------------------
/** returns true if the SmartTag consumes this event. */
bool SmartTagSet::Command( const CommandEvent& rCEvt )
{
if( rCEvt.IsMouseEvent() )
{
Point aMDPos( mrView.GetViewShell()->GetActiveWindow()->PixelToLogic( rCEvt.GetMousePosPixel() ) );
SdrHdl* pHdl = mrView.PickHandle(aMDPos);
if( pHdl )
{
// if a smart tag handle is hit, foreward event to its smart tag
SmartHdl* pSmartHdl = dynamic_cast< SmartHdl* >( pHdl );
if(pSmartHdl && pSmartHdl->getTag().is() )
{
SmartTagReference xTag( pSmartHdl->getTag() );
return xTag->Command( rCEvt );
}
}
}
else
{
if( mxSelectedTag.is() )
return mxSelectedTag->Command( rCEvt );
}
return false;
}
// --------------------------------------------------------------------
void SmartTagSet::addCustomHandles( SdrHdlList& rHandlerList )
{
if( !maSet.empty() )
{
for( std::set< SmartTagReference >::iterator aIter( maSet.begin() ); aIter != maSet.end(); )
(*aIter++)->addCustomHandles( rHandlerList );
}
}
// --------------------------------------------------------------------
/** returns true if the currently selected smart tag has
a special context, returned in rContext. */
bool SmartTagSet::getContext( SdrViewContext& rContext ) const
{
if( mxSelectedTag.is() )
return mxSelectedTag->getContext( rContext );
else
return false;
}
// --------------------------------------------------------------------
// support point editing
// --------------------------------------------------------------------
sal_Bool SmartTagSet::HasMarkablePoints() const
{
return GetMarkablePointCount() != 0 ? sal_True : sal_False;
}
// --------------------------------------------------------------------
sal_uLong SmartTagSet::GetMarkablePointCount() const
{
if( mxSelectedTag.is() )
return mxSelectedTag->GetMarkablePointCount();
return 0;
}
// --------------------------------------------------------------------
sal_Bool SmartTagSet::HasMarkedPoints() const
{
return GetMarkedPointCount() != 0 ? sal_True : sal_False;
}
// --------------------------------------------------------------------
sal_uLong SmartTagSet::GetMarkedPointCount() const
{
if( mxSelectedTag.is() )
return mxSelectedTag->GetMarkedPointCount();
else
return 0;
}
// --------------------------------------------------------------------
sal_Bool SmartTagSet::IsPointMarkable(const SdrHdl& rHdl) const
{
const SmartHdl* pSmartHdl = dynamic_cast< const SmartHdl* >( &rHdl );
return pSmartHdl && pSmartHdl->isMarkable();
}
// --------------------------------------------------------------------
sal_Bool SmartTagSet::MarkPoint(SdrHdl& rHdl, sal_Bool bUnmark )
{
if( mxSelectedTag.is() )
return mxSelectedTag->MarkPoint( rHdl, bUnmark );
return sal_False;
}
// --------------------------------------------------------------------
sal_Bool SmartTagSet::MarkPoints(const Rectangle* pRect, sal_Bool bUnmark)
{
if( mxSelectedTag.is() )
return mxSelectedTag->MarkPoints( pRect, bUnmark );
return sal_False;
}
// --------------------------------------------------------------------
void SmartTagSet::CheckPossibilities()
{
if( mxSelectedTag.is() )
mxSelectedTag->CheckPossibilities();
}
// ====================================================================
SmartHdl::SmartHdl( const SmartTagReference& xTag, SdrObject* pObject, const Point& rPnt, SdrHdlKind eNewKind /*=HDL_MOVE*/ )
: SdrHdl( rPnt, eNewKind )
, mxTag( xTag )
{
SetObj( pObject );
}
// --------------------------------------------------------------------
SmartHdl::SmartHdl( const SmartTagReference& xTag, const Point& rPnt, SdrHdlKind eNewKind /*=HDL_MOVE*/ )
: SdrHdl( rPnt, eNewKind )
, mxTag( xTag )
{
}
// --------------------------------------------------------------------
bool SmartHdl::isMarkable() const
{
return false;
}
// ====================================================================
/*
SmartProxyHdl::SmartProxyHdl( const SmartTagReference& xTag, SdrHdl* pProxyHdl )
: SmartHdl( xTag, pProxyHdl->GetPos(), pProxyHdl->GetKind() )
, mpProxyHdl( pProxyHdl )
{
}
// --------------------------------------------------------------------
SmartProxyHdl::~SmartProxyHdl()
{
delete mpProxyHdl;
}
*/
} // end of namespace sd