summaryrefslogtreecommitdiff
path: root/svtools/source/control/hyperlabel.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svtools/source/control/hyperlabel.cxx')
-rw-r--r--svtools/source/control/hyperlabel.cxx268
1 files changed, 268 insertions, 0 deletions
diff --git a/svtools/source/control/hyperlabel.cxx b/svtools/source/control/hyperlabel.cxx
new file mode 100644
index 000000000000..ab42a891a1ed
--- /dev/null
+++ b/svtools/source/control/hyperlabel.cxx
@@ -0,0 +1,268 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * 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 <svtools/hyperlabel.hxx>
+#include <vcl/bitmap.hxx>
+#include <tools/color.hxx>
+
+#include <vcl/tabpage.hxx>
+
+
+//.........................................................................
+namespace svt
+{
+//.........................................................................
+
+ //=====================================================================
+ //= FontChanger
+ //=====================================================================
+ class FontChanger
+ {
+ protected:
+ OutputDevice* m_pDev;
+
+ public:
+ FontChanger( OutputDevice* _pDev, const Font& _rNewFont )
+ :m_pDev( _pDev )
+ {
+ m_pDev->Push( PUSH_FONT );
+ m_pDev->SetFont( _rNewFont );
+ }
+
+ ~FontChanger()
+ {
+ m_pDev->Pop( );
+ }
+ };
+
+ class HyperLabelImpl
+ {
+ public:
+ sal_Int16 ID;
+ sal_Int32 Index;
+ sal_Bool bInteractive;
+ Size m_aMinSize;
+ sal_Bool m_bHyperMode;
+
+ HyperLabelImpl();
+ };
+
+ //---------------------------------------------------------------------
+ HyperLabelImpl::HyperLabelImpl()
+ {
+ }
+
+ HyperLabel::HyperLabel( Window* _pParent, const ResId& _rId )
+ :FixedText( _pParent, _rId )
+ ,m_pImpl( new HyperLabelImpl )
+ {
+ implInit();
+ }
+
+ HyperLabel::HyperLabel( Window* _pParent, WinBits _nWinStyle )
+ :FixedText( _pParent, _nWinStyle )
+ ,m_pImpl( new HyperLabelImpl )
+ {
+ implInit();
+ }
+
+
+ sal_Int32 HyperLabel::GetLogicWidth()
+ {
+ Size rLogicLocSize = PixelToLogic( m_pImpl->m_aMinSize, MAP_APPFONT );
+ return rLogicLocSize.Width();
+ }
+
+
+ Size HyperLabel::CalcMinimumSize( long nMaxWidth ) const
+ {
+ m_pImpl->m_aMinSize = FixedText::CalcMinimumSize( nMaxWidth );
+ // the MinimumSize is used to size the FocusRectangle
+ // and for the MouseMove method
+ m_pImpl->m_aMinSize.Height() += 2;
+ m_pImpl->m_aMinSize.Width() += 1;
+ return m_pImpl->m_aMinSize;
+ }
+
+ void HyperLabel::implInit()
+ {
+ ToggleBackgroundColor( COL_TRANSPARENT );
+
+ WinBits nWinStyle = GetStyle();
+ nWinStyle |= WB_EXTRAOFFSET;
+ SetStyle( nWinStyle );
+
+ Show();
+ }
+
+ void HyperLabel::ToggleBackgroundColor( const Color& _rGBColor )
+ {
+ const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
+ SetControlBackground( _rGBColor );
+ if (_rGBColor == COL_TRANSPARENT)
+ SetTextColor( rStyleSettings.GetFieldTextColor( ) );
+ else
+ SetTextColor( rStyleSettings.GetHighlightTextColor( ) );
+ }
+
+
+ void HyperLabel::MouseMove( const MouseEvent& rMEvt )
+ {
+ Font aFont = GetControlFont( );
+ const Color aColor = GetTextColor();
+
+ if (rMEvt.IsLeaveWindow())
+ {
+ DeactivateHyperMode(aFont, aColor);
+ }
+ else
+ {
+ Point aPoint = GetPointerPosPixel();
+ if (aPoint.X() < m_pImpl->m_aMinSize.Width())
+ {
+ if ( IsEnabled() && (m_pImpl->bInteractive) )
+ {
+ ActivateHyperMode( aFont, aColor);
+ return;
+ }
+ }
+ DeactivateHyperMode(aFont, aColor);
+ }
+ }
+
+ void HyperLabel::ActivateHyperMode(Font aFont, const Color aColor)
+ {
+ aFont.SetUnderline(UNDERLINE_SINGLE);
+ m_pImpl->m_bHyperMode = sal_True;
+ SetPointer( POINTER_REFHAND );
+ SetControlFont( aFont);
+ SetTextColor( aColor);
+
+ }
+
+ void HyperLabel::DeactivateHyperMode(Font aFont, const Color aColor)
+ {
+ m_pImpl->m_bHyperMode = sal_False;
+ aFont.SetUnderline(UNDERLINE_NONE);
+ SetPointer( POINTER_ARROW );
+ SetControlFont( aFont);
+ SetTextColor( aColor);
+ }
+
+ void HyperLabel::MouseButtonDown( const MouseEvent& )
+ {
+ if ( m_pImpl->m_bHyperMode && m_pImpl->bInteractive )
+ {
+ maClickHdl.Call( this );
+ }
+ }
+
+ void HyperLabel::GetFocus()
+ {
+ if ( IsEnabled() && m_pImpl->bInteractive )
+ {
+ Point aPoint(0,0);
+ Rectangle rRect(aPoint, Size( m_pImpl->m_aMinSize.Width(), GetSizePixel().Height() ) );
+ ShowFocus( rRect );
+ }
+ }
+
+ void HyperLabel::LoseFocus()
+ {
+ HideFocus();
+ }
+
+ HyperLabel::~HyperLabel( )
+ {
+ delete m_pImpl;
+ }
+
+ void HyperLabel::SetInteractive( sal_Bool _bInteractive )
+ {
+ m_pImpl->bInteractive = ( _bInteractive && IsEnabled() );
+ }
+
+ sal_Int16 HyperLabel::GetID() const
+ {
+ return m_pImpl->ID;
+ }
+
+ sal_Int32 HyperLabel::GetIndex() const
+ {
+ return m_pImpl->Index;
+ }
+
+ void HyperLabel::SetID( sal_Int16 _ID )
+ {
+ m_pImpl->ID = _ID;
+ }
+
+ void HyperLabel::SetIndex( sal_Int32 _Index )
+ {
+ m_pImpl->Index = _Index;
+ }
+
+ ::rtl::OUString HyperLabel::GetLabel( )
+ {
+ return GetText();
+ }
+
+ void HyperLabel::SetLabel( const ::rtl::OUString& _rText )
+ {
+ SetText(_rText);
+ }
+
+
+ //------------------------------------------------------------------------------
+ void HyperLabel::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
+//.........................................................................
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */