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 10*9f62ea84SAndrew Rist * 11*9f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*9f62ea84SAndrew Rist * 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. 19*9f62ea84SAndrew Rist * 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 #include <tools/list.hxx> 27cdf0e10cSrcweir #include <tools/table.hxx> 28cdf0e10cSrcweir #include <tools/debug.hxx> 29cdf0e10cSrcweir #include <tools/rc.h> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <vcl/svapp.hxx> 32cdf0e10cSrcweir #include <accel.h> 33cdf0e10cSrcweir #include <vcl/accel.hxx> 34cdf0e10cSrcweir 35cdf0e10cSrcweir 36cdf0e10cSrcweir 37cdf0e10cSrcweir // ======================================================================= 38cdf0e10cSrcweir 39cdf0e10cSrcweir DECLARE_TABLE( ImplAccelTable, ImplAccelEntry* ) 40cdf0e10cSrcweir DECLARE_LIST( ImplAccelList, ImplAccelEntry* ) 41cdf0e10cSrcweir 42cdf0e10cSrcweir #define ACCELENTRY_NOTFOUND ((sal_uInt16)0xFFFF) 43cdf0e10cSrcweir 44cdf0e10cSrcweir // ======================================================================= 45cdf0e10cSrcweir 46cdf0e10cSrcweir class ImplAccelData 47cdf0e10cSrcweir { 48cdf0e10cSrcweir public: 49cdf0e10cSrcweir ImplAccelTable maKeyTable; // Fuer KeyCodes, die mit einem Code erzeugt wurden 50cdf0e10cSrcweir ImplAccelList maIdList; // Id-List 51cdf0e10cSrcweir }; 52cdf0e10cSrcweir 53cdf0e10cSrcweir // ======================================================================= 54cdf0e10cSrcweir 55cdf0e10cSrcweir DBG_NAME( Accelerator ) 56cdf0e10cSrcweir 57cdf0e10cSrcweir // ======================================================================= 58cdf0e10cSrcweir 59cdf0e10cSrcweir sal_uInt16 ImplAccelEntryGetIndex( ImplAccelList* pList, sal_uInt16 nId, 60cdf0e10cSrcweir sal_uInt16* pIndex = NULL ) 61cdf0e10cSrcweir { 62cdf0e10cSrcweir sal_uLong nLow; 63cdf0e10cSrcweir sal_uLong nHigh; 64cdf0e10cSrcweir sal_uLong nMid; 65cdf0e10cSrcweir sal_uLong nCount = pList->Count(); 66cdf0e10cSrcweir sal_uInt16 nCompareId; 67cdf0e10cSrcweir 68cdf0e10cSrcweir // Abpruefen, ob der erste Key groesser als der Vergleichskey ist 69cdf0e10cSrcweir if ( !nCount || (nId < pList->GetObject( 0 )->mnId) ) 70cdf0e10cSrcweir { 71cdf0e10cSrcweir if ( pIndex ) 72cdf0e10cSrcweir *pIndex = 0; 73cdf0e10cSrcweir return ACCELENTRY_NOTFOUND; 74cdf0e10cSrcweir } 75cdf0e10cSrcweir 76cdf0e10cSrcweir // Binaeres Suchen 77cdf0e10cSrcweir nLow = 0; 78cdf0e10cSrcweir nHigh = nCount-1; 79cdf0e10cSrcweir do 80cdf0e10cSrcweir { 81cdf0e10cSrcweir nMid = (nLow + nHigh) / 2; 82cdf0e10cSrcweir nCompareId = pList->GetObject( nMid )->mnId; 83cdf0e10cSrcweir if ( nId < nCompareId ) 84cdf0e10cSrcweir nHigh = nMid-1; 85cdf0e10cSrcweir else 86cdf0e10cSrcweir { 87cdf0e10cSrcweir if ( nId > nCompareId ) 88cdf0e10cSrcweir nLow = nMid + 1; 89cdf0e10cSrcweir else 90cdf0e10cSrcweir return (sal_uInt16)nMid; 91cdf0e10cSrcweir } 92cdf0e10cSrcweir } 93cdf0e10cSrcweir while ( nLow <= nHigh ); 94cdf0e10cSrcweir 95cdf0e10cSrcweir if ( pIndex ) 96cdf0e10cSrcweir { 97cdf0e10cSrcweir if ( nId > nCompareId ) 98cdf0e10cSrcweir *pIndex = (sal_uInt16)(nMid+1); 99cdf0e10cSrcweir else 100cdf0e10cSrcweir *pIndex = (sal_uInt16)nMid; 101cdf0e10cSrcweir } 102cdf0e10cSrcweir 103cdf0e10cSrcweir return ACCELENTRY_NOTFOUND; 104cdf0e10cSrcweir } 105cdf0e10cSrcweir 106cdf0e10cSrcweir // ----------------------------------------------------------------------- 107cdf0e10cSrcweir 108cdf0e10cSrcweir static void ImplAccelEntryInsert( ImplAccelList* pList, ImplAccelEntry* pEntry ) 109cdf0e10cSrcweir { 110cdf0e10cSrcweir sal_uInt16 nInsIndex; 111cdf0e10cSrcweir sal_uInt16 nIndex = ImplAccelEntryGetIndex( pList, pEntry->mnId, &nInsIndex ); 112cdf0e10cSrcweir 113cdf0e10cSrcweir if ( nIndex != ACCELENTRY_NOTFOUND ) 114cdf0e10cSrcweir { 115cdf0e10cSrcweir do 116cdf0e10cSrcweir { 117cdf0e10cSrcweir nIndex++; 118cdf0e10cSrcweir ImplAccelEntry* pTempEntry = pList->GetObject( nIndex ); 119cdf0e10cSrcweir if ( !pTempEntry || (pTempEntry->mnId != pEntry->mnId) ) 120cdf0e10cSrcweir break; 121cdf0e10cSrcweir } 122cdf0e10cSrcweir while ( nIndex < pList->Count() ); 123cdf0e10cSrcweir 124cdf0e10cSrcweir pList->Insert( pEntry, (sal_uLong)nIndex ); 125cdf0e10cSrcweir } 126cdf0e10cSrcweir else 127cdf0e10cSrcweir pList->Insert( pEntry, (sal_uLong)nInsIndex ); 128cdf0e10cSrcweir } 129cdf0e10cSrcweir 130cdf0e10cSrcweir // ----------------------------------------------------------------------- 131cdf0e10cSrcweir 132cdf0e10cSrcweir static sal_uInt16 ImplAccelEntryGetFirstPos( ImplAccelList* pList, sal_uInt16 nId ) 133cdf0e10cSrcweir { 134cdf0e10cSrcweir sal_uInt16 nIndex = ImplAccelEntryGetIndex( pList, nId ); 135cdf0e10cSrcweir if ( nIndex != ACCELENTRY_NOTFOUND ) 136cdf0e10cSrcweir { 137cdf0e10cSrcweir while ( nIndex ) 138cdf0e10cSrcweir { 139cdf0e10cSrcweir nIndex--; 140cdf0e10cSrcweir if ( pList->GetObject( nIndex )->mnId != nId ) 141cdf0e10cSrcweir break; 142cdf0e10cSrcweir } 143cdf0e10cSrcweir 144cdf0e10cSrcweir if ( pList->GetObject( nIndex )->mnId != nId ) 145cdf0e10cSrcweir nIndex++; 146cdf0e10cSrcweir } 147cdf0e10cSrcweir 148cdf0e10cSrcweir return nIndex; 149cdf0e10cSrcweir } 150cdf0e10cSrcweir 151cdf0e10cSrcweir // ======================================================================= 152cdf0e10cSrcweir 153cdf0e10cSrcweir void Accelerator::ImplInit() 154cdf0e10cSrcweir { 155cdf0e10cSrcweir mnCurId = 0; 156cdf0e10cSrcweir mnCurRepeat = 0; 157cdf0e10cSrcweir mbIsCancel = sal_False; 158cdf0e10cSrcweir mpDel = NULL; 159cdf0e10cSrcweir } 160cdf0e10cSrcweir 161cdf0e10cSrcweir // ----------------------------------------------------------------------- 162cdf0e10cSrcweir 163cdf0e10cSrcweir ImplAccelEntry* Accelerator::ImplGetAccelData( const KeyCode& rKeyCode ) const 164cdf0e10cSrcweir { 165cdf0e10cSrcweir return mpData->maKeyTable.Get( rKeyCode.GetFullKeyCode() ); 166cdf0e10cSrcweir } 167cdf0e10cSrcweir 168cdf0e10cSrcweir // ----------------------------------------------------------------------- 169cdf0e10cSrcweir 170cdf0e10cSrcweir void Accelerator::ImplCopyData( ImplAccelData& rAccelData ) 171cdf0e10cSrcweir { 172cdf0e10cSrcweir // Tabellen kopieren 173cdf0e10cSrcweir ImplAccelEntry* pEntry = rAccelData.maIdList.First(); 174cdf0e10cSrcweir while ( pEntry ) 175cdf0e10cSrcweir { 176cdf0e10cSrcweir pEntry = new ImplAccelEntry( *pEntry ); 177cdf0e10cSrcweir 178cdf0e10cSrcweir // Folge-Accelerator, dann auch kopieren 179cdf0e10cSrcweir if ( pEntry->mpAccel ) 180cdf0e10cSrcweir { 181cdf0e10cSrcweir pEntry->mpAccel = new Accelerator( *(pEntry->mpAccel) ); 182cdf0e10cSrcweir pEntry->mpAutoAccel = pEntry->mpAccel; 183cdf0e10cSrcweir } 184cdf0e10cSrcweir else 185cdf0e10cSrcweir pEntry->mpAutoAccel = NULL; 186cdf0e10cSrcweir 187cdf0e10cSrcweir mpData->maKeyTable.Insert( (sal_uLong)pEntry->maKeyCode.GetFullKeyCode(), pEntry ); 188cdf0e10cSrcweir mpData->maIdList.Insert( pEntry, LIST_APPEND ); 189cdf0e10cSrcweir 190cdf0e10cSrcweir pEntry = rAccelData.maIdList.Next(); 191cdf0e10cSrcweir } 192cdf0e10cSrcweir } 193cdf0e10cSrcweir 194cdf0e10cSrcweir // ----------------------------------------------------------------------- 195cdf0e10cSrcweir 196cdf0e10cSrcweir void Accelerator::ImplDeleteData() 197cdf0e10cSrcweir { 198cdf0e10cSrcweir // Accelerator-Eintraege ueber die Id-Tabelle loeschen 199cdf0e10cSrcweir ImplAccelEntry* pEntry = mpData->maIdList.First(); 200cdf0e10cSrcweir while ( pEntry ) 201cdf0e10cSrcweir { 202cdf0e10cSrcweir // AutoResAccel zerstoeren 203cdf0e10cSrcweir if ( pEntry->mpAutoAccel ) 204cdf0e10cSrcweir delete pEntry->mpAutoAccel; 205cdf0e10cSrcweir delete pEntry; 206cdf0e10cSrcweir 207cdf0e10cSrcweir pEntry = mpData->maIdList.Next(); 208cdf0e10cSrcweir } 209cdf0e10cSrcweir } 210cdf0e10cSrcweir 211cdf0e10cSrcweir // ----------------------------------------------------------------------- 212cdf0e10cSrcweir 213cdf0e10cSrcweir void Accelerator::ImplInsertAccel( sal_uInt16 nItemId, const KeyCode& rKeyCode, 214cdf0e10cSrcweir sal_Bool bEnable, Accelerator* pAutoAccel ) 215cdf0e10cSrcweir { 216cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 217cdf0e10cSrcweir DBG_ASSERT( nItemId, "Accelerator::InsertItem(): ItemId == 0" ); 218cdf0e10cSrcweir 219cdf0e10cSrcweir if ( rKeyCode.IsFunction() ) 220cdf0e10cSrcweir { 221cdf0e10cSrcweir sal_uInt16 nCode1; 222cdf0e10cSrcweir sal_uInt16 nCode2; 223cdf0e10cSrcweir sal_uInt16 nCode3; 224cdf0e10cSrcweir sal_uInt16 nCode4; 225cdf0e10cSrcweir ImplGetKeyCode( rKeyCode.GetFunction(), nCode1, nCode2, nCode3, nCode4 ); 226cdf0e10cSrcweir if ( nCode1 ) 227cdf0e10cSrcweir ImplInsertAccel( nItemId, KeyCode( nCode1, nCode1 ), bEnable, pAutoAccel ); 228cdf0e10cSrcweir if ( nCode2 ) 229cdf0e10cSrcweir { 230cdf0e10cSrcweir if ( pAutoAccel ) 231cdf0e10cSrcweir pAutoAccel = new Accelerator( *pAutoAccel ); 232cdf0e10cSrcweir ImplInsertAccel( nItemId, KeyCode( nCode2, nCode2 ), bEnable, pAutoAccel ); 233cdf0e10cSrcweir if ( nCode3 ) 234cdf0e10cSrcweir { 235cdf0e10cSrcweir if ( pAutoAccel ) 236cdf0e10cSrcweir pAutoAccel = new Accelerator( *pAutoAccel ); 237cdf0e10cSrcweir ImplInsertAccel( nItemId, KeyCode( nCode3, nCode3 ), bEnable, pAutoAccel ); 238cdf0e10cSrcweir } 239cdf0e10cSrcweir } 240cdf0e10cSrcweir return; 241cdf0e10cSrcweir } 242cdf0e10cSrcweir 243cdf0e10cSrcweir // Neuen Eintrag holen und fuellen 244cdf0e10cSrcweir ImplAccelEntry* pEntry = new ImplAccelEntry; 245cdf0e10cSrcweir pEntry->mnId = nItemId; 246cdf0e10cSrcweir pEntry->maKeyCode = rKeyCode; 247cdf0e10cSrcweir pEntry->mpAccel = pAutoAccel; 248cdf0e10cSrcweir pEntry->mpAutoAccel = pAutoAccel; 249cdf0e10cSrcweir pEntry->mbEnabled = bEnable; 250cdf0e10cSrcweir 251cdf0e10cSrcweir // Ab in die Tabellen 252cdf0e10cSrcweir sal_uLong nCode = rKeyCode.GetFullKeyCode(); 253cdf0e10cSrcweir if ( !nCode ) 254cdf0e10cSrcweir { 255cdf0e10cSrcweir DBG_ERROR( "Accelerator::InsertItem(): KeyCode with KeyCode 0 not allowed" ); 256cdf0e10cSrcweir delete pEntry; 257cdf0e10cSrcweir } 258cdf0e10cSrcweir else if ( !mpData->maKeyTable.Insert( nCode, pEntry ) ) 259cdf0e10cSrcweir { 260cdf0e10cSrcweir DBG_ERROR1( "Accelerator::InsertItem(): KeyCode (Key: %lx) already exists", nCode ); 261cdf0e10cSrcweir delete pEntry; 262cdf0e10cSrcweir } 263cdf0e10cSrcweir else 264cdf0e10cSrcweir ImplAccelEntryInsert( &(mpData->maIdList), pEntry ); 265cdf0e10cSrcweir } 266cdf0e10cSrcweir 267cdf0e10cSrcweir // ----------------------------------------------------------------------- 268cdf0e10cSrcweir 269cdf0e10cSrcweir Accelerator::Accelerator() 270cdf0e10cSrcweir { 271cdf0e10cSrcweir DBG_CTOR( Accelerator, NULL ); 272cdf0e10cSrcweir 273cdf0e10cSrcweir ImplInit(); 274cdf0e10cSrcweir mpData = new ImplAccelData; 275cdf0e10cSrcweir } 276cdf0e10cSrcweir 277cdf0e10cSrcweir // ----------------------------------------------------------------------- 278cdf0e10cSrcweir 279cdf0e10cSrcweir Accelerator::Accelerator( const Accelerator& rAccel ) : 280cdf0e10cSrcweir Resource(), 281cdf0e10cSrcweir maHelpStr( rAccel.maHelpStr ), 282cdf0e10cSrcweir maCurKeyCode( rAccel.maCurKeyCode ) 283cdf0e10cSrcweir { 284cdf0e10cSrcweir DBG_CTOR( Accelerator, NULL ); 285cdf0e10cSrcweir DBG_CHKOBJ( &rAccel, Accelerator, NULL ); 286cdf0e10cSrcweir 287cdf0e10cSrcweir ImplInit(); 288cdf0e10cSrcweir mpData = new ImplAccelData; 289cdf0e10cSrcweir ImplCopyData( *((ImplAccelData*)(rAccel.mpData)) ); 290cdf0e10cSrcweir } 291cdf0e10cSrcweir 292cdf0e10cSrcweir // ----------------------------------------------------------------------- 293cdf0e10cSrcweir 294cdf0e10cSrcweir Accelerator::Accelerator( const ResId& rResId ) 295cdf0e10cSrcweir { 296cdf0e10cSrcweir DBG_CTOR( Accelerator, NULL ); 297cdf0e10cSrcweir 298cdf0e10cSrcweir ImplInit(); 299cdf0e10cSrcweir mpData = new ImplAccelData; 300cdf0e10cSrcweir rResId.SetRT( RSC_ACCEL ); 301cdf0e10cSrcweir ImplLoadRes( rResId ); 302cdf0e10cSrcweir } 303cdf0e10cSrcweir 304cdf0e10cSrcweir // ----------------------------------------------------------------------- 305cdf0e10cSrcweir 306cdf0e10cSrcweir void Accelerator::ImplLoadRes( const ResId& rResId ) 307cdf0e10cSrcweir { 308cdf0e10cSrcweir GetRes( rResId ); 309cdf0e10cSrcweir 310cdf0e10cSrcweir maHelpStr = ReadStringRes(); 311cdf0e10cSrcweir sal_uLong nObjFollows = ReadLongRes(); 312cdf0e10cSrcweir 313cdf0e10cSrcweir for( sal_uLong i = 0; i < nObjFollows; i++ ) 314cdf0e10cSrcweir { 315cdf0e10cSrcweir InsertItem( ResId( (RSHEADER_TYPE *)GetClassRes(), *rResId.GetResMgr() ) ); 316cdf0e10cSrcweir IncrementRes( GetObjSizeRes( (RSHEADER_TYPE *)GetClassRes() ) ); 317cdf0e10cSrcweir } 318cdf0e10cSrcweir } 319cdf0e10cSrcweir 320cdf0e10cSrcweir // ----------------------------------------------------------------------- 321cdf0e10cSrcweir 322cdf0e10cSrcweir Accelerator::~Accelerator() 323cdf0e10cSrcweir { 324cdf0e10cSrcweir DBG_DTOR( Accelerator, NULL ); 325cdf0e10cSrcweir 326cdf0e10cSrcweir // AccelManager benachrichtigen, das Accelrator geloescht wurde 327cdf0e10cSrcweir if ( mpDel ) 328cdf0e10cSrcweir *mpDel = sal_True; 329cdf0e10cSrcweir 330cdf0e10cSrcweir ImplDeleteData(); 331cdf0e10cSrcweir delete mpData; 332cdf0e10cSrcweir } 333cdf0e10cSrcweir 334cdf0e10cSrcweir // ----------------------------------------------------------------------- 335cdf0e10cSrcweir 336cdf0e10cSrcweir void Accelerator::Activate() 337cdf0e10cSrcweir { 338cdf0e10cSrcweir maActivateHdl.Call( this ); 339cdf0e10cSrcweir } 340cdf0e10cSrcweir 341cdf0e10cSrcweir // ----------------------------------------------------------------------- 342cdf0e10cSrcweir 343cdf0e10cSrcweir void Accelerator::Deactivate() 344cdf0e10cSrcweir { 345cdf0e10cSrcweir maDeactivateHdl.Call( this ); 346cdf0e10cSrcweir } 347cdf0e10cSrcweir 348cdf0e10cSrcweir // ----------------------------------------------------------------------- 349cdf0e10cSrcweir 350cdf0e10cSrcweir void Accelerator::Select() 351cdf0e10cSrcweir { 352cdf0e10cSrcweir maSelectHdl.Call( this ); 353cdf0e10cSrcweir } 354cdf0e10cSrcweir 355cdf0e10cSrcweir // ----------------------------------------------------------------------- 356cdf0e10cSrcweir 357cdf0e10cSrcweir void Accelerator::InsertItem( sal_uInt16 nItemId, const KeyCode& rKeyCode ) 358cdf0e10cSrcweir { 359cdf0e10cSrcweir ImplInsertAccel( nItemId, rKeyCode, sal_True, NULL ); 360cdf0e10cSrcweir } 361cdf0e10cSrcweir 362cdf0e10cSrcweir // ----------------------------------------------------------------------- 363cdf0e10cSrcweir 364cdf0e10cSrcweir void Accelerator::InsertItem( const ResId& rResId ) 365cdf0e10cSrcweir { 366cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 367cdf0e10cSrcweir 368cdf0e10cSrcweir sal_uLong nObjMask; 369cdf0e10cSrcweir sal_uInt16 nAccelKeyId; 370cdf0e10cSrcweir sal_uInt16 bDisable; 371cdf0e10cSrcweir KeyCode aKeyCode; 372cdf0e10cSrcweir Accelerator* pAutoAccel = NULL; 373cdf0e10cSrcweir 374cdf0e10cSrcweir GetRes( rResId.SetRT( RSC_ACCELITEM ) ); 375cdf0e10cSrcweir nObjMask = ReadLongRes(); 376cdf0e10cSrcweir nAccelKeyId = sal::static_int_cast<sal_uInt16>(ReadLongRes()); 377cdf0e10cSrcweir bDisable = ReadShortRes(); 378cdf0e10cSrcweir 379cdf0e10cSrcweir if ( nObjMask & ACCELITEM_KEY ) 380cdf0e10cSrcweir { 381cdf0e10cSrcweir // es wird ein neuer Kontext aufgespannt 382cdf0e10cSrcweir RSHEADER_TYPE * pKeyCodeRes = (RSHEADER_TYPE *)GetClassRes(); 383cdf0e10cSrcweir ResId aResId( pKeyCodeRes, *rResId.GetResMgr()); 384cdf0e10cSrcweir aKeyCode = KeyCode( aResId ); 385cdf0e10cSrcweir IncrementRes( GetObjSizeRes( (RSHEADER_TYPE *)GetClassRes() ) ); 386cdf0e10cSrcweir } 387cdf0e10cSrcweir 388cdf0e10cSrcweir if ( nObjMask & ACCELITEM_ACCEL ) 389cdf0e10cSrcweir { 390cdf0e10cSrcweir pAutoAccel = new Accelerator( ResId( (RSHEADER_TYPE *)GetClassRes(), *rResId.GetResMgr() ) ); 391cdf0e10cSrcweir IncrementRes( GetObjSizeRes( (RSHEADER_TYPE *)GetClassRes() ) ); 392cdf0e10cSrcweir } 393cdf0e10cSrcweir 394cdf0e10cSrcweir ImplInsertAccel( nAccelKeyId, aKeyCode, !bDisable, pAutoAccel ); 395cdf0e10cSrcweir } 396cdf0e10cSrcweir 397cdf0e10cSrcweir // ----------------------------------------------------------------------- 398cdf0e10cSrcweir 399cdf0e10cSrcweir void Accelerator::RemoveItem( sal_uInt16 nItemId ) 400cdf0e10cSrcweir { 401cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 402cdf0e10cSrcweir 403cdf0e10cSrcweir // Aus der Id-Liste entfernen 404cdf0e10cSrcweir sal_uInt16 nIndex = ImplAccelEntryGetFirstPos( &(mpData->maIdList), nItemId ); 405cdf0e10cSrcweir if ( nIndex != ACCELENTRY_NOTFOUND ) 406cdf0e10cSrcweir { 407cdf0e10cSrcweir sal_uInt16 nItemCount = GetItemCount(); 408cdf0e10cSrcweir do 409cdf0e10cSrcweir { 410cdf0e10cSrcweir ImplAccelEntry* pEntry = mpData->maIdList.GetObject( (sal_uLong)nIndex ); 411cdf0e10cSrcweir if ( pEntry && pEntry->mnId == nItemId ) 412cdf0e10cSrcweir { 413cdf0e10cSrcweir mpData->maKeyTable.Remove( pEntry->maKeyCode.GetFullKeyCode() ); 414cdf0e10cSrcweir mpData->maIdList.Remove( (sal_uLong)nIndex ); 415cdf0e10cSrcweir 416cdf0e10cSrcweir // AutoResAccel zerstoeren 417cdf0e10cSrcweir if ( pEntry->mpAutoAccel ) 418cdf0e10cSrcweir delete pEntry->mpAutoAccel; 419cdf0e10cSrcweir 420cdf0e10cSrcweir delete pEntry; 421cdf0e10cSrcweir } 422cdf0e10cSrcweir else 423cdf0e10cSrcweir break; 424cdf0e10cSrcweir } 425cdf0e10cSrcweir while ( nIndex < nItemCount ); 426cdf0e10cSrcweir } 427cdf0e10cSrcweir } 428cdf0e10cSrcweir 429cdf0e10cSrcweir // ----------------------------------------------------------------------- 430cdf0e10cSrcweir 431cdf0e10cSrcweir void Accelerator::RemoveItem( const KeyCode rKeyCode ) 432cdf0e10cSrcweir { 433cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 434cdf0e10cSrcweir 435cdf0e10cSrcweir ImplAccelEntry* pEntry = ImplGetAccelData( rKeyCode ); 436cdf0e10cSrcweir if ( pEntry ) 437cdf0e10cSrcweir { 438cdf0e10cSrcweir // Aus der Id-Liste entfernen 439cdf0e10cSrcweir sal_uInt16 nIndex = ImplAccelEntryGetFirstPos( &(mpData->maIdList), pEntry->mnId ); 440cdf0e10cSrcweir sal_uInt16 nItemCount = GetItemCount(); 441cdf0e10cSrcweir do 442cdf0e10cSrcweir { 443cdf0e10cSrcweir if ( mpData->maIdList.GetObject( (sal_uLong)nIndex ) == pEntry ) 444cdf0e10cSrcweir break; 445cdf0e10cSrcweir nIndex++; 446cdf0e10cSrcweir } 447cdf0e10cSrcweir while ( nIndex < nItemCount ); 448cdf0e10cSrcweir 449cdf0e10cSrcweir mpData->maKeyTable.Remove( rKeyCode.GetFullKeyCode() ); 450cdf0e10cSrcweir mpData->maIdList.Remove( (sal_uLong)nIndex ); 451cdf0e10cSrcweir 452cdf0e10cSrcweir // AutoResAccel zerstoeren 453cdf0e10cSrcweir if ( pEntry->mpAutoAccel ) 454cdf0e10cSrcweir delete pEntry->mpAutoAccel; 455cdf0e10cSrcweir 456cdf0e10cSrcweir delete pEntry; 457cdf0e10cSrcweir } 458cdf0e10cSrcweir } 459cdf0e10cSrcweir 460cdf0e10cSrcweir // ----------------------------------------------------------------------- 461cdf0e10cSrcweir 462cdf0e10cSrcweir void Accelerator::Clear() 463cdf0e10cSrcweir { 464cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 465cdf0e10cSrcweir 466cdf0e10cSrcweir ImplDeleteData(); 467cdf0e10cSrcweir mpData->maKeyTable.Clear(); 468cdf0e10cSrcweir mpData->maIdList.Clear(); 469cdf0e10cSrcweir } 470cdf0e10cSrcweir 471cdf0e10cSrcweir // ----------------------------------------------------------------------- 472cdf0e10cSrcweir 473cdf0e10cSrcweir sal_uInt16 Accelerator::GetItemCount() const 474cdf0e10cSrcweir { 475cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 476cdf0e10cSrcweir 477cdf0e10cSrcweir return (sal_uInt16)mpData->maIdList.Count(); 478cdf0e10cSrcweir } 479cdf0e10cSrcweir 480cdf0e10cSrcweir // ----------------------------------------------------------------------- 481cdf0e10cSrcweir 482cdf0e10cSrcweir sal_uInt16 Accelerator::GetItemId( sal_uInt16 nPos ) const 483cdf0e10cSrcweir { 484cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 485cdf0e10cSrcweir 486cdf0e10cSrcweir ImplAccelEntry* pEntry = mpData->maIdList.GetObject( (sal_uLong)nPos ); 487cdf0e10cSrcweir if ( pEntry ) 488cdf0e10cSrcweir return pEntry->mnId; 489cdf0e10cSrcweir else 490cdf0e10cSrcweir return 0; 491cdf0e10cSrcweir } 492cdf0e10cSrcweir 493cdf0e10cSrcweir // ----------------------------------------------------------------------- 494cdf0e10cSrcweir 495cdf0e10cSrcweir KeyCode Accelerator::GetItemKeyCode( sal_uInt16 nPos ) const 496cdf0e10cSrcweir { 497cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 498cdf0e10cSrcweir 499cdf0e10cSrcweir ImplAccelEntry* pEntry = mpData->maIdList.GetObject( (sal_uLong)nPos ); 500cdf0e10cSrcweir if ( pEntry ) 501cdf0e10cSrcweir return pEntry->maKeyCode; 502cdf0e10cSrcweir else 503cdf0e10cSrcweir return KeyCode(); 504cdf0e10cSrcweir } 505cdf0e10cSrcweir 506cdf0e10cSrcweir // ----------------------------------------------------------------------- 507cdf0e10cSrcweir 508cdf0e10cSrcweir sal_uInt16 Accelerator::GetItemId( const KeyCode& rKeyCode ) const 509cdf0e10cSrcweir { 510cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 511cdf0e10cSrcweir 512cdf0e10cSrcweir ImplAccelEntry* pEntry = ImplGetAccelData( rKeyCode ); 513cdf0e10cSrcweir if ( pEntry ) 514cdf0e10cSrcweir return pEntry->mnId; 515cdf0e10cSrcweir else 516cdf0e10cSrcweir return 0; 517cdf0e10cSrcweir } 518cdf0e10cSrcweir 519cdf0e10cSrcweir // ----------------------------------------------------------------------- 520cdf0e10cSrcweir 521cdf0e10cSrcweir KeyCode Accelerator::GetKeyCode( sal_uInt16 nItemId ) const 522cdf0e10cSrcweir { 523cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 524cdf0e10cSrcweir 525cdf0e10cSrcweir sal_uInt16 nIndex = ImplAccelEntryGetFirstPos( &(mpData->maIdList), nItemId ); 526cdf0e10cSrcweir if ( nIndex != ACCELENTRY_NOTFOUND ) 527cdf0e10cSrcweir return mpData->maIdList.GetObject( (sal_uLong)nIndex )->maKeyCode; 528cdf0e10cSrcweir else 529cdf0e10cSrcweir return KeyCode(); 530cdf0e10cSrcweir } 531cdf0e10cSrcweir 532cdf0e10cSrcweir // ----------------------------------------------------------------------- 533cdf0e10cSrcweir 534cdf0e10cSrcweir sal_Bool Accelerator::IsIdValid( sal_uInt16 nItemId ) const 535cdf0e10cSrcweir { 536cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 537cdf0e10cSrcweir 538cdf0e10cSrcweir sal_uInt16 nIndex = ImplAccelEntryGetIndex( &(mpData->maIdList), nItemId ); 539cdf0e10cSrcweir return (nIndex != ACCELENTRY_NOTFOUND); 540cdf0e10cSrcweir } 541cdf0e10cSrcweir 542cdf0e10cSrcweir // ----------------------------------------------------------------------- 543cdf0e10cSrcweir 544cdf0e10cSrcweir sal_Bool Accelerator::IsKeyCodeValid( const KeyCode rKeyCode ) const 545cdf0e10cSrcweir { 546cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 547cdf0e10cSrcweir 548cdf0e10cSrcweir ImplAccelEntry* pEntry = ImplGetAccelData( rKeyCode ); 549cdf0e10cSrcweir return (pEntry != NULL); 550cdf0e10cSrcweir } 551cdf0e10cSrcweir 552cdf0e10cSrcweir // ----------------------------------------------------------------------- 553cdf0e10cSrcweir 554cdf0e10cSrcweir sal_Bool Accelerator::Call( const KeyCode& rKeyCode, sal_uInt16 nRepeat ) 555cdf0e10cSrcweir { 556cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 557cdf0e10cSrcweir 558cdf0e10cSrcweir ImplAccelEntry* pEntry = ImplGetAccelData( rKeyCode ); 559cdf0e10cSrcweir if ( pEntry ) 560cdf0e10cSrcweir { 561cdf0e10cSrcweir if ( pEntry->mbEnabled ) 562cdf0e10cSrcweir { 563cdf0e10cSrcweir sal_Bool bDel = sal_False; 564cdf0e10cSrcweir mnCurId = pEntry->mnId; 565cdf0e10cSrcweir maCurKeyCode = rKeyCode; 566cdf0e10cSrcweir mnCurRepeat = nRepeat; 567cdf0e10cSrcweir mpDel = &bDel; 568cdf0e10cSrcweir Select(); 569cdf0e10cSrcweir if ( !bDel ) 570cdf0e10cSrcweir { 571cdf0e10cSrcweir mnCurId = 0; 572cdf0e10cSrcweir maCurKeyCode = KeyCode(); 573cdf0e10cSrcweir mnCurRepeat = 0; 574cdf0e10cSrcweir } 575cdf0e10cSrcweir 576cdf0e10cSrcweir return sal_True; 577cdf0e10cSrcweir } 578cdf0e10cSrcweir } 579cdf0e10cSrcweir 580cdf0e10cSrcweir return sal_False; 581cdf0e10cSrcweir } 582cdf0e10cSrcweir 583cdf0e10cSrcweir // ----------------------------------------------------------------------- 584cdf0e10cSrcweir 585cdf0e10cSrcweir void Accelerator::SetAccel( sal_uInt16 nItemId, Accelerator* pAccel ) 586cdf0e10cSrcweir { 587cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 588cdf0e10cSrcweir 589cdf0e10cSrcweir sal_uInt16 nIndex = ImplAccelEntryGetFirstPos( &(mpData->maIdList), nItemId ); 590cdf0e10cSrcweir if ( nIndex != ACCELENTRY_NOTFOUND ) 591cdf0e10cSrcweir { 592cdf0e10cSrcweir sal_uInt16 nItemCount = GetItemCount(); 593cdf0e10cSrcweir do 594cdf0e10cSrcweir { 595cdf0e10cSrcweir ImplAccelEntry* pEntry = mpData->maIdList.GetObject( (sal_uLong)nIndex ); 596cdf0e10cSrcweir if ( pEntry->mnId != nItemId ) 597cdf0e10cSrcweir break; 598cdf0e10cSrcweir 599cdf0e10cSrcweir pEntry->mpAccel = pAccel; 600cdf0e10cSrcweir nIndex++; 601cdf0e10cSrcweir } 602cdf0e10cSrcweir while ( nIndex < nItemCount ); 603cdf0e10cSrcweir } 604cdf0e10cSrcweir } 605cdf0e10cSrcweir 606cdf0e10cSrcweir // ----------------------------------------------------------------------- 607cdf0e10cSrcweir 608cdf0e10cSrcweir Accelerator* Accelerator::GetAccel( sal_uInt16 nItemId ) const 609cdf0e10cSrcweir { 610cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 611cdf0e10cSrcweir 612cdf0e10cSrcweir sal_uInt16 nIndex = ImplAccelEntryGetIndex( &(mpData->maIdList), nItemId ); 613cdf0e10cSrcweir if ( nIndex != ACCELENTRY_NOTFOUND ) 614cdf0e10cSrcweir return mpData->maIdList.GetObject( (sal_uLong)nIndex )->mpAccel; 615cdf0e10cSrcweir else 616cdf0e10cSrcweir return NULL; 617cdf0e10cSrcweir } 618cdf0e10cSrcweir 619cdf0e10cSrcweir // ----------------------------------------------------------------------- 620cdf0e10cSrcweir 621cdf0e10cSrcweir void Accelerator::SetAccel( const KeyCode rKeyCode, Accelerator* pAccel ) 622cdf0e10cSrcweir { 623cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 624cdf0e10cSrcweir 625cdf0e10cSrcweir ImplAccelEntry* pEntry = ImplGetAccelData( rKeyCode ); 626cdf0e10cSrcweir if ( pEntry ) 627cdf0e10cSrcweir pEntry->mpAccel = pAccel; 628cdf0e10cSrcweir } 629cdf0e10cSrcweir 630cdf0e10cSrcweir // ----------------------------------------------------------------------- 631cdf0e10cSrcweir 632cdf0e10cSrcweir Accelerator* Accelerator::GetAccel( const KeyCode rKeyCode ) const 633cdf0e10cSrcweir { 634cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 635cdf0e10cSrcweir 636cdf0e10cSrcweir ImplAccelEntry* pEntry = ImplGetAccelData( rKeyCode ); 637cdf0e10cSrcweir if ( pEntry ) 638cdf0e10cSrcweir return pEntry->mpAccel; 639cdf0e10cSrcweir else 640cdf0e10cSrcweir return sal_False; 641cdf0e10cSrcweir } 642cdf0e10cSrcweir 643cdf0e10cSrcweir // ----------------------------------------------------------------------- 644cdf0e10cSrcweir 645cdf0e10cSrcweir void Accelerator::EnableItem( sal_uInt16 nItemId, sal_Bool bEnable ) 646cdf0e10cSrcweir { 647cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 648cdf0e10cSrcweir 649cdf0e10cSrcweir sal_uInt16 nIndex = ImplAccelEntryGetFirstPos( &(mpData->maIdList), nItemId ); 650cdf0e10cSrcweir if ( nIndex != ACCELENTRY_NOTFOUND ) 651cdf0e10cSrcweir { 652cdf0e10cSrcweir sal_uInt16 nItemCount = GetItemCount(); 653cdf0e10cSrcweir do 654cdf0e10cSrcweir { 655cdf0e10cSrcweir ImplAccelEntry* pEntry = mpData->maIdList.GetObject( (sal_uLong)nIndex ); 656cdf0e10cSrcweir if ( pEntry->mnId != nItemId ) 657cdf0e10cSrcweir break; 658cdf0e10cSrcweir 659cdf0e10cSrcweir pEntry->mbEnabled = bEnable; 660cdf0e10cSrcweir nIndex++; 661cdf0e10cSrcweir } 662cdf0e10cSrcweir while ( nIndex < nItemCount ); 663cdf0e10cSrcweir } 664cdf0e10cSrcweir } 665cdf0e10cSrcweir 666cdf0e10cSrcweir // ----------------------------------------------------------------------- 667cdf0e10cSrcweir 668cdf0e10cSrcweir sal_Bool Accelerator::IsItemEnabled( sal_uInt16 nItemId ) const 669cdf0e10cSrcweir { 670cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 671cdf0e10cSrcweir 672cdf0e10cSrcweir sal_uInt16 nIndex = ImplAccelEntryGetIndex( &(mpData->maIdList), nItemId ); 673cdf0e10cSrcweir if ( nIndex != ACCELENTRY_NOTFOUND ) 674cdf0e10cSrcweir return mpData->maIdList.GetObject( (sal_uLong)nIndex )->mbEnabled; 675cdf0e10cSrcweir else 676cdf0e10cSrcweir return sal_False; 677cdf0e10cSrcweir } 678cdf0e10cSrcweir 679cdf0e10cSrcweir // ----------------------------------------------------------------------- 680cdf0e10cSrcweir 681cdf0e10cSrcweir void Accelerator::EnableItem( const KeyCode rKeyCode, sal_Bool bEnable ) 682cdf0e10cSrcweir { 683cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 684cdf0e10cSrcweir 685cdf0e10cSrcweir ImplAccelEntry* pEntry = ImplGetAccelData( rKeyCode ); 686cdf0e10cSrcweir if ( pEntry ) 687cdf0e10cSrcweir pEntry->mbEnabled = bEnable; 688cdf0e10cSrcweir } 689cdf0e10cSrcweir 690cdf0e10cSrcweir // ----------------------------------------------------------------------- 691cdf0e10cSrcweir 692cdf0e10cSrcweir sal_Bool Accelerator::IsItemEnabled( const KeyCode rKeyCode ) const 693cdf0e10cSrcweir { 694cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 695cdf0e10cSrcweir 696cdf0e10cSrcweir ImplAccelEntry* pEntry = ImplGetAccelData( rKeyCode ); 697cdf0e10cSrcweir if ( pEntry ) 698cdf0e10cSrcweir return pEntry->mbEnabled; 699cdf0e10cSrcweir else 700cdf0e10cSrcweir return sal_False; 701cdf0e10cSrcweir } 702cdf0e10cSrcweir 703cdf0e10cSrcweir // ----------------------------------------------------------------------- 704cdf0e10cSrcweir 705cdf0e10cSrcweir Accelerator& Accelerator::operator=( const Accelerator& rAccel ) 706cdf0e10cSrcweir { 707cdf0e10cSrcweir DBG_CHKTHIS( Accelerator, NULL ); 708cdf0e10cSrcweir DBG_CHKOBJ( &rAccel, Accelerator, NULL ); 709cdf0e10cSrcweir 710cdf0e10cSrcweir // Neue Daten zuweisen 711cdf0e10cSrcweir maHelpStr = rAccel.maHelpStr; 712cdf0e10cSrcweir maCurKeyCode = KeyCode(); 713cdf0e10cSrcweir mnCurId = 0; 714cdf0e10cSrcweir mnCurRepeat = 0; 715cdf0e10cSrcweir mbIsCancel = sal_False; 716cdf0e10cSrcweir 717cdf0e10cSrcweir // Tabellen loeschen und kopieren 718cdf0e10cSrcweir ImplDeleteData(); 719cdf0e10cSrcweir mpData->maKeyTable.Clear(); 720cdf0e10cSrcweir mpData->maIdList.Clear(); 721cdf0e10cSrcweir ImplCopyData( *((ImplAccelData*)(rAccel.mpData)) ); 722cdf0e10cSrcweir 723cdf0e10cSrcweir return *this; 724cdf0e10cSrcweir } 725