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/svapp.hxx> 32cdf0e10cSrcweir #include <vcl/help.hxx> 33cdf0e10cSrcweir #include <vcl/bitmap.hxx> 34cdf0e10cSrcweir #include <vcl/toolbox.hxx> 35cdf0e10cSrcweir #include <vcl/mnemonic.hxx> 36cdf0e10cSrcweir #include <vcl/menu.hxx> 37cdf0e10cSrcweir #include <vcl/unohelp.hxx> 38cdf0e10cSrcweir #include <vcl/ImageListProvider.hxx> 39cdf0e10cSrcweir 40cdf0e10cSrcweir #include <svdata.hxx> 41cdf0e10cSrcweir #include <brdwin.hxx> 42cdf0e10cSrcweir #include <toolbox.h> 43cdf0e10cSrcweir 44cdf0e10cSrcweir #include <unotools/confignode.hxx> 45cdf0e10cSrcweir 46cdf0e10cSrcweir #include <com/sun/star/lang/IllegalArgumentException.hpp> 47cdf0e10cSrcweir 48cdf0e10cSrcweir using namespace vcl; 49cdf0e10cSrcweir using namespace rtl; 50cdf0e10cSrcweir 51cdf0e10cSrcweir // ======================================================================= 52cdf0e10cSrcweir 53cdf0e10cSrcweir #define TB_SEP_SIZE 8 54cdf0e10cSrcweir 55cdf0e10cSrcweir // ----------------------------------------------------------------------- 56cdf0e10cSrcweir 57cdf0e10cSrcweir ImplToolBoxPrivateData::ImplToolBoxPrivateData() : 58cdf0e10cSrcweir m_pLayoutData( NULL ), 59cdf0e10cSrcweir mpImageListProvider( NULL ), 60cdf0e10cSrcweir meImageListType( vcl::IMAGELISTTYPE_UNKNOWN ) 61cdf0e10cSrcweir { 62cdf0e10cSrcweir meButtonSize = TOOLBOX_BUTTONSIZE_DONTCARE; 63cdf0e10cSrcweir mpMenu = new PopupMenu(); 64cdf0e10cSrcweir mnEventId = 0; 65cdf0e10cSrcweir 66cdf0e10cSrcweir maMenuType = TOOLBOX_MENUTYPE_NONE; 67cdf0e10cSrcweir maMenubuttonItem.maItemSize = Size( TB_MENUBUTTON_SIZE+TB_MENUBUTTON_OFFSET, TB_MENUBUTTON_SIZE+TB_MENUBUTTON_OFFSET ); 68cdf0e10cSrcweir maMenubuttonItem.meState = STATE_NOCHECK; 69cdf0e10cSrcweir mnMenuButtonWidth = TB_MENUBUTTON_SIZE; 70cdf0e10cSrcweir 71cdf0e10cSrcweir 72cdf0e10cSrcweir mbIsLocked = sal_False; 73cdf0e10cSrcweir mbNativeButtons = sal_False; 74cdf0e10cSrcweir mbIsPaintLocked = sal_False; 75cdf0e10cSrcweir mbAssumeDocked = sal_False; 76cdf0e10cSrcweir mbAssumePopupMode = sal_False; 77cdf0e10cSrcweir mbAssumeFloating = sal_False; 78cdf0e10cSrcweir mbKeyInputDisabled = sal_False; 79cdf0e10cSrcweir mbMenubuttonSelected = sal_False; 80cdf0e10cSrcweir mbPageScroll = sal_False; 81cdf0e10cSrcweir mbWillUsePopupMode = sal_False; 82cdf0e10cSrcweir mbDropDownByKeyboard = sal_False; 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir ImplToolBoxPrivateData::~ImplToolBoxPrivateData() 86cdf0e10cSrcweir { 87cdf0e10cSrcweir if( m_pLayoutData ) 88cdf0e10cSrcweir delete m_pLayoutData; 89cdf0e10cSrcweir delete mpMenu; 90cdf0e10cSrcweir } 91cdf0e10cSrcweir 92cdf0e10cSrcweir // ----------------------------------------------------------------------- 93cdf0e10cSrcweir ImplToolItem::ImplToolItem() 94cdf0e10cSrcweir { 95cdf0e10cSrcweir mnId = 0; 96cdf0e10cSrcweir mpWindow = NULL; 97cdf0e10cSrcweir mpUserData = NULL; 98cdf0e10cSrcweir meType = TOOLBOXITEM_BUTTON; 99cdf0e10cSrcweir mnBits = 0; 100cdf0e10cSrcweir meState = STATE_NOCHECK; 101cdf0e10cSrcweir mbEnabled = sal_True; 102cdf0e10cSrcweir mbVisible = sal_True; 103cdf0e10cSrcweir mbEmptyBtn = sal_True; 104cdf0e10cSrcweir mbShowWindow = sal_False; 105cdf0e10cSrcweir mbBreak = sal_False; 106cdf0e10cSrcweir mnSepSize = TB_SEP_SIZE; 107cdf0e10cSrcweir mnDropDownArrowWidth = TB_DROPDOWNARROWWIDTH; 108cdf0e10cSrcweir mnImageAngle = 0; 109cdf0e10cSrcweir mbMirrorMode = sal_False; 110cdf0e10cSrcweir mbVisibleText = sal_False; 111cdf0e10cSrcweir } 112cdf0e10cSrcweir 113cdf0e10cSrcweir // ----------------------------------------------------------------------- 114cdf0e10cSrcweir 115cdf0e10cSrcweir ImplToolItem::ImplToolItem( sal_uInt16 nItemId, const Image& rImage, 116cdf0e10cSrcweir ToolBoxItemBits nItemBits ) : 117cdf0e10cSrcweir maImage( rImage ) 118cdf0e10cSrcweir { 119cdf0e10cSrcweir mnId = nItemId; 120cdf0e10cSrcweir mpWindow = NULL; 121cdf0e10cSrcweir mpUserData = NULL; 122cdf0e10cSrcweir meType = TOOLBOXITEM_BUTTON; 123cdf0e10cSrcweir mnBits = nItemBits; 124cdf0e10cSrcweir meState = STATE_NOCHECK; 125cdf0e10cSrcweir mbEnabled = sal_True; 126cdf0e10cSrcweir mbVisible = sal_True; 127cdf0e10cSrcweir mbEmptyBtn = sal_False; 128cdf0e10cSrcweir mbShowWindow = sal_False; 129cdf0e10cSrcweir mbBreak = sal_False; 130cdf0e10cSrcweir mnSepSize = TB_SEP_SIZE; 131cdf0e10cSrcweir mnDropDownArrowWidth = TB_DROPDOWNARROWWIDTH; 132cdf0e10cSrcweir mnImageAngle = 0; 133cdf0e10cSrcweir mbMirrorMode = false; 134cdf0e10cSrcweir mbVisibleText = false; 135cdf0e10cSrcweir } 136cdf0e10cSrcweir 137cdf0e10cSrcweir // ----------------------------------------------------------------------- 138cdf0e10cSrcweir 139cdf0e10cSrcweir ImplToolItem::ImplToolItem( sal_uInt16 nItemId, const XubString& rText, 140cdf0e10cSrcweir ToolBoxItemBits nItemBits ) : 141cdf0e10cSrcweir maText( rText ) 142cdf0e10cSrcweir { 143cdf0e10cSrcweir mnId = nItemId; 144cdf0e10cSrcweir mpWindow = NULL; 145cdf0e10cSrcweir mpUserData = NULL; 146cdf0e10cSrcweir meType = TOOLBOXITEM_BUTTON; 147cdf0e10cSrcweir mnBits = nItemBits; 148cdf0e10cSrcweir meState = STATE_NOCHECK; 149cdf0e10cSrcweir mbEnabled = sal_True; 150cdf0e10cSrcweir mbVisible = sal_True; 151cdf0e10cSrcweir mbEmptyBtn = sal_False; 152cdf0e10cSrcweir mbShowWindow = sal_False; 153cdf0e10cSrcweir mbBreak = sal_False; 154cdf0e10cSrcweir mnSepSize = TB_SEP_SIZE; 155cdf0e10cSrcweir mnDropDownArrowWidth = TB_DROPDOWNARROWWIDTH; 156cdf0e10cSrcweir mnImageAngle = 0; 157cdf0e10cSrcweir mbMirrorMode = false; 158cdf0e10cSrcweir mbVisibleText = false; 159cdf0e10cSrcweir } 160cdf0e10cSrcweir 161cdf0e10cSrcweir // ----------------------------------------------------------------------- 162cdf0e10cSrcweir 163cdf0e10cSrcweir ImplToolItem::ImplToolItem( sal_uInt16 nItemId, const Image& rImage, 164cdf0e10cSrcweir const XubString& rText, ToolBoxItemBits nItemBits ) : 165cdf0e10cSrcweir maImage( rImage ), 166cdf0e10cSrcweir maText( rText ) 167cdf0e10cSrcweir { 168cdf0e10cSrcweir mnId = nItemId; 169cdf0e10cSrcweir mpWindow = NULL; 170cdf0e10cSrcweir mpUserData = NULL; 171cdf0e10cSrcweir meType = TOOLBOXITEM_BUTTON; 172cdf0e10cSrcweir mnBits = nItemBits; 173cdf0e10cSrcweir meState = STATE_NOCHECK; 174cdf0e10cSrcweir mbEnabled = sal_True; 175cdf0e10cSrcweir mbVisible = sal_True; 176cdf0e10cSrcweir mbEmptyBtn = sal_False; 177cdf0e10cSrcweir mbShowWindow = sal_False; 178cdf0e10cSrcweir mbBreak = sal_False; 179cdf0e10cSrcweir mnSepSize = TB_SEP_SIZE; 180cdf0e10cSrcweir mnDropDownArrowWidth = TB_DROPDOWNARROWWIDTH; 181cdf0e10cSrcweir mnImageAngle = 0; 182cdf0e10cSrcweir mbMirrorMode = false; 183cdf0e10cSrcweir mbVisibleText = false; 184cdf0e10cSrcweir } 185cdf0e10cSrcweir 186cdf0e10cSrcweir // ----------------------------------------------------------------------- 187cdf0e10cSrcweir 188cdf0e10cSrcweir ImplToolItem::ImplToolItem( const ImplToolItem& rItem ) : 189cdf0e10cSrcweir mpWindow ( rItem.mpWindow ), 190cdf0e10cSrcweir mpUserData ( rItem.mpUserData ), 191cdf0e10cSrcweir maImage ( rItem.maImage ), 192cdf0e10cSrcweir maHighImage ( rItem.maHighImage ), 193cdf0e10cSrcweir mnImageAngle ( rItem.mnImageAngle ), 194cdf0e10cSrcweir mbMirrorMode ( rItem.mbMirrorMode ), 195cdf0e10cSrcweir maText ( rItem.maText ), 196cdf0e10cSrcweir maQuickHelpText ( rItem.maQuickHelpText ), 197cdf0e10cSrcweir maHelpText ( rItem.maHelpText ), 198cdf0e10cSrcweir maCommandStr ( rItem.maCommandStr ), 199cdf0e10cSrcweir maHelpId ( rItem.maHelpId ), 200cdf0e10cSrcweir maRect ( rItem.maRect ), 201cdf0e10cSrcweir maCalcRect ( rItem.maCalcRect ), 202cdf0e10cSrcweir maItemSize ( rItem.maItemSize ), 203cdf0e10cSrcweir mnSepSize ( rItem.mnSepSize ), 204cdf0e10cSrcweir mnDropDownArrowWidth ( rItem.mnDropDownArrowWidth ), 205cdf0e10cSrcweir meType ( rItem.meType ), 206cdf0e10cSrcweir mnBits ( rItem.mnBits ), 207cdf0e10cSrcweir meState ( rItem.meState ), 208cdf0e10cSrcweir mnId ( rItem.mnId ), 209cdf0e10cSrcweir mbEnabled ( rItem.mbEnabled ), 210cdf0e10cSrcweir mbVisible ( rItem.mbVisible ), 211cdf0e10cSrcweir mbEmptyBtn ( rItem.mbEmptyBtn ), 212cdf0e10cSrcweir mbShowWindow ( rItem.mbShowWindow ), 213cdf0e10cSrcweir mbBreak ( rItem.mbBreak ), 214cdf0e10cSrcweir mbVisibleText ( rItem.mbVisibleText ) 215cdf0e10cSrcweir { 216cdf0e10cSrcweir } 217cdf0e10cSrcweir 218cdf0e10cSrcweir // ----------------------------------------------------------------------- 219cdf0e10cSrcweir 220cdf0e10cSrcweir ImplToolItem::~ImplToolItem() 221cdf0e10cSrcweir { 222cdf0e10cSrcweir } 223cdf0e10cSrcweir 224cdf0e10cSrcweir // ----------------------------------------------------------------------- 225cdf0e10cSrcweir 226cdf0e10cSrcweir ImplToolItem& ImplToolItem::operator=( const ImplToolItem& rItem ) 227cdf0e10cSrcweir { 228cdf0e10cSrcweir mpWindow = rItem.mpWindow; 229cdf0e10cSrcweir mpUserData = rItem.mpUserData; 230cdf0e10cSrcweir maImage = rItem.maImage; 231cdf0e10cSrcweir maHighImage = rItem.maHighImage; 232cdf0e10cSrcweir mnImageAngle = rItem.mnImageAngle; 233cdf0e10cSrcweir mbMirrorMode = rItem.mbMirrorMode; 234cdf0e10cSrcweir maText = rItem.maText; 235cdf0e10cSrcweir maQuickHelpText = rItem.maQuickHelpText; 236cdf0e10cSrcweir maHelpText = rItem.maHelpText; 237cdf0e10cSrcweir maCommandStr = rItem.maCommandStr; 238cdf0e10cSrcweir maHelpId = rItem.maHelpId; 239cdf0e10cSrcweir maRect = rItem.maRect; 240cdf0e10cSrcweir maCalcRect = rItem.maCalcRect; 241cdf0e10cSrcweir mnSepSize = rItem.mnSepSize; 242cdf0e10cSrcweir mnDropDownArrowWidth = rItem.mnDropDownArrowWidth; 243cdf0e10cSrcweir maItemSize = rItem.maItemSize; 244cdf0e10cSrcweir mbVisibleText = rItem.mbVisibleText; 245cdf0e10cSrcweir meType = rItem.meType; 246cdf0e10cSrcweir mnBits = rItem.mnBits; 247cdf0e10cSrcweir meState = rItem.meState; 248cdf0e10cSrcweir mnId = rItem.mnId; 249cdf0e10cSrcweir mbEnabled = rItem.mbEnabled; 250cdf0e10cSrcweir mbVisible = rItem.mbVisible; 251cdf0e10cSrcweir mbEmptyBtn = rItem.mbEmptyBtn; 252cdf0e10cSrcweir mbShowWindow = rItem.mbShowWindow; 253cdf0e10cSrcweir mbBreak = rItem.mbBreak; 254cdf0e10cSrcweir return *this; 255cdf0e10cSrcweir } 256cdf0e10cSrcweir 257cdf0e10cSrcweir // ----------------------------------------------------------------------- 258cdf0e10cSrcweir 259cdf0e10cSrcweir Size ImplToolItem::GetSize( sal_Bool bHorz, sal_Bool bCheckMaxWidth, long maxWidth, const Size& rDefaultSize ) 260cdf0e10cSrcweir { 261cdf0e10cSrcweir Size aSize( rDefaultSize ); // the size of 'standard' toolbox items 262cdf0e10cSrcweir // non-standard items are eg windows or buttons with text 263cdf0e10cSrcweir 264cdf0e10cSrcweir if ( (meType == TOOLBOXITEM_BUTTON) || (meType == TOOLBOXITEM_SPACE) ) 265cdf0e10cSrcweir { 266cdf0e10cSrcweir aSize = maItemSize; 267cdf0e10cSrcweir 268cdf0e10cSrcweir if ( mpWindow && bHorz ) 269cdf0e10cSrcweir { 270cdf0e10cSrcweir // get size of item window and check if it fits 271cdf0e10cSrcweir // no windows in vertical toolbars (the default is mbShowWindow=sal_False) 272cdf0e10cSrcweir Size aWinSize = mpWindow->GetSizePixel(); 273cdf0e10cSrcweir if ( !bCheckMaxWidth || (aWinSize.Width() <= maxWidth) ) 274cdf0e10cSrcweir { 275cdf0e10cSrcweir aSize.Width() = aWinSize.Width(); 276cdf0e10cSrcweir aSize.Height() = aWinSize.Height(); 277cdf0e10cSrcweir mbShowWindow = sal_True; 278cdf0e10cSrcweir } 279cdf0e10cSrcweir else 280cdf0e10cSrcweir { 281cdf0e10cSrcweir if ( mbEmptyBtn ) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir aSize.Width() = 0; 284cdf0e10cSrcweir aSize.Height() = 0; 285cdf0e10cSrcweir } 286cdf0e10cSrcweir } 287cdf0e10cSrcweir } 288cdf0e10cSrcweir } 289cdf0e10cSrcweir else if ( meType == TOOLBOXITEM_SEPARATOR ) 290cdf0e10cSrcweir { 291cdf0e10cSrcweir if ( bHorz ) 292cdf0e10cSrcweir { 293cdf0e10cSrcweir aSize.Width() = mnSepSize; 294cdf0e10cSrcweir aSize.Height() = rDefaultSize.Height(); 295cdf0e10cSrcweir } 296cdf0e10cSrcweir else 297cdf0e10cSrcweir { 298cdf0e10cSrcweir aSize.Width() = rDefaultSize.Width(); 299cdf0e10cSrcweir aSize.Height() = mnSepSize; 300cdf0e10cSrcweir } 301cdf0e10cSrcweir } 302cdf0e10cSrcweir else if ( meType == TOOLBOXITEM_BREAK ) 303cdf0e10cSrcweir { 304cdf0e10cSrcweir aSize.Width() = 0; 305cdf0e10cSrcweir aSize.Height() = 0; 306cdf0e10cSrcweir } 307cdf0e10cSrcweir 308cdf0e10cSrcweir return aSize; 309cdf0e10cSrcweir } 310cdf0e10cSrcweir 311cdf0e10cSrcweir // ----------------------------------------------------------------------- 312cdf0e10cSrcweir 313cdf0e10cSrcweir void ImplToolItem::DetermineButtonDrawStyle( ButtonType eButtonType, sal_Bool& rbImage, sal_Bool& rbText ) const 314cdf0e10cSrcweir { 315cdf0e10cSrcweir if ( meType != TOOLBOXITEM_BUTTON ) 316cdf0e10cSrcweir { 317cdf0e10cSrcweir // no button -> draw nothing 318cdf0e10cSrcweir rbImage = rbText = sal_False; 319cdf0e10cSrcweir return; 320cdf0e10cSrcweir } 321cdf0e10cSrcweir 322cdf0e10cSrcweir sal_Bool bHasImage; 323cdf0e10cSrcweir sal_Bool bHasText; 324cdf0e10cSrcweir 325cdf0e10cSrcweir // check for image and/or text 326cdf0e10cSrcweir if ( !(maImage) ) 327cdf0e10cSrcweir bHasImage = sal_False; 328cdf0e10cSrcweir else 329cdf0e10cSrcweir bHasImage = sal_True; 330cdf0e10cSrcweir if ( !maText.Len() ) 331cdf0e10cSrcweir bHasText = sal_False; 332cdf0e10cSrcweir else 333cdf0e10cSrcweir bHasText = sal_True; 334cdf0e10cSrcweir 335cdf0e10cSrcweir // prefer images if symbolonly buttons are drawn 336cdf0e10cSrcweir // prefer texts if textonly buttons are dreawn 337cdf0e10cSrcweir 338cdf0e10cSrcweir if ( eButtonType == BUTTON_SYMBOL ) // drawing icons only 339cdf0e10cSrcweir { 340cdf0e10cSrcweir if( bHasImage || !bHasText ) 341cdf0e10cSrcweir { 342cdf0e10cSrcweir rbImage = sal_True; 343cdf0e10cSrcweir rbText = sal_False; 344cdf0e10cSrcweir } 345cdf0e10cSrcweir else 346cdf0e10cSrcweir { 347cdf0e10cSrcweir rbImage = sal_False; 348cdf0e10cSrcweir rbText = sal_True; 349cdf0e10cSrcweir } 350cdf0e10cSrcweir } 351cdf0e10cSrcweir else if ( eButtonType == BUTTON_TEXT ) // drawing text only 352cdf0e10cSrcweir { 353cdf0e10cSrcweir if( bHasText || !bHasImage ) 354cdf0e10cSrcweir { 355cdf0e10cSrcweir rbImage = sal_False; 356cdf0e10cSrcweir rbText = sal_True; 357cdf0e10cSrcweir } 358cdf0e10cSrcweir else 359cdf0e10cSrcweir { 360cdf0e10cSrcweir rbImage = sal_True; 361cdf0e10cSrcweir rbText = sal_False; 362cdf0e10cSrcweir } 363cdf0e10cSrcweir } 364cdf0e10cSrcweir else // drawing icons and text both 365cdf0e10cSrcweir { 366cdf0e10cSrcweir rbImage = sal_True; 367cdf0e10cSrcweir rbText = sal_True; 368cdf0e10cSrcweir } 369cdf0e10cSrcweir } 370cdf0e10cSrcweir 371cdf0e10cSrcweir // ----------------------------------------------------------------------- 372cdf0e10cSrcweir 373cdf0e10cSrcweir Rectangle ImplToolItem::GetDropDownRect( sal_Bool bHorz ) const 374cdf0e10cSrcweir { 375cdf0e10cSrcweir Rectangle aRect; 376cdf0e10cSrcweir if( (mnBits & TIB_DROPDOWN) && !maRect.IsEmpty() ) 377cdf0e10cSrcweir { 378cdf0e10cSrcweir aRect = maRect; 379cdf0e10cSrcweir if( mbVisibleText && !bHorz ) 380cdf0e10cSrcweir // item will be rotated -> place dropdown to the bottom 381cdf0e10cSrcweir aRect.Top() = aRect.Bottom() - mnDropDownArrowWidth; 382cdf0e10cSrcweir else 383cdf0e10cSrcweir // place dropdown to the right 384cdf0e10cSrcweir aRect.Left() = aRect.Right() - mnDropDownArrowWidth; 385cdf0e10cSrcweir } 386cdf0e10cSrcweir return aRect; 387cdf0e10cSrcweir } 388cdf0e10cSrcweir 389cdf0e10cSrcweir // ----------------------------------------------------------------------- 390cdf0e10cSrcweir 391cdf0e10cSrcweir sal_Bool ImplToolItem::IsClipped() const 392cdf0e10cSrcweir { 393cdf0e10cSrcweir return ( meType == TOOLBOXITEM_BUTTON && mbVisible && maRect.IsEmpty() ); 394cdf0e10cSrcweir } 395cdf0e10cSrcweir 396cdf0e10cSrcweir // ----------------------------------------------------------------------- 397cdf0e10cSrcweir // ----------------------------------------------------------------------- 398cdf0e10cSrcweir 399cdf0e10cSrcweir const XubString& ToolBox::ImplConvertMenuString( const XubString& rStr ) 400cdf0e10cSrcweir { 401cdf0e10cSrcweir maCvtStr = rStr; 402cdf0e10cSrcweir if ( mbMenuStrings ) 403cdf0e10cSrcweir maCvtStr.EraseTrailingChars( '.' ); 404cdf0e10cSrcweir maCvtStr = MnemonicGenerator::EraseAllMnemonicChars( maCvtStr ); 405cdf0e10cSrcweir return maCvtStr; 406cdf0e10cSrcweir } 407cdf0e10cSrcweir 408cdf0e10cSrcweir // ----------------------------------------------------------------------- 409cdf0e10cSrcweir 410cdf0e10cSrcweir void ToolBox::ImplInvalidate( sal_Bool bNewCalc, sal_Bool bFullPaint ) 411cdf0e10cSrcweir { 412cdf0e10cSrcweir ImplUpdateInputEnable(); 413cdf0e10cSrcweir 414cdf0e10cSrcweir if ( bNewCalc ) 415cdf0e10cSrcweir mbCalc = sal_True; 416cdf0e10cSrcweir 417cdf0e10cSrcweir if ( bFullPaint ) 418cdf0e10cSrcweir { 419cdf0e10cSrcweir mbFormat = sal_True; 420cdf0e10cSrcweir 421cdf0e10cSrcweir // Muss ueberhaupt eine neue Ausgabe erfolgen 422cdf0e10cSrcweir if ( IsReallyVisible() && IsUpdateMode() ) 423cdf0e10cSrcweir { 424cdf0e10cSrcweir Invalidate( Rectangle( mnLeftBorder, mnTopBorder, 425cdf0e10cSrcweir mnDX-mnRightBorder-1, mnDY-mnBottomBorder-1 ) ); 426cdf0e10cSrcweir maTimer.Stop(); 427cdf0e10cSrcweir } 428cdf0e10cSrcweir } 429cdf0e10cSrcweir else 430cdf0e10cSrcweir { 431cdf0e10cSrcweir if ( !mbFormat ) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir mbFormat = sal_True; 434cdf0e10cSrcweir 435cdf0e10cSrcweir // Muss ueberhaupt eine neue Ausgabe erfolgen 436cdf0e10cSrcweir if ( IsReallyVisible() && IsUpdateMode() ) 437cdf0e10cSrcweir maTimer.Start(); 438cdf0e10cSrcweir } 439cdf0e10cSrcweir } 440cdf0e10cSrcweir 441cdf0e10cSrcweir // request new layout by layoutmanager 442cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_FORMATCHANGED ); 443cdf0e10cSrcweir } 444cdf0e10cSrcweir 445cdf0e10cSrcweir // ----------------------------------------------------------------------- 446cdf0e10cSrcweir 447cdf0e10cSrcweir void ToolBox::ImplUpdateItem( sal_uInt16 nIndex ) 448cdf0e10cSrcweir { 449cdf0e10cSrcweir // Muss ueberhaupt eine neue Ausgabe erfolgen 450cdf0e10cSrcweir if ( IsReallyVisible() && IsUpdateMode() ) 451cdf0e10cSrcweir { 452cdf0e10cSrcweir if ( nIndex == 0xFFFF ) 453cdf0e10cSrcweir { 454cdf0e10cSrcweir // #i52217# no immediate draw as this might lead to paint problems 455cdf0e10cSrcweir Invalidate( Rectangle( mnLeftBorder, mnTopBorder, 456cdf0e10cSrcweir mnDX-mnRightBorder-1, mnDY-mnBottomBorder-1 ) ); 457cdf0e10cSrcweir } 458cdf0e10cSrcweir else 459cdf0e10cSrcweir { 460cdf0e10cSrcweir if ( !mbFormat ) 461cdf0e10cSrcweir { 462cdf0e10cSrcweir // #i52217# no immediate draw as this might lead to paint problems 463cdf0e10cSrcweir Invalidate( mpData->m_aItems[nIndex].maRect ); 464cdf0e10cSrcweir } 465cdf0e10cSrcweir else 466cdf0e10cSrcweir maPaintRect.Union( mpData->m_aItems[nIndex].maRect ); 467cdf0e10cSrcweir } 468cdf0e10cSrcweir } 469cdf0e10cSrcweir } 470cdf0e10cSrcweir 471cdf0e10cSrcweir // ----------------------------------------------------------------------- 472cdf0e10cSrcweir 473cdf0e10cSrcweir void ToolBox::Click() 474cdf0e10cSrcweir { 475cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_CLICK ); 476cdf0e10cSrcweir maClickHdl.Call( this ); 477cdf0e10cSrcweir } 478cdf0e10cSrcweir 479cdf0e10cSrcweir // ----------------------------------------------------------------------- 480cdf0e10cSrcweir 481cdf0e10cSrcweir void ToolBox::DoubleClick() 482cdf0e10cSrcweir { 483cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_DOUBLECLICK ); 484cdf0e10cSrcweir maDoubleClickHdl.Call( this ); 485cdf0e10cSrcweir } 486cdf0e10cSrcweir 487cdf0e10cSrcweir // ----------------------------------------------------------------------- 488cdf0e10cSrcweir 489cdf0e10cSrcweir void ToolBox::Activate() 490cdf0e10cSrcweir { 491cdf0e10cSrcweir mnActivateCount++; 492cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ACTIVATE ); 493cdf0e10cSrcweir maActivateHdl.Call( this ); 494cdf0e10cSrcweir } 495cdf0e10cSrcweir 496cdf0e10cSrcweir // ----------------------------------------------------------------------- 497cdf0e10cSrcweir 498cdf0e10cSrcweir void ToolBox::Deactivate() 499cdf0e10cSrcweir { 500cdf0e10cSrcweir mnActivateCount--; 501cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_DEACTIVATE ); 502cdf0e10cSrcweir maDeactivateHdl.Call( this ); 503cdf0e10cSrcweir 504cdf0e10cSrcweir if ( mbHideStatusText ) 505cdf0e10cSrcweir { 506cdf0e10cSrcweir GetpApp()->HideHelpStatusText(); 507cdf0e10cSrcweir mbHideStatusText = sal_False; 508cdf0e10cSrcweir } 509cdf0e10cSrcweir } 510cdf0e10cSrcweir 511cdf0e10cSrcweir // ----------------------------------------------------------------------- 512cdf0e10cSrcweir 513cdf0e10cSrcweir void ToolBox::Highlight() 514cdf0e10cSrcweir { 515cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_HIGHLIGHT ); 516cdf0e10cSrcweir maHighlightHdl.Call( this ); 517cdf0e10cSrcweir 518cdf0e10cSrcweir XubString aStr = GetHelpText( mnCurItemId ); 519cdf0e10cSrcweir if ( aStr.Len() || mbHideStatusText ) 520cdf0e10cSrcweir { 521cdf0e10cSrcweir GetpApp()->ShowHelpStatusText( aStr ); 522cdf0e10cSrcweir mbHideStatusText = sal_True; 523cdf0e10cSrcweir } 524cdf0e10cSrcweir } 525cdf0e10cSrcweir 526cdf0e10cSrcweir // ----------------------------------------------------------------------- 527cdf0e10cSrcweir 528cdf0e10cSrcweir void ToolBox::Select() 529cdf0e10cSrcweir { 530cdf0e10cSrcweir ImplDelData aDelData; 531cdf0e10cSrcweir ImplAddDel( &aDelData ); 532cdf0e10cSrcweir 533cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_SELECT ); 534cdf0e10cSrcweir maSelectHdl.Call( this ); 535cdf0e10cSrcweir 536cdf0e10cSrcweir if ( aDelData.IsDelete() ) 537cdf0e10cSrcweir return; 538cdf0e10cSrcweir ImplRemoveDel( &aDelData ); 539cdf0e10cSrcweir 540cdf0e10cSrcweir // TODO: GetFloatingWindow in DockingWindow is currently inline, change it to check dockingwrapper 541cdf0e10cSrcweir ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); 542cdf0e10cSrcweir if( pWrapper && pWrapper->GetFloatingWindow() && pWrapper->GetFloatingWindow()->IsInPopupMode() ) 543cdf0e10cSrcweir pWrapper->GetFloatingWindow()->EndPopupMode(); 544cdf0e10cSrcweir } 545cdf0e10cSrcweir 546cdf0e10cSrcweir // ----------------------------------------------------------------------- 547cdf0e10cSrcweir 548cdf0e10cSrcweir void ToolBox::NextToolBox() 549cdf0e10cSrcweir { 550cdf0e10cSrcweir maNextToolBoxHdl.Call( this ); 551cdf0e10cSrcweir } 552cdf0e10cSrcweir 553cdf0e10cSrcweir // ----------------------------------------------------------------------- 554cdf0e10cSrcweir 555cdf0e10cSrcweir void ToolBox::Customize( const ToolBoxCustomizeEvent& ) 556cdf0e10cSrcweir { 557cdf0e10cSrcweir } 558cdf0e10cSrcweir 559cdf0e10cSrcweir // ----------------------------------------------------------------------- 560cdf0e10cSrcweir 561cdf0e10cSrcweir void ToolBox::UserDraw( const UserDrawEvent& ) 562cdf0e10cSrcweir { 563cdf0e10cSrcweir } 564cdf0e10cSrcweir 565cdf0e10cSrcweir // ----------------------------------------------------------------------- 566cdf0e10cSrcweir 567cdf0e10cSrcweir void ToolBox::InsertItem( const ResId& rResId, sal_uInt16 nPos ) 568cdf0e10cSrcweir { 569cdf0e10cSrcweir sal_uLong nObjMask; 570cdf0e10cSrcweir sal_Bool bImage = sal_False; // Wurde Image gesetzt 571cdf0e10cSrcweir 572cdf0e10cSrcweir // Item anlegen 573cdf0e10cSrcweir ImplToolItem aItem; 574cdf0e10cSrcweir 575cdf0e10cSrcweir GetRes( rResId.SetRT( RSC_TOOLBOXITEM ) ); 576cdf0e10cSrcweir nObjMask = ReadLongRes(); 577cdf0e10cSrcweir 578cdf0e10cSrcweir if ( nObjMask & RSC_TOOLBOXITEM_ID ) 579cdf0e10cSrcweir aItem.mnId = sal::static_int_cast<sal_uInt16>(ReadLongRes()); 580cdf0e10cSrcweir else 581cdf0e10cSrcweir aItem.mnId = 1; 582cdf0e10cSrcweir 583cdf0e10cSrcweir if ( nObjMask & RSC_TOOLBOXITEM_TYPE ) 584cdf0e10cSrcweir aItem.meType = (ToolBoxItemType)ReadLongRes(); 585cdf0e10cSrcweir 586cdf0e10cSrcweir if ( nObjMask & RSC_TOOLBOXITEM_STATUS ) 587cdf0e10cSrcweir aItem.mnBits = (ToolBoxItemBits)ReadLongRes(); 588cdf0e10cSrcweir 589cdf0e10cSrcweir if( nObjMask & RSC_TOOLBOXITEM_HELPID ) 590cdf0e10cSrcweir aItem.maHelpId = ReadByteStringRes(); 591cdf0e10cSrcweir 592cdf0e10cSrcweir if ( nObjMask & RSC_TOOLBOXITEM_TEXT ) 593cdf0e10cSrcweir { 594cdf0e10cSrcweir aItem.maText = ReadStringRes(); 595cdf0e10cSrcweir aItem.maText = ImplConvertMenuString( aItem.maText ); 596cdf0e10cSrcweir } 597cdf0e10cSrcweir if ( nObjMask & RSC_TOOLBOXITEM_HELPTEXT ) 598cdf0e10cSrcweir aItem.maHelpText = ReadStringRes(); 599cdf0e10cSrcweir 600cdf0e10cSrcweir if ( nObjMask & RSC_TOOLBOXITEM_BITMAP ) 601cdf0e10cSrcweir { 602cdf0e10cSrcweir Bitmap aBmp = Bitmap( ResId( (RSHEADER_TYPE*)GetClassRes(), *rResId.GetResMgr() ) ); 603cdf0e10cSrcweir IncrementRes( GetObjSizeRes( (RSHEADER_TYPE*)GetClassRes() ) ); 604cdf0e10cSrcweir aItem.maImage = Image( aBmp, IMAGE_STDBTN_COLOR ); 605cdf0e10cSrcweir bImage = sal_True; 606cdf0e10cSrcweir } 607cdf0e10cSrcweir if ( nObjMask & RSC_TOOLBOXITEM_IMAGE ) 608cdf0e10cSrcweir { 609cdf0e10cSrcweir aItem.maImage = Image( ResId( (RSHEADER_TYPE*)GetClassRes(), *rResId.GetResMgr() ) ); 610cdf0e10cSrcweir IncrementRes( GetObjSizeRes( (RSHEADER_TYPE*)GetClassRes() ) ); 611cdf0e10cSrcweir bImage = sal_True; 612cdf0e10cSrcweir } 613cdf0e10cSrcweir if ( nObjMask & RSC_TOOLBOXITEM_DISABLE ) 614cdf0e10cSrcweir aItem.mbEnabled = !(sal_Bool)ReadShortRes(); 615cdf0e10cSrcweir 616cdf0e10cSrcweir if ( nObjMask & RSC_TOOLBOXITEM_STATE ) 617cdf0e10cSrcweir aItem.meState = (TriState)ReadLongRes(); 618cdf0e10cSrcweir 619cdf0e10cSrcweir if ( nObjMask & RSC_TOOLBOXITEM_HIDE ) 620cdf0e10cSrcweir aItem.mbVisible = !((sal_Bool)ReadShortRes()); 621cdf0e10cSrcweir 622cdf0e10cSrcweir if ( nObjMask & RSC_TOOLBOXITEM_COMMAND ) 623cdf0e10cSrcweir aItem.maCommandStr = ReadStringRes(); 624cdf0e10cSrcweir 625cdf0e10cSrcweir // Wenn kein Image geladen wurde, versuchen wir das Image aus der 626cdf0e10cSrcweir // Image-Liste zu holen 627cdf0e10cSrcweir if ( !bImage && aItem.mnId ) 628cdf0e10cSrcweir aItem.maImage = maImageList.GetImage( aItem.mnId ); 629cdf0e10cSrcweir 630cdf0e10cSrcweir // Wenn es sich um ein ButtonItem handelt, die ID ueberpruefen 631cdf0e10cSrcweir sal_Bool bNewCalc; 632cdf0e10cSrcweir if ( aItem.meType != TOOLBOXITEM_BUTTON ) 633cdf0e10cSrcweir { 634cdf0e10cSrcweir bNewCalc = sal_False; 635cdf0e10cSrcweir aItem.mnId = 0; 636cdf0e10cSrcweir } 637cdf0e10cSrcweir else 638cdf0e10cSrcweir { 639cdf0e10cSrcweir bNewCalc = sal_True; 640cdf0e10cSrcweir 641cdf0e10cSrcweir DBG_ASSERT( aItem.mnId, "ToolBox::InsertItem(): ItemId == 0" ); 642cdf0e10cSrcweir DBG_ASSERT( GetItemPos( aItem.mnId ) == TOOLBOX_ITEM_NOTFOUND, 643cdf0e10cSrcweir "ToolBox::InsertItem(): ItemId already exists" ); 644cdf0e10cSrcweir } 645cdf0e10cSrcweir 646cdf0e10cSrcweir // Item anlegen und in die Liste einfuegen 647cdf0e10cSrcweir mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ? mpData->m_aItems.begin()+nPos : mpData->m_aItems.end(), aItem ); 648cdf0e10cSrcweir mpData->ImplClearLayoutData(); 649cdf0e10cSrcweir 650cdf0e10cSrcweir // ToolBox neu brechnen und neu ausgeben 651cdf0e10cSrcweir ImplInvalidate( bNewCalc ); 652cdf0e10cSrcweir 653cdf0e10cSrcweir // Notify 654cdf0e10cSrcweir sal_uInt16 nNewPos = sal::static_int_cast<sal_uInt16>(( nPos == TOOLBOX_APPEND ) ? ( mpData->m_aItems.size() - 1 ) : nPos); 655cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMADDED, reinterpret_cast< void* >( nNewPos ) ); 656cdf0e10cSrcweir } 657cdf0e10cSrcweir 658cdf0e10cSrcweir // ----------------------------------------------------------------------- 659cdf0e10cSrcweir 660cdf0e10cSrcweir void ToolBox::InsertItem( sal_uInt16 nItemId, const Image& rImage, 661cdf0e10cSrcweir ToolBoxItemBits nBits, sal_uInt16 nPos ) 662cdf0e10cSrcweir { 663cdf0e10cSrcweir DBG_ASSERT( nItemId, "ToolBox::InsertItem(): ItemId == 0" ); 664cdf0e10cSrcweir DBG_ASSERT( GetItemPos( nItemId ) == TOOLBOX_ITEM_NOTFOUND, 665cdf0e10cSrcweir "ToolBox::InsertItem(): ItemId already exists" ); 666cdf0e10cSrcweir 667cdf0e10cSrcweir // Item anlegen und in die Liste einfuegen 668cdf0e10cSrcweir mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ? mpData->m_aItems.begin()+nPos : mpData->m_aItems.end(), ImplToolItem( nItemId, rImage, nBits ) ); 669cdf0e10cSrcweir mpData->ImplClearLayoutData(); 670cdf0e10cSrcweir 671cdf0e10cSrcweir ImplInvalidate( sal_True ); 672cdf0e10cSrcweir 673cdf0e10cSrcweir // Notify 674cdf0e10cSrcweir sal_uInt16 nNewPos = sal::static_int_cast<sal_uInt16>(( nPos == TOOLBOX_APPEND ) ? ( mpData->m_aItems.size() - 1 ) : nPos); 675cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMADDED, reinterpret_cast< void* >(nNewPos ) ); 676cdf0e10cSrcweir } 677cdf0e10cSrcweir 678cdf0e10cSrcweir // ----------------------------------------------------------------------- 679cdf0e10cSrcweir 680cdf0e10cSrcweir void ToolBox::InsertItem( sal_uInt16 nItemId, const Image& rImage, 681cdf0e10cSrcweir const XubString& rText, 682cdf0e10cSrcweir ToolBoxItemBits nBits, sal_uInt16 nPos ) 683cdf0e10cSrcweir { 684cdf0e10cSrcweir DBG_ASSERT( nItemId, "ToolBox::InsertItem(): ItemId == 0" ); 685cdf0e10cSrcweir DBG_ASSERT( GetItemPos( nItemId ) == TOOLBOX_ITEM_NOTFOUND, 686cdf0e10cSrcweir "ToolBox::InsertItem(): ItemId already exists" ); 687cdf0e10cSrcweir 688cdf0e10cSrcweir // Item anlegen und in die Liste einfuegen 689cdf0e10cSrcweir mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ? mpData->m_aItems.begin()+nPos : mpData->m_aItems.end(), ImplToolItem( nItemId, rImage, ImplConvertMenuString( rText ), nBits ) ); 690cdf0e10cSrcweir mpData->ImplClearLayoutData(); 691cdf0e10cSrcweir 692cdf0e10cSrcweir ImplInvalidate( sal_True ); 693cdf0e10cSrcweir 694cdf0e10cSrcweir // Notify 695cdf0e10cSrcweir sal_uInt16 nNewPos = sal::static_int_cast<sal_uInt16>(( nPos == TOOLBOX_APPEND ) ? ( mpData->m_aItems.size() - 1 ) : nPos); 696cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMADDED, reinterpret_cast< void* >( nNewPos ) ); 697cdf0e10cSrcweir } 698cdf0e10cSrcweir 699cdf0e10cSrcweir // ----------------------------------------------------------------------- 700cdf0e10cSrcweir 701cdf0e10cSrcweir void ToolBox::InsertItem( sal_uInt16 nItemId, const XubString& rText, 702cdf0e10cSrcweir ToolBoxItemBits nBits, sal_uInt16 nPos ) 703cdf0e10cSrcweir { 704cdf0e10cSrcweir DBG_ASSERT( nItemId, "ToolBox::InsertItem(): ItemId == 0" ); 705cdf0e10cSrcweir DBG_ASSERT( GetItemPos( nItemId ) == TOOLBOX_ITEM_NOTFOUND, 706cdf0e10cSrcweir "ToolBox::InsertItem(): ItemId already exists" ); 707cdf0e10cSrcweir 708cdf0e10cSrcweir // Item anlegen und in die Liste einfuegen 709cdf0e10cSrcweir mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ? mpData->m_aItems.begin()+nPos : mpData->m_aItems.end(), ImplToolItem( nItemId, ImplConvertMenuString( rText ), nBits ) ); 710cdf0e10cSrcweir mpData->ImplClearLayoutData(); 711cdf0e10cSrcweir 712cdf0e10cSrcweir ImplInvalidate( sal_True ); 713cdf0e10cSrcweir 714cdf0e10cSrcweir // Notify 715cdf0e10cSrcweir sal_uInt16 nNewPos = sal::static_int_cast<sal_uInt16>(( nPos == TOOLBOX_APPEND ) ? ( mpData->m_aItems.size() - 1 ) : nPos); 716cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMADDED, reinterpret_cast< void* >( nNewPos ) ); 717cdf0e10cSrcweir } 718cdf0e10cSrcweir 719cdf0e10cSrcweir // ----------------------------------------------------------------------- 720cdf0e10cSrcweir 721cdf0e10cSrcweir void ToolBox::InsertWindow( sal_uInt16 nItemId, Window* pWindow, 722cdf0e10cSrcweir ToolBoxItemBits nBits, sal_uInt16 nPos ) 723cdf0e10cSrcweir { 724cdf0e10cSrcweir DBG_ASSERT( nItemId, "ToolBox::InsertWindow(): ItemId == 0" ); 725cdf0e10cSrcweir DBG_ASSERT( GetItemPos( nItemId ) == TOOLBOX_ITEM_NOTFOUND, 726cdf0e10cSrcweir "ToolBox::InsertWindow(): ItemId already exists" ); 727cdf0e10cSrcweir 728cdf0e10cSrcweir // Item anlegen und in die Liste einfuegen 729cdf0e10cSrcweir ImplToolItem aItem; 730cdf0e10cSrcweir aItem.mnId = nItemId; 731cdf0e10cSrcweir aItem.meType = TOOLBOXITEM_BUTTON; 732cdf0e10cSrcweir aItem.mnBits = nBits; 733cdf0e10cSrcweir aItem.mpWindow = pWindow; 734cdf0e10cSrcweir mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ? mpData->m_aItems.begin()+nPos : mpData->m_aItems.end(), aItem ); 735cdf0e10cSrcweir mpData->ImplClearLayoutData(); 736cdf0e10cSrcweir 737cdf0e10cSrcweir if ( pWindow ) 738cdf0e10cSrcweir pWindow->Hide(); 739cdf0e10cSrcweir 740cdf0e10cSrcweir ImplInvalidate( sal_True ); 741cdf0e10cSrcweir 742cdf0e10cSrcweir // Notify 743cdf0e10cSrcweir sal_uInt16 nNewPos = sal::static_int_cast<sal_uInt16>(( nPos == TOOLBOX_APPEND ) ? ( mpData->m_aItems.size() - 1 ) : nPos); 744cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMADDED, reinterpret_cast< void* >( nNewPos ) ); 745cdf0e10cSrcweir } 746cdf0e10cSrcweir 747cdf0e10cSrcweir // ----------------------------------------------------------------------- 748cdf0e10cSrcweir 749cdf0e10cSrcweir void ToolBox::InsertSpace( sal_uInt16 nPos ) 750cdf0e10cSrcweir { 751cdf0e10cSrcweir // Item anlegen und in die Liste einfuegen 752cdf0e10cSrcweir ImplToolItem aItem; 753cdf0e10cSrcweir aItem.meType = TOOLBOXITEM_SPACE; 754cdf0e10cSrcweir aItem.mbEnabled = sal_False; 755cdf0e10cSrcweir mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ? mpData->m_aItems.begin()+nPos : mpData->m_aItems.end(), aItem ); 756cdf0e10cSrcweir mpData->ImplClearLayoutData(); 757cdf0e10cSrcweir 758cdf0e10cSrcweir ImplInvalidate( sal_False ); 759cdf0e10cSrcweir 760cdf0e10cSrcweir // Notify 761cdf0e10cSrcweir sal_uInt16 nNewPos = sal::static_int_cast<sal_uInt16>(( nPos == TOOLBOX_APPEND ) ? ( mpData->m_aItems.size() - 1 ) : nPos); 762cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMADDED, reinterpret_cast< void* >( nNewPos ) ); 763cdf0e10cSrcweir } 764cdf0e10cSrcweir 765cdf0e10cSrcweir // ----------------------------------------------------------------------- 766cdf0e10cSrcweir 767cdf0e10cSrcweir void ToolBox::InsertSeparator( sal_uInt16 nPos, sal_uInt16 nPixSize ) 768cdf0e10cSrcweir { 769cdf0e10cSrcweir // Item anlegen und in die Liste einfuegen 770cdf0e10cSrcweir ImplToolItem aItem; 771cdf0e10cSrcweir aItem.meType = TOOLBOXITEM_SEPARATOR; 772cdf0e10cSrcweir aItem.mbEnabled = sal_False; 773cdf0e10cSrcweir if ( nPixSize ) 774cdf0e10cSrcweir aItem.mnSepSize = nPixSize; 775cdf0e10cSrcweir mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ? mpData->m_aItems.begin()+nPos : mpData->m_aItems.end(), aItem ); 776cdf0e10cSrcweir mpData->ImplClearLayoutData(); 777cdf0e10cSrcweir 778cdf0e10cSrcweir ImplInvalidate( sal_False ); 779cdf0e10cSrcweir 780cdf0e10cSrcweir // Notify 781cdf0e10cSrcweir sal_uInt16 nNewPos = sal::static_int_cast<sal_uInt16>(( nPos == TOOLBOX_APPEND ) ? ( mpData->m_aItems.size() - 1 ) : nPos); 782cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMADDED, reinterpret_cast< void* >( nNewPos ) ); 783cdf0e10cSrcweir } 784cdf0e10cSrcweir 785cdf0e10cSrcweir // ----------------------------------------------------------------------- 786cdf0e10cSrcweir 787cdf0e10cSrcweir void ToolBox::InsertBreak( sal_uInt16 nPos ) 788cdf0e10cSrcweir { 789cdf0e10cSrcweir // Item anlegen und in die Liste einfuegen 790cdf0e10cSrcweir ImplToolItem aItem; 791cdf0e10cSrcweir aItem.meType = TOOLBOXITEM_BREAK; 792cdf0e10cSrcweir aItem.mbEnabled = sal_False; 793cdf0e10cSrcweir mpData->m_aItems.insert( (nPos < mpData->m_aItems.size()) ? mpData->m_aItems.begin()+nPos : mpData->m_aItems.end(), aItem ); 794cdf0e10cSrcweir mpData->ImplClearLayoutData(); 795cdf0e10cSrcweir 796cdf0e10cSrcweir ImplInvalidate( sal_False ); 797cdf0e10cSrcweir 798cdf0e10cSrcweir // Notify 799cdf0e10cSrcweir sal_uInt16 nNewPos = sal::static_int_cast<sal_uInt16>(( nPos == TOOLBOX_APPEND ) ? ( mpData->m_aItems.size() - 1 ) : nPos); 800cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMADDED, reinterpret_cast< void* >( nNewPos ) ); 801cdf0e10cSrcweir } 802cdf0e10cSrcweir 803cdf0e10cSrcweir // ----------------------------------------------------------------------- 804cdf0e10cSrcweir 805cdf0e10cSrcweir void ToolBox::RemoveItem( sal_uInt16 nPos ) 806cdf0e10cSrcweir { 807cdf0e10cSrcweir if( nPos < mpData->m_aItems.size() ) 808cdf0e10cSrcweir { 809cdf0e10cSrcweir sal_Bool bMustCalc; 810cdf0e10cSrcweir if ( mpData->m_aItems[nPos].meType == TOOLBOXITEM_BUTTON ) 811cdf0e10cSrcweir bMustCalc = sal_True; 812cdf0e10cSrcweir else 813cdf0e10cSrcweir bMustCalc = sal_False; 814cdf0e10cSrcweir 815cdf0e10cSrcweir if ( mpData->m_aItems[nPos].mpWindow ) 816cdf0e10cSrcweir mpData->m_aItems[nPos].mpWindow->Hide(); 817cdf0e10cSrcweir 818cdf0e10cSrcweir // PaintRect um das removete Item erweitern 819cdf0e10cSrcweir maPaintRect.Union( mpData->m_aItems[nPos].maRect ); 820cdf0e10cSrcweir 821cdf0e10cSrcweir // Absichern gegen das Loeschen im Select-Handler 822cdf0e10cSrcweir if ( mpData->m_aItems[nPos].mnId == mnCurItemId ) 823cdf0e10cSrcweir mnCurItemId = 0; 824cdf0e10cSrcweir if ( mpData->m_aItems[nPos].mnId == mnHighItemId ) 825cdf0e10cSrcweir mnHighItemId = 0; 826cdf0e10cSrcweir 827cdf0e10cSrcweir ImplInvalidate( bMustCalc ); 828cdf0e10cSrcweir 829cdf0e10cSrcweir mpData->m_aItems.erase( mpData->m_aItems.begin()+nPos ); 830cdf0e10cSrcweir mpData->ImplClearLayoutData(); 831cdf0e10cSrcweir 832cdf0e10cSrcweir // Notify 833cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMREMOVED, reinterpret_cast< void* >( nPos ) ); 834cdf0e10cSrcweir } 835cdf0e10cSrcweir } 836cdf0e10cSrcweir 837cdf0e10cSrcweir // ----------------------------------------------------------------------- 838cdf0e10cSrcweir 839cdf0e10cSrcweir void ToolBox::MoveItem( sal_uInt16 nItemId, sal_uInt16 nNewPos ) 840cdf0e10cSrcweir { 841cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 842cdf0e10cSrcweir 843cdf0e10cSrcweir if ( nPos == nNewPos ) 844cdf0e10cSrcweir return; 845cdf0e10cSrcweir 846cdf0e10cSrcweir if ( nPos < nNewPos ) 847cdf0e10cSrcweir nNewPos--; 848cdf0e10cSrcweir 849cdf0e10cSrcweir // Existiert Item 850cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 851cdf0e10cSrcweir { 852cdf0e10cSrcweir // ToolBox-Item in der Liste verschieben 853cdf0e10cSrcweir ImplToolItem aItem = mpData->m_aItems[nPos]; 854cdf0e10cSrcweir mpData->m_aItems.erase( mpData->m_aItems.begin()+nPos ); 855cdf0e10cSrcweir mpData->m_aItems.insert( (nNewPos < mpData->m_aItems.size()) ? mpData->m_aItems.begin()+nNewPos : mpData->m_aItems.end(), aItem ); 856cdf0e10cSrcweir mpData->ImplClearLayoutData(); 857cdf0e10cSrcweir 858cdf0e10cSrcweir // ToolBox neu ausgeben 859cdf0e10cSrcweir ImplInvalidate( sal_False ); 860cdf0e10cSrcweir 861cdf0e10cSrcweir // Notify 862cdf0e10cSrcweir if( nPos < nNewPos ) // only send one event, all indices above this item are invalid anyway 863cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMREMOVED, reinterpret_cast< void* >( nPos ) ); 864cdf0e10cSrcweir else 865cdf0e10cSrcweir { 866cdf0e10cSrcweir sal_uInt16 nNewPos2 = sal::static_int_cast<sal_uInt16>(( nNewPos == TOOLBOX_APPEND ) ? ( mpData->m_aItems.size() - 1 ) : nNewPos); 867cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMADDED, reinterpret_cast< void* >( nNewPos2 ) ); 868cdf0e10cSrcweir } 869cdf0e10cSrcweir } 870cdf0e10cSrcweir } 871cdf0e10cSrcweir 872cdf0e10cSrcweir // ----------------------------------------------------------------------- 873cdf0e10cSrcweir 874cdf0e10cSrcweir void ToolBox::CopyItem( const ToolBox& rToolBox, sal_uInt16 nItemId, 875cdf0e10cSrcweir sal_uInt16 nNewPos ) 876cdf0e10cSrcweir { 877cdf0e10cSrcweir DBG_ASSERT( GetItemPos( nItemId ) == TOOLBOX_ITEM_NOTFOUND, 878cdf0e10cSrcweir "ToolBox::CopyItem(): ItemId already exists" ); 879cdf0e10cSrcweir 880cdf0e10cSrcweir sal_uInt16 nPos = rToolBox.GetItemPos( nItemId ); 881cdf0e10cSrcweir 882cdf0e10cSrcweir // Existiert Item 883cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 884cdf0e10cSrcweir { 885cdf0e10cSrcweir // ToolBox-Item in der Liste verschieben 886cdf0e10cSrcweir ImplToolItem aNewItem = rToolBox.mpData->m_aItems[nPos]; 887cdf0e10cSrcweir // Bestimme Daten zuruecksetzen 888cdf0e10cSrcweir aNewItem.mpWindow = NULL; 889cdf0e10cSrcweir aNewItem.mbShowWindow = sal_False; 890cdf0e10cSrcweir 891cdf0e10cSrcweir mpData->m_aItems.insert( (nNewPos < mpData->m_aItems.size()) ? mpData->m_aItems.begin()+nNewPos : mpData->m_aItems.end(), aNewItem ); 892cdf0e10cSrcweir mpData->ImplClearLayoutData(); 893cdf0e10cSrcweir // ToolBox neu ausgeben 894cdf0e10cSrcweir ImplInvalidate( sal_False ); 895cdf0e10cSrcweir 896cdf0e10cSrcweir // Notify 897cdf0e10cSrcweir sal_uInt16 nNewPos2 = sal::static_int_cast<sal_uInt16>(( nNewPos == TOOLBOX_APPEND ) ? ( mpData->m_aItems.size() - 1 ) : nNewPos); 898cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMADDED, reinterpret_cast< void* >( nNewPos2 ) ); 899cdf0e10cSrcweir } 900cdf0e10cSrcweir } 901cdf0e10cSrcweir 902cdf0e10cSrcweir // ----------------------------------------------------------------------- 903cdf0e10cSrcweir 904cdf0e10cSrcweir void ToolBox::CopyItems( const ToolBox& rToolBox ) 905cdf0e10cSrcweir { 906cdf0e10cSrcweir mpData->ImplClearLayoutData(); 907cdf0e10cSrcweir mpData->m_aItems = rToolBox.mpData->m_aItems; 908cdf0e10cSrcweir // Absichern gegen das Loeschen im Select-Handler 909cdf0e10cSrcweir mnCurItemId = 0; 910cdf0e10cSrcweir mnHighItemId = 0; 911cdf0e10cSrcweir 912cdf0e10cSrcweir for( std::vector< ImplToolItem >::iterator it = mpData->m_aItems.begin(); 913cdf0e10cSrcweir it != mpData->m_aItems.end(); ++it ) 914cdf0e10cSrcweir { 915cdf0e10cSrcweir it->mpWindow = NULL; 916cdf0e10cSrcweir it->mbShowWindow = sal_False; 917cdf0e10cSrcweir } 918cdf0e10cSrcweir 919cdf0e10cSrcweir ImplInvalidate( sal_True, sal_True ); 920cdf0e10cSrcweir 921cdf0e10cSrcweir // Notify 922cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ALLITEMSCHANGED ); 923cdf0e10cSrcweir } 924cdf0e10cSrcweir 925cdf0e10cSrcweir // ----------------------------------------------------------------------- 926cdf0e10cSrcweir 927cdf0e10cSrcweir void ToolBox::Clear() 928cdf0e10cSrcweir { 929cdf0e10cSrcweir mpData->m_aItems.clear(); 930cdf0e10cSrcweir mpData->ImplClearLayoutData(); 931cdf0e10cSrcweir 932cdf0e10cSrcweir // Absichern gegen das Loeschen im Select-Handler 933cdf0e10cSrcweir mnCurItemId = 0; 934cdf0e10cSrcweir mnHighItemId = 0; 935cdf0e10cSrcweir 936cdf0e10cSrcweir ImplInvalidate( sal_True, sal_True ); 937cdf0e10cSrcweir 938cdf0e10cSrcweir // Notify 939cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ALLITEMSCHANGED ); 940cdf0e10cSrcweir } 941cdf0e10cSrcweir 942cdf0e10cSrcweir // ----------------------------------------------------------------------- 943cdf0e10cSrcweir 944cdf0e10cSrcweir void ToolBox::SetButtonType( ButtonType eNewType ) 945cdf0e10cSrcweir { 946cdf0e10cSrcweir if ( meButtonType != eNewType ) 947cdf0e10cSrcweir { 948cdf0e10cSrcweir meButtonType = eNewType; 949cdf0e10cSrcweir 950cdf0e10cSrcweir // Hier besser alles neu ausgeben, da es ansonsten zu Problemen 951cdf0e10cSrcweir // mit den per CopyBits kopierten Bereichen geben kann 952cdf0e10cSrcweir ImplInvalidate( sal_True ); 953cdf0e10cSrcweir } 954cdf0e10cSrcweir } 955cdf0e10cSrcweir 956cdf0e10cSrcweir // ----------------------------------------------------------------------- 957cdf0e10cSrcweir 958cdf0e10cSrcweir void ToolBox::SetToolboxButtonSize( ToolBoxButtonSize eSize ) 959cdf0e10cSrcweir { 960cdf0e10cSrcweir if( mpData->meButtonSize != eSize ) 961cdf0e10cSrcweir { 962cdf0e10cSrcweir mpData->meButtonSize = eSize; 963cdf0e10cSrcweir mbCalc = sal_True; 964cdf0e10cSrcweir mbFormat = sal_True; 965cdf0e10cSrcweir } 966cdf0e10cSrcweir } 967cdf0e10cSrcweir 968cdf0e10cSrcweir ToolBoxButtonSize ToolBox::GetToolboxButtonSize() const 969cdf0e10cSrcweir { 970cdf0e10cSrcweir return mpData->meButtonSize; 971cdf0e10cSrcweir } 972cdf0e10cSrcweir 973cdf0e10cSrcweir // ----------------------------------------------------------------------- 974cdf0e10cSrcweir 975cdf0e10cSrcweir const Size& ToolBox::GetDefaultImageSize() const 976cdf0e10cSrcweir { 977cdf0e10cSrcweir static Size aSmallButtonSize( TB_SMALLIMAGESIZE, TB_SMALLIMAGESIZE ); 978cdf0e10cSrcweir 979cdf0e10cSrcweir static sal_uLong s_nSymbolsStyle = STYLE_SYMBOLS_DEFAULT; 980cdf0e10cSrcweir static Size aLargeButtonSize( TB_LARGEIMAGESIZE, TB_LARGEIMAGESIZE ); 981cdf0e10cSrcweir 982cdf0e10cSrcweir sal_uLong nSymbolsStyle = Application::GetSettings().GetStyleSettings().GetCurrentSymbolsStyle(); 983cdf0e10cSrcweir if ( s_nSymbolsStyle != nSymbolsStyle ) 984cdf0e10cSrcweir { 985cdf0e10cSrcweir s_nSymbolsStyle = nSymbolsStyle; 986cdf0e10cSrcweir switch ( nSymbolsStyle ) 987cdf0e10cSrcweir { 988cdf0e10cSrcweir case STYLE_SYMBOLS_INDUSTRIAL: 989cdf0e10cSrcweir aLargeButtonSize = Size( TB_LARGEIMAGESIZE_INDUSTRIAL, TB_LARGEIMAGESIZE_INDUSTRIAL ); 990cdf0e10cSrcweir break; 991cdf0e10cSrcweir case STYLE_SYMBOLS_CRYSTAL: 992cdf0e10cSrcweir aLargeButtonSize = Size( TB_LARGEIMAGESIZE_CRYSTAL, TB_LARGEIMAGESIZE_CRYSTAL ); 993cdf0e10cSrcweir break; 994cdf0e10cSrcweir case STYLE_SYMBOLS_OXYGEN: 995cdf0e10cSrcweir aLargeButtonSize = Size( TB_LARGEIMAGESIZE_OXYGEN, TB_LARGEIMAGESIZE_OXYGEN ); 996cdf0e10cSrcweir break; 997cdf0e10cSrcweir default: 998cdf0e10cSrcweir aLargeButtonSize = Size( TB_LARGEIMAGESIZE, TB_LARGEIMAGESIZE ); 999cdf0e10cSrcweir } 1000cdf0e10cSrcweir } 1001cdf0e10cSrcweir 1002cdf0e10cSrcweir return GetToolboxButtonSize() == TOOLBOX_BUTTONSIZE_LARGE ? aLargeButtonSize : aSmallButtonSize; 1003cdf0e10cSrcweir } 1004cdf0e10cSrcweir 1005cdf0e10cSrcweir // ----------------------------------------------------------------------- 1006cdf0e10cSrcweir 1007cdf0e10cSrcweir void ToolBox::SetAlign( WindowAlign eNewAlign ) 1008cdf0e10cSrcweir { 1009cdf0e10cSrcweir if ( meAlign != eNewAlign ) 1010cdf0e10cSrcweir { 1011cdf0e10cSrcweir meAlign = eNewAlign; 1012cdf0e10cSrcweir 1013cdf0e10cSrcweir if ( !ImplIsFloatingMode() ) 1014cdf0e10cSrcweir { 1015cdf0e10cSrcweir // Setzen, ob Items horizontal oder vertikal angeordnet werden sollen 1016cdf0e10cSrcweir if ( (eNewAlign == WINDOWALIGN_LEFT) || (eNewAlign == WINDOWALIGN_RIGHT) ) 1017cdf0e10cSrcweir mbHorz = sal_False; 1018cdf0e10cSrcweir else 1019cdf0e10cSrcweir mbHorz = sal_True; 1020cdf0e10cSrcweir 1021cdf0e10cSrcweir // Hier alles neu ausgeben, da sich Border auch aendert 1022cdf0e10cSrcweir mbCalc = sal_True; 1023cdf0e10cSrcweir mbFormat = sal_True; 1024cdf0e10cSrcweir if ( IsReallyVisible() && IsUpdateMode() ) 1025cdf0e10cSrcweir Invalidate(); 1026cdf0e10cSrcweir } 1027cdf0e10cSrcweir } 1028cdf0e10cSrcweir } 1029cdf0e10cSrcweir 1030cdf0e10cSrcweir // ----------------------------------------------------------------------- 1031cdf0e10cSrcweir 1032cdf0e10cSrcweir void ToolBox::SetLineCount( sal_uInt16 nNewLines ) 1033cdf0e10cSrcweir { 1034cdf0e10cSrcweir if ( !nNewLines ) 1035cdf0e10cSrcweir nNewLines = 1; 1036cdf0e10cSrcweir 1037cdf0e10cSrcweir if ( mnLines != nNewLines ) 1038cdf0e10cSrcweir { 1039cdf0e10cSrcweir mnLines = nNewLines; 1040cdf0e10cSrcweir 1041cdf0e10cSrcweir // Hier besser alles neu ausgeben, da es ansonsten zu Problemen 1042cdf0e10cSrcweir // mit den per CopyBits kopierten Bereichen geben kann 1043cdf0e10cSrcweir ImplInvalidate( sal_False ); 1044cdf0e10cSrcweir } 1045cdf0e10cSrcweir } 1046cdf0e10cSrcweir 1047cdf0e10cSrcweir // ----------------------------------------------------------------------- 1048cdf0e10cSrcweir 1049cdf0e10cSrcweir void ToolBox::SetPageScroll( sal_Bool b ) 1050cdf0e10cSrcweir { 1051cdf0e10cSrcweir mpData->mbPageScroll = b; 1052cdf0e10cSrcweir } 1053cdf0e10cSrcweir 1054cdf0e10cSrcweir sal_Bool ToolBox::GetPageScroll() 1055cdf0e10cSrcweir { 1056cdf0e10cSrcweir return mpData->mbPageScroll; 1057cdf0e10cSrcweir } 1058cdf0e10cSrcweir 1059cdf0e10cSrcweir // ----------------------------------------------------------------------- 1060cdf0e10cSrcweir 1061cdf0e10cSrcweir void ToolBox::SetNextToolBox( const XubString& rStr ) 1062cdf0e10cSrcweir { 1063cdf0e10cSrcweir sal_Bool bCalcNew = (!maNextToolBoxStr.Len() != !rStr.Len()); 1064cdf0e10cSrcweir maNextToolBoxStr = rStr; 1065cdf0e10cSrcweir if ( bCalcNew ) 1066cdf0e10cSrcweir ImplInvalidate( sal_True, sal_False ); 1067cdf0e10cSrcweir } 1068cdf0e10cSrcweir 1069cdf0e10cSrcweir // ----------------------------------------------------------------------- 1070cdf0e10cSrcweir 1071cdf0e10cSrcweir sal_uInt16 ToolBox::GetItemCount() const 1072cdf0e10cSrcweir { 1073cdf0e10cSrcweir return (sal_uInt16)mpData->m_aItems.size(); 1074cdf0e10cSrcweir } 1075cdf0e10cSrcweir 1076cdf0e10cSrcweir // ----------------------------------------------------------------------- 1077cdf0e10cSrcweir 1078cdf0e10cSrcweir ToolBoxItemType ToolBox::GetItemType( sal_uInt16 nPos ) const 1079cdf0e10cSrcweir { 1080cdf0e10cSrcweir return (nPos < mpData->m_aItems.size()) ? mpData->m_aItems[nPos].meType : TOOLBOXITEM_DONTKNOW; 1081cdf0e10cSrcweir } 1082cdf0e10cSrcweir 1083cdf0e10cSrcweir // ----------------------------------------------------------------------- 1084cdf0e10cSrcweir 1085cdf0e10cSrcweir sal_uInt16 ToolBox::GetItemPos( sal_uInt16 nItemId ) const 1086cdf0e10cSrcweir { 1087cdf0e10cSrcweir int nCount = mpData->m_aItems.size(); 1088cdf0e10cSrcweir for( int nPos = 0; nPos < nCount; nPos++ ) 1089cdf0e10cSrcweir if( mpData->m_aItems[nPos].mnId == nItemId ) 1090cdf0e10cSrcweir return (sal_uInt16)nPos; 1091cdf0e10cSrcweir 1092cdf0e10cSrcweir return TOOLBOX_ITEM_NOTFOUND; 1093cdf0e10cSrcweir } 1094cdf0e10cSrcweir 1095cdf0e10cSrcweir // ----------------------------------------------------------------------- 1096cdf0e10cSrcweir 1097cdf0e10cSrcweir sal_uInt16 ToolBox::GetItemPos( const Point& rPos ) const 1098cdf0e10cSrcweir { 1099cdf0e10cSrcweir // search the item position on the given point 1100cdf0e10cSrcweir sal_uInt16 nRet = TOOLBOX_ITEM_NOTFOUND; 1101cdf0e10cSrcweir sal_uInt16 nPos = 0; 1102cdf0e10cSrcweir std::vector< ImplToolItem >::const_iterator it = mpData->m_aItems.begin(); 1103cdf0e10cSrcweir while( it != mpData->m_aItems.end() ) 1104cdf0e10cSrcweir { 1105cdf0e10cSrcweir if ( it->maRect.IsInside( rPos ) ) 1106cdf0e10cSrcweir { 1107cdf0e10cSrcweir // item found -> save position and break 1108cdf0e10cSrcweir nRet = nPos; 1109cdf0e10cSrcweir break; 1110cdf0e10cSrcweir } 1111cdf0e10cSrcweir 1112cdf0e10cSrcweir ++it; 1113cdf0e10cSrcweir ++nPos; 1114cdf0e10cSrcweir } 1115cdf0e10cSrcweir 1116cdf0e10cSrcweir return nRet; 1117cdf0e10cSrcweir } 1118cdf0e10cSrcweir 1119cdf0e10cSrcweir // ----------------------------------------------------------------------- 1120cdf0e10cSrcweir 1121cdf0e10cSrcweir sal_uInt16 ToolBox::GetItemId( sal_uInt16 nPos ) const 1122cdf0e10cSrcweir { 1123cdf0e10cSrcweir return (nPos < mpData->m_aItems.size()) ? mpData->m_aItems[nPos].mnId : 0; 1124cdf0e10cSrcweir } 1125cdf0e10cSrcweir 1126cdf0e10cSrcweir // ----------------------------------------------------------------------- 1127cdf0e10cSrcweir 1128cdf0e10cSrcweir sal_uInt16 ToolBox::GetItemId( const Point& rPos ) const 1129cdf0e10cSrcweir { 1130cdf0e10cSrcweir // Item suchen, das geklickt wurde 1131cdf0e10cSrcweir std::vector< ImplToolItem >::const_iterator it = mpData->m_aItems.begin(); 1132cdf0e10cSrcweir while( it != mpData->m_aItems.end() ) 1133cdf0e10cSrcweir { 1134cdf0e10cSrcweir // Ist es dieses Item 1135cdf0e10cSrcweir if ( it->maRect.IsInside( rPos ) ) 1136cdf0e10cSrcweir { 1137cdf0e10cSrcweir if ( it->meType == TOOLBOXITEM_BUTTON ) 1138cdf0e10cSrcweir return it->mnId; 1139cdf0e10cSrcweir else 1140cdf0e10cSrcweir return 0; 1141cdf0e10cSrcweir } 1142cdf0e10cSrcweir 1143cdf0e10cSrcweir ++it; 1144cdf0e10cSrcweir } 1145cdf0e10cSrcweir 1146cdf0e10cSrcweir return 0; 1147cdf0e10cSrcweir } 1148cdf0e10cSrcweir 1149cdf0e10cSrcweir // ----------------------------------------------------------------------- 1150cdf0e10cSrcweir 1151cdf0e10cSrcweir Point ToolBox::ImplGetPopupPosition( const Rectangle& rRect, const Size& rSize ) const 1152cdf0e10cSrcweir { 1153cdf0e10cSrcweir Point aPos; 1154cdf0e10cSrcweir if( !rRect.IsEmpty() ) 1155cdf0e10cSrcweir { 1156cdf0e10cSrcweir Rectangle aScreen = GetDesktopRectPixel(); 1157cdf0e10cSrcweir 1158cdf0e10cSrcweir // the popup should be positioned so that it will not cover 1159cdf0e10cSrcweir // the item rect and that it fits the desktop 1160cdf0e10cSrcweir // the preferred direction is always towards the center of 1161cdf0e10cSrcweir // the application window 1162cdf0e10cSrcweir 1163cdf0e10cSrcweir Point devPos; // the position in device coordinates for screen comparison 1164cdf0e10cSrcweir switch( meAlign ) 1165cdf0e10cSrcweir { 1166cdf0e10cSrcweir case WINDOWALIGN_TOP: 1167cdf0e10cSrcweir aPos = rRect.BottomLeft(); 1168cdf0e10cSrcweir aPos.Y()++; 1169cdf0e10cSrcweir devPos = OutputToAbsoluteScreenPixel( aPos ); 1170cdf0e10cSrcweir if( devPos.Y() + rSize.Height() >= aScreen.Bottom() ) 1171cdf0e10cSrcweir aPos.Y() = rRect.Top() - rSize.Height(); 1172cdf0e10cSrcweir break; 1173cdf0e10cSrcweir case WINDOWALIGN_BOTTOM: 1174cdf0e10cSrcweir aPos = rRect.TopLeft(); 1175cdf0e10cSrcweir aPos.Y()--; 1176cdf0e10cSrcweir devPos = OutputToAbsoluteScreenPixel( aPos ); 1177cdf0e10cSrcweir if( devPos.Y() - rSize.Height() > aScreen.Top() ) 1178cdf0e10cSrcweir aPos.Y() -= rSize.Height(); 1179cdf0e10cSrcweir else 1180cdf0e10cSrcweir aPos.Y() = rRect.Bottom(); 1181cdf0e10cSrcweir break; 1182cdf0e10cSrcweir case WINDOWALIGN_LEFT: 1183cdf0e10cSrcweir aPos = rRect.TopRight(); 1184cdf0e10cSrcweir aPos.X()++; 1185cdf0e10cSrcweir devPos = OutputToAbsoluteScreenPixel( aPos ); 1186cdf0e10cSrcweir if( devPos.X() + rSize.Width() >= aScreen.Right() ) 1187cdf0e10cSrcweir aPos.X() = rRect.Left() - rSize.Width(); 1188cdf0e10cSrcweir break; 1189cdf0e10cSrcweir case WINDOWALIGN_RIGHT: 1190cdf0e10cSrcweir aPos = rRect.TopLeft(); 1191cdf0e10cSrcweir aPos.X()--; 1192cdf0e10cSrcweir devPos = OutputToAbsoluteScreenPixel( aPos ); 1193cdf0e10cSrcweir if( devPos.X() - rSize.Width() > aScreen.Left() ) 1194cdf0e10cSrcweir aPos.X() -= rSize.Width(); 1195cdf0e10cSrcweir else 1196cdf0e10cSrcweir aPos.X() = rRect.Right(); 1197cdf0e10cSrcweir break; 1198cdf0e10cSrcweir default: 1199cdf0e10cSrcweir break; 1200cdf0e10cSrcweir }; 1201cdf0e10cSrcweir } 1202cdf0e10cSrcweir return aPos; 1203cdf0e10cSrcweir } 1204cdf0e10cSrcweir 1205cdf0e10cSrcweir 1206cdf0e10cSrcweir Point ToolBox::GetItemPopupPosition( sal_uInt16 nItemId, const Size& rSize ) const 1207cdf0e10cSrcweir { 1208cdf0e10cSrcweir return ImplGetPopupPosition( GetItemRect( nItemId ), rSize ); 1209cdf0e10cSrcweir } 1210cdf0e10cSrcweir 1211cdf0e10cSrcweir // ----------------------------------------------------------------------- 1212cdf0e10cSrcweir 1213cdf0e10cSrcweir Rectangle ToolBox::GetItemRect( sal_uInt16 nItemId ) const 1214cdf0e10cSrcweir { 1215cdf0e10cSrcweir if ( mbCalc || mbFormat ) 1216cdf0e10cSrcweir ((ToolBox*)this)->ImplFormat(); 1217cdf0e10cSrcweir 1218cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1219cdf0e10cSrcweir return GetItemPosRect( nPos ); 1220cdf0e10cSrcweir } 1221cdf0e10cSrcweir 1222cdf0e10cSrcweir // ----------------------------------------------------------------------- 1223cdf0e10cSrcweir 1224cdf0e10cSrcweir Rectangle ToolBox::GetItemPosRect( sal_uInt16 nPos ) const 1225cdf0e10cSrcweir { 1226cdf0e10cSrcweir if ( mbCalc || mbFormat ) 1227cdf0e10cSrcweir ((ToolBox*)this)->ImplFormat(); 1228cdf0e10cSrcweir 1229cdf0e10cSrcweir if ( nPos < mpData->m_aItems.size() ) 1230cdf0e10cSrcweir return mpData->m_aItems[nPos].maRect; 1231cdf0e10cSrcweir else 1232cdf0e10cSrcweir return Rectangle(); 1233cdf0e10cSrcweir } 1234cdf0e10cSrcweir 1235cdf0e10cSrcweir // ----------------------------------------------------------------------- 1236cdf0e10cSrcweir Rectangle ToolBox::GetItemDropDownRect( sal_uInt16 nItemId ) const 1237cdf0e10cSrcweir { 1238cdf0e10cSrcweir if ( mbCalc || mbFormat ) 1239cdf0e10cSrcweir ((ToolBox*)this)->ImplFormat(); 1240cdf0e10cSrcweir 1241cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1242cdf0e10cSrcweir return GetItemPosDropDownRect( nPos ); 1243cdf0e10cSrcweir } 1244cdf0e10cSrcweir 1245cdf0e10cSrcweir // ----------------------------------------------------------------------- 1246cdf0e10cSrcweir 1247cdf0e10cSrcweir Rectangle ToolBox::GetItemPosDropDownRect( sal_uInt16 nPos ) const 1248cdf0e10cSrcweir { 1249cdf0e10cSrcweir if ( mbCalc || mbFormat ) 1250cdf0e10cSrcweir ((ToolBox*)this)->ImplFormat(); 1251cdf0e10cSrcweir 1252cdf0e10cSrcweir if ( nPos < mpData->m_aItems.size() ) 1253cdf0e10cSrcweir return mpData->m_aItems[nPos].GetDropDownRect( mbHorz ); 1254cdf0e10cSrcweir else 1255cdf0e10cSrcweir return Rectangle(); 1256cdf0e10cSrcweir } 1257cdf0e10cSrcweir 1258cdf0e10cSrcweir // ----------------------------------------------------------------------- 1259cdf0e10cSrcweir 1260cdf0e10cSrcweir Rectangle ToolBox::GetMenubuttonRect() const 1261cdf0e10cSrcweir { 1262cdf0e10cSrcweir return mpData->maMenubuttonItem.maRect; 1263cdf0e10cSrcweir } 1264cdf0e10cSrcweir 1265cdf0e10cSrcweir sal_Bool ToolBox::ImplHasExternalMenubutton() 1266cdf0e10cSrcweir { 1267cdf0e10cSrcweir // check if the borderwindow (i.e. the decoration) provides the menu button 1268cdf0e10cSrcweir sal_Bool bRet = sal_False; 1269cdf0e10cSrcweir if( ImplIsFloatingMode() ) 1270cdf0e10cSrcweir { 1271cdf0e10cSrcweir // custom menu is placed in the decoration 1272cdf0e10cSrcweir ImplBorderWindow *pBorderWin = dynamic_cast<ImplBorderWindow*>( GetWindow( WINDOW_BORDER ) ); 1273cdf0e10cSrcweir if( pBorderWin && !pBorderWin->GetMenuRect().IsEmpty() ) 1274cdf0e10cSrcweir bRet = sal_True; 1275cdf0e10cSrcweir } 1276cdf0e10cSrcweir return bRet; 1277cdf0e10cSrcweir } 1278cdf0e10cSrcweir // ----------------------------------------------------------------------- 1279cdf0e10cSrcweir 1280cdf0e10cSrcweir void ToolBox::SetItemBits( sal_uInt16 nItemId, ToolBoxItemBits nBits ) 1281cdf0e10cSrcweir { 1282cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1283cdf0e10cSrcweir 1284cdf0e10cSrcweir if ( nPos < mpData->m_aItems.size() ) 1285cdf0e10cSrcweir { 1286cdf0e10cSrcweir ToolBoxItemBits nOldBits = mpData->m_aItems[nPos].mnBits; 1287cdf0e10cSrcweir mpData->m_aItems[nPos].mnBits = nBits; 1288cdf0e10cSrcweir nBits &= TIB_LEFT | TIB_AUTOSIZE | TIB_DROPDOWN; 1289cdf0e10cSrcweir nOldBits &= TIB_LEFT | TIB_AUTOSIZE | TIB_DROPDOWN; 1290cdf0e10cSrcweir // trigger reformat when the item width has changed (dropdown arrow) 1291cdf0e10cSrcweir sal_Bool bFormat = (nBits & TIB_DROPDOWN) != (nOldBits & TIB_DROPDOWN); 1292cdf0e10cSrcweir if ( nBits != nOldBits ) 1293cdf0e10cSrcweir ImplInvalidate( sal_True, bFormat ); 1294cdf0e10cSrcweir } 1295cdf0e10cSrcweir } 1296cdf0e10cSrcweir 1297cdf0e10cSrcweir // ----------------------------------------------------------------------- 1298cdf0e10cSrcweir 1299cdf0e10cSrcweir ToolBoxItemBits ToolBox::GetItemBits( sal_uInt16 nItemId ) const 1300cdf0e10cSrcweir { 1301cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1302cdf0e10cSrcweir 1303cdf0e10cSrcweir if ( pItem ) 1304cdf0e10cSrcweir return pItem->mnBits; 1305cdf0e10cSrcweir else 1306cdf0e10cSrcweir return 0; 1307cdf0e10cSrcweir } 1308cdf0e10cSrcweir 1309cdf0e10cSrcweir // ----------------------------------------------------------------------- 1310cdf0e10cSrcweir 1311cdf0e10cSrcweir void ToolBox::SetItemData( sal_uInt16 nItemId, void* pNewData ) 1312cdf0e10cSrcweir { 1313cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1314cdf0e10cSrcweir 1315cdf0e10cSrcweir if ( nPos < mpData->m_aItems.size() ) 1316cdf0e10cSrcweir { 1317cdf0e10cSrcweir mpData->m_aItems[nPos].mpUserData = pNewData; 1318cdf0e10cSrcweir ImplUpdateItem( nPos ); 1319cdf0e10cSrcweir } 1320cdf0e10cSrcweir } 1321cdf0e10cSrcweir 1322cdf0e10cSrcweir // ----------------------------------------------------------------------- 1323cdf0e10cSrcweir 1324cdf0e10cSrcweir void* ToolBox::GetItemData( sal_uInt16 nItemId ) const 1325cdf0e10cSrcweir { 1326cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1327cdf0e10cSrcweir 1328cdf0e10cSrcweir if ( pItem ) 1329cdf0e10cSrcweir return pItem->mpUserData; 1330cdf0e10cSrcweir else 1331cdf0e10cSrcweir return NULL; 1332cdf0e10cSrcweir } 1333cdf0e10cSrcweir 1334cdf0e10cSrcweir // ----------------------------------------------------------------------- 1335cdf0e10cSrcweir 1336cdf0e10cSrcweir void ToolBox::SetItemImage( sal_uInt16 nItemId, const Image& rImage ) 1337cdf0e10cSrcweir { 1338cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1339cdf0e10cSrcweir 1340cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 1341cdf0e10cSrcweir { 1342cdf0e10cSrcweir ImplToolItem* pItem = &mpData->m_aItems[nPos]; 1343cdf0e10cSrcweir // Nur wenn alles berechnet ist, mehr Aufwand treiben 1344cdf0e10cSrcweir if ( !mbCalc ) 1345cdf0e10cSrcweir { 1346cdf0e10cSrcweir Size aOldSize = pItem->maImage.GetSizePixel(); 1347cdf0e10cSrcweir pItem->maImage = rImage; 1348cdf0e10cSrcweir if ( aOldSize != pItem->maImage.GetSizePixel() ) 1349cdf0e10cSrcweir ImplInvalidate( sal_True ); 1350cdf0e10cSrcweir else 1351cdf0e10cSrcweir ImplUpdateItem( nPos ); 1352cdf0e10cSrcweir } 1353cdf0e10cSrcweir else 1354cdf0e10cSrcweir pItem->maImage = rImage; 1355cdf0e10cSrcweir } 1356cdf0e10cSrcweir } 1357cdf0e10cSrcweir 1358cdf0e10cSrcweir // ----------------------------------------------------------------------- 1359cdf0e10cSrcweir 1360cdf0e10cSrcweir void ToolBox::SetImageList( const ImageList& rImageList ) 1361cdf0e10cSrcweir { 1362cdf0e10cSrcweir maImageList = rImageList; 1363cdf0e10cSrcweir 1364cdf0e10cSrcweir sal_uInt16 nCount = (sal_uInt16)mpData->m_aItems.size(); 1365cdf0e10cSrcweir for( sal_uInt16 i = 0; i < nCount; i++ ) 1366cdf0e10cSrcweir { 1367cdf0e10cSrcweir Image aImage; 1368cdf0e10cSrcweir if ( mpData->m_aItems[i].mnId ) 1369cdf0e10cSrcweir aImage = maImageList.GetImage( mpData->m_aItems[i].mnId ); 1370cdf0e10cSrcweir if( !!aImage ) 1371cdf0e10cSrcweir SetItemImage( mpData->m_aItems[i].mnId, aImage ); 1372cdf0e10cSrcweir } 1373cdf0e10cSrcweir } 1374cdf0e10cSrcweir 1375cdf0e10cSrcweir // ----------------------------------------------------------------------- 1376cdf0e10cSrcweir 1377cdf0e10cSrcweir static Image ImplRotImage( const Image& rImage, long nAngle10 ) 1378cdf0e10cSrcweir { 1379cdf0e10cSrcweir Image aRet; 1380cdf0e10cSrcweir BitmapEx aRotBitmapEx( rImage.GetBitmapEx() ); 1381cdf0e10cSrcweir 1382cdf0e10cSrcweir aRotBitmapEx.Rotate( nAngle10, Color( COL_WHITE ) ); 1383cdf0e10cSrcweir 1384cdf0e10cSrcweir return Image( aRotBitmapEx ); 1385cdf0e10cSrcweir } 1386cdf0e10cSrcweir 1387cdf0e10cSrcweir void ToolBox::SetItemImageAngle( sal_uInt16 nItemId, long nAngle10 ) 1388cdf0e10cSrcweir { 1389cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1390cdf0e10cSrcweir 1391cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 1392cdf0e10cSrcweir { 1393cdf0e10cSrcweir ImplToolItem* pItem = &mpData->m_aItems[nPos]; 1394cdf0e10cSrcweir Size aOldSize = pItem->maImage.GetSizePixel(); 1395cdf0e10cSrcweir 1396cdf0e10cSrcweir long nDeltaAngle = (nAngle10 - pItem->mnImageAngle) % 3600; 1397cdf0e10cSrcweir while( nDeltaAngle < 0 ) 1398cdf0e10cSrcweir nDeltaAngle += 3600; 1399cdf0e10cSrcweir 1400cdf0e10cSrcweir pItem->mnImageAngle = nAngle10; 1401cdf0e10cSrcweir if( nDeltaAngle && !!pItem->maImage ) 1402cdf0e10cSrcweir { 1403cdf0e10cSrcweir pItem->maImage = ImplRotImage( pItem->maImage, nDeltaAngle ); 1404cdf0e10cSrcweir if( !!pItem->maHighImage ) 1405cdf0e10cSrcweir pItem->maHighImage = ImplRotImage( pItem->maHighImage, nDeltaAngle ); 1406cdf0e10cSrcweir } 1407cdf0e10cSrcweir 1408cdf0e10cSrcweir if ( !mbCalc ) 1409cdf0e10cSrcweir { 1410cdf0e10cSrcweir if ( aOldSize != pItem->maImage.GetSizePixel() ) 1411cdf0e10cSrcweir ImplInvalidate( sal_True ); 1412cdf0e10cSrcweir else 1413cdf0e10cSrcweir ImplUpdateItem( nPos ); 1414cdf0e10cSrcweir } 1415cdf0e10cSrcweir } 1416cdf0e10cSrcweir } 1417cdf0e10cSrcweir 1418cdf0e10cSrcweir // ----------------------------------------------------------------------- 1419cdf0e10cSrcweir 1420cdf0e10cSrcweir static Image ImplMirrorImage( const Image& rImage ) 1421cdf0e10cSrcweir { 1422cdf0e10cSrcweir Image aRet; 1423cdf0e10cSrcweir BitmapEx aMirrBitmapEx( rImage.GetBitmapEx() ); 1424cdf0e10cSrcweir 1425cdf0e10cSrcweir aMirrBitmapEx.Mirror( BMP_MIRROR_HORZ ); 1426cdf0e10cSrcweir 1427cdf0e10cSrcweir return Image( aMirrBitmapEx ); 1428cdf0e10cSrcweir } 1429cdf0e10cSrcweir 1430cdf0e10cSrcweir void ToolBox::SetItemImageMirrorMode( sal_uInt16 nItemId, sal_Bool bMirror ) 1431cdf0e10cSrcweir { 1432cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1433cdf0e10cSrcweir 1434cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 1435cdf0e10cSrcweir { 1436cdf0e10cSrcweir ImplToolItem* pItem = &mpData->m_aItems[nPos]; 1437cdf0e10cSrcweir 1438cdf0e10cSrcweir if( ( pItem->mbMirrorMode && ! bMirror ) || 1439cdf0e10cSrcweir ( ! pItem->mbMirrorMode && bMirror ) 1440cdf0e10cSrcweir ) 1441cdf0e10cSrcweir { 1442cdf0e10cSrcweir pItem->mbMirrorMode = bMirror ? true : false; 1443cdf0e10cSrcweir if( !!pItem->maImage ) 1444cdf0e10cSrcweir { 1445cdf0e10cSrcweir pItem->maImage = ImplMirrorImage( pItem->maImage ); 1446cdf0e10cSrcweir if( !!pItem->maHighImage ) 1447cdf0e10cSrcweir pItem->maHighImage = ImplMirrorImage( pItem->maHighImage ); 1448cdf0e10cSrcweir } 1449cdf0e10cSrcweir 1450cdf0e10cSrcweir if ( !mbCalc ) 1451cdf0e10cSrcweir ImplUpdateItem( nPos ); 1452cdf0e10cSrcweir } 1453cdf0e10cSrcweir } 1454cdf0e10cSrcweir } 1455cdf0e10cSrcweir 1456cdf0e10cSrcweir // ----------------------------------------------------------------------- 1457cdf0e10cSrcweir 1458cdf0e10cSrcweir Image ToolBox::GetItemImage( sal_uInt16 nItemId ) const 1459cdf0e10cSrcweir { 1460cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1461cdf0e10cSrcweir 1462cdf0e10cSrcweir if ( pItem ) 1463cdf0e10cSrcweir return pItem->maImage; 1464cdf0e10cSrcweir else 1465cdf0e10cSrcweir return Image(); 1466cdf0e10cSrcweir } 1467cdf0e10cSrcweir 1468cdf0e10cSrcweir // ----------------------------------------------------------------------- 1469cdf0e10cSrcweir 1470cdf0e10cSrcweir long ToolBox::GetItemImageAngle( sal_uInt16 nItemId ) const 1471cdf0e10cSrcweir { 1472cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1473cdf0e10cSrcweir 1474cdf0e10cSrcweir if ( pItem ) 1475cdf0e10cSrcweir return pItem->mnImageAngle; 1476cdf0e10cSrcweir else 1477cdf0e10cSrcweir return 0; 1478cdf0e10cSrcweir } 1479cdf0e10cSrcweir 1480cdf0e10cSrcweir // ----------------------------------------------------------------------- 1481cdf0e10cSrcweir 1482cdf0e10cSrcweir sal_Bool ToolBox::GetItemImageMirrorMode( sal_uInt16 nItemId ) const 1483cdf0e10cSrcweir { 1484cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1485cdf0e10cSrcweir 1486cdf0e10cSrcweir if ( pItem ) 1487cdf0e10cSrcweir return pItem->mbMirrorMode; 1488cdf0e10cSrcweir else 1489cdf0e10cSrcweir return sal_False; 1490cdf0e10cSrcweir } 1491cdf0e10cSrcweir 1492cdf0e10cSrcweir // ----------------------------------------------------------------------- 1493cdf0e10cSrcweir 1494cdf0e10cSrcweir void ToolBox::SetItemHighImage( sal_uInt16 nItemId, const Image& rImage ) 1495cdf0e10cSrcweir { 1496cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1497cdf0e10cSrcweir if ( pItem ) 1498cdf0e10cSrcweir { 1499cdf0e10cSrcweir DBG_ASSERT( (pItem->maImage.GetSizePixel() == rImage.GetSizePixel()) || 1500cdf0e10cSrcweir ((!rImage) == sal_True), "ToolBox::SetItemHighImage() - ImageSize != HighImageSize" ); 1501cdf0e10cSrcweir pItem->maHighImage = rImage; 1502cdf0e10cSrcweir } 1503cdf0e10cSrcweir } 1504cdf0e10cSrcweir 1505cdf0e10cSrcweir // ----------------------------------------------------------------------- 1506cdf0e10cSrcweir 1507cdf0e10cSrcweir Image ToolBox::GetItemHighImage( sal_uInt16 nItemId ) const 1508cdf0e10cSrcweir { 1509cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1510cdf0e10cSrcweir 1511cdf0e10cSrcweir if ( pItem ) 1512cdf0e10cSrcweir return pItem->maHighImage; 1513cdf0e10cSrcweir else 1514cdf0e10cSrcweir return Image(); 1515cdf0e10cSrcweir } 1516cdf0e10cSrcweir 1517cdf0e10cSrcweir // ----------------------------------------------------------------------- 1518cdf0e10cSrcweir 1519cdf0e10cSrcweir void ToolBox::SetItemText( sal_uInt16 nItemId, const XubString& rText ) 1520cdf0e10cSrcweir { 1521cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1522cdf0e10cSrcweir 1523cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 1524cdf0e10cSrcweir { 1525cdf0e10cSrcweir ImplToolItem* pItem = &mpData->m_aItems[nPos]; 1526cdf0e10cSrcweir // Nur wenn alles berechnet ist, mehr Aufwand treiben 1527cdf0e10cSrcweir if ( !mbCalc && 1528cdf0e10cSrcweir ((meButtonType != BUTTON_SYMBOL) || !pItem->maImage) ) 1529cdf0e10cSrcweir { 1530cdf0e10cSrcweir long nOldWidth = GetCtrlTextWidth( pItem->maText ); 1531cdf0e10cSrcweir pItem->maText = ImplConvertMenuString( rText ); 1532cdf0e10cSrcweir mpData->ImplClearLayoutData(); 1533cdf0e10cSrcweir if ( nOldWidth != GetCtrlTextWidth( pItem->maText ) ) 1534cdf0e10cSrcweir ImplInvalidate( sal_True ); 1535cdf0e10cSrcweir else 1536cdf0e10cSrcweir ImplUpdateItem( nPos ); 1537cdf0e10cSrcweir } 1538cdf0e10cSrcweir else 1539cdf0e10cSrcweir pItem->maText = ImplConvertMenuString( rText ); 1540cdf0e10cSrcweir 1541cdf0e10cSrcweir // Notify button changed event to prepare accessibility bridge 1542cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_BUTTONSTATECHANGED, reinterpret_cast< void* >( nPos ) ); 1543cdf0e10cSrcweir 1544cdf0e10cSrcweir // Notify 1545cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMTEXTCHANGED, reinterpret_cast< void* >( nPos ) ); 1546cdf0e10cSrcweir } 1547cdf0e10cSrcweir } 1548cdf0e10cSrcweir 1549cdf0e10cSrcweir // ----------------------------------------------------------------------- 1550cdf0e10cSrcweir 1551cdf0e10cSrcweir const XubString& ToolBox::GetItemText( sal_uInt16 nItemId ) const 1552cdf0e10cSrcweir { 1553cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1554cdf0e10cSrcweir 1555cdf0e10cSrcweir if ( pItem ) 1556cdf0e10cSrcweir return pItem->maText; 1557cdf0e10cSrcweir else 1558cdf0e10cSrcweir return ImplGetSVEmptyStr(); 1559cdf0e10cSrcweir } 1560cdf0e10cSrcweir 1561cdf0e10cSrcweir // ----------------------------------------------------------------------- 1562cdf0e10cSrcweir 1563cdf0e10cSrcweir void ToolBox::SetItemWindow( sal_uInt16 nItemId, Window* pNewWindow ) 1564cdf0e10cSrcweir { 1565cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1566cdf0e10cSrcweir 1567cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 1568cdf0e10cSrcweir { 1569cdf0e10cSrcweir ImplToolItem* pItem = &mpData->m_aItems[nPos]; 1570cdf0e10cSrcweir pItem->mpWindow = pNewWindow; 1571cdf0e10cSrcweir if ( pNewWindow ) 1572cdf0e10cSrcweir pNewWindow->Hide(); 1573cdf0e10cSrcweir ImplInvalidate( sal_True ); 1574cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_ITEMWINDOWCHANGED, reinterpret_cast< void* >( nPos ) ); 1575cdf0e10cSrcweir } 1576cdf0e10cSrcweir } 1577cdf0e10cSrcweir 1578cdf0e10cSrcweir // ----------------------------------------------------------------------- 1579cdf0e10cSrcweir 1580cdf0e10cSrcweir Window* ToolBox::GetItemWindow( sal_uInt16 nItemId ) const 1581cdf0e10cSrcweir { 1582cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1583cdf0e10cSrcweir 1584cdf0e10cSrcweir if ( pItem ) 1585cdf0e10cSrcweir return pItem->mpWindow; 1586cdf0e10cSrcweir else 1587cdf0e10cSrcweir return NULL; 1588cdf0e10cSrcweir } 1589cdf0e10cSrcweir 1590cdf0e10cSrcweir // ----------------------------------------------------------------------- 1591cdf0e10cSrcweir 1592cdf0e10cSrcweir void ToolBox::StartSelection() 1593cdf0e10cSrcweir { 1594cdf0e10cSrcweir if ( mbDrag ) 1595cdf0e10cSrcweir EndSelection(); 1596cdf0e10cSrcweir 1597cdf0e10cSrcweir if ( !mbSelection ) 1598cdf0e10cSrcweir { 1599cdf0e10cSrcweir mbSelection = sal_True; 1600cdf0e10cSrcweir mnCurPos = TOOLBOX_ITEM_NOTFOUND; 1601cdf0e10cSrcweir mnCurItemId = 0; 1602cdf0e10cSrcweir Activate(); 1603cdf0e10cSrcweir } 1604cdf0e10cSrcweir } 1605cdf0e10cSrcweir 1606cdf0e10cSrcweir // ----------------------------------------------------------------------- 1607cdf0e10cSrcweir 1608cdf0e10cSrcweir void ToolBox::EndSelection() 1609cdf0e10cSrcweir { 1610cdf0e10cSrcweir mbCommandDrag = sal_False; 1611cdf0e10cSrcweir 1612cdf0e10cSrcweir if ( mbDrag || mbSelection ) 1613cdf0e10cSrcweir { 1614cdf0e10cSrcweir // Daten zuruecksetzen 1615cdf0e10cSrcweir mbDrag = sal_False; 1616cdf0e10cSrcweir mbSelection = sal_False; 1617cdf0e10cSrcweir if ( mnCurPos != TOOLBOX_ITEM_NOTFOUND ) 1618cdf0e10cSrcweir ImplDrawItem( mnCurPos ); 1619cdf0e10cSrcweir EndTracking(); 1620cdf0e10cSrcweir ReleaseMouse(); 1621cdf0e10cSrcweir Deactivate(); 1622cdf0e10cSrcweir } 1623cdf0e10cSrcweir 1624cdf0e10cSrcweir mnCurPos = TOOLBOX_ITEM_NOTFOUND; 1625cdf0e10cSrcweir mnCurItemId = 0; 1626cdf0e10cSrcweir mnDownItemId = 0; 1627cdf0e10cSrcweir mnMouseClicks = 0; 1628cdf0e10cSrcweir mnMouseModifier = 0; 1629cdf0e10cSrcweir } 1630cdf0e10cSrcweir 1631cdf0e10cSrcweir // ----------------------------------------------------------------------- 1632cdf0e10cSrcweir 1633cdf0e10cSrcweir void ToolBox::SetItemDown( sal_uInt16 nItemId, sal_Bool bDown, sal_Bool bRelease ) 1634cdf0e10cSrcweir { 1635cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1636cdf0e10cSrcweir 1637cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 1638cdf0e10cSrcweir { 1639cdf0e10cSrcweir if ( bDown ) 1640cdf0e10cSrcweir { 1641cdf0e10cSrcweir if ( nPos != mnCurPos ) 1642cdf0e10cSrcweir { 1643cdf0e10cSrcweir mnCurPos = nPos; 1644cdf0e10cSrcweir ImplDrawItem( mnCurPos, sal_True ); 1645cdf0e10cSrcweir Flush(); 1646cdf0e10cSrcweir } 1647cdf0e10cSrcweir } 1648cdf0e10cSrcweir else 1649cdf0e10cSrcweir { 1650cdf0e10cSrcweir if ( nPos == mnCurPos ) 1651cdf0e10cSrcweir { 1652cdf0e10cSrcweir ImplDrawItem( mnCurPos, sal_False ); 1653cdf0e10cSrcweir Flush(); 1654cdf0e10cSrcweir mnCurPos = TOOLBOX_ITEM_NOTFOUND; 1655cdf0e10cSrcweir } 1656cdf0e10cSrcweir } 1657cdf0e10cSrcweir 1658cdf0e10cSrcweir if ( bRelease ) 1659cdf0e10cSrcweir { 1660cdf0e10cSrcweir if ( mbDrag || mbSelection ) 1661cdf0e10cSrcweir { 1662cdf0e10cSrcweir mbDrag = sal_False; 1663cdf0e10cSrcweir mbSelection = sal_False; 1664cdf0e10cSrcweir EndTracking(); 1665cdf0e10cSrcweir ReleaseMouse(); 1666cdf0e10cSrcweir Deactivate(); 1667cdf0e10cSrcweir } 1668cdf0e10cSrcweir 1669cdf0e10cSrcweir mnCurItemId = 0; 1670cdf0e10cSrcweir mnDownItemId = 0; 1671cdf0e10cSrcweir mnMouseClicks = 0; 1672cdf0e10cSrcweir mnMouseModifier = 0; 1673cdf0e10cSrcweir } 1674cdf0e10cSrcweir } 1675cdf0e10cSrcweir } 1676cdf0e10cSrcweir 1677cdf0e10cSrcweir // ----------------------------------------------------------------------- 1678cdf0e10cSrcweir 1679cdf0e10cSrcweir sal_Bool ToolBox::IsItemDown( sal_uInt16 nItemId ) const 1680cdf0e10cSrcweir { 1681cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1682cdf0e10cSrcweir 1683cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 1684cdf0e10cSrcweir return (nPos == mnCurPos); 1685cdf0e10cSrcweir else 1686cdf0e10cSrcweir return sal_False; 1687cdf0e10cSrcweir } 1688cdf0e10cSrcweir 1689cdf0e10cSrcweir // ----------------------------------------------------------------------- 1690cdf0e10cSrcweir 1691cdf0e10cSrcweir void ToolBox::SetItemState( sal_uInt16 nItemId, TriState eState ) 1692cdf0e10cSrcweir { 1693cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1694cdf0e10cSrcweir 1695cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 1696cdf0e10cSrcweir { 1697cdf0e10cSrcweir ImplToolItem* pItem = &mpData->m_aItems[nPos]; 1698cdf0e10cSrcweir 1699cdf0e10cSrcweir // Hat sich der Status geaendert 1700cdf0e10cSrcweir if ( pItem->meState != eState ) 1701cdf0e10cSrcweir { 1702cdf0e10cSrcweir // Wenn RadioCheck, dann vorherigen unchecken 1703cdf0e10cSrcweir if ( (eState == STATE_CHECK) && (pItem->mnBits & TIB_AUTOCHECK) && 1704cdf0e10cSrcweir (pItem->mnBits & TIB_RADIOCHECK) ) 1705cdf0e10cSrcweir { 1706cdf0e10cSrcweir ImplToolItem* pGroupItem; 1707cdf0e10cSrcweir sal_uInt16 nGroupPos; 1708cdf0e10cSrcweir sal_uInt16 nItemCount = GetItemCount(); 1709cdf0e10cSrcweir 1710cdf0e10cSrcweir nGroupPos = nPos; 1711cdf0e10cSrcweir while ( nGroupPos ) 1712cdf0e10cSrcweir { 1713cdf0e10cSrcweir pGroupItem = &mpData->m_aItems[nGroupPos-1]; 1714cdf0e10cSrcweir if ( pGroupItem->mnBits & TIB_RADIOCHECK ) 1715cdf0e10cSrcweir { 1716cdf0e10cSrcweir if ( pGroupItem->meState != STATE_NOCHECK ) 1717cdf0e10cSrcweir SetItemState( pGroupItem->mnId, STATE_NOCHECK ); 1718cdf0e10cSrcweir } 1719cdf0e10cSrcweir else 1720cdf0e10cSrcweir break; 1721cdf0e10cSrcweir nGroupPos--; 1722cdf0e10cSrcweir } 1723cdf0e10cSrcweir 1724cdf0e10cSrcweir nGroupPos = nPos+1; 1725cdf0e10cSrcweir while ( nGroupPos < nItemCount ) 1726cdf0e10cSrcweir { 1727cdf0e10cSrcweir pGroupItem = &mpData->m_aItems[nGroupPos]; 1728cdf0e10cSrcweir if ( pGroupItem->mnBits & TIB_RADIOCHECK ) 1729cdf0e10cSrcweir { 1730cdf0e10cSrcweir if ( pGroupItem->meState != STATE_NOCHECK ) 1731cdf0e10cSrcweir SetItemState( pGroupItem->mnId, STATE_NOCHECK ); 1732cdf0e10cSrcweir } 1733cdf0e10cSrcweir else 1734cdf0e10cSrcweir break; 1735cdf0e10cSrcweir nGroupPos++; 1736cdf0e10cSrcweir } 1737cdf0e10cSrcweir } 1738cdf0e10cSrcweir 1739cdf0e10cSrcweir pItem->meState = eState; 1740cdf0e10cSrcweir ImplUpdateItem( nPos ); 1741cdf0e10cSrcweir 1742cdf0e10cSrcweir // Notify button changed event to prepare accessibility bridge 1743cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_BUTTONSTATECHANGED, reinterpret_cast< void* >( nPos ) ); 1744cdf0e10cSrcweir 1745cdf0e10cSrcweir // Notify 1746cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_CLICK, reinterpret_cast< void* >( nPos ) ); 1747cdf0e10cSrcweir } 1748cdf0e10cSrcweir } 1749cdf0e10cSrcweir } 1750cdf0e10cSrcweir 1751cdf0e10cSrcweir // ----------------------------------------------------------------------- 1752cdf0e10cSrcweir 1753cdf0e10cSrcweir TriState ToolBox::GetItemState( sal_uInt16 nItemId ) const 1754cdf0e10cSrcweir { 1755cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1756cdf0e10cSrcweir 1757cdf0e10cSrcweir if ( pItem ) 1758cdf0e10cSrcweir return pItem->meState; 1759cdf0e10cSrcweir else 1760cdf0e10cSrcweir return STATE_NOCHECK; 1761cdf0e10cSrcweir } 1762cdf0e10cSrcweir 1763cdf0e10cSrcweir // ----------------------------------------------------------------------- 1764cdf0e10cSrcweir 1765cdf0e10cSrcweir void ToolBox::EnableItem( sal_uInt16 nItemId, sal_Bool bEnable ) 1766cdf0e10cSrcweir { 1767cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1768cdf0e10cSrcweir 1769cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 1770cdf0e10cSrcweir { 1771cdf0e10cSrcweir ImplToolItem* pItem = &mpData->m_aItems[nPos]; 1772cdf0e10cSrcweir if ( bEnable ) 1773cdf0e10cSrcweir bEnable = sal_True; 1774cdf0e10cSrcweir if ( pItem->mbEnabled != bEnable ) 1775cdf0e10cSrcweir { 1776cdf0e10cSrcweir pItem->mbEnabled = bEnable; 1777cdf0e10cSrcweir 1778cdf0e10cSrcweir // Gegebenenfalls das Fenster mit updaten 1779cdf0e10cSrcweir if ( pItem->mpWindow ) 1780cdf0e10cSrcweir pItem->mpWindow->Enable( pItem->mbEnabled ); 1781cdf0e10cSrcweir 1782cdf0e10cSrcweir // Item updaten 1783cdf0e10cSrcweir ImplUpdateItem( nPos ); 1784cdf0e10cSrcweir 1785cdf0e10cSrcweir ImplUpdateInputEnable(); 1786cdf0e10cSrcweir 1787cdf0e10cSrcweir // Notify button changed event to prepare accessibility bridge 1788cdf0e10cSrcweir ImplCallEventListeners( VCLEVENT_TOOLBOX_BUTTONSTATECHANGED, reinterpret_cast< void* >( nPos ) ); 1789cdf0e10cSrcweir 1790cdf0e10cSrcweir ImplCallEventListeners( bEnable ? VCLEVENT_TOOLBOX_ITEMENABLED : VCLEVENT_TOOLBOX_ITEMDISABLED, reinterpret_cast< void* >( nPos ) ); 1791cdf0e10cSrcweir } 1792cdf0e10cSrcweir } 1793cdf0e10cSrcweir } 1794cdf0e10cSrcweir 1795cdf0e10cSrcweir // ----------------------------------------------------------------------- 1796cdf0e10cSrcweir 1797cdf0e10cSrcweir sal_Bool ToolBox::IsItemEnabled( sal_uInt16 nItemId ) const 1798cdf0e10cSrcweir { 1799cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1800cdf0e10cSrcweir 1801cdf0e10cSrcweir if ( pItem ) 1802cdf0e10cSrcweir return pItem->mbEnabled; 1803cdf0e10cSrcweir else 1804cdf0e10cSrcweir return sal_False; 1805cdf0e10cSrcweir } 1806cdf0e10cSrcweir 1807cdf0e10cSrcweir // ----------------------------------------------------------------------- 1808cdf0e10cSrcweir 1809cdf0e10cSrcweir void ToolBox::ShowItem( sal_uInt16 nItemId, sal_Bool bVisible ) 1810cdf0e10cSrcweir { 1811cdf0e10cSrcweir sal_uInt16 nPos = GetItemPos( nItemId ); 1812cdf0e10cSrcweir mpData->ImplClearLayoutData(); 1813cdf0e10cSrcweir 1814cdf0e10cSrcweir if ( nPos != TOOLBOX_ITEM_NOTFOUND ) 1815cdf0e10cSrcweir { 1816cdf0e10cSrcweir ImplToolItem* pItem = &mpData->m_aItems[nPos]; 1817cdf0e10cSrcweir if ( pItem->mbVisible != bVisible ) 1818cdf0e10cSrcweir { 1819cdf0e10cSrcweir pItem->mbVisible = bVisible; 1820cdf0e10cSrcweir ImplInvalidate( sal_False ); 1821cdf0e10cSrcweir } 1822cdf0e10cSrcweir } 1823cdf0e10cSrcweir } 1824cdf0e10cSrcweir 1825cdf0e10cSrcweir // ----------------------------------------------------------------------- 1826cdf0e10cSrcweir 1827cdf0e10cSrcweir sal_Bool ToolBox::IsItemVisible( sal_uInt16 nItemId ) const 1828cdf0e10cSrcweir { 1829cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1830cdf0e10cSrcweir 1831cdf0e10cSrcweir if ( pItem ) 1832cdf0e10cSrcweir return pItem->mbVisible; 1833cdf0e10cSrcweir else 1834cdf0e10cSrcweir return sal_False; 1835cdf0e10cSrcweir } 1836cdf0e10cSrcweir 1837cdf0e10cSrcweir // ----------------------------------------------------------------------- 1838cdf0e10cSrcweir 1839cdf0e10cSrcweir sal_Bool ToolBox::IsItemReallyVisible( sal_uInt16 nItemId ) const 1840cdf0e10cSrcweir { 1841cdf0e10cSrcweir // is the item on the visible area of the toolbox? 1842cdf0e10cSrcweir sal_Bool bRet = sal_False; 1843cdf0e10cSrcweir Rectangle aRect( mnLeftBorder, mnTopBorder, mnDX-mnRightBorder, mnDY-mnBottomBorder ); 1844cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1845cdf0e10cSrcweir 1846cdf0e10cSrcweir if ( pItem && pItem->mbVisible && 1847cdf0e10cSrcweir !pItem->maRect.IsEmpty() && aRect.IsOver( pItem->maRect ) ) 1848cdf0e10cSrcweir { 1849cdf0e10cSrcweir bRet = sal_True; 1850cdf0e10cSrcweir } 1851cdf0e10cSrcweir 1852cdf0e10cSrcweir return bRet; 1853cdf0e10cSrcweir } 1854cdf0e10cSrcweir 1855cdf0e10cSrcweir // ----------------------------------------------------------------------- 1856cdf0e10cSrcweir 1857cdf0e10cSrcweir void ToolBox::SetItemCommand( sal_uInt16 nItemId, const XubString& rCommand ) 1858cdf0e10cSrcweir { 1859cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1860cdf0e10cSrcweir 1861cdf0e10cSrcweir if ( pItem ) 1862cdf0e10cSrcweir pItem->maCommandStr = rCommand; 1863cdf0e10cSrcweir } 1864cdf0e10cSrcweir 1865cdf0e10cSrcweir // ----------------------------------------------------------------------- 1866cdf0e10cSrcweir 1867cdf0e10cSrcweir const XubString& ToolBox::GetItemCommand( sal_uInt16 nItemId ) const 1868cdf0e10cSrcweir { 1869cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1870cdf0e10cSrcweir 1871cdf0e10cSrcweir if ( pItem ) 1872cdf0e10cSrcweir return pItem->maCommandStr; 1873cdf0e10cSrcweir else 1874cdf0e10cSrcweir return ImplGetSVEmptyStr(); 1875cdf0e10cSrcweir } 1876cdf0e10cSrcweir 1877cdf0e10cSrcweir // ----------------------------------------------------------------------- 1878cdf0e10cSrcweir 1879cdf0e10cSrcweir void ToolBox::SetQuickHelpText( sal_uInt16 nItemId, const XubString& rText ) 1880cdf0e10cSrcweir { 1881cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1882cdf0e10cSrcweir 1883cdf0e10cSrcweir if ( pItem ) 1884cdf0e10cSrcweir pItem->maQuickHelpText = rText; 1885cdf0e10cSrcweir } 1886cdf0e10cSrcweir 1887cdf0e10cSrcweir // ----------------------------------------------------------------------- 1888cdf0e10cSrcweir 1889cdf0e10cSrcweir const XubString& ToolBox::GetQuickHelpText( sal_uInt16 nItemId ) const 1890cdf0e10cSrcweir { 1891cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1892cdf0e10cSrcweir 1893cdf0e10cSrcweir if ( pItem ) 1894cdf0e10cSrcweir return pItem->maQuickHelpText; 1895cdf0e10cSrcweir else 1896cdf0e10cSrcweir return ImplGetSVEmptyStr(); 1897cdf0e10cSrcweir } 1898cdf0e10cSrcweir 1899cdf0e10cSrcweir // ----------------------------------------------------------------------- 1900cdf0e10cSrcweir 1901cdf0e10cSrcweir void ToolBox::SetHelpText( sal_uInt16 nItemId, const XubString& rText ) 1902cdf0e10cSrcweir { 1903cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1904cdf0e10cSrcweir 1905cdf0e10cSrcweir if ( pItem ) 1906cdf0e10cSrcweir pItem->maHelpText = rText; 1907cdf0e10cSrcweir } 1908cdf0e10cSrcweir 1909cdf0e10cSrcweir // ----------------------------------------------------------------------- 1910cdf0e10cSrcweir 1911cdf0e10cSrcweir const XubString& ToolBox::GetHelpText( sal_uInt16 nItemId ) const 1912cdf0e10cSrcweir { 1913cdf0e10cSrcweir return ImplGetHelpText( nItemId ); 1914cdf0e10cSrcweir } 1915cdf0e10cSrcweir 1916cdf0e10cSrcweir // ----------------------------------------------------------------------- 1917cdf0e10cSrcweir 1918cdf0e10cSrcweir void ToolBox::SetHelpId( sal_uInt16 nItemId, const rtl::OString& rHelpId ) 1919cdf0e10cSrcweir { 1920cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1921cdf0e10cSrcweir 1922cdf0e10cSrcweir if ( pItem ) 1923cdf0e10cSrcweir pItem->maHelpId = rHelpId; 1924cdf0e10cSrcweir } 1925cdf0e10cSrcweir 1926cdf0e10cSrcweir // ----------------------------------------------------------------------- 1927cdf0e10cSrcweir 1928cdf0e10cSrcweir rtl::OString ToolBox::GetHelpId( sal_uInt16 nItemId ) const 1929cdf0e10cSrcweir { 1930cdf0e10cSrcweir rtl::OString aRet; 1931cdf0e10cSrcweir 1932cdf0e10cSrcweir ImplToolItem* pItem = ImplGetItem( nItemId ); 1933cdf0e10cSrcweir 1934cdf0e10cSrcweir if ( pItem ) 1935cdf0e10cSrcweir { 1936cdf0e10cSrcweir if ( pItem->maHelpId.getLength() ) 1937cdf0e10cSrcweir aRet = pItem->maHelpId; 1938cdf0e10cSrcweir else 1939cdf0e10cSrcweir aRet = ::rtl::OUStringToOString( pItem->maCommandStr, RTL_TEXTENCODING_UTF8 ); 1940cdf0e10cSrcweir } 1941cdf0e10cSrcweir 1942cdf0e10cSrcweir return aRet; 1943cdf0e10cSrcweir } 1944cdf0e10cSrcweir 1945cdf0e10cSrcweir // ----------------------------------------------------------------------- 1946cdf0e10cSrcweir 1947cdf0e10cSrcweir void ToolBox::SetBorder( long nX, long nY ) 1948cdf0e10cSrcweir { 1949cdf0e10cSrcweir mnBorderX = nX; 1950cdf0e10cSrcweir mnBorderY = nY; 1951cdf0e10cSrcweir 1952cdf0e10cSrcweir ImplInvalidate( sal_True, sal_True ); 1953cdf0e10cSrcweir } 1954cdf0e10cSrcweir 1955cdf0e10cSrcweir // ----------------------------------------------------------------------- 1956cdf0e10cSrcweir 1957cdf0e10cSrcweir void ToolBox::SetOutStyle( sal_uInt16 nNewStyle ) 1958cdf0e10cSrcweir { 1959cdf0e10cSrcweir // always force flat looking toolbars since NWF 1960cdf0e10cSrcweir nNewStyle |= TOOLBOX_STYLE_FLAT; 1961cdf0e10cSrcweir 1962cdf0e10cSrcweir if ( mnOutStyle != nNewStyle ) 1963cdf0e10cSrcweir { 1964cdf0e10cSrcweir mnOutStyle = nNewStyle; 1965cdf0e10cSrcweir ImplDisableFlatButtons(); 1966cdf0e10cSrcweir 1967cdf0e10cSrcweir // Damit das ButtonDevice neu angelegt wird 1968cdf0e10cSrcweir if ( !(mnOutStyle & TOOLBOX_STYLE_FLAT) ) 1969cdf0e10cSrcweir { 1970cdf0e10cSrcweir mnMaxItemWidth = 1; 1971cdf0e10cSrcweir mnMaxItemHeight = 1; 1972cdf0e10cSrcweir } 1973cdf0e10cSrcweir 1974cdf0e10cSrcweir ImplInvalidate( sal_True, sal_True ); 1975cdf0e10cSrcweir } 1976cdf0e10cSrcweir } 1977cdf0e10cSrcweir 1978cdf0e10cSrcweir // ----------------------------------------------------------------------- 1979cdf0e10cSrcweir 1980cdf0e10cSrcweir void ToolBox::RecalcItems() 1981cdf0e10cSrcweir { 1982cdf0e10cSrcweir ImplInvalidate( sal_True ); 1983cdf0e10cSrcweir } 1984cdf0e10cSrcweir 1985cdf0e10cSrcweir // ----------------------------------------------------------------------- 1986cdf0e10cSrcweir 1987cdf0e10cSrcweir // disable key input if all items are disabled 1988cdf0e10cSrcweir 1989cdf0e10cSrcweir void ToolBox::ImplUpdateInputEnable() 1990cdf0e10cSrcweir { 1991cdf0e10cSrcweir for( std::vector< ImplToolItem >::const_iterator it = mpData->m_aItems.begin(); 1992cdf0e10cSrcweir it != mpData->m_aItems.end(); ++it ) 1993cdf0e10cSrcweir { 1994cdf0e10cSrcweir if( it->mbEnabled ) 1995cdf0e10cSrcweir { 1996cdf0e10cSrcweir // at least one useful entry 1997cdf0e10cSrcweir mpData->mbKeyInputDisabled = sal_False; 1998cdf0e10cSrcweir return; 1999cdf0e10cSrcweir } 2000cdf0e10cSrcweir } 2001cdf0e10cSrcweir mpData->mbKeyInputDisabled = sal_True; 2002cdf0e10cSrcweir } 2003cdf0e10cSrcweir 2004cdf0e10cSrcweir // ----------------------------------------------------------------------- 2005cdf0e10cSrcweir 2006cdf0e10cSrcweir void ToolBox::ImplFillLayoutData() const 2007cdf0e10cSrcweir { 2008cdf0e10cSrcweir mpData->m_pLayoutData = new ToolBoxLayoutData(); 2009cdf0e10cSrcweir 2010cdf0e10cSrcweir sal_uInt16 nCount = (sal_uInt16)mpData->m_aItems.size(); 2011cdf0e10cSrcweir for( sal_uInt16 i = 0; i < nCount; i++ ) 2012cdf0e10cSrcweir { 2013cdf0e10cSrcweir ImplToolItem* pItem = &mpData->m_aItems[i]; 2014cdf0e10cSrcweir 2015cdf0e10cSrcweir // Nur malen, wenn Rechteck im PaintRectangle liegt 2016cdf0e10cSrcweir if ( !pItem->maRect.IsEmpty() ) 2017cdf0e10cSrcweir const_cast<ToolBox*>(this)->ImplDrawItem( i, sal_False, sal_False, sal_True ); 2018cdf0e10cSrcweir } 2019cdf0e10cSrcweir } 2020cdf0e10cSrcweir 2021cdf0e10cSrcweir // ----------------------------------------------------------------------- 2022cdf0e10cSrcweir 2023cdf0e10cSrcweir String ToolBox::GetDisplayText() const 2024cdf0e10cSrcweir { 2025cdf0e10cSrcweir if( ! mpData->m_pLayoutData ) 2026cdf0e10cSrcweir ImplFillLayoutData(); 2027cdf0e10cSrcweir return mpData->m_pLayoutData ? mpData->m_pLayoutData->m_aDisplayText : String(); 2028cdf0e10cSrcweir } 2029cdf0e10cSrcweir 2030cdf0e10cSrcweir // ----------------------------------------------------------------------- 2031cdf0e10cSrcweir 2032cdf0e10cSrcweir Rectangle ToolBox::GetCharacterBounds( sal_uInt16 nItemID, long nIndex ) const 2033cdf0e10cSrcweir { 2034cdf0e10cSrcweir long nItemIndex = -1; 2035cdf0e10cSrcweir if( ! mpData->m_pLayoutData ) 2036cdf0e10cSrcweir ImplFillLayoutData(); 2037cdf0e10cSrcweir if( mpData->m_pLayoutData ) 2038cdf0e10cSrcweir { 2039cdf0e10cSrcweir for( sal_uLong i = 0; i < mpData->m_pLayoutData->m_aLineItemIds.size(); i++ ) 2040cdf0e10cSrcweir { 2041cdf0e10cSrcweir if( mpData->m_pLayoutData->m_aLineItemIds[i] == nItemID ) 2042cdf0e10cSrcweir { 2043cdf0e10cSrcweir nItemIndex = mpData->m_pLayoutData->m_aLineIndices[i]; 2044cdf0e10cSrcweir break; 2045cdf0e10cSrcweir } 2046cdf0e10cSrcweir } 2047cdf0e10cSrcweir } 2048cdf0e10cSrcweir return (mpData->m_pLayoutData && nItemIndex != -1) ? mpData->m_pLayoutData->GetCharacterBounds( nItemIndex+nIndex ) : Rectangle(); 2049cdf0e10cSrcweir } 2050cdf0e10cSrcweir 2051cdf0e10cSrcweir // ----------------------------------------------------------------------- 2052cdf0e10cSrcweir 2053cdf0e10cSrcweir long ToolBox::GetIndexForPoint( const Point& rPoint, sal_uInt16& rItemID ) const 2054cdf0e10cSrcweir { 2055cdf0e10cSrcweir long nIndex = -1; 2056cdf0e10cSrcweir rItemID = 0; 2057cdf0e10cSrcweir if( ! mpData->m_pLayoutData ) 2058cdf0e10cSrcweir ImplFillLayoutData(); 2059cdf0e10cSrcweir if( mpData->m_pLayoutData ) 2060cdf0e10cSrcweir { 2061cdf0e10cSrcweir nIndex = mpData->m_pLayoutData->GetIndexForPoint( rPoint ); 2062cdf0e10cSrcweir for( sal_uLong i = 0; i < mpData->m_pLayoutData->m_aLineIndices.size(); i++ ) 2063cdf0e10cSrcweir { 2064cdf0e10cSrcweir if( mpData->m_pLayoutData->m_aLineIndices[i] <= nIndex && 2065cdf0e10cSrcweir (i == mpData->m_pLayoutData->m_aLineIndices.size()-1 || mpData->m_pLayoutData->m_aLineIndices[i+1] > nIndex) ) 2066cdf0e10cSrcweir { 2067cdf0e10cSrcweir rItemID = mpData->m_pLayoutData->m_aLineItemIds[i]; 2068cdf0e10cSrcweir break; 2069cdf0e10cSrcweir } 2070cdf0e10cSrcweir } 2071cdf0e10cSrcweir } 2072cdf0e10cSrcweir return nIndex; 2073cdf0e10cSrcweir } 2074cdf0e10cSrcweir 2075cdf0e10cSrcweir // ----------------------------------------------------------------------- 2076cdf0e10cSrcweir 2077cdf0e10cSrcweir long ToolBox::GetTextCount() const 2078cdf0e10cSrcweir { 2079cdf0e10cSrcweir if( ! mpData->m_pLayoutData ) 2080cdf0e10cSrcweir ImplFillLayoutData(); 2081cdf0e10cSrcweir return mpData->m_pLayoutData ? mpData->m_pLayoutData->GetLineCount() : 0; 2082cdf0e10cSrcweir } 2083cdf0e10cSrcweir 2084cdf0e10cSrcweir // ----------------------------------------------------------------------- 2085cdf0e10cSrcweir 2086cdf0e10cSrcweir Pair ToolBox::GetTextStartEnd( long nText ) const 2087cdf0e10cSrcweir { 2088cdf0e10cSrcweir if( ! mpData->m_pLayoutData ) 2089cdf0e10cSrcweir ImplFillLayoutData(); 2090cdf0e10cSrcweir return mpData->m_pLayoutData ? mpData->m_pLayoutData->GetLineStartEnd( nText ) : Pair( -1, -1 ); 2091cdf0e10cSrcweir } 2092cdf0e10cSrcweir 2093cdf0e10cSrcweir // ----------------------------------------------------------------------- 2094cdf0e10cSrcweir 2095cdf0e10cSrcweir sal_uInt16 ToolBox::GetDisplayItemId( long nText ) const 2096cdf0e10cSrcweir { 2097cdf0e10cSrcweir sal_uInt16 nItemId = 0; 2098cdf0e10cSrcweir if( ! mpData->m_pLayoutData ) 2099cdf0e10cSrcweir ImplFillLayoutData(); 2100cdf0e10cSrcweir if( mpData->m_pLayoutData && nText >= 0 && (sal_uLong)nText < mpData->m_pLayoutData->m_aLineItemIds.size() ) 2101cdf0e10cSrcweir nItemId = mpData->m_pLayoutData->m_aLineItemIds[nText]; 2102cdf0e10cSrcweir return nItemId; 2103cdf0e10cSrcweir } 2104cdf0e10cSrcweir 2105cdf0e10cSrcweir 2106cdf0e10cSrcweir // ----------------------------------------------------------------------- 2107cdf0e10cSrcweir 2108cdf0e10cSrcweir void ToolBox::SetDropdownClickHdl( const Link& rLink ) 2109cdf0e10cSrcweir { 2110cdf0e10cSrcweir mpData->maDropdownClickHdl = rLink; 2111cdf0e10cSrcweir } 2112cdf0e10cSrcweir 2113cdf0e10cSrcweir const Link& ToolBox::GetDropdownClickHdl() const 2114cdf0e10cSrcweir { 2115cdf0e10cSrcweir return mpData->maDropdownClickHdl; 2116cdf0e10cSrcweir } 2117cdf0e10cSrcweir 2118cdf0e10cSrcweir // ----------------------------------------------------------------------- 2119cdf0e10cSrcweir 2120cdf0e10cSrcweir void ToolBox::SetMenuType( sal_uInt16 aType ) 2121cdf0e10cSrcweir { 2122cdf0e10cSrcweir if( aType != mpData->maMenuType ) 2123cdf0e10cSrcweir { 2124cdf0e10cSrcweir mpData->maMenuType = aType; 2125cdf0e10cSrcweir if( IsFloatingMode() ) 2126cdf0e10cSrcweir { 2127cdf0e10cSrcweir // the menu button may have to be moved into the decoration which changes the layout 2128cdf0e10cSrcweir ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); 2129cdf0e10cSrcweir if( pWrapper ) 2130cdf0e10cSrcweir pWrapper->ShowTitleButton( TITLE_BUTTON_MENU, ( aType & TOOLBOX_MENUTYPE_CUSTOMIZE) ? sal_True : sal_False ); 2131cdf0e10cSrcweir 2132cdf0e10cSrcweir mbFormat = sal_True; 2133cdf0e10cSrcweir ImplFormat(); 2134cdf0e10cSrcweir ImplSetMinMaxFloatSize( this ); 2135cdf0e10cSrcweir } 2136cdf0e10cSrcweir else 2137cdf0e10cSrcweir { 2138cdf0e10cSrcweir // trigger redraw of menu button 2139cdf0e10cSrcweir if( !mpData->maMenubuttonItem.maRect.IsEmpty() ) 2140cdf0e10cSrcweir Invalidate(mpData->maMenubuttonItem.maRect); 2141cdf0e10cSrcweir } 2142cdf0e10cSrcweir } 2143cdf0e10cSrcweir } 2144cdf0e10cSrcweir 2145cdf0e10cSrcweir sal_uInt16 ToolBox::GetMenuType() const 2146cdf0e10cSrcweir { 2147cdf0e10cSrcweir return mpData->maMenuType; 2148cdf0e10cSrcweir } 2149cdf0e10cSrcweir 2150cdf0e10cSrcweir sal_Bool ToolBox::IsMenuEnabled() const 2151cdf0e10cSrcweir { 2152cdf0e10cSrcweir return mpData->maMenuType != TOOLBOX_MENUTYPE_NONE; 2153cdf0e10cSrcweir } 2154cdf0e10cSrcweir 2155cdf0e10cSrcweir PopupMenu* ToolBox::GetMenu() const 2156cdf0e10cSrcweir { 2157cdf0e10cSrcweir return mpData->mpMenu; 2158cdf0e10cSrcweir } 2159cdf0e10cSrcweir 2160cdf0e10cSrcweir void ToolBox::SetMenuButtonHdl( const Link& rLink ) 2161cdf0e10cSrcweir { 2162cdf0e10cSrcweir mpData->maMenuButtonHdl = rLink; 2163cdf0e10cSrcweir } 2164cdf0e10cSrcweir 2165cdf0e10cSrcweir const Link& ToolBox::GetMenuButtonHdl() const 2166cdf0e10cSrcweir { 2167cdf0e10cSrcweir return mpData->maMenuButtonHdl; 2168cdf0e10cSrcweir } 2169cdf0e10cSrcweir 2170cdf0e10cSrcweir // ----------------------------------------------------------------------- 2171cdf0e10cSrcweir 2172cdf0e10cSrcweir sal_Bool ToolBox::ImplHasClippedItems() 2173cdf0e10cSrcweir { 2174cdf0e10cSrcweir // are any items currently clipped ? 2175cdf0e10cSrcweir ImplFormat(); 2176cdf0e10cSrcweir std::vector< ImplToolItem >::const_iterator it = mpData->m_aItems.begin(); 2177cdf0e10cSrcweir while ( it != mpData->m_aItems.end() ) 2178cdf0e10cSrcweir { 2179cdf0e10cSrcweir if( it->IsClipped() ) 2180cdf0e10cSrcweir return sal_True; 2181cdf0e10cSrcweir it++; 2182cdf0e10cSrcweir } 2183cdf0e10cSrcweir return sal_False; 2184cdf0e10cSrcweir } 2185cdf0e10cSrcweir 2186cdf0e10cSrcweir void ToolBox::ImplUpdateCustomMenu() 2187cdf0e10cSrcweir { 2188cdf0e10cSrcweir // fill clipped items into menu 2189cdf0e10cSrcweir if( !IsMenuEnabled() ) 2190cdf0e10cSrcweir return; 2191cdf0e10cSrcweir 2192cdf0e10cSrcweir PopupMenu *pMenu = GetMenu(); 2193cdf0e10cSrcweir 2194cdf0e10cSrcweir sal_uInt16 i = 0; 2195cdf0e10cSrcweir // remove old entries 2196cdf0e10cSrcweir while( i < pMenu->GetItemCount() ) 2197cdf0e10cSrcweir { 2198cdf0e10cSrcweir if( pMenu->GetItemId( i ) >= TOOLBOX_MENUITEM_START ) 2199cdf0e10cSrcweir { 2200cdf0e10cSrcweir pMenu->RemoveItem( i ); 2201cdf0e10cSrcweir i = 0; 2202cdf0e10cSrcweir } 2203cdf0e10cSrcweir else 2204cdf0e10cSrcweir i++; 2205cdf0e10cSrcweir } 2206cdf0e10cSrcweir 2207cdf0e10cSrcweir // add menu items, starting from the end and inserting at pos 0 2208cdf0e10cSrcweir if ( !mpData->m_aItems.empty() ) 2209cdf0e10cSrcweir { 2210cdf0e10cSrcweir for ( std::vector< ImplToolItem >::reverse_iterator it(mpData->m_aItems.rbegin()); 2211cdf0e10cSrcweir it != mpData->m_aItems.rend(); ++it) 2212cdf0e10cSrcweir { 2213cdf0e10cSrcweir if( it->IsClipped() ) 2214cdf0e10cSrcweir { 2215cdf0e10cSrcweir sal_uInt16 id = it->mnId + TOOLBOX_MENUITEM_START; 2216cdf0e10cSrcweir pMenu->InsertItem( id, it->maText, it->maImage, 0, 0 ); 2217cdf0e10cSrcweir pMenu->EnableItem( id, it->mbEnabled ); 2218cdf0e10cSrcweir pMenu->CheckItem( id, it->meState == STATE_CHECK ); 2219cdf0e10cSrcweir } 2220cdf0e10cSrcweir } 2221cdf0e10cSrcweir } 2222cdf0e10cSrcweir } 2223cdf0e10cSrcweir 2224cdf0e10cSrcweir IMPL_LINK( ToolBox, ImplCustomMenuListener, VclMenuEvent*, pEvent ) 2225cdf0e10cSrcweir { 2226cdf0e10cSrcweir if( pEvent->GetMenu() == GetMenu() && pEvent->GetId() == VCLEVENT_MENU_SELECT ) 2227cdf0e10cSrcweir { 2228cdf0e10cSrcweir sal_uInt16 id = GetMenu()->GetItemId( pEvent->GetItemPos() ); 2229cdf0e10cSrcweir if( id >= TOOLBOX_MENUITEM_START ) 2230cdf0e10cSrcweir TriggerItem( id - TOOLBOX_MENUITEM_START, sal_False, sal_False ); 2231cdf0e10cSrcweir } 2232cdf0e10cSrcweir return 0; 2233cdf0e10cSrcweir } 2234cdf0e10cSrcweir 2235cdf0e10cSrcweir IMPL_LINK( ToolBox, ImplCallExecuteCustomMenu, void*, EMPTYARG ) 2236cdf0e10cSrcweir { 2237cdf0e10cSrcweir mpData->mnEventId = 0; 2238cdf0e10cSrcweir ImplExecuteCustomMenu(); 2239cdf0e10cSrcweir return 0; 2240cdf0e10cSrcweir } 2241cdf0e10cSrcweir 2242cdf0e10cSrcweir void ToolBox::ImplExecuteCustomMenu() 2243cdf0e10cSrcweir { 2244cdf0e10cSrcweir if( IsMenuEnabled() ) 2245cdf0e10cSrcweir { 2246cdf0e10cSrcweir if( GetMenuType() & TOOLBOX_MENUTYPE_CUSTOMIZE ) 2247cdf0e10cSrcweir // call button handler to allow for menu customization 2248cdf0e10cSrcweir mpData->maMenuButtonHdl.Call( this ); 2249cdf0e10cSrcweir 2250cdf0e10cSrcweir // register handler 2251cdf0e10cSrcweir GetMenu()->AddEventListener( LINK( this, ToolBox, ImplCustomMenuListener ) ); 2252cdf0e10cSrcweir 2253cdf0e10cSrcweir // make sure all disabled entries will be shown 2254cdf0e10cSrcweir GetMenu()->SetMenuFlags( 2255cdf0e10cSrcweir GetMenu()->GetMenuFlags() | MENU_FLAG_ALWAYSSHOWDISABLEDENTRIES ); 2256cdf0e10cSrcweir 2257cdf0e10cSrcweir // toolbox might be destroyed during execute 2258cdf0e10cSrcweir ImplDelData aDelData; 2259cdf0e10cSrcweir ImplAddDel( &aDelData ); 2260cdf0e10cSrcweir ImplDelData aBorderDel; 2261cdf0e10cSrcweir bool bBorderDel = false; 2262cdf0e10cSrcweir 2263cdf0e10cSrcweir Window *pWin = this; 2264cdf0e10cSrcweir Rectangle aMenuRect = mpData->maMenubuttonItem.maRect; 2265cdf0e10cSrcweir if( IsFloatingMode() ) 2266cdf0e10cSrcweir { 2267cdf0e10cSrcweir // custom menu is placed in the decoration 2268cdf0e10cSrcweir ImplBorderWindow *pBorderWin = dynamic_cast<ImplBorderWindow*>( GetWindow( WINDOW_BORDER ) ); 2269cdf0e10cSrcweir if( pBorderWin && !pBorderWin->GetMenuRect().IsEmpty() ) 2270cdf0e10cSrcweir { 2271cdf0e10cSrcweir pWin = pBorderWin; 2272cdf0e10cSrcweir aMenuRect = pBorderWin->GetMenuRect(); 2273cdf0e10cSrcweir pWin->ImplAddDel( &aBorderDel ); 2274cdf0e10cSrcweir bBorderDel = true; 2275cdf0e10cSrcweir } 2276cdf0e10cSrcweir } 2277cdf0e10cSrcweir 2278cdf0e10cSrcweir sal_uInt16 uId = GetMenu()->Execute( pWin, Rectangle( ImplGetPopupPosition( aMenuRect, Size() ), Size() ), 2279cdf0e10cSrcweir POPUPMENU_EXECUTE_DOWN | POPUPMENU_NOMOUSEUPCLOSE ); 2280cdf0e10cSrcweir 2281cdf0e10cSrcweir if ( aDelData.IsDelete() ) 2282cdf0e10cSrcweir return; 2283cdf0e10cSrcweir ImplRemoveDel( &aDelData ); 2284cdf0e10cSrcweir 2285cdf0e10cSrcweir if( GetMenu() ) 2286cdf0e10cSrcweir GetMenu()->RemoveEventListener( LINK( this, ToolBox, ImplCustomMenuListener ) ); 2287cdf0e10cSrcweir if( bBorderDel ) 2288cdf0e10cSrcweir { 2289cdf0e10cSrcweir if( aBorderDel.IsDelete() ) 2290cdf0e10cSrcweir return; 2291cdf0e10cSrcweir pWin->ImplRemoveDel( &aBorderDel ); 2292cdf0e10cSrcweir } 2293cdf0e10cSrcweir 2294cdf0e10cSrcweir pWin->Invalidate( aMenuRect ); 2295cdf0e10cSrcweir 2296cdf0e10cSrcweir if( uId ) 2297cdf0e10cSrcweir GrabFocusToDocument(); 2298cdf0e10cSrcweir } 2299cdf0e10cSrcweir } 2300cdf0e10cSrcweir 2301cdf0e10cSrcweir void ToolBox::ExecuteCustomMenu() 2302cdf0e10cSrcweir { 2303cdf0e10cSrcweir if( IsMenuEnabled() ) 2304cdf0e10cSrcweir { 2305cdf0e10cSrcweir // handle custom menu asynchronously 2306cdf0e10cSrcweir // to avoid problems if the toolbox is closed during menu execute 2307cdf0e10cSrcweir ImplUpdateCustomMenu(); 2308cdf0e10cSrcweir Application::PostUserEvent( mpData->mnEventId, LINK( this, ToolBox, ImplCallExecuteCustomMenu ) ); 2309cdf0e10cSrcweir } 2310cdf0e10cSrcweir } 2311cdf0e10cSrcweir 2312cdf0e10cSrcweir // ----------------------------------------------------------------------- 2313cdf0e10cSrcweir 2314cdf0e10cSrcweir // checks override first, useful during calculation of sizes 2315cdf0e10cSrcweir sal_Bool ToolBox::ImplIsFloatingMode() const 2316cdf0e10cSrcweir { 2317cdf0e10cSrcweir DBG_ASSERT( !(mpData->mbAssumeDocked && mpData->mbAssumeFloating), 2318cdf0e10cSrcweir "ToolBox::ImplIsFloatingMode(): cannot assume docked and floating" ); 2319cdf0e10cSrcweir 2320cdf0e10cSrcweir if( mpData->mbAssumeDocked ) 2321cdf0e10cSrcweir return sal_False; 2322cdf0e10cSrcweir else if( mpData->mbAssumeFloating ) 2323cdf0e10cSrcweir return sal_True; 2324cdf0e10cSrcweir else 2325cdf0e10cSrcweir return IsFloatingMode(); 2326cdf0e10cSrcweir } 2327cdf0e10cSrcweir 2328cdf0e10cSrcweir // checks override first, useful during calculation of sizes 2329cdf0e10cSrcweir sal_Bool ToolBox::ImplIsInPopupMode() const 2330cdf0e10cSrcweir { 2331cdf0e10cSrcweir if( mpData->mbAssumePopupMode ) 2332cdf0e10cSrcweir return sal_True; 2333cdf0e10cSrcweir else 2334cdf0e10cSrcweir { 2335cdf0e10cSrcweir ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); 2336cdf0e10cSrcweir return ( pWrapper && pWrapper->GetFloatingWindow() && pWrapper->GetFloatingWindow()->IsInPopupMode() ); 2337cdf0e10cSrcweir } 2338cdf0e10cSrcweir } 2339cdf0e10cSrcweir 2340cdf0e10cSrcweir // ----------------------------------------------------------------------- 2341cdf0e10cSrcweir 2342cdf0e10cSrcweir void ToolBox::Lock( sal_Bool bLock ) 2343cdf0e10cSrcweir { 2344cdf0e10cSrcweir ImplDockingWindowWrapper *pWrapper = ImplGetDockingManager()->GetDockingWindowWrapper( this ); 2345cdf0e10cSrcweir if( !pWrapper ) 2346cdf0e10cSrcweir return; 2347cdf0e10cSrcweir if( mpData->mbIsLocked != bLock ) 2348cdf0e10cSrcweir { 2349cdf0e10cSrcweir mpData->mbIsLocked = bLock; 2350cdf0e10cSrcweir if( !ImplIsFloatingMode() ) 2351cdf0e10cSrcweir { 2352cdf0e10cSrcweir mbCalc = sal_True; 2353cdf0e10cSrcweir mbFormat = sal_True; 2354cdf0e10cSrcweir SetSizePixel( CalcWindowSizePixel(1) ); 2355cdf0e10cSrcweir Invalidate(); 2356cdf0e10cSrcweir } 2357cdf0e10cSrcweir } 2358cdf0e10cSrcweir } 2359cdf0e10cSrcweir 2360cdf0e10cSrcweir // ----------------------------------------------------------------------- 2361cdf0e10cSrcweir 2362cdf0e10cSrcweir sal_Bool ToolBox::AlwaysLocked() 2363cdf0e10cSrcweir { 2364cdf0e10cSrcweir // read config item to determine toolbox behaviour, used for subtoolbars 2365cdf0e10cSrcweir 2366cdf0e10cSrcweir static int nAlwaysLocked = -1; 2367cdf0e10cSrcweir 2368cdf0e10cSrcweir if( nAlwaysLocked == -1 ) 2369cdf0e10cSrcweir { 2370cdf0e10cSrcweir nAlwaysLocked = 0; // ask configuration only once 2371cdf0e10cSrcweir 2372cdf0e10cSrcweir utl::OConfigurationNode aNode = utl::OConfigurationTreeRoot::tryCreateWithServiceFactory( 2373cdf0e10cSrcweir vcl::unohelper::GetMultiServiceFactory(), 2374cdf0e10cSrcweir OUString::createFromAscii( "/org.openoffice.Office.UI.GlobalSettings/Toolbars" ) ); // note: case sensisitive ! 2375cdf0e10cSrcweir if ( aNode.isValid() ) 2376cdf0e10cSrcweir { 2377cdf0e10cSrcweir // feature enabled ? 2378cdf0e10cSrcweir sal_Bool bStatesEnabled = sal_Bool(); 2379cdf0e10cSrcweir ::com::sun::star::uno::Any aValue = aNode.getNodeValue( OUString::createFromAscii( "StatesEnabled" ) ); 2380cdf0e10cSrcweir if( aValue >>= bStatesEnabled ) 2381cdf0e10cSrcweir { 2382cdf0e10cSrcweir if( bStatesEnabled == sal_True ) 2383cdf0e10cSrcweir { 2384cdf0e10cSrcweir // now read the locking state 2385cdf0e10cSrcweir utl::OConfigurationNode aNode2 = utl::OConfigurationTreeRoot::tryCreateWithServiceFactory( 2386cdf0e10cSrcweir vcl::unohelper::GetMultiServiceFactory(), 2387cdf0e10cSrcweir OUString::createFromAscii( "/org.openoffice.Office.UI.GlobalSettings/Toolbars/States" ) ); // note: case sensisitive ! 2388cdf0e10cSrcweir 2389cdf0e10cSrcweir sal_Bool bLocked = sal_Bool(); 2390cdf0e10cSrcweir ::com::sun::star::uno::Any aValue2 = aNode2.getNodeValue( OUString::createFromAscii( "Locked" ) ); 2391cdf0e10cSrcweir if( aValue2 >>= bLocked ) 2392cdf0e10cSrcweir nAlwaysLocked = (bLocked == sal_True) ? 1 : 0; 2393cdf0e10cSrcweir } 2394cdf0e10cSrcweir } 2395cdf0e10cSrcweir } 2396cdf0e10cSrcweir } 2397cdf0e10cSrcweir 2398cdf0e10cSrcweir return nAlwaysLocked == 1 ? sal_True : sal_False; 2399cdf0e10cSrcweir } 2400cdf0e10cSrcweir 2401cdf0e10cSrcweir sal_Bool ToolBox::WillUsePopupMode() const 2402cdf0e10cSrcweir { 2403cdf0e10cSrcweir return mpData->mbWillUsePopupMode; 2404cdf0e10cSrcweir } 2405cdf0e10cSrcweir 2406cdf0e10cSrcweir void ToolBox::WillUsePopupMode( sal_Bool b ) 2407cdf0e10cSrcweir { 2408cdf0e10cSrcweir mpData->mbWillUsePopupMode = b; 2409cdf0e10cSrcweir } 2410cdf0e10cSrcweir 2411cdf0e10cSrcweir void ToolBox::ImplUpdateImageList() 2412cdf0e10cSrcweir { 2413cdf0e10cSrcweir if (mpData->mpImageListProvider != NULL) 2414cdf0e10cSrcweir { 2415cdf0e10cSrcweir sal_Bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode(); 2416cdf0e10cSrcweir try 2417cdf0e10cSrcweir { 2418cdf0e10cSrcweir ImageListType eType = bHC ? vcl::HIGHCONTRAST_YES : vcl::HIGHCONTRAST_NO; 2419cdf0e10cSrcweir 2420cdf0e10cSrcweir if (eType != mpData->meImageListType) 2421cdf0e10cSrcweir { 2422cdf0e10cSrcweir vcl::IImageListProvider* pImageListProvider = mpData->mpImageListProvider; 2423cdf0e10cSrcweir SetImageList( pImageListProvider->getImageList(eType) ); 2424cdf0e10cSrcweir mpData->meImageListType = eType; 2425cdf0e10cSrcweir } 2426cdf0e10cSrcweir } 2427cdf0e10cSrcweir catch (com::sun::star::lang::IllegalArgumentException &) {} 2428cdf0e10cSrcweir } 2429cdf0e10cSrcweir } 2430cdf0e10cSrcweir 2431cdf0e10cSrcweir void ToolBox::SetImageListProvider(vcl::IImageListProvider* _pProvider) 2432cdf0e10cSrcweir { 2433cdf0e10cSrcweir mpData->mpImageListProvider = _pProvider; 2434cdf0e10cSrcweir ImplUpdateImageList(); 2435cdf0e10cSrcweir } 2436cdf0e10cSrcweir // ----------------------------------------------------------------------- 2437