Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <assert.h>
21 : #include <stdlib.h>
22 :
23 : #include <sal/log.hxx>
24 :
25 : #include <tools/rcid.h>
26 : #include <tools/stream.hxx>
27 : #include "tools/resmgr.hxx"
28 :
29 : #include <sfx2/module.hxx>
30 : #include <sfx2/objface.hxx>
31 : #include <sfx2/msg.hxx>
32 : #include <sfx2/app.hxx>
33 : #include <sfx2/msgpool.hxx>
34 : #include <sfx2/sfxresid.hxx>
35 : #include <sfx2/objsh.hxx>
36 : #include <rtl/strbuf.hxx>
37 :
38 : extern "C"
39 : #ifdef WNT
40 : int _cdecl
41 : #else
42 : int
43 : #endif
44 :
45 0 : SfxCompareSlots_Impl( const void* pSmaller, const void* pBigger )
46 : {
47 0 : return ( (int) ((SfxSlot*)pSmaller)->GetSlotId() ) -
48 0 : ( (int) ((SfxSlot*)pBigger)->GetSlotId() );
49 : }
50 :
51 :
52 :
53 : struct SfxObjectUI_Impl
54 : {
55 : sal_uInt16 nPos;
56 : ResId aResId;
57 : bool bVisible;
58 : bool bContext;
59 : OUString* pName;
60 : sal_uInt32 nFeature;
61 :
62 0 : SfxObjectUI_Impl(sal_uInt16 n, const ResId& rResId, bool bVis, sal_uInt32 nFeat) :
63 : nPos(n),
64 0 : aResId(rResId.GetId(), *rResId.GetResMgr()),
65 : bVisible(bVis),
66 : bContext(false),
67 : pName(0),
68 0 : nFeature(nFeat)
69 : {
70 0 : aResId.SetRT(rResId.GetRT());
71 0 : }
72 :
73 0 : ~SfxObjectUI_Impl()
74 : {
75 0 : delete pName;
76 0 : }
77 : };
78 :
79 : typedef std::vector<SfxObjectUI_Impl*> SfxObjectUIArr_Impl;
80 :
81 : struct SfxInterface_Impl
82 : {
83 : SfxObjectUIArr_Impl aObjectBars; // registered ObjectBars
84 : SfxObjectUIArr_Impl aChildWindows; // registered ChildWindows
85 : ResId aPopupRes; // registered PopupMenu
86 : ResId aStatBarRes; // registered StatusBar
87 : SfxModule* pModule;
88 : bool bRegistered;
89 :
90 0 : SfxInterface_Impl() :
91 0 : aPopupRes(0,*SfxApplication::GetOrCreate()->GetSfxResManager()),
92 0 : aStatBarRes(0,*SfxApplication::GetOrCreate()->GetSfxResManager())
93 : , pModule(NULL)
94 0 : , bRegistered(false)
95 : {
96 0 : }
97 :
98 0 : ~SfxInterface_Impl()
99 0 : {
100 0 : for (SfxObjectUIArr_Impl::const_iterator it = aObjectBars.begin(); it != aObjectBars.end(); ++it)
101 0 : delete *it;
102 :
103 0 : for (SfxObjectUIArr_Impl::const_iterator it = aChildWindows.begin(); it != aChildWindows.end(); ++it)
104 0 : delete *it;
105 0 : }
106 : };
107 :
108 : static SfxObjectUI_Impl* CreateObjectBarUI_Impl( sal_uInt16 nPos, const ResId& rResId, sal_uInt32 nFeature, const OUString *pStr );
109 :
110 :
111 :
112 :
113 : // constuctor, registeres a new unit
114 :
115 0 : SfxInterface::SfxInterface( const char *pClassName,
116 : const ResId& rNameResId,
117 : SfxInterfaceId nId,
118 : const SfxInterface* pParent,
119 : SfxSlot &rSlotMap, sal_uInt16 nSlotCount ):
120 : pName(pClassName),
121 : pGenoType(pParent),
122 : nClassId(nId),
123 0 : aNameResId(rNameResId.GetId(),*rNameResId.GetResMgr()),
124 0 : pImpData(0)
125 : {
126 0 : pImpData = new SfxInterface_Impl;
127 0 : SetSlotMap( rSlotMap, nSlotCount );
128 0 : }
129 :
130 0 : void SfxInterface::Register( SfxModule* pMod )
131 : {
132 0 : pImpData->bRegistered = true;
133 0 : pImpData->pModule = pMod;
134 0 : if ( pMod )
135 0 : pMod->GetSlotPool()->RegisterInterface(*this);
136 : else
137 0 : SFX_APP()->GetAppSlotPool_Impl().RegisterInterface(*this);
138 0 : }
139 :
140 0 : void SfxInterface::SetSlotMap( SfxSlot& rSlotMap, sal_uInt16 nSlotCount )
141 : {
142 0 : pSlots = &rSlotMap;
143 0 : nCount = nSlotCount;
144 0 : SfxSlot* pIter = pSlots;
145 0 : if ( 1 == nCount && !pIter->pNextSlot )
146 0 : pIter->pNextSlot = pIter;
147 :
148 0 : if ( !pIter->pNextSlot )
149 : {
150 : // sort the SfxSlots by id
151 0 : qsort( pSlots, nCount, sizeof(SfxSlot), SfxCompareSlots_Impl );
152 :
153 : // link masters and slaves
154 0 : sal_uInt16 nIter = 1;
155 0 : for ( pIter = pSlots; nIter <= nCount; ++pIter, ++nIter )
156 : {
157 :
158 : assert( nIter == nCount ||
159 : pIter->GetSlotId() != (pIter+1)->GetSlotId() );
160 :
161 : // every master refers to his first slave (ENUM),
162 : // all slaves refer to their master.
163 : // Slaves refer in a circle to the other slaves with the same master
164 0 : if ( pIter->GetKind() == SFX_KIND_ENUM )
165 : {
166 0 : pIter->pLinkedSlot = GetSlot( pIter->nMasterSlotId );
167 : assert( pIter->pLinkedSlot );
168 0 : if ( !pIter->pLinkedSlot->pLinkedSlot )
169 0 : ( (SfxSlot*) pIter->pLinkedSlot)->pLinkedSlot = pIter;
170 :
171 0 : if ( 0 == pIter->GetNextSlot() )
172 : {
173 0 : SfxSlot *pLastSlot = pIter;
174 0 : for ( sal_uInt16 n = nIter; n < Count(); ++n )
175 : {
176 0 : SfxSlot *pCurSlot = (pSlots+n);
177 0 : if ( pCurSlot->nMasterSlotId == pIter->nMasterSlotId )
178 : {
179 0 : pLastSlot->pNextSlot = pCurSlot;
180 0 : pLastSlot = pCurSlot;
181 : }
182 : }
183 0 : pLastSlot->pNextSlot = pIter;
184 : }
185 : }
186 0 : else if ( 0 == pIter->GetNextSlot() )
187 : {
188 : // Slots refering in circle to the next with the same
189 : // Status method.
190 0 : SfxSlot *pLastSlot = pIter;
191 0 : for ( sal_uInt16 n = nIter; n < Count(); ++n )
192 : {
193 0 : SfxSlot *pCurSlot = (pSlots+n);
194 0 : if ( pCurSlot->GetStateFnc() == pIter->GetStateFnc() )
195 : {
196 0 : pLastSlot->pNextSlot = pCurSlot;
197 0 : pLastSlot = pCurSlot;
198 : }
199 : }
200 0 : pLastSlot->pNextSlot = pIter;
201 : }
202 : }
203 : }
204 : #ifdef DBG_UTIL
205 : else
206 : {
207 : sal_uInt16 nIter = 1;
208 : for ( SfxSlot *pNext = pIter+1; nIter < nCount; ++pNext, ++nIter )
209 : {
210 :
211 : if ( pNext->GetSlotId() <= pIter->GetSlotId() )
212 : SAL_WARN( "sfx.control", "Wrong order" );
213 :
214 : if ( pIter->GetKind() == SFX_KIND_ENUM )
215 : {
216 : const SfxSlot *pMasterSlot = GetSlot(pIter->nMasterSlotId);
217 : const SfxSlot *pFirstSlave = pMasterSlot->pLinkedSlot;
218 : const SfxSlot *pSlave = pFirstSlave;
219 : do
220 : {
221 : if ( pSlave->pLinkedSlot != pMasterSlot )
222 : {
223 : OStringBuffer aStr("Wrong Master/Slave- link: ");
224 : aStr.append(static_cast<sal_Int32>(
225 : pMasterSlot->GetSlotId()));
226 : aStr.append(" , ");
227 : aStr.append(static_cast<sal_Int32>(
228 : pSlave->GetSlotId()));
229 : SAL_WARN("sfx.control", aStr.getStr());
230 : }
231 :
232 : if ( pSlave->nMasterSlotId != pMasterSlot->GetSlotId() )
233 : {
234 : OStringBuffer aStr("Wrong Master/Slave-Ids: ");
235 : aStr.append(static_cast<sal_Int32>(
236 : pMasterSlot->GetSlotId()));
237 : aStr.append(" , ");
238 : aStr.append(static_cast<sal_Int32>(
239 : pSlave->GetSlotId()));
240 : SAL_WARN("sfx.control", aStr.getStr());
241 : }
242 :
243 : pSlave = pSlave->pNextSlot;
244 : }
245 : while ( pSlave != pFirstSlave );
246 : }
247 : else
248 : {
249 : if ( pIter->pLinkedSlot )
250 : {
251 : if ( pIter->pLinkedSlot->GetKind() != SFX_KIND_ENUM )
252 : {
253 : OStringBuffer aStr("Slave is no enum: ");
254 : aStr.append(static_cast<sal_Int32>(pIter->GetSlotId()));
255 : aStr.append(" , ");
256 : aStr.append(static_cast<sal_Int32>(
257 : pIter->pLinkedSlot->GetSlotId()));
258 : SAL_WARN("sfx.control", aStr.getStr());
259 : }
260 : }
261 :
262 : const SfxSlot *pCurSlot = pIter;
263 : do
264 : {
265 : pCurSlot = pCurSlot->pNextSlot;
266 : if ( pCurSlot->GetStateFnc() != pIter->GetStateFnc() )
267 : {
268 : OStringBuffer aStr("Linked Slots with different State Methods : ");
269 : aStr.append(static_cast<sal_Int32>(
270 : pCurSlot->GetSlotId()));
271 : aStr.append(" , ");
272 : aStr.append(static_cast<sal_Int32>(pIter->GetSlotId()));
273 : SAL_WARN("sfx.control", aStr.getStr());
274 : }
275 : }
276 : while ( pCurSlot != pIter );
277 : }
278 :
279 : pIter = pNext;
280 : }
281 : }
282 : #endif
283 0 : }
284 :
285 :
286 :
287 0 : SfxInterface::~SfxInterface()
288 : {
289 0 : SfxModule *pMod = pImpData->pModule;
290 0 : bool bRegistered = pImpData->bRegistered;
291 0 : delete pImpData;
292 : assert( bRegistered );
293 0 : if ( bRegistered )
294 : {
295 0 : if ( pMod )
296 0 : pMod->GetSlotPool()->ReleaseInterface(*this);
297 : else
298 0 : SFX_APP()->GetAppSlotPool_Impl().ReleaseInterface(*this);
299 : }
300 0 : }
301 :
302 :
303 :
304 : // searches for the specified func
305 :
306 0 : const SfxSlot* SfxInterface::GetSlot( sal_uInt16 nFuncId ) const
307 : {
308 :
309 : assert( pSlots );
310 : assert( nCount );
311 :
312 : // find the id using binary search
313 : void* p = bsearch( &nFuncId, pSlots, nCount, sizeof(SfxSlot),
314 0 : SfxCompareSlots_Impl );
315 0 : if ( !p && pGenoType )
316 0 : return pGenoType->GetSlot( nFuncId );
317 :
318 0 : return p ? (const SfxSlot*)p : 0;
319 : }
320 :
321 0 : const SfxSlot* SfxInterface::GetSlot( const OUString& rCommand ) const
322 : {
323 : static const char UNO_COMMAND[] = ".uno:";
324 :
325 0 : OUString aCommand( rCommand );
326 0 : if ( aCommand.startsWith( UNO_COMMAND ) )
327 0 : aCommand = aCommand.copy( sizeof( UNO_COMMAND )-1 );
328 :
329 0 : for ( sal_uInt16 n=0; n<nCount; n++ )
330 : {
331 0 : if ( (pSlots+n)->pUnoName &&
332 0 : aCommand.compareToIgnoreAsciiCaseAscii( (pSlots+n)->GetUnoName() ) == 0 )
333 0 : return pSlots+n;
334 : }
335 :
336 0 : return pGenoType ? pGenoType->GetSlot( aCommand ) : NULL;
337 : }
338 :
339 :
340 :
341 0 : const SfxSlot* SfxInterface::GetRealSlot( const SfxSlot *pSlot ) const
342 : {
343 :
344 : assert( pSlots );
345 : assert( nCount );
346 :
347 0 : if ( !ContainsSlot_Impl(pSlot) )
348 : {
349 0 : if(pGenoType)
350 0 : return pGenoType->GetRealSlot(pSlot);
351 : SAL_WARN( "sfx.control", "unknown Slot" );
352 0 : return 0;
353 : }
354 :
355 0 : return pSlot->pLinkedSlot;
356 : }
357 :
358 :
359 :
360 0 : const SfxSlot* SfxInterface::GetRealSlot( sal_uInt16 nSlotId ) const
361 : {
362 :
363 : assert( pSlots );
364 : assert( nCount );
365 :
366 0 : const SfxSlot *pSlot = GetSlot(nSlotId);
367 0 : if ( !pSlot )
368 : {
369 0 : if(pGenoType)
370 0 : return pGenoType->GetRealSlot(nSlotId);
371 : SAL_WARN( "sfx.control", "unknown Slot" );
372 0 : return 0;
373 : }
374 :
375 0 : return pSlot->pLinkedSlot;
376 : }
377 :
378 :
379 :
380 0 : void SfxInterface::RegisterPopupMenu( const ResId& rResId )
381 : {
382 :
383 0 : pImpData->aPopupRes = rResId;
384 0 : }
385 :
386 :
387 :
388 0 : void SfxInterface::RegisterObjectBar( sal_uInt16 nPos, const ResId& rResId,
389 : const OUString *pStr )
390 : {
391 0 : RegisterObjectBar( nPos, rResId, 0UL, pStr );
392 0 : }
393 :
394 :
395 0 : void SfxInterface::RegisterObjectBar( sal_uInt16 nPos, const ResId& rResId, sal_uInt32 nFeature, const OUString *pStr )
396 : {
397 0 : SfxObjectUI_Impl* pUI = CreateObjectBarUI_Impl( nPos, rResId, nFeature, pStr );
398 0 : if ( pUI )
399 0 : pImpData->aObjectBars.push_back(pUI);
400 0 : }
401 :
402 0 : SfxObjectUI_Impl* CreateObjectBarUI_Impl( sal_uInt16 nPos, const ResId& rResId, sal_uInt32 nFeature, const OUString *pStr )
403 : {
404 0 : if ((nPos & SFX_VISIBILITY_MASK) == 0)
405 0 : nPos |= SFX_VISIBILITY_STANDARD;
406 :
407 0 : SfxObjectUI_Impl* pUI = new SfxObjectUI_Impl(nPos, rResId, true, nFeature);
408 :
409 0 : if (pStr == 0)
410 : {
411 0 : ResId aResId(rResId);
412 0 : aResId.SetRT(RSC_STRING);
413 0 : aResId.SetResMgr(rResId.GetResMgr());
414 0 : if( ! aResId.GetResMgr() )
415 0 : aResId.SetResMgr( SfxApplication::GetOrCreate()->GetOffResManager_Impl() );
416 0 : if ( !aResId.GetResMgr() || !aResId.GetResMgr()->IsAvailable(aResId) )
417 0 : pUI->pName = new OUString ("NoName");
418 : else
419 0 : pUI->pName = new OUString(aResId.toString());
420 : }
421 : else
422 0 : pUI->pName = new OUString(*pStr);
423 :
424 0 : return pUI;
425 : }
426 :
427 0 : const ResId& SfxInterface::GetObjectBarResId( sal_uInt16 nNo ) const
428 : {
429 0 : bool bGenoType = (pGenoType != 0 && !pGenoType->HasName());
430 0 : if ( bGenoType )
431 : {
432 : // Are there toolbars in the super class?
433 0 : sal_uInt16 nBaseCount = pGenoType->GetObjectBarCount();
434 0 : if ( nNo < nBaseCount )
435 : // The Super class comes first
436 0 : return pGenoType->GetObjectBarResId( nNo );
437 : else
438 0 : nNo = nNo - nBaseCount;
439 : }
440 :
441 : assert( nNo<pImpData->aObjectBars.size() );
442 :
443 0 : return pImpData->aObjectBars[nNo]->aResId;
444 : }
445 :
446 :
447 :
448 :
449 0 : sal_uInt16 SfxInterface::GetObjectBarPos( sal_uInt16 nNo ) const
450 : {
451 0 : bool bGenoType = (pGenoType != 0 && !pGenoType->HasName());
452 0 : if ( bGenoType )
453 : {
454 : // Are there toolbars in the super class?
455 0 : sal_uInt16 nBaseCount = pGenoType->GetObjectBarCount();
456 0 : if ( nNo < nBaseCount )
457 : // The Super class comes first
458 0 : return pGenoType->GetObjectBarPos( nNo );
459 : else
460 0 : nNo = nNo - nBaseCount;
461 : }
462 :
463 : assert( nNo<pImpData->aObjectBars.size() );
464 :
465 0 : return pImpData->aObjectBars[nNo]->nPos;
466 : }
467 :
468 :
469 :
470 :
471 0 : sal_uInt16 SfxInterface::GetObjectBarCount() const
472 : {
473 0 : if (pGenoType && ! pGenoType->HasName())
474 0 : return pImpData->aObjectBars.size() + pGenoType->GetObjectBarCount();
475 : else
476 0 : return pImpData->aObjectBars.size();
477 : }
478 :
479 :
480 0 : void SfxInterface::RegisterChildWindow(sal_uInt16 nId, bool bContext, const OUString* pChildWinName)
481 : {
482 0 : RegisterChildWindow( nId, bContext, 0UL, pChildWinName );
483 0 : }
484 :
485 0 : void SfxInterface::RegisterChildWindow(sal_uInt16 nId, bool bContext, sal_uInt32 nFeature, const OUString*)
486 : {
487 0 : SfxObjectUI_Impl* pUI = new SfxObjectUI_Impl(0, ResId(nId, *SfxApplication::GetOrCreate()->GetOffResManager_Impl()), true, nFeature);
488 0 : pUI->bContext = bContext;
489 0 : pImpData->aChildWindows.push_back(pUI);
490 0 : }
491 :
492 0 : void SfxInterface::RegisterStatusBar(const ResId& rResId)
493 : {
494 0 : pImpData->aStatBarRes = rResId;
495 0 : }
496 :
497 :
498 0 : sal_uInt32 SfxInterface::GetChildWindowId (sal_uInt16 nNo) const
499 : {
500 0 : if ( pGenoType )
501 : {
502 : // Are there ChildWindows in der Superklasse?
503 0 : sal_uInt16 nBaseCount = pGenoType->GetChildWindowCount();
504 0 : if ( nNo < nBaseCount )
505 : // The Super class comes first
506 0 : return pGenoType->GetChildWindowId( nNo );
507 : else
508 0 : nNo = nNo - nBaseCount;
509 : }
510 :
511 : assert( nNo<pImpData->aChildWindows.size() );
512 :
513 0 : sal_uInt32 nRet = pImpData->aChildWindows[nNo]->aResId.GetId();
514 0 : if ( pImpData->aChildWindows[nNo]->bContext )
515 0 : nRet += sal_uInt32( nClassId ) << 16;
516 0 : return nRet;
517 : }
518 :
519 0 : sal_uInt32 SfxInterface::GetChildWindowFeature (sal_uInt16 nNo) const
520 : {
521 0 : if ( pGenoType )
522 : {
523 : // Are there ChildWindows in der Superklasse?
524 0 : sal_uInt16 nBaseCount = pGenoType->GetChildWindowCount();
525 0 : if ( nNo < nBaseCount )
526 : // The Super class comes first
527 0 : return pGenoType->GetChildWindowFeature( nNo );
528 : else
529 0 : nNo = nNo - nBaseCount;
530 : }
531 :
532 : assert( nNo<pImpData->aChildWindows.size() );
533 :
534 0 : return pImpData->aChildWindows[nNo]->nFeature;
535 : }
536 :
537 :
538 :
539 :
540 0 : sal_uInt16 SfxInterface::GetChildWindowCount() const
541 : {
542 0 : if (pGenoType)
543 0 : return pImpData->aChildWindows.size() + pGenoType->GetChildWindowCount();
544 : else
545 0 : return pImpData->aChildWindows.size();
546 : }
547 :
548 :
549 0 : const ResId& SfxInterface::GetPopupMenuResId() const
550 : {
551 0 : return pImpData->aPopupRes;
552 : }
553 :
554 :
555 0 : const ResId& SfxInterface::GetStatusBarResId() const
556 : {
557 0 : if (pImpData->aStatBarRes.GetId() == 0 && pGenoType)
558 0 : return pGenoType->GetStatusBarResId();
559 : else
560 0 : return pImpData->aStatBarRes;
561 : }
562 :
563 :
564 :
565 0 : const OUString* SfxInterface::GetObjectBarName ( sal_uInt16 nNo ) const
566 : {
567 0 : bool bGenoType = (pGenoType != 0 && !pGenoType->HasName());
568 0 : if ( bGenoType )
569 : {
570 : // Are there toolbars in the super class?
571 0 : sal_uInt16 nBaseCount = pGenoType->GetObjectBarCount();
572 0 : if ( nNo < nBaseCount )
573 : // The Super class comes first
574 0 : return pGenoType->GetObjectBarName( nNo );
575 : else
576 0 : nNo = nNo - nBaseCount;
577 : }
578 :
579 : assert( nNo<pImpData->aObjectBars.size() );
580 :
581 0 : return pImpData->aObjectBars[nNo]->pName;
582 : }
583 :
584 0 : sal_uInt32 SfxInterface::GetObjectBarFeature ( sal_uInt16 nNo ) const
585 : {
586 0 : bool bGenoType = (pGenoType != 0 && !pGenoType->HasName());
587 0 : if ( bGenoType )
588 : {
589 : // Are there toolbars in the super class?
590 0 : sal_uInt16 nBaseCount = pGenoType->GetObjectBarCount();
591 0 : if ( nNo < nBaseCount )
592 : // The Super class comes first
593 0 : return pGenoType->GetObjectBarFeature( nNo );
594 : else
595 0 : nNo = nNo - nBaseCount;
596 : }
597 :
598 : assert( nNo<pImpData->aObjectBars.size() );
599 :
600 0 : return pImpData->aObjectBars[nNo]->nFeature;
601 : }
602 :
603 0 : bool SfxInterface::IsObjectBarVisible(sal_uInt16 nNo) const
604 : {
605 0 : bool bGenoType = (pGenoType != 0 && !pGenoType->HasName());
606 0 : if ( bGenoType )
607 : {
608 : // Are there toolbars in the super class?
609 0 : sal_uInt16 nBaseCount = pGenoType->GetObjectBarCount();
610 0 : if ( nNo < nBaseCount )
611 : // The Super class comes first
612 0 : return pGenoType->IsObjectBarVisible( nNo );
613 : else
614 0 : nNo = nNo - nBaseCount;
615 : }
616 :
617 : assert( nNo<pImpData->aObjectBars.size() );
618 :
619 0 : return pImpData->aObjectBars[nNo]->bVisible;
620 : }
621 :
622 0 : const SfxInterface* SfxInterface::GetRealInterfaceForSlot( const SfxSlot *pRealSlot ) const
623 : {
624 : SAL_WARN_IF( !pImpData->bRegistered, "sfx.control", "Interface not registered" );
625 :
626 0 : const SfxInterface* pInterface = this;
627 :
628 : // The slot could also originate from the interface of a shell base class.
629 0 : do
630 : {
631 0 : const SfxSlot *pLastSlot = (*pInterface)[pInterface->Count()-1];
632 0 : const SfxSlot *pFirstSlot = (*pInterface)[0];
633 :
634 : // Is pInterface the Owner of pRealSlot ?
635 0 : if ( pFirstSlot <= pRealSlot && pRealSlot <= pLastSlot )
636 0 : break;
637 :
638 : // Otherwise try the Interface of Super class
639 0 : pInterface = pInterface->pGenoType;
640 : }
641 : while ( pInterface );
642 :
643 0 : return pInterface;
644 : }
645 :
646 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|