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 #ifndef SVTOOLS_ROADMAP_HXX
27*b1cdbd2cSJim Jagielski #include <svtools/hyperlabel.hxx>
28*b1cdbd2cSJim Jagielski #endif
29*b1cdbd2cSJim Jagielski #include <vcl/bitmap.hxx>
30*b1cdbd2cSJim Jagielski #include <tools/color.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #ifndef _VCL_TABPAGE_HXX
33*b1cdbd2cSJim Jagielski #include <vcl/tabpage.hxx>
34*b1cdbd2cSJim Jagielski #endif
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski //.........................................................................
38*b1cdbd2cSJim Jagielski namespace svt
39*b1cdbd2cSJim Jagielski {
40*b1cdbd2cSJim Jagielski //.........................................................................
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski 	//=====================================================================
43*b1cdbd2cSJim Jagielski 	//= FontChanger
44*b1cdbd2cSJim Jagielski 	//=====================================================================
45*b1cdbd2cSJim Jagielski 	class FontChanger
46*b1cdbd2cSJim Jagielski 	{
47*b1cdbd2cSJim Jagielski 	protected:
48*b1cdbd2cSJim Jagielski 		OutputDevice*	m_pDev;
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski 	public:
FontChanger(OutputDevice * _pDev,const Font & _rNewFont)51*b1cdbd2cSJim Jagielski 		FontChanger( OutputDevice* _pDev, const Font& _rNewFont )
52*b1cdbd2cSJim Jagielski 			:m_pDev( _pDev )
53*b1cdbd2cSJim Jagielski 		{
54*b1cdbd2cSJim Jagielski 			m_pDev->Push( PUSH_FONT );
55*b1cdbd2cSJim Jagielski 			m_pDev->SetFont( _rNewFont );
56*b1cdbd2cSJim Jagielski 		}
57*b1cdbd2cSJim Jagielski 
~FontChanger()58*b1cdbd2cSJim Jagielski 		~FontChanger()
59*b1cdbd2cSJim Jagielski 		{
60*b1cdbd2cSJim Jagielski 			m_pDev->Pop( );
61*b1cdbd2cSJim Jagielski 		}
62*b1cdbd2cSJim Jagielski 	};
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski 	class HyperLabelImpl
65*b1cdbd2cSJim Jagielski 	{
66*b1cdbd2cSJim Jagielski 	public:
67*b1cdbd2cSJim Jagielski         sal_Int16           ID;
68*b1cdbd2cSJim Jagielski         sal_Int32           Index;
69*b1cdbd2cSJim Jagielski         sal_Bool            bInteractive;
70*b1cdbd2cSJim Jagielski         Size                m_aMinSize;
71*b1cdbd2cSJim Jagielski         sal_Bool            m_bHyperMode;
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski 		HyperLabelImpl();
74*b1cdbd2cSJim Jagielski 	};
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski 	//---------------------------------------------------------------------
HyperLabelImpl()77*b1cdbd2cSJim Jagielski 	HyperLabelImpl::HyperLabelImpl()
78*b1cdbd2cSJim Jagielski 	{
79*b1cdbd2cSJim Jagielski 	}
80*b1cdbd2cSJim Jagielski 
HyperLabel(Window * _pParent,const ResId & _rId)81*b1cdbd2cSJim Jagielski 	HyperLabel::HyperLabel( Window* _pParent, const ResId& _rId )
82*b1cdbd2cSJim Jagielski 		:FixedText( _pParent, _rId )
83*b1cdbd2cSJim Jagielski 		,m_pImpl( new HyperLabelImpl )
84*b1cdbd2cSJim Jagielski 	{
85*b1cdbd2cSJim Jagielski 		implInit();
86*b1cdbd2cSJim Jagielski 	}
87*b1cdbd2cSJim Jagielski 
HyperLabel(Window * _pParent,WinBits _nWinStyle)88*b1cdbd2cSJim Jagielski     HyperLabel::HyperLabel( Window* _pParent, WinBits _nWinStyle )
89*b1cdbd2cSJim Jagielski 		:FixedText( _pParent, _nWinStyle )
90*b1cdbd2cSJim Jagielski 		,m_pImpl( new HyperLabelImpl )
91*b1cdbd2cSJim Jagielski 	{
92*b1cdbd2cSJim Jagielski 		implInit();
93*b1cdbd2cSJim Jagielski 	}
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski 
GetLogicWidth()96*b1cdbd2cSJim Jagielski 	sal_Int32 HyperLabel::GetLogicWidth()
97*b1cdbd2cSJim Jagielski 	{
98*b1cdbd2cSJim Jagielski 		Size rLogicLocSize = PixelToLogic( m_pImpl->m_aMinSize, MAP_APPFONT );
99*b1cdbd2cSJim Jagielski 		return rLogicLocSize.Width();
100*b1cdbd2cSJim Jagielski 	}
101*b1cdbd2cSJim Jagielski 
102*b1cdbd2cSJim Jagielski 
CalcMinimumSize(long nMaxWidth) const103*b1cdbd2cSJim Jagielski     Size HyperLabel::CalcMinimumSize( long nMaxWidth ) const
104*b1cdbd2cSJim Jagielski     {
105*b1cdbd2cSJim Jagielski         m_pImpl->m_aMinSize = FixedText::CalcMinimumSize( nMaxWidth );
106*b1cdbd2cSJim Jagielski         // the MinimumSize is used to size the FocusRectangle
107*b1cdbd2cSJim Jagielski         // and for the MouseMove method
108*b1cdbd2cSJim Jagielski 		m_pImpl->m_aMinSize.Height() += 2;
109*b1cdbd2cSJim Jagielski         m_pImpl->m_aMinSize.Width() += 1;
110*b1cdbd2cSJim Jagielski         return m_pImpl->m_aMinSize;
111*b1cdbd2cSJim Jagielski     }
112*b1cdbd2cSJim Jagielski 
implInit()113*b1cdbd2cSJim Jagielski 	void HyperLabel::implInit()
114*b1cdbd2cSJim Jagielski 	{
115*b1cdbd2cSJim Jagielski         ToggleBackgroundColor( COL_TRANSPARENT );
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski         WinBits nWinStyle = GetStyle();
118*b1cdbd2cSJim Jagielski         nWinStyle |= WB_EXTRAOFFSET;
119*b1cdbd2cSJim Jagielski         SetStyle( nWinStyle );
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski         Show();
122*b1cdbd2cSJim Jagielski 	}
123*b1cdbd2cSJim Jagielski 
ToggleBackgroundColor(const Color & _rGBColor)124*b1cdbd2cSJim Jagielski 	void HyperLabel::ToggleBackgroundColor( const Color& _rGBColor )
125*b1cdbd2cSJim Jagielski 	{
126*b1cdbd2cSJim Jagielski 		const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
127*b1cdbd2cSJim Jagielski 		SetControlBackground( _rGBColor );
128*b1cdbd2cSJim Jagielski 		if (_rGBColor == COL_TRANSPARENT)
129*b1cdbd2cSJim Jagielski 	        SetTextColor( rStyleSettings.GetFieldTextColor( ) );
130*b1cdbd2cSJim Jagielski 		else
131*b1cdbd2cSJim Jagielski 	        SetTextColor( rStyleSettings.GetHighlightTextColor( ) );
132*b1cdbd2cSJim Jagielski 	}
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 
MouseMove(const MouseEvent & rMEvt)135*b1cdbd2cSJim Jagielski     void HyperLabel::MouseMove( const MouseEvent& rMEvt )
136*b1cdbd2cSJim Jagielski     {
137*b1cdbd2cSJim Jagielski    		Font aFont = GetControlFont( );
138*b1cdbd2cSJim Jagielski         const Color aColor = GetTextColor();
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski         if (rMEvt.IsLeaveWindow())
141*b1cdbd2cSJim Jagielski         {
142*b1cdbd2cSJim Jagielski             DeactivateHyperMode(aFont, aColor);
143*b1cdbd2cSJim Jagielski         }
144*b1cdbd2cSJim Jagielski         else
145*b1cdbd2cSJim Jagielski         {
146*b1cdbd2cSJim Jagielski             Point aPoint = GetPointerPosPixel();
147*b1cdbd2cSJim Jagielski             if (aPoint.X() < m_pImpl->m_aMinSize.Width())
148*b1cdbd2cSJim Jagielski             {
149*b1cdbd2cSJim Jagielski                 if ( IsEnabled() && (m_pImpl->bInteractive) )
150*b1cdbd2cSJim Jagielski                 {
151*b1cdbd2cSJim Jagielski                     ActivateHyperMode( aFont, aColor);
152*b1cdbd2cSJim Jagielski                     return;
153*b1cdbd2cSJim Jagielski                 }
154*b1cdbd2cSJim Jagielski             }
155*b1cdbd2cSJim Jagielski             DeactivateHyperMode(aFont, aColor);
156*b1cdbd2cSJim Jagielski         }
157*b1cdbd2cSJim Jagielski     }
158*b1cdbd2cSJim Jagielski 
ActivateHyperMode(Font aFont,const Color aColor)159*b1cdbd2cSJim Jagielski     void HyperLabel::ActivateHyperMode(Font aFont, const Color aColor)
160*b1cdbd2cSJim Jagielski     {
161*b1cdbd2cSJim Jagielski         aFont.SetUnderline(UNDERLINE_SINGLE);
162*b1cdbd2cSJim Jagielski         m_pImpl->m_bHyperMode = sal_True;
163*b1cdbd2cSJim Jagielski         SetPointer( POINTER_REFHAND );
164*b1cdbd2cSJim Jagielski         SetControlFont( aFont);
165*b1cdbd2cSJim Jagielski         SetTextColor( aColor);
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski     }
168*b1cdbd2cSJim Jagielski 
DeactivateHyperMode(Font aFont,const Color aColor)169*b1cdbd2cSJim Jagielski     void HyperLabel::DeactivateHyperMode(Font aFont, const Color aColor)
170*b1cdbd2cSJim Jagielski     {
171*b1cdbd2cSJim Jagielski         m_pImpl->m_bHyperMode = sal_False;
172*b1cdbd2cSJim Jagielski         aFont.SetUnderline(UNDERLINE_NONE);
173*b1cdbd2cSJim Jagielski         SetPointer( POINTER_ARROW );
174*b1cdbd2cSJim Jagielski         SetControlFont( aFont);
175*b1cdbd2cSJim Jagielski         SetTextColor( aColor);
176*b1cdbd2cSJim Jagielski     }
177*b1cdbd2cSJim Jagielski 
MouseButtonDown(const MouseEvent &)178*b1cdbd2cSJim Jagielski     void HyperLabel::MouseButtonDown( const MouseEvent& )
179*b1cdbd2cSJim Jagielski     {
180*b1cdbd2cSJim Jagielski         if ( m_pImpl->m_bHyperMode && m_pImpl->bInteractive )
181*b1cdbd2cSJim Jagielski         {
182*b1cdbd2cSJim Jagielski 			maClickHdl.Call( this );
183*b1cdbd2cSJim Jagielski         }
184*b1cdbd2cSJim Jagielski     }
185*b1cdbd2cSJim Jagielski 
GetFocus()186*b1cdbd2cSJim Jagielski     void HyperLabel::GetFocus()
187*b1cdbd2cSJim Jagielski     {
188*b1cdbd2cSJim Jagielski         if ( IsEnabled() && m_pImpl->bInteractive )
189*b1cdbd2cSJim Jagielski         {
190*b1cdbd2cSJim Jagielski             Point aPoint(0,0);
191*b1cdbd2cSJim Jagielski             Rectangle rRect(aPoint, Size( m_pImpl->m_aMinSize.Width(), GetSizePixel().Height() ) );
192*b1cdbd2cSJim Jagielski             ShowFocus( rRect );
193*b1cdbd2cSJim Jagielski         }
194*b1cdbd2cSJim Jagielski     }
195*b1cdbd2cSJim Jagielski 
LoseFocus()196*b1cdbd2cSJim Jagielski     void HyperLabel::LoseFocus()
197*b1cdbd2cSJim Jagielski     {
198*b1cdbd2cSJim Jagielski         HideFocus();
199*b1cdbd2cSJim Jagielski     }
200*b1cdbd2cSJim Jagielski 
~HyperLabel()201*b1cdbd2cSJim Jagielski     HyperLabel::~HyperLabel( )
202*b1cdbd2cSJim Jagielski 	{
203*b1cdbd2cSJim Jagielski 		delete m_pImpl;
204*b1cdbd2cSJim Jagielski 	}
205*b1cdbd2cSJim Jagielski 
SetInteractive(sal_Bool _bInteractive)206*b1cdbd2cSJim Jagielski     void HyperLabel::SetInteractive( sal_Bool _bInteractive )
207*b1cdbd2cSJim Jagielski     {
208*b1cdbd2cSJim Jagielski         m_pImpl->bInteractive = ( _bInteractive && IsEnabled() );
209*b1cdbd2cSJim Jagielski     }
210*b1cdbd2cSJim Jagielski 
GetID() const211*b1cdbd2cSJim Jagielski     sal_Int16 HyperLabel::GetID() const
212*b1cdbd2cSJim Jagielski     {
213*b1cdbd2cSJim Jagielski         return m_pImpl->ID;
214*b1cdbd2cSJim Jagielski     }
215*b1cdbd2cSJim Jagielski 
GetIndex() const216*b1cdbd2cSJim Jagielski     sal_Int32 HyperLabel::GetIndex() const
217*b1cdbd2cSJim Jagielski     {
218*b1cdbd2cSJim Jagielski         return m_pImpl->Index;
219*b1cdbd2cSJim Jagielski     }
220*b1cdbd2cSJim Jagielski 
SetID(sal_Int16 _ID)221*b1cdbd2cSJim Jagielski     void HyperLabel::SetID( sal_Int16 _ID )
222*b1cdbd2cSJim Jagielski     {
223*b1cdbd2cSJim Jagielski         m_pImpl->ID = _ID;
224*b1cdbd2cSJim Jagielski     }
225*b1cdbd2cSJim Jagielski 
SetIndex(sal_Int32 _Index)226*b1cdbd2cSJim Jagielski     void HyperLabel::SetIndex( sal_Int32 _Index )
227*b1cdbd2cSJim Jagielski     {
228*b1cdbd2cSJim Jagielski         m_pImpl->Index = _Index;
229*b1cdbd2cSJim Jagielski     }
230*b1cdbd2cSJim Jagielski 
GetLabel()231*b1cdbd2cSJim Jagielski     ::rtl::OUString HyperLabel::GetLabel( )
232*b1cdbd2cSJim Jagielski     {
233*b1cdbd2cSJim Jagielski         return GetText();
234*b1cdbd2cSJim Jagielski     }
235*b1cdbd2cSJim Jagielski 
SetLabel(const::rtl::OUString & _rText)236*b1cdbd2cSJim Jagielski     void HyperLabel::SetLabel( const ::rtl::OUString& _rText )
237*b1cdbd2cSJim Jagielski     {
238*b1cdbd2cSJim Jagielski         SetText(_rText);
239*b1cdbd2cSJim Jagielski     }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski 	//------------------------------------------------------------------------------
DataChanged(const DataChangedEvent & rDCEvt)243*b1cdbd2cSJim Jagielski 	void HyperLabel::DataChanged( const DataChangedEvent& rDCEvt )
244*b1cdbd2cSJim Jagielski 	{
245*b1cdbd2cSJim Jagielski 		const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
246*b1cdbd2cSJim Jagielski 		FixedText::DataChanged( rDCEvt );
247*b1cdbd2cSJim Jagielski 		if ((( rDCEvt.GetType() == DATACHANGED_SETTINGS	)	||
248*b1cdbd2cSJim Jagielski 			( rDCEvt.GetType() == DATACHANGED_DISPLAY	))	&&
249*b1cdbd2cSJim Jagielski 			( rDCEvt.GetFlags() & SETTINGS_STYLE		))
250*b1cdbd2cSJim Jagielski 		{
251*b1cdbd2cSJim Jagielski 			const Color& rGBColor = GetControlBackground();
252*b1cdbd2cSJim Jagielski 			if (rGBColor == COL_TRANSPARENT)
253*b1cdbd2cSJim Jagielski 				SetTextColor( rStyleSettings.GetFieldTextColor( ) );
254*b1cdbd2cSJim Jagielski 			else
255*b1cdbd2cSJim Jagielski 			{
256*b1cdbd2cSJim Jagielski 				SetControlBackground(rStyleSettings.GetHighlightColor());
257*b1cdbd2cSJim Jagielski 				SetTextColor( rStyleSettings.GetHighlightTextColor( ) );
258*b1cdbd2cSJim Jagielski 			}
259*b1cdbd2cSJim Jagielski 			Invalidate();
260*b1cdbd2cSJim Jagielski 		}
261*b1cdbd2cSJim Jagielski 	}
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski //.........................................................................
264*b1cdbd2cSJim Jagielski }	// namespace svt
265*b1cdbd2cSJim Jagielski //.........................................................................
266*b1cdbd2cSJim Jagielski 
267