1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svtools.hxx"
26*b1cdbd2cSJim Jagielski #include <svtools/roadmap.hxx>
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #ifndef _STRING_HXX
29*b1cdbd2cSJim Jagielski #define _STRING_HXX
30*b1cdbd2cSJim Jagielski #endif
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <vector>
33*b1cdbd2cSJim Jagielski #include <algorithm>
34*b1cdbd2cSJim Jagielski #include <vcl/bitmap.hxx>
35*b1cdbd2cSJim Jagielski #include <tools/color.hxx>
36*b1cdbd2cSJim Jagielski #include <memory>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #define ROADMAP_INDENT_X        4
39*b1cdbd2cSJim Jagielski #define ROADMAP_INDENT_Y        27
40*b1cdbd2cSJim Jagielski #define ROADMAP_ITEM_DISTANCE_Y 6
41*b1cdbd2cSJim Jagielski #define RMINCOMPLETE        -1
42*b1cdbd2cSJim Jagielski #define NADDITEM            1
43*b1cdbd2cSJim Jagielski #define INCOMPLETELABEL     ::String::CreateFromAscii("...")        // TODO: Cast to String
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski //.........................................................................
46*b1cdbd2cSJim Jagielski namespace svt
47*b1cdbd2cSJim Jagielski {
48*b1cdbd2cSJim Jagielski //.........................................................................
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski     typedef std::vector< ::rtl::OUString > S_Vector;
51*b1cdbd2cSJim Jagielski     typedef std::vector< RoadmapItem* > HL_Vector;
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski 	//=====================================================================
54*b1cdbd2cSJim Jagielski 	//= ColorChanger
55*b1cdbd2cSJim Jagielski 	//=====================================================================
56*b1cdbd2cSJim Jagielski 	class IDLabel :  public FixedText
57*b1cdbd2cSJim Jagielski 	{
58*b1cdbd2cSJim Jagielski 	public:
59*b1cdbd2cSJim Jagielski 		IDLabel( Window* _pParent, WinBits _nWinStyle = 0 );
60*b1cdbd2cSJim Jagielski 		~IDLabel( );
61*b1cdbd2cSJim Jagielski 		virtual void	DataChanged( const DataChangedEvent& rDCEvt );
62*b1cdbd2cSJim Jagielski 	};
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski 	//=====================================================================
65*b1cdbd2cSJim Jagielski 	//= ColorChanger
66*b1cdbd2cSJim Jagielski 	//=====================================================================
67*b1cdbd2cSJim Jagielski 	class ColorChanger
68*b1cdbd2cSJim Jagielski 	{
69*b1cdbd2cSJim Jagielski 	protected:
70*b1cdbd2cSJim Jagielski 		OutputDevice*	m_pDev;
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski 	public:
ColorChanger(OutputDevice * _pDev,const Color & _rNewLineColor,const Color & _rNewFillColor)73*b1cdbd2cSJim Jagielski 		ColorChanger( OutputDevice* _pDev, const Color& _rNewLineColor, const Color& _rNewFillColor )
74*b1cdbd2cSJim Jagielski 			:m_pDev( _pDev )
75*b1cdbd2cSJim Jagielski 		{
76*b1cdbd2cSJim Jagielski 			m_pDev->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
77*b1cdbd2cSJim Jagielski 			m_pDev->SetLineColor( _rNewLineColor );
78*b1cdbd2cSJim Jagielski 			m_pDev->SetFillColor( _rNewFillColor );
79*b1cdbd2cSJim Jagielski 		}
80*b1cdbd2cSJim Jagielski 
~ColorChanger()81*b1cdbd2cSJim Jagielski 		~ColorChanger()
82*b1cdbd2cSJim Jagielski 		{
83*b1cdbd2cSJim Jagielski 			m_pDev->Pop();
84*b1cdbd2cSJim Jagielski 		}
85*b1cdbd2cSJim Jagielski 	};
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski 	//=====================================================================
88*b1cdbd2cSJim Jagielski 	//= RoadmapItem
89*b1cdbd2cSJim Jagielski 	//=====================================================================
90*b1cdbd2cSJim Jagielski 	class RoadmapItem : public RoadmapTypes
91*b1cdbd2cSJim Jagielski 	{
92*b1cdbd2cSJim Jagielski 	private:
93*b1cdbd2cSJim Jagielski 		IDLabel*                mpID;
94*b1cdbd2cSJim Jagielski 		HyperLabel*             mpDescription;
95*b1cdbd2cSJim Jagielski         const Size              m_aItemPlayground;
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski 	public:
98*b1cdbd2cSJim Jagielski 		RoadmapItem( ORoadmap& _rParent, const Size& _rItemPlayground );
99*b1cdbd2cSJim Jagielski 		~RoadmapItem( );
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski         void					SetID( sal_Int16 _ID );
102*b1cdbd2cSJim Jagielski         sal_Int16				GetID() const;
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski         void					SetIndex( ItemIndex _Index );
105*b1cdbd2cSJim Jagielski         ItemIndex               GetIndex() const;
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski         void					SetLabel( const ::rtl::OUString& _rText );
108*b1cdbd2cSJim Jagielski         ::rtl::OUString			GetLabel( );
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski 		void					Update( ItemIndex _RMIndex, const ::rtl::OUString& _rText );
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski         void					SetPosition( RoadmapItem* OldHyperLabel );
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski 		void					ToggleBackgroundColor( const Color& _rGBColor );
115*b1cdbd2cSJim Jagielski         void					SetInteractive( sal_Bool _bInteractive );
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski         void					SetClickHdl( const Link& rLink );
118*b1cdbd2cSJim Jagielski         const Link&				GetClickHdl() const;
119*b1cdbd2cSJim Jagielski 		void					SetZOrder( RoadmapItem* pRefRoadmapHyperLabel, sal_uInt16 nFlags );
120*b1cdbd2cSJim Jagielski 		void					Enable( sal_Bool bEnable = sal_True);
121*b1cdbd2cSJim Jagielski 		sal_Bool					IsEnabled() const;
122*b1cdbd2cSJim Jagielski 		void					GrabFocus();
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski         bool                    Contains( const Window* _pWindow ) const;
125*b1cdbd2cSJim Jagielski 
GetDescriptionHyperLabel() const126*b1cdbd2cSJim Jagielski 		HyperLabel*				GetDescriptionHyperLabel() const { return mpDescription; }
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski     private:
129*b1cdbd2cSJim Jagielski         void                    ImplUpdateIndex( const ItemIndex _nIndex );
130*b1cdbd2cSJim Jagielski         void                    ImplUpdatePosSize();
131*b1cdbd2cSJim Jagielski 	};
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski 	//=====================================================================
134*b1cdbd2cSJim Jagielski 	//= RoadmapImpl
135*b1cdbd2cSJim Jagielski 	//=====================================================================
136*b1cdbd2cSJim Jagielski     class RoadmapImpl : public RoadmapTypes
137*b1cdbd2cSJim Jagielski 	{
138*b1cdbd2cSJim Jagielski 	protected:
139*b1cdbd2cSJim Jagielski         const ORoadmap&     m_rAntiImpl;
140*b1cdbd2cSJim Jagielski         Link                m_aSelectHdl;
141*b1cdbd2cSJim Jagielski 		BitmapEx	        m_aPicture;
142*b1cdbd2cSJim Jagielski         HL_Vector           m_aRoadmapSteps;
143*b1cdbd2cSJim Jagielski         ItemId              m_iCurItemID;
144*b1cdbd2cSJim Jagielski         sal_Bool            m_bInteractive;
145*b1cdbd2cSJim Jagielski         sal_Bool            m_bComplete;
146*b1cdbd2cSJim Jagielski         Size                m_aItemSizePixel;
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 	public:
RoadmapImpl(const ORoadmap & _rAntiImpl)149*b1cdbd2cSJim Jagielski         RoadmapImpl( const ORoadmap& _rAntiImpl )
150*b1cdbd2cSJim Jagielski             :m_rAntiImpl( _rAntiImpl )
151*b1cdbd2cSJim Jagielski             ,m_iCurItemID( -1 )
152*b1cdbd2cSJim Jagielski             ,m_bInteractive( sal_True )
153*b1cdbd2cSJim Jagielski             ,m_bComplete( sal_True )
154*b1cdbd2cSJim Jagielski         {
155*b1cdbd2cSJim Jagielski         }
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski         RoadmapItem* InCompleteHyperLabel;
158*b1cdbd2cSJim Jagielski 
addHyperLabel(RoadmapItem * _rRoadmapStep)159*b1cdbd2cSJim Jagielski         void			    addHyperLabel( RoadmapItem*  _rRoadmapStep ) { m_aRoadmapSteps.push_back(_rRoadmapStep); }
160*b1cdbd2cSJim Jagielski 
getHyperLabels()161*b1cdbd2cSJim Jagielski         HL_Vector&	        getHyperLabels() { return m_aRoadmapSteps; }
getHyperLabels() const162*b1cdbd2cSJim Jagielski 		const HL_Vector&	getHyperLabels() const { return m_aRoadmapSteps; }
163*b1cdbd2cSJim Jagielski 
insertHyperLabel(ItemIndex _Index,RoadmapItem * _rRoadmapStep)164*b1cdbd2cSJim Jagielski         void                insertHyperLabel( ItemIndex _Index, RoadmapItem* _rRoadmapStep ) { m_aRoadmapSteps.insert( m_aRoadmapSteps.begin() + _Index, _rRoadmapStep ); }
165*b1cdbd2cSJim Jagielski 
getItemCount() const166*b1cdbd2cSJim Jagielski         ItemIndex           getItemCount() const { return m_aRoadmapSteps.size();}
167*b1cdbd2cSJim Jagielski 
setCurItemID(ItemId i)168*b1cdbd2cSJim Jagielski         void                setCurItemID( ItemId i ) {m_iCurItemID = i; }
getCurItemID() const169*b1cdbd2cSJim Jagielski         ItemId              getCurItemID() const { return m_iCurItemID; }
170*b1cdbd2cSJim Jagielski 
setInteractive(const sal_Bool _bInteractive)171*b1cdbd2cSJim Jagielski         void                setInteractive(const sal_Bool _bInteractive) {m_bInteractive = _bInteractive; }
isInteractive() const172*b1cdbd2cSJim Jagielski         sal_Bool            isInteractive() const { return m_bInteractive; };
173*b1cdbd2cSJim Jagielski 
setComplete(const sal_Bool _bComplete)174*b1cdbd2cSJim Jagielski         void                setComplete(const sal_Bool _bComplete) {m_bComplete = _bComplete; }
isComplete() const175*b1cdbd2cSJim Jagielski         sal_Bool            isComplete() const { return m_bComplete; };
176*b1cdbd2cSJim Jagielski 
setPicture(const BitmapEx & _rPic)177*b1cdbd2cSJim Jagielski 		void			    setPicture( const BitmapEx& _rPic ) { m_aPicture = _rPic; }
getPicture() const178*b1cdbd2cSJim Jagielski 		const BitmapEx&	    getPicture( ) const { return m_aPicture; }
179*b1cdbd2cSJim Jagielski 
setSelectHdl(const Link & _rHdl)180*b1cdbd2cSJim Jagielski         void			    setSelectHdl( const Link& _rHdl ) { m_aSelectHdl = _rHdl; }
getSelectHdl() const181*b1cdbd2cSJim Jagielski 		const Link&	        getSelectHdl( ) const { return m_aSelectHdl; }
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski         void                initItemSize();
getItemSize() const184*b1cdbd2cSJim Jagielski         const Size&         getItemSize() const { return m_aItemSizePixel; }
185*b1cdbd2cSJim Jagielski 
removeHyperLabel(ItemIndex _Index)186*b1cdbd2cSJim Jagielski         void removeHyperLabel( ItemIndex _Index )
187*b1cdbd2cSJim Jagielski         {
188*b1cdbd2cSJim Jagielski             if ( ( _Index > -1 ) && ( _Index < getItemCount() ) )
189*b1cdbd2cSJim Jagielski             {
190*b1cdbd2cSJim Jagielski                 delete m_aRoadmapSteps[_Index];
191*b1cdbd2cSJim Jagielski                 m_aRoadmapSteps.erase( m_aRoadmapSteps.begin() + _Index);
192*b1cdbd2cSJim Jagielski             }
193*b1cdbd2cSJim Jagielski         }
194*b1cdbd2cSJim Jagielski 	};
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski 	//=====================================================================
198*b1cdbd2cSJim Jagielski 	//= Roadmap
199*b1cdbd2cSJim Jagielski 	//=====================================================================
200*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
initItemSize()201*b1cdbd2cSJim Jagielski     void RoadmapImpl::initItemSize()
202*b1cdbd2cSJim Jagielski     {
203*b1cdbd2cSJim Jagielski         Size aLabelSize( m_rAntiImpl.GetOutputSizePixel() );
204*b1cdbd2cSJim Jagielski         aLabelSize.Height() = m_rAntiImpl.LogicToPixel( Size( 0, LABELBASEMAPHEIGHT ), MAP_APPFONT ).Height();
205*b1cdbd2cSJim Jagielski         aLabelSize.Width() -= m_rAntiImpl.LogicToPixel( Size( 2 * ROADMAP_INDENT_X, 0 ), MAP_APPFONT ).Width();
206*b1cdbd2cSJim Jagielski         m_aItemSizePixel = aLabelSize;
207*b1cdbd2cSJim Jagielski     }
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski 	//=====================================================================
210*b1cdbd2cSJim Jagielski 	//= Roadmap
211*b1cdbd2cSJim Jagielski 	//=====================================================================
212*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
ORoadmap(Window * _pParent,const ResId & _rId)213*b1cdbd2cSJim Jagielski 	ORoadmap::ORoadmap( Window* _pParent, const ResId& _rId )
214*b1cdbd2cSJim Jagielski         :Control( _pParent, _rId )
215*b1cdbd2cSJim Jagielski 		,m_pImpl( new RoadmapImpl( *this ) )
216*b1cdbd2cSJim Jagielski 	{
217*b1cdbd2cSJim Jagielski 		implInit();
218*b1cdbd2cSJim Jagielski 	}
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
ORoadmap(Window * _pParent,WinBits _nWinStyle)221*b1cdbd2cSJim Jagielski 	ORoadmap::ORoadmap( Window* _pParent, WinBits _nWinStyle )
222*b1cdbd2cSJim Jagielski 		:Control( _pParent, _nWinStyle )
223*b1cdbd2cSJim Jagielski 		,m_pImpl( new RoadmapImpl( *this ) )
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski     {
226*b1cdbd2cSJim Jagielski         implInit();
227*b1cdbd2cSJim Jagielski 	}
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
implInit()230*b1cdbd2cSJim Jagielski 	void ORoadmap::implInit()
231*b1cdbd2cSJim Jagielski 	{
232*b1cdbd2cSJim Jagielski 		const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
233*b1cdbd2cSJim Jagielski 		Color aTextColor = rStyleSettings.GetFieldTextColor();
234*b1cdbd2cSJim Jagielski         Font aFont = GetFont( );
235*b1cdbd2cSJim Jagielski 		aFont.SetColor( aTextColor );
236*b1cdbd2cSJim Jagielski 		aFont.SetWeight( WEIGHT_BOLD );
237*b1cdbd2cSJim Jagielski         aFont.SetUnderline( UNDERLINE_SINGLE );
238*b1cdbd2cSJim Jagielski 		SetFont( aFont );
239*b1cdbd2cSJim Jagielski 		SetBackground( Wallpaper( rStyleSettings.GetFieldColor() ) );
240*b1cdbd2cSJim Jagielski         m_pImpl->InCompleteHyperLabel = NULL;
241*b1cdbd2cSJim Jagielski         m_pImpl->setCurItemID(-1 );
242*b1cdbd2cSJim Jagielski         m_pImpl->setComplete( sal_True );
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski         // Roadmap control should be reachable as one unit with a Tab key
245*b1cdbd2cSJim Jagielski         // the next Tab key should spring out of the control.
246*b1cdbd2cSJim Jagielski         // To reach it the control itself should get focus and set it
247*b1cdbd2cSJim Jagielski         // on entries. The entries themself should not be reachable with
248*b1cdbd2cSJim Jagielski         // the Tab key directly. So each entry should have WB_NOTABSTOP.
249*b1cdbd2cSJim Jagielski         //
250*b1cdbd2cSJim Jagielski         // In other words the creator should create the control with the following
251*b1cdbd2cSJim Jagielski         // flags:
252*b1cdbd2cSJim Jagielski         // SetStyle( ( GetStyle() | WB_TABSTOP ) & ~WB_DIALOGCONTROL );
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski // TODO: if somebody sets a new font from outside (OutputDevice::SetFont), we would have to react
255*b1cdbd2cSJim Jagielski // on this with calculating a new bold font.
256*b1cdbd2cSJim Jagielski // Unfortunately, the OutputDevice does not offer a notify mechanism for a changed font.
257*b1cdbd2cSJim Jagielski // So settings the font from outside is simply a forbidded scenario at the moment
258*b1cdbd2cSJim Jagielski         EnableMapMode( sal_False );
259*b1cdbd2cSJim Jagielski 	}
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
~ORoadmap()262*b1cdbd2cSJim Jagielski 	ORoadmap::~ORoadmap( )
263*b1cdbd2cSJim Jagielski 	{
264*b1cdbd2cSJim Jagielski         HL_Vector aItemsCopy = m_pImpl->getHyperLabels();
265*b1cdbd2cSJim Jagielski         m_pImpl->getHyperLabels().clear();
266*b1cdbd2cSJim Jagielski         for ( HL_Vector::iterator i = aItemsCopy.begin(); i< aItemsCopy.end(); ++i )
267*b1cdbd2cSJim Jagielski         {
268*b1cdbd2cSJim Jagielski             delete *i;
269*b1cdbd2cSJim Jagielski         }
270*b1cdbd2cSJim Jagielski         if ( ! m_pImpl->isComplete() )
271*b1cdbd2cSJim Jagielski             delete m_pImpl->InCompleteHyperLabel;
272*b1cdbd2cSJim Jagielski 		delete m_pImpl;
273*b1cdbd2cSJim Jagielski         m_pImpl = NULL;
274*b1cdbd2cSJim Jagielski     }
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski 
GetCurrentRoadmapItemID() const277*b1cdbd2cSJim Jagielski     RoadmapTypes::ItemId ORoadmap::GetCurrentRoadmapItemID() const
278*b1cdbd2cSJim Jagielski     {
279*b1cdbd2cSJim Jagielski         return m_pImpl->getCurItemID();
280*b1cdbd2cSJim Jagielski     }
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 
GetPreviousHyperLabel(ItemIndex _Index)283*b1cdbd2cSJim Jagielski 	RoadmapItem* ORoadmap::GetPreviousHyperLabel( ItemIndex _Index)
284*b1cdbd2cSJim Jagielski 	{
285*b1cdbd2cSJim Jagielski 		RoadmapItem* pOldItem = NULL;
286*b1cdbd2cSJim Jagielski 		if ( _Index > 0 )
287*b1cdbd2cSJim Jagielski 			pOldItem = m_pImpl->getHyperLabels().at( _Index - 1 );
288*b1cdbd2cSJim Jagielski 		return pOldItem;
289*b1cdbd2cSJim Jagielski 	}
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski    	//---------------------------------------------------------------------
293*b1cdbd2cSJim Jagielski 
InsertHyperLabel(ItemIndex _Index,const::rtl::OUString & _sLabel,ItemId _RMID,sal_Bool _bEnabled)294*b1cdbd2cSJim Jagielski     RoadmapItem* ORoadmap::InsertHyperLabel( ItemIndex _Index, const ::rtl::OUString& _sLabel, ItemId _RMID, sal_Bool _bEnabled)
295*b1cdbd2cSJim Jagielski     {
296*b1cdbd2cSJim Jagielski         if ( m_pImpl->getItemCount() == 0 )
297*b1cdbd2cSJim Jagielski             m_pImpl->initItemSize();
298*b1cdbd2cSJim Jagielski 
299*b1cdbd2cSJim Jagielski         RoadmapItem* pItem = NULL;
300*b1cdbd2cSJim Jagielski         RoadmapItem* pOldItem = GetPreviousHyperLabel( _Index );
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski         pItem = new RoadmapItem( *this, m_pImpl->getItemSize() );
303*b1cdbd2cSJim Jagielski         if ( _RMID != RMINCOMPLETE )
304*b1cdbd2cSJim Jagielski         {
305*b1cdbd2cSJim Jagielski             pItem->SetInteractive( m_pImpl->isInteractive() );
306*b1cdbd2cSJim Jagielski             m_pImpl->insertHyperLabel( _Index, pItem );
307*b1cdbd2cSJim Jagielski         }
308*b1cdbd2cSJim Jagielski         else
309*b1cdbd2cSJim Jagielski         {
310*b1cdbd2cSJim Jagielski             pItem->SetInteractive( sal_False );
311*b1cdbd2cSJim Jagielski 		}
312*b1cdbd2cSJim Jagielski         pItem->SetPosition( pOldItem );
313*b1cdbd2cSJim Jagielski         pItem->Update( _Index, _sLabel );
314*b1cdbd2cSJim Jagielski         pItem->SetClickHdl(LINK( this, ORoadmap, ImplClickHdl ) );
315*b1cdbd2cSJim Jagielski         pItem->SetID( _RMID );
316*b1cdbd2cSJim Jagielski         pItem->SetIndex( _Index );
317*b1cdbd2cSJim Jagielski         if (!_bEnabled)
318*b1cdbd2cSJim Jagielski             pItem->Enable( _bEnabled );
319*b1cdbd2cSJim Jagielski         return pItem;
320*b1cdbd2cSJim Jagielski     }
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
SetRoadmapBitmap(const BitmapEx & _rBmp,sal_Bool _bInvalidate)323*b1cdbd2cSJim Jagielski 	void ORoadmap::SetRoadmapBitmap( const BitmapEx& _rBmp, sal_Bool _bInvalidate )
324*b1cdbd2cSJim Jagielski 	{
325*b1cdbd2cSJim Jagielski 		m_pImpl->setPicture( _rBmp );
326*b1cdbd2cSJim Jagielski 		if ( _bInvalidate )
327*b1cdbd2cSJim Jagielski 			Invalidate( );
328*b1cdbd2cSJim Jagielski 	}
329*b1cdbd2cSJim Jagielski 
330*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
GetRoadmapBitmap() const331*b1cdbd2cSJim Jagielski 	const BitmapEx& ORoadmap::GetRoadmapBitmap( ) const
332*b1cdbd2cSJim Jagielski 	{
333*b1cdbd2cSJim Jagielski 		return m_pImpl->getPicture( );
334*b1cdbd2cSJim Jagielski 	}
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
SetRoadmapInteractive(sal_Bool _bInteractive)337*b1cdbd2cSJim Jagielski     void ORoadmap::SetRoadmapInteractive( sal_Bool _bInteractive )
338*b1cdbd2cSJim Jagielski     {
339*b1cdbd2cSJim Jagielski         m_pImpl->setInteractive( _bInteractive );
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski         const HL_Vector& rItems = m_pImpl->getHyperLabels();
342*b1cdbd2cSJim Jagielski         for (   HL_Vector::const_iterator i = rItems.begin();
343*b1cdbd2cSJim Jagielski                 i < rItems.end();
344*b1cdbd2cSJim Jagielski                 ++i
345*b1cdbd2cSJim Jagielski             )
346*b1cdbd2cSJim Jagielski         {
347*b1cdbd2cSJim Jagielski             (*i)->SetInteractive( _bInteractive );
348*b1cdbd2cSJim Jagielski         }
349*b1cdbd2cSJim Jagielski     }
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
IsRoadmapInteractive()352*b1cdbd2cSJim Jagielski     sal_Bool ORoadmap::IsRoadmapInteractive()
353*b1cdbd2cSJim Jagielski     {
354*b1cdbd2cSJim Jagielski         return m_pImpl->isInteractive();
355*b1cdbd2cSJim Jagielski     }
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
SetRoadmapComplete(sal_Bool _bComplete)358*b1cdbd2cSJim Jagielski     void ORoadmap::SetRoadmapComplete( sal_Bool _bComplete )
359*b1cdbd2cSJim Jagielski     {
360*b1cdbd2cSJim Jagielski         sal_Bool bWasComplete = m_pImpl->isComplete();
361*b1cdbd2cSJim Jagielski         m_pImpl->setComplete( _bComplete );
362*b1cdbd2cSJim Jagielski         if ( _bComplete )
363*b1cdbd2cSJim Jagielski         {
364*b1cdbd2cSJim Jagielski             if ( m_pImpl->InCompleteHyperLabel != NULL)
365*b1cdbd2cSJim Jagielski             {
366*b1cdbd2cSJim Jagielski                 delete m_pImpl->InCompleteHyperLabel;
367*b1cdbd2cSJim Jagielski                 m_pImpl->InCompleteHyperLabel = NULL;
368*b1cdbd2cSJim Jagielski             }
369*b1cdbd2cSJim Jagielski         }
370*b1cdbd2cSJim Jagielski         else if ( bWasComplete )
371*b1cdbd2cSJim Jagielski             m_pImpl->InCompleteHyperLabel = InsertHyperLabel( m_pImpl->getItemCount(), ::String::CreateFromAscii( "..." ), RMINCOMPLETE );
372*b1cdbd2cSJim Jagielski     }
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
UpdatefollowingHyperLabels(ItemIndex _nIndex)375*b1cdbd2cSJim Jagielski     void ORoadmap::UpdatefollowingHyperLabels( ItemIndex _nIndex )
376*b1cdbd2cSJim Jagielski     {
377*b1cdbd2cSJim Jagielski         const HL_Vector& rItems = m_pImpl->getHyperLabels();
378*b1cdbd2cSJim Jagielski         if ( _nIndex < (ItemIndex)rItems.size() )
379*b1cdbd2cSJim Jagielski         {
380*b1cdbd2cSJim Jagielski             RoadmapItem* pItem = NULL;
381*b1cdbd2cSJim Jagielski             for (   HL_Vector::const_iterator i = rItems.begin() + _nIndex;
382*b1cdbd2cSJim Jagielski                     i< rItems.end();
383*b1cdbd2cSJim Jagielski                     ++i, ++_nIndex
384*b1cdbd2cSJim Jagielski                 )
385*b1cdbd2cSJim Jagielski             {
386*b1cdbd2cSJim Jagielski                 pItem = *i;
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski                 pItem->SetIndex( _nIndex );
389*b1cdbd2cSJim Jagielski                 pItem->SetPosition( GetPreviousHyperLabel( _nIndex ) );
390*b1cdbd2cSJim Jagielski             }
391*b1cdbd2cSJim Jagielski         }
392*b1cdbd2cSJim Jagielski         if ( ! m_pImpl->isComplete() )
393*b1cdbd2cSJim Jagielski         {
394*b1cdbd2cSJim Jagielski 	        RoadmapItem* pOldItem = GetPreviousHyperLabel( m_pImpl->getItemCount() );
395*b1cdbd2cSJim Jagielski             m_pImpl->InCompleteHyperLabel->SetPosition( pOldItem );
396*b1cdbd2cSJim Jagielski             m_pImpl->InCompleteHyperLabel->Update( m_pImpl->getItemCount(), ::String::CreateFromAscii("...") );
397*b1cdbd2cSJim Jagielski         }
398*b1cdbd2cSJim Jagielski     }
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
ReplaceRoadmapItem(ItemIndex _Index,const::rtl::OUString & _RoadmapItem,ItemId _RMID,sal_Bool _bEnabled)401*b1cdbd2cSJim Jagielski     void ORoadmap::ReplaceRoadmapItem( ItemIndex _Index, const ::rtl::OUString& _RoadmapItem, ItemId _RMID, sal_Bool _bEnabled )
402*b1cdbd2cSJim Jagielski     {
403*b1cdbd2cSJim Jagielski         RoadmapItem* pItem = GetByIndex( _Index);
404*b1cdbd2cSJim Jagielski         if ( pItem != NULL )
405*b1cdbd2cSJim Jagielski         {
406*b1cdbd2cSJim Jagielski             pItem->Update( _Index,  _RoadmapItem );
407*b1cdbd2cSJim Jagielski             pItem->SetID( _RMID );
408*b1cdbd2cSJim Jagielski             pItem->Enable( _bEnabled );
409*b1cdbd2cSJim Jagielski         }
410*b1cdbd2cSJim Jagielski     }
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
GetItemCount() const413*b1cdbd2cSJim Jagielski     RoadmapTypes::ItemIndex ORoadmap::GetItemCount() const
414*b1cdbd2cSJim Jagielski     {
415*b1cdbd2cSJim Jagielski         return m_pImpl->getItemCount();
416*b1cdbd2cSJim Jagielski     }
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
GetItemID(ItemIndex _nIndex) const419*b1cdbd2cSJim Jagielski     RoadmapTypes::ItemId ORoadmap::GetItemID( ItemIndex _nIndex ) const
420*b1cdbd2cSJim Jagielski     {
421*b1cdbd2cSJim Jagielski         const RoadmapItem* pHyperLabel = GetByIndex( _nIndex );
422*b1cdbd2cSJim Jagielski         if ( pHyperLabel )
423*b1cdbd2cSJim Jagielski             return pHyperLabel->GetID();
424*b1cdbd2cSJim Jagielski         return -1;
425*b1cdbd2cSJim Jagielski     }
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
GetItemIndex(ItemId _nID) const428*b1cdbd2cSJim Jagielski     RoadmapTypes::ItemIndex ORoadmap::GetItemIndex( ItemId _nID ) const
429*b1cdbd2cSJim Jagielski     {
430*b1cdbd2cSJim Jagielski         ItemId nLocID = 0;
431*b1cdbd2cSJim Jagielski         const HL_Vector& rItems = m_pImpl->getHyperLabels();
432*b1cdbd2cSJim Jagielski         for (   HL_Vector::const_iterator i = rItems.begin();
433*b1cdbd2cSJim Jagielski                 i < rItems.end();
434*b1cdbd2cSJim Jagielski                 ++i
435*b1cdbd2cSJim Jagielski             )
436*b1cdbd2cSJim Jagielski         {
437*b1cdbd2cSJim Jagielski             nLocID = (*i)->GetID();
438*b1cdbd2cSJim Jagielski             if ( nLocID == _nID )
439*b1cdbd2cSJim Jagielski                 return ItemIndex( i - rItems.begin() );
440*b1cdbd2cSJim Jagielski         }
441*b1cdbd2cSJim Jagielski         return -1;
442*b1cdbd2cSJim Jagielski     }
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
InsertRoadmapItem(ItemIndex _Index,const::rtl::OUString & _RoadmapItem,ItemId _nUniqueId,sal_Bool _bEnabled)445*b1cdbd2cSJim Jagielski     void ORoadmap::InsertRoadmapItem( ItemIndex _Index, const ::rtl::OUString& _RoadmapItem, ItemId _nUniqueId, sal_Bool _bEnabled )
446*b1cdbd2cSJim Jagielski     {
447*b1cdbd2cSJim Jagielski         InsertHyperLabel( _Index, _RoadmapItem, _nUniqueId, _bEnabled );
448*b1cdbd2cSJim Jagielski             // Todo: YPos is superfluous, if items are always appended
449*b1cdbd2cSJim Jagielski         UpdatefollowingHyperLabels( _Index + 1 );
450*b1cdbd2cSJim Jagielski     }
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
DeleteRoadmapItem(ItemIndex _Index)453*b1cdbd2cSJim Jagielski     void ORoadmap::DeleteRoadmapItem( ItemIndex _Index )
454*b1cdbd2cSJim Jagielski     {
455*b1cdbd2cSJim Jagielski         if ( m_pImpl->getItemCount() > 0 && ( _Index > -1)  &&  ( _Index < m_pImpl->getItemCount() ) )
456*b1cdbd2cSJim Jagielski         {
457*b1cdbd2cSJim Jagielski             m_pImpl->removeHyperLabel( _Index );
458*b1cdbd2cSJim Jagielski             UpdatefollowingHyperLabels( _Index );
459*b1cdbd2cSJim Jagielski         }
460*b1cdbd2cSJim Jagielski     }
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
IsRoadmapComplete() const463*b1cdbd2cSJim Jagielski     sal_Bool ORoadmap::IsRoadmapComplete( ) const
464*b1cdbd2cSJim Jagielski     {
465*b1cdbd2cSJim Jagielski         return m_pImpl->isComplete();
466*b1cdbd2cSJim Jagielski     }
467*b1cdbd2cSJim Jagielski 
468*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
IsRoadmapItemEnabled(ItemId _nItemId,ItemIndex _nStartIndex) const469*b1cdbd2cSJim Jagielski     sal_Bool ORoadmap::IsRoadmapItemEnabled( ItemId _nItemId, ItemIndex _nStartIndex  ) const
470*b1cdbd2cSJim Jagielski     {
471*b1cdbd2cSJim Jagielski         const RoadmapItem* _pLabelItem = GetByID( _nItemId, _nStartIndex  );
472*b1cdbd2cSJim Jagielski         return _pLabelItem ? _pLabelItem->IsEnabled() : sal_False;
473*b1cdbd2cSJim Jagielski     }
474*b1cdbd2cSJim Jagielski 
475*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
EnableRoadmapItem(ItemId _nItemId,sal_Bool _bEnable,ItemIndex _nStartIndex)476*b1cdbd2cSJim Jagielski     void ORoadmap::EnableRoadmapItem( ItemId _nItemId, sal_Bool _bEnable, ItemIndex _nStartIndex )
477*b1cdbd2cSJim Jagielski     {
478*b1cdbd2cSJim Jagielski         RoadmapItem* pItem = GetByID( _nItemId, _nStartIndex );
479*b1cdbd2cSJim Jagielski         if ( pItem != NULL )
480*b1cdbd2cSJim Jagielski             pItem->Enable( _bEnable );
481*b1cdbd2cSJim Jagielski     }
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
ChangeRoadmapItemLabel(ItemId _nID,const::rtl::OUString & _sLabel,ItemIndex _nStartIndex)484*b1cdbd2cSJim Jagielski     void ORoadmap::ChangeRoadmapItemLabel( ItemId _nID, const ::rtl::OUString& _sLabel, ItemIndex _nStartIndex )
485*b1cdbd2cSJim Jagielski     {
486*b1cdbd2cSJim Jagielski         RoadmapItem* pItem = GetByID( _nID, _nStartIndex );
487*b1cdbd2cSJim Jagielski         if ( pItem != NULL )
488*b1cdbd2cSJim Jagielski 		{
489*b1cdbd2cSJim Jagielski             pItem->Update( pItem->GetIndex(), _sLabel );
490*b1cdbd2cSJim Jagielski 
491*b1cdbd2cSJim Jagielski             const HL_Vector& rItems = m_pImpl->getHyperLabels();
492*b1cdbd2cSJim Jagielski 			for (   HL_Vector::const_iterator i = rItems.begin() + _nStartIndex;
493*b1cdbd2cSJim Jagielski                     i < rItems.end();
494*b1cdbd2cSJim Jagielski                     ++i
495*b1cdbd2cSJim Jagielski                 )
496*b1cdbd2cSJim Jagielski 			{
497*b1cdbd2cSJim Jagielski 				(*i)->SetPosition( GetPreviousHyperLabel( i - rItems.begin() ) );
498*b1cdbd2cSJim Jagielski 			}
499*b1cdbd2cSJim Jagielski 		}
500*b1cdbd2cSJim Jagielski     }
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
503*b1cdbd2cSJim Jagielski 
GetRoadmapItemLabel(ItemId _nID,ItemIndex _nStartIndex)504*b1cdbd2cSJim Jagielski     ::rtl::OUString ORoadmap::GetRoadmapItemLabel( ItemId _nID, ItemIndex _nStartIndex )
505*b1cdbd2cSJim Jagielski     {
506*b1cdbd2cSJim Jagielski         RoadmapItem* pItem = GetByID( _nID, _nStartIndex );
507*b1cdbd2cSJim Jagielski         if ( pItem != NULL )
508*b1cdbd2cSJim Jagielski             return pItem->GetLabel();
509*b1cdbd2cSJim Jagielski         else
510*b1cdbd2cSJim Jagielski             return ::rtl::OUString();
511*b1cdbd2cSJim Jagielski     }
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
ChangeRoadmapItemID(ItemId _nID,ItemId _NewID,ItemIndex _nStartIndex)514*b1cdbd2cSJim Jagielski     void ORoadmap::ChangeRoadmapItemID( ItemId _nID, ItemId _NewID, ItemIndex _nStartIndex )
515*b1cdbd2cSJim Jagielski     {
516*b1cdbd2cSJim Jagielski         RoadmapItem* pItem = GetByID( _nID, _nStartIndex );
517*b1cdbd2cSJim Jagielski         if ( pItem != NULL )
518*b1cdbd2cSJim Jagielski             pItem->SetID( _NewID );
519*b1cdbd2cSJim Jagielski     }
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
GetByID(ItemId _nID,ItemIndex _nStartIndex)522*b1cdbd2cSJim Jagielski     RoadmapItem* ORoadmap::GetByID( ItemId _nID, ItemIndex _nStartIndex)
523*b1cdbd2cSJim Jagielski     {
524*b1cdbd2cSJim Jagielski         ItemId nLocID = 0;
525*b1cdbd2cSJim Jagielski         const HL_Vector& rItems = m_pImpl->getHyperLabels();
526*b1cdbd2cSJim Jagielski         for (   HL_Vector::const_iterator i = rItems.begin() + _nStartIndex;
527*b1cdbd2cSJim Jagielski                 i < rItems.end();
528*b1cdbd2cSJim Jagielski                 ++i
529*b1cdbd2cSJim Jagielski             )
530*b1cdbd2cSJim Jagielski         {
531*b1cdbd2cSJim Jagielski             nLocID = (*i)->GetID();
532*b1cdbd2cSJim Jagielski             if ( nLocID == _nID )
533*b1cdbd2cSJim Jagielski                 return *i;
534*b1cdbd2cSJim Jagielski         }
535*b1cdbd2cSJim Jagielski         return NULL;
536*b1cdbd2cSJim Jagielski     }
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
GetByID(ItemId _nID,ItemIndex _nStartIndex) const539*b1cdbd2cSJim Jagielski     const RoadmapItem* ORoadmap::GetByID( ItemId _nID, ItemIndex _nStartIndex  ) const
540*b1cdbd2cSJim Jagielski     {
541*b1cdbd2cSJim Jagielski         return const_cast< ORoadmap* >( this )->GetByID( _nID, _nStartIndex );
542*b1cdbd2cSJim Jagielski     }
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
GetByIndex(ItemIndex _nItemIndex)545*b1cdbd2cSJim Jagielski     RoadmapItem* ORoadmap::GetByIndex( ItemIndex _nItemIndex)
546*b1cdbd2cSJim Jagielski     {
547*b1cdbd2cSJim Jagielski         const HL_Vector& rItems = m_pImpl->getHyperLabels();
548*b1cdbd2cSJim Jagielski         if ( ( _nItemIndex > -1 ) && ( _nItemIndex < (ItemIndex)rItems.size() ) )
549*b1cdbd2cSJim Jagielski         {
550*b1cdbd2cSJim Jagielski             return rItems.at( _nItemIndex );
551*b1cdbd2cSJim Jagielski         }
552*b1cdbd2cSJim Jagielski         return NULL;
553*b1cdbd2cSJim Jagielski     }
554*b1cdbd2cSJim Jagielski 
555*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
GetByIndex(ItemIndex _nItemIndex) const556*b1cdbd2cSJim Jagielski     const RoadmapItem* ORoadmap::GetByIndex( ItemIndex _nItemIndex ) const
557*b1cdbd2cSJim Jagielski     {
558*b1cdbd2cSJim Jagielski         return const_cast< ORoadmap* >( this )->GetByIndex( _nItemIndex );
559*b1cdbd2cSJim Jagielski     }
560*b1cdbd2cSJim Jagielski 
561*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
GetNextAvailableItemId(ItemIndex _nNewIndex)562*b1cdbd2cSJim Jagielski     RoadmapTypes::ItemId ORoadmap::GetNextAvailableItemId( ItemIndex _nNewIndex )
563*b1cdbd2cSJim Jagielski     {
564*b1cdbd2cSJim Jagielski         RoadmapItem* pItem = NULL;
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski         ItemIndex searchIndex = ++_nNewIndex;
567*b1cdbd2cSJim Jagielski         while ( searchIndex < m_pImpl->getItemCount() )
568*b1cdbd2cSJim Jagielski         {
569*b1cdbd2cSJim Jagielski             pItem = GetByIndex( searchIndex );
570*b1cdbd2cSJim Jagielski             if ( pItem->IsEnabled() )
571*b1cdbd2cSJim Jagielski                 return pItem->GetID( );
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski             ++searchIndex;
574*b1cdbd2cSJim Jagielski         }
575*b1cdbd2cSJim Jagielski         return -1;
576*b1cdbd2cSJim Jagielski     }
577*b1cdbd2cSJim Jagielski 
578*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
GetPreviousAvailableItemId(ItemIndex _nNewIndex)579*b1cdbd2cSJim Jagielski     RoadmapTypes::ItemId ORoadmap::GetPreviousAvailableItemId( ItemIndex _nNewIndex )
580*b1cdbd2cSJim Jagielski     {
581*b1cdbd2cSJim Jagielski         RoadmapItem* pItem = NULL;
582*b1cdbd2cSJim Jagielski         ItemIndex searchIndex = --_nNewIndex;
583*b1cdbd2cSJim Jagielski         while ( searchIndex > -1 )
584*b1cdbd2cSJim Jagielski         {
585*b1cdbd2cSJim Jagielski             pItem = GetByIndex( searchIndex );
586*b1cdbd2cSJim Jagielski             if ( pItem->IsEnabled() )
587*b1cdbd2cSJim Jagielski                 return pItem->GetID( );
588*b1cdbd2cSJim Jagielski 
589*b1cdbd2cSJim Jagielski             searchIndex--;
590*b1cdbd2cSJim Jagielski         }
591*b1cdbd2cSJim Jagielski         return -1;
592*b1cdbd2cSJim Jagielski     }
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
DeselectOldRoadmapItems()595*b1cdbd2cSJim Jagielski     void ORoadmap::DeselectOldRoadmapItems()
596*b1cdbd2cSJim Jagielski     {
597*b1cdbd2cSJim Jagielski         const HL_Vector& rItems = m_pImpl->getHyperLabels();
598*b1cdbd2cSJim Jagielski         for (   HL_Vector::const_iterator i = rItems.begin();
599*b1cdbd2cSJim Jagielski                 i < rItems.end();
600*b1cdbd2cSJim Jagielski                 ++i
601*b1cdbd2cSJim Jagielski             )
602*b1cdbd2cSJim Jagielski         {
603*b1cdbd2cSJim Jagielski             (*i)->ToggleBackgroundColor( COL_TRANSPARENT );
604*b1cdbd2cSJim Jagielski         }
605*b1cdbd2cSJim Jagielski     }
606*b1cdbd2cSJim Jagielski 
607*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
SetItemSelectHdl(const Link & _rHdl)608*b1cdbd2cSJim Jagielski     void ORoadmap::SetItemSelectHdl( const Link& _rHdl )
609*b1cdbd2cSJim Jagielski     {
610*b1cdbd2cSJim Jagielski         m_pImpl->setSelectHdl( _rHdl );
611*b1cdbd2cSJim Jagielski     }
612*b1cdbd2cSJim Jagielski 
613*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
GetItemSelectHdl() const614*b1cdbd2cSJim Jagielski     Link ORoadmap::GetItemSelectHdl( ) const
615*b1cdbd2cSJim Jagielski     {
616*b1cdbd2cSJim Jagielski         return m_pImpl->getSelectHdl();
617*b1cdbd2cSJim Jagielski     }
618*b1cdbd2cSJim Jagielski 
619*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
Select()620*b1cdbd2cSJim Jagielski     void ORoadmap::Select()
621*b1cdbd2cSJim Jagielski     {
622*b1cdbd2cSJim Jagielski         GetItemSelectHdl().Call( this );
623*b1cdbd2cSJim Jagielski         CallEventListeners( VCLEVENT_ROADMAP_ITEMSELECTED );
624*b1cdbd2cSJim Jagielski     }
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
GetFocus()627*b1cdbd2cSJim Jagielski     void ORoadmap::GetFocus()
628*b1cdbd2cSJim Jagielski 	{
629*b1cdbd2cSJim Jagielski         RoadmapItem* pCurHyperLabel = GetByID( GetCurrentRoadmapItemID() );
630*b1cdbd2cSJim Jagielski         if ( pCurHyperLabel != NULL )
631*b1cdbd2cSJim Jagielski 		    pCurHyperLabel->GrabFocus();
632*b1cdbd2cSJim Jagielski 	}
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
SelectRoadmapItemByID(ItemId _nNewID)635*b1cdbd2cSJim Jagielski     sal_Bool ORoadmap::SelectRoadmapItemByID( ItemId _nNewID )
636*b1cdbd2cSJim Jagielski     {
637*b1cdbd2cSJim Jagielski         DeselectOldRoadmapItems();
638*b1cdbd2cSJim Jagielski         RoadmapItem* pItem = GetByID( _nNewID );
639*b1cdbd2cSJim Jagielski         if ( pItem != NULL )
640*b1cdbd2cSJim Jagielski         {
641*b1cdbd2cSJim Jagielski             if ( pItem->IsEnabled() )
642*b1cdbd2cSJim Jagielski             {
643*b1cdbd2cSJim Jagielski 				const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
644*b1cdbd2cSJim Jagielski                 pItem->ToggleBackgroundColor( rStyleSettings.GetHighlightColor() ); //HighlightColor
645*b1cdbd2cSJim Jagielski 
646*b1cdbd2cSJim Jagielski 				pItem->GrabFocus();
647*b1cdbd2cSJim Jagielski                 m_pImpl->setCurItemID(_nNewID);
648*b1cdbd2cSJim Jagielski 
649*b1cdbd2cSJim Jagielski                 Select();
650*b1cdbd2cSJim Jagielski                 return sal_True;
651*b1cdbd2cSJim Jagielski             }
652*b1cdbd2cSJim Jagielski         }
653*b1cdbd2cSJim Jagielski         return sal_False;
654*b1cdbd2cSJim Jagielski     }
655*b1cdbd2cSJim Jagielski 
656*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
Paint(const Rectangle & _rRect)657*b1cdbd2cSJim Jagielski 	void ORoadmap::Paint( const Rectangle& _rRect )
658*b1cdbd2cSJim Jagielski 	{
659*b1cdbd2cSJim Jagielski 		Control::Paint( _rRect );
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski 		// draw the bitmap
663*b1cdbd2cSJim Jagielski 		if ( !!m_pImpl->getPicture() )
664*b1cdbd2cSJim Jagielski 		{
665*b1cdbd2cSJim Jagielski 			Size aBitmapSize = m_pImpl->getPicture().GetSizePixel();
666*b1cdbd2cSJim Jagielski 			Size aMySize = GetOutputSizePixel();
667*b1cdbd2cSJim Jagielski 
668*b1cdbd2cSJim Jagielski 			Point aBitmapPos( aMySize.Width() - aBitmapSize.Width(),  aMySize.Height() - aBitmapSize.Height() );
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski 			// draw it
671*b1cdbd2cSJim Jagielski 			DrawBitmapEx( aBitmapPos, m_pImpl->getPicture() );
672*b1cdbd2cSJim Jagielski 		}
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski         //.................................................................
675*b1cdbd2cSJim Jagielski 		// draw the headline
676*b1cdbd2cSJim Jagielski         DrawHeadline();
677*b1cdbd2cSJim Jagielski 	}
678*b1cdbd2cSJim Jagielski 
679*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
DrawHeadline()680*b1cdbd2cSJim Jagielski     void ORoadmap::DrawHeadline()
681*b1cdbd2cSJim Jagielski 	{
682*b1cdbd2cSJim Jagielski 		Point aTextPos = LogicToPixel( Point( ROADMAP_INDENT_X, 8 ), MAP_APPFONT );
683*b1cdbd2cSJim Jagielski 
684*b1cdbd2cSJim Jagielski 		Size aOutputSize( GetOutputSizePixel() );
685*b1cdbd2cSJim Jagielski 
686*b1cdbd2cSJim Jagielski 		// draw it
687*b1cdbd2cSJim Jagielski 		DrawText( Rectangle( aTextPos, aOutputSize ), GetText(), TEXT_DRAW_LEFT | TEXT_DRAW_TOP | TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK );
688*b1cdbd2cSJim Jagielski         DrawTextLine( aTextPos, aOutputSize.Width(), STRIKEOUT_NONE, UNDERLINE_SINGLE, UNDERLINE_NONE, sal_False );
689*b1cdbd2cSJim Jagielski 		const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
690*b1cdbd2cSJim Jagielski         SetLineColor( rStyleSettings.GetFieldTextColor());
691*b1cdbd2cSJim Jagielski 		SetTextColor(rStyleSettings.GetFieldTextColor());
692*b1cdbd2cSJim Jagielski 	}
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
GetByPointer(Window * pWindow)695*b1cdbd2cSJim Jagielski     RoadmapItem* ORoadmap::GetByPointer(Window* pWindow)
696*b1cdbd2cSJim Jagielski     {
697*b1cdbd2cSJim Jagielski         const HL_Vector& rItems = m_pImpl->getHyperLabels();
698*b1cdbd2cSJim Jagielski         for (   HL_Vector::const_iterator i = rItems.begin();
699*b1cdbd2cSJim Jagielski                 i < rItems.end();
700*b1cdbd2cSJim Jagielski                 ++i
701*b1cdbd2cSJim Jagielski             )
702*b1cdbd2cSJim Jagielski         {
703*b1cdbd2cSJim Jagielski 			if ( (*i)->Contains( pWindow ) )
704*b1cdbd2cSJim Jagielski                 return *i;
705*b1cdbd2cSJim Jagielski         }
706*b1cdbd2cSJim Jagielski         return NULL;
707*b1cdbd2cSJim Jagielski     }
708*b1cdbd2cSJim Jagielski 
709*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
PreNotify(NotifyEvent & _rNEvt)710*b1cdbd2cSJim Jagielski     long ORoadmap::PreNotify( NotifyEvent& _rNEvt )
711*b1cdbd2cSJim Jagielski     {
712*b1cdbd2cSJim Jagielski         // capture KeyEvents for taskpane cycling
713*b1cdbd2cSJim Jagielski         if ( _rNEvt.GetType() == EVENT_KEYINPUT )
714*b1cdbd2cSJim Jagielski         {
715*b1cdbd2cSJim Jagielski             Window* pWindow = _rNEvt.GetWindow();
716*b1cdbd2cSJim Jagielski             RoadmapItem* pItem = GetByPointer( pWindow );
717*b1cdbd2cSJim Jagielski             if ( pItem != NULL )
718*b1cdbd2cSJim Jagielski             {
719*b1cdbd2cSJim Jagielski                 sal_Int16 nKeyCode = _rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
720*b1cdbd2cSJim Jagielski 		        switch( nKeyCode )
721*b1cdbd2cSJim Jagielski 		        {
722*b1cdbd2cSJim Jagielski 			        case KEY_UP:
723*b1cdbd2cSJim Jagielski                         {   // Note: Performancewise this is not optimal, because we search for an ID in the labels
724*b1cdbd2cSJim Jagielski                             //       and afterwards we search again for a label with the appropriate ID ->
725*b1cdbd2cSJim Jagielski                             //       unnecessarily we search twice!!!
726*b1cdbd2cSJim Jagielski                             ItemId nPrevItemID = GetPreviousAvailableItemId( pItem->GetIndex() );
727*b1cdbd2cSJim Jagielski                             if ( nPrevItemID != -1 )
728*b1cdbd2cSJim Jagielski                                 return SelectRoadmapItemByID( nPrevItemID );
729*b1cdbd2cSJim Jagielski                         }
730*b1cdbd2cSJim Jagielski                         break;
731*b1cdbd2cSJim Jagielski 			        case KEY_DOWN:
732*b1cdbd2cSJim Jagielski                         {
733*b1cdbd2cSJim Jagielski                             ItemId nNextItemID = GetNextAvailableItemId( pItem->GetIndex() );
734*b1cdbd2cSJim Jagielski                             if ( nNextItemID != -1 )
735*b1cdbd2cSJim Jagielski                                 return SelectRoadmapItemByID( nNextItemID );
736*b1cdbd2cSJim Jagielski                         }
737*b1cdbd2cSJim Jagielski                         break;
738*b1cdbd2cSJim Jagielski                     case KEY_SPACE:
739*b1cdbd2cSJim Jagielski                         return SelectRoadmapItemByID( pItem->GetID() );
740*b1cdbd2cSJim Jagielski                 }
741*b1cdbd2cSJim Jagielski             }
742*b1cdbd2cSJim Jagielski         }
743*b1cdbd2cSJim Jagielski         return Window::PreNotify( _rNEvt );
744*b1cdbd2cSJim Jagielski     }
745*b1cdbd2cSJim Jagielski 
746*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
IMPL_LINK(ORoadmap,ImplClickHdl,HyperLabel *,_CurHyperLabel)747*b1cdbd2cSJim Jagielski   	IMPL_LINK(ORoadmap, ImplClickHdl, HyperLabel*, _CurHyperLabel)
748*b1cdbd2cSJim Jagielski 	{
749*b1cdbd2cSJim Jagielski        return SelectRoadmapItemByID( _CurHyperLabel->GetID() );
750*b1cdbd2cSJim Jagielski     }
751*b1cdbd2cSJim Jagielski 
752*b1cdbd2cSJim Jagielski 
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
DataChanged(const DataChangedEvent & rDCEvt)755*b1cdbd2cSJim Jagielski 	void ORoadmap::DataChanged( const DataChangedEvent& rDCEvt )
756*b1cdbd2cSJim Jagielski 	{
757*b1cdbd2cSJim Jagielski 		if ((( rDCEvt.GetType() == DATACHANGED_SETTINGS	)	||
758*b1cdbd2cSJim Jagielski 			( rDCEvt.GetType() == DATACHANGED_DISPLAY	))	&&
759*b1cdbd2cSJim Jagielski 			( rDCEvt.GetFlags() & SETTINGS_STYLE		))
760*b1cdbd2cSJim Jagielski 		{
761*b1cdbd2cSJim Jagielski 			const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
762*b1cdbd2cSJim Jagielski 			SetBackground( Wallpaper( rStyleSettings.GetFieldColor() ) );
763*b1cdbd2cSJim Jagielski 			Color aTextColor = rStyleSettings.GetFieldTextColor();
764*b1cdbd2cSJim Jagielski 			Font aFont = GetFont();
765*b1cdbd2cSJim Jagielski 			aFont.SetColor( aTextColor );
766*b1cdbd2cSJim Jagielski 			SetFont( aFont );
767*b1cdbd2cSJim Jagielski 			RoadmapTypes::ItemId curItemID = GetCurrentRoadmapItemID();
768*b1cdbd2cSJim Jagielski 			RoadmapItem* pLabelItem = GetByID( curItemID );
769*b1cdbd2cSJim Jagielski             if ( pLabelItem != NULL )
770*b1cdbd2cSJim Jagielski                 pLabelItem->ToggleBackgroundColor(rStyleSettings.GetHighlightColor());
771*b1cdbd2cSJim Jagielski 			Invalidate();
772*b1cdbd2cSJim Jagielski 		}
773*b1cdbd2cSJim Jagielski 	}
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 
776*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
RoadmapItem(ORoadmap & _rParent,const Size & _rItemPlayground)777*b1cdbd2cSJim Jagielski     RoadmapItem::RoadmapItem( ORoadmap& _rParent, const Size& _rItemPlayground )
778*b1cdbd2cSJim Jagielski         :m_aItemPlayground( _rItemPlayground )
779*b1cdbd2cSJim Jagielski 	{
780*b1cdbd2cSJim Jagielski 		mpID = new IDLabel( &_rParent, WB_WORDBREAK );
781*b1cdbd2cSJim Jagielski 		mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetFieldTextColor( ) );
782*b1cdbd2cSJim Jagielski         mpID->Show();
783*b1cdbd2cSJim Jagielski 		mpDescription = new HyperLabel( &_rParent, WB_NOTABSTOP | WB_WORDBREAK );
784*b1cdbd2cSJim Jagielski         mpDescription->Show();
785*b1cdbd2cSJim Jagielski 	}
786*b1cdbd2cSJim Jagielski 
787*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
Contains(const Window * _pWindow) const788*b1cdbd2cSJim Jagielski     bool RoadmapItem::Contains( const Window* _pWindow ) const
789*b1cdbd2cSJim Jagielski     {
790*b1cdbd2cSJim Jagielski         return ( mpID == _pWindow ) || ( mpDescription == _pWindow );
791*b1cdbd2cSJim Jagielski     }
792*b1cdbd2cSJim Jagielski 
793*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
GrabFocus()794*b1cdbd2cSJim Jagielski     void RoadmapItem::GrabFocus()
795*b1cdbd2cSJim Jagielski 	{
796*b1cdbd2cSJim Jagielski         if ( mpDescription )
797*b1cdbd2cSJim Jagielski             mpDescription->GrabFocus();
798*b1cdbd2cSJim Jagielski 	}
799*b1cdbd2cSJim Jagielski 
800*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
SetInteractive(sal_Bool _bInteractive)801*b1cdbd2cSJim Jagielski 	void RoadmapItem::SetInteractive( sal_Bool _bInteractive )
802*b1cdbd2cSJim Jagielski 	{
803*b1cdbd2cSJim Jagielski         if ( mpDescription )
804*b1cdbd2cSJim Jagielski 		mpDescription->SetInteractive(_bInteractive);
805*b1cdbd2cSJim Jagielski 	}
806*b1cdbd2cSJim Jagielski 
807*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
SetID(sal_Int16 _ID)808*b1cdbd2cSJim Jagielski 	void RoadmapItem::SetID( sal_Int16 _ID )
809*b1cdbd2cSJim Jagielski 	{
810*b1cdbd2cSJim Jagielski         if ( mpDescription )
811*b1cdbd2cSJim Jagielski 		    mpDescription->SetID(_ID);
812*b1cdbd2cSJim Jagielski 	}
813*b1cdbd2cSJim Jagielski 
814*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
GetID() const815*b1cdbd2cSJim Jagielski 	sal_Int16 RoadmapItem::GetID() const
816*b1cdbd2cSJim Jagielski 	{
817*b1cdbd2cSJim Jagielski         return mpDescription ? mpDescription->GetID() : sal_Int16(-1);
818*b1cdbd2cSJim Jagielski 	}
819*b1cdbd2cSJim Jagielski 
820*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
ImplUpdateIndex(const ItemIndex _nIndex)821*b1cdbd2cSJim Jagielski     void RoadmapItem::ImplUpdateIndex( const ItemIndex _nIndex )
822*b1cdbd2cSJim Jagielski     {
823*b1cdbd2cSJim Jagielski         if ( mpDescription )
824*b1cdbd2cSJim Jagielski 		    mpDescription->SetIndex( _nIndex );
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski         if ( mpID )
827*b1cdbd2cSJim Jagielski         {
828*b1cdbd2cSJim Jagielski             ::rtl::OUString aIDText = ::rtl::OUString::valueOf( (sal_Int32)( _nIndex + 1 ) ) +  ::rtl::OUString::createFromAscii( "." );
829*b1cdbd2cSJim Jagielski  		    mpID->SetText( aIDText );
830*b1cdbd2cSJim Jagielski         }
831*b1cdbd2cSJim Jagielski 
832*b1cdbd2cSJim Jagielski         // update the geometry of both controls
833*b1cdbd2cSJim Jagielski         ImplUpdatePosSize();
834*b1cdbd2cSJim Jagielski     }
835*b1cdbd2cSJim Jagielski 
836*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
SetIndex(ItemIndex _Index)837*b1cdbd2cSJim Jagielski 	void RoadmapItem::SetIndex( ItemIndex _Index )
838*b1cdbd2cSJim Jagielski 	{
839*b1cdbd2cSJim Jagielski         ImplUpdateIndex( _Index );
840*b1cdbd2cSJim Jagielski 	}
841*b1cdbd2cSJim Jagielski 
842*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
GetIndex() const843*b1cdbd2cSJim Jagielski     RoadmapTypes::ItemIndex RoadmapItem::GetIndex() const
844*b1cdbd2cSJim Jagielski 	{
845*b1cdbd2cSJim Jagielski         return mpDescription ? mpDescription->GetIndex() : ItemIndex(-1);
846*b1cdbd2cSJim Jagielski 	}
847*b1cdbd2cSJim Jagielski 
848*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
SetLabel(const::rtl::OUString & _rText)849*b1cdbd2cSJim Jagielski 	void RoadmapItem::SetLabel( const ::rtl::OUString& _rText )
850*b1cdbd2cSJim Jagielski 	{
851*b1cdbd2cSJim Jagielski         if ( mpDescription )
852*b1cdbd2cSJim Jagielski 		    mpDescription->SetText(_rText);
853*b1cdbd2cSJim Jagielski 	}
854*b1cdbd2cSJim Jagielski 
855*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
GetLabel()856*b1cdbd2cSJim Jagielski 	::rtl::OUString RoadmapItem::GetLabel( )
857*b1cdbd2cSJim Jagielski 	{
858*b1cdbd2cSJim Jagielski         return mpDescription ? mpDescription->GetText() : String();
859*b1cdbd2cSJim Jagielski 	}
860*b1cdbd2cSJim Jagielski 
861*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
SetPosition(RoadmapItem * _pOldItem)862*b1cdbd2cSJim Jagielski 	void RoadmapItem::SetPosition( RoadmapItem* _pOldItem )
863*b1cdbd2cSJim Jagielski 	{
864*b1cdbd2cSJim Jagielski 		Point aIDPos;
865*b1cdbd2cSJim Jagielski 		if ( _pOldItem == NULL )
866*b1cdbd2cSJim Jagielski 		{
867*b1cdbd2cSJim Jagielski 			aIDPos = mpID->LogicToPixel( Point( ROADMAP_INDENT_X, ROADMAP_INDENT_Y ), MAP_APPFONT );
868*b1cdbd2cSJim Jagielski 		}
869*b1cdbd2cSJim Jagielski 		else
870*b1cdbd2cSJim Jagielski 		{
871*b1cdbd2cSJim Jagielski 			Size aOldSize = _pOldItem->GetDescriptionHyperLabel()->GetSizePixel();
872*b1cdbd2cSJim Jagielski 
873*b1cdbd2cSJim Jagielski             aIDPos = _pOldItem->mpID->GetPosPixel();
874*b1cdbd2cSJim Jagielski             aIDPos.Y() += aOldSize.Height();
875*b1cdbd2cSJim Jagielski             aIDPos.Y() += mpID->GetParent()->LogicToPixel( Size( 0, ROADMAP_ITEM_DISTANCE_Y ) ).Height();
876*b1cdbd2cSJim Jagielski 		}
877*b1cdbd2cSJim Jagielski 		mpID->SetPosPixel( aIDPos );
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski 		sal_Int32 nDescPos = aIDPos.X() + mpID->GetSizePixel().Width();
880*b1cdbd2cSJim Jagielski 		mpDescription->SetPosPixel( Point( nDescPos, aIDPos.Y() ) );
881*b1cdbd2cSJim Jagielski 	}
882*b1cdbd2cSJim Jagielski 
883*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
SetZOrder(RoadmapItem * pRefRoadmapHyperLabel,sal_uInt16 nFlags)884*b1cdbd2cSJim Jagielski 	void RoadmapItem::SetZOrder( RoadmapItem* pRefRoadmapHyperLabel, sal_uInt16 nFlags )
885*b1cdbd2cSJim Jagielski 	{
886*b1cdbd2cSJim Jagielski 		if (pRefRoadmapHyperLabel == NULL)
887*b1cdbd2cSJim Jagielski 			mpDescription->SetZOrder( NULL, nFlags); //WINDOW_ZORDER_FIRST );
888*b1cdbd2cSJim Jagielski 		else
889*b1cdbd2cSJim Jagielski 			mpDescription->SetZOrder( pRefRoadmapHyperLabel->mpDescription, nFlags); //, WINDOW_ZORDER_BEHIND );
890*b1cdbd2cSJim Jagielski 	}
891*b1cdbd2cSJim Jagielski 
892*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
Enable(sal_Bool _bEnable)893*b1cdbd2cSJim Jagielski 	void RoadmapItem::Enable( sal_Bool _bEnable)
894*b1cdbd2cSJim Jagielski 	{
895*b1cdbd2cSJim Jagielski 		mpID->Enable(_bEnable);
896*b1cdbd2cSJim Jagielski 		mpDescription->Enable(_bEnable);
897*b1cdbd2cSJim Jagielski 	}
898*b1cdbd2cSJim Jagielski 
899*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
IsEnabled() const900*b1cdbd2cSJim Jagielski 	sal_Bool RoadmapItem::IsEnabled() const
901*b1cdbd2cSJim Jagielski 	{
902*b1cdbd2cSJim Jagielski 		return mpID->IsEnabled();
903*b1cdbd2cSJim Jagielski 	}
904*b1cdbd2cSJim Jagielski 
905*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
ToggleBackgroundColor(const Color & _rGBColor)906*b1cdbd2cSJim Jagielski 	void RoadmapItem::ToggleBackgroundColor( const Color& _rGBColor )
907*b1cdbd2cSJim Jagielski 	{
908*b1cdbd2cSJim Jagielski 		if (_rGBColor == COL_TRANSPARENT)
909*b1cdbd2cSJim Jagielski 		{
910*b1cdbd2cSJim Jagielski 			mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetFieldTextColor( ) );
911*b1cdbd2cSJim Jagielski 			mpID->SetControlBackground( COL_TRANSPARENT );
912*b1cdbd2cSJim Jagielski 		}
913*b1cdbd2cSJim Jagielski 		else
914*b1cdbd2cSJim Jagielski 		{
915*b1cdbd2cSJim Jagielski 			mpID->SetControlBackground( mpID->GetSettings().GetStyleSettings().GetHighlightColor() );
916*b1cdbd2cSJim Jagielski 			mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetHighlightTextColor( ) );
917*b1cdbd2cSJim Jagielski 		}
918*b1cdbd2cSJim Jagielski 		mpDescription->ToggleBackgroundColor(_rGBColor);
919*b1cdbd2cSJim Jagielski 	}
920*b1cdbd2cSJim Jagielski 
921*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
ImplUpdatePosSize()922*b1cdbd2cSJim Jagielski     void RoadmapItem::ImplUpdatePosSize()
923*b1cdbd2cSJim Jagielski     {
924*b1cdbd2cSJim Jagielski         // calculate widths
925*b1cdbd2cSJim Jagielski         long nIDWidth = mpID->GetTextWidth( mpID->GetText() );
926*b1cdbd2cSJim Jagielski 		long nMaxIDWidth = mpID->GetTextWidth( ::rtl::OUString::createFromAscii( "100." ) );
927*b1cdbd2cSJim Jagielski 		nIDWidth = ::std::min( nIDWidth, nMaxIDWidth );
928*b1cdbd2cSJim Jagielski 
929*b1cdbd2cSJim Jagielski         // check how many space the description would need
930*b1cdbd2cSJim Jagielski         Size aDescriptionSize = mpDescription->CalcMinimumSize( m_aItemPlayground.Width() - nIDWidth );
931*b1cdbd2cSJim Jagielski 
932*b1cdbd2cSJim Jagielski         // position and size both controls
933*b1cdbd2cSJim Jagielski         Size aIDSize( nIDWidth, aDescriptionSize.Height() );
934*b1cdbd2cSJim Jagielski  		mpID->SetSizePixel( aIDSize );
935*b1cdbd2cSJim Jagielski 
936*b1cdbd2cSJim Jagielski         Point aIDPos = mpID->GetPosPixel();
937*b1cdbd2cSJim Jagielski         mpDescription->SetPosPixel( Point( aIDPos.X() + nIDWidth, aIDPos.Y() ) );
938*b1cdbd2cSJim Jagielski         mpDescription->SetSizePixel( aDescriptionSize );
939*b1cdbd2cSJim Jagielski     }
940*b1cdbd2cSJim Jagielski 
941*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
Update(ItemIndex _RMIndex,const::rtl::OUString & _rText)942*b1cdbd2cSJim Jagielski 	void RoadmapItem::Update( ItemIndex _RMIndex, const ::rtl::OUString& _rText )
943*b1cdbd2cSJim Jagielski 	{
944*b1cdbd2cSJim Jagielski         // update description label
945*b1cdbd2cSJim Jagielski         mpDescription->SetLabel( _rText );
946*b1cdbd2cSJim Jagielski 
947*b1cdbd2cSJim Jagielski         // update the index in both controls, which triggers updating the geometry of both
948*b1cdbd2cSJim Jagielski         ImplUpdateIndex( _RMIndex );
949*b1cdbd2cSJim Jagielski 	}
950*b1cdbd2cSJim Jagielski 
951*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
~RoadmapItem()952*b1cdbd2cSJim Jagielski 	RoadmapItem::~RoadmapItem( )
953*b1cdbd2cSJim Jagielski 	{
954*b1cdbd2cSJim Jagielski         {
955*b1cdbd2cSJim Jagielski             ::std::auto_ptr<Control> aTemp(mpID);
956*b1cdbd2cSJim Jagielski 		    mpID = NULL;
957*b1cdbd2cSJim Jagielski         }
958*b1cdbd2cSJim Jagielski         {
959*b1cdbd2cSJim Jagielski             ::std::auto_ptr<Control> aTemp(mpDescription);
960*b1cdbd2cSJim Jagielski 		    mpDescription = NULL;
961*b1cdbd2cSJim Jagielski         }
962*b1cdbd2cSJim Jagielski 	}
963*b1cdbd2cSJim Jagielski 
964*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
SetClickHdl(const Link & rLink)965*b1cdbd2cSJim Jagielski 	void RoadmapItem::SetClickHdl( const Link& rLink )
966*b1cdbd2cSJim Jagielski 	{
967*b1cdbd2cSJim Jagielski         if ( mpDescription )
968*b1cdbd2cSJim Jagielski 		    mpDescription->SetClickHdl( rLink);
969*b1cdbd2cSJim Jagielski 	}
970*b1cdbd2cSJim Jagielski 
971*b1cdbd2cSJim Jagielski     //---------------------------------------------------------------------
GetClickHdl() const972*b1cdbd2cSJim Jagielski 	const Link& RoadmapItem::GetClickHdl( ) const
973*b1cdbd2cSJim Jagielski 	{
974*b1cdbd2cSJim Jagielski 		return mpDescription->GetClickHdl();
975*b1cdbd2cSJim Jagielski 	}
976*b1cdbd2cSJim Jagielski 
977*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
IDLabel(Window * _pParent,WinBits _nWinStyle)978*b1cdbd2cSJim Jagielski     IDLabel::IDLabel( Window* _pParent, WinBits _nWinStyle )
979*b1cdbd2cSJim Jagielski 		:FixedText( _pParent, _nWinStyle )
980*b1cdbd2cSJim Jagielski 	{
981*b1cdbd2cSJim Jagielski 
982*b1cdbd2cSJim Jagielski 	}
983*b1cdbd2cSJim Jagielski 
984*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
~IDLabel()985*b1cdbd2cSJim Jagielski 	IDLabel::~IDLabel( )
986*b1cdbd2cSJim Jagielski 	{
987*b1cdbd2cSJim Jagielski 	}
988*b1cdbd2cSJim Jagielski 
989*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
DataChanged(const DataChangedEvent & rDCEvt)990*b1cdbd2cSJim Jagielski 	void IDLabel::DataChanged( const DataChangedEvent& rDCEvt )
991*b1cdbd2cSJim Jagielski 	{
992*b1cdbd2cSJim Jagielski 		const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
993*b1cdbd2cSJim Jagielski 		FixedText::DataChanged( rDCEvt );
994*b1cdbd2cSJim Jagielski 		if ((( rDCEvt.GetType() == DATACHANGED_SETTINGS	)	||
995*b1cdbd2cSJim Jagielski 			( rDCEvt.GetType() == DATACHANGED_DISPLAY	))	&&
996*b1cdbd2cSJim Jagielski 			( rDCEvt.GetFlags() & SETTINGS_STYLE		))
997*b1cdbd2cSJim Jagielski 		{
998*b1cdbd2cSJim Jagielski 			const Color& rGBColor = GetControlBackground();
999*b1cdbd2cSJim Jagielski 			if (rGBColor == COL_TRANSPARENT)
1000*b1cdbd2cSJim Jagielski 				SetTextColor( rStyleSettings.GetFieldTextColor( ) );
1001*b1cdbd2cSJim Jagielski 			else
1002*b1cdbd2cSJim Jagielski 			{
1003*b1cdbd2cSJim Jagielski 				SetControlBackground(rStyleSettings.GetHighlightColor());
1004*b1cdbd2cSJim Jagielski 				SetTextColor( rStyleSettings.GetHighlightTextColor( ) );
1005*b1cdbd2cSJim Jagielski 			}
1006*b1cdbd2cSJim Jagielski 			Invalidate();
1007*b1cdbd2cSJim Jagielski 		}
1008*b1cdbd2cSJim Jagielski 	}
1009*b1cdbd2cSJim Jagielski 
1010*b1cdbd2cSJim Jagielski 
1011*b1cdbd2cSJim Jagielski 
1012*b1cdbd2cSJim Jagielski 
1013*b1cdbd2cSJim Jagielski //.........................................................................
1014*b1cdbd2cSJim Jagielski }	// namespace svt
1015*b1cdbd2cSJim Jagielski //.........................................................................
1016