2000-09-18 16:07:07 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 08:13:36 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 08:13:36 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 08:13:36 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 08:13:36 +00:00
|
|
|
* 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.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 08:13:36 +00:00
|
|
|
* 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).
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 08:13:36 +00:00
|
|
|
* 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.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 11:21:30 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_vcl.hxx"
|
2000-09-18 16:07:07 +00:00
|
|
|
#include <tools/list.hxx>
|
|
|
|
#include <tools/debug.hxx>
|
|
|
|
|
2004-01-06 13:16:28 +00:00
|
|
|
#include <tools/rc.h>
|
2007-06-27 19:35:04 +00:00
|
|
|
#include <vcl/svdata.hxx>
|
|
|
|
#include <vcl/event.hxx>
|
|
|
|
#include <vcl/decoview.hxx>
|
|
|
|
#include <vcl/svapp.hxx>
|
|
|
|
#include <vcl/help.hxx>
|
|
|
|
#include <vcl/status.hxx>
|
|
|
|
#include <vcl/virdev.hxx>
|
2007-07-27 06:44:49 +00:00
|
|
|
#include <vcl/window.h>
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
|
|
|
#define STATUSBAR_OFFSET_X STATUSBAR_OFFSET
|
|
|
|
#define STATUSBAR_OFFSET_Y 2
|
|
|
|
#define STATUSBAR_OFFSET_TEXTY 3
|
|
|
|
|
|
|
|
#define STATUSBAR_PRGS_OFFSET 3
|
|
|
|
#define STATUSBAR_PRGS_COUNT 100
|
|
|
|
#define STATUSBAR_PRGS_MIN 5
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2004-11-26 15:22:23 +00:00
|
|
|
class StatusBar::ImplData
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
ImplData();
|
|
|
|
~ImplData();
|
|
|
|
|
|
|
|
VirtualDevice* mpVirDev;
|
2010-01-13 18:31:34 +01:00
|
|
|
long mnItemBorderWidth;
|
2010-01-18 15:54:29 +01:00
|
|
|
bool mbTopBorder:1;
|
|
|
|
bool mbDrawItemFrames:1;
|
2004-11-26 15:22:23 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
StatusBar::ImplData::ImplData()
|
|
|
|
{
|
|
|
|
mpVirDev = NULL;
|
2010-01-18 15:54:29 +01:00
|
|
|
mbTopBorder = false;
|
|
|
|
mbDrawItemFrames = false;
|
2010-01-13 18:31:34 +01:00
|
|
|
mnItemBorderWidth = 0;
|
2004-11-26 15:22:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
StatusBar::ImplData::~ImplData()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
struct ImplStatusItem
|
|
|
|
{
|
|
|
|
USHORT mnId;
|
|
|
|
StatusBarItemBits mnBits;
|
|
|
|
long mnWidth;
|
|
|
|
long mnOffset;
|
|
|
|
long mnExtraWidth;
|
|
|
|
long mnX;
|
|
|
|
XubString maText;
|
|
|
|
XubString maHelpText;
|
2005-11-11 08:14:53 +00:00
|
|
|
XubString maQuickHelpText;
|
2000-09-18 16:07:07 +00:00
|
|
|
ULONG mnHelpId;
|
|
|
|
void* mpUserData;
|
|
|
|
BOOL mbVisible;
|
2003-03-27 16:59:30 +00:00
|
|
|
XubString maAccessibleName;
|
2004-09-09 15:22:11 +00:00
|
|
|
XubString maCommand;
|
2000-09-18 16:07:07 +00:00
|
|
|
};
|
|
|
|
|
2006-06-19 18:40:42 +00:00
|
|
|
DECLARE_LIST( ImplStatusItemList, ImplStatusItem* )
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
|
|
|
inline long ImplCalcProgessWidth( USHORT nMax, long nSize )
|
|
|
|
{
|
|
|
|
return ((nMax*(nSize+(nSize/2)))-(nSize/2)+(STATUSBAR_PRGS_OFFSET*2));
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
static Point ImplGetItemTextPos( const Size& rRectSize, const Size& rTextSize,
|
|
|
|
USHORT nStyle )
|
|
|
|
{
|
|
|
|
long nX;
|
|
|
|
long nY;
|
2004-05-10 14:50:35 +00:00
|
|
|
long delta = (rTextSize.Height()/4) + 1;
|
|
|
|
if( delta + rTextSize.Width() > rRectSize.Width() )
|
|
|
|
delta = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( nStyle & SIB_LEFT )
|
2004-05-10 14:50:35 +00:00
|
|
|
nX = delta;
|
2000-09-18 16:07:07 +00:00
|
|
|
else if ( nStyle & SIB_RIGHT )
|
2004-05-10 14:50:35 +00:00
|
|
|
nX = rRectSize.Width()-rTextSize.Width()-delta;
|
2000-09-18 16:07:07 +00:00
|
|
|
else // SIB_CENTER
|
|
|
|
nX = (rRectSize.Width()-rTextSize.Width())/2;
|
|
|
|
nY = (rRectSize.Height()-rTextSize.Height())/2 + 1;
|
|
|
|
return Point( nX, nY );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL StatusBar::ImplIsItemUpdate()
|
|
|
|
{
|
|
|
|
if ( !mbProgressMode && mbVisibleItems && IsReallyVisible() && IsUpdateMode() )
|
|
|
|
return TRUE;
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::ImplInit( Window* pParent, WinBits nStyle )
|
|
|
|
{
|
2004-11-26 15:22:23 +00:00
|
|
|
mpImplData = new ImplData;
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// Default ist RightAlign
|
|
|
|
if ( !(nStyle & (WB_LEFT | WB_RIGHT)) )
|
|
|
|
nStyle |= WB_RIGHT;
|
|
|
|
|
|
|
|
Window::ImplInit( pParent, nStyle & ~WB_BORDER, NULL );
|
|
|
|
|
|
|
|
// WinBits merken
|
|
|
|
mpItemList = new ImplStatusItemList;
|
2004-11-26 15:22:23 +00:00
|
|
|
mpImplData->mpVirDev = new VirtualDevice( *this );
|
2000-09-18 16:07:07 +00:00
|
|
|
mnCurItemId = 0;
|
|
|
|
mbFormat = TRUE;
|
|
|
|
mbVisibleItems = TRUE;
|
|
|
|
mbProgressMode = FALSE;
|
|
|
|
mbInUserDraw = FALSE;
|
|
|
|
mbBottomBorder = FALSE;
|
2009-11-26 11:15:10 +01:00
|
|
|
mnItemsWidth = STATUSBAR_OFFSET_X;
|
2000-09-18 16:07:07 +00:00
|
|
|
mnDX = 0;
|
|
|
|
mnDY = 0;
|
|
|
|
mnCalcHeight = 0;
|
|
|
|
mnItemY = STATUSBAR_OFFSET_Y;
|
|
|
|
mnTextY = STATUSBAR_OFFSET_TEXTY;
|
|
|
|
|
|
|
|
ImplInitSettings( TRUE, TRUE, TRUE );
|
|
|
|
SetLineColor();
|
|
|
|
|
2004-09-09 15:22:11 +00:00
|
|
|
SetOutputSizePixel( CalcWindowSizePixel() );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
StatusBar::StatusBar( Window* pParent, WinBits nStyle ) :
|
|
|
|
Window( WINDOW_STATUSBAR )
|
|
|
|
{
|
|
|
|
ImplInit( pParent, nStyle );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
StatusBar::StatusBar( Window* pParent, const ResId& rResId ) :
|
|
|
|
Window( WINDOW_STATUSBAR )
|
|
|
|
{
|
|
|
|
rResId.SetRT( RSC_STATUSBAR );
|
|
|
|
WinBits nStyle = ImplInitRes( rResId );
|
|
|
|
ImplInit( pParent, nStyle );
|
|
|
|
ImplLoadRes( rResId );
|
|
|
|
|
|
|
|
if ( !(nStyle & WB_HIDE) )
|
|
|
|
Show();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
StatusBar::~StatusBar()
|
|
|
|
{
|
|
|
|
// Alle Items loeschen
|
|
|
|
ImplStatusItem* pItem = mpItemList->First();
|
|
|
|
while ( pItem )
|
|
|
|
{
|
|
|
|
delete pItem;
|
|
|
|
pItem = mpItemList->Next();
|
|
|
|
}
|
|
|
|
|
|
|
|
delete mpItemList;
|
|
|
|
|
|
|
|
// VirtualDevice loeschen
|
2004-11-26 15:22:23 +00:00
|
|
|
delete mpImplData->mpVirDev;
|
|
|
|
|
|
|
|
delete mpImplData;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::ImplInitSettings( BOOL bFont,
|
|
|
|
BOOL bForeground, BOOL bBackground )
|
|
|
|
{
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
|
|
|
|
if ( bFont )
|
|
|
|
{
|
|
|
|
Font aFont = rStyleSettings.GetToolFont();
|
|
|
|
if ( IsControlFont() )
|
|
|
|
aFont.Merge( GetControlFont() );
|
|
|
|
SetZoomedPointFont( aFont );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bForeground || bFont )
|
|
|
|
{
|
|
|
|
Color aColor;
|
|
|
|
if ( IsControlForeground() )
|
|
|
|
aColor = GetControlForeground();
|
|
|
|
else if ( GetStyle() & WB_3DLOOK )
|
|
|
|
aColor = rStyleSettings.GetButtonTextColor();
|
|
|
|
else
|
|
|
|
aColor = rStyleSettings.GetWindowTextColor();
|
|
|
|
SetTextColor( aColor );
|
|
|
|
SetTextFillColor();
|
|
|
|
|
2004-11-26 15:22:23 +00:00
|
|
|
mpImplData->mpVirDev->SetFont( GetFont() );
|
|
|
|
mpImplData->mpVirDev->SetTextColor( GetTextColor() );
|
|
|
|
mpImplData->mpVirDev->SetTextAlign( GetTextAlign() );
|
|
|
|
mpImplData->mpVirDev->SetTextFillColor();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( bBackground )
|
|
|
|
{
|
|
|
|
Color aColor;
|
|
|
|
if ( IsControlBackground() )
|
|
|
|
aColor = GetControlBackground();
|
|
|
|
else if ( GetStyle() & WB_3DLOOK )
|
|
|
|
aColor = rStyleSettings.GetFaceColor();
|
|
|
|
else
|
|
|
|
aColor = rStyleSettings.GetWindowColor();
|
|
|
|
SetBackground( aColor );
|
2004-11-26 15:22:23 +00:00
|
|
|
mpImplData->mpVirDev->SetBackground( GetBackground() );
|
2007-07-05 07:42:49 +00:00
|
|
|
|
|
|
|
// NWF background
|
|
|
|
if( ! IsControlBackground() &&
|
|
|
|
IsNativeControlSupported( CTRL_WINDOW_BACKGROUND, PART_BACKGROUND_WINDOW ) )
|
|
|
|
{
|
|
|
|
ImplGetWindowImpl()->mnNativeBackground = PART_BACKGROUND_WINDOW;
|
|
|
|
EnableChildTransparentMode( TRUE );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::ImplFormat()
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem;
|
|
|
|
long nExtraWidth;
|
|
|
|
long nExtraWidth2;
|
|
|
|
long nX;
|
|
|
|
USHORT nAutoSizeItems = 0;
|
|
|
|
|
|
|
|
// Breiten zusammenrechnen
|
|
|
|
mnItemsWidth = STATUSBAR_OFFSET_X;
|
|
|
|
long nOffset = 0;
|
|
|
|
pItem = mpItemList->First();
|
|
|
|
while ( pItem )
|
|
|
|
{
|
|
|
|
if ( pItem->mbVisible )
|
|
|
|
{
|
|
|
|
if ( pItem->mnBits & SIB_AUTOSIZE )
|
|
|
|
nAutoSizeItems++;
|
|
|
|
|
|
|
|
mnItemsWidth += pItem->mnWidth + nOffset;
|
|
|
|
nOffset = pItem->mnOffset;
|
|
|
|
}
|
|
|
|
|
|
|
|
pItem = mpItemList->Next();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( GetStyle() & WB_RIGHT )
|
|
|
|
{
|
|
|
|
// Bei rechtsbuendiger Ausrichtung wird kein AutoSize ausgewertet,
|
|
|
|
// da wir links den Text anzeigen, der mit SetText gesetzt wird
|
|
|
|
nX = mnDX - mnItemsWidth;
|
|
|
|
nExtraWidth = 0;
|
|
|
|
nExtraWidth2 = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
mnItemsWidth += STATUSBAR_OFFSET_X;
|
|
|
|
|
|
|
|
// Bei linksbuendiger Ausrichtung muessen wir gegebenenfalls noch
|
|
|
|
// AutoSize auswerten
|
|
|
|
if ( nAutoSizeItems && (mnDX > (mnItemsWidth - STATUSBAR_OFFSET)) )
|
|
|
|
{
|
|
|
|
nExtraWidth = (mnDX - mnItemsWidth - 1) / nAutoSizeItems;
|
|
|
|
nExtraWidth2 = (mnDX - mnItemsWidth - 1) % nAutoSizeItems;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
nExtraWidth = 0;
|
|
|
|
nExtraWidth2 = 0;
|
|
|
|
}
|
|
|
|
nX = STATUSBAR_OFFSET_X;
|
|
|
|
}
|
|
|
|
|
|
|
|
pItem = mpItemList->First();
|
|
|
|
while ( pItem )
|
|
|
|
{
|
|
|
|
if ( pItem->mbVisible )
|
|
|
|
{
|
|
|
|
if ( pItem->mnBits & SIB_AUTOSIZE )
|
|
|
|
{
|
|
|
|
pItem->mnExtraWidth = nExtraWidth;
|
|
|
|
if ( nExtraWidth2 )
|
|
|
|
{
|
|
|
|
pItem->mnExtraWidth++;
|
|
|
|
nExtraWidth2--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
pItem->mnExtraWidth = 0;
|
|
|
|
|
|
|
|
pItem->mnX = nX;
|
|
|
|
nX += pItem->mnWidth + pItem->mnExtraWidth + pItem->mnOffset;
|
|
|
|
}
|
|
|
|
|
|
|
|
pItem = mpItemList->Next();
|
|
|
|
}
|
|
|
|
|
|
|
|
mbFormat = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Rectangle StatusBar::ImplGetItemRectPos( USHORT nPos ) const
|
|
|
|
{
|
|
|
|
Rectangle aRect;
|
|
|
|
ImplStatusItem* pItem;
|
|
|
|
pItem = mpItemList->GetObject( nPos );
|
|
|
|
if ( pItem )
|
|
|
|
{
|
|
|
|
if ( pItem->mbVisible )
|
|
|
|
{
|
|
|
|
aRect.Left() = pItem->mnX;
|
|
|
|
aRect.Right() = aRect.Left() + pItem->mnWidth + pItem->mnExtraWidth;
|
|
|
|
aRect.Top() = mnItemY;
|
|
|
|
aRect.Bottom() = mnCalcHeight - STATUSBAR_OFFSET_Y;
|
2004-11-26 15:22:23 +00:00
|
|
|
if( IsTopBorder() )
|
|
|
|
aRect.Bottom()+=2;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return aRect;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-01-18 15:54:29 +01:00
|
|
|
USHORT StatusBar::ImplGetFirstVisiblePos() const
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem;
|
|
|
|
|
|
|
|
for( USHORT nPos = 0; nPos < mpItemList->Count(); nPos++ )
|
|
|
|
{
|
|
|
|
pItem = mpItemList->GetObject( nPos );
|
|
|
|
if ( pItem )
|
|
|
|
{
|
|
|
|
if ( pItem->mbVisible )
|
|
|
|
return nPos;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ~0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
void StatusBar::ImplDrawText( BOOL bOffScreen, long nOldTextWidth )
|
|
|
|
{
|
|
|
|
// Das ueberschreiben der Item-Box verhindern
|
|
|
|
Rectangle aTextRect;
|
|
|
|
aTextRect.Left() = STATUSBAR_OFFSET_X+1;
|
|
|
|
aTextRect.Top() = mnTextY;
|
|
|
|
if ( mbVisibleItems && (GetStyle() & WB_RIGHT) )
|
|
|
|
aTextRect.Right() = mnDX - mnItemsWidth - 1;
|
|
|
|
else
|
|
|
|
aTextRect.Right() = mnDX - 1;
|
|
|
|
if ( aTextRect.Right() > aTextRect.Left() )
|
|
|
|
{
|
|
|
|
// Position ermitteln
|
|
|
|
XubString aStr = GetText();
|
|
|
|
USHORT nPos = aStr.Search( _LF );
|
|
|
|
if ( nPos != STRING_NOTFOUND )
|
|
|
|
aStr.Erase( nPos );
|
|
|
|
|
|
|
|
aTextRect.Bottom() = aTextRect.Top()+GetTextHeight()+1;
|
|
|
|
|
|
|
|
if ( bOffScreen )
|
|
|
|
{
|
|
|
|
long nMaxWidth = Max( nOldTextWidth, GetTextWidth( aStr ) );
|
|
|
|
Size aVirDevSize( nMaxWidth, aTextRect.GetHeight() );
|
2004-11-26 15:22:23 +00:00
|
|
|
mpImplData->mpVirDev->SetOutputSizePixel( aVirDevSize );
|
2000-09-18 16:07:07 +00:00
|
|
|
Rectangle aTempRect = aTextRect;
|
|
|
|
aTempRect.SetPos( Point( 0, 0 ) );
|
2004-11-26 15:22:23 +00:00
|
|
|
mpImplData->mpVirDev->DrawText( aTempRect, aStr, TEXT_DRAW_LEFT | TEXT_DRAW_TOP | TEXT_DRAW_CLIP | TEXT_DRAW_ENDELLIPSIS );
|
|
|
|
DrawOutDev( aTextRect.TopLeft(), aVirDevSize, Point(), aVirDevSize, *mpImplData->mpVirDev );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
DrawText( aTextRect, aStr, TEXT_DRAW_LEFT | TEXT_DRAW_TOP | TEXT_DRAW_CLIP | TEXT_DRAW_ENDELLIPSIS );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::ImplDrawItem( BOOL bOffScreen, USHORT nPos, BOOL bDrawText, BOOL bDrawFrame )
|
|
|
|
{
|
|
|
|
Rectangle aRect = ImplGetItemRectPos( nPos );
|
|
|
|
|
|
|
|
if ( aRect.IsEmpty() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Ausgabebereich berechnen
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( nPos );
|
2010-01-13 18:31:34 +01:00
|
|
|
long nW = mpImplData->mnItemBorderWidth + 1;
|
|
|
|
Rectangle aTextRect( aRect.Left()+nW, aRect.Top()+nW,
|
|
|
|
aRect.Right()-nW, aRect.Bottom()-nW );
|
2000-09-18 16:07:07 +00:00
|
|
|
Size aTextRectSize( aTextRect.GetSize() );
|
|
|
|
|
|
|
|
if ( bOffScreen )
|
2004-11-26 15:22:23 +00:00
|
|
|
mpImplData->mpVirDev->SetOutputSizePixel( aTextRectSize );
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
Region aRegion( aTextRect );
|
|
|
|
SetClipRegion( aRegion );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Text ausgeben
|
|
|
|
if ( bDrawText )
|
|
|
|
{
|
|
|
|
Size aTextSize( GetTextWidth( pItem->maText ), GetTextHeight() );
|
|
|
|
Point aTextPos = ImplGetItemTextPos( aTextRectSize, aTextSize, pItem->mnBits );
|
|
|
|
if ( bOffScreen )
|
2004-11-26 15:22:23 +00:00
|
|
|
mpImplData->mpVirDev->DrawText( aTextPos, pItem->maText );
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
aTextPos.X() += aTextRect.Left();
|
|
|
|
aTextPos.Y() += aTextRect.Top();
|
|
|
|
DrawText( aTextPos, pItem->maText );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Gegebenenfalls auch DrawItem aufrufen
|
|
|
|
if ( pItem->mnBits & SIB_USERDRAW )
|
|
|
|
{
|
|
|
|
if ( bOffScreen )
|
|
|
|
{
|
|
|
|
mbInUserDraw = TRUE;
|
2008-05-14 08:50:47 +00:00
|
|
|
mpImplData->mpVirDev->EnableRTL( IsRTLEnabled() );
|
2004-11-26 15:22:23 +00:00
|
|
|
UserDrawEvent aODEvt( mpImplData->mpVirDev, Rectangle( Point(), aTextRectSize ), pItem->mnId );
|
2000-09-18 16:07:07 +00:00
|
|
|
UserDraw( aODEvt );
|
2008-05-14 08:50:47 +00:00
|
|
|
mpImplData->mpVirDev->EnableRTL( FALSE );
|
2000-09-18 16:07:07 +00:00
|
|
|
mbInUserDraw = FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
UserDrawEvent aODEvt( this, aTextRect, pItem->mnId );
|
|
|
|
UserDraw( aODEvt );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bOffScreen )
|
2004-11-26 15:22:23 +00:00
|
|
|
DrawOutDev( aTextRect.TopLeft(), aTextRectSize, Point(), aTextRectSize, *mpImplData->mpVirDev );
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
SetClipRegion();
|
|
|
|
|
|
|
|
// Frame ausgeben
|
2010-01-18 15:54:29 +01:00
|
|
|
if ( bDrawFrame )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2010-01-18 15:54:29 +01:00
|
|
|
if( mpImplData->mbDrawItemFrames )
|
|
|
|
{
|
|
|
|
if( !(pItem->mnBits & SIB_FLAT) )
|
|
|
|
{
|
|
|
|
USHORT nStyle;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-01-18 15:54:29 +01:00
|
|
|
if ( pItem->mnBits & SIB_IN )
|
|
|
|
nStyle = FRAME_DRAW_IN;
|
|
|
|
else
|
|
|
|
nStyle = FRAME_DRAW_OUT;
|
|
|
|
|
|
|
|
DecorationView aDecoView( this );
|
|
|
|
aDecoView.DrawFrame( aRect, nStyle );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if( nPos != ImplGetFirstVisiblePos() )
|
|
|
|
{
|
|
|
|
// draw separator
|
|
|
|
Point aFrom( aRect.TopLeft() );
|
|
|
|
aFrom.X()--;
|
|
|
|
aFrom.Y()++;
|
|
|
|
Point aTo( aRect.BottomLeft() );
|
|
|
|
aTo.X()--;
|
|
|
|
aTo.Y()--;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-01-18 15:54:29 +01:00
|
|
|
DecorationView aDecoView( this );
|
|
|
|
aDecoView.DrawSeparator( aFrom, aTo );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2003-03-27 16:59:30 +00:00
|
|
|
|
|
|
|
if ( !ImplIsRecordLayout() )
|
2006-06-19 18:40:42 +00:00
|
|
|
ImplCallEventListeners( VCLEVENT_STATUSBAR_DRAWITEM, (void*) sal_IntPtr(pItem->mnId) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void DrawProgress( Window* pWindow, const Point& rPos,
|
|
|
|
long nOffset, long nPrgsWidth, long nPrgsHeight,
|
2007-08-03 13:08:49 +00:00
|
|
|
USHORT nPercent1, USHORT nPercent2, USHORT nPercentCount,
|
|
|
|
const Rectangle& rFramePosSize
|
|
|
|
)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2007-08-03 13:08:49 +00:00
|
|
|
if( pWindow->IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) )
|
|
|
|
{
|
|
|
|
bool bNeedErase = ImplGetSVData()->maNWFData.mbProgressNeedsErase;
|
|
|
|
|
|
|
|
long nFullWidth = (nPrgsWidth + nOffset) * (10000 / nPercentCount);
|
|
|
|
long nPerc = (nPercent2 > 10000) ? 10000 : nPercent2;
|
|
|
|
ImplControlValue aValue( nFullWidth * (long)nPerc / 10000 );
|
|
|
|
Rectangle aDrawRect( rPos, Size( nFullWidth, nPrgsHeight ) );
|
2010-07-05 11:20:24 +02:00
|
|
|
Rectangle aControlRegion( aDrawRect );
|
2007-08-03 13:08:49 +00:00
|
|
|
if( bNeedErase )
|
|
|
|
{
|
|
|
|
Window* pEraseWindow = pWindow;
|
|
|
|
while( pEraseWindow->IsPaintTransparent() &&
|
|
|
|
! pEraseWindow->ImplGetWindowImpl()->mbFrame )
|
|
|
|
{
|
|
|
|
pEraseWindow = pEraseWindow->ImplGetWindowImpl()->mpParent;
|
|
|
|
}
|
|
|
|
if( pEraseWindow == pWindow )
|
|
|
|
// restore background of pWindow
|
|
|
|
pEraseWindow->Erase( rFramePosSize );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// restore transparent background
|
|
|
|
Point aTL( pWindow->OutputToAbsoluteScreenPixel( rFramePosSize.TopLeft() ) );
|
|
|
|
aTL = pEraseWindow->AbsoluteScreenToOutputPixel( aTL );
|
|
|
|
Rectangle aRect( aTL, rFramePosSize.GetSize() );
|
|
|
|
pEraseWindow->Invalidate( aRect, INVALIDATE_NOCHILDREN |
|
|
|
|
INVALIDATE_NOCLIPCHILDREN |
|
|
|
|
INVALIDATE_TRANSPARENT );
|
|
|
|
pEraseWindow->Update();
|
|
|
|
}
|
|
|
|
pWindow->Push( PUSH_CLIPREGION );
|
|
|
|
pWindow->IntersectClipRegion( rFramePosSize );
|
|
|
|
}
|
|
|
|
BOOL bNativeOK = pWindow->DrawNativeControl( CTRL_PROGRESS, PART_ENTIRE_CONTROL, aControlRegion,
|
|
|
|
CTRL_STATE_ENABLED, aValue, rtl::OUString() );
|
|
|
|
if( bNeedErase )
|
|
|
|
pWindow->Pop();
|
|
|
|
if( bNativeOK )
|
|
|
|
{
|
|
|
|
pWindow->Flush();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// Werte vorberechnen
|
|
|
|
USHORT nPerc1 = nPercent1 / nPercentCount;
|
|
|
|
USHORT nPerc2 = nPercent2 / nPercentCount;
|
|
|
|
|
2002-11-20 07:43:39 +00:00
|
|
|
if ( nPerc1 > nPerc2 )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2002-11-20 07:43:39 +00:00
|
|
|
// Support progress that can also decrease
|
|
|
|
|
|
|
|
// Rechteck berechnen
|
|
|
|
long nDX = nPrgsWidth + nOffset;
|
|
|
|
long nLeft = rPos.X()+((nPerc1-1)*nDX);
|
|
|
|
Rectangle aRect( nLeft, rPos.Y(), nLeft+nPrgsWidth, rPos.Y()+nPrgsHeight );
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
pWindow->Erase( aRect );
|
|
|
|
aRect.Left() -= nDX;
|
|
|
|
aRect.Right() -= nDX;
|
|
|
|
nPerc1--;
|
|
|
|
}
|
|
|
|
while ( nPerc1 > nPerc2 );
|
|
|
|
|
|
|
|
pWindow->Flush();
|
|
|
|
}
|
|
|
|
else if ( nPerc1 < nPerc2 )
|
|
|
|
{
|
|
|
|
// Percent-Rechtecke malen
|
2000-09-18 16:07:07 +00:00
|
|
|
// Wenn Percent2 ueber 100%, Werte anpassen
|
|
|
|
if ( nPercent2 > 10000 )
|
|
|
|
{
|
|
|
|
nPerc2 = 10000 / nPercentCount;
|
|
|
|
if ( nPerc1 >= nPerc2 )
|
|
|
|
nPerc1 = nPerc2-1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Rechteck berechnen
|
|
|
|
long nDX = nPrgsWidth + nOffset;
|
|
|
|
long nLeft = rPos.X()+(nPerc1*nDX);
|
|
|
|
Rectangle aRect( nLeft, rPos.Y(), nLeft+nPrgsWidth, rPos.Y()+nPrgsHeight );
|
|
|
|
|
|
|
|
do
|
|
|
|
{
|
|
|
|
pWindow->DrawRect( aRect );
|
|
|
|
aRect.Left() += nDX;
|
|
|
|
aRect.Right() += nDX;
|
|
|
|
nPerc1++;
|
|
|
|
}
|
|
|
|
while ( nPerc1 < nPerc2 );
|
|
|
|
|
|
|
|
// Bei mehr als 100%, lassen wir das Rechteck blinken
|
|
|
|
if ( nPercent2 > 10000 )
|
|
|
|
{
|
|
|
|
// an/aus-Status festlegen
|
|
|
|
if ( ((nPercent2 / nPercentCount) & 0x01) == (nPercentCount & 0x01) )
|
|
|
|
{
|
|
|
|
aRect.Left() -= nDX;
|
|
|
|
aRect.Right() -= nDX;
|
|
|
|
pWindow->Erase( aRect );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pWindow->Flush();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::ImplDrawProgress( BOOL bPaint,
|
|
|
|
USHORT nPercent1, USHORT nPercent2 )
|
|
|
|
{
|
2007-08-03 13:08:49 +00:00
|
|
|
bool bNative = IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL );
|
|
|
|
// bPaint: draw text also, else only update progress
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( bPaint )
|
|
|
|
{
|
|
|
|
DrawText( maPrgsTxtPos, maPrgsTxt );
|
2007-08-03 13:08:49 +00:00
|
|
|
if( ! bNative )
|
|
|
|
{
|
|
|
|
DecorationView aDecoView( this );
|
|
|
|
aDecoView.DrawFrame( maPrgsFrameRect, FRAME_DRAW_IN );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Point aPos( maPrgsFrameRect.Left()+STATUSBAR_PRGS_OFFSET,
|
|
|
|
maPrgsFrameRect.Top()+STATUSBAR_PRGS_OFFSET );
|
2007-08-03 13:08:49 +00:00
|
|
|
long nPrgsHeight = mnPrgsSize;
|
|
|
|
if( bNative )
|
|
|
|
{
|
|
|
|
aPos = maPrgsFrameRect.TopLeft();
|
2008-06-25 13:33:29 +00:00
|
|
|
nPrgsHeight = maPrgsFrameRect.GetHeight();
|
2007-08-03 13:08:49 +00:00
|
|
|
}
|
|
|
|
DrawProgress( this, aPos, mnPrgsSize/2, mnPrgsSize, nPrgsHeight,
|
|
|
|
nPercent1*100, nPercent2*100, mnPercentCount, maPrgsFrameRect );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::ImplCalcProgressRect()
|
|
|
|
{
|
2007-08-03 13:08:49 +00:00
|
|
|
// calculate text size
|
2000-09-18 16:07:07 +00:00
|
|
|
Size aPrgsTxtSize( GetTextWidth( maPrgsTxt ), GetTextHeight() );
|
|
|
|
maPrgsTxtPos.X() = STATUSBAR_OFFSET_X+1;
|
|
|
|
|
2007-08-03 13:08:49 +00:00
|
|
|
// calculate progress frame
|
2000-09-18 16:07:07 +00:00
|
|
|
maPrgsFrameRect.Left() = maPrgsTxtPos.X()+aPrgsTxtSize.Width()+STATUSBAR_OFFSET;
|
|
|
|
maPrgsFrameRect.Top() = mnItemY;
|
|
|
|
maPrgsFrameRect.Bottom() = mnCalcHeight - STATUSBAR_OFFSET_Y;
|
2004-11-26 15:22:23 +00:00
|
|
|
if( IsTopBorder() )
|
|
|
|
maPrgsFrameRect.Bottom()+=2;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2007-08-03 13:08:49 +00:00
|
|
|
// calculate size of progress rects
|
2000-09-18 16:07:07 +00:00
|
|
|
mnPrgsSize = maPrgsFrameRect.Bottom()-maPrgsFrameRect.Top()-(STATUSBAR_PRGS_OFFSET*2);
|
|
|
|
USHORT nMaxPercent = STATUSBAR_PRGS_COUNT;
|
|
|
|
|
|
|
|
long nMaxWidth = mnDX-STATUSBAR_OFFSET-1;
|
|
|
|
|
2007-08-03 13:08:49 +00:00
|
|
|
// make smaller if there are too many rects
|
2000-09-18 16:07:07 +00:00
|
|
|
while ( maPrgsFrameRect.Left()+ImplCalcProgessWidth( nMaxPercent, mnPrgsSize ) > nMaxWidth )
|
|
|
|
{
|
|
|
|
nMaxPercent--;
|
|
|
|
if ( nMaxPercent <= STATUSBAR_PRGS_MIN )
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
maPrgsFrameRect.Right() = maPrgsFrameRect.Left() + ImplCalcProgessWidth( nMaxPercent, mnPrgsSize );
|
2007-08-03 13:08:49 +00:00
|
|
|
|
|
|
|
// save the divisor for later
|
2000-09-18 16:07:07 +00:00
|
|
|
mnPercentCount = 10000 / nMaxPercent;
|
2007-08-03 13:08:49 +00:00
|
|
|
BOOL bNativeOK = FALSE;
|
|
|
|
if( IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) )
|
|
|
|
{
|
|
|
|
ImplControlValue aValue;
|
2010-07-05 11:20:24 +02:00
|
|
|
Rectangle aControlRegion( Rectangle( (const Point&)Point(), maPrgsFrameRect.GetSize() ) );
|
|
|
|
Rectangle aNativeControlRegion, aNativeContentRegion;
|
2007-08-03 13:08:49 +00:00
|
|
|
if( (bNativeOK = GetNativeControlRegion( CTRL_PROGRESS, PART_ENTIRE_CONTROL, aControlRegion,
|
|
|
|
CTRL_STATE_ENABLED, aValue, rtl::OUString(),
|
|
|
|
aNativeControlRegion, aNativeContentRegion ) ) != FALSE )
|
|
|
|
{
|
2010-07-05 11:20:24 +02:00
|
|
|
long nProgressHeight = aNativeControlRegion.GetHeight();
|
2008-06-25 13:33:29 +00:00
|
|
|
if( nProgressHeight > maPrgsFrameRect.GetHeight() )
|
|
|
|
{
|
|
|
|
long nDelta = nProgressHeight - maPrgsFrameRect.GetHeight();
|
|
|
|
maPrgsFrameRect.Top() -= (nDelta - nDelta/2);
|
|
|
|
maPrgsFrameRect.Bottom() += nDelta/2;
|
|
|
|
}
|
|
|
|
maPrgsTxtPos.Y() = maPrgsFrameRect.Top() + (nProgressHeight - GetTextHeight())/2;
|
2007-08-03 13:08:49 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if( ! bNativeOK )
|
|
|
|
maPrgsTxtPos.Y() = mnTextY;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::MouseButtonDown( const MouseEvent& rMEvt )
|
|
|
|
{
|
|
|
|
// Nur bei linker Maustaste ToolBox ausloesen
|
|
|
|
if ( rMEvt.IsLeft() )
|
|
|
|
{
|
|
|
|
if ( mbVisibleItems )
|
|
|
|
{
|
|
|
|
Point aMousePos = rMEvt.GetPosPixel();
|
|
|
|
USHORT i = 0;
|
|
|
|
|
|
|
|
// Item suchen, das geklickt wurde
|
|
|
|
ImplStatusItem* pItem = mpItemList->First();
|
|
|
|
while ( pItem )
|
|
|
|
{
|
|
|
|
// Ist es dieses Item
|
|
|
|
if ( ImplGetItemRectPos( i ).IsInside( aMousePos ) )
|
|
|
|
{
|
|
|
|
mnCurItemId = pItem->mnId;
|
|
|
|
if ( rMEvt.GetClicks() == 2 )
|
|
|
|
DoubleClick();
|
|
|
|
else
|
|
|
|
Click();
|
|
|
|
mnCurItemId = 0;
|
|
|
|
|
|
|
|
// Item wurde gefunden
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
i++;
|
|
|
|
pItem = mpItemList->Next();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Kein Item, dann nur Click oder DoubleClick
|
|
|
|
if ( rMEvt.GetClicks() == 2 )
|
|
|
|
DoubleClick();
|
|
|
|
else
|
|
|
|
Click();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::Paint( const Rectangle& )
|
|
|
|
{
|
|
|
|
if ( mbFormat )
|
|
|
|
ImplFormat();
|
|
|
|
|
|
|
|
USHORT nItemCount = (USHORT)mpItemList->Count();
|
|
|
|
|
|
|
|
if ( mbProgressMode )
|
|
|
|
ImplDrawProgress( TRUE, 0, mnPercent );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Text zeichen
|
|
|
|
if ( !mbVisibleItems || (GetStyle() & WB_RIGHT) )
|
|
|
|
ImplDrawText( FALSE, 0 );
|
|
|
|
|
|
|
|
// Items zeichnen
|
|
|
|
if ( mbVisibleItems )
|
|
|
|
{
|
|
|
|
// Items zeichnen
|
|
|
|
for ( USHORT i = 0; i < nItemCount; i++ )
|
|
|
|
ImplDrawItem( FALSE, i, TRUE, TRUE );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-11-26 15:22:23 +00:00
|
|
|
// draw borders
|
|
|
|
if( IsTopBorder() )
|
|
|
|
{
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
SetLineColor( rStyleSettings.GetShadowColor() );
|
|
|
|
DrawLine( Point( 0, 0 ), Point( mnDX-1, 0 ) );
|
|
|
|
SetLineColor( rStyleSettings.GetLightColor() );
|
|
|
|
DrawLine( Point( 0, 1 ), Point( mnDX-1, 1 ) );
|
|
|
|
}
|
2004-09-09 15:22:11 +00:00
|
|
|
|
2004-11-26 15:22:23 +00:00
|
|
|
if ( IsBottomBorder() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
SetLineColor( rStyleSettings.GetShadowColor() );
|
|
|
|
DrawLine( Point( 0, mnDY-2 ), Point( mnDX-1, mnDY-2 ) );
|
|
|
|
SetLineColor( rStyleSettings.GetLightColor() );
|
|
|
|
DrawLine( Point( 0, mnDY-1 ), Point( mnDX-1, mnDY-1 ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::Move()
|
|
|
|
{
|
|
|
|
Window::Move();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::Resize()
|
|
|
|
{
|
|
|
|
// Breite und Hoehe abfragen und merken
|
|
|
|
Size aSize = GetOutputSizePixel();
|
|
|
|
mnDX = aSize.Width();
|
|
|
|
mnDY = aSize.Height();
|
|
|
|
mnCalcHeight = mnDY;
|
2004-11-26 15:22:23 +00:00
|
|
|
// subtract border
|
|
|
|
if( IsTopBorder() )
|
|
|
|
mnCalcHeight -= 2;
|
|
|
|
if ( IsBottomBorder() )
|
2000-09-18 16:07:07 +00:00
|
|
|
mnCalcHeight -= 2;
|
|
|
|
|
2007-08-03 13:08:49 +00:00
|
|
|
mnItemY = STATUSBAR_OFFSET_Y;
|
|
|
|
if( IsTopBorder() )
|
|
|
|
mnItemY += 2;
|
2002-04-24 16:22:04 +00:00
|
|
|
mnTextY = (mnCalcHeight-GetTextHeight())/2;
|
2004-11-26 15:22:23 +00:00
|
|
|
if( IsTopBorder() )
|
|
|
|
mnTextY += 2;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// Formatierung neu ausloesen
|
|
|
|
mbFormat = TRUE;
|
|
|
|
|
|
|
|
if ( mbProgressMode )
|
|
|
|
ImplCalcProgressRect();
|
|
|
|
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::RequestHelp( const HelpEvent& rHEvt )
|
|
|
|
{
|
2002-04-24 11:12:05 +00:00
|
|
|
// no keyboard help in status bar
|
|
|
|
if( rHEvt.KeyboardActivated() )
|
|
|
|
return;
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
USHORT nItemId = GetItemId( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) );
|
|
|
|
|
|
|
|
if ( nItemId )
|
|
|
|
{
|
2005-11-11 08:14:53 +00:00
|
|
|
Rectangle aItemRect = GetItemRect( nItemId );
|
|
|
|
Point aPt = OutputToScreenPixel( aItemRect.TopLeft() );
|
|
|
|
aItemRect.Left() = aPt.X();
|
|
|
|
aItemRect.Top() = aPt.Y();
|
|
|
|
aPt = OutputToScreenPixel( aItemRect.BottomRight() );
|
|
|
|
aItemRect.Right() = aPt.X();
|
|
|
|
aItemRect.Bottom() = aPt.Y();
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( rHEvt.GetMode() & HELPMODE_BALLOON )
|
|
|
|
{
|
|
|
|
XubString aStr = GetHelpText( nItemId );
|
|
|
|
Help::ShowBalloon( this, aItemRect.Center(), aItemRect, aStr );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else if ( rHEvt.GetMode() & HELPMODE_QUICK )
|
|
|
|
{
|
2005-11-11 08:14:53 +00:00
|
|
|
XubString aStr = GetQuickHelpText( nItemId );
|
|
|
|
// Show quickhelp if available
|
|
|
|
if( aStr.Len() )
|
|
|
|
{
|
|
|
|
Help::ShowQuickHelp( this, aItemRect, aStr );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
aStr = GetItemText( nItemId );
|
|
|
|
// show a quick help if item text doesn't fit
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( GetTextWidth( aStr ) > aItemRect.GetWidth() )
|
|
|
|
{
|
|
|
|
Help::ShowQuickHelp( this, aItemRect, aStr );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( rHEvt.GetMode() & HELPMODE_EXTENDED )
|
|
|
|
{
|
2005-01-27 09:19:58 +00:00
|
|
|
String aCommand = GetItemCommand( nItemId );
|
2000-09-18 16:07:07 +00:00
|
|
|
ULONG nHelpId = GetHelpId( nItemId );
|
2005-01-27 09:19:58 +00:00
|
|
|
|
|
|
|
if ( aCommand.Len() || nHelpId )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
// Wenn eine Hilfe existiert, dann ausloesen
|
|
|
|
Help* pHelp = Application::GetHelp();
|
|
|
|
if ( pHelp )
|
2005-01-27 09:19:58 +00:00
|
|
|
{
|
|
|
|
if ( aCommand.Len() )
|
|
|
|
pHelp->Start( aCommand, this );
|
|
|
|
else if ( nHelpId )
|
|
|
|
pHelp->Start( nHelpId, this );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Window::RequestHelp( rHEvt );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::StateChanged( StateChangedType nType )
|
|
|
|
{
|
|
|
|
Window::StateChanged( nType );
|
|
|
|
|
|
|
|
if ( nType == STATE_CHANGE_INITSHOW )
|
|
|
|
ImplFormat();
|
|
|
|
else if ( nType == STATE_CHANGE_UPDATEMODE )
|
|
|
|
Invalidate();
|
|
|
|
else if ( (nType == STATE_CHANGE_ZOOM) ||
|
|
|
|
(nType == STATE_CHANGE_CONTROLFONT) )
|
|
|
|
{
|
|
|
|
mbFormat = TRUE;
|
|
|
|
ImplInitSettings( TRUE, FALSE, FALSE );
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
else if ( nType == STATE_CHANGE_CONTROLFOREGROUND )
|
|
|
|
{
|
|
|
|
ImplInitSettings( FALSE, TRUE, FALSE );
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
|
|
|
|
{
|
|
|
|
ImplInitSettings( FALSE, FALSE, TRUE );
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::DataChanged( const DataChangedEvent& rDCEvt )
|
|
|
|
{
|
|
|
|
Window::DataChanged( rDCEvt );
|
|
|
|
|
|
|
|
if ( (rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
|
|
|
|
(rDCEvt.GetType() == DATACHANGED_FONTS) ||
|
|
|
|
(rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
|
|
|
|
((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
|
|
|
|
(rDCEvt.GetFlags() & SETTINGS_STYLE)) )
|
|
|
|
{
|
|
|
|
mbFormat = TRUE;
|
|
|
|
ImplInitSettings( TRUE, TRUE, TRUE );
|
2002-04-24 16:22:04 +00:00
|
|
|
ImplStatusItem* pItem = mpItemList->First();
|
2006-01-20 11:53:14 +00:00
|
|
|
long nFudge = GetTextHeight() / 4;
|
2002-04-24 16:22:04 +00:00
|
|
|
while ( pItem )
|
|
|
|
{
|
2006-01-20 11:53:14 +00:00
|
|
|
long nWidth = GetTextWidth( pItem->maText ) + nFudge;
|
2002-04-24 16:22:04 +00:00
|
|
|
if( nWidth > pItem->mnWidth + STATUSBAR_OFFSET )
|
|
|
|
pItem->mnWidth = nWidth + STATUSBAR_OFFSET;
|
|
|
|
pItem = mpItemList->Next();
|
|
|
|
}
|
2002-05-29 16:01:29 +00:00
|
|
|
Size aSize = GetSizePixel();
|
|
|
|
// do not disturb current width, since
|
|
|
|
// CalcWindowSizePixel calculates a minimum width
|
|
|
|
aSize.Height() = CalcWindowSizePixel().Height();
|
|
|
|
SetSizePixel( aSize );
|
2000-09-18 16:07:07 +00:00
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::Click()
|
|
|
|
{
|
2001-11-27 08:52:58 +00:00
|
|
|
ImplCallEventListeners( VCLEVENT_STATUSBAR_CLICK );
|
2000-09-18 16:07:07 +00:00
|
|
|
maClickHdl.Call( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::DoubleClick()
|
|
|
|
{
|
2001-11-27 08:52:58 +00:00
|
|
|
ImplCallEventListeners( VCLEVENT_STATUSBAR_DOUBLECLICK );
|
2000-09-18 16:07:07 +00:00
|
|
|
maDoubleClickHdl.Call( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::UserDraw( const UserDrawEvent& )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::InsertItem( USHORT nItemId, ULONG nWidth,
|
|
|
|
StatusBarItemBits nBits,
|
|
|
|
long nOffset, USHORT nPos )
|
|
|
|
{
|
|
|
|
DBG_ASSERT( nItemId, "StatusBar::InsertItem(): ItemId == 0" );
|
|
|
|
DBG_ASSERT( GetItemPos( nItemId ) == STATUSBAR_ITEM_NOTFOUND,
|
|
|
|
"StatusBar::InsertItem(): ItemId already exists" );
|
|
|
|
|
|
|
|
// IN und CENTER sind Default
|
|
|
|
if ( !(nBits & (SIB_IN | SIB_OUT | SIB_FLAT)) )
|
|
|
|
nBits |= SIB_IN;
|
|
|
|
if ( !(nBits & (SIB_LEFT | SIB_RIGHT | SIB_CENTER)) )
|
|
|
|
nBits |= SIB_CENTER;
|
|
|
|
|
|
|
|
// Item anlegen
|
2006-01-20 11:53:14 +00:00
|
|
|
long nFudge = GetTextHeight()/4;
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplStatusItem* pItem = new ImplStatusItem;
|
|
|
|
pItem->mnId = nItemId;
|
|
|
|
pItem->mnBits = nBits;
|
2006-01-20 11:53:14 +00:00
|
|
|
pItem->mnWidth = (long)nWidth+nFudge+STATUSBAR_OFFSET;
|
2000-09-18 16:07:07 +00:00
|
|
|
pItem->mnOffset = nOffset;
|
|
|
|
pItem->mnHelpId = 0;
|
|
|
|
pItem->mpUserData = 0;
|
|
|
|
pItem->mbVisible = TRUE;
|
|
|
|
|
|
|
|
// Item in die Liste einfuegen
|
|
|
|
mpItemList->Insert( pItem, nPos );
|
|
|
|
|
|
|
|
mbFormat = TRUE;
|
|
|
|
if ( ImplIsItemUpdate() )
|
|
|
|
Invalidate();
|
2003-03-27 16:59:30 +00:00
|
|
|
|
2006-06-19 18:40:42 +00:00
|
|
|
ImplCallEventListeners( VCLEVENT_STATUSBAR_ITEMADDED, (void*) sal_IntPtr(nItemId) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::RemoveItem( USHORT nItemId )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->Remove( nPos );
|
|
|
|
delete pItem;
|
|
|
|
|
|
|
|
mbFormat = TRUE;
|
|
|
|
if ( ImplIsItemUpdate() )
|
|
|
|
Invalidate();
|
2003-03-27 16:59:30 +00:00
|
|
|
|
2006-06-19 18:40:42 +00:00
|
|
|
ImplCallEventListeners( VCLEVENT_STATUSBAR_ITEMREMOVED, (void*) sal_IntPtr(nItemId) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::ShowItem( USHORT nItemId )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( nPos );
|
|
|
|
if ( !pItem->mbVisible )
|
|
|
|
{
|
|
|
|
pItem->mbVisible = TRUE;
|
|
|
|
|
|
|
|
mbFormat = TRUE;
|
|
|
|
if ( ImplIsItemUpdate() )
|
|
|
|
Invalidate();
|
2003-03-27 16:59:30 +00:00
|
|
|
|
2006-06-19 18:40:42 +00:00
|
|
|
ImplCallEventListeners( VCLEVENT_STATUSBAR_SHOWITEM, (void*) sal_IntPtr(nItemId) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::HideItem( USHORT nItemId )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( nPos );
|
|
|
|
if ( pItem->mbVisible )
|
|
|
|
{
|
|
|
|
pItem->mbVisible = FALSE;
|
|
|
|
|
|
|
|
mbFormat = TRUE;
|
|
|
|
if ( ImplIsItemUpdate() )
|
|
|
|
Invalidate();
|
2003-03-27 16:59:30 +00:00
|
|
|
|
2006-06-19 18:40:42 +00:00
|
|
|
ImplCallEventListeners( VCLEVENT_STATUSBAR_HIDEITEM, (void*) sal_IntPtr(nItemId) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
BOOL StatusBar::IsItemVisible( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
return mpItemList->GetObject( nPos )->mbVisible;
|
|
|
|
else
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::ShowItems()
|
|
|
|
{
|
|
|
|
if ( !mbVisibleItems )
|
|
|
|
{
|
|
|
|
mbVisibleItems = TRUE;
|
|
|
|
if ( !mbProgressMode )
|
|
|
|
Invalidate();
|
2003-03-27 16:59:30 +00:00
|
|
|
|
|
|
|
ImplCallEventListeners( VCLEVENT_STATUSBAR_SHOWALLITEMS );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::HideItems()
|
|
|
|
{
|
|
|
|
if ( mbVisibleItems )
|
|
|
|
{
|
|
|
|
mbVisibleItems = FALSE;
|
|
|
|
if ( !mbProgressMode )
|
|
|
|
Invalidate();
|
2003-03-27 16:59:30 +00:00
|
|
|
|
|
|
|
ImplCallEventListeners( VCLEVENT_STATUSBAR_HIDEALLITEMS );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::CopyItems( const StatusBar& rStatusBar )
|
|
|
|
{
|
|
|
|
// Alle Items entfernen
|
|
|
|
ImplStatusItem* pItem = mpItemList->First();
|
|
|
|
while ( pItem )
|
|
|
|
{
|
|
|
|
delete pItem;
|
|
|
|
pItem = mpItemList->Next();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Items aus der Liste loeschen
|
|
|
|
mpItemList->Clear();
|
|
|
|
|
|
|
|
// Items kopieren
|
|
|
|
ULONG i = 0;
|
|
|
|
pItem = rStatusBar.mpItemList->GetObject( i );
|
|
|
|
while ( pItem )
|
|
|
|
{
|
|
|
|
mpItemList->Insert( new ImplStatusItem( *pItem ), LIST_APPEND );
|
|
|
|
i++;
|
|
|
|
pItem = rStatusBar.mpItemList->GetObject( i );
|
|
|
|
}
|
|
|
|
|
|
|
|
mbFormat = TRUE;
|
|
|
|
if ( ImplIsItemUpdate() )
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::Clear()
|
|
|
|
{
|
|
|
|
// Alle Item loeschen
|
|
|
|
ImplStatusItem* pItem = mpItemList->First();
|
|
|
|
while ( pItem )
|
|
|
|
{
|
|
|
|
delete pItem;
|
|
|
|
pItem = mpItemList->Next();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Items aus der Liste loeschen
|
|
|
|
mpItemList->Clear();
|
|
|
|
|
|
|
|
mbFormat = TRUE;
|
|
|
|
if ( ImplIsItemUpdate() )
|
|
|
|
Invalidate();
|
2003-03-27 16:59:30 +00:00
|
|
|
|
|
|
|
ImplCallEventListeners( VCLEVENT_STATUSBAR_ALLITEMSREMOVED );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
USHORT StatusBar::GetItemCount() const
|
|
|
|
{
|
|
|
|
return (USHORT)mpItemList->Count();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
USHORT StatusBar::GetItemId( USHORT nPos ) const
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( nPos );
|
|
|
|
if ( pItem )
|
|
|
|
return pItem->mnId;
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
USHORT StatusBar::GetItemPos( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->First();
|
|
|
|
while ( pItem )
|
|
|
|
{
|
|
|
|
if ( pItem->mnId == nItemId )
|
|
|
|
return (USHORT)mpItemList->GetCurPos();
|
|
|
|
|
|
|
|
pItem = mpItemList->Next();
|
|
|
|
}
|
|
|
|
|
|
|
|
return STATUSBAR_ITEM_NOTFOUND;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
USHORT StatusBar::GetItemId( const Point& rPos ) const
|
|
|
|
{
|
|
|
|
if ( AreItemsVisible() && !mbFormat )
|
|
|
|
{
|
|
|
|
USHORT nItemCount = GetItemCount();
|
|
|
|
USHORT nPos;
|
|
|
|
for ( nPos = 0; nPos < nItemCount; nPos++ )
|
|
|
|
{
|
|
|
|
// Rechteck holen
|
|
|
|
Rectangle aRect = ImplGetItemRectPos( nPos );
|
|
|
|
if ( aRect.IsInside( rPos ) )
|
|
|
|
return mpItemList->GetObject( nPos )->mnId;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Rectangle StatusBar::GetItemRect( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
Rectangle aRect;
|
|
|
|
|
|
|
|
if ( AreItemsVisible() && !mbFormat )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
// Rechteck holen und Rahmen abziehen
|
|
|
|
aRect = ImplGetItemRectPos( nPos );
|
2010-01-13 18:31:34 +01:00
|
|
|
long nW = mpImplData->mnItemBorderWidth+1;
|
|
|
|
aRect.Top() += nW-1;
|
|
|
|
aRect.Bottom() -= nW-1;
|
|
|
|
aRect.Left() += nW;
|
|
|
|
aRect.Right() -= nW;
|
2000-09-18 16:07:07 +00:00
|
|
|
return aRect;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return aRect;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Point StatusBar::GetItemTextPos( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
if ( !mbFormat )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
// Rechteck holen
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( nPos );
|
|
|
|
Rectangle aRect = ImplGetItemRectPos( nPos );
|
2010-01-13 18:31:34 +01:00
|
|
|
long nW = mpImplData->mnItemBorderWidth + 1;
|
|
|
|
Rectangle aTextRect( aRect.Left()+nW, aRect.Top()+nW,
|
|
|
|
aRect.Right()-nW, aRect.Bottom()-nW );
|
2000-09-18 16:07:07 +00:00
|
|
|
Point aPos = ImplGetItemTextPos( aTextRect.GetSize(),
|
|
|
|
Size( GetTextWidth( pItem->maText ), GetTextHeight() ),
|
|
|
|
pItem->mnBits );
|
|
|
|
if ( !mbInUserDraw )
|
|
|
|
{
|
|
|
|
aPos.X() += aTextRect.Left();
|
|
|
|
aPos.Y() += aTextRect.Top();
|
|
|
|
}
|
|
|
|
return aPos;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return Point();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
ULONG StatusBar::GetItemWidth( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
return mpItemList->GetObject( nPos )->mnWidth;
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
StatusBarItemBits StatusBar::GetItemBits( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
return mpItemList->GetObject( nPos )->mnBits;
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
long StatusBar::GetItemOffset( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
return mpItemList->GetObject( nPos )->mnOffset;
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::SetItemText( USHORT nItemId, const XubString& rText )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( nPos );
|
|
|
|
|
|
|
|
if ( pItem->maText != rText )
|
|
|
|
{
|
|
|
|
pItem->maText = rText;
|
|
|
|
|
2005-03-23 13:06:05 +00:00
|
|
|
// adjust item width - see also DataChanged()
|
2006-01-20 11:53:14 +00:00
|
|
|
long nFudge = GetTextHeight()/4;
|
|
|
|
long nWidth = GetTextWidth( pItem->maText ) + nFudge;
|
2009-10-29 13:22:30 +00:00
|
|
|
if( (nWidth > pItem->mnWidth + STATUSBAR_OFFSET) ||
|
|
|
|
((nWidth < pItem->mnWidth) && (mnDX - STATUSBAR_OFFSET) < mnItemsWidth ))
|
|
|
|
{
|
2005-03-23 13:06:05 +00:00
|
|
|
pItem->mnWidth = nWidth + STATUSBAR_OFFSET;
|
2009-10-29 13:22:30 +00:00
|
|
|
ImplFormat();
|
|
|
|
Invalidate();
|
|
|
|
}
|
2005-03-23 13:06:05 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// Item neu Zeichen, wenn StatusBar sichtbar und
|
|
|
|
// UpdateMode gesetzt ist
|
|
|
|
if ( pItem->mbVisible && !mbFormat && ImplIsItemUpdate() )
|
|
|
|
{
|
|
|
|
Update();
|
|
|
|
ImplDrawItem( TRUE, nPos, TRUE, FALSE );
|
|
|
|
Flush();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
const XubString& StatusBar::GetItemText( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
return mpItemList->GetObject( nPos )->maText;
|
|
|
|
else
|
|
|
|
return ImplGetSVEmptyStr();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2004-09-09 15:22:11 +00:00
|
|
|
void StatusBar::SetItemCommand( USHORT nItemId, const XubString& rCommand )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( nPos );
|
|
|
|
|
|
|
|
if ( pItem->maCommand != rCommand )
|
|
|
|
pItem->maCommand = rCommand;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
const XubString& StatusBar::GetItemCommand( USHORT nItemId )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
return mpItemList->GetObject( nPos )->maCommand;
|
|
|
|
else
|
|
|
|
return ImplGetSVEmptyStr();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
void StatusBar::SetItemData( USHORT nItemId, void* pNewData )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( nPos );
|
|
|
|
pItem->mpUserData = pNewData;
|
|
|
|
|
|
|
|
// Wenn es ein User-Item ist, DrawItem-Aufrufen
|
|
|
|
if ( (pItem->mnBits & SIB_USERDRAW) && pItem->mbVisible &&
|
|
|
|
!mbFormat && ImplIsItemUpdate() )
|
|
|
|
{
|
|
|
|
Update();
|
|
|
|
ImplDrawItem( TRUE, nPos, FALSE, FALSE );
|
|
|
|
Flush();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void* StatusBar::GetItemData( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
return mpItemList->GetObject( nPos )->mpUserData;
|
|
|
|
else
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::SetHelpText( USHORT nItemId, const XubString& rText )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
mpItemList->GetObject( nPos )->maHelpText = rText;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
const XubString& StatusBar::GetHelpText( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( nPos );
|
2005-01-27 09:19:58 +00:00
|
|
|
if ( !pItem->maHelpText.Len() && ( pItem->mnHelpId || pItem->maCommand.Len() ))
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
Help* pHelp = Application::GetHelp();
|
|
|
|
if ( pHelp )
|
2005-01-27 09:19:58 +00:00
|
|
|
{
|
|
|
|
if ( pItem->maCommand.Len() )
|
|
|
|
pItem->maHelpText = pHelp->GetHelpText( pItem->maCommand, this );
|
|
|
|
if ( !pItem->maHelpText.Len() && pItem->mnHelpId )
|
|
|
|
pItem->maHelpText = pHelp->GetHelpText( pItem->mnHelpId, this );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return pItem->maHelpText;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return ImplGetSVEmptyStr();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2005-11-11 08:14:53 +00:00
|
|
|
void StatusBar::SetQuickHelpText( USHORT nItemId, const XubString& rText )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
mpItemList->GetObject( nPos )->maQuickHelpText = rText;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
const XubString& StatusBar::GetQuickHelpText( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( nPos );
|
|
|
|
return pItem->maQuickHelpText;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return ImplGetSVEmptyStr();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
void StatusBar::SetHelpId( USHORT nItemId, ULONG nHelpId )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
mpItemList->GetObject( nPos )->mnHelpId = nHelpId;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
ULONG StatusBar::GetHelpId( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
return mpItemList->GetObject( nPos )->mnHelpId;
|
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2004-11-26 15:22:23 +00:00
|
|
|
void StatusBar::ImplCalcBorder( )
|
|
|
|
{
|
|
|
|
mnCalcHeight = mnDY;
|
|
|
|
// subtract border
|
|
|
|
if( IsTopBorder() )
|
|
|
|
{
|
|
|
|
mnCalcHeight -= 2;
|
|
|
|
mnTextY += 2;
|
|
|
|
mnItemY += 2;
|
|
|
|
}
|
|
|
|
if ( IsBottomBorder() )
|
|
|
|
mnCalcHeight -= 2;
|
|
|
|
mbFormat = TRUE;
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
void StatusBar::SetBottomBorder( BOOL bBottomBorder )
|
|
|
|
{
|
|
|
|
if ( mbBottomBorder != bBottomBorder )
|
|
|
|
{
|
|
|
|
mbBottomBorder = bBottomBorder;
|
2004-11-26 15:22:23 +00:00
|
|
|
ImplCalcBorder();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void StatusBar::SetTopBorder( BOOL bTopBorder )
|
|
|
|
{
|
2010-02-04 15:26:07 +01:00
|
|
|
if ( mpImplData->mbTopBorder != static_cast<bool>(bTopBorder) )
|
2004-11-26 15:22:23 +00:00
|
|
|
{
|
2010-02-04 15:26:07 +01:00
|
|
|
mpImplData->mbTopBorder = static_cast<bool>(bTopBorder);
|
2004-11-26 15:22:23 +00:00
|
|
|
ImplCalcBorder();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2004-11-26 15:22:23 +00:00
|
|
|
BOOL StatusBar::IsTopBorder() const
|
|
|
|
{
|
|
|
|
return mpImplData->mbTopBorder;
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::StartProgressMode( const XubString& rText )
|
|
|
|
{
|
|
|
|
DBG_ASSERT( !mbProgressMode, "StatusBar::StartProgressMode(): progress mode is active" );
|
|
|
|
|
|
|
|
mbProgressMode = TRUE;
|
|
|
|
mnPercent = 0;
|
|
|
|
maPrgsTxt = rText;
|
|
|
|
|
|
|
|
// Groessen berechnen
|
|
|
|
ImplCalcProgressRect();
|
|
|
|
|
|
|
|
// Paint ausloesen (dort wird der Text und der Frame gemalt)
|
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
Color aPrgsColor = rStyleSettings.GetHighlightColor();
|
|
|
|
if ( aPrgsColor == rStyleSettings.GetFaceColor() )
|
|
|
|
aPrgsColor = rStyleSettings.GetDarkShadowColor();
|
|
|
|
SetLineColor();
|
|
|
|
SetFillColor( aPrgsColor );
|
|
|
|
if ( IsReallyVisible() )
|
|
|
|
{
|
|
|
|
Invalidate();
|
|
|
|
Update();
|
|
|
|
Flush();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::SetProgressValue( USHORT nNewPercent )
|
|
|
|
{
|
|
|
|
DBG_ASSERT( mbProgressMode, "StatusBar::SetProgressValue(): no progrss mode" );
|
|
|
|
DBG_ASSERTWARNING( nNewPercent <= 100, "StatusBar::SetProgressValue(): nPercent > 100" );
|
|
|
|
|
2008-01-14 15:22:55 +00:00
|
|
|
if ( mbProgressMode
|
|
|
|
&& IsReallyVisible()
|
|
|
|
&& (!mnPercent || (mnPercent != nNewPercent)) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
Update();
|
|
|
|
SetLineColor();
|
|
|
|
ImplDrawProgress( FALSE, mnPercent, nNewPercent );
|
|
|
|
Flush();
|
|
|
|
}
|
|
|
|
mnPercent = nNewPercent;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::EndProgressMode()
|
|
|
|
{
|
|
|
|
DBG_ASSERT( mbProgressMode, "StatusBar::EndProgressMode(): no progress mode" );
|
|
|
|
|
|
|
|
mbProgressMode = FALSE;
|
|
|
|
maPrgsTxt.Erase();
|
|
|
|
|
|
|
|
// Paint neu ausloesen um StatusBar wieder herzustellen
|
|
|
|
SetFillColor( GetSettings().GetStyleSettings().GetFaceColor() );
|
|
|
|
if ( IsReallyVisible() )
|
|
|
|
{
|
|
|
|
Invalidate();
|
|
|
|
Update();
|
|
|
|
Flush();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2002-11-20 07:43:39 +00:00
|
|
|
void StatusBar::ResetProgressMode()
|
|
|
|
{
|
|
|
|
if ( mbProgressMode )
|
|
|
|
{
|
|
|
|
mnPercent = 0;
|
|
|
|
maPrgsTxt.Erase();
|
|
|
|
if ( IsReallyVisible() )
|
|
|
|
{
|
|
|
|
Invalidate();
|
|
|
|
Update();
|
|
|
|
Flush();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
void StatusBar::SetText( const XubString& rText )
|
|
|
|
{
|
|
|
|
if ( (!mbVisibleItems || (GetStyle() & WB_RIGHT)) && !mbProgressMode &&
|
|
|
|
IsReallyVisible() && IsUpdateMode() )
|
|
|
|
{
|
|
|
|
if ( mbFormat )
|
|
|
|
{
|
|
|
|
Invalidate();
|
|
|
|
Window::SetText( rText );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Update();
|
|
|
|
long nOldTextWidth = GetTextWidth( GetText() );
|
|
|
|
Window::SetText( rText );
|
|
|
|
ImplDrawText( TRUE, nOldTextWidth );
|
|
|
|
Flush();
|
|
|
|
}
|
|
|
|
}
|
2002-11-20 07:43:39 +00:00
|
|
|
else if ( mbProgressMode )
|
|
|
|
{
|
|
|
|
maPrgsTxt = rText;
|
|
|
|
if ( IsReallyVisible() )
|
|
|
|
{
|
|
|
|
Invalidate();
|
|
|
|
Update();
|
|
|
|
Flush();
|
|
|
|
}
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
Window::SetText( rText );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Size StatusBar::CalcWindowSizePixel() const
|
|
|
|
{
|
|
|
|
ULONG i = 0;
|
|
|
|
ULONG nCount = mpItemList->Count();
|
|
|
|
long nOffset = 0;
|
|
|
|
long nCalcWidth = (STATUSBAR_OFFSET_X*2);
|
|
|
|
long nCalcHeight;
|
|
|
|
|
|
|
|
while ( i < nCount )
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( i );
|
|
|
|
nCalcWidth += pItem->mnWidth + nOffset;
|
|
|
|
nOffset = pItem->mnOffset;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
2007-08-03 13:08:49 +00:00
|
|
|
long nMinHeight = GetTextHeight();
|
2008-06-25 13:33:29 +00:00
|
|
|
const long nBarTextOffset = STATUSBAR_OFFSET_TEXTY*2;
|
|
|
|
long nProgressHeight = nMinHeight + nBarTextOffset;
|
2007-08-03 13:08:49 +00:00
|
|
|
// FIXME: IsNativeControlSupported and GetNativeControlRegion should be const ?
|
|
|
|
StatusBar* pThis = const_cast<StatusBar*>( this );
|
|
|
|
if( pThis->IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) )
|
|
|
|
{
|
|
|
|
ImplControlValue aValue;
|
2010-07-05 11:20:24 +02:00
|
|
|
Rectangle aControlRegion( (const Point&)Point(), Size( nCalcWidth, nMinHeight ) );
|
|
|
|
Rectangle aNativeControlRegion, aNativeContentRegion;
|
2007-08-03 13:08:49 +00:00
|
|
|
if( pThis->GetNativeControlRegion( CTRL_PROGRESS, PART_ENTIRE_CONTROL, aControlRegion,
|
|
|
|
CTRL_STATE_ENABLED, aValue, rtl::OUString(),
|
|
|
|
aNativeControlRegion, aNativeContentRegion ) )
|
|
|
|
{
|
2010-07-05 11:20:24 +02:00
|
|
|
nProgressHeight = aNativeControlRegion.GetHeight();
|
2007-08-03 13:08:49 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-18 15:54:29 +01:00
|
|
|
if( mpImplData->mbDrawItemFrames &&
|
|
|
|
pThis->IsNativeControlSupported( CTRL_FRAME, PART_BORDER ) )
|
2010-01-13 18:31:34 +01:00
|
|
|
{
|
|
|
|
ImplControlValue aControlValue( FRAME_DRAW_NODRAW );
|
2010-07-05 11:20:24 +02:00
|
|
|
Rectangle aBound, aContent;
|
|
|
|
Rectangle aNatRgn( Point( 0, 0 ), Size( 150, 50 ) );
|
2010-01-13 18:31:34 +01:00
|
|
|
if( pThis->GetNativeControlRegion(CTRL_FRAME, PART_BORDER,
|
|
|
|
aNatRgn, 0, aControlValue, rtl::OUString(), aBound, aContent) )
|
|
|
|
{
|
|
|
|
mpImplData->mnItemBorderWidth =
|
2010-07-05 11:20:24 +02:00
|
|
|
( aBound.GetHeight() - aContent.GetHeight() ) / 2;
|
2010-01-13 18:31:34 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
nCalcHeight = nMinHeight+nBarTextOffset + 2*mpImplData->mnItemBorderWidth;
|
2008-06-25 13:33:29 +00:00
|
|
|
if( nCalcHeight < nProgressHeight+2 )
|
|
|
|
nCalcHeight = nProgressHeight+2;
|
|
|
|
|
2004-11-26 15:22:23 +00:00
|
|
|
// add border
|
|
|
|
if( IsTopBorder() )
|
|
|
|
nCalcHeight += 2;
|
|
|
|
if ( IsBottomBorder() )
|
2000-09-18 16:07:07 +00:00
|
|
|
nCalcHeight += 2;
|
|
|
|
|
|
|
|
return Size( nCalcWidth, nCalcHeight );
|
|
|
|
}
|
2003-03-27 16:59:30 +00:00
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void StatusBar::SetAccessibleName( USHORT nItemId, const XubString& rName )
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
{
|
|
|
|
ImplStatusItem* pItem = mpItemList->GetObject( nPos );
|
|
|
|
|
|
|
|
if ( pItem->maAccessibleName != rName )
|
|
|
|
{
|
|
|
|
pItem->maAccessibleName = rName;
|
2006-06-19 18:40:42 +00:00
|
|
|
ImplCallEventListeners( VCLEVENT_STATUSBAR_NAMECHANGED, (void*) sal_IntPtr(pItem->mnId) );
|
2003-03-27 16:59:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
const XubString& StatusBar::GetAccessibleName( USHORT nItemId ) const
|
|
|
|
{
|
|
|
|
USHORT nPos = GetItemPos( nItemId );
|
|
|
|
|
|
|
|
if ( nPos != STATUSBAR_ITEM_NOTFOUND )
|
|
|
|
return mpItemList->GetObject( nPos )->maAccessibleName;
|
|
|
|
else
|
|
|
|
return ImplGetSVEmptyStr();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|