diff options
Diffstat (limited to 'svtools/source/misc/helpagentwindow.cxx')
-rw-r--r-- | svtools/source/misc/helpagentwindow.cxx | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/svtools/source/misc/helpagentwindow.cxx b/svtools/source/misc/helpagentwindow.cxx new file mode 100644 index 000000000000..51cd7ebfb740 --- /dev/null +++ b/svtools/source/misc/helpagentwindow.cxx @@ -0,0 +1,195 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: helpagentwindow.cxx,v $ + * $Revision: 1.14 $ + * + * 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 "helpagentwindow.hxx" +#include <osl/diagnose.h> +#ifndef _SV_BUTTON_HXX +#include <vcl/button.hxx> +#endif +#include <vcl/bitmap.hxx> +#include <svtools/svtdata.hxx> + +#ifndef _SVTOOLS_HRC +#include <svl/svtools.hrc> +#endif +#ifndef _SVT_HELPID_HRC +#include <svtools/helpid.hrc> +#endif + +#define WB_AGENT_STYLE 0 + +//........................................................................ +namespace svt +{ +//........................................................................ + + using namespace ::com::sun::star::uno; + using namespace ::com::sun::star::lang; + + //==================================================================== + //= CloserButton_Impl + //= overload of ImageButton, because sometimes vcl doesn't call the click handler + //==================================================================== + //-------------------------------------------------------------------- + class CloserButton_Impl : public ImageButton + { + public: + CloserButton_Impl( Window* pParent, WinBits nBits ) : ImageButton( pParent, nBits ) {} + + virtual void MouseButtonUp( const MouseEvent& rMEvt ); + }; + + //-------------------------------------------------------------------- + void CloserButton_Impl::MouseButtonUp( const MouseEvent& rMEvt ) + { + ImageButton::MouseButtonUp( rMEvt ); + GetClickHdl().Call( this ); + } + + //==================================================================== + //= HelpAgentWindow + //==================================================================== + //-------------------------------------------------------------------- + HelpAgentWindow::HelpAgentWindow( Window* _pParent ) + :FloatingWindow( _pParent, WB_AGENT_STYLE) + ,m_pCloser(NULL) + ,m_pCallback(NULL) + { + // ----------------- + // the closer button + Bitmap aCloserBitmap(SvtResId(BMP_HELP_AGENT_CLOSER)); + Image aCloserImage( aCloserBitmap, Color(COL_LIGHTMAGENTA) ); + m_pCloser = new CloserButton_Impl( this, WB_NOTABSTOP | WB_NOPOINTERFOCUS ); + static_cast<CloserButton_Impl*>(m_pCloser)->SetModeImage( aCloserImage ); + static_cast<CloserButton_Impl*>(m_pCloser)->SetClickHdl( LINK(this, HelpAgentWindow, OnButtonClicked) ); + m_pCloser->SetSizePixel( implOptimalButtonSize(aCloserImage) ); + m_pCloser->Show(); + m_pCloser->SetZOrder( NULL, WINDOW_ZORDER_LAST ); + + // ---------------------------- + // calculate our preferred size + Bitmap aHelpAgentBitmap(SvtResId(BMP_HELP_AGENT_IMAGE)); + m_aPicture = Image( aHelpAgentBitmap ); + m_aPreferredSize = m_aPicture.GetSizePixel(); + m_aPreferredSize.Width() += 2; + m_aPreferredSize.Height() += 2; + + Size aSize = GetSizePixel(); + Size aOutputSize = GetOutputSizePixel(); + m_aPreferredSize.Width() += aSize.Width() - aOutputSize.Width(); + m_aPreferredSize.Height() += aSize.Height() - aOutputSize.Height(); + + SetPointer(Pointer(POINTER_REFHAND)); + AlwaysEnableInput( TRUE, TRUE ); + + // unique id for the testtool + SetUniqueId( HID_HELPAGENT_WINDOW ); + } + + //-------------------------------------------------------------------- + HelpAgentWindow::~HelpAgentWindow() + { + if (m_pCloser && m_pCloser->IsTracking()) + m_pCloser->EndTracking(); + if (m_pCloser && m_pCloser->IsMouseCaptured()) + m_pCloser->ReleaseMouse(); + + delete m_pCloser; + } + + //-------------------------------------------------------------------- + void HelpAgentWindow::Paint( const Rectangle& rRect ) + { + FloatingWindow::Paint(rRect); + + Size aOutputSize( GetOutputSizePixel() ); + Point aPoint=Point(); + Rectangle aOutputRect( aPoint, aOutputSize ); + Rectangle aInnerRect( aOutputRect ); + + // paint the background + SetLineColor( GetSettings().GetStyleSettings().GetFaceColor() ); + SetFillColor( GetSettings().GetStyleSettings().GetFaceColor() ); + DrawRect( aOutputRect ); + + // paint the image + Size aPictureSize( m_aPicture.GetSizePixel() ); + Point aPicturePos( + aOutputRect.Left() + (aInnerRect.GetWidth() - aPictureSize.Width()) / 2, + aOutputRect.Top() + (aInnerRect.GetHeight() - aPictureSize.Height()) / 2 ); + + DrawImage( aPicturePos, m_aPicture, 0 ); + } + + //-------------------------------------------------------------------- + void HelpAgentWindow::MouseButtonUp( const MouseEvent& rMEvt ) + { + FloatingWindow::MouseButtonUp(rMEvt); + + if (m_pCallback) + m_pCallback->helpRequested(); + } + + //-------------------------------------------------------------------- + Size HelpAgentWindow::implOptimalButtonSize( const Image& _rButtonImage ) + { + Size aPreferredSize = _rButtonImage.GetSizePixel(); + // add a small frame, needed by the button + aPreferredSize.Width() += 5; + aPreferredSize.Height() += 5; + return aPreferredSize; + } + + //-------------------------------------------------------------------- + void HelpAgentWindow::Resize() + { + FloatingWindow::Resize(); + + Size aOutputSize = GetOutputSizePixel(); + Size aCloserSize = m_pCloser->GetSizePixel(); + if (m_pCloser) + m_pCloser->SetPosPixel( Point(aOutputSize.Width() - aCloserSize.Width() - 3, 4) ); + } + + //-------------------------------------------------------------------- + IMPL_LINK( HelpAgentWindow, OnButtonClicked, Window*, _pWhichOne ) + { + if (m_pCloser == _pWhichOne) + if (m_pCallback) + m_pCallback->closeAgent(); + return 0L; + } + +//........................................................................ +} // namespace svt +//........................................................................ + |