1*9f62ea84SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*9f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*9f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*9f62ea84SAndrew Rist * distributed with this work for additional information 6*9f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*9f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*9f62ea84SAndrew Rist * "License"); you may not use this file except in compliance 9*9f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*9f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*9f62ea84SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*9f62ea84SAndrew Rist * software distributed under the License is distributed on an 15*9f62ea84SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*9f62ea84SAndrew Rist * KIND, either express or implied. See the License for the 17*9f62ea84SAndrew Rist * specific language governing permissions and limitations 18*9f62ea84SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*9f62ea84SAndrew Rist *************************************************************/ 21*9f62ea84SAndrew Rist 22*9f62ea84SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_vcl.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <tools/list.hxx> 28cdf0e10cSrcweir #include <tools/debug.hxx> 29cdf0e10cSrcweir #include <tools/rc.h> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <vcl/event.hxx> 32cdf0e10cSrcweir #include <vcl/decoview.hxx> 33cdf0e10cSrcweir #include <vcl/svapp.hxx> 34cdf0e10cSrcweir #include <vcl/help.hxx> 35cdf0e10cSrcweir #include <vcl/status.hxx> 36cdf0e10cSrcweir #include <vcl/virdev.hxx> 37cdf0e10cSrcweir 38cdf0e10cSrcweir #include <svdata.hxx> 39cdf0e10cSrcweir #include <window.h> 40cdf0e10cSrcweir 41cdf0e10cSrcweir // ======================================================================= 42cdf0e10cSrcweir 43cdf0e10cSrcweir #define STATUSBAR_OFFSET_X STATUSBAR_OFFSET 44cdf0e10cSrcweir #define STATUSBAR_OFFSET_Y 2 45cdf0e10cSrcweir #define STATUSBAR_OFFSET_TEXTY 3 46cdf0e10cSrcweir 47cdf0e10cSrcweir #define STATUSBAR_PRGS_OFFSET 3 48cdf0e10cSrcweir #define STATUSBAR_PRGS_COUNT 100 49cdf0e10cSrcweir #define STATUSBAR_PRGS_MIN 5 50cdf0e10cSrcweir 51cdf0e10cSrcweir // ----------------------------------------------------------------------- 52cdf0e10cSrcweir 53cdf0e10cSrcweir class StatusBar::ImplData 54cdf0e10cSrcweir { 55cdf0e10cSrcweir public: 56cdf0e10cSrcweir ImplData(); 57cdf0e10cSrcweir ~ImplData(); 58cdf0e10cSrcweir 59cdf0e10cSrcweir VirtualDevice* mpVirDev; 60cdf0e10cSrcweir long mnItemBorderWidth; 61cdf0e10cSrcweir bool mbTopBorder:1; 62cdf0e10cSrcweir bool mbDrawItemFrames:1; 63cdf0e10cSrcweir }; 64cdf0e10cSrcweir 65cdf0e10cSrcweir StatusBar::ImplData::ImplData() 66cdf0e10cSrcweir { 67cdf0e10cSrcweir mpVirDev = NULL; 68cdf0e10cSrcweir mbTopBorder = false; 69cdf0e10cSrcweir mbDrawItemFrames = false; 70cdf0e10cSrcweir mnItemBorderWidth = 0; 71cdf0e10cSrcweir } 72cdf0e10cSrcweir 73cdf0e10cSrcweir StatusBar::ImplData::~ImplData() 74cdf0e10cSrcweir { 75cdf0e10cSrcweir } 76cdf0e10cSrcweir 77cdf0e10cSrcweir struct ImplStatusItem 78cdf0e10cSrcweir { 79cdf0e10cSrcweir sal_uInt16 mnId; 80cdf0e10cSrcweir StatusBarItemBits mnBits; 81cdf0e10cSrcweir long mnWidth; 82cdf0e10cSrcweir long mnOffset; 83cdf0e10cSrcweir long mnExtraWidth; 84cdf0e10cSrcweir long mnX; 85cdf0e10cSrcweir XubString maText; 86cdf0e10cSrcweir XubString maHelpText; 87cdf0e10cSrcweir XubString maQuickHelpText; 88cdf0e10cSrcweir rtl::OString maHelpId; 89cdf0e10cSrcweir void* mpUserData; 90cdf0e10cSrcweir sal_Bool mbVisible; 91cdf0e10cSrcweir XubString maAccessibleName; 92cdf0e10cSrcweir XubString maCommand; 93cdf0e10cSrcweir }; 94cdf0e10cSrcweir 95cdf0e10cSrcweir DECLARE_LIST( ImplStatusItemList, ImplStatusItem* ) 96cdf0e10cSrcweir 97cdf0e10cSrcweir // ======================================================================= 98cdf0e10cSrcweir 99cdf0e10cSrcweir inline long ImplCalcProgessWidth( sal_uInt16 nMax, long nSize ) 100cdf0e10cSrcweir { 101cdf0e10cSrcweir return ((nMax*(nSize+(nSize/2)))-(nSize/2)+(STATUSBAR_PRGS_OFFSET*2)); 102cdf0e10cSrcweir } 103cdf0e10cSrcweir 104cdf0e10cSrcweir // ----------------------------------------------------------------------- 105cdf0e10cSrcweir 106cdf0e10cSrcweir static Point ImplGetItemTextPos( const Size& rRectSize, const Size& rTextSize, 107cdf0e10cSrcweir sal_uInt16 nStyle ) 108cdf0e10cSrcweir { 109cdf0e10cSrcweir long nX; 110cdf0e10cSrcweir long nY; 111cdf0e10cSrcweir long delta = (rTextSize.Height()/4) + 1; 112cdf0e10cSrcweir if( delta + rTextSize.Width() > rRectSize.Width() ) 113cdf0e10cSrcweir delta = 0; 114cdf0e10cSrcweir 115cdf0e10cSrcweir if ( nStyle & SIB_LEFT ) 116cdf0e10cSrcweir nX = delta; 117cdf0e10cSrcweir else if ( nStyle & SIB_RIGHT ) 118cdf0e10cSrcweir nX = rRectSize.Width()-rTextSize.Width()-delta; 119cdf0e10cSrcweir else // SIB_CENTER 120cdf0e10cSrcweir nX = (rRectSize.Width()-rTextSize.Width())/2; 121cdf0e10cSrcweir nY = (rRectSize.Height()-rTextSize.Height())/2 + 1; 122cdf0e10cSrcweir return Point( nX, nY ); 123cdf0e10cSrcweir } 124cdf0e10cSrcweir 125cdf0e10cSrcweir // ----------------------------------------------------------------------- 126cdf0e10cSrcweir 127cdf0e10cSrcweir sal_Bool StatusBar::ImplIsItemUpdate() 128cdf0e10cSrcweir { 129cdf0e10cSrcweir if ( !mbProgressMode && mbVisibleItems && IsReallyVisible() && IsUpdateMode() ) 130cdf0e10cSrcweir return sal_True; 131cdf0e10cSrcweir else 132cdf0e10cSrcweir return sal_False; 133cdf0e10cSrcweir } 134cdf0e10cSrcweir 135cdf0e10cSrcweir // ----------------------------------------------------------------------- 136cdf0e10cSrcweir 137cdf0e10cSrcweir void StatusBar::ImplInit( Window* pParent, WinBits nStyle ) 138cdf0e10cSrcweir { 139cdf0e10cSrcweir mpImplData = new ImplData; 140cdf0e10cSrcweir 141cdf0e10cSrcweir // Default ist RightAlign 142cdf0e10cSrcweir if ( !(nStyle & (WB_LEFT | WB_RIGHT)) ) 143cdf0e10cSrcweir nStyle |= WB_RIGHT; 144cdf0e10cSrcweir 145cdf0e10cSrcweir Window::ImplInit( pParent, nStyle & ~WB_BORDER, NULL ); 146cdf0e10cSrcweir 147cdf0e10cSrcweir // WinBits merken 148cdf0e10cSrcweir mpItemList = new ImplStatusItemList; 149cdf0e10cSrcweir mpImplData->mpVirDev = new VirtualDevice( *this ); 150cdf0e10cSrcweir mnCurItemId = 0; 151cdf0e10cSrcweir mbFormat = sal_True; 152cdf0e10cSrcweir mbVisibleItems = sal_True; 153cdf0e10cSrcweir mbProgressMode = sal_False; 154cdf0e10cSrcweir mbInUserDraw = sal_False; 155cdf0e10cSrcweir mbBottomBorder = sal_False; 156cdf0e10cSrcweir mnItemsWidth = STATUSBAR_OFFSET_X; 157cdf0e10cSrcweir mnDX = 0; 158cdf0e10cSrcweir mnDY = 0; 159cdf0e10cSrcweir mnCalcHeight = 0; 160cdf0e10cSrcweir mnItemY = STATUSBAR_OFFSET_Y; 161cdf0e10cSrcweir mnTextY = STATUSBAR_OFFSET_TEXTY; 162cdf0e10cSrcweir 163cdf0e10cSrcweir ImplInitSettings( sal_True, sal_True, sal_True ); 164cdf0e10cSrcweir SetLineColor(); 165cdf0e10cSrcweir 166cdf0e10cSrcweir SetOutputSizePixel( CalcWindowSizePixel() ); 167cdf0e10cSrcweir } 168cdf0e10cSrcweir 169cdf0e10cSrcweir // ----------------------------------------------------------------------- 170cdf0e10cSrcweir 171cdf0e10cSrcweir StatusBar::StatusBar( Window* pParent, WinBits nStyle ) : 172cdf0e10cSrcweir Window( WINDOW_STATUSBAR ) 173cdf0e10cSrcweir { 174cdf0e10cSrcweir ImplInit( pParent, nStyle ); 175cdf0e10cSrcweir } 176cdf0e10cSrcweir 177cdf0e10cSrcweir // ----------------------------------------------------------------------- 178cdf0e10cSrcweir 179cdf0e10cSrcweir StatusBar::StatusBar( Window* pParent, const ResId& rResId ) : 180cdf0e10cSrcweir Window( WINDOW_STATUSBAR ) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir rResId.SetRT( RSC_STATUSBAR ); 183cdf0e10cSrcweir WinBits nStyle = ImplInitRes( rResId ); 184cdf0e10cSrcweir ImplInit( pParent, nStyle ); 185cdf0e10cSrcweir ImplLoadRes( rResId ); 186cdf0e10cSrcweir 187cdf0e10cSrcweir if ( !(nStyle & WB_HIDE) ) 188cdf0e10cSrcweir Show(); 189cdf0e10cSrcweir } 190cdf0e10cSrcweir 191cdf0e10cSrcweir // ----------------------------------------------------------------------- 192cdf0e10cSrcweir 193cdf0e10cSrcweir StatusBar::~StatusBar() 194cdf0e10cSrcweir { 195cdf0e10cSrcweir // Alle Items loeschen 196cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->First(); 197cdf0e10cSrcweir while ( pItem ) 198cdf0e10cSrcweir { 199cdf0e10cSrcweir delete pItem; 200cdf0e10cSrcweir pItem = mpItemList->Next(); 201cdf0e10cSrcweir } 202cdf0e10cSrcweir 203cdf0e10cSrcweir delete mpItemList; 204cdf0e10cSrcweir 205cdf0e10cSrcweir // VirtualDevice loeschen 206cdf0e10cSrcweir delete mpImplData->mpVirDev; 207cdf0e10cSrcweir 208cdf0e10cSrcweir delete mpImplData; 209cdf0e10cSrcweir } 210cdf0e10cSrcweir 211cdf0e10cSrcweir // ----------------------------------------------------------------------- 212cdf0e10cSrcweir 213cdf0e10cSrcweir void StatusBar::ImplInitSettings( sal_Bool bFont, 214cdf0e10cSrcweir sal_Bool bForeground, sal_Bool bBackground ) 215cdf0e10cSrcweir { 216cdf0e10cSrcweir const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 217cdf0e10cSrcweir 218cdf0e10cSrcweir if ( bFont ) 219cdf0e10cSrcweir { 220cdf0e10cSrcweir Font aFont = rStyleSettings.GetToolFont(); 221cdf0e10cSrcweir if ( IsControlFont() ) 222cdf0e10cSrcweir aFont.Merge( GetControlFont() ); 223cdf0e10cSrcweir SetZoomedPointFont( aFont ); 224cdf0e10cSrcweir } 225cdf0e10cSrcweir 226cdf0e10cSrcweir if ( bForeground || bFont ) 227cdf0e10cSrcweir { 228cdf0e10cSrcweir Color aColor; 229cdf0e10cSrcweir if ( IsControlForeground() ) 230cdf0e10cSrcweir aColor = GetControlForeground(); 231cdf0e10cSrcweir else if ( GetStyle() & WB_3DLOOK ) 232cdf0e10cSrcweir aColor = rStyleSettings.GetButtonTextColor(); 233cdf0e10cSrcweir else 234cdf0e10cSrcweir aColor = rStyleSettings.GetWindowTextColor(); 235cdf0e10cSrcweir SetTextColor( aColor ); 236cdf0e10cSrcweir SetTextFillColor(); 237cdf0e10cSrcweir 238cdf0e10cSrcweir mpImplData->mpVirDev->SetFont( GetFont() ); 239cdf0e10cSrcweir mpImplData->mpVirDev->SetTextColor( GetTextColor() ); 240cdf0e10cSrcweir mpImplData->mpVirDev->SetTextAlign( GetTextAlign() ); 241cdf0e10cSrcweir mpImplData->mpVirDev->SetTextFillColor(); 242cdf0e10cSrcweir } 243cdf0e10cSrcweir 244cdf0e10cSrcweir if ( bBackground ) 245cdf0e10cSrcweir { 246cdf0e10cSrcweir Color aColor; 247cdf0e10cSrcweir if ( IsControlBackground() ) 248cdf0e10cSrcweir aColor = GetControlBackground(); 249cdf0e10cSrcweir else if ( GetStyle() & WB_3DLOOK ) 250cdf0e10cSrcweir aColor = rStyleSettings.GetFaceColor(); 251cdf0e10cSrcweir else 252cdf0e10cSrcweir aColor = rStyleSettings.GetWindowColor(); 253cdf0e10cSrcweir SetBackground( aColor ); 254cdf0e10cSrcweir mpImplData->mpVirDev->SetBackground( GetBackground() ); 255cdf0e10cSrcweir 256cdf0e10cSrcweir // NWF background 257cdf0e10cSrcweir if( ! IsControlBackground() && 258cdf0e10cSrcweir IsNativeControlSupported( CTRL_WINDOW_BACKGROUND, PART_BACKGROUND_WINDOW ) ) 259cdf0e10cSrcweir { 260cdf0e10cSrcweir ImplGetWindowImpl()->mnNativeBackground = PART_BACKGROUND_WINDOW; 261cdf0e10cSrcweir EnableChildTransparentMode( sal_True ); 262cdf0e10cSrcweir } 263cdf0e10cSrcweir } 264cdf0e10cSrcweir } 265cdf0e10cSrcweir 266cdf0e10cSrcweir // ----------------------------------------------------------------------- 267cdf0e10cSrcweir 268cdf0e10cSrcweir void StatusBar::ImplFormat() 269cdf0e10cSrcweir { 270cdf0e10cSrcweir ImplStatusItem* pItem; 271cdf0e10cSrcweir long nExtraWidth; 272cdf0e10cSrcweir long nExtraWidth2; 273cdf0e10cSrcweir long nX; 274cdf0e10cSrcweir sal_uInt16 nAutoSizeItems = 0; 275cdf0e10cSrcweir 276cdf0e10cSrcweir // Breiten zusammenrechnen 277cdf0e10cSrcweir mnItemsWidth = STATUSBAR_OFFSET_X; 278cdf0e10cSrcweir long nOffset = 0; 279cdf0e10cSrcweir pItem = mpItemList->First(); 280cdf0e10cSrcweir while ( pItem ) 281cdf0e10cSrcweir { 282cdf0e10cSrcweir if ( pItem->mbVisible ) 283cdf0e10cSrcweir { 284cdf0e10cSrcweir if ( pItem->mnBits & SIB_AUTOSIZE ) 285cdf0e10cSrcweir nAutoSizeItems++; 286cdf0e10cSrcweir 287cdf0e10cSrcweir mnItemsWidth += pItem->mnWidth + nOffset; 288cdf0e10cSrcweir nOffset = pItem->mnOffset; 289cdf0e10cSrcweir } 290cdf0e10cSrcweir 291cdf0e10cSrcweir pItem = mpItemList->Next(); 292cdf0e10cSrcweir } 293cdf0e10cSrcweir 294cdf0e10cSrcweir if ( GetStyle() & WB_RIGHT ) 295cdf0e10cSrcweir { 296cdf0e10cSrcweir // Bei rechtsbuendiger Ausrichtung wird kein AutoSize ausgewertet, 297cdf0e10cSrcweir // da wir links den Text anzeigen, der mit SetText gesetzt wird 298cdf0e10cSrcweir nX = mnDX - mnItemsWidth; 299cdf0e10cSrcweir nExtraWidth = 0; 300cdf0e10cSrcweir nExtraWidth2 = 0; 301cdf0e10cSrcweir } 302cdf0e10cSrcweir else 303cdf0e10cSrcweir { 304cdf0e10cSrcweir mnItemsWidth += STATUSBAR_OFFSET_X; 305cdf0e10cSrcweir 306cdf0e10cSrcweir // Bei linksbuendiger Ausrichtung muessen wir gegebenenfalls noch 307cdf0e10cSrcweir // AutoSize auswerten 308cdf0e10cSrcweir if ( nAutoSizeItems && (mnDX > (mnItemsWidth - STATUSBAR_OFFSET)) ) 309cdf0e10cSrcweir { 310cdf0e10cSrcweir nExtraWidth = (mnDX - mnItemsWidth - 1) / nAutoSizeItems; 311cdf0e10cSrcweir nExtraWidth2 = (mnDX - mnItemsWidth - 1) % nAutoSizeItems; 312cdf0e10cSrcweir } 313cdf0e10cSrcweir else 314cdf0e10cSrcweir { 315cdf0e10cSrcweir nExtraWidth = 0; 316cdf0e10cSrcweir nExtraWidth2 = 0; 317cdf0e10cSrcweir } 318cdf0e10cSrcweir nX = STATUSBAR_OFFSET_X; 319cdf0e10cSrcweir if( ImplHasMirroredGraphics() && IsRTLEnabled() ) 320cdf0e10cSrcweir nX += ImplGetSVData()->maNWFData.mnStatusBarLowerRightOffset; 321cdf0e10cSrcweir } 322cdf0e10cSrcweir 323cdf0e10cSrcweir pItem = mpItemList->First(); 324cdf0e10cSrcweir while ( pItem ) 325cdf0e10cSrcweir { 326cdf0e10cSrcweir if ( pItem->mbVisible ) 327cdf0e10cSrcweir { 328cdf0e10cSrcweir if ( pItem->mnBits & SIB_AUTOSIZE ) 329cdf0e10cSrcweir { 330cdf0e10cSrcweir pItem->mnExtraWidth = nExtraWidth; 331cdf0e10cSrcweir if ( nExtraWidth2 ) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir pItem->mnExtraWidth++; 334cdf0e10cSrcweir nExtraWidth2--; 335cdf0e10cSrcweir } 336cdf0e10cSrcweir } 337cdf0e10cSrcweir else 338cdf0e10cSrcweir pItem->mnExtraWidth = 0; 339cdf0e10cSrcweir 340cdf0e10cSrcweir pItem->mnX = nX; 341cdf0e10cSrcweir nX += pItem->mnWidth + pItem->mnExtraWidth + pItem->mnOffset; 342cdf0e10cSrcweir } 343cdf0e10cSrcweir 344cdf0e10cSrcweir pItem = mpItemList->Next(); 345cdf0e10cSrcweir } 346cdf0e10cSrcweir 347cdf0e10cSrcweir mbFormat = sal_False; 348cdf0e10cSrcweir } 349cdf0e10cSrcweir 350cdf0e10cSrcweir // ----------------------------------------------------------------------- 351cdf0e10cSrcweir 352cdf0e10cSrcweir Rectangle StatusBar::ImplGetItemRectPos( sal_uInt16 nPos ) const 353cdf0e10cSrcweir { 354cdf0e10cSrcweir Rectangle aRect; 355cdf0e10cSrcweir ImplStatusItem* pItem; 356cdf0e10cSrcweir pItem = mpItemList->GetObject( nPos ); 357cdf0e10cSrcweir if ( pItem ) 358cdf0e10cSrcweir { 359cdf0e10cSrcweir if ( pItem->mbVisible ) 360cdf0e10cSrcweir { 361cdf0e10cSrcweir aRect.Left() = pItem->mnX; 362cdf0e10cSrcweir aRect.Right() = aRect.Left() + pItem->mnWidth + pItem->mnExtraWidth; 363cdf0e10cSrcweir aRect.Top() = mnItemY; 364cdf0e10cSrcweir aRect.Bottom() = mnCalcHeight - STATUSBAR_OFFSET_Y; 365cdf0e10cSrcweir if( IsTopBorder() ) 366cdf0e10cSrcweir aRect.Bottom()+=2; 367cdf0e10cSrcweir } 368cdf0e10cSrcweir } 369cdf0e10cSrcweir 370cdf0e10cSrcweir return aRect; 371cdf0e10cSrcweir } 372cdf0e10cSrcweir 373cdf0e10cSrcweir // ----------------------------------------------------------------------- 374cdf0e10cSrcweir 375cdf0e10cSrcweir sal_uInt16 StatusBar::ImplGetFirstVisiblePos() const 376cdf0e10cSrcweir { 377cdf0e10cSrcweir ImplStatusItem* pItem; 378cdf0e10cSrcweir 379cdf0e10cSrcweir for( sal_uInt16 nPos = 0; nPos < mpItemList->Count(); nPos++ ) 380cdf0e10cSrcweir { 381cdf0e10cSrcweir pItem = mpItemList->GetObject( nPos ); 382cdf0e10cSrcweir if ( pItem ) 383cdf0e10cSrcweir { 384cdf0e10cSrcweir if ( pItem->mbVisible ) 385cdf0e10cSrcweir return nPos; 386cdf0e10cSrcweir } 387cdf0e10cSrcweir } 388cdf0e10cSrcweir 389cdf0e10cSrcweir return ~0; 390cdf0e10cSrcweir } 391cdf0e10cSrcweir 392cdf0e10cSrcweir // ----------------------------------------------------------------------- 393cdf0e10cSrcweir 394cdf0e10cSrcweir void StatusBar::ImplDrawText( sal_Bool bOffScreen, long nOldTextWidth ) 395cdf0e10cSrcweir { 396cdf0e10cSrcweir // Das ueberschreiben der Item-Box verhindern 397cdf0e10cSrcweir Rectangle aTextRect; 398cdf0e10cSrcweir aTextRect.Left() = STATUSBAR_OFFSET_X+1; 399cdf0e10cSrcweir aTextRect.Top() = mnTextY; 400cdf0e10cSrcweir if ( mbVisibleItems && (GetStyle() & WB_RIGHT) ) 401cdf0e10cSrcweir aTextRect.Right() = mnDX - mnItemsWidth - 1; 402cdf0e10cSrcweir else 403cdf0e10cSrcweir aTextRect.Right() = mnDX - 1; 404cdf0e10cSrcweir if ( aTextRect.Right() > aTextRect.Left() ) 405cdf0e10cSrcweir { 406cdf0e10cSrcweir // Position ermitteln 407cdf0e10cSrcweir XubString aStr = GetText(); 408cdf0e10cSrcweir sal_uInt16 nPos = aStr.Search( _LF ); 409cdf0e10cSrcweir if ( nPos != STRING_NOTFOUND ) 410cdf0e10cSrcweir aStr.Erase( nPos ); 411cdf0e10cSrcweir 412cdf0e10cSrcweir aTextRect.Bottom() = aTextRect.Top()+GetTextHeight()+1; 413cdf0e10cSrcweir 414cdf0e10cSrcweir if ( bOffScreen ) 415cdf0e10cSrcweir { 416cdf0e10cSrcweir long nMaxWidth = Max( nOldTextWidth, GetTextWidth( aStr ) ); 417cdf0e10cSrcweir Size aVirDevSize( nMaxWidth, aTextRect.GetHeight() ); 418cdf0e10cSrcweir mpImplData->mpVirDev->SetOutputSizePixel( aVirDevSize ); 419cdf0e10cSrcweir Rectangle aTempRect = aTextRect; 420cdf0e10cSrcweir aTempRect.SetPos( Point( 0, 0 ) ); 421cdf0e10cSrcweir mpImplData->mpVirDev->DrawText( aTempRect, aStr, TEXT_DRAW_LEFT | TEXT_DRAW_TOP | TEXT_DRAW_CLIP | TEXT_DRAW_ENDELLIPSIS ); 422cdf0e10cSrcweir DrawOutDev( aTextRect.TopLeft(), aVirDevSize, Point(), aVirDevSize, *mpImplData->mpVirDev ); 423cdf0e10cSrcweir } 424cdf0e10cSrcweir else 425cdf0e10cSrcweir DrawText( aTextRect, aStr, TEXT_DRAW_LEFT | TEXT_DRAW_TOP | TEXT_DRAW_CLIP | TEXT_DRAW_ENDELLIPSIS ); 426cdf0e10cSrcweir } 427cdf0e10cSrcweir } 428cdf0e10cSrcweir 429cdf0e10cSrcweir // ----------------------------------------------------------------------- 430cdf0e10cSrcweir 431cdf0e10cSrcweir void StatusBar::ImplDrawItem( sal_Bool bOffScreen, sal_uInt16 nPos, sal_Bool bDrawText, sal_Bool bDrawFrame ) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir Rectangle aRect = ImplGetItemRectPos( nPos ); 434cdf0e10cSrcweir 435cdf0e10cSrcweir if ( aRect.IsEmpty() ) 436cdf0e10cSrcweir return; 437cdf0e10cSrcweir 438cdf0e10cSrcweir // Ausgabebereich berechnen 439cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 440cdf0e10cSrcweir long nW = mpImplData->mnItemBorderWidth + 1; 441cdf0e10cSrcweir Rectangle aTextRect( aRect.Left()+nW, aRect.Top()+nW, 442cdf0e10cSrcweir aRect.Right()-nW, aRect.Bottom()-nW ); 443cdf0e10cSrcweir Size aTextRectSize( aTextRect.GetSize() ); 444cdf0e10cSrcweir 445cdf0e10cSrcweir if ( bOffScreen ) 446cdf0e10cSrcweir mpImplData->mpVirDev->SetOutputSizePixel( aTextRectSize ); 447cdf0e10cSrcweir else 448cdf0e10cSrcweir { 449cdf0e10cSrcweir Region aRegion( aTextRect ); 450cdf0e10cSrcweir SetClipRegion( aRegion ); 451cdf0e10cSrcweir } 452cdf0e10cSrcweir 453cdf0e10cSrcweir // Text ausgeben 454cdf0e10cSrcweir if ( bDrawText ) 455cdf0e10cSrcweir { 456cdf0e10cSrcweir Size aTextSize( GetTextWidth( pItem->maText ), GetTextHeight() ); 457cdf0e10cSrcweir Point aTextPos = ImplGetItemTextPos( aTextRectSize, aTextSize, pItem->mnBits ); 458cdf0e10cSrcweir if ( bOffScreen ) 459cdf0e10cSrcweir mpImplData->mpVirDev->DrawText( aTextPos, pItem->maText ); 460cdf0e10cSrcweir else 461cdf0e10cSrcweir { 462cdf0e10cSrcweir aTextPos.X() += aTextRect.Left(); 463cdf0e10cSrcweir aTextPos.Y() += aTextRect.Top(); 464cdf0e10cSrcweir DrawText( aTextPos, pItem->maText ); 465cdf0e10cSrcweir } 466cdf0e10cSrcweir } 467cdf0e10cSrcweir 468cdf0e10cSrcweir // Gegebenenfalls auch DrawItem aufrufen 469cdf0e10cSrcweir if ( pItem->mnBits & SIB_USERDRAW ) 470cdf0e10cSrcweir { 471cdf0e10cSrcweir if ( bOffScreen ) 472cdf0e10cSrcweir { 473cdf0e10cSrcweir mbInUserDraw = sal_True; 474cdf0e10cSrcweir mpImplData->mpVirDev->EnableRTL( IsRTLEnabled() ); 475cdf0e10cSrcweir UserDrawEvent aODEvt( mpImplData->mpVirDev, Rectangle( Point(), aTextRectSize ), pItem->mnId ); 476cdf0e10cSrcweir UserDraw( aODEvt ); 477cdf0e10cSrcweir mpImplData->mpVirDev->EnableRTL( sal_False ); 478cdf0e10cSrcweir mbInUserDraw = sal_False; 479cdf0e10cSrcweir } 480cdf0e10cSrcweir else 481cdf0e10cSrcweir { 482cdf0e10cSrcweir UserDrawEvent aODEvt( this, aTextRect, pItem->mnId ); 483cdf0e10cSrcweir UserDraw( aODEvt ); 484cdf0e10cSrcweir } 485cdf0e10cSrcweir } 486cdf0e10cSrcweir 487cdf0e10cSrcweir if ( bOffScreen ) 488cdf0e10cSrcweir DrawOutDev( aTextRect.TopLeft(), aTextRectSize, Point(), aTextRectSize, *mpImplData->mpVirDev ); 489cdf0e10cSrcweir else 490cdf0e10cSrcweir SetClipRegion(); 491cdf0e10cSrcweir 492cdf0e10cSrcweir // Frame ausgeben 493cdf0e10cSrcweir if ( bDrawFrame ) 494cdf0e10cSrcweir { 495cdf0e10cSrcweir if( mpImplData->mbDrawItemFrames ) 496cdf0e10cSrcweir { 497cdf0e10cSrcweir if( !(pItem->mnBits & SIB_FLAT) ) 498cdf0e10cSrcweir { 499cdf0e10cSrcweir sal_uInt16 nStyle; 500cdf0e10cSrcweir 501cdf0e10cSrcweir if ( pItem->mnBits & SIB_IN ) 502cdf0e10cSrcweir nStyle = FRAME_DRAW_IN; 503cdf0e10cSrcweir else 504cdf0e10cSrcweir nStyle = FRAME_DRAW_OUT; 505cdf0e10cSrcweir 506cdf0e10cSrcweir DecorationView aDecoView( this ); 507cdf0e10cSrcweir aDecoView.DrawFrame( aRect, nStyle ); 508cdf0e10cSrcweir } 509cdf0e10cSrcweir } 510cdf0e10cSrcweir else if( nPos != ImplGetFirstVisiblePos() ) 511cdf0e10cSrcweir { 512cdf0e10cSrcweir // draw separator 513cdf0e10cSrcweir Point aFrom( aRect.TopLeft() ); 514cdf0e10cSrcweir aFrom.X()--; 515cdf0e10cSrcweir aFrom.Y()++; 516cdf0e10cSrcweir Point aTo( aRect.BottomLeft() ); 517cdf0e10cSrcweir aTo.X()--; 518cdf0e10cSrcweir aTo.Y()--; 519cdf0e10cSrcweir 520cdf0e10cSrcweir DecorationView aDecoView( this ); 521cdf0e10cSrcweir aDecoView.DrawSeparator( aFrom, aTo ); 522cdf0e10cSrcweir } 523cdf0e10cSrcweir } 524cdf0e10cSrcweir 525cdf0e10cSrcweir if ( !ImplIsRecordLayout() ) 526cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_STATUSBAR_DRAWITEM, (void*) sal_IntPtr(pItem->mnId) ); 527cdf0e10cSrcweir } 528cdf0e10cSrcweir 529cdf0e10cSrcweir // ----------------------------------------------------------------------- 530cdf0e10cSrcweir 531cdf0e10cSrcweir void DrawProgress( Window* pWindow, const Point& rPos, 532cdf0e10cSrcweir long nOffset, long nPrgsWidth, long nPrgsHeight, 533cdf0e10cSrcweir sal_uInt16 nPercent1, sal_uInt16 nPercent2, sal_uInt16 nPercentCount, 534cdf0e10cSrcweir const Rectangle& rFramePosSize 535cdf0e10cSrcweir ) 536cdf0e10cSrcweir { 537cdf0e10cSrcweir if( pWindow->IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) ) 538cdf0e10cSrcweir { 539cdf0e10cSrcweir bool bNeedErase = ImplGetSVData()->maNWFData.mbProgressNeedsErase; 540cdf0e10cSrcweir 541cdf0e10cSrcweir long nFullWidth = (nPrgsWidth + nOffset) * (10000 / nPercentCount); 542cdf0e10cSrcweir long nPerc = (nPercent2 > 10000) ? 10000 : nPercent2; 543cdf0e10cSrcweir ImplControlValue aValue( nFullWidth * (long)nPerc / 10000 ); 544cdf0e10cSrcweir Rectangle aDrawRect( rPos, Size( nFullWidth, nPrgsHeight ) ); 545cdf0e10cSrcweir Rectangle aControlRegion( aDrawRect ); 546cdf0e10cSrcweir if( bNeedErase ) 547cdf0e10cSrcweir { 548cdf0e10cSrcweir Window* pEraseWindow = pWindow; 549cdf0e10cSrcweir while( pEraseWindow->IsPaintTransparent() && 550cdf0e10cSrcweir ! pEraseWindow->ImplGetWindowImpl()->mbFrame ) 551cdf0e10cSrcweir { 552cdf0e10cSrcweir pEraseWindow = pEraseWindow->ImplGetWindowImpl()->mpParent; 553cdf0e10cSrcweir } 554cdf0e10cSrcweir if( pEraseWindow == pWindow ) 555cdf0e10cSrcweir // restore background of pWindow 556cdf0e10cSrcweir pEraseWindow->Erase( rFramePosSize ); 557cdf0e10cSrcweir else 558cdf0e10cSrcweir { 559cdf0e10cSrcweir // restore transparent background 560cdf0e10cSrcweir Point aTL( pWindow->OutputToAbsoluteScreenPixel( rFramePosSize.TopLeft() ) ); 561cdf0e10cSrcweir aTL = pEraseWindow->AbsoluteScreenToOutputPixel( aTL ); 562cdf0e10cSrcweir Rectangle aRect( aTL, rFramePosSize.GetSize() ); 563cdf0e10cSrcweir pEraseWindow->Invalidate( aRect, INVALIDATE_NOCHILDREN | 564cdf0e10cSrcweir INVALIDATE_NOCLIPCHILDREN | 565cdf0e10cSrcweir INVALIDATE_TRANSPARENT ); 566cdf0e10cSrcweir pEraseWindow->Update(); 567cdf0e10cSrcweir } 568cdf0e10cSrcweir pWindow->Push( PUSH_CLIPREGION ); 569cdf0e10cSrcweir pWindow->IntersectClipRegion( rFramePosSize ); 570cdf0e10cSrcweir } 571cdf0e10cSrcweir sal_Bool bNativeOK = pWindow->DrawNativeControl( CTRL_PROGRESS, PART_ENTIRE_CONTROL, aControlRegion, 572cdf0e10cSrcweir CTRL_STATE_ENABLED, aValue, rtl::OUString() ); 573cdf0e10cSrcweir if( bNeedErase ) 574cdf0e10cSrcweir pWindow->Pop(); 575cdf0e10cSrcweir if( bNativeOK ) 576cdf0e10cSrcweir { 577cdf0e10cSrcweir pWindow->Flush(); 578cdf0e10cSrcweir return; 579cdf0e10cSrcweir } 580cdf0e10cSrcweir } 581cdf0e10cSrcweir 582cdf0e10cSrcweir // Werte vorberechnen 583cdf0e10cSrcweir sal_uInt16 nPerc1 = nPercent1 / nPercentCount; 584cdf0e10cSrcweir sal_uInt16 nPerc2 = nPercent2 / nPercentCount; 585cdf0e10cSrcweir 586cdf0e10cSrcweir if ( nPerc1 > nPerc2 ) 587cdf0e10cSrcweir { 588cdf0e10cSrcweir // Support progress that can also decrease 589cdf0e10cSrcweir 590cdf0e10cSrcweir // Rechteck berechnen 591cdf0e10cSrcweir long nDX = nPrgsWidth + nOffset; 592cdf0e10cSrcweir long nLeft = rPos.X()+((nPerc1-1)*nDX); 593cdf0e10cSrcweir Rectangle aRect( nLeft, rPos.Y(), nLeft+nPrgsWidth, rPos.Y()+nPrgsHeight ); 594cdf0e10cSrcweir 595cdf0e10cSrcweir do 596cdf0e10cSrcweir { 597cdf0e10cSrcweir pWindow->Erase( aRect ); 598cdf0e10cSrcweir aRect.Left() -= nDX; 599cdf0e10cSrcweir aRect.Right() -= nDX; 600cdf0e10cSrcweir nPerc1--; 601cdf0e10cSrcweir } 602cdf0e10cSrcweir while ( nPerc1 > nPerc2 ); 603cdf0e10cSrcweir 604cdf0e10cSrcweir pWindow->Flush(); 605cdf0e10cSrcweir } 606cdf0e10cSrcweir else if ( nPerc1 < nPerc2 ) 607cdf0e10cSrcweir { 608cdf0e10cSrcweir // Percent-Rechtecke malen 609cdf0e10cSrcweir // Wenn Percent2 ueber 100%, Werte anpassen 610cdf0e10cSrcweir if ( nPercent2 > 10000 ) 611cdf0e10cSrcweir { 612cdf0e10cSrcweir nPerc2 = 10000 / nPercentCount; 613cdf0e10cSrcweir if ( nPerc1 >= nPerc2 ) 614cdf0e10cSrcweir nPerc1 = nPerc2-1; 615cdf0e10cSrcweir } 616cdf0e10cSrcweir 617cdf0e10cSrcweir // Rechteck berechnen 618cdf0e10cSrcweir long nDX = nPrgsWidth + nOffset; 619cdf0e10cSrcweir long nLeft = rPos.X()+(nPerc1*nDX); 620cdf0e10cSrcweir Rectangle aRect( nLeft, rPos.Y(), nLeft+nPrgsWidth, rPos.Y()+nPrgsHeight ); 621cdf0e10cSrcweir 622cdf0e10cSrcweir do 623cdf0e10cSrcweir { 624cdf0e10cSrcweir pWindow->DrawRect( aRect ); 625cdf0e10cSrcweir aRect.Left() += nDX; 626cdf0e10cSrcweir aRect.Right() += nDX; 627cdf0e10cSrcweir nPerc1++; 628cdf0e10cSrcweir } 629cdf0e10cSrcweir while ( nPerc1 < nPerc2 ); 630cdf0e10cSrcweir 631cdf0e10cSrcweir // Bei mehr als 100%, lassen wir das Rechteck blinken 632cdf0e10cSrcweir if ( nPercent2 > 10000 ) 633cdf0e10cSrcweir { 634cdf0e10cSrcweir // an/aus-Status festlegen 635cdf0e10cSrcweir if ( ((nPercent2 / nPercentCount) & 0x01) == (nPercentCount & 0x01) ) 636cdf0e10cSrcweir { 637cdf0e10cSrcweir aRect.Left() -= nDX; 638cdf0e10cSrcweir aRect.Right() -= nDX; 639cdf0e10cSrcweir pWindow->Erase( aRect ); 640cdf0e10cSrcweir } 641cdf0e10cSrcweir } 642cdf0e10cSrcweir 643cdf0e10cSrcweir pWindow->Flush(); 644cdf0e10cSrcweir } 645cdf0e10cSrcweir } 646cdf0e10cSrcweir 647cdf0e10cSrcweir // ----------------------------------------------------------------------- 648cdf0e10cSrcweir 649cdf0e10cSrcweir void StatusBar::ImplDrawProgress( sal_Bool bPaint, 650cdf0e10cSrcweir sal_uInt16 nPercent1, sal_uInt16 nPercent2 ) 651cdf0e10cSrcweir { 652cdf0e10cSrcweir bool bNative = IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ); 653cdf0e10cSrcweir // bPaint: draw text also, else only update progress 654cdf0e10cSrcweir if ( bPaint ) 655cdf0e10cSrcweir { 656cdf0e10cSrcweir DrawText( maPrgsTxtPos, maPrgsTxt ); 657cdf0e10cSrcweir if( ! bNative ) 658cdf0e10cSrcweir { 659cdf0e10cSrcweir DecorationView aDecoView( this ); 660cdf0e10cSrcweir aDecoView.DrawFrame( maPrgsFrameRect, FRAME_DRAW_IN ); 661cdf0e10cSrcweir } 662cdf0e10cSrcweir } 663cdf0e10cSrcweir 664cdf0e10cSrcweir Point aPos( maPrgsFrameRect.Left()+STATUSBAR_PRGS_OFFSET, 665cdf0e10cSrcweir maPrgsFrameRect.Top()+STATUSBAR_PRGS_OFFSET ); 666cdf0e10cSrcweir long nPrgsHeight = mnPrgsSize; 667cdf0e10cSrcweir if( bNative ) 668cdf0e10cSrcweir { 669cdf0e10cSrcweir aPos = maPrgsFrameRect.TopLeft(); 670cdf0e10cSrcweir nPrgsHeight = maPrgsFrameRect.GetHeight(); 671cdf0e10cSrcweir } 672cdf0e10cSrcweir DrawProgress( this, aPos, mnPrgsSize/2, mnPrgsSize, nPrgsHeight, 673cdf0e10cSrcweir nPercent1*100, nPercent2*100, mnPercentCount, maPrgsFrameRect ); 674cdf0e10cSrcweir } 675cdf0e10cSrcweir 676cdf0e10cSrcweir // ----------------------------------------------------------------------- 677cdf0e10cSrcweir 678cdf0e10cSrcweir void StatusBar::ImplCalcProgressRect() 679cdf0e10cSrcweir { 680cdf0e10cSrcweir // calculate text size 681cdf0e10cSrcweir Size aPrgsTxtSize( GetTextWidth( maPrgsTxt ), GetTextHeight() ); 682cdf0e10cSrcweir maPrgsTxtPos.X() = STATUSBAR_OFFSET_X+1; 683cdf0e10cSrcweir 684cdf0e10cSrcweir // calculate progress frame 685cdf0e10cSrcweir maPrgsFrameRect.Left() = maPrgsTxtPos.X()+aPrgsTxtSize.Width()+STATUSBAR_OFFSET; 686cdf0e10cSrcweir maPrgsFrameRect.Top() = mnItemY; 687cdf0e10cSrcweir maPrgsFrameRect.Bottom() = mnCalcHeight - STATUSBAR_OFFSET_Y; 688cdf0e10cSrcweir if( IsTopBorder() ) 689cdf0e10cSrcweir maPrgsFrameRect.Bottom()+=2; 690cdf0e10cSrcweir 691cdf0e10cSrcweir // calculate size of progress rects 692cdf0e10cSrcweir mnPrgsSize = maPrgsFrameRect.Bottom()-maPrgsFrameRect.Top()-(STATUSBAR_PRGS_OFFSET*2); 693cdf0e10cSrcweir sal_uInt16 nMaxPercent = STATUSBAR_PRGS_COUNT; 694cdf0e10cSrcweir 695cdf0e10cSrcweir long nMaxWidth = mnDX-STATUSBAR_OFFSET-1; 696cdf0e10cSrcweir 697cdf0e10cSrcweir // make smaller if there are too many rects 698cdf0e10cSrcweir while ( maPrgsFrameRect.Left()+ImplCalcProgessWidth( nMaxPercent, mnPrgsSize ) > nMaxWidth ) 699cdf0e10cSrcweir { 700cdf0e10cSrcweir nMaxPercent--; 701cdf0e10cSrcweir if ( nMaxPercent <= STATUSBAR_PRGS_MIN ) 702cdf0e10cSrcweir break; 703cdf0e10cSrcweir } 704cdf0e10cSrcweir maPrgsFrameRect.Right() = maPrgsFrameRect.Left() + ImplCalcProgessWidth( nMaxPercent, mnPrgsSize ); 705cdf0e10cSrcweir 706cdf0e10cSrcweir // save the divisor for later 707cdf0e10cSrcweir mnPercentCount = 10000 / nMaxPercent; 708cdf0e10cSrcweir sal_Bool bNativeOK = sal_False; 709cdf0e10cSrcweir if( IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) ) 710cdf0e10cSrcweir { 711cdf0e10cSrcweir ImplControlValue aValue; 712cdf0e10cSrcweir Rectangle aControlRegion( Rectangle( (const Point&)Point(), maPrgsFrameRect.GetSize() ) ); 713cdf0e10cSrcweir Rectangle aNativeControlRegion, aNativeContentRegion; 714cdf0e10cSrcweir if( (bNativeOK = GetNativeControlRegion( CTRL_PROGRESS, PART_ENTIRE_CONTROL, aControlRegion, 715cdf0e10cSrcweir CTRL_STATE_ENABLED, aValue, rtl::OUString(), 716cdf0e10cSrcweir aNativeControlRegion, aNativeContentRegion ) ) != sal_False ) 717cdf0e10cSrcweir { 718cdf0e10cSrcweir long nProgressHeight = aNativeControlRegion.GetHeight(); 719cdf0e10cSrcweir if( nProgressHeight > maPrgsFrameRect.GetHeight() ) 720cdf0e10cSrcweir { 721cdf0e10cSrcweir long nDelta = nProgressHeight - maPrgsFrameRect.GetHeight(); 722cdf0e10cSrcweir maPrgsFrameRect.Top() -= (nDelta - nDelta/2); 723cdf0e10cSrcweir maPrgsFrameRect.Bottom() += nDelta/2; 724cdf0e10cSrcweir } 725cdf0e10cSrcweir maPrgsTxtPos.Y() = maPrgsFrameRect.Top() + (nProgressHeight - GetTextHeight())/2; 726cdf0e10cSrcweir } 727cdf0e10cSrcweir } 728cdf0e10cSrcweir if( ! bNativeOK ) 729cdf0e10cSrcweir maPrgsTxtPos.Y() = mnTextY; 730cdf0e10cSrcweir } 731cdf0e10cSrcweir 732cdf0e10cSrcweir // ----------------------------------------------------------------------- 733cdf0e10cSrcweir 734cdf0e10cSrcweir void StatusBar::MouseButtonDown( const MouseEvent& rMEvt ) 735cdf0e10cSrcweir { 736cdf0e10cSrcweir // Nur bei linker Maustaste ToolBox ausloesen 737cdf0e10cSrcweir if ( rMEvt.IsLeft() ) 738cdf0e10cSrcweir { 739cdf0e10cSrcweir if ( mbVisibleItems ) 740cdf0e10cSrcweir { 741cdf0e10cSrcweir Point aMousePos = rMEvt.GetPosPixel(); 742cdf0e10cSrcweir sal_uInt16 i = 0; 743cdf0e10cSrcweir 744cdf0e10cSrcweir // Item suchen, das geklickt wurde 745cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->First(); 746cdf0e10cSrcweir while ( pItem ) 747cdf0e10cSrcweir { 748cdf0e10cSrcweir // Ist es dieses Item 749cdf0e10cSrcweir if ( ImplGetItemRectPos( i ).IsInside( aMousePos ) ) 750cdf0e10cSrcweir { 751cdf0e10cSrcweir mnCurItemId = pItem->mnId; 752cdf0e10cSrcweir if ( rMEvt.GetClicks() == 2 ) 753cdf0e10cSrcweir DoubleClick(); 754cdf0e10cSrcweir else 755cdf0e10cSrcweir Click(); 756cdf0e10cSrcweir mnCurItemId = 0; 757cdf0e10cSrcweir 758cdf0e10cSrcweir // Item wurde gefunden 759cdf0e10cSrcweir return; 760cdf0e10cSrcweir } 761cdf0e10cSrcweir 762cdf0e10cSrcweir i++; 763cdf0e10cSrcweir pItem = mpItemList->Next(); 764cdf0e10cSrcweir } 765cdf0e10cSrcweir } 766cdf0e10cSrcweir 767cdf0e10cSrcweir // Kein Item, dann nur Click oder DoubleClick 768cdf0e10cSrcweir if ( rMEvt.GetClicks() == 2 ) 769cdf0e10cSrcweir DoubleClick(); 770cdf0e10cSrcweir else 771cdf0e10cSrcweir Click(); 772cdf0e10cSrcweir } 773cdf0e10cSrcweir } 774cdf0e10cSrcweir 775cdf0e10cSrcweir // ----------------------------------------------------------------------- 776cdf0e10cSrcweir 777cdf0e10cSrcweir void StatusBar::Paint( const Rectangle& ) 778cdf0e10cSrcweir { 779cdf0e10cSrcweir if ( mbFormat ) 780cdf0e10cSrcweir ImplFormat(); 781cdf0e10cSrcweir 782cdf0e10cSrcweir sal_uInt16 nItemCount = (sal_uInt16)mpItemList->Count(); 783cdf0e10cSrcweir 784cdf0e10cSrcweir if ( mbProgressMode ) 785cdf0e10cSrcweir ImplDrawProgress( sal_True, 0, mnPercent ); 786cdf0e10cSrcweir else 787cdf0e10cSrcweir { 788cdf0e10cSrcweir // Text zeichen 789cdf0e10cSrcweir if ( !mbVisibleItems || (GetStyle() & WB_RIGHT) ) 790cdf0e10cSrcweir ImplDrawText( sal_False, 0 ); 791cdf0e10cSrcweir 792cdf0e10cSrcweir // Items zeichnen 793cdf0e10cSrcweir if ( mbVisibleItems ) 794cdf0e10cSrcweir { 795cdf0e10cSrcweir // Items zeichnen 796cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < nItemCount; i++ ) 797cdf0e10cSrcweir ImplDrawItem( sal_False, i, sal_True, sal_True ); 798cdf0e10cSrcweir } 799cdf0e10cSrcweir } 800cdf0e10cSrcweir 801cdf0e10cSrcweir // draw borders 802cdf0e10cSrcweir if( IsTopBorder() ) 803cdf0e10cSrcweir { 804cdf0e10cSrcweir const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 805cdf0e10cSrcweir SetLineColor( rStyleSettings.GetShadowColor() ); 806cdf0e10cSrcweir DrawLine( Point( 0, 0 ), Point( mnDX-1, 0 ) ); 807cdf0e10cSrcweir SetLineColor( rStyleSettings.GetLightColor() ); 808cdf0e10cSrcweir DrawLine( Point( 0, 1 ), Point( mnDX-1, 1 ) ); 809cdf0e10cSrcweir } 810cdf0e10cSrcweir 811cdf0e10cSrcweir if ( IsBottomBorder() ) 812cdf0e10cSrcweir { 813cdf0e10cSrcweir const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 814cdf0e10cSrcweir SetLineColor( rStyleSettings.GetShadowColor() ); 815cdf0e10cSrcweir DrawLine( Point( 0, mnDY-2 ), Point( mnDX-1, mnDY-2 ) ); 816cdf0e10cSrcweir SetLineColor( rStyleSettings.GetLightColor() ); 817cdf0e10cSrcweir DrawLine( Point( 0, mnDY-1 ), Point( mnDX-1, mnDY-1 ) ); 818cdf0e10cSrcweir } 819cdf0e10cSrcweir } 820cdf0e10cSrcweir 821cdf0e10cSrcweir // ----------------------------------------------------------------------- 822cdf0e10cSrcweir 823cdf0e10cSrcweir void StatusBar::Move() 824cdf0e10cSrcweir { 825cdf0e10cSrcweir Window::Move(); 826cdf0e10cSrcweir } 827cdf0e10cSrcweir 828cdf0e10cSrcweir // ----------------------------------------------------------------------- 829cdf0e10cSrcweir 830cdf0e10cSrcweir void StatusBar::Resize() 831cdf0e10cSrcweir { 832cdf0e10cSrcweir // Breite und Hoehe abfragen und merken 833cdf0e10cSrcweir Size aSize = GetOutputSizePixel(); 834cdf0e10cSrcweir mnDX = aSize.Width() - ImplGetSVData()->maNWFData.mnStatusBarLowerRightOffset; 835cdf0e10cSrcweir mnDY = aSize.Height(); 836cdf0e10cSrcweir mnCalcHeight = mnDY; 837cdf0e10cSrcweir // subtract border 838cdf0e10cSrcweir if( IsTopBorder() ) 839cdf0e10cSrcweir mnCalcHeight -= 2; 840cdf0e10cSrcweir if ( IsBottomBorder() ) 841cdf0e10cSrcweir mnCalcHeight -= 2; 842cdf0e10cSrcweir 843cdf0e10cSrcweir mnItemY = STATUSBAR_OFFSET_Y; 844cdf0e10cSrcweir if( IsTopBorder() ) 845cdf0e10cSrcweir mnItemY += 2; 846cdf0e10cSrcweir mnTextY = (mnCalcHeight-GetTextHeight())/2; 847cdf0e10cSrcweir if( IsTopBorder() ) 848cdf0e10cSrcweir mnTextY += 2; 849cdf0e10cSrcweir 850cdf0e10cSrcweir // Formatierung neu ausloesen 851cdf0e10cSrcweir mbFormat = sal_True; 852cdf0e10cSrcweir 853cdf0e10cSrcweir if ( mbProgressMode ) 854cdf0e10cSrcweir ImplCalcProgressRect(); 855cdf0e10cSrcweir 856cdf0e10cSrcweir Invalidate(); 857cdf0e10cSrcweir } 858cdf0e10cSrcweir 859cdf0e10cSrcweir // ----------------------------------------------------------------------- 860cdf0e10cSrcweir 861cdf0e10cSrcweir void StatusBar::RequestHelp( const HelpEvent& rHEvt ) 862cdf0e10cSrcweir { 863cdf0e10cSrcweir // no keyboard help in status bar 864cdf0e10cSrcweir if( rHEvt.KeyboardActivated() ) 865cdf0e10cSrcweir return; 866cdf0e10cSrcweir 867cdf0e10cSrcweir sal_uInt16 nItemId = GetItemId( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) ); 868cdf0e10cSrcweir 869cdf0e10cSrcweir if ( nItemId ) 870cdf0e10cSrcweir { 871cdf0e10cSrcweir Rectangle aItemRect = GetItemRect( nItemId ); 872cdf0e10cSrcweir Point aPt = OutputToScreenPixel( aItemRect.TopLeft() ); 873cdf0e10cSrcweir aItemRect.Left() = aPt.X(); 874cdf0e10cSrcweir aItemRect.Top() = aPt.Y(); 875cdf0e10cSrcweir aPt = OutputToScreenPixel( aItemRect.BottomRight() ); 876cdf0e10cSrcweir aItemRect.Right() = aPt.X(); 877cdf0e10cSrcweir aItemRect.Bottom() = aPt.Y(); 878cdf0e10cSrcweir 879cdf0e10cSrcweir if ( rHEvt.GetMode() & HELPMODE_BALLOON ) 880cdf0e10cSrcweir { 881cdf0e10cSrcweir XubString aStr = GetHelpText( nItemId ); 882cdf0e10cSrcweir Help::ShowBalloon( this, aItemRect.Center(), aItemRect, aStr ); 883cdf0e10cSrcweir return; 884cdf0e10cSrcweir } 885cdf0e10cSrcweir else if ( rHEvt.GetMode() & HELPMODE_QUICK ) 886cdf0e10cSrcweir { 887cdf0e10cSrcweir XubString aStr = GetQuickHelpText( nItemId ); 888cdf0e10cSrcweir // Show quickhelp if available 889cdf0e10cSrcweir if( aStr.Len() ) 890cdf0e10cSrcweir { 891cdf0e10cSrcweir Help::ShowQuickHelp( this, aItemRect, aStr ); 892cdf0e10cSrcweir return; 893cdf0e10cSrcweir } 894cdf0e10cSrcweir aStr = GetItemText( nItemId ); 895cdf0e10cSrcweir // show a quick help if item text doesn't fit 896cdf0e10cSrcweir if ( GetTextWidth( aStr ) > aItemRect.GetWidth() ) 897cdf0e10cSrcweir { 898cdf0e10cSrcweir Help::ShowQuickHelp( this, aItemRect, aStr ); 899cdf0e10cSrcweir return; 900cdf0e10cSrcweir } 901cdf0e10cSrcweir } 902cdf0e10cSrcweir else if ( rHEvt.GetMode() & HELPMODE_EXTENDED ) 903cdf0e10cSrcweir { 904cdf0e10cSrcweir String aCommand = GetItemCommand( nItemId ); 905cdf0e10cSrcweir rtl::OString aHelpId( GetHelpId( nItemId ) ); 906cdf0e10cSrcweir 907cdf0e10cSrcweir if ( aCommand.Len() || aHelpId.getLength() ) 908cdf0e10cSrcweir { 909cdf0e10cSrcweir // Wenn eine Hilfe existiert, dann ausloesen 910cdf0e10cSrcweir Help* pHelp = Application::GetHelp(); 911cdf0e10cSrcweir if ( pHelp ) 912cdf0e10cSrcweir { 913cdf0e10cSrcweir if ( aCommand.Len() ) 914cdf0e10cSrcweir pHelp->Start( aCommand, this ); 915cdf0e10cSrcweir else if ( aHelpId.getLength() ) 916cdf0e10cSrcweir pHelp->Start( rtl::OStringToOUString( aHelpId, RTL_TEXTENCODING_UTF8 ), this ); 917cdf0e10cSrcweir } 918cdf0e10cSrcweir return; 919cdf0e10cSrcweir } 920cdf0e10cSrcweir } 921cdf0e10cSrcweir } 922cdf0e10cSrcweir 923cdf0e10cSrcweir Window::RequestHelp( rHEvt ); 924cdf0e10cSrcweir } 925cdf0e10cSrcweir 926cdf0e10cSrcweir // ----------------------------------------------------------------------- 927cdf0e10cSrcweir 928cdf0e10cSrcweir void StatusBar::StateChanged( StateChangedType nType ) 929cdf0e10cSrcweir { 930cdf0e10cSrcweir Window::StateChanged( nType ); 931cdf0e10cSrcweir 932cdf0e10cSrcweir if ( nType == STATE_CHANGE_INITSHOW ) 933cdf0e10cSrcweir ImplFormat(); 934cdf0e10cSrcweir else if ( nType == STATE_CHANGE_UPDATEMODE ) 935cdf0e10cSrcweir Invalidate(); 936cdf0e10cSrcweir else if ( (nType == STATE_CHANGE_ZOOM) || 937cdf0e10cSrcweir (nType == STATE_CHANGE_CONTROLFONT) ) 938cdf0e10cSrcweir { 939cdf0e10cSrcweir mbFormat = sal_True; 940cdf0e10cSrcweir ImplInitSettings( sal_True, sal_False, sal_False ); 941cdf0e10cSrcweir Invalidate(); 942cdf0e10cSrcweir } 943cdf0e10cSrcweir else if ( nType == STATE_CHANGE_CONTROLFOREGROUND ) 944cdf0e10cSrcweir { 945cdf0e10cSrcweir ImplInitSettings( sal_False, sal_True, sal_False ); 946cdf0e10cSrcweir Invalidate(); 947cdf0e10cSrcweir } 948cdf0e10cSrcweir else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) 949cdf0e10cSrcweir { 950cdf0e10cSrcweir ImplInitSettings( sal_False, sal_False, sal_True ); 951cdf0e10cSrcweir Invalidate(); 952cdf0e10cSrcweir } 953cdf0e10cSrcweir } 954cdf0e10cSrcweir 955cdf0e10cSrcweir // ----------------------------------------------------------------------- 956cdf0e10cSrcweir 957cdf0e10cSrcweir void StatusBar::DataChanged( const DataChangedEvent& rDCEvt ) 958cdf0e10cSrcweir { 959cdf0e10cSrcweir Window::DataChanged( rDCEvt ); 960cdf0e10cSrcweir 961cdf0e10cSrcweir if ( (rDCEvt.GetType() == DATACHANGED_DISPLAY) || 962cdf0e10cSrcweir (rDCEvt.GetType() == DATACHANGED_FONTS) || 963cdf0e10cSrcweir (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) || 964cdf0e10cSrcweir ((rDCEvt.GetType() == DATACHANGED_SETTINGS) && 965cdf0e10cSrcweir (rDCEvt.GetFlags() & SETTINGS_STYLE)) ) 966cdf0e10cSrcweir { 967cdf0e10cSrcweir mbFormat = sal_True; 968cdf0e10cSrcweir ImplInitSettings( sal_True, sal_True, sal_True ); 969cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->First(); 970cdf0e10cSrcweir long nFudge = GetTextHeight() / 4; 971cdf0e10cSrcweir while ( pItem ) 972cdf0e10cSrcweir { 973cdf0e10cSrcweir long nWidth = GetTextWidth( pItem->maText ) + nFudge; 974cdf0e10cSrcweir if( nWidth > pItem->mnWidth + STATUSBAR_OFFSET ) 975cdf0e10cSrcweir pItem->mnWidth = nWidth + STATUSBAR_OFFSET; 976cdf0e10cSrcweir pItem = mpItemList->Next(); 977cdf0e10cSrcweir } 978cdf0e10cSrcweir Size aSize = GetSizePixel(); 979cdf0e10cSrcweir // do not disturb current width, since 980cdf0e10cSrcweir // CalcWindowSizePixel calculates a minimum width 981cdf0e10cSrcweir aSize.Height() = CalcWindowSizePixel().Height(); 982cdf0e10cSrcweir SetSizePixel( aSize ); 983cdf0e10cSrcweir Invalidate(); 984cdf0e10cSrcweir } 985cdf0e10cSrcweir } 986cdf0e10cSrcweir 987cdf0e10cSrcweir // ----------------------------------------------------------------------- 988cdf0e10cSrcweir 989cdf0e10cSrcweir void StatusBar::Click() 990cdf0e10cSrcweir { 991cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_STATUSBAR_CLICK ); 992cdf0e10cSrcweir maClickHdl.Call( this ); 993cdf0e10cSrcweir } 994cdf0e10cSrcweir 995cdf0e10cSrcweir // ----------------------------------------------------------------------- 996cdf0e10cSrcweir 997cdf0e10cSrcweir void StatusBar::DoubleClick() 998cdf0e10cSrcweir { 999cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_STATUSBAR_DOUBLECLICK ); 1000cdf0e10cSrcweir maDoubleClickHdl.Call( this ); 1001cdf0e10cSrcweir } 1002cdf0e10cSrcweir 1003cdf0e10cSrcweir // ----------------------------------------------------------------------- 1004cdf0e10cSrcweir 1005cdf0e10cSrcweir void StatusBar::UserDraw( const UserDrawEvent& ) 1006cdf0e10cSrcweir { 1007cdf0e10cSrcweir } 1008cdf0e10cSrcweir 1009cdf0e10cSrcweir // ----------------------------------------------------------------------- 1010cdf0e10cSrcweir 1011cdf0e10cSrcweir void StatusBar::InsertItem( sal_uInt16 nItemId, sal_uLong nWidth, 1012cdf0e10cSrcweir StatusBarItemBits nBits, 1013cdf0e10cSrcweir long nOffset, sal_uInt16 nPos ) 1014cdf0e10cSrcweir { 1015cdf0e10cSrcweir DBG_ASSERT( nItemId, "StatusBar::InsertItem(): ItemId == 0" ); 1016cdf0e10cSrcweir DBG_ASSERT( GetItemPos( nItemId ) == STATUSBAR_ITEM_NOTFOUND, 1017cdf0e10cSrcweir "StatusBar::InsertItem(): ItemId already exists" ); 1018cdf0e10cSrcweir 1019cdf0e10cSrcweir // IN und CENTER sind Default 1020cdf0e10cSrcweir if ( !(nBits & (SIB_IN | SIB_OUT | SIB_FLAT)) ) 1021cdf0e10cSrcweir nBits |= SIB_IN; 1022cdf0e10cSrcweir if ( !(nBits & (SIB_LEFT | SIB_RIGHT | SIB_CENTER)) ) 1023cdf0e10cSrcweir nBits |= SIB_CENTER; 1024cdf0e10cSrcweir 1025cdf0e10cSrcweir // Item anlegen 1026cdf0e10cSrcweir long nFudge = GetTextHeight()/4; 1027cdf0e10cSrcweir ImplStatusItem* pItem = new ImplStatusItem; 1028cdf0e10cSrcweir pItem->mnId = nItemId; 1029cdf0e10cSrcweir pItem->mnBits = nBits; 1030cdf0e10cSrcweir pItem->mnWidth = (long)nWidth+nFudge+STATUSBAR_OFFSET; 1031cdf0e10cSrcweir pItem->mnOffset = nOffset; 1032cdf0e10cSrcweir pItem->mpUserData = 0; 1033cdf0e10cSrcweir pItem->mbVisible = sal_True; 1034cdf0e10cSrcweir 1035cdf0e10cSrcweir // Item in die Liste einfuegen 1036cdf0e10cSrcweir mpItemList->Insert( pItem, nPos ); 1037cdf0e10cSrcweir 1038cdf0e10cSrcweir mbFormat = sal_True; 1039cdf0e10cSrcweir if ( ImplIsItemUpdate() ) 1040cdf0e10cSrcweir Invalidate(); 1041cdf0e10cSrcweir 1042cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_STATUSBAR_ITEMADDED, (void*) sal_IntPtr(nItemId) ); 1043cdf0e10cSrcweir } 1044cdf0e10cSrcweir 1045cdf0e10cSrcweir // ----------------------------------------------------------------------- 1046cdf0e10cSrcweir 1047cdf0e10cSrcweir void StatusBar::RemoveItem( sal_uInt16 nItemId ) 1048cdf0e10cSrcweir { 1049cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1050cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1051cdf0e10cSrcweir { 1052cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->Remove( nPos ); 1053cdf0e10cSrcweir delete pItem; 1054cdf0e10cSrcweir 1055cdf0e10cSrcweir mbFormat = sal_True; 1056cdf0e10cSrcweir if ( ImplIsItemUpdate() ) 1057cdf0e10cSrcweir Invalidate(); 1058cdf0e10cSrcweir 1059cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_STATUSBAR_ITEMREMOVED, (void*) sal_IntPtr(nItemId) ); 1060cdf0e10cSrcweir } 1061cdf0e10cSrcweir } 1062cdf0e10cSrcweir 1063cdf0e10cSrcweir // ----------------------------------------------------------------------- 1064cdf0e10cSrcweir 1065cdf0e10cSrcweir void StatusBar::ShowItem( sal_uInt16 nItemId ) 1066cdf0e10cSrcweir { 1067cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1068cdf0e10cSrcweir 1069cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1070cdf0e10cSrcweir { 1071cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 1072cdf0e10cSrcweir if ( !pItem->mbVisible ) 1073cdf0e10cSrcweir { 1074cdf0e10cSrcweir pItem->mbVisible = sal_True; 1075cdf0e10cSrcweir 1076cdf0e10cSrcweir mbFormat = sal_True; 1077cdf0e10cSrcweir if ( ImplIsItemUpdate() ) 1078cdf0e10cSrcweir Invalidate(); 1079cdf0e10cSrcweir 1080cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_STATUSBAR_SHOWITEM, (void*) sal_IntPtr(nItemId) ); 1081cdf0e10cSrcweir } 1082cdf0e10cSrcweir } 1083cdf0e10cSrcweir } 1084cdf0e10cSrcweir 1085cdf0e10cSrcweir // ----------------------------------------------------------------------- 1086cdf0e10cSrcweir 1087cdf0e10cSrcweir void StatusBar::HideItem( sal_uInt16 nItemId ) 1088cdf0e10cSrcweir { 1089cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1090cdf0e10cSrcweir 1091cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1092cdf0e10cSrcweir { 1093cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 1094cdf0e10cSrcweir if ( pItem->mbVisible ) 1095cdf0e10cSrcweir { 1096cdf0e10cSrcweir pItem->mbVisible = sal_False; 1097cdf0e10cSrcweir 1098cdf0e10cSrcweir mbFormat = sal_True; 1099cdf0e10cSrcweir if ( ImplIsItemUpdate() ) 1100cdf0e10cSrcweir Invalidate(); 1101cdf0e10cSrcweir 1102cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_STATUSBAR_HIDEITEM, (void*) sal_IntPtr(nItemId) ); 1103cdf0e10cSrcweir } 1104cdf0e10cSrcweir } 1105cdf0e10cSrcweir } 1106cdf0e10cSrcweir 1107cdf0e10cSrcweir // ----------------------------------------------------------------------- 1108cdf0e10cSrcweir 1109cdf0e10cSrcweir sal_Bool StatusBar::IsItemVisible( sal_uInt16 nItemId ) const 1110cdf0e10cSrcweir { 1111cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1112cdf0e10cSrcweir 1113cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1114cdf0e10cSrcweir return mpItemList->GetObject( nPos )->mbVisible; 1115cdf0e10cSrcweir else 1116cdf0e10cSrcweir return sal_False; 1117cdf0e10cSrcweir } 1118cdf0e10cSrcweir 1119cdf0e10cSrcweir // ----------------------------------------------------------------------- 1120cdf0e10cSrcweir 1121cdf0e10cSrcweir void StatusBar::ShowItems() 1122cdf0e10cSrcweir { 1123cdf0e10cSrcweir if ( !mbVisibleItems ) 1124cdf0e10cSrcweir { 1125cdf0e10cSrcweir mbVisibleItems = sal_True; 1126cdf0e10cSrcweir if ( !mbProgressMode ) 1127cdf0e10cSrcweir Invalidate(); 1128cdf0e10cSrcweir 1129cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_STATUSBAR_SHOWALLITEMS ); 1130cdf0e10cSrcweir } 1131cdf0e10cSrcweir } 1132cdf0e10cSrcweir 1133cdf0e10cSrcweir // ----------------------------------------------------------------------- 1134cdf0e10cSrcweir 1135cdf0e10cSrcweir void StatusBar::HideItems() 1136cdf0e10cSrcweir { 1137cdf0e10cSrcweir if ( mbVisibleItems ) 1138cdf0e10cSrcweir { 1139cdf0e10cSrcweir mbVisibleItems = sal_False; 1140cdf0e10cSrcweir if ( !mbProgressMode ) 1141cdf0e10cSrcweir Invalidate(); 1142cdf0e10cSrcweir 1143cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_STATUSBAR_HIDEALLITEMS ); 1144cdf0e10cSrcweir } 1145cdf0e10cSrcweir } 1146cdf0e10cSrcweir 1147cdf0e10cSrcweir // ----------------------------------------------------------------------- 1148cdf0e10cSrcweir 1149cdf0e10cSrcweir void StatusBar::CopyItems( const StatusBar& rStatusBar ) 1150cdf0e10cSrcweir { 1151cdf0e10cSrcweir // Alle Items entfernen 1152cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->First(); 1153cdf0e10cSrcweir while ( pItem ) 1154cdf0e10cSrcweir { 1155cdf0e10cSrcweir delete pItem; 1156cdf0e10cSrcweir pItem = mpItemList->Next(); 1157cdf0e10cSrcweir } 1158cdf0e10cSrcweir 1159cdf0e10cSrcweir // Items aus der Liste loeschen 1160cdf0e10cSrcweir mpItemList->Clear(); 1161cdf0e10cSrcweir 1162cdf0e10cSrcweir // Items kopieren 1163cdf0e10cSrcweir sal_uLong i = 0; 1164cdf0e10cSrcweir pItem = rStatusBar.mpItemList->GetObject( i ); 1165cdf0e10cSrcweir while ( pItem ) 1166cdf0e10cSrcweir { 1167cdf0e10cSrcweir mpItemList->Insert( new ImplStatusItem( *pItem ), LIST_APPEND ); 1168cdf0e10cSrcweir i++; 1169cdf0e10cSrcweir pItem = rStatusBar.mpItemList->GetObject( i ); 1170cdf0e10cSrcweir } 1171cdf0e10cSrcweir 1172cdf0e10cSrcweir mbFormat = sal_True; 1173cdf0e10cSrcweir if ( ImplIsItemUpdate() ) 1174cdf0e10cSrcweir Invalidate(); 1175cdf0e10cSrcweir } 1176cdf0e10cSrcweir 1177cdf0e10cSrcweir // ----------------------------------------------------------------------- 1178cdf0e10cSrcweir 1179cdf0e10cSrcweir void StatusBar::Clear() 1180cdf0e10cSrcweir { 1181cdf0e10cSrcweir // Alle Item loeschen 1182cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->First(); 1183cdf0e10cSrcweir while ( pItem ) 1184cdf0e10cSrcweir { 1185cdf0e10cSrcweir delete pItem; 1186cdf0e10cSrcweir pItem = mpItemList->Next(); 1187cdf0e10cSrcweir } 1188cdf0e10cSrcweir 1189cdf0e10cSrcweir // Items aus der Liste loeschen 1190cdf0e10cSrcweir mpItemList->Clear(); 1191cdf0e10cSrcweir 1192cdf0e10cSrcweir mbFormat = sal_True; 1193cdf0e10cSrcweir if ( ImplIsItemUpdate() ) 1194cdf0e10cSrcweir Invalidate(); 1195cdf0e10cSrcweir 1196cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_STATUSBAR_ALLITEMSREMOVED ); 1197cdf0e10cSrcweir } 1198cdf0e10cSrcweir 1199cdf0e10cSrcweir // ----------------------------------------------------------------------- 1200cdf0e10cSrcweir 1201cdf0e10cSrcweir sal_uInt16 StatusBar::GetItemCount() const 1202cdf0e10cSrcweir { 1203cdf0e10cSrcweir return (sal_uInt16)mpItemList->Count(); 1204cdf0e10cSrcweir } 1205cdf0e10cSrcweir 1206cdf0e10cSrcweir // ----------------------------------------------------------------------- 1207cdf0e10cSrcweir 1208cdf0e10cSrcweir sal_uInt16 StatusBar::GetItemId( sal_uInt16 nPos ) const 1209cdf0e10cSrcweir { 1210cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 1211cdf0e10cSrcweir if ( pItem ) 1212cdf0e10cSrcweir return pItem->mnId; 1213cdf0e10cSrcweir else 1214cdf0e10cSrcweir return 0; 1215cdf0e10cSrcweir } 1216cdf0e10cSrcweir 1217cdf0e10cSrcweir // ----------------------------------------------------------------------- 1218cdf0e10cSrcweir 1219cdf0e10cSrcweir sal_uInt16 StatusBar::GetItemPos( sal_uInt16 nItemId ) const 1220cdf0e10cSrcweir { 1221cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->First(); 1222cdf0e10cSrcweir while ( pItem ) 1223cdf0e10cSrcweir { 1224cdf0e10cSrcweir if ( pItem->mnId == nItemId ) 1225cdf0e10cSrcweir return (sal_uInt16)mpItemList->GetCurPos(); 1226cdf0e10cSrcweir 1227cdf0e10cSrcweir pItem = mpItemList->Next(); 1228cdf0e10cSrcweir } 1229cdf0e10cSrcweir 1230cdf0e10cSrcweir return STATUSBAR_ITEM_NOTFOUND; 1231cdf0e10cSrcweir } 1232cdf0e10cSrcweir 1233cdf0e10cSrcweir // ----------------------------------------------------------------------- 1234cdf0e10cSrcweir 1235cdf0e10cSrcweir sal_uInt16 StatusBar::GetItemId( const Point& rPos ) const 1236cdf0e10cSrcweir { 1237cdf0e10cSrcweir if ( AreItemsVisible() && !mbFormat ) 1238cdf0e10cSrcweir { 1239cdf0e10cSrcweir sal_uInt16 nItemCount = GetItemCount(); 1240cdf0e10cSrcweir sal_uInt16 nPos; 1241cdf0e10cSrcweir for ( nPos = 0; nPos < nItemCount; nPos++ ) 1242cdf0e10cSrcweir { 1243cdf0e10cSrcweir // Rechteck holen 1244cdf0e10cSrcweir Rectangle aRect = ImplGetItemRectPos( nPos ); 1245cdf0e10cSrcweir if ( aRect.IsInside( rPos ) ) 1246cdf0e10cSrcweir return mpItemList->GetObject( nPos )->mnId; 1247cdf0e10cSrcweir } 1248cdf0e10cSrcweir } 1249cdf0e10cSrcweir 1250cdf0e10cSrcweir return 0; 1251cdf0e10cSrcweir } 1252cdf0e10cSrcweir 1253cdf0e10cSrcweir // ----------------------------------------------------------------------- 1254cdf0e10cSrcweir 1255cdf0e10cSrcweir Rectangle StatusBar::GetItemRect( sal_uInt16 nItemId ) const 1256cdf0e10cSrcweir { 1257cdf0e10cSrcweir Rectangle aRect; 1258cdf0e10cSrcweir 1259cdf0e10cSrcweir if ( AreItemsVisible() && !mbFormat ) 1260cdf0e10cSrcweir { 1261cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1262cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1263cdf0e10cSrcweir { 1264cdf0e10cSrcweir // Rechteck holen und Rahmen abziehen 1265cdf0e10cSrcweir aRect = ImplGetItemRectPos( nPos ); 1266cdf0e10cSrcweir long nW = mpImplData->mnItemBorderWidth+1; 1267cdf0e10cSrcweir aRect.Top() += nW-1; 1268cdf0e10cSrcweir aRect.Bottom() -= nW-1; 1269cdf0e10cSrcweir aRect.Left() += nW; 1270cdf0e10cSrcweir aRect.Right() -= nW; 1271cdf0e10cSrcweir return aRect; 1272cdf0e10cSrcweir } 1273cdf0e10cSrcweir } 1274cdf0e10cSrcweir 1275cdf0e10cSrcweir return aRect; 1276cdf0e10cSrcweir } 1277cdf0e10cSrcweir 1278cdf0e10cSrcweir // ----------------------------------------------------------------------- 1279cdf0e10cSrcweir 1280cdf0e10cSrcweir Point StatusBar::GetItemTextPos( sal_uInt16 nItemId ) const 1281cdf0e10cSrcweir { 1282cdf0e10cSrcweir if ( !mbFormat ) 1283cdf0e10cSrcweir { 1284cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1285cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1286cdf0e10cSrcweir { 1287cdf0e10cSrcweir // Rechteck holen 1288cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 1289cdf0e10cSrcweir Rectangle aRect = ImplGetItemRectPos( nPos ); 1290cdf0e10cSrcweir long nW = mpImplData->mnItemBorderWidth + 1; 1291cdf0e10cSrcweir Rectangle aTextRect( aRect.Left()+nW, aRect.Top()+nW, 1292cdf0e10cSrcweir aRect.Right()-nW, aRect.Bottom()-nW ); 1293cdf0e10cSrcweir Point aPos = ImplGetItemTextPos( aTextRect.GetSize(), 1294cdf0e10cSrcweir Size( GetTextWidth( pItem->maText ), GetTextHeight() ), 1295cdf0e10cSrcweir pItem->mnBits ); 1296cdf0e10cSrcweir if ( !mbInUserDraw ) 1297cdf0e10cSrcweir { 1298cdf0e10cSrcweir aPos.X() += aTextRect.Left(); 1299cdf0e10cSrcweir aPos.Y() += aTextRect.Top(); 1300cdf0e10cSrcweir } 1301cdf0e10cSrcweir return aPos; 1302cdf0e10cSrcweir } 1303cdf0e10cSrcweir } 1304cdf0e10cSrcweir 1305cdf0e10cSrcweir return Point(); 1306cdf0e10cSrcweir } 1307cdf0e10cSrcweir 1308cdf0e10cSrcweir // ----------------------------------------------------------------------- 1309cdf0e10cSrcweir 1310cdf0e10cSrcweir sal_uLong StatusBar::GetItemWidth( sal_uInt16 nItemId ) const 1311cdf0e10cSrcweir { 1312cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1313cdf0e10cSrcweir 1314cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1315cdf0e10cSrcweir return mpItemList->GetObject( nPos )->mnWidth; 1316cdf0e10cSrcweir else 1317cdf0e10cSrcweir return 0; 1318cdf0e10cSrcweir } 1319cdf0e10cSrcweir 1320cdf0e10cSrcweir // ----------------------------------------------------------------------- 1321cdf0e10cSrcweir 1322cdf0e10cSrcweir StatusBarItemBits StatusBar::GetItemBits( sal_uInt16 nItemId ) const 1323cdf0e10cSrcweir { 1324cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1325cdf0e10cSrcweir 1326cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1327cdf0e10cSrcweir return mpItemList->GetObject( nPos )->mnBits; 1328cdf0e10cSrcweir else 1329cdf0e10cSrcweir return 0; 1330cdf0e10cSrcweir } 1331cdf0e10cSrcweir 1332cdf0e10cSrcweir // ----------------------------------------------------------------------- 1333cdf0e10cSrcweir 1334cdf0e10cSrcweir long StatusBar::GetItemOffset( sal_uInt16 nItemId ) const 1335cdf0e10cSrcweir { 1336cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1337cdf0e10cSrcweir 1338cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1339cdf0e10cSrcweir return mpItemList->GetObject( nPos )->mnOffset; 1340cdf0e10cSrcweir else 1341cdf0e10cSrcweir return 0; 1342cdf0e10cSrcweir } 1343cdf0e10cSrcweir 1344cdf0e10cSrcweir // ----------------------------------------------------------------------- 1345cdf0e10cSrcweir 1346cdf0e10cSrcweir void StatusBar::SetItemText( sal_uInt16 nItemId, const XubString& rText ) 1347cdf0e10cSrcweir { 1348cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1349cdf0e10cSrcweir 1350cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1351cdf0e10cSrcweir { 1352cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 1353cdf0e10cSrcweir 1354cdf0e10cSrcweir if ( pItem->maText != rText ) 1355cdf0e10cSrcweir { 1356cdf0e10cSrcweir pItem->maText = rText; 1357cdf0e10cSrcweir 1358cdf0e10cSrcweir // adjust item width - see also DataChanged() 1359cdf0e10cSrcweir long nFudge = GetTextHeight()/4; 1360cdf0e10cSrcweir long nWidth = GetTextWidth( pItem->maText ) + nFudge; 1361cdf0e10cSrcweir if( (nWidth > pItem->mnWidth + STATUSBAR_OFFSET) || 1362cdf0e10cSrcweir ((nWidth < pItem->mnWidth) && (mnDX - STATUSBAR_OFFSET) < mnItemsWidth )) 1363cdf0e10cSrcweir { 1364cdf0e10cSrcweir pItem->mnWidth = nWidth + STATUSBAR_OFFSET; 1365cdf0e10cSrcweir ImplFormat(); 1366cdf0e10cSrcweir Invalidate(); 1367cdf0e10cSrcweir } 1368cdf0e10cSrcweir 1369cdf0e10cSrcweir // Item neu Zeichen, wenn StatusBar sichtbar und 1370cdf0e10cSrcweir // UpdateMode gesetzt ist 1371cdf0e10cSrcweir if ( pItem->mbVisible && !mbFormat && ImplIsItemUpdate() ) 1372cdf0e10cSrcweir { 1373cdf0e10cSrcweir Update(); 1374cdf0e10cSrcweir ImplDrawItem( sal_True, nPos, sal_True, sal_False ); 1375cdf0e10cSrcweir Flush(); 1376cdf0e10cSrcweir } 1377cdf0e10cSrcweir } 1378cdf0e10cSrcweir } 1379cdf0e10cSrcweir } 1380cdf0e10cSrcweir 1381cdf0e10cSrcweir // ----------------------------------------------------------------------- 1382cdf0e10cSrcweir 1383cdf0e10cSrcweir const XubString& StatusBar::GetItemText( sal_uInt16 nItemId ) const 1384cdf0e10cSrcweir { 1385cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1386cdf0e10cSrcweir 1387cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1388cdf0e10cSrcweir return mpItemList->GetObject( nPos )->maText; 1389cdf0e10cSrcweir else 1390cdf0e10cSrcweir return ImplGetSVEmptyStr(); 1391cdf0e10cSrcweir } 1392cdf0e10cSrcweir 1393cdf0e10cSrcweir // ----------------------------------------------------------------------- 1394cdf0e10cSrcweir 1395cdf0e10cSrcweir void StatusBar::SetItemCommand( sal_uInt16 nItemId, const XubString& rCommand ) 1396cdf0e10cSrcweir { 1397cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1398cdf0e10cSrcweir 1399cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1400cdf0e10cSrcweir { 1401cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 1402cdf0e10cSrcweir 1403cdf0e10cSrcweir if ( pItem->maCommand != rCommand ) 1404cdf0e10cSrcweir pItem->maCommand = rCommand; 1405cdf0e10cSrcweir } 1406cdf0e10cSrcweir } 1407cdf0e10cSrcweir 1408cdf0e10cSrcweir // ----------------------------------------------------------------------- 1409cdf0e10cSrcweir 1410cdf0e10cSrcweir const XubString& StatusBar::GetItemCommand( sal_uInt16 nItemId ) 1411cdf0e10cSrcweir { 1412cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1413cdf0e10cSrcweir 1414cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1415cdf0e10cSrcweir return mpItemList->GetObject( nPos )->maCommand; 1416cdf0e10cSrcweir else 1417cdf0e10cSrcweir return ImplGetSVEmptyStr(); 1418cdf0e10cSrcweir } 1419cdf0e10cSrcweir 1420cdf0e10cSrcweir // ----------------------------------------------------------------------- 1421cdf0e10cSrcweir 1422cdf0e10cSrcweir void StatusBar::SetItemData( sal_uInt16 nItemId, void* pNewData ) 1423cdf0e10cSrcweir { 1424cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1425cdf0e10cSrcweir 1426cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1427cdf0e10cSrcweir { 1428cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 1429cdf0e10cSrcweir pItem->mpUserData = pNewData; 1430cdf0e10cSrcweir 1431cdf0e10cSrcweir // Wenn es ein User-Item ist, DrawItem-Aufrufen 1432cdf0e10cSrcweir if ( (pItem->mnBits & SIB_USERDRAW) && pItem->mbVisible && 1433cdf0e10cSrcweir !mbFormat && ImplIsItemUpdate() ) 1434cdf0e10cSrcweir { 1435cdf0e10cSrcweir Update(); 1436cdf0e10cSrcweir ImplDrawItem( sal_True, nPos, sal_False, sal_False ); 1437cdf0e10cSrcweir Flush(); 1438cdf0e10cSrcweir } 1439cdf0e10cSrcweir } 1440cdf0e10cSrcweir } 1441cdf0e10cSrcweir 1442cdf0e10cSrcweir // ----------------------------------------------------------------------- 1443cdf0e10cSrcweir 1444cdf0e10cSrcweir void* StatusBar::GetItemData( sal_uInt16 nItemId ) const 1445cdf0e10cSrcweir { 1446cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1447cdf0e10cSrcweir 1448cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1449cdf0e10cSrcweir return mpItemList->GetObject( nPos )->mpUserData; 1450cdf0e10cSrcweir else 1451cdf0e10cSrcweir return NULL; 1452cdf0e10cSrcweir } 1453cdf0e10cSrcweir 1454cdf0e10cSrcweir // ----------------------------------------------------------------------- 1455cdf0e10cSrcweir 1456cdf0e10cSrcweir void StatusBar::SetHelpText( sal_uInt16 nItemId, const XubString& rText ) 1457cdf0e10cSrcweir { 1458cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1459cdf0e10cSrcweir 1460cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1461cdf0e10cSrcweir mpItemList->GetObject( nPos )->maHelpText = rText; 1462cdf0e10cSrcweir } 1463cdf0e10cSrcweir 1464cdf0e10cSrcweir // ----------------------------------------------------------------------- 1465cdf0e10cSrcweir 1466cdf0e10cSrcweir const XubString& StatusBar::GetHelpText( sal_uInt16 nItemId ) const 1467cdf0e10cSrcweir { 1468cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1469cdf0e10cSrcweir 1470cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1471cdf0e10cSrcweir { 1472cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 1473cdf0e10cSrcweir if ( !pItem->maHelpText.Len() && ( pItem->maHelpId.getLength() || pItem->maCommand.Len() )) 1474cdf0e10cSrcweir { 1475cdf0e10cSrcweir Help* pHelp = Application::GetHelp(); 1476cdf0e10cSrcweir if ( pHelp ) 1477cdf0e10cSrcweir { 1478cdf0e10cSrcweir if ( pItem->maCommand.Len() ) 1479cdf0e10cSrcweir pItem->maHelpText = pHelp->GetHelpText( pItem->maCommand, this ); 1480cdf0e10cSrcweir if ( !pItem->maHelpText.Len() && pItem->maHelpId.getLength() ) 1481cdf0e10cSrcweir pItem->maHelpText = pHelp->GetHelpText( rtl::OStringToOUString( pItem->maHelpId, RTL_TEXTENCODING_UTF8 ), this ); 1482cdf0e10cSrcweir } 1483cdf0e10cSrcweir } 1484cdf0e10cSrcweir 1485cdf0e10cSrcweir return pItem->maHelpText; 1486cdf0e10cSrcweir } 1487cdf0e10cSrcweir else 1488cdf0e10cSrcweir return ImplGetSVEmptyStr(); 1489cdf0e10cSrcweir } 1490cdf0e10cSrcweir 1491cdf0e10cSrcweir // ----------------------------------------------------------------------- 1492cdf0e10cSrcweir 1493cdf0e10cSrcweir void StatusBar::SetQuickHelpText( sal_uInt16 nItemId, const XubString& rText ) 1494cdf0e10cSrcweir { 1495cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1496cdf0e10cSrcweir 1497cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1498cdf0e10cSrcweir mpItemList->GetObject( nPos )->maQuickHelpText = rText; 1499cdf0e10cSrcweir } 1500cdf0e10cSrcweir 1501cdf0e10cSrcweir // ----------------------------------------------------------------------- 1502cdf0e10cSrcweir 1503cdf0e10cSrcweir const XubString& StatusBar::GetQuickHelpText( sal_uInt16 nItemId ) const 1504cdf0e10cSrcweir { 1505cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1506cdf0e10cSrcweir 1507cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1508cdf0e10cSrcweir { 1509cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 1510cdf0e10cSrcweir return pItem->maQuickHelpText; 1511cdf0e10cSrcweir } 1512cdf0e10cSrcweir else 1513cdf0e10cSrcweir return ImplGetSVEmptyStr(); 1514cdf0e10cSrcweir } 1515cdf0e10cSrcweir 1516cdf0e10cSrcweir // ----------------------------------------------------------------------- 1517cdf0e10cSrcweir 1518cdf0e10cSrcweir void StatusBar::SetHelpId( sal_uInt16 nItemId, const rtl::OString& rHelpId ) 1519cdf0e10cSrcweir { 1520cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1521cdf0e10cSrcweir 1522cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1523cdf0e10cSrcweir mpItemList->GetObject( nPos )->maHelpId = rHelpId; 1524cdf0e10cSrcweir } 1525cdf0e10cSrcweir 1526cdf0e10cSrcweir // ----------------------------------------------------------------------- 1527cdf0e10cSrcweir 1528cdf0e10cSrcweir rtl::OString StatusBar::GetHelpId( sal_uInt16 nItemId ) const 1529cdf0e10cSrcweir { 1530cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1531cdf0e10cSrcweir 1532cdf0e10cSrcweir rtl::OString aRet; 1533cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1534cdf0e10cSrcweir { 1535cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 1536cdf0e10cSrcweir if ( pItem->maHelpId.getLength() ) 1537cdf0e10cSrcweir aRet = pItem->maHelpId; 1538cdf0e10cSrcweir else 1539cdf0e10cSrcweir aRet = ::rtl::OUStringToOString( pItem->maCommand, RTL_TEXTENCODING_UTF8 ); 1540cdf0e10cSrcweir } 1541cdf0e10cSrcweir 1542cdf0e10cSrcweir return aRet; 1543cdf0e10cSrcweir } 1544cdf0e10cSrcweir 1545cdf0e10cSrcweir // ----------------------------------------------------------------------- 1546cdf0e10cSrcweir 1547cdf0e10cSrcweir void StatusBar::ImplCalcBorder( ) 1548cdf0e10cSrcweir { 1549cdf0e10cSrcweir mnCalcHeight = mnDY; 1550cdf0e10cSrcweir // subtract border 1551cdf0e10cSrcweir if( IsTopBorder() ) 1552cdf0e10cSrcweir { 1553cdf0e10cSrcweir mnCalcHeight -= 2; 1554cdf0e10cSrcweir mnTextY += 2; 1555cdf0e10cSrcweir mnItemY += 2; 1556cdf0e10cSrcweir } 1557cdf0e10cSrcweir if ( IsBottomBorder() ) 1558cdf0e10cSrcweir mnCalcHeight -= 2; 1559cdf0e10cSrcweir mbFormat = sal_True; 1560cdf0e10cSrcweir Invalidate(); 1561cdf0e10cSrcweir } 1562cdf0e10cSrcweir 1563cdf0e10cSrcweir void StatusBar::SetBottomBorder( sal_Bool bBottomBorder ) 1564cdf0e10cSrcweir { 1565cdf0e10cSrcweir if ( mbBottomBorder != bBottomBorder ) 1566cdf0e10cSrcweir { 1567cdf0e10cSrcweir mbBottomBorder = bBottomBorder; 1568cdf0e10cSrcweir ImplCalcBorder(); 1569cdf0e10cSrcweir } 1570cdf0e10cSrcweir } 1571cdf0e10cSrcweir 1572cdf0e10cSrcweir void StatusBar::SetTopBorder( sal_Bool bTopBorder ) 1573cdf0e10cSrcweir { 1574cdf0e10cSrcweir if ( mpImplData->mbTopBorder != static_cast<bool>(bTopBorder) ) 1575cdf0e10cSrcweir { 1576cdf0e10cSrcweir mpImplData->mbTopBorder = static_cast<bool>(bTopBorder); 1577cdf0e10cSrcweir ImplCalcBorder(); 1578cdf0e10cSrcweir } 1579cdf0e10cSrcweir } 1580cdf0e10cSrcweir 1581cdf0e10cSrcweir sal_Bool StatusBar::IsTopBorder() const 1582cdf0e10cSrcweir { 1583cdf0e10cSrcweir return mpImplData->mbTopBorder; 1584cdf0e10cSrcweir } 1585cdf0e10cSrcweir 1586cdf0e10cSrcweir // ----------------------------------------------------------------------- 1587cdf0e10cSrcweir 1588cdf0e10cSrcweir void StatusBar::StartProgressMode( const XubString& rText ) 1589cdf0e10cSrcweir { 1590cdf0e10cSrcweir DBG_ASSERT( !mbProgressMode, "StatusBar::StartProgressMode(): progress mode is active" ); 1591cdf0e10cSrcweir 1592cdf0e10cSrcweir mbProgressMode = sal_True; 1593cdf0e10cSrcweir mnPercent = 0; 1594cdf0e10cSrcweir maPrgsTxt = rText; 1595cdf0e10cSrcweir 1596cdf0e10cSrcweir // Groessen berechnen 1597cdf0e10cSrcweir ImplCalcProgressRect(); 1598cdf0e10cSrcweir 1599cdf0e10cSrcweir // Paint ausloesen (dort wird der Text und der Frame gemalt) 1600cdf0e10cSrcweir const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); 1601cdf0e10cSrcweir Color aPrgsColor = rStyleSettings.GetHighlightColor(); 1602cdf0e10cSrcweir if ( aPrgsColor == rStyleSettings.GetFaceColor() ) 1603cdf0e10cSrcweir aPrgsColor = rStyleSettings.GetDarkShadowColor(); 1604cdf0e10cSrcweir SetLineColor(); 1605cdf0e10cSrcweir SetFillColor( aPrgsColor ); 1606cdf0e10cSrcweir if ( IsReallyVisible() ) 1607cdf0e10cSrcweir { 1608cdf0e10cSrcweir Invalidate(); 1609cdf0e10cSrcweir Update(); 1610cdf0e10cSrcweir Flush(); 1611cdf0e10cSrcweir } 1612cdf0e10cSrcweir } 1613cdf0e10cSrcweir 1614cdf0e10cSrcweir // ----------------------------------------------------------------------- 1615cdf0e10cSrcweir 1616cdf0e10cSrcweir void StatusBar::SetProgressValue( sal_uInt16 nNewPercent ) 1617cdf0e10cSrcweir { 1618cdf0e10cSrcweir DBG_ASSERT( mbProgressMode, "StatusBar::SetProgressValue(): no progrss mode" ); 1619cdf0e10cSrcweir DBG_ASSERTWARNING( nNewPercent <= 100, "StatusBar::SetProgressValue(): nPercent > 100" ); 1620cdf0e10cSrcweir 1621cdf0e10cSrcweir if ( mbProgressMode 1622cdf0e10cSrcweir && IsReallyVisible() 1623cdf0e10cSrcweir && (!mnPercent || (mnPercent != nNewPercent)) ) 1624cdf0e10cSrcweir { 1625cdf0e10cSrcweir Update(); 1626cdf0e10cSrcweir SetLineColor(); 1627cdf0e10cSrcweir ImplDrawProgress( sal_False, mnPercent, nNewPercent ); 1628cdf0e10cSrcweir Flush(); 1629cdf0e10cSrcweir } 1630cdf0e10cSrcweir mnPercent = nNewPercent; 1631cdf0e10cSrcweir } 1632cdf0e10cSrcweir 1633cdf0e10cSrcweir // ----------------------------------------------------------------------- 1634cdf0e10cSrcweir 1635cdf0e10cSrcweir void StatusBar::EndProgressMode() 1636cdf0e10cSrcweir { 1637cdf0e10cSrcweir DBG_ASSERT( mbProgressMode, "StatusBar::EndProgressMode(): no progress mode" ); 1638cdf0e10cSrcweir 1639cdf0e10cSrcweir mbProgressMode = sal_False; 1640cdf0e10cSrcweir maPrgsTxt.Erase(); 1641cdf0e10cSrcweir 1642cdf0e10cSrcweir // Paint neu ausloesen um StatusBar wieder herzustellen 1643cdf0e10cSrcweir SetFillColor( GetSettings().GetStyleSettings().GetFaceColor() ); 1644cdf0e10cSrcweir if ( IsReallyVisible() ) 1645cdf0e10cSrcweir { 1646cdf0e10cSrcweir Invalidate(); 1647cdf0e10cSrcweir Update(); 1648cdf0e10cSrcweir Flush(); 1649cdf0e10cSrcweir } 1650cdf0e10cSrcweir } 1651cdf0e10cSrcweir 1652cdf0e10cSrcweir // ----------------------------------------------------------------------- 1653cdf0e10cSrcweir 1654cdf0e10cSrcweir void StatusBar::ResetProgressMode() 1655cdf0e10cSrcweir { 1656cdf0e10cSrcweir if ( mbProgressMode ) 1657cdf0e10cSrcweir { 1658cdf0e10cSrcweir mnPercent = 0; 1659cdf0e10cSrcweir maPrgsTxt.Erase(); 1660cdf0e10cSrcweir if ( IsReallyVisible() ) 1661cdf0e10cSrcweir { 1662cdf0e10cSrcweir Invalidate(); 1663cdf0e10cSrcweir Update(); 1664cdf0e10cSrcweir Flush(); 1665cdf0e10cSrcweir } 1666cdf0e10cSrcweir } 1667cdf0e10cSrcweir } 1668cdf0e10cSrcweir 1669cdf0e10cSrcweir // ----------------------------------------------------------------------- 1670cdf0e10cSrcweir 1671cdf0e10cSrcweir void StatusBar::SetText( const XubString& rText ) 1672cdf0e10cSrcweir { 1673cdf0e10cSrcweir if ( (!mbVisibleItems || (GetStyle() & WB_RIGHT)) && !mbProgressMode && 1674cdf0e10cSrcweir IsReallyVisible() && IsUpdateMode() ) 1675cdf0e10cSrcweir { 1676cdf0e10cSrcweir if ( mbFormat ) 1677cdf0e10cSrcweir { 1678cdf0e10cSrcweir Invalidate(); 1679cdf0e10cSrcweir Window::SetText( rText ); 1680cdf0e10cSrcweir } 1681cdf0e10cSrcweir else 1682cdf0e10cSrcweir { 1683cdf0e10cSrcweir Update(); 1684cdf0e10cSrcweir long nOldTextWidth = GetTextWidth( GetText() ); 1685cdf0e10cSrcweir Window::SetText( rText ); 1686cdf0e10cSrcweir ImplDrawText( sal_True, nOldTextWidth ); 1687cdf0e10cSrcweir Flush(); 1688cdf0e10cSrcweir } 1689cdf0e10cSrcweir } 1690cdf0e10cSrcweir else if ( mbProgressMode ) 1691cdf0e10cSrcweir { 1692cdf0e10cSrcweir maPrgsTxt = rText; 1693cdf0e10cSrcweir if ( IsReallyVisible() ) 1694cdf0e10cSrcweir { 1695cdf0e10cSrcweir Invalidate(); 1696cdf0e10cSrcweir Update(); 1697cdf0e10cSrcweir Flush(); 1698cdf0e10cSrcweir } 1699cdf0e10cSrcweir } 1700cdf0e10cSrcweir else 1701cdf0e10cSrcweir Window::SetText( rText ); 1702cdf0e10cSrcweir } 1703cdf0e10cSrcweir 1704cdf0e10cSrcweir // ----------------------------------------------------------------------- 1705cdf0e10cSrcweir 1706cdf0e10cSrcweir Size StatusBar::CalcWindowSizePixel() const 1707cdf0e10cSrcweir { 1708cdf0e10cSrcweir sal_uLong i = 0; 1709cdf0e10cSrcweir sal_uLong nCount = mpItemList->Count(); 1710cdf0e10cSrcweir long nOffset = 0; 1711cdf0e10cSrcweir long nCalcWidth = (STATUSBAR_OFFSET_X*2); 1712cdf0e10cSrcweir long nCalcHeight; 1713cdf0e10cSrcweir 1714cdf0e10cSrcweir while ( i < nCount ) 1715cdf0e10cSrcweir { 1716cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( i ); 1717cdf0e10cSrcweir nCalcWidth += pItem->mnWidth + nOffset; 1718cdf0e10cSrcweir nOffset = pItem->mnOffset; 1719cdf0e10cSrcweir i++; 1720cdf0e10cSrcweir } 1721cdf0e10cSrcweir 1722cdf0e10cSrcweir long nMinHeight = GetTextHeight(); 1723cdf0e10cSrcweir const long nBarTextOffset = STATUSBAR_OFFSET_TEXTY*2; 1724cdf0e10cSrcweir long nProgressHeight = nMinHeight + nBarTextOffset; 1725cdf0e10cSrcweir // FIXME: IsNativeControlSupported and GetNativeControlRegion should be const ? 1726cdf0e10cSrcweir StatusBar* pThis = const_cast<StatusBar*>( this ); 1727cdf0e10cSrcweir if( pThis->IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) ) 1728cdf0e10cSrcweir { 1729cdf0e10cSrcweir ImplControlValue aValue; 1730cdf0e10cSrcweir Rectangle aControlRegion( (const Point&)Point(), Size( nCalcWidth, nMinHeight ) ); 1731cdf0e10cSrcweir Rectangle aNativeControlRegion, aNativeContentRegion; 1732cdf0e10cSrcweir if( pThis->GetNativeControlRegion( CTRL_PROGRESS, PART_ENTIRE_CONTROL, aControlRegion, 1733cdf0e10cSrcweir CTRL_STATE_ENABLED, aValue, rtl::OUString(), 1734cdf0e10cSrcweir aNativeControlRegion, aNativeContentRegion ) ) 1735cdf0e10cSrcweir { 1736cdf0e10cSrcweir nProgressHeight = aNativeControlRegion.GetHeight(); 1737cdf0e10cSrcweir } 1738cdf0e10cSrcweir } 1739cdf0e10cSrcweir 1740cdf0e10cSrcweir if( mpImplData->mbDrawItemFrames && 1741cdf0e10cSrcweir pThis->IsNativeControlSupported( CTRL_FRAME, PART_BORDER ) ) 1742cdf0e10cSrcweir { 1743cdf0e10cSrcweir ImplControlValue aControlValue( FRAME_DRAW_NODRAW ); 1744cdf0e10cSrcweir Rectangle aBound, aContent; 1745cdf0e10cSrcweir Rectangle aNatRgn( Point( 0, 0 ), Size( 150, 50 ) ); 1746cdf0e10cSrcweir if( pThis->GetNativeControlRegion(CTRL_FRAME, PART_BORDER, 1747cdf0e10cSrcweir aNatRgn, 0, aControlValue, rtl::OUString(), aBound, aContent) ) 1748cdf0e10cSrcweir { 1749cdf0e10cSrcweir mpImplData->mnItemBorderWidth = 1750cdf0e10cSrcweir ( aBound.GetHeight() - aContent.GetHeight() ) / 2; 1751cdf0e10cSrcweir } 1752cdf0e10cSrcweir } 1753cdf0e10cSrcweir 1754cdf0e10cSrcweir nCalcHeight = nMinHeight+nBarTextOffset + 2*mpImplData->mnItemBorderWidth; 1755cdf0e10cSrcweir if( nCalcHeight < nProgressHeight+2 ) 1756cdf0e10cSrcweir nCalcHeight = nProgressHeight+2; 1757cdf0e10cSrcweir 1758cdf0e10cSrcweir // add border 1759cdf0e10cSrcweir if( IsTopBorder() ) 1760cdf0e10cSrcweir nCalcHeight += 2; 1761cdf0e10cSrcweir if ( IsBottomBorder() ) 1762cdf0e10cSrcweir nCalcHeight += 2; 1763cdf0e10cSrcweir 1764cdf0e10cSrcweir return Size( nCalcWidth, nCalcHeight ); 1765cdf0e10cSrcweir } 1766cdf0e10cSrcweir 1767cdf0e10cSrcweir 1768cdf0e10cSrcweir // ----------------------------------------------------------------------- 1769cdf0e10cSrcweir 1770cdf0e10cSrcweir void StatusBar::SetAccessibleName( sal_uInt16 nItemId, const XubString& rName ) 1771cdf0e10cSrcweir { 1772cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1773cdf0e10cSrcweir 1774cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1775cdf0e10cSrcweir { 1776cdf0e10cSrcweir ImplStatusItem* pItem = mpItemList->GetObject( nPos ); 1777cdf0e10cSrcweir 1778cdf0e10cSrcweir if ( pItem->maAccessibleName != rName ) 1779cdf0e10cSrcweir { 1780cdf0e10cSrcweir pItem->maAccessibleName = rName; 1781cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_STATUSBAR_NAMECHANGED, (void*) sal_IntPtr(pItem->mnId) ); 1782cdf0e10cSrcweir } 1783cdf0e10cSrcweir } 1784cdf0e10cSrcweir } 1785cdf0e10cSrcweir 1786cdf0e10cSrcweir // ----------------------------------------------------------------------- 1787cdf0e10cSrcweir 1788cdf0e10cSrcweir const XubString& StatusBar::GetAccessibleName( sal_uInt16 nItemId ) const 1789cdf0e10cSrcweir { 1790cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1791cdf0e10cSrcweir 1792cdf0e10cSrcweir if ( nPos != STATUSBAR_ITEM_NOTFOUND ) 1793cdf0e10cSrcweir return mpItemList->GetObject( nPos )->maAccessibleName; 1794cdf0e10cSrcweir else 1795cdf0e10cSrcweir return ImplGetSVEmptyStr(); 1796cdf0e10cSrcweir } 1797cdf0e10cSrcweir 1798cdf0e10cSrcweir // ----------------------------------------------------------------------- 1799