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