2000-09-18 16:07:07 +00:00
/*************************************************************************
*
* $ RCSfile : help . cxx , v $
*
2003-06-12 06:50:48 +00:00
* $ Revision : 1.23 $
2000-09-18 16:07:07 +00:00
*
2003-06-12 06:50:48 +00:00
* last change : $ Author : rt $ $ Date : 2003 - 06 - 12 07 : 50 : 48 $
2000-09-18 16:07:07 +00:00
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc . , October , 2000
*
* GNU Lesser General Public License Version 2.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Copyright 2000 by Sun Microsystems , Inc .
* 901 San Antonio Road , Palo Alto , CA 94303 , USA
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 , as published by the Free Software Foundation .
*
* This library 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 for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston ,
* MA 02111 - 1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 ( the " License " ) ; You may not use this file
* except in compliance with the License . You may obtain a copy of the
* License at http : //www.openoffice.org/license.html.
*
* Software provided under this License is provided on an " AS IS " basis ,
* WITHOUT WARRANTY OF ANY KIND , EITHER EXPRESSED OR IMPLIED , INCLUDING ,
* WITHOUT LIMITATION , WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS ,
* MERCHANTABLE , FIT FOR A PARTICULAR PURPOSE , OR NON - INFRINGING .
* See the License for the specific provisions governing your rights and
* obligations concerning the Software .
*
* The Initial Developer of the Original Code is : Sun Microsystems , Inc .
*
* Copyright : 2000 by Sun Microsystems , Inc .
*
* All Rights Reserved .
*
* Contributor ( s ) : _______________________________________
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# define _SV_HELP_CXX
# ifndef _SV_SVDATA_HXX
# include <svdata.hxx>
# endif
2002-12-10 12:43:00 +00:00
# define private public
2000-09-18 16:07:07 +00:00
# ifndef _SV_WINDOW_HXX
# include <window.hxx>
# endif
2002-12-10 12:43:00 +00:00
# undef private
2000-09-18 16:07:07 +00:00
# ifndef _SV_EVENT_HXX
# include <event.hxx>
# endif
# ifndef _SV_SVAPP_HXX
# include <svapp.hxx>
# endif
# ifndef _SV_WRKWIN_HXX
# include <wrkwin.hxx>
# endif
# ifndef _SV_HELP_HXX
# include <help.hxx>
# endif
# ifndef _SV_HELPWIN_HXX
# include <helpwin.hxx>
# endif
# ifndef _DEBUG_HXX
# include <tools/debug.hxx>
# endif
2001-11-14 10:10:00 +00:00
# include <stdio.h>
2000-09-18 16:07:07 +00:00
# pragma hdrstop
2002-04-24 11:12:05 +00:00
2000-09-18 16:07:07 +00:00
// =======================================================================
# define HELPWINSTYLE_QUICK 0
# define HELPWINSTYLE_BALLOON 1
# define HELPTEXTMARGIN_QUICK 3
# define HELPTEXTMARGIN_BALLOON 6
# define HELPDELAY_NORMAL 1
# define HELPDELAY_SHORT 2
# define HELPDELAY_NONE 3
// =======================================================================
Help : : Help ( )
{
}
// -----------------------------------------------------------------------
2001-04-20 06:37:03 +00:00
BOOL Help : : Start ( ULONG , const Window * )
2000-09-18 16:07:07 +00:00
{
return FALSE ;
}
// -----------------------------------------------------------------------
2001-04-20 06:37:03 +00:00
BOOL Help : : Start ( const XubString & , const Window * )
2000-09-18 16:07:07 +00:00
{
return FALSE ;
}
2001-04-12 08:49:41 +00:00
// -----------------------------------------------------------------------
XubString Help : : GetHelpText ( ULONG , const Window * )
{
return ImplGetSVEmptyStr ( ) ;
}
2000-09-18 16:07:07 +00:00
// -----------------------------------------------------------------------
void Help : : EnableContextHelp ( )
{
ImplGetSVData ( ) - > maHelpData . mbContextHelp = TRUE ;
}
// -----------------------------------------------------------------------
void Help : : DisableContextHelp ( )
{
ImplGetSVData ( ) - > maHelpData . mbContextHelp = FALSE ;
}
// -----------------------------------------------------------------------
BOOL Help : : IsContextHelpEnabled ( )
{
return ImplGetSVData ( ) - > maHelpData . mbContextHelp ;
}
// -----------------------------------------------------------------------
BOOL Help : : StartContextHelp ( )
{
ImplSVData * pSVData = ImplGetSVData ( ) ;
if ( pSVData - > maHelpData . mbContextHelp )
{
Window * pWindow = pSVData - > maWinData . mpFocusWin ;
if ( pWindow )
{
Point aMousePos = pWindow - > OutputToScreenPixel ( pWindow - > GetPointerPosPixel ( ) ) ;
HelpEvent aHelpEvent ( aMousePos , HELPMODE_CONTEXT ) ;
pWindow - > RequestHelp ( aHelpEvent ) ;
return TRUE ;
}
}
return FALSE ;
}
// -----------------------------------------------------------------------
void Help : : EnableExtHelp ( )
{
ImplGetSVData ( ) - > maHelpData . mbExtHelp = TRUE ;
}
// -----------------------------------------------------------------------
void Help : : DisableExtHelp ( )
{
ImplGetSVData ( ) - > maHelpData . mbExtHelp = FALSE ;
}
// -----------------------------------------------------------------------
BOOL Help : : IsExtHelpEnabled ( )
{
return ImplGetSVData ( ) - > maHelpData . mbExtHelp ;
}
// -----------------------------------------------------------------------
BOOL Help : : StartExtHelp ( )
{
ImplSVData * pSVData = ImplGetSVData ( ) ;
if ( pSVData - > maHelpData . mbExtHelp & & ! pSVData - > maHelpData . mbExtHelpMode )
{
pSVData - > maHelpData . mbExtHelpMode = TRUE ;
pSVData - > maHelpData . mbOldBalloonMode = pSVData - > maHelpData . mbBalloonHelp ;
pSVData - > maHelpData . mbBalloonHelp = TRUE ;
if ( pSVData - > maWinData . mpAppWin )
pSVData - > maWinData . mpAppWin - > ImplGenerateMouseMove ( ) ;
return TRUE ;
}
return FALSE ;
}
// -----------------------------------------------------------------------
BOOL Help : : EndExtHelp ( )
{
ImplSVData * pSVData = ImplGetSVData ( ) ;
if ( pSVData - > maHelpData . mbExtHelp & & pSVData - > maHelpData . mbExtHelpMode )
{
pSVData - > maHelpData . mbExtHelpMode = FALSE ;
pSVData - > maHelpData . mbBalloonHelp = pSVData - > maHelpData . mbOldBalloonMode ;
if ( pSVData - > maWinData . mpAppWin )
pSVData - > maWinData . mpAppWin - > ImplGenerateMouseMove ( ) ;
return TRUE ;
}
return FALSE ;
}
// -----------------------------------------------------------------------
BOOL Help : : IsExtHelpActive ( )
{
return ImplGetSVData ( ) - > maHelpData . mbExtHelpMode ;
}
// -----------------------------------------------------------------------
void Help : : EnableBalloonHelp ( )
{
ImplGetSVData ( ) - > maHelpData . mbBalloonHelp = TRUE ;
}
// -----------------------------------------------------------------------
void Help : : DisableBalloonHelp ( )
{
ImplGetSVData ( ) - > maHelpData . mbBalloonHelp = FALSE ;
}
// -----------------------------------------------------------------------
BOOL Help : : IsBalloonHelpEnabled ( )
{
return ImplGetSVData ( ) - > maHelpData . mbBalloonHelp ;
}
// -----------------------------------------------------------------------
BOOL Help : : ShowBalloon ( Window * pParent ,
const Point & rScreenPos ,
const XubString & rHelpText )
{
ImplShowHelpWindow ( pParent , HELPWINSTYLE_BALLOON , 0 ,
rHelpText , ImplGetSVEmptyStr ( ) , rScreenPos ) ;
return TRUE ;
}
// -----------------------------------------------------------------------
BOOL Help : : ShowBalloon ( Window * pParent ,
const Point & rScreenPos , const Rectangle & rRect ,
const XubString & rHelpText )
{
ImplShowHelpWindow ( pParent , HELPWINSTYLE_BALLOON , 0 ,
rHelpText , ImplGetSVEmptyStr ( ) , rScreenPos , & rRect ) ;
return TRUE ;
}
// -----------------------------------------------------------------------
void Help : : EnableQuickHelp ( )
{
ImplGetSVData ( ) - > maHelpData . mbQuickHelp = TRUE ;
}
// -----------------------------------------------------------------------
void Help : : DisableQuickHelp ( )
{
ImplGetSVData ( ) - > maHelpData . mbQuickHelp = FALSE ;
}
// -----------------------------------------------------------------------
BOOL Help : : IsQuickHelpEnabled ( )
{
return ImplGetSVData ( ) - > maHelpData . mbQuickHelp ;
}
// -----------------------------------------------------------------------
BOOL Help : : ShowQuickHelp ( Window * pParent ,
const Rectangle & rScreenRect ,
const XubString & rHelpText ,
const XubString & rLongHelpText ,
USHORT nStyle )
{
ImplShowHelpWindow ( pParent , HELPWINSTYLE_QUICK , nStyle ,
rHelpText , rLongHelpText ,
pParent - > OutputToScreenPixel ( pParent - > GetPointerPosPixel ( ) ) , & rScreenRect ) ;
return TRUE ;
}
// -----------------------------------------------------------------------
ULONG Help : : ShowTip ( Window * pParent , const Rectangle & rRect ,
const XubString & rText , USHORT nStyle )
{
USHORT nHelpWinStyle = HELPWINSTYLE_QUICK ;
HelpTextWindow * pHelpWin = new HelpTextWindow ( pParent , rText , nHelpWinStyle , nStyle ) ;
Size aSz = pHelpWin - > CalcOutSize ( ) ;
pHelpWin - > SetOutputSizePixel ( aSz ) ;
ImplSetHelpWindowPos ( pHelpWin , nHelpWinStyle , nStyle ,
pParent - > OutputToScreenPixel ( pParent - > GetPointerPosPixel ( ) ) , & rRect ) ;
pHelpWin - > ShowHelp ( HELPDELAY_NONE ) ;
return ( ULONG ) pHelpWin ;
}
// -----------------------------------------------------------------------
void Help : : HideTip ( ULONG nId )
{
HelpTextWindow * pHelpWin = ( HelpTextWindow * ) nId ;
Window * pFrameWindow = pHelpWin - > ImplGetFrameWindow ( ) ;
pHelpWin - > Hide ( ) ;
// Update ausloesen, damit ein Paint sofort ausgeloest wird, da
// wir den Hintergrund nicht sichern
pFrameWindow - > ImplUpdateAll ( ) ;
delete pHelpWin ;
}
// =======================================================================
2001-11-14 10:10:00 +00:00
2000-09-18 16:07:07 +00:00
HelpTextWindow : : HelpTextWindow ( Window * pParent , const XubString & rText , USHORT nHelpWinStyle , USHORT nStyle ) :
2002-12-03 13:35:27 +00:00
//FloatingWindow( pParent->ImplGetFrameWindow(), WB_SYSTEMWINDOW ),
2003-04-11 16:27:26 +00:00
FloatingWindow ( pParent , WB_SYSTEMWINDOW | WB_TOOLTIPWIN ) , // #105827# if we change the parent, mirroring will not work correctly when positioning this window
2000-09-18 16:07:07 +00:00
maHelpText ( rText )
{
2002-12-10 12:43:00 +00:00
SetType ( WINDOW_HELPTEXTWINDOW ) ;
2000-09-18 16:07:07 +00:00
ImplSetMouseTransparent ( TRUE ) ;
mnHelpWinStyle = nHelpWinStyle ;
mnStyle = nStyle ;
2001-10-31 12:36:39 +00:00
// on windows this will raise the application window, because help windows are system windows now
// EnableAlwaysOnTop();
2000-09-18 16:07:07 +00:00
EnableSaveBackground ( ) ;
const StyleSettings & rStyleSettings = GetSettings ( ) . GetStyleSettings ( ) ;
SetPointFont ( rStyleSettings . GetHelpFont ( ) ) ;
SetTextColor ( rStyleSettings . GetHelpTextColor ( ) ) ;
SetTextAlign ( ALIGN_TOP ) ;
SetBackground ( Wallpaper ( rStyleSettings . GetHelpColor ( ) ) ) ;
2002-03-22 13:16:55 +00:00
if ( rStyleSettings . GetHelpColor ( ) . IsDark ( ) )
SetLineColor ( COL_WHITE ) ;
else
SetLineColor ( COL_BLACK ) ;
2000-09-18 16:07:07 +00:00
SetFillColor ( ) ;
2001-11-14 10:10:00 +00:00
SetHelpText ( rText ) ;
2002-12-10 12:43:00 +00:00
Window : : SetHelpText ( rText ) ;
2001-11-14 10:10:00 +00:00
2001-11-29 12:13:10 +00:00
const HelpSettings & rHelpSettings = pParent - > GetSettings ( ) . GetHelpSettings ( ) ;
2001-11-14 10:10:00 +00:00
maShowTimer . SetTimeoutHdl ( LINK ( this , HelpTextWindow , TimerHdl ) ) ;
maHideTimer . SetTimeoutHdl ( LINK ( this , HelpTextWindow , TimerHdl ) ) ;
maHideTimer . SetTimeout ( rHelpSettings . GetTipTimeout ( ) ) ;
}
// -----------------------------------------------------------------------
HelpTextWindow : : ~ HelpTextWindow ( )
{
maShowTimer . Stop ( ) ;
maHideTimer . Stop ( ) ;
2002-09-12 08:57:50 +00:00
if ( this = = ImplGetSVData ( ) - > maHelpData . mpHelpWin )
ImplGetSVData ( ) - > maHelpData . mpHelpWin = NULL ;
2001-11-14 10:10:00 +00:00
if ( maStatusText . Len ( ) )
{
ImplSVData * pSVData = ImplGetSVData ( ) ;
pSVData - > mpApp - > HideHelpStatusText ( ) ;
}
}
// -----------------------------------------------------------------------
void HelpTextWindow : : SetHelpText ( const String & rHelpText )
{
maHelpText = rHelpText ;
2000-09-18 16:07:07 +00:00
if ( mnHelpWinStyle = = HELPWINSTYLE_QUICK )
{
Size aSize ;
aSize . Height ( ) = GetTextHeight ( ) ;
if ( mnStyle & QUICKHELP_CTRLTEXT )
aSize . Width ( ) = GetCtrlTextWidth ( maHelpText ) ;
else
aSize . Width ( ) = GetTextWidth ( maHelpText ) ;
maTextRect = Rectangle ( Point ( HELPTEXTMARGIN_QUICK , HELPTEXTMARGIN_QUICK ) , aSize ) ;
}
else // HELPWINSTYLE_BALLOON
{
Point aTmpPoint ;
USHORT nCharsInLine = 35 + ( ( maHelpText . Len ( ) / 100 ) * 5 ) ;
XubString aXXX ;
aXXX . Fill ( nCharsInLine , ' x ' ) ; // Durchschnittliche Breite, damit nicht jedes Fenster anders.
long nWidth = GetTextWidth ( aXXX ) ;
Size aTmpSize ( nWidth , 0x7FFFFFFF ) ;
Rectangle aTry1 ( aTmpPoint , aTmpSize ) ;
USHORT nDrawFlags = TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK |
TEXT_DRAW_LEFT | TEXT_DRAW_TOP ;
if ( mnStyle & QUICKHELP_CTRLTEXT )
nDrawFlags | = TEXT_DRAW_MNEMONIC ;
Rectangle aTextRect = GetTextRect ( aTry1 , maHelpText , nDrawFlags ) ;
// Spaeter mal eine geeignete Breite ermitteln...
maTextRect = aTextRect ;
// Sicherheitsabstand...
maTextRect . SetPos ( Point ( HELPTEXTMARGIN_BALLOON , HELPTEXTMARGIN_BALLOON ) ) ;
}
2001-11-14 10:10:00 +00:00
Size aSize ( CalcOutSize ( ) ) ;
SetOutputSizePixel ( aSize ) ;
2000-09-18 16:07:07 +00:00
}
// -----------------------------------------------------------------------
void HelpTextWindow : : ImplShow ( )
{
if ( maStatusText . Len ( ) )
{
ImplSVData * pSVData = ImplGetSVData ( ) ;
pSVData - > mpApp - > ShowHelpStatusText ( maStatusText ) ;
}
2001-10-29 13:39:17 +00:00
Show ( TRUE , SHOW_NOACTIVATE ) ;
2000-09-18 16:07:07 +00:00
Update ( ) ;
}
// -----------------------------------------------------------------------
void HelpTextWindow : : Paint ( const Rectangle & )
{
// Border zeichen
// .....
if ( mnHelpWinStyle = = HELPWINSTYLE_QUICK )
{
if ( mnStyle & QUICKHELP_CTRLTEXT )
DrawCtrlText ( maTextRect . TopLeft ( ) , maHelpText ) ;
else
DrawText ( maTextRect . TopLeft ( ) , maHelpText ) ;
}
else // HELPWINSTYLE_BALLOON
{
USHORT nDrawFlags = TEXT_DRAW_MULTILINE | TEXT_DRAW_WORDBREAK |
TEXT_DRAW_LEFT | TEXT_DRAW_TOP ;
if ( mnStyle & QUICKHELP_CTRLTEXT )
nDrawFlags | = TEXT_DRAW_MNEMONIC ;
DrawText ( maTextRect , maHelpText , nDrawFlags ) ;
}
// Umrandung
Size aSz = GetOutputSizePixel ( ) ;
DrawRect ( Rectangle ( Point ( ) , aSz ) ) ;
if ( mnHelpWinStyle = = HELPWINSTYLE_BALLOON )
{
aSz . Width ( ) - = 2 ;
aSz . Height ( ) - = 2 ;
Color aColor ( GetLineColor ( ) ) ;
SetLineColor ( ( COL_GRAY ) ) ;
DrawRect ( Rectangle ( Point ( 1 , 1 ) , aSz ) ) ;
SetLineColor ( aColor ) ;
}
}
// -----------------------------------------------------------------------
void HelpTextWindow : : ShowHelp ( USHORT nDelayMode )
{
ULONG nTimeout = 0 ;
if ( nDelayMode ! = HELPDELAY_NONE )
{
// Im ExtendedHelp-Fall die Hilfe schneller anzeigen
if ( ImplGetSVData ( ) - > maHelpData . mbExtHelpMode )
nTimeout = 15 ;
else
{
const HelpSettings & rHelpSettings = GetSettings ( ) . GetHelpSettings ( ) ;
if ( mnHelpWinStyle = = HELPWINSTYLE_QUICK )
nTimeout = rHelpSettings . GetTipDelay ( ) ;
else
nTimeout = rHelpSettings . GetBalloonDelay ( ) ;
}
if ( nDelayMode = = HELPDELAY_SHORT )
nTimeout / = 3 ;
}
maShowTimer . SetTimeout ( nTimeout ) ;
maShowTimer . Start ( ) ;
}
// -----------------------------------------------------------------------
IMPL_LINK ( HelpTextWindow , TimerHdl , Timer * , pTimer )
{
if ( pTimer = = & maShowTimer )
{
ImplShow ( ) ;
if ( mnHelpWinStyle = = HELPWINSTYLE_QUICK )
{
// Auto-Hide nicht bei einem Tip-Fenster (ShowTip)
ImplSVData * pSVData = ImplGetSVData ( ) ;
2001-11-29 12:13:10 +00:00
if ( this = = pSVData - > maHelpData . mpHelpWin )
2000-09-18 16:07:07 +00:00
maHideTimer . Start ( ) ;
}
}
else
{
2001-11-14 10:10:00 +00:00
ImplDestroyHelpWindow ( ) ;
2000-09-18 16:07:07 +00:00
}
return 1 ;
}
// -----------------------------------------------------------------------
Size HelpTextWindow : : CalcOutSize ( ) const
{
Size aSz = maTextRect . GetSize ( ) ;
aSz . Width ( ) + = 2 * maTextRect . Left ( ) ;
aSz . Height ( ) + = 2 * maTextRect . Top ( ) ;
return aSz ;
}
// -----------------------------------------------------------------------
void HelpTextWindow : : RequestHelp ( const HelpEvent & rHEvt )
{
// Nur damit nicht von Window::RequestHelp() ein
// ShowQuickHelp/ShowBalloonHelp am HelpTextWindow aufgerufen wird.
}
2002-06-25 13:22:58 +00:00
// -----------------------------------------------------------------------
2002-12-10 12:43:00 +00:00
String HelpTextWindow : : GetText ( ) const
{
return maHelpText ;
}
// -----------------------------------------------------------------------
2003-04-24 15:30:52 +00:00
: : com : : sun : : star : : uno : : Reference < : : com : : sun : : star : : accessibility : : XAccessible > HelpTextWindow : : CreateAccessible ( )
2002-06-25 13:22:58 +00:00
{
2002-12-10 12:43:00 +00:00
return FloatingWindow : : CreateAccessible ( ) ;
}
// -----------------------------------------------------------------------
BOOL HelpTextWindow : : RegisterAccessibleParent ( )
{
return FALSE ;
}
// -----------------------------------------------------------------------
void HelpTextWindow : : RevokeAccessibleParent ( )
{
2002-06-25 13:22:58 +00:00
}
2000-09-18 16:07:07 +00:00
// =======================================================================
void ImplShowHelpWindow ( Window * pParent , USHORT nHelpWinStyle , USHORT nStyle ,
const XubString & rHelpText , const XubString & rStatusText ,
const Point & rScreenPos , const Rectangle * pHelpArea )
{
ImplSVData * pSVData = ImplGetSVData ( ) ;
2001-11-29 08:37:49 +00:00
2001-11-29 12:13:10 +00:00
if ( ! rHelpText . Len ( ) & & ! pSVData - > maHelpData . mbRequestingHelp )
return ;
2001-11-29 08:37:49 +00:00
2000-09-18 16:07:07 +00:00
HelpTextWindow * pHelpWin = pSVData - > maHelpData . mpHelpWin ;
USHORT nDelayMode = HELPDELAY_NORMAL ;
if ( pHelpWin )
{
DBG_ASSERT ( pHelpWin ! = pParent , " HelpInHelp ?! " ) ;
2001-11-15 12:50:30 +00:00
if ( ( ( pHelpWin - > GetHelpText ( ) ! = rHelpText ) | |
( pHelpWin - > GetWinStyle ( ) ! = nHelpWinStyle ) | |
( pHelpArea & & ( pHelpWin - > GetHelpArea ( ) ! = * pHelpArea ) ) )
& & pSVData - > maHelpData . mbRequestingHelp )
2000-09-18 16:07:07 +00:00
{
2001-11-15 12:50:30 +00:00
// remove help window if no HelpText or other HelpText or
// other help mode. but keep it if we are scrolling, ie not requesting help
2000-09-18 16:07:07 +00:00
if ( pHelpWin - > IsVisible ( ) )
2001-11-15 12:50:30 +00:00
nDelayMode = HELPDELAY_SHORT ; // display it quickly if we were already in quick help mode
2000-09-18 16:07:07 +00:00
pHelpWin = NULL ;
ImplDestroyHelpWindow ( ) ;
}
2001-11-14 10:10:00 +00:00
else
2000-09-18 16:07:07 +00:00
{
2001-11-14 10:10:00 +00:00
bool bTextChanged = rHelpText ! = pHelpWin - > GetHelpText ( ) ;
if ( bTextChanged )
{
2002-12-03 13:35:27 +00:00
Window * pWindow = pHelpWin - > GetParent ( ) - > ImplGetFrameWindow ( ) ;
2001-11-14 10:10:00 +00:00
Rectangle aInvRect ( pHelpWin - > GetWindowExtentsRelative ( pWindow ) ) ;
2001-11-15 12:50:30 +00:00
if ( pHelpWin - > IsVisible ( ) )
pWindow - > Invalidate ( aInvRect ) ;
2001-11-14 10:10:00 +00:00
pHelpWin - > SetHelpText ( rHelpText ) ;
2001-11-15 12:50:30 +00:00
// approach mouse position
2001-11-14 10:10:00 +00:00
ImplSetHelpWindowPos ( pHelpWin , nHelpWinStyle , nStyle , rScreenPos , pHelpArea ) ;
if ( pHelpWin - > IsVisible ( ) )
pHelpWin - > Invalidate ( ) ;
}
2000-09-18 16:07:07 +00:00
}
}
if ( ! pHelpWin & & rHelpText . Len ( ) )
{
DBG_ASSERT ( ! pHelpWin , " Noch ein HelpWin ?! " ) ;
pHelpWin = new HelpTextWindow ( pParent , rHelpText , nHelpWinStyle , nStyle ) ;
pSVData - > maHelpData . mpHelpWin = pHelpWin ;
pHelpWin - > SetStatusText ( rStatusText ) ;
if ( pHelpArea )
pHelpWin - > SetHelpArea ( * pHelpArea ) ;
2001-11-15 12:50:30 +00:00
// positioning
2000-09-18 16:07:07 +00:00
Size aSz = pHelpWin - > CalcOutSize ( ) ;
pHelpWin - > SetOutputSizePixel ( aSz ) ;
ImplSetHelpWindowPos ( pHelpWin , nHelpWinStyle , nStyle , rScreenPos , pHelpArea ) ;
2001-11-15 12:50:30 +00:00
// if not called from Window::RequestHelp, then without delay...
2000-09-18 16:07:07 +00:00
if ( ! pSVData - > maHelpData . mbRequestingHelp )
nDelayMode = HELPDELAY_NONE ;
pHelpWin - > ShowHelp ( nDelayMode ) ;
}
}
// -----------------------------------------------------------------------
void ImplDestroyHelpWindow ( BOOL bUpdate )
{
ImplSVData * pSVData = ImplGetSVData ( ) ;
HelpTextWindow * pHelpWin = pSVData - > maHelpData . mpHelpWin ;
if ( pHelpWin )
{
2002-12-03 13:35:27 +00:00
Window * pWindow = pHelpWin - > GetParent ( ) - > ImplGetFrameWindow ( ) ;
2001-11-15 12:50:30 +00:00
// find out screen area covered by system help window
2001-11-14 10:10:00 +00:00
Rectangle aInvRect ( pHelpWin - > GetWindowExtentsRelative ( pWindow ) ) ;
2001-11-15 12:50:30 +00:00
if ( pHelpWin - > IsVisible ( ) )
pWindow - > Invalidate ( aInvRect ) ;
2000-09-18 16:07:07 +00:00
pSVData - > maHelpData . mpHelpWin = NULL ;
2002-04-24 11:12:05 +00:00
pSVData - > maHelpData . mbKeyboardHelp = FALSE ;
2000-09-18 16:07:07 +00:00
pHelpWin - > Hide ( ) ;
delete pHelpWin ;
}
}
// -----------------------------------------------------------------------
void ImplSetHelpWindowPos ( Window * pHelpWin , USHORT nHelpWinStyle , USHORT nStyle ,
const Point & rPos , const Rectangle * pHelpArea )
{
Point aPos = rPos ;
Size aSz = pHelpWin - > GetSizePixel ( ) ;
2001-10-29 13:39:17 +00:00
Rectangle aScreenRect = pHelpWin - > ImplGetFrameWindow ( ) - > GetDesktopRectPixel ( ) ;
2002-12-03 13:35:27 +00:00
aPos = pHelpWin - > GetParent ( ) - > ImplGetFrameWindow ( ) - > OutputToAbsoluteScreenPixel ( aPos ) ;
2001-10-30 09:11:17 +00:00
// get mouse screen coords
2002-12-03 13:35:27 +00:00
Point mPos ( pHelpWin - > GetParent ( ) - > ImplGetFrameWindow ( ) - > GetPointerPosPixel ( ) ) ;
mPos = pHelpWin - > GetParent ( ) - > ImplGetFrameWindow ( ) - > OutputToAbsoluteScreenPixel ( mPos ) ;
2001-10-24 07:57:18 +00:00
2000-09-18 16:07:07 +00:00
if ( nHelpWinStyle = = HELPWINSTYLE_QUICK )
{
if ( ! ( nStyle & QUICKHELP_NOAUTOPOS ) )
{
long nScreenHeight = aScreenRect . GetHeight ( ) ;
aPos . X ( ) - = 4 ;
if ( aPos . Y ( ) > aScreenRect . Top ( ) + nScreenHeight - ( nScreenHeight / 4 ) )
aPos . Y ( ) - = aSz . Height ( ) + 4 ;
else
aPos . Y ( ) + = 21 ;
}
}
else
{
2001-10-29 16:38:25 +00:00
// If it's the mouse position, move the window slightly
// so the mouse pointer does not cover it
if ( aPos = = mPos )
2000-09-18 16:07:07 +00:00
{
aPos . X ( ) + = 12 ;
aPos . Y ( ) + = 16 ;
}
}
if ( nStyle & QUICKHELP_NOAUTOPOS )
{
if ( pHelpArea )
{
2001-10-29 16:38:25 +00:00
// convert help area to screen coords
Rectangle devHelpArea (
2002-12-03 13:35:27 +00:00
pHelpWin - > GetParent ( ) - > ImplGetFrameWindow ( ) - > OutputToAbsoluteScreenPixel ( pHelpArea - > TopLeft ( ) ) ,
pHelpWin - > GetParent ( ) - > ImplGetFrameWindow ( ) - > OutputToAbsoluteScreenPixel ( pHelpArea - > BottomRight ( ) ) ) ;
2001-10-29 16:38:25 +00:00
2000-09-18 16:07:07 +00:00
// Welche Position vom Rechteck?
2001-10-29 16:38:25 +00:00
aPos = devHelpArea . Center ( ) ;
2000-09-18 16:07:07 +00:00
if ( nStyle & QUICKHELP_LEFT )
2001-10-29 16:38:25 +00:00
aPos . X ( ) = devHelpArea . Left ( ) ;
2000-09-18 16:07:07 +00:00
else if ( nStyle & QUICKHELP_RIGHT )
2001-10-29 16:38:25 +00:00
aPos . X ( ) = devHelpArea . Right ( ) ;
2000-09-18 16:07:07 +00:00
if ( nStyle & QUICKHELP_TOP )
2001-10-29 16:38:25 +00:00
aPos . Y ( ) = devHelpArea . Top ( ) ;
2000-09-18 16:07:07 +00:00
else if ( nStyle & QUICKHELP_BOTTOM )
2001-10-29 16:38:25 +00:00
aPos . Y ( ) = devHelpArea . Bottom ( ) ;
2000-09-18 16:07:07 +00:00
}
// Welche Richtung?
if ( nStyle & QUICKHELP_LEFT )
;
else if ( nStyle & QUICKHELP_RIGHT )
aPos . X ( ) - = aSz . Width ( ) ;
else
aPos . X ( ) - = aSz . Width ( ) / 2 ;
if ( nStyle & QUICKHELP_TOP )
;
else if ( nStyle & QUICKHELP_BOTTOM )
aPos . Y ( ) - = aSz . Height ( ) ;
else
aPos . Y ( ) - = aSz . Height ( ) / 2 ;
}
if ( aPos . X ( ) < aScreenRect . Left ( ) )
aPos . X ( ) = aScreenRect . Left ( ) ;
else if ( ( aPos . X ( ) + aSz . Width ( ) ) > aScreenRect . Right ( ) )
aPos . X ( ) = aScreenRect . Right ( ) - aSz . Width ( ) ;
if ( aPos . Y ( ) < aScreenRect . Top ( ) )
aPos . Y ( ) = aScreenRect . Top ( ) ;
else if ( ( aPos . Y ( ) + aSz . Height ( ) ) > aScreenRect . Bottom ( ) )
aPos . Y ( ) = aScreenRect . Bottom ( ) - aSz . Height ( ) ;
2001-10-30 09:11:17 +00:00
// the popup must not appear under the mouse
// otherwise it would directly be closed due to a focus change...
Rectangle aHelpRect ( aPos , aSz ) ;
if ( aHelpRect . IsInside ( mPos ) )
{
Point delta ( 2 , 2 ) ;
Point pSize ( aSz . Width ( ) , aSz . Height ( ) ) ;
Point pTest ( mPos - pSize - delta ) ;
if ( pTest . X ( ) > aScreenRect . Left ( ) & & pTest . Y ( ) > aScreenRect . Top ( ) )
aPos = pTest ;
else
aPos = mPos + delta ;
}
2002-12-03 13:35:27 +00:00
Window * pWindow = pHelpWin - > GetParent ( ) - > ImplGetFrameWindow ( ) ;
2001-11-14 10:10:00 +00:00
aPos = pWindow - > AbsoluteScreenToOutputPixel ( aPos ) ;
2000-09-18 16:07:07 +00:00
pHelpWin - > SetPosPixel ( aPos ) ;
}