xref: /trunk/main/svtools/source/misc/helpagentwindow.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svtools.hxx"
30*cdf0e10cSrcweir #include <svtools/helpagentwindow.hxx>
31*cdf0e10cSrcweir #include <osl/diagnose.h>
32*cdf0e10cSrcweir #include <vcl/button.hxx>
33*cdf0e10cSrcweir #include <vcl/bitmap.hxx>
34*cdf0e10cSrcweir #include <svtools/svtdata.hxx>
35*cdf0e10cSrcweir #include <svtools/svtools.hrc>
36*cdf0e10cSrcweir #include <svtools/helpid.hrc>
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir #define WB_AGENT_STYLE  0
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir //........................................................................
41*cdf0e10cSrcweir namespace svt
42*cdf0e10cSrcweir {
43*cdf0e10cSrcweir //........................................................................
44*cdf0e10cSrcweir 
45*cdf0e10cSrcweir     using namespace ::com::sun::star::uno;
46*cdf0e10cSrcweir     using namespace ::com::sun::star::lang;
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir     //====================================================================
49*cdf0e10cSrcweir     //= CloserButton_Impl
50*cdf0e10cSrcweir     //= overload of ImageButton, because sometimes vcl doesn't call the click handler
51*cdf0e10cSrcweir     //====================================================================
52*cdf0e10cSrcweir     //--------------------------------------------------------------------
53*cdf0e10cSrcweir     class CloserButton_Impl : public ImageButton
54*cdf0e10cSrcweir     {
55*cdf0e10cSrcweir     public:
56*cdf0e10cSrcweir         CloserButton_Impl( Window* pParent, WinBits nBits ) : ImageButton( pParent, nBits ) {}
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir         virtual void        MouseButtonUp( const MouseEvent& rMEvt );
59*cdf0e10cSrcweir     };
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir     //--------------------------------------------------------------------
62*cdf0e10cSrcweir     void CloserButton_Impl::MouseButtonUp( const MouseEvent& rMEvt )
63*cdf0e10cSrcweir     {
64*cdf0e10cSrcweir         ImageButton::MouseButtonUp( rMEvt );
65*cdf0e10cSrcweir         GetClickHdl().Call( this );
66*cdf0e10cSrcweir     }
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir     //====================================================================
69*cdf0e10cSrcweir     //= HelpAgentWindow
70*cdf0e10cSrcweir     //====================================================================
71*cdf0e10cSrcweir     //--------------------------------------------------------------------
72*cdf0e10cSrcweir     HelpAgentWindow::HelpAgentWindow( Window* _pParent )
73*cdf0e10cSrcweir         :FloatingWindow( _pParent, WB_AGENT_STYLE)
74*cdf0e10cSrcweir         ,m_pCloser(NULL)
75*cdf0e10cSrcweir         ,m_pCallback(NULL)
76*cdf0e10cSrcweir     {
77*cdf0e10cSrcweir         // -----------------
78*cdf0e10cSrcweir         // the closer button
79*cdf0e10cSrcweir         Bitmap aCloserBitmap(SvtResId(BMP_HELP_AGENT_CLOSER));
80*cdf0e10cSrcweir         Image aCloserImage( aCloserBitmap, Color(COL_LIGHTMAGENTA) );
81*cdf0e10cSrcweir         m_pCloser = new CloserButton_Impl( this, WB_NOTABSTOP | WB_NOPOINTERFOCUS );
82*cdf0e10cSrcweir         static_cast<CloserButton_Impl*>(m_pCloser)->SetModeImage( aCloserImage );
83*cdf0e10cSrcweir         static_cast<CloserButton_Impl*>(m_pCloser)->SetClickHdl( LINK(this, HelpAgentWindow, OnButtonClicked) );
84*cdf0e10cSrcweir         m_pCloser->SetSizePixel( implOptimalButtonSize(aCloserImage) );
85*cdf0e10cSrcweir         m_pCloser->Show();
86*cdf0e10cSrcweir         m_pCloser->SetZOrder( NULL, WINDOW_ZORDER_LAST );
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir         // ----------------------------
89*cdf0e10cSrcweir         // calculate our preferred size
90*cdf0e10cSrcweir         Bitmap aHelpAgentBitmap(SvtResId(BMP_HELP_AGENT_IMAGE));
91*cdf0e10cSrcweir         m_aPicture = Image( aHelpAgentBitmap );
92*cdf0e10cSrcweir         m_aPreferredSize = m_aPicture.GetSizePixel();
93*cdf0e10cSrcweir         m_aPreferredSize.Width() += 2;
94*cdf0e10cSrcweir         m_aPreferredSize.Height() += 2;
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir         Size aSize = GetSizePixel();
97*cdf0e10cSrcweir         Size aOutputSize = GetOutputSizePixel();
98*cdf0e10cSrcweir         m_aPreferredSize.Width() += aSize.Width() - aOutputSize.Width();
99*cdf0e10cSrcweir         m_aPreferredSize.Height() += aSize.Height() - aOutputSize.Height();
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir         SetPointer(Pointer(POINTER_REFHAND));
102*cdf0e10cSrcweir         AlwaysEnableInput( sal_True, sal_True );
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir         // unique id for the testtool
105*cdf0e10cSrcweir         SetUniqueId( HID_HELPAGENT_WINDOW );
106*cdf0e10cSrcweir     }
107*cdf0e10cSrcweir 
108*cdf0e10cSrcweir     //--------------------------------------------------------------------
109*cdf0e10cSrcweir     HelpAgentWindow::~HelpAgentWindow()
110*cdf0e10cSrcweir     {
111*cdf0e10cSrcweir         if (m_pCloser && m_pCloser->IsTracking())
112*cdf0e10cSrcweir             m_pCloser->EndTracking();
113*cdf0e10cSrcweir         if (m_pCloser && m_pCloser->IsMouseCaptured())
114*cdf0e10cSrcweir             m_pCloser->ReleaseMouse();
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir         delete m_pCloser;
117*cdf0e10cSrcweir     }
118*cdf0e10cSrcweir 
119*cdf0e10cSrcweir     //--------------------------------------------------------------------
120*cdf0e10cSrcweir     void HelpAgentWindow::Paint( const Rectangle& rRect )
121*cdf0e10cSrcweir     {
122*cdf0e10cSrcweir         FloatingWindow::Paint(rRect);
123*cdf0e10cSrcweir 
124*cdf0e10cSrcweir         Size        aOutputSize( GetOutputSizePixel() );
125*cdf0e10cSrcweir         Point       aPoint=Point();
126*cdf0e10cSrcweir         Rectangle   aOutputRect( aPoint, aOutputSize );
127*cdf0e10cSrcweir         Rectangle   aInnerRect( aOutputRect );
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir         // paint the background
130*cdf0e10cSrcweir         SetLineColor( GetSettings().GetStyleSettings().GetFaceColor() );
131*cdf0e10cSrcweir         SetFillColor( GetSettings().GetStyleSettings().GetFaceColor() );
132*cdf0e10cSrcweir         DrawRect( aOutputRect );
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir         // paint the image
135*cdf0e10cSrcweir         Size aPictureSize( m_aPicture.GetSizePixel() );
136*cdf0e10cSrcweir         Point aPicturePos(
137*cdf0e10cSrcweir             aOutputRect.Left() + (aInnerRect.GetWidth() - aPictureSize.Width()) / 2,
138*cdf0e10cSrcweir             aOutputRect.Top() + (aInnerRect.GetHeight() - aPictureSize.Height()) / 2 );
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir         DrawImage( aPicturePos, m_aPicture, 0 );
141*cdf0e10cSrcweir     }
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir     //--------------------------------------------------------------------
144*cdf0e10cSrcweir     void HelpAgentWindow::MouseButtonUp( const MouseEvent& rMEvt )
145*cdf0e10cSrcweir     {
146*cdf0e10cSrcweir         FloatingWindow::MouseButtonUp(rMEvt);
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir         if (m_pCallback)
149*cdf0e10cSrcweir             m_pCallback->helpRequested();
150*cdf0e10cSrcweir     }
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir     //--------------------------------------------------------------------
153*cdf0e10cSrcweir     Size HelpAgentWindow::implOptimalButtonSize( const Image& _rButtonImage )
154*cdf0e10cSrcweir     {
155*cdf0e10cSrcweir         Size aPreferredSize = _rButtonImage.GetSizePixel();
156*cdf0e10cSrcweir         // add a small frame, needed by the button
157*cdf0e10cSrcweir         aPreferredSize.Width() += 5;
158*cdf0e10cSrcweir         aPreferredSize.Height() += 5;
159*cdf0e10cSrcweir         return aPreferredSize;
160*cdf0e10cSrcweir     }
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir     //--------------------------------------------------------------------
163*cdf0e10cSrcweir     void HelpAgentWindow::Resize()
164*cdf0e10cSrcweir     {
165*cdf0e10cSrcweir         FloatingWindow::Resize();
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir         Size aOutputSize = GetOutputSizePixel();
168*cdf0e10cSrcweir         Size aCloserSize = m_pCloser->GetSizePixel();
169*cdf0e10cSrcweir         if (m_pCloser)
170*cdf0e10cSrcweir             m_pCloser->SetPosPixel( Point(aOutputSize.Width() - aCloserSize.Width() - 3, 4) );
171*cdf0e10cSrcweir     }
172*cdf0e10cSrcweir 
173*cdf0e10cSrcweir     //--------------------------------------------------------------------
174*cdf0e10cSrcweir     IMPL_LINK( HelpAgentWindow, OnButtonClicked, Window*, _pWhichOne )
175*cdf0e10cSrcweir     {
176*cdf0e10cSrcweir         if (m_pCloser == _pWhichOne)
177*cdf0e10cSrcweir             if (m_pCallback)
178*cdf0e10cSrcweir                 m_pCallback->closeAgent();
179*cdf0e10cSrcweir         return 0L;
180*cdf0e10cSrcweir     }
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir //........................................................................
183*cdf0e10cSrcweir }   // namespace svt
184*cdf0e10cSrcweir //........................................................................
185*cdf0e10cSrcweir 
186