diff options
Diffstat (limited to 'svtools/source/control/roadmap.cxx')
-rw-r--r-- | svtools/source/control/roadmap.cxx | 1025 |
1 files changed, 1025 insertions, 0 deletions
diff --git a/svtools/source/control/roadmap.cxx b/svtools/source/control/roadmap.cxx new file mode 100644 index 000000000000..7cf88816199f --- /dev/null +++ b/svtools/source/control/roadmap.cxx @@ -0,0 +1,1025 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" +#include <roadmap.hxx> + +#ifndef _STRING_HXX +#define _STRING_HXX +#endif + +#ifndef __SGI_STL_VECTOR +#include <vector> +#endif + +#include <algorithm> +#include <vcl/bitmap.hxx> +#include <tools/color.hxx> + +#ifndef _RTL_USTRING_HXX_ +#include <rtl/OUString.hxx> +#endif +#include <memory> + +#define ROADMAP_INDENT_X 4 +#define ROADMAP_INDENT_Y 27 +#define ROADMAP_ITEM_DISTANCE_Y 6 +#define RMINCOMPLETE -1 +#define NADDITEM 1 +#define INCOMPLETELABEL ::String::CreateFromAscii("...") // TODO: Cast to String + +//......................................................................... +namespace svt +{ +//......................................................................... + + typedef std::vector< ::rtl::OUString > S_Vector; + typedef std::vector< RoadmapItem* > HL_Vector; + + //===================================================================== + //= ColorChanger + //===================================================================== + class IDLabel : public FixedText + { + public: + IDLabel( Window* _pParent, WinBits _nWinStyle = 0 ); + ~IDLabel( ); + virtual void DataChanged( const DataChangedEvent& rDCEvt ); + }; + + //===================================================================== + //= ColorChanger + //===================================================================== + class ColorChanger + { + protected: + OutputDevice* m_pDev; + + public: + ColorChanger( OutputDevice* _pDev, const Color& _rNewLineColor, const Color& _rNewFillColor ) + :m_pDev( _pDev ) + { + m_pDev->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR ); + m_pDev->SetLineColor( _rNewLineColor ); + m_pDev->SetFillColor( _rNewFillColor ); + } + + ~ColorChanger() + { + m_pDev->Pop(); + } + }; + + //===================================================================== + //= RoadmapItem + //===================================================================== + class RoadmapItem : public RoadmapTypes + { + private: + IDLabel* mpID; + HyperLabel* mpDescription; + const Size m_aItemPlayground; + + public: + RoadmapItem( ORoadmap& _rParent, const Size& _rItemPlayground ); + ~RoadmapItem( ); + + void SetID( sal_Int16 _ID ); + sal_Int16 GetID() const; + + void SetIndex( ItemIndex _Index ); + ItemIndex GetIndex() const; + + void SetLabel( const ::rtl::OUString& _rText ); + ::rtl::OUString GetLabel( ); + + void Update( ItemIndex _RMIndex, const ::rtl::OUString& _rText ); + + void SetPosition( RoadmapItem* OldHyperLabel ); + + void ToggleBackgroundColor( const Color& _rGBColor ); + void SetInteractive( sal_Bool _bInteractive ); + + void SetClickHdl( const Link& rLink ); + const Link& GetClickHdl() const; + void SetZOrder( RoadmapItem* pRefRoadmapHyperLabel, USHORT nFlags ); + void Enable( BOOL bEnable = TRUE); + BOOL IsEnabled() const; + void GrabFocus(); + + bool Contains( const Window* _pWindow ) const; + + HyperLabel* GetDescriptionHyperLabel() const { return mpDescription; } + + private: + void ImplUpdateIndex( const ItemIndex _nIndex ); + void ImplUpdatePosSize(); + }; + + //===================================================================== + //= RoadmapImpl + //===================================================================== + class RoadmapImpl : public RoadmapTypes + { + protected: + const ORoadmap& m_rAntiImpl; + Link m_aSelectHdl; + BitmapEx m_aPicture; + HL_Vector m_aRoadmapSteps; + ItemId m_iCurItemID; + sal_Bool m_bInteractive; + sal_Bool m_bComplete; + Size m_aItemSizePixel; + + public: + RoadmapImpl( const ORoadmap& _rAntiImpl ) + :m_rAntiImpl( _rAntiImpl ) + ,m_iCurItemID( -1 ) + ,m_bInteractive( sal_True ) + ,m_bComplete( sal_True ) + { + } + + RoadmapItem* InCompleteHyperLabel; + + void addHyperLabel( RoadmapItem* _rRoadmapStep ) { m_aRoadmapSteps.push_back(_rRoadmapStep); } + + HL_Vector& getHyperLabels() { return m_aRoadmapSteps; } + const HL_Vector& getHyperLabels() const { return m_aRoadmapSteps; } + + void insertHyperLabel( ItemIndex _Index, RoadmapItem* _rRoadmapStep ) { m_aRoadmapSteps.insert( m_aRoadmapSteps.begin() + _Index, _rRoadmapStep ); } + + ItemIndex getItemCount() const { return m_aRoadmapSteps.size();} + + void setCurItemID( ItemId i ) {m_iCurItemID = i; } + ItemId getCurItemID() const { return m_iCurItemID; } + + void setInteractive(const sal_Bool _bInteractive) {m_bInteractive = _bInteractive; } + sal_Bool isInteractive() const { return m_bInteractive; }; + + void setComplete(const sal_Bool _bComplete) {m_bComplete = _bComplete; } + sal_Bool isComplete() const { return m_bComplete; }; + + void setPicture( const BitmapEx& _rPic ) { m_aPicture = _rPic; } + const BitmapEx& getPicture( ) const { return m_aPicture; } + + void setSelectHdl( const Link& _rHdl ) { m_aSelectHdl = _rHdl; } + const Link& getSelectHdl( ) const { return m_aSelectHdl; } + + void initItemSize(); + const Size& getItemSize() const { return m_aItemSizePixel; } + + void removeHyperLabel( ItemIndex _Index ) + { + if ( ( _Index > -1 ) && ( _Index < getItemCount() ) ) + { + delete m_aRoadmapSteps[_Index]; + m_aRoadmapSteps.erase( m_aRoadmapSteps.begin() + _Index); + } + } + }; + + + //===================================================================== + //= Roadmap + //===================================================================== + //--------------------------------------------------------------------- + void RoadmapImpl::initItemSize() + { + Size aLabelSize( m_rAntiImpl.GetOutputSizePixel() ); + aLabelSize.Height() = m_rAntiImpl.LogicToPixel( Size( 0, LABELBASEMAPHEIGHT ), MAP_APPFONT ).Height(); + aLabelSize.Width() -= m_rAntiImpl.LogicToPixel( Size( 2 * ROADMAP_INDENT_X, 0 ), MAP_APPFONT ).Width(); + m_aItemSizePixel = aLabelSize; + } + + //===================================================================== + //= Roadmap + //===================================================================== + //--------------------------------------------------------------------- + ORoadmap::ORoadmap( Window* _pParent, const ResId& _rId ) + :Control( _pParent, _rId ) + ,m_pImpl( new RoadmapImpl( *this ) ) + { + implInit(); + } + + //--------------------------------------------------------------------- + ORoadmap::ORoadmap( Window* _pParent, WinBits _nWinStyle ) + :Control( _pParent, _nWinStyle ) + ,m_pImpl( new RoadmapImpl( *this ) ) + + { + implInit(); + } + + //--------------------------------------------------------------------- + void ORoadmap::implInit() + { + const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); + Color aTextColor = rStyleSettings.GetFieldTextColor(); + Font aFont = GetFont( ); + aFont.SetColor( aTextColor ); + aFont.SetWeight( WEIGHT_BOLD ); + aFont.SetUnderline( UNDERLINE_SINGLE ); + SetFont( aFont ); + SetBackground( Wallpaper( rStyleSettings.GetFieldColor() ) ); + m_pImpl->InCompleteHyperLabel = NULL; + m_pImpl->setCurItemID(-1 ); + m_pImpl->setComplete( sal_True ); + + // Roadmap control should be reachable as one unit with a Tab key + // the next Tab key should spring out of the control. + // To reach it the control itself should get focus and set it + // on entries. The entries themself should not be reachable with + // the Tab key directly. So each entry should have WB_NOTABSTOP. + // + // In other words the creator should create the control with the following + // flags: + // SetStyle( ( GetStyle() | WB_TABSTOP ) & ~WB_DIALOGCONTROL ); + +// TODO: if somebody sets a new font from outside (OutputDevice::SetFont), we would have to react +// on this with calculating a new bold font. +// Unfortunately, the OutputDevice does not offer a notify mechanism for a changed font. +// So settings the font from outside is simply a forbidded scenario at the moment + EnableMapMode( sal_False ); + } + + //--------------------------------------------------------------------- + ORoadmap::~ORoadmap( ) + { + HL_Vector aItemsCopy = m_pImpl->getHyperLabels(); + m_pImpl->getHyperLabels().clear(); + for ( HL_Vector::iterator i = aItemsCopy.begin(); i< aItemsCopy.end(); ++i ) + { + delete *i; + } + if ( ! m_pImpl->isComplete() ) + delete m_pImpl->InCompleteHyperLabel; + delete m_pImpl; + m_pImpl = NULL; + } + + + RoadmapTypes::ItemId ORoadmap::GetCurrentRoadmapItemID() const + { + return m_pImpl->getCurItemID(); + } + + + RoadmapItem* ORoadmap::GetPreviousHyperLabel( ItemIndex _Index) + { + RoadmapItem* pOldItem = NULL; + if ( _Index > 0 ) + pOldItem = m_pImpl->getHyperLabels().at( _Index - 1 ); + return pOldItem; + } + + + //--------------------------------------------------------------------- + + RoadmapItem* ORoadmap::InsertHyperLabel( ItemIndex _Index, const ::rtl::OUString& _sLabel, ItemId _RMID, sal_Bool _bEnabled) + { + if ( m_pImpl->getItemCount() == 0 ) + m_pImpl->initItemSize(); + + RoadmapItem* pItem = NULL; + RoadmapItem* pOldItem = GetPreviousHyperLabel( _Index ); + + pItem = new RoadmapItem( *this, m_pImpl->getItemSize() ); + if ( _RMID != RMINCOMPLETE ) + { + pItem->SetInteractive( m_pImpl->isInteractive() ); + m_pImpl->insertHyperLabel( _Index, pItem ); + } + else + { + pItem->SetInteractive( sal_False ); + } + pItem->SetPosition( pOldItem ); + pItem->Update( _Index, _sLabel ); + pItem->SetClickHdl(LINK( this, ORoadmap, ImplClickHdl ) ); + pItem->SetID( _RMID ); + pItem->SetIndex( _Index ); + if (!_bEnabled) + pItem->Enable( _bEnabled ); + return pItem; + } + + //--------------------------------------------------------------------- + void ORoadmap::SetRoadmapBitmap( const BitmapEx& _rBmp, sal_Bool _bInvalidate ) + { + m_pImpl->setPicture( _rBmp ); + if ( _bInvalidate ) + Invalidate( ); + } + + //--------------------------------------------------------------------- + const BitmapEx& ORoadmap::GetRoadmapBitmap( ) const + { + return m_pImpl->getPicture( ); + } + + //--------------------------------------------------------------------- + void ORoadmap::SetRoadmapInteractive( sal_Bool _bInteractive ) + { + m_pImpl->setInteractive( _bInteractive ); + + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin(); + i < rItems.end(); + ++i + ) + { + (*i)->SetInteractive( _bInteractive ); + } + } + + //--------------------------------------------------------------------- + sal_Bool ORoadmap::IsRoadmapInteractive() + { + return m_pImpl->isInteractive(); + } + + //--------------------------------------------------------------------- + void ORoadmap::SetRoadmapComplete( sal_Bool _bComplete ) + { + sal_Bool bWasComplete = m_pImpl->isComplete(); + m_pImpl->setComplete( _bComplete ); + if ( _bComplete ) + { + if ( m_pImpl->InCompleteHyperLabel != NULL) + { + delete m_pImpl->InCompleteHyperLabel; + m_pImpl->InCompleteHyperLabel = NULL; + } + } + else if ( bWasComplete ) + m_pImpl->InCompleteHyperLabel = InsertHyperLabel( m_pImpl->getItemCount(), ::String::CreateFromAscii( "..." ), RMINCOMPLETE ); + } + + //--------------------------------------------------------------------- + void ORoadmap::UpdatefollowingHyperLabels( ItemIndex _nIndex ) + { + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + if ( _nIndex < (ItemIndex)rItems.size() ) + { + RoadmapItem* pItem = NULL; + for ( HL_Vector::const_iterator i = rItems.begin() + _nIndex; + i< rItems.end(); + ++i, ++_nIndex + ) + { + pItem = *i; + + pItem->SetIndex( _nIndex ); + pItem->SetPosition( GetPreviousHyperLabel( _nIndex ) ); + } + } + if ( ! m_pImpl->isComplete() ) + { + RoadmapItem* pOldItem = GetPreviousHyperLabel( m_pImpl->getItemCount() ); + m_pImpl->InCompleteHyperLabel->SetPosition( pOldItem ); + m_pImpl->InCompleteHyperLabel->Update( m_pImpl->getItemCount(), ::String::CreateFromAscii("...") ); + } + } + + //--------------------------------------------------------------------- + void ORoadmap::ReplaceRoadmapItem( ItemIndex _Index, const ::rtl::OUString& _RoadmapItem, ItemId _RMID, sal_Bool _bEnabled ) + { + RoadmapItem* pItem = GetByIndex( _Index); + if ( pItem != NULL ) + { + pItem->Update( _Index, _RoadmapItem ); + pItem->SetID( _RMID ); + pItem->Enable( _bEnabled ); + } + } + + //--------------------------------------------------------------------- + RoadmapTypes::ItemIndex ORoadmap::GetItemCount() const + { + return m_pImpl->getItemCount(); + } + + //--------------------------------------------------------------------- + RoadmapTypes::ItemId ORoadmap::GetItemID( ItemIndex _nIndex ) const + { + const RoadmapItem* pHyperLabel = GetByIndex( _nIndex ); + if ( pHyperLabel ) + return pHyperLabel->GetID(); + return -1; + } + + //--------------------------------------------------------------------- + RoadmapTypes::ItemIndex ORoadmap::GetItemIndex( ItemId _nID ) const + { + ItemId nLocID = 0; + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin(); + i < rItems.end(); + ++i + ) + { + nLocID = (*i)->GetID(); + if ( nLocID == _nID ) + return ItemIndex( i - rItems.begin() ); + } + return -1; + } + + //--------------------------------------------------------------------- + void ORoadmap::InsertRoadmapItem( ItemIndex _Index, const ::rtl::OUString& _RoadmapItem, ItemId _nUniqueId, sal_Bool _bEnabled ) + { + InsertHyperLabel( _Index, _RoadmapItem, _nUniqueId, _bEnabled ); + // Todo: YPos is superfluous, if items are always appended + UpdatefollowingHyperLabels( _Index + 1 ); + } + + //--------------------------------------------------------------------- + void ORoadmap::DeleteRoadmapItem( ItemIndex _Index ) + { + if ( m_pImpl->getItemCount() > 0 && ( _Index > -1) && ( _Index < m_pImpl->getItemCount() ) ) + { + m_pImpl->removeHyperLabel( _Index ); + UpdatefollowingHyperLabels( _Index ); + } + } + + //--------------------------------------------------------------------- + sal_Bool ORoadmap::IsRoadmapComplete( ) const + { + return m_pImpl->isComplete(); + } + + //--------------------------------------------------------------------- + sal_Bool ORoadmap::IsRoadmapItemEnabled( ItemId _nItemId, ItemIndex _nStartIndex ) const + { + const RoadmapItem* _pLabelItem = GetByID( _nItemId, _nStartIndex ); + return _pLabelItem ? _pLabelItem->IsEnabled() : sal_False; + } + + //--------------------------------------------------------------------- + void ORoadmap::EnableRoadmapItem( ItemId _nItemId, sal_Bool _bEnable, ItemIndex _nStartIndex ) + { + RoadmapItem* pItem = GetByID( _nItemId, _nStartIndex ); + if ( pItem != NULL ) + pItem->Enable( _bEnable ); + } + + //--------------------------------------------------------------------- + void ORoadmap::ChangeRoadmapItemLabel( ItemId _nID, const ::rtl::OUString& _sLabel, ItemIndex _nStartIndex ) + { + RoadmapItem* pItem = GetByID( _nID, _nStartIndex ); + if ( pItem != NULL ) + { + pItem->Update( pItem->GetIndex(), _sLabel ); + + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin() + _nStartIndex; + i < rItems.end(); + ++i + ) + { + (*i)->SetPosition( GetPreviousHyperLabel( i - rItems.begin() ) ); + } + } + } + + //--------------------------------------------------------------------- + + ::rtl::OUString ORoadmap::GetRoadmapItemLabel( ItemId _nID, ItemIndex _nStartIndex ) + { + RoadmapItem* pItem = GetByID( _nID, _nStartIndex ); + if ( pItem != NULL ) + return pItem->GetLabel(); + else + return ::rtl::OUString(); + } + + //--------------------------------------------------------------------- + void ORoadmap::ChangeRoadmapItemID( ItemId _nID, ItemId _NewID, ItemIndex _nStartIndex ) + { + RoadmapItem* pItem = GetByID( _nID, _nStartIndex ); + if ( pItem != NULL ) + pItem->SetID( _NewID ); + } + + //--------------------------------------------------------------------- + RoadmapItem* ORoadmap::GetByID( ItemId _nID, ItemIndex _nStartIndex) + { + ItemId nLocID = 0; + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin() + _nStartIndex; + i < rItems.end(); + ++i + ) + { + nLocID = (*i)->GetID(); + if ( nLocID == _nID ) + return *i; + } + return NULL; + } + + //--------------------------------------------------------------------- + const RoadmapItem* ORoadmap::GetByID( ItemId _nID, ItemIndex _nStartIndex ) const + { + return const_cast< ORoadmap* >( this )->GetByID( _nID, _nStartIndex ); + } + + //--------------------------------------------------------------------- + RoadmapItem* ORoadmap::GetByIndex( ItemIndex _nItemIndex) + { + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + if ( ( _nItemIndex > -1 ) && ( _nItemIndex < (ItemIndex)rItems.size() ) ) + { + return rItems.at( _nItemIndex ); + } + return NULL; + } + + //--------------------------------------------------------------------- + const RoadmapItem* ORoadmap::GetByIndex( ItemIndex _nItemIndex ) const + { + return const_cast< ORoadmap* >( this )->GetByIndex( _nItemIndex ); + } + + //--------------------------------------------------------------------- + RoadmapTypes::ItemId ORoadmap::GetNextAvailableItemId( ItemIndex _nNewIndex ) + { + RoadmapItem* pItem = NULL; + + ItemIndex searchIndex = ++_nNewIndex; + while ( searchIndex < m_pImpl->getItemCount() ) + { + pItem = GetByIndex( searchIndex ); + if ( pItem->IsEnabled() ) + return pItem->GetID( ); + + ++searchIndex; + } + return -1; + } + + //--------------------------------------------------------------------- + RoadmapTypes::ItemId ORoadmap::GetPreviousAvailableItemId( ItemIndex _nNewIndex ) + { + RoadmapItem* pItem = NULL; + ItemIndex searchIndex = --_nNewIndex; + while ( searchIndex > -1 ) + { + pItem = GetByIndex( searchIndex ); + if ( pItem->IsEnabled() ) + return pItem->GetID( ); + + searchIndex--; + } + return -1; + } + + //--------------------------------------------------------------------- + void ORoadmap::DeselectOldRoadmapItems() + { + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin(); + i < rItems.end(); + ++i + ) + { + (*i)->ToggleBackgroundColor( COL_TRANSPARENT ); + } + } + + //--------------------------------------------------------------------- + void ORoadmap::SetItemSelectHdl( const Link& _rHdl ) + { + m_pImpl->setSelectHdl( _rHdl ); + } + + //--------------------------------------------------------------------- + Link ORoadmap::GetItemSelectHdl( ) const + { + return m_pImpl->getSelectHdl(); + } + + //--------------------------------------------------------------------- + void ORoadmap::Select() + { + GetItemSelectHdl().Call( this ); + CallEventListeners( VCLEVENT_ROADMAP_ITEMSELECTED ); + } + + //--------------------------------------------------------------------- + void ORoadmap::GetFocus() + { + RoadmapItem* pCurHyperLabel = GetByID( GetCurrentRoadmapItemID() ); + if ( pCurHyperLabel != NULL ) + pCurHyperLabel->GrabFocus(); + } + + //--------------------------------------------------------------------- + sal_Bool ORoadmap::SelectRoadmapItemByID( ItemId _nNewID ) + { + DeselectOldRoadmapItems(); + RoadmapItem* pItem = GetByID( _nNewID ); + if ( pItem != NULL ) + { + if ( pItem->IsEnabled() ) + { + const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); + pItem->ToggleBackgroundColor( rStyleSettings.GetHighlightColor() ); //HighlightColor + + pItem->GrabFocus(); + m_pImpl->setCurItemID(_nNewID); + + Select(); + return sal_True; + } + } + return sal_False; + } + + //--------------------------------------------------------------------- + void ORoadmap::Paint( const Rectangle& _rRect ) + { + Control::Paint( _rRect ); + + + // draw the bitmap + if ( !!m_pImpl->getPicture() ) + { + Size aBitmapSize = m_pImpl->getPicture().GetSizePixel(); + Size aMySize = GetOutputSizePixel(); + + Point aBitmapPos( aMySize.Width() - aBitmapSize.Width(), aMySize.Height() - aBitmapSize.Height() ); + + // draw it + DrawBitmapEx( aBitmapPos, m_pImpl->getPicture() ); + } + + //................................................................. + // draw the headline + DrawHeadline(); + } + + //--------------------------------------------------------------------- + void ORoadmap::DrawHeadline() + { + Point aTextPos = LogicToPixel( Point( ROADMAP_INDENT_X, 8 ), MAP_APPFONT ); + + Size aOutputSize( GetOutputSizePixel() ); + + // draw it + DrawText( Rectangle( aTextPos, aOutputSize ), GetText(), TEXT_DRAW_LEFT | TEXT_DRAW_TOP | TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK ); + DrawTextLine( aTextPos, aOutputSize.Width(), STRIKEOUT_NONE, UNDERLINE_SINGLE, UNDERLINE_NONE, sal_False ); + const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); + SetLineColor( rStyleSettings.GetFieldTextColor()); + SetTextColor(rStyleSettings.GetFieldTextColor()); + } + + //--------------------------------------------------------------------- + RoadmapItem* ORoadmap::GetByPointer(Window* pWindow) + { + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin(); + i < rItems.end(); + ++i + ) + { + if ( (*i)->Contains( pWindow ) ) + return *i; + } + return NULL; + } + + //--------------------------------------------------------------------- + long ORoadmap::PreNotify( NotifyEvent& _rNEvt ) + { + // capture KeyEvents for taskpane cycling + if ( _rNEvt.GetType() == EVENT_KEYINPUT ) + { + Window* pWindow = _rNEvt.GetWindow(); + RoadmapItem* pItem = GetByPointer( pWindow ); + if ( pItem != NULL ) + { + sal_Int16 nKeyCode = _rNEvt.GetKeyEvent()->GetKeyCode().GetCode(); + switch( nKeyCode ) + { + case KEY_UP: + { // Note: Performancewise this is not optimal, because we search for an ID in the labels + // and afterwards we search again for a label with the appropriate ID -> + // unnecessarily we search twice!!! + ItemId nPrevItemID = GetPreviousAvailableItemId( pItem->GetIndex() ); + if ( nPrevItemID != -1 ) + return SelectRoadmapItemByID( nPrevItemID ); + } + break; + case KEY_DOWN: + { + ItemId nNextItemID = GetNextAvailableItemId( pItem->GetIndex() ); + if ( nNextItemID != -1 ) + return SelectRoadmapItemByID( nNextItemID ); + } + break; + case KEY_SPACE: + return SelectRoadmapItemByID( pItem->GetID() ); + } + } + } + return Window::PreNotify( _rNEvt ); + } + + //--------------------------------------------------------------------- + IMPL_LINK(ORoadmap, ImplClickHdl, HyperLabel*, _CurHyperLabel) + { + return SelectRoadmapItemByID( _CurHyperLabel->GetID() ); + } + + + + //--------------------------------------------------------------------- + void ORoadmap::DataChanged( const DataChangedEvent& rDCEvt ) + { + if ((( rDCEvt.GetType() == DATACHANGED_SETTINGS ) || + ( rDCEvt.GetType() == DATACHANGED_DISPLAY )) && + ( rDCEvt.GetFlags() & SETTINGS_STYLE )) + { + const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); + SetBackground( Wallpaper( rStyleSettings.GetFieldColor() ) ); + Color aTextColor = rStyleSettings.GetFieldTextColor(); + Font aFont = GetFont(); + aFont.SetColor( aTextColor ); + SetFont( aFont ); + RoadmapTypes::ItemId curItemID = GetCurrentRoadmapItemID(); + RoadmapItem* pLabelItem = GetByID( curItemID ); + pLabelItem->ToggleBackgroundColor(rStyleSettings.GetHighlightColor()); + Invalidate(); + } + } + + + //--------------------------------------------------------------------- + RoadmapItem::RoadmapItem( ORoadmap& _rParent, const Size& _rItemPlayground ) + :m_aItemPlayground( _rItemPlayground ) + { + mpID = new IDLabel( &_rParent, WB_WORDBREAK ); + mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetFieldTextColor( ) ); + mpID->Show(); + mpDescription = new HyperLabel( &_rParent, WB_NOTABSTOP | WB_WORDBREAK ); + mpDescription->Show(); + } + + //--------------------------------------------------------------------- + bool RoadmapItem::Contains( const Window* _pWindow ) const + { + return ( mpID == _pWindow ) || ( mpDescription == _pWindow ); + } + + //--------------------------------------------------------------------- + void RoadmapItem::GrabFocus() + { + if ( mpDescription ) + mpDescription->GrabFocus(); + } + + //--------------------------------------------------------------------- + void RoadmapItem::SetInteractive( sal_Bool _bInteractive ) + { + if ( mpDescription ) + mpDescription->SetInteractive(_bInteractive); + } + + //--------------------------------------------------------------------- + void RoadmapItem::SetID( sal_Int16 _ID ) + { + if ( mpDescription ) + mpDescription->SetID(_ID); + } + + //--------------------------------------------------------------------- + sal_Int16 RoadmapItem::GetID() const + { + return mpDescription ? mpDescription->GetID() : sal_Int16(-1); + } + + //--------------------------------------------------------------------- + void RoadmapItem::ImplUpdateIndex( const ItemIndex _nIndex ) + { + if ( mpDescription ) + mpDescription->SetIndex( _nIndex ); + + if ( mpID ) + { + ::rtl::OUString aIDText = ::rtl::OUString::valueOf( (sal_Int32)( _nIndex + 1 ) ) + ::rtl::OUString::createFromAscii( "." ); + mpID->SetText( aIDText ); + } + + // update the geometry of both controls + ImplUpdatePosSize(); + } + + //--------------------------------------------------------------------- + void RoadmapItem::SetIndex( ItemIndex _Index ) + { + ImplUpdateIndex( _Index ); + } + + //--------------------------------------------------------------------- + RoadmapTypes::ItemIndex RoadmapItem::GetIndex() const + { + return mpDescription ? mpDescription->GetIndex() : ItemIndex(-1); + } + + //--------------------------------------------------------------------- + void RoadmapItem::SetLabel( const ::rtl::OUString& _rText ) + { + if ( mpDescription ) + mpDescription->SetText(_rText); + } + + //--------------------------------------------------------------------- + ::rtl::OUString RoadmapItem::GetLabel( ) + { + return mpDescription ? mpDescription->GetText() : String(); + } + + //--------------------------------------------------------------------- + void RoadmapItem::SetPosition( RoadmapItem* _pOldItem ) + { + Point aIDPos; + if ( _pOldItem == NULL ) + { + aIDPos = mpID->LogicToPixel( Point( ROADMAP_INDENT_X, ROADMAP_INDENT_Y ), MAP_APPFONT ); + } + else + { + Size aOldSize = _pOldItem->GetDescriptionHyperLabel()->GetSizePixel(); + + aIDPos = _pOldItem->mpID->GetPosPixel(); + aIDPos.Y() += aOldSize.Height(); + aIDPos.Y() += mpID->GetParent()->LogicToPixel( Size( 0, ROADMAP_ITEM_DISTANCE_Y ) ).Height(); + } + mpID->SetPosPixel( aIDPos ); + + sal_Int32 nDescPos = aIDPos.X() + mpID->GetSizePixel().Width(); + mpDescription->SetPosPixel( Point( nDescPos, aIDPos.Y() ) ); + } + + //--------------------------------------------------------------------- + void RoadmapItem::SetZOrder( RoadmapItem* pRefRoadmapHyperLabel, USHORT nFlags ) + { + if (pRefRoadmapHyperLabel == NULL) + mpDescription->SetZOrder( NULL, nFlags); //WINDOW_ZORDER_FIRST ); + else + mpDescription->SetZOrder( pRefRoadmapHyperLabel->mpDescription, nFlags); //, WINDOW_ZORDER_BEHIND ); + } + + //--------------------------------------------------------------------- + void RoadmapItem::Enable( BOOL _bEnable) + { + mpID->Enable(_bEnable); + mpDescription->Enable(_bEnable); + } + + //--------------------------------------------------------------------- + BOOL RoadmapItem::IsEnabled() const + { + return mpID->IsEnabled(); + } + + //--------------------------------------------------------------------- + void RoadmapItem::ToggleBackgroundColor( const Color& _rGBColor ) + { + if (_rGBColor == COL_TRANSPARENT) + { + mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetFieldTextColor( ) ); + mpID->SetControlBackground( COL_TRANSPARENT ); + } + else + { + mpID->SetControlBackground( mpID->GetSettings().GetStyleSettings().GetHighlightColor() ); + mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetHighlightTextColor( ) ); + } + mpDescription->ToggleBackgroundColor(_rGBColor); + } + + //--------------------------------------------------------------------- + void RoadmapItem::ImplUpdatePosSize() + { + // calculate widths + long nIDWidth = mpID->GetTextWidth( mpID->GetText() ); + long nMaxIDWidth = mpID->GetTextWidth( ::rtl::OUString::createFromAscii( "100." ) ); + nIDWidth = ::std::min( nIDWidth, nMaxIDWidth ); + + // check how many space the description would need + Size aDescriptionSize = mpDescription->CalcMinimumSize( m_aItemPlayground.Width() - nIDWidth ); + + // position and size both controls + Size aIDSize( nIDWidth, aDescriptionSize.Height() ); + mpID->SetSizePixel( aIDSize ); + + Point aIDPos = mpID->GetPosPixel(); + mpDescription->SetPosPixel( Point( aIDPos.X() + nIDWidth, aIDPos.Y() ) ); + mpDescription->SetSizePixel( aDescriptionSize ); + } + + //--------------------------------------------------------------------- + void RoadmapItem::Update( ItemIndex _RMIndex, const ::rtl::OUString& _rText ) + { + // update description label + mpDescription->SetLabel( _rText ); + + // update the index in both controls, which triggers updating the geometry of both + ImplUpdateIndex( _RMIndex ); + } + + //--------------------------------------------------------------------- + RoadmapItem::~RoadmapItem( ) + { + { + ::std::auto_ptr<Control> aTemp(mpID); + mpID = NULL; + } + { + ::std::auto_ptr<Control> aTemp(mpDescription); + mpDescription = NULL; + } + } + + //--------------------------------------------------------------------- + void RoadmapItem::SetClickHdl( const Link& rLink ) + { + if ( mpDescription ) + mpDescription->SetClickHdl( rLink); + } + + //--------------------------------------------------------------------- + const Link& RoadmapItem::GetClickHdl( ) const + { + return mpDescription->GetClickHdl(); + } + + //--------------------------------------------------------------------- + IDLabel::IDLabel( Window* _pParent, WinBits _nWinStyle ) + :FixedText( _pParent, _nWinStyle ) + { + + } + + //--------------------------------------------------------------------- + IDLabel::~IDLabel( ) + { + } + + //--------------------------------------------------------------------- + void IDLabel::DataChanged( const DataChangedEvent& rDCEvt ) + { + const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); + FixedText::DataChanged( rDCEvt ); + if ((( rDCEvt.GetType() == DATACHANGED_SETTINGS ) || + ( rDCEvt.GetType() == DATACHANGED_DISPLAY )) && + ( rDCEvt.GetFlags() & SETTINGS_STYLE )) + { + const Color& rGBColor = GetControlBackground(); + if (rGBColor == COL_TRANSPARENT) + SetTextColor( rStyleSettings.GetFieldTextColor( ) ); + else + { + SetControlBackground(rStyleSettings.GetHighlightColor()); + SetTextColor( rStyleSettings.GetHighlightTextColor( ) ); + } + Invalidate(); + } + } + + + + +//......................................................................... +} // namespace svt +//......................................................................... |