xref: /AOO41X/main/sfx2/source/dialog/templdlg.cxx (revision 5980243063f6840bf3a2e60b2243db5da5e78fa6)
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_sfx2.hxx"
26 
27 #ifndef _MENU_HXX //autogen
28 #include <vcl/menu.hxx>
29 #endif
30 #include <svl/intitem.hxx>
31 #include <svl/stritem.hxx>
32 #include <svl/style.hxx>
33 #ifndef GCC
34 #endif
35 
36 #define _SVSTDARR_STRINGSDTOR
37 #include <svl/svstdarr.hxx>
38 #include <comphelper/processfactory.hxx>
39 #include <comphelper/sequenceashashmap.hxx>
40 #include <unotools/intlwrapper.hxx>
41 #include <comphelper/processfactory.hxx>
42 #include <com/sun/star/container/XNameAccess.hpp>
43 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
44 #include <com/sun/star/beans/PropertyValue.hpp>
45 #include <com/sun/star/frame/XModuleManager.hpp>
46 
47 #include "sfx2/sfxhelp.hxx"
48 #include <sfx2/app.hxx>
49 #include <sfx2/dispatch.hxx>
50 #include <sfx2/bindings.hxx>
51 #include <sfx2/templdlg.hxx>
52 #include "templdgi.hxx"
53 #include "tplcitem.hxx"
54 #include "sfxtypes.hxx"
55 #include <sfx2/styfitem.hxx>
56 #include <sfx2/objsh.hxx>
57 #include <sfx2/viewsh.hxx>
58 #include <sfx2/newstyle.hxx>
59 #include "sfx2/tplpitem.hxx"
60 #include "sfx2/sfxresid.hxx"
61 
62 #include "templdlg.hrc"
63 #include <sfx2/sfx.hrc>
64 #include "dialog.hrc"
65 #include "arrdecl.hxx"
66 #include "fltfnc.hxx"
67 #include <sfx2/docfilt.hxx>
68 #include <sfx2/docfac.hxx>
69 #include "docvor.hxx"
70 #include <sfx2/doctempl.hxx>
71 #include <sfx2/module.hxx>
72 #include "sfx2/imgmgr.hxx"
73 #include "helpid.hrc"
74 #include "appdata.hxx"
75 #include <sfx2/viewfrm.hxx>
76 
77 #include <comphelper/configurationhelper.hxx>
78 
79 using namespace ::com::sun::star;
80 using namespace ::com::sun::star::beans;
81 using namespace ::com::sun::star::frame;
82 using namespace ::com::sun::star::uno;
83 
84 //=========================================================================
85 
86 // Fenster wird ab jetzt dynamisch erstellt. Daher hier R"ander usw.
87 
88 #define SFX_TEMPLDLG_HFRAME         3
89 #define SFX_TEMPLDLG_VTOPFRAME      3
90 
91 #define SFX_TEMPLDLG_VBOTFRAME      3
92 #define SFX_TEMPLDLG_MIDHSPACE      3
93 #define SFX_TEMPLDLG_MIDVSPACE      3
94 #define SFX_TEMPLDLG_FILTERHEIGHT   100
95 
96 static sal_uInt16 nLastItemId = USHRT_MAX;
97 
98 // filter box has maximum 12 entries visible
99 #define MAX_FILTER_ENTRIES          12
100 
101 #define SFX_TEMPLDLG_FILTER_MAX             0xFFFF
102 #define SFX_TEMPLDLG_FILTER_HIERARCHICAL    0xFFFE
103 
104 //=========================================================================
105 
106 TYPEINIT0(SfxCommonTemplateDialog_Impl);
107 TYPEINIT1(SfxTemplateDialog_Impl,SfxCommonTemplateDialog_Impl);
108 TYPEINIT1(SfxTemplateCatalog_Impl,SfxCommonTemplateDialog_Impl);
109 
110 SFX_IMPL_DOCKINGWINDOW(SfxTemplateDialogWrapper, SID_STYLE_DESIGNER)
111 
112 //-------------------------------------------------------------------------
113 
114 // Redirektionsfunktionen
115 
116 SfxTemplateDialog::SfxTemplateDialog
117 (
118     SfxBindings *pBind,
119     SfxChildWindow *pCW,
120     Window *pParent
121 )
122 
123 /*  [Beschreibung]
124     Gestalterklasse.
125 */
126     : SfxDockingWindow( pBind, pCW, pParent, SfxResId(DLG_STYLE_DESIGNER) ),
127 
128     pImpl( new SfxTemplateDialog_Impl( pParent, pBind, this ) )
129 
130 {
131     pImpl->updateNonFamilyImages();
132 }
133 
134 //-------------------------------------------------------------------------
135 
136 SfxTemplateDialog::~SfxTemplateDialog()
137 {
138     delete pImpl;
139 }
140 
141 ISfxTemplateCommon* SfxTemplateDialog::GetISfxTemplateCommon()
142 {
143     return pImpl->GetISfxTemplateCommon();
144 }
145 
146 void SfxTemplateDialog::SetParagraphFamily()
147 {
148     // first select the paragraph family
149     pImpl->FamilySelect( SFX_STYLE_FAMILY_PARA );
150     // then select the automatic filter
151     pImpl->SetAutomaticFilter();
152 }
153 
154 // ------------------------------------------------------------------------
155 
156 void SfxTemplateDialog::DataChanged( const DataChangedEvent& _rDCEvt )
157 {
158     if ( ( DATACHANGED_SETTINGS == _rDCEvt.GetType() ) &&
159          ( 0 != ( SETTINGS_STYLE & _rDCEvt.GetFlags() ) ) )
160     {
161         pImpl->updateFamilyImages();
162         pImpl->updateNonFamilyImages();
163     }
164 
165     SfxDockingWindow::DataChanged( _rDCEvt );
166 }
167 
168 //-------------------------------------------------------------------------
169 
170 void SfxTemplateDialog::Update()
171 {
172     pImpl->Update();
173 }
174 
175 //-------------------------------------------------------------------------
176 
177 void SfxTemplateDialog::Resize()
178 {
179     if(pImpl)
180         pImpl->Resize();
181     SfxDockingWindow::Resize();
182 }
183 
184 
185 //-------------------------------------------------------------------------
186 
187 SfxChildAlignment SfxTemplateDialog::CheckAlignment(SfxChildAlignment eActAlign,SfxChildAlignment eAlign)
188 {
189     switch (eAlign)
190     {
191         case SFX_ALIGN_TOP:
192         case SFX_ALIGN_HIGHESTTOP:
193         case SFX_ALIGN_LOWESTTOP:
194         case SFX_ALIGN_BOTTOM:
195         case SFX_ALIGN_LOWESTBOTTOM:
196         case SFX_ALIGN_HIGHESTBOTTOM:
197             return eActAlign;
198 
199         case SFX_ALIGN_LEFT:
200         case SFX_ALIGN_RIGHT:
201         case SFX_ALIGN_FIRSTLEFT:
202         case SFX_ALIGN_LASTLEFT:
203         case SFX_ALIGN_FIRSTRIGHT:
204         case SFX_ALIGN_LASTRIGHT:
205             return eAlign;
206 
207         default:
208             return eAlign;
209     }
210 }
211 
212 //-------------------------------------------------------------------------
213 
214 SfxTemplateCatalog::SfxTemplateCatalog(Window *pParent, SfxBindings *pBindings)
215  : SfxModalDialog(pParent,SfxResId(RID_STYLECATALOG))
216 {
217     pImpl = new SfxTemplateCatalog_Impl(pParent, pBindings, this);
218 }
219 
220 //-------------------------------------------------------------------------
221 
222 SfxTemplateCatalog::~SfxTemplateCatalog()
223 {
224     delete pImpl;
225 }
226 
227 //-------------------------------------------------------------------------
228 
229 void DropListBox_Impl::MouseButtonDown( const MouseEvent& rMEvt )
230 {
231     nModifier = rMEvt.GetModifier();
232 
233     sal_Bool bHitEmptySpace = ( NULL == GetEntry( rMEvt.GetPosPixel(), sal_True ) );
234     if( bHitEmptySpace && ( rMEvt.GetClicks() == 2 ) && rMEvt.IsMod1() )
235         Control::MouseButtonDown( rMEvt );
236     else
237         SvTreeListBox::MouseButtonDown( rMEvt );
238 }
239 
240 sal_Int8 DropListBox_Impl::AcceptDrop( const AcceptDropEvent& rEvt )
241 
242 /*  [Description: ]
243     Drop is enabled as long as it is allowed to create a new style by example, i.e. to
244     create a style out of the current selection.
245 */
246 
247 {
248     if ( IsDropFormatSupported( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) )
249     {
250         // special case: page styles are allowed to create new styles by example
251         // but not allowed to be created by drag and drop
252         if( pDialog->nActFamily == SfxCommonTemplateDialog_Impl::SfxFamilyIdToNId( SFX_STYLE_FAMILY_PAGE ) ||
253                 pDialog->bNewByExampleDisabled )
254             return DND_ACTION_NONE;
255         else
256             return DND_ACTION_COPY;
257     }
258     return SvTreeListBox::AcceptDrop( rEvt );
259 }
260 
261 //-------------------------------------------------------------------------
262 
263 sal_Int8 DropListBox_Impl::ExecuteDrop( const ExecuteDropEvent& rEvt )
264 {
265 //  rEvt.maDropEvent.Context->acceptDrop( DND_ACTION_NONE );
266 //  rEvt.maDropEvent.Context->dropComplete( sal_True );
267 
268     sal_Int8 nRet = DND_ACTION_NONE;
269     SfxObjectShell* pDocShell = pDialog->GetObjectShell();
270     TransferableDataHelper aHelper( rEvt.maDropEvent.Transferable );
271     sal_uInt32 nFormatCount = aHelper.GetFormatCount();
272     if ( pDocShell )
273     {
274         sal_Bool bFormatFound = sal_False;
275 
276         for ( sal_uInt32 i = 0; i < nFormatCount; ++i )
277         {
278             SotFormatStringId nId = aHelper.GetFormat(i);
279             TransferableObjectDescriptor aDesc;
280 
281             if ( aHelper.GetTransferableObjectDescriptor( nId, aDesc ) )
282             {
283                 if ( aDesc.maClassName == pDocShell->GetFactory().GetClassId() )
284                 {
285                     PostUserEvent( LINK( this, DropListBox_Impl, OnAsyncExecuteDrop ), 0 );
286 
287                     bFormatFound = sal_True;
288                     nRet =  rEvt.mnAction;
289                     break;
290                 }
291             }
292         }
293 
294         if ( !bFormatFound )
295             return SvTreeListBox::ExecuteDrop( rEvt );
296     }
297 
298     return nRet;
299 }
300 
301 
302 IMPL_LINK( DropListBox_Impl, OnAsyncExecuteDrop, SvLBoxEntry*, EMPTYARG )
303 {
304     pDialog->ActionSelect( SID_STYLE_NEW_BY_EXAMPLE );
305     return 0;
306 }
307 
308 
309 IMPL_LINK( DropListBox_Impl, OnAsyncExecuteError, void*, NOTINTERESTEDIN )
310 {
311     (void)NOTINTERESTEDIN; // unused
312     ErrorHandler::HandleError( ERRCODE_IO_WRONGFORMAT );
313 
314     return 0;
315 }
316 
317 
318 long DropListBox_Impl::Notify( NotifyEvent& rNEvt )
319 {
320     long nRet = 0;
321     if( rNEvt.GetType() == EVENT_KEYINPUT )
322     {
323         const KeyCode&  rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
324         if(!rKeyCode.GetModifier())
325         {
326             if( pDialog->bCanDel && KEY_DELETE == rKeyCode.GetCode())
327             {
328                 pDialog->DeleteHdl( NULL );
329                 nRet =  1;
330             }
331             else if( KEY_RETURN == rKeyCode.GetCode())
332             {
333                 GetDoubleClickHdl().Call(this);
334                 nRet = 1;
335             }
336         }
337     }
338     if(!nRet)
339         nRet = SvTreeListBox::Notify( rNEvt );
340     return nRet;
341 }
342 
343 
344 //-------------------------------------------------------------------------
345 
346 
347 SfxActionListBox::SfxActionListBox
348 (
349     SfxCommonTemplateDialog_Impl* pParent,
350     WinBits nWinBits
351 )
352 
353 /*  [Beschreibung]
354 
355     ListBox- Klasse, die im Command-Handler ein PopupMenu (Gestalter
356     spezifisch) startet.
357 
358 */
359 
360 :       DropListBox_Impl(pParent->GetWindow(), nWinBits, pParent)
361 
362 {
363     EnableContextMenuHandling();
364 }
365 
366 //-------------------------------------------------------------------------
367 
368 SfxActionListBox::SfxActionListBox( SfxCommonTemplateDialog_Impl* pParent,
369                                     const ResId &rResId) :
370     DropListBox_Impl(pParent->GetWindow(), rResId, pParent)
371 {
372     EnableContextMenuHandling();
373 }
374 
375 //-------------------------------------------------------------------------
376 
377 PopupMenu* SfxActionListBox::CreateContextMenu( void )
378 {
379     //added by BerryJia for fixing Bug102739 2002-9-9 17:00(Beijing Time)
380     if( !( GetSelectionCount() > 0 ) )
381     {
382         pDialog->EnableEdit( sal_False );
383         pDialog->EnableDel( sal_False );
384     }
385     return pDialog->CreateContextMenu();
386 }
387 
388 //-------------------------------------------------------------------------
389 
390 SfxTemplateDialogWrapper::SfxTemplateDialogWrapper(Window *pParentWnd,
391         sal_uInt16 nId,  SfxBindings *p, SfxChildWinInfo *pInfo) :
392     SfxChildWindow(pParentWnd, nId)
393 {
394     SfxTemplateDialog *pWin = new SfxTemplateDialog(p, this, pParentWnd);
395     pWindow = pWin;
396     eChildAlignment = SFX_ALIGN_NOALIGNMENT;
397 
398     pWin->Initialize( pInfo );
399     pWin->SetMinOutputSizePixel(pWin->pImpl->GetMinOutputSizePixel());
400 }
401 
402 void SfxTemplateDialogWrapper::SetParagraphFamily()
403 {
404     // forward to SfxTemplateDialog, because SfxTemplateDialog isn't exported
405     static_cast< SfxTemplateDialog* >( GetWindow() )->SetParagraphFamily();
406 }
407 
408 //=========================================================================
409 SV_DECL_PTRARR_DEL(ExpandedEntries, StringPtr,16,8)
410 SV_IMPL_PTRARR(ExpandedEntries, StringPtr)
411 
412 /*  [Beschreibung]
413 
414     TreeListBox- Klasse f"ur die Anzeige der hierarchischen View
415     der Vorlagen
416 
417 */
418 
419 class StyleTreeListBox_Impl : public DropListBox_Impl
420 {
421 private:
422     SvLBoxEntry*                    pCurEntry;
423     SfxCommonTemplateDialog_Impl*   pCommon;
424     Link                            aDoubleClickLink;
425     Link                            aDropLink;
426     String                          aParent;
427     String                          aStyle;
428 
429 protected:
430     virtual void    Command( const CommandEvent& rMEvt );
431     virtual long    Notify( NotifyEvent& rNEvt );
432     virtual sal_Bool    DoubleClickHdl();
433     virtual long    ExpandingHdl();
434     virtual void    ExpandedHdl();
435     virtual sal_Bool    NotifyMoving(SvLBoxEntry*  pTarget,
436                                      SvLBoxEntry*  pEntry,
437                                      SvLBoxEntry*& rpNewParent,
438                                      sal_uIntPtr&        rNewChildPos);
439 public:
440     StyleTreeListBox_Impl( SfxCommonTemplateDialog_Impl* pParent, WinBits nWinStyle = 0);
441 
442     void            SetDoubleClickHdl(const Link &rLink) { aDoubleClickLink = rLink; }
443     void            SetDropHdl(const Link &rLink) { aDropLink = rLink; }
444         using SvLBox::GetParent;
445     const String&   GetParent() const { return aParent; }
446     const String&   GetStyle() const { return aStyle; }
447     void            MakeExpanded_Impl(ExpandedEntries& rEntries) const;
448 
449     virtual PopupMenu* CreateContextMenu( void );
450 };
451 
452 //-------------------------------------------------------------------------
453 
454 
455 void StyleTreeListBox_Impl::MakeExpanded_Impl(ExpandedEntries& rEntries) const
456 {
457     SvLBoxEntry *pEntry;
458     sal_uInt16 nCount=0;
459     for(pEntry=(SvLBoxEntry*)FirstVisible();pEntry;pEntry=(SvLBoxEntry*)NextVisible(pEntry))
460     {
461         if(IsExpanded(pEntry))
462         {
463             StringPtr pString=new String(GetEntryText(pEntry));
464             rEntries.Insert(pString,nCount++);
465         }
466     }
467 }
468 
469 PopupMenu* StyleTreeListBox_Impl::CreateContextMenu()
470 {
471     return pDialog->CreateContextMenu();
472 }
473 
474 sal_Bool StyleTreeListBox_Impl::DoubleClickHdl()
475 
476 /*  [Beschreibung]
477 
478 
479     DoubleClick-Handler; ruft entsprechenden Link.
480     Virtuelle Methode aus SV.
481 
482 */
483 {
484     aDoubleClickLink.Call(this);
485     return sal_False;
486 }
487 
488 //-------------------------------------------------------------------------
489 
490 void StyleTreeListBox_Impl::Command( const CommandEvent& rCEvt )
491 
492 /*  [Beschreibung]
493 
494     Command Handler; dieser executed ein PopupMenu (Gestalter
495     spezifisch).
496     Virtuelle Methode aus SV.
497 
498 */
499 {
500     SvTreeListBox::Command(rCEvt);
501 }
502 
503 //-------------------------------------------------------------------------
504 
505 long StyleTreeListBox_Impl::Notify( NotifyEvent& rNEvt )
506 {
507     // handle <RETURN> as double click
508 
509     long nRet = 0;
510     if ( rNEvt.GetType() == EVENT_KEYINPUT )
511     {
512         const KeyCode&  rKeyCode = rNEvt.GetKeyEvent()->GetKeyCode();
513         if ( !rKeyCode.GetModifier() && KEY_RETURN == rKeyCode.GetCode() )
514         {
515             aDoubleClickLink.Call( this );
516             nRet = 1;
517         }
518     }
519 
520     if ( !nRet )
521         nRet = DropListBox_Impl::Notify( rNEvt );
522 
523     return nRet;
524 }
525 
526 //-------------------------------------------------------------------------
527 
528 sal_Bool StyleTreeListBox_Impl::NotifyMoving(SvLBoxEntry*  pTarget,
529                                          SvLBoxEntry*  pEntry,
530                                          SvLBoxEntry*& rpNewParent,
531                                          sal_uIntPtr& lPos)
532 /*  [Beschreibung]
533 
534     NotifyMoving Handler; dieser leitet per Link das Event an den Dialog
535     weiter.
536     Virtuelle Methode aus SV.
537 
538 */
539 {
540     if(!pTarget || !pEntry)
541         return sal_False;
542     aParent = GetEntryText(pTarget);
543     aStyle  = GetEntryText(pEntry);
544     const sal_Bool bRet = (sal_Bool)aDropLink.Call(this);
545     rpNewParent = pTarget;
546     lPos=0;
547     IntlWrapper aIntlWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
548     const CollatorWrapper* pCollator = aIntlWrapper.getCaseCollator();
549     for(SvLBoxEntry *pTmpEntry=FirstChild(pTarget);
550         pTmpEntry && COMPARE_LESS==pCollator->compareString(
551             GetEntryText(pTmpEntry),GetEntryText(pEntry));
552         pTmpEntry=NextSibling(pTmpEntry),lPos++) ;
553 
554     return bRet? (sal_Bool)2: sal_False;
555 }
556 
557 //-------------------------------------------------------------------------
558 
559 long  StyleTreeListBox_Impl::ExpandingHdl()
560 
561 /*  [Beschreibung]
562 
563     ExpandingHdl Handler; der aktuelle Eintrag wird gemerkt.
564     Virtuelle Methode aus SV.
565 
566     [Querverweise]
567     <StyleTreeListBox_Impl::ExpandedHdl()>
568 
569 */
570 {
571     pCurEntry = GetCurEntry();
572     return sal_True;
573 }
574 
575 //-------------------------------------------------------------------------
576 
577 void  StyleTreeListBox_Impl::ExpandedHdl()
578 
579 /*  [Beschreibung]
580 
581     ExpandedHdl Handler;
582     Virtuelle Methode aus SV.
583 
584     [Querverweise]
585     <StyleTreeListBox_Impl::ExpandingHdl()>
586 
587 */
588 
589 {
590     SvLBoxEntry *pEntry = GetHdlEntry();
591     if(!IsExpanded(pEntry) && pCurEntry != GetCurEntry())
592         SelectAll( sal_False );
593     pCurEntry = 0;
594 }
595 
596 //-------------------------------------------------------------------------
597 
598 StyleTreeListBox_Impl::StyleTreeListBox_Impl(
599     SfxCommonTemplateDialog_Impl* pParent, WinBits nWinStyle) :
600     DropListBox_Impl(pParent->GetWindow(), nWinStyle, pParent),
601     pCurEntry(0),
602     pCommon(pParent)
603 
604 /*  [Beschreibung]
605 
606     Konstruktor StyleTreeListBox_Impl
607 
608 */
609 {
610     EnableContextMenuHandling();
611 }
612 
613 //-------------------------------------------------------------------------
614 //-------------------------------------------------------------------------
615 
616 class StyleTreeArr_Impl;
617 
618 
619 /*  [Beschreibung]
620 
621     Interne Struktur f"ur den Aufbau der hierarchischen View
622 
623 */
624 
625 struct StyleTree_Impl
626 {
627     String aName;
628     String aParent;
629     StyleTreeArr_Impl *pChilds;
630     sal_Bool bIsExpanded;
631     sal_Bool HasParent() const { return aParent.Len() != 0; }
632 
633     StyleTree_Impl(const String &rName, const String &rParent):
634         aName(rName), aParent(rParent), pChilds(0), bIsExpanded(0) {}
635     ~StyleTree_Impl();
636     void Put(StyleTree_Impl* pIns, sal_uIntPtr lPos=ULONG_MAX);
637     sal_uIntPtr Count();
638 };
639 
640 typedef StyleTree_Impl* StyleTree_ImplPtr;
641 SV_DECL_PTRARR_DEL(StyleTreeArr_Impl, StyleTree_ImplPtr, 16, 8)
642 SV_IMPL_PTRARR(StyleTreeArr_Impl, StyleTree_ImplPtr)
643 
644 
645 sal_uIntPtr StyleTree_Impl::Count()
646 {
647     return pChilds ? pChilds->Count() : 0L;
648 }
649 
650 //-------------------------------------------------------------------------
651 
652 StyleTree_Impl::~StyleTree_Impl()
653 {
654     delete pChilds;
655 }
656 
657 //-------------------------------------------------------------------------
658 
659 void StyleTree_Impl::Put(StyleTree_Impl* pIns, sal_uIntPtr lPos)
660 {
661     if ( !pChilds )
662         pChilds = new StyleTreeArr_Impl;
663 
664     if ( ULONG_MAX == lPos )
665         lPos = pChilds->Count();
666     pChilds->Insert( pIns, (sal_uInt16)lPos );
667 }
668 
669 //-------------------------------------------------------------------------
670 
671 StyleTreeArr_Impl &MakeTree_Impl(StyleTreeArr_Impl &rArr)
672 {
673     const sal_uInt16 nCount = rArr.Count();
674     // Alle unter ihren Parents einordnen
675     sal_uInt16 i;
676     for(i = 0; i < nCount; ++i)
677     {
678         StyleTree_ImplPtr pEntry = rArr[i];
679         if(pEntry->HasParent())
680         {
681             for(sal_uInt16 j = 0; j < nCount; ++j)
682             {
683                 StyleTree_ImplPtr pCmp = rArr[j];
684                 if(pCmp->aName == pEntry->aParent)
685                 {
686                     // initial sortiert einfuegen
687                     sal_uInt16 ii;
688                     IntlWrapper aIntlWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
689                     const CollatorWrapper* pCollator = aIntlWrapper.getCaseCollator();
690                     for ( ii = 0;
691                          ii < pCmp->Count() && COMPARE_LESS ==
692                          pCollator->compareString( (*pCmp->pChilds)[ii]->aName,
693                                         pEntry->aName);++ii) ;
694                     pCmp->Put(pEntry,ii);
695                     break;
696                 }
697             }
698         }
699     }
700     // alle, die schon unter ihrem Parent eingeordnet wurden
701     // entfernen
702     for(i = 0; i < rArr.Count(); )
703     {
704         if(rArr[i]->HasParent())
705             rArr.Remove(i);
706         else
707             ++i;
708     }
709     return rArr;
710 }
711 
712 //-------------------------------------------------------------------------
713 
714 
715 inline sal_Bool IsExpanded_Impl( const ExpandedEntries& rEntries,
716                              const String &rStr)
717 {
718     sal_uInt16 nCount=rEntries.Count();
719     for(sal_uInt16 n=0;n<nCount;n++)
720         if(*rEntries[n]==rStr)
721             return sal_True;
722     return sal_False;
723 }
724 
725 
726 
727 SvLBoxEntry* FillBox_Impl(SvTreeListBox *pBox,
728                                  StyleTree_ImplPtr pEntry,
729                                  const ExpandedEntries& rEntries,
730                                  SvLBoxEntry* pParent = 0)
731 {
732     SvLBoxEntry* pNewEntry = pBox->InsertEntry(pEntry->aName, pParent);
733     const sal_uInt16 nCount = pEntry->pChilds? pEntry->pChilds->Count(): 0;
734     for(sal_uInt16 i = 0; i < nCount; ++i)
735         FillBox_Impl(pBox, (*pEntry->pChilds)[i], rEntries, pNewEntry);
736     return pNewEntry;
737 }
738 
739 //-------------------------------------------------------------------------
740 
741 // Konstruktor
742 
743 SfxCommonTemplateDialog_Impl::SfxCommonTemplateDialog_Impl( SfxBindings* pB, SfxDockingWindow* pW ) :
744 
745     aISfxTemplateCommon     ( this ),
746     pBindings               ( pB ),
747     pWindow                 ( pW ),
748     pModule                 ( NULL ),
749     pTimer                  ( NULL ),
750     m_pStyleFamiliesId      ( NULL ),
751     pStyleSheetPool         ( NULL ),
752     pTreeBox                ( NULL ),
753     pCurObjShell            ( NULL ),
754     xModuleManager          ( ::comphelper::getProcessServiceFactory()->createInstance(
755                                 DEFINE_CONST_UNICODE("com.sun.star.frame.ModuleManager") ), UNO_QUERY ),
756     pbDeleted               ( NULL ),
757 
758     aFmtLb                  ( this, WB_BORDER | WB_TABSTOP | WB_SORT | WB_QUICK_SEARCH ),
759     aFilterLb               ( pW, WB_BORDER | WB_DROPDOWN | WB_TABSTOP ),
760 
761     nActFamily              ( SFX_TEMPLDLG_FILTER_MAX ),
762     nActFilter              ( 0 ),
763     nAppFilter              ( 0 ),
764 
765     bDontUpdate             ( sal_False ),
766     bIsWater                ( sal_False ),
767     bEnabled                ( sal_True ),
768     bUpdate                 ( sal_False ),
769     bUpdateFamily           ( sal_False ),
770     bCanEdit                ( sal_False ),
771     bCanDel                 ( sal_False ),
772     bCanNew                 ( sal_True ),
773     bWaterDisabled          ( sal_False ),
774     bNewByExampleDisabled   ( sal_False ),
775     bUpdateByExampleDisabled( sal_False ),
776     bTreeDrag               ( sal_True ),
777     bHierarchical           ( sal_False ),
778     bBindingUpdate          ( sal_True )
779 {
780     aFmtLb.SetAccessibleName(SfxResId(STR_STYLE_ELEMTLIST));
781     aFmtLb.SetHelpId( HID_TEMPLATE_FMT );
782     aFilterLb.SetHelpId( HID_TEMPLATE_FILTER );
783     aFmtLb.SetStyle( aFmtLb.GetStyle() | WB_SORT | WB_HIDESELECTION );
784     Font aFont = aFmtLb.GetFont();
785     aFont.SetWeight( WEIGHT_NORMAL );
786     aFmtLb.SetFont( aFont );
787 }
788 
789 //-------------------------------------------------------------------------
790 
791 SfxCommonTemplateDialog_Impl::SfxCommonTemplateDialog_Impl( SfxBindings* pB, ModalDialog* pW ) :
792 
793     aISfxTemplateCommon     ( this ),
794     pBindings               ( pB ),
795     pWindow                 ( pW ),
796     pModule                 ( NULL ),
797     pTimer                  ( NULL ),
798     pStyleSheetPool         ( NULL ),
799     pTreeBox                ( NULL ),
800     pCurObjShell            ( NULL ),
801     pbDeleted               ( NULL ),
802 
803     aFmtLb                  ( this, SfxResId( BT_VLIST ) ),
804     aFilterLb               ( pW, SfxResId( BT_FLIST ) ),
805 
806     nActFamily              ( SFX_TEMPLDLG_FILTER_MAX ),
807     nActFilter              ( 0 ),
808     nAppFilter              ( 0 ),
809 
810     bDontUpdate             ( sal_False ),
811     bIsWater                ( sal_False ),
812     bEnabled                ( sal_True ),
813     bUpdate                 ( sal_False ),
814     bUpdateFamily           ( sal_False ),
815     bCanEdit                ( sal_False ),
816     bCanDel                 ( sal_False ),
817     bCanNew                 ( sal_True ),
818     bWaterDisabled          ( sal_False ),
819     bNewByExampleDisabled   ( sal_False ),
820     bUpdateByExampleDisabled( sal_False ),
821     bTreeDrag               ( sal_True ),
822     bHierarchical           ( sal_False ),
823     bBindingUpdate          ( sal_True )
824 
825 {
826     aFmtLb.SetStyle( aFmtLb.GetStyle() | WB_SORT );
827 }
828 
829 //-------------------------------------------------------------------------
830 
831 sal_uInt16 SfxCommonTemplateDialog_Impl::StyleNrToInfoOffset(sal_uInt16 nId)
832 {
833     const SfxStyleFamilyItem *pItem=pStyleFamilies->GetObject(nId);
834     return SfxFamilyIdToNId(pItem->GetFamily())-1;
835 }
836 
837 //-------------------------------------------------------------------------
838 
839 void SfxTemplateDialog_Impl::EnableEdit(sal_Bool bEnable)
840 {
841     SfxCommonTemplateDialog_Impl::EnableEdit( bEnable );
842     if( !bEnable || !bUpdateByExampleDisabled )
843         EnableItem( SID_STYLE_UPDATE_BY_EXAMPLE, bEnable);
844 }
845 
846 //-------------------------------------------------------------------------
847 
848 
849 sal_uInt16 SfxCommonTemplateDialog_Impl::InfoOffsetToStyleNr(sal_uInt16 nId)
850 {
851     for ( sal_uInt16 i=0;i<pStyleFamilies->Count();i++ )
852         if ( SfxFamilyIdToNId(pStyleFamilies->GetObject(i)->GetFamily()) == nId+1 )
853             return i;
854     DBG_ERROR("Style Nummer nicht gefunden");
855     return 0;
856 }
857 
858 
859 //-------------------------------------------------------------------------
860 
861 void SfxCommonTemplateDialog_Impl::ReadResource()
862 {
863     // globale Benutzer-Resource auslesen
864     sal_uInt16 i;
865     for(i = 0; i < MAX_FAMILIES; ++i)
866         pFamilyState[i] = 0;
867 
868     SfxViewFrame* pViewFrame = pBindings->GetDispatcher_Impl()->GetFrame();
869     pCurObjShell = pViewFrame->GetObjectShell();
870     ResMgr* pMgr = pCurObjShell ? pCurObjShell->GetResMgr() : NULL;
871     ResId aFamId( DLG_STYLE_DESIGNER, *pMgr );
872     aFamId.SetRT(RSC_SFX_STYLE_FAMILIES);
873     m_pStyleFamiliesId = new ResId( aFamId.GetId(), *pMgr );
874     m_pStyleFamiliesId->SetRT(RSC_SFX_STYLE_FAMILIES);
875     if( !pMgr || !pMgr->IsAvailable( aFamId ) )
876         pStyleFamilies = new SfxStyleFamilies;
877     else
878         pStyleFamilies = new SfxStyleFamilies( aFamId );
879 
880     nActFilter = pCurObjShell ?
881         static_cast< sal_uInt16 >( LoadFactoryStyleFilter( pCurObjShell ) ) :
882         SFX_TEMPLDLG_FILTER_MAX;
883     if ( pCurObjShell && SFX_TEMPLDLG_FILTER_MAX == nActFilter )
884         nActFilter = pCurObjShell->GetAutoStyleFilterIndex();
885 
886         // Einfuegen in die Toolbox
887         // umgekehrte Reihenfolge, da immer vorne eingefuegt wird.
888     sal_uInt16 nCount = pStyleFamilies->Count();
889 
890     pBindings->ENTERREGISTRATIONS();
891 
892     for(i = 0; i < nCount; ++i)
893     {
894         sal_uInt16 nSlot = 0;
895         switch((sal_uInt16)pStyleFamilies->GetObject(i)->GetFamily())
896         {
897             case SFX_STYLE_FAMILY_CHAR: nSlot = SID_STYLE_FAMILY1; break;
898             case SFX_STYLE_FAMILY_PARA: nSlot = SID_STYLE_FAMILY2; break;
899             case SFX_STYLE_FAMILY_FRAME:nSlot = SID_STYLE_FAMILY3; break;
900             case SFX_STYLE_FAMILY_PAGE: nSlot = SID_STYLE_FAMILY4; break;
901             case SFX_STYLE_FAMILY_PSEUDO: nSlot = SID_STYLE_FAMILY5; break;
902             default: DBG_ERROR("unbekannte StyleFamily"); break;
903         }
904         pBoundItems[i] =
905             new SfxTemplateControllerItem(nSlot, *this, *pBindings);
906     }
907     pBoundItems[i++] = new SfxTemplateControllerItem(
908         SID_STYLE_WATERCAN, *this, *pBindings);
909     pBoundItems[i++] = new SfxTemplateControllerItem(
910         SID_STYLE_NEW_BY_EXAMPLE, *this, *pBindings);
911     pBoundItems[i++] = new SfxTemplateControllerItem(
912         SID_STYLE_UPDATE_BY_EXAMPLE, *this, *pBindings);
913     pBoundItems[i++] = new SfxTemplateControllerItem(
914         SID_STYLE_NEW, *this, *pBindings);
915     pBoundItems[i++] = new SfxTemplateControllerItem(
916         SID_STYLE_DRAGHIERARCHIE, *this, *pBindings);
917     pBoundItems[i++] = new SfxTemplateControllerItem(
918         SID_STYLE_EDIT, *this, *pBindings);
919     pBoundItems[i++] = new SfxTemplateControllerItem(
920         SID_STYLE_DELETE, *this, *pBindings);
921     pBoundItems[i++] = new SfxTemplateControllerItem(
922         SID_STYLE_FAMILY, *this, *pBindings);
923     pBindings->LEAVEREGISTRATIONS();
924 
925     for(; i < COUNT_BOUND_FUNC; ++i)
926         pBoundItems[i] = 0;
927 
928     StartListening(*pBindings);
929 
930 //In umgekehrter Reihenfolge des Auftretens in den Stylefamilies einfuegen.
931 //Das ist fuer den Toolbar des Gestalters. Die Listbox des Kataloges achtet
932 //selbst auf korrekte Reihenfolge.
933 
934 //Reihenfolgen: Reihenfolge in der Resource = Reihenfolge in Toolbar bzw.
935 //Listbox.
936 //Reihenfolge aufsteigender SIDs: Niedrige SIDs werden als erstes angezeigt,
937 //wenn Vorlagen mehrerer Familien aktiv sind.
938 
939     // in the Writer the UpdateStyleByExample Toolbox button is removed and
940     // the NewStyle button gets a PopupMenu
941     if(nCount > 4)
942         ReplaceUpdateButtonByMenu();
943 
944     for( ; nCount--; )
945     {
946         const SfxStyleFamilyItem *pItem = pStyleFamilies->GetObject( nCount );
947         sal_uInt16 nId = SfxFamilyIdToNId( pItem->GetFamily() );
948         InsertFamilyItem( nId, pItem );
949     }
950 
951     LoadedFamilies();
952 
953     sal_uInt16 nStart = SID_STYLE_FAMILY1;
954     sal_uInt16 nEnd = SID_STYLE_FAMILY4;
955 
956     for ( i = nStart; i <= nEnd; i++ )
957         pBindings->Update(i);
958 
959     pModule = pCurObjShell ? pCurObjShell->GetModule() : NULL;
960 }
961 
962 //-------------------------------------------------------------------------
963 
964 void SfxCommonTemplateDialog_Impl::ClearResource()
965 {
966     ClearFamilyList();
967     DELETEX(pStyleFamilies);
968     sal_uInt16 i;
969     for ( i = 0; i < MAX_FAMILIES; ++i )
970         DELETEX(pFamilyState[i]);
971     for ( i = 0; i < COUNT_BOUND_FUNC; ++i )
972         delete pBoundItems[i];
973     pCurObjShell = NULL;
974 
975     DELETEZ( m_pStyleFamiliesId );
976 }
977 
978 //-------------------------------------------------------------------------
979 
980 void SfxCommonTemplateDialog_Impl::Initialize()
981 {
982     // globale Benutzer-Resource auslesen
983     ReadResource();
984     pBindings->Invalidate( SID_STYLE_FAMILY );
985     pBindings->Update( SID_STYLE_FAMILY );
986     Update_Impl();
987 
988     aFilterLb.SetSelectHdl( LINK( this, SfxCommonTemplateDialog_Impl, FilterSelectHdl ) );
989     aFmtLb.SetDoubleClickHdl( LINK( this, SfxCommonTemplateDialog_Impl, ApplyHdl ) );
990     aFmtLb.SetSelectHdl( LINK( this, SfxCommonTemplateDialog_Impl, FmtSelectHdl ) );
991 
992     aFilterLb.Show();
993     aFmtLb.Show();
994 }
995 
996 //-------------------------------------------------------------------------
997 
998 SfxCommonTemplateDialog_Impl::~SfxCommonTemplateDialog_Impl()
999 {
1000     String aEmpty;
1001     if ( bIsWater )
1002         Execute_Impl(SID_STYLE_WATERCAN, aEmpty, aEmpty, 0);
1003     GetWindow()->Hide();
1004     DELETEX(pStyleFamilies);
1005     DELETEZ( m_pStyleFamiliesId );
1006     sal_uInt16 i;
1007     for ( i = 0; i < MAX_FAMILIES; ++i )
1008         DELETEX(pFamilyState[i]);
1009     for ( i = 0; i < COUNT_BOUND_FUNC; ++i )
1010         delete pBoundItems[i];
1011     if ( pStyleSheetPool )
1012         EndListening(*pStyleSheetPool);
1013     pStyleSheetPool = NULL;
1014     delete pTreeBox;
1015     delete pTimer;
1016     if ( pbDeleted )
1017     {
1018         pbDeleted->bDead = true;
1019         pbDeleted = NULL;
1020     }
1021 }
1022 
1023 //-------------------------------------------------------------------------
1024 
1025 sal_uInt16 SfxCommonTemplateDialog_Impl::SfxFamilyIdToNId( SfxStyleFamily nFamily )
1026 {
1027     switch ( nFamily )
1028     {
1029         case SFX_STYLE_FAMILY_CHAR:   return 1;
1030         case SFX_STYLE_FAMILY_PARA:   return 2;
1031         case SFX_STYLE_FAMILY_FRAME:  return 3;
1032         case SFX_STYLE_FAMILY_PAGE:   return 4;
1033         case SFX_STYLE_FAMILY_PSEUDO: return 5;
1034         default:                      return 0;
1035     }
1036 }
1037 
1038 void SfxCommonTemplateDialog_Impl::SetAutomaticFilter()
1039 {
1040     sal_uInt16 nCount = aFilterLb.GetEntryCount();
1041     for ( sal_uInt16 i = 0; i < nCount; ++i )
1042     {
1043         sal_uIntPtr nFlags = (sal_uIntPtr)aFilterLb.GetEntryData(i);
1044         if ( SFXSTYLEBIT_AUTO == nFlags )
1045         {
1046             // automatic entry found -> select it
1047             aFilterLb.SelectEntryPos(i);
1048             // then call the handler to filter the styles
1049             FilterSelect( i - 1 );
1050             break;
1051         }
1052     }
1053 }
1054 
1055 //-------------------------------------------------------------------------
1056 
1057 // Hilfsfunktion: Zugriff auf aktuelles Family-Item
1058 const SfxStyleFamilyItem *SfxCommonTemplateDialog_Impl::GetFamilyItem_Impl() const
1059 {
1060     const sal_uInt16 nCount = pStyleFamilies->Count();
1061     for(sal_uInt16 i = 0; i < nCount; ++i)
1062     {
1063         const SfxStyleFamilyItem *pItem = pStyleFamilies->GetObject(i);
1064 //        if(!pItem)continue;
1065         sal_uInt16 nId = SfxFamilyIdToNId(pItem->GetFamily());
1066         if(nId == nActFamily)
1067             return pItem;
1068     }
1069     return 0;
1070 }
1071 
1072 //-------------------------------------------------------------------------
1073 
1074 void SfxCommonTemplateDialog_Impl::SelectStyle(const String &rStr)
1075 {
1076     const SfxStyleFamilyItem* pItem = GetFamilyItem_Impl();
1077     if ( !pItem )
1078         return;
1079     const SfxStyleFamily eFam = pItem->GetFamily();
1080     SfxStyleSheetBase* pStyle = pStyleSheetPool->Find( rStr, eFam, SFXSTYLEBIT_ALL );
1081     if( pStyle )
1082         EnableEdit( !(pStyle->GetMask() & SFXSTYLEBIT_READONLY) );
1083     else
1084         EnableEdit(sal_False);
1085 
1086     if ( pTreeBox )
1087     {
1088         if ( rStr.Len() )
1089         {
1090             SvLBoxEntry* pEntry = pTreeBox->First();
1091             while ( pEntry )
1092             {
1093                 if ( pTreeBox->GetEntryText( pEntry ) == rStr )
1094                 {
1095                     pTreeBox->MakeVisible( pEntry );
1096                     pTreeBox->Select( pEntry );
1097                     return;
1098                 }
1099                 pEntry = pTreeBox->Next( pEntry );
1100             }
1101         }
1102         else
1103             pTreeBox->SelectAll( sal_False );
1104     }
1105     else
1106     {
1107         sal_Bool bSelect = ( rStr.Len() > 0 );
1108         if ( bSelect )
1109         {
1110             SvLBoxEntry* pEntry = (SvLBoxEntry*)aFmtLb.FirstVisible();
1111             while ( pEntry && aFmtLb.GetEntryText( pEntry ) != rStr )
1112                 pEntry = (SvLBoxEntry*)aFmtLb.NextVisible( pEntry );
1113             if ( !pEntry )
1114                 bSelect = sal_False;
1115             else
1116             {
1117                 aFmtLb.MakeVisible( pEntry );
1118                 aFmtLb.Select( pEntry );
1119                 bWaterDisabled = !HasSelectedStyle(); //added by BerryJia for fixing Bug76391 2003-1-22
1120                 FmtSelectHdl( NULL );
1121             }
1122         }
1123 
1124         if ( !bSelect )
1125         {
1126             aFmtLb.SelectAll( sal_False );
1127             EnableEdit(sal_False);
1128         }
1129     }
1130 }
1131 
1132 //-------------------------------------------------------------------------
1133 
1134 String SfxCommonTemplateDialog_Impl::GetSelectedEntry() const
1135 {
1136     String aRet;
1137     if ( pTreeBox )
1138     {
1139         SvLBoxEntry* pEntry = pTreeBox->FirstSelected();
1140         if ( pEntry )
1141             aRet = pTreeBox->GetEntryText( pEntry );
1142     }
1143     else
1144     {
1145         SvLBoxEntry* pEntry = aFmtLb.FirstSelected();
1146         if ( pEntry )
1147             aRet = aFmtLb.GetEntryText( pEntry );
1148     }
1149     return aRet;
1150 }
1151 
1152 //-------------------------------------------------------------------------
1153 
1154 void SfxCommonTemplateDialog_Impl::EnableTreeDrag( sal_Bool bEnable )
1155 {
1156     if ( pStyleSheetPool )
1157     {
1158         SfxStyleSheetBase* pStyle = pStyleSheetPool->First();
1159         if ( pTreeBox )
1160         {
1161             if ( pStyle && pStyle->HasParentSupport() && bEnable )
1162                 pTreeBox->SetDragDropMode(SV_DRAGDROP_CTRL_MOVE);
1163             else
1164                 pTreeBox->SetDragDropMode(SV_DRAGDROP_NONE);
1165         }
1166     }
1167     bTreeDrag = bEnable;
1168 }
1169 
1170 //-------------------------------------------------------------------------
1171 
1172 void SfxCommonTemplateDialog_Impl::FillTreeBox()
1173 {
1174     DBG_ASSERT( pTreeBox, "FillTreeBox() without treebox");
1175     if(pStyleSheetPool && nActFamily != SFX_TEMPLDLG_FILTER_MAX)
1176     {
1177         const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
1178         pStyleSheetPool->SetSearchMask(pItem->GetFamily(), SFXSTYLEBIT_ALL);
1179         StyleTreeArr_Impl aArr;
1180         SfxStyleSheetBase *pStyle = pStyleSheetPool->First();
1181         if(pStyle && pStyle->HasParentSupport() && bTreeDrag )
1182             pTreeBox->SetDragDropMode(SV_DRAGDROP_CTRL_MOVE);
1183         else
1184             pTreeBox->SetDragDropMode(SV_DRAGDROP_NONE);
1185         while(pStyle)
1186         {
1187             StyleTree_ImplPtr pNew =
1188                 new StyleTree_Impl(pStyle->GetName(), pStyle->GetParent());
1189             aArr.Insert(pNew, aArr.Count());
1190             pStyle = pStyleSheetPool->Next();
1191         }
1192         MakeTree_Impl(aArr);
1193         ExpandedEntries aEntries;
1194         if(pTreeBox)
1195             ((const StyleTreeListBox_Impl *)pTreeBox)->
1196                 MakeExpanded_Impl( aEntries);
1197         pTreeBox->SetUpdateMode( sal_False );
1198         pTreeBox->Clear();
1199         const sal_uInt16 nCount = aArr.Count();
1200         for(sal_uInt16 i = 0; i < nCount; ++i)
1201             FillBox_Impl(pTreeBox, aArr[i], aEntries);
1202 
1203 //      EnableEdit(sal_False);
1204         EnableItem(SID_STYLE_WATERCAN,sal_False);
1205 
1206         SfxTemplateItem* pState = pFamilyState[nActFamily-1];
1207 
1208         if ( nCount )
1209             pTreeBox->Expand( pTreeBox->First() );
1210 
1211         for ( SvLBoxEntry* pEntry = pTreeBox->First(); pEntry; pEntry = pTreeBox->Next( pEntry ) )
1212         {
1213             if ( IsExpanded_Impl( aEntries, pTreeBox->GetEntryText( pEntry ) ) )
1214                 pTreeBox->Expand( pEntry );
1215         }
1216 
1217         pTreeBox->SetUpdateMode( sal_True );
1218 
1219         String aStyle;
1220         if(pState)  //Aktuellen Eintrag selektieren
1221             aStyle = pState->GetStyleName();
1222         SelectStyle(aStyle);
1223         EnableDelete();
1224     }
1225 }
1226 
1227 //-------------------------------------------------------------------------
1228 sal_Bool SfxCommonTemplateDialog_Impl::HasSelectedStyle() const
1229 {
1230     return pTreeBox? pTreeBox->FirstSelected() != 0:
1231             aFmtLb.GetSelectionCount() != 0;
1232 }
1233 
1234 
1235 //-------------------------------------------------------------------------
1236 
1237 // intern: Aktualisierung der Anzeige
1238 void SfxCommonTemplateDialog_Impl::UpdateStyles_Impl(sal_uInt16 nFlags)     // Flags, was aktualisiert werden soll (s.o.)
1239 {
1240     DBG_ASSERT(nFlags, "nichts zu tun");
1241     const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
1242     if (!pItem)
1243     {
1244         // Ist beim Vorlagenkatalog der Fall
1245         SfxTemplateItem **ppItem = pFamilyState;
1246         const sal_uInt16 nFamilyCount = pStyleFamilies->Count();
1247         sal_uInt16 n;
1248         for(n=0;n<nFamilyCount;n++)
1249             if(ppItem[StyleNrToInfoOffset(n)])break;
1250         if ( n == nFamilyCount )
1251             // passiert gelegentlich bei Beichten, Formularen etc.; weiss der Teufel warum
1252             return;
1253         ppItem+=StyleNrToInfoOffset(n);
1254         nAppFilter = (*ppItem)->GetValue();
1255         FamilySelect(  StyleNrToInfoOffset(n)+1 );
1256         pItem = GetFamilyItem_Impl();
1257     }
1258 
1259     const SfxStyleFamily eFam = pItem->GetFamily();
1260 
1261     SfxFilterTupel *pT = pItem->GetFilterList().GetObject(nActFilter);
1262     sal_uInt16 nFilter = pT ? pItem->GetFilterList().GetObject(nActFilter)->nFlags : 0;
1263     if(!nFilter)    // automatisch
1264         nFilter = nAppFilter;
1265 
1266     DBG_ASSERT(pStyleSheetPool, "kein StyleSheetPool");
1267     if(pStyleSheetPool)
1268     {
1269         pStyleSheetPool->SetSearchMask(eFam, nFilter);
1270         pItem = GetFamilyItem_Impl();
1271         if((nFlags & UPDATE_FAMILY) == UPDATE_FAMILY)
1272         {
1273             CheckItem(nActFamily, sal_True);    // Button in Toolbox checken
1274             aFilterLb.SetUpdateMode(sal_False);
1275             aFilterLb.Clear();
1276             //insert hierarchical at the beginning
1277             sal_uInt16 nPos = aFilterLb.InsertEntry(String(SfxResId(STR_STYLE_FILTER_HIERARCHICAL)), 0);
1278             aFilterLb.SetEntryData( nPos, (void*)(sal_uIntPtr)SFXSTYLEBIT_ALL );
1279             const SfxStyleFilter& rFilter = pItem->GetFilterList();
1280             for(sal_uInt16 i = 0; i < rFilter.Count(); ++i)
1281             {
1282                 sal_uIntPtr nFilterFlags = rFilter.GetObject(i)->nFlags;
1283                 nPos = aFilterLb.InsertEntry( rFilter.GetObject(i)->aName );
1284                 aFilterLb.SetEntryData( nPos, (void*)nFilterFlags );
1285             }
1286             if(nActFilter < aFilterLb.GetEntryCount() - 1)
1287                 aFilterLb.SelectEntryPos(nActFilter + 1);
1288             else
1289             {
1290                 nActFilter = 0;
1291                 aFilterLb.SelectEntryPos(1);
1292                 SfxFilterTupel *pActT = rFilter.GetObject(nActFilter);
1293                 sal_uInt16 nFilterFlags = pActT ? rFilter.GetObject(nActFilter)->nFlags : 0;
1294                 pStyleSheetPool->SetSearchMask(eFam, nFilterFlags);
1295             }
1296 
1297             //Falls in Treedarstellung wieder Family Hierarchie selektieren
1298             if(pTreeBox)
1299                 aFilterLb.SelectEntry(String(SfxResId(STR_STYLE_FILTER_HIERARCHICAL)));
1300 
1301             // show maximum 12 entries
1302             aFilterLb.SetDropDownLineCount( MAX_FILTER_ENTRIES );
1303             aFilterLb.SetUpdateMode(sal_True);
1304         }
1305         else
1306         {
1307             if( nActFilter < aFilterLb.GetEntryCount() - 1)
1308                 aFilterLb.SelectEntryPos(nActFilter + 1);
1309             else
1310             {
1311                 nActFilter = 0;
1312                 aFilterLb.SelectEntryPos(1);
1313             }
1314         }
1315 
1316         if(nFlags & UPDATE_FAMILY_LIST)
1317         {
1318 //          EnableEdit(sal_False);
1319             EnableItem(SID_STYLE_WATERCAN,sal_False);
1320 
1321             SfxStyleSheetBase *pStyle = pStyleSheetPool->First();
1322             SvLBoxEntry* pEntry = aFmtLb.First();
1323             SvStringsDtor aStrings;
1324 
1325             while( pStyle )
1326             {
1327                 //Bubblesort
1328                 for( sal_uInt16 nPos = aStrings.Count() + 1 ; nPos-- ;)
1329                 {
1330                     if( !nPos || *aStrings[nPos-1] < pStyle->GetName() )
1331                     {
1332                         // Die Namen stehen in den Styles, also nicht kopieren
1333                         // Reingefallen!: Writer hat insgesamt nur 1 Style
1334                         aStrings.Insert(
1335                             new String( pStyle->GetName() ), nPos );
1336                         break;
1337                     }
1338                 }
1339                 pStyle = pStyleSheetPool->Next();
1340             }
1341 
1342 
1343             sal_uInt16 nCount = aStrings.Count();
1344             sal_uInt16 nPos = 0;
1345             while( nPos < nCount && pEntry &&
1346                    *aStrings[ nPos ] == aFmtLb.GetEntryText( pEntry ) )
1347             {
1348                 nPos++;
1349                 pEntry = aFmtLb.Next( pEntry );
1350             }
1351 
1352             if( nPos < nCount || pEntry )
1353             {
1354                 // Box mit den Vorlagen fuellen
1355                 aFmtLb.SetUpdateMode(sal_False);
1356                 aFmtLb.Clear();
1357 
1358                 nPos = 0;
1359                 while( nPos < nCount )
1360                     aFmtLb.InsertEntry( *aStrings.GetObject( nPos++ ));
1361                 aFmtLb.SetUpdateMode(sal_True);
1362             }
1363                 // aktuelle Vorlage anzeigen
1364             SfxTemplateItem *pState = pFamilyState[nActFamily-1];
1365             String aStyle;
1366             if(pState)  //Aktuellen Eintrag selektieren
1367                 aStyle = pState->GetStyleName();
1368             SelectStyle(aStyle);
1369             EnableDelete();
1370         }
1371     }
1372 }
1373 
1374 //-------------------------------------------------------------------------
1375 
1376 // Aktualisierung Anzeige: Gie\skanne an/aus
1377 void SfxCommonTemplateDialog_Impl::SetWaterCanState(const SfxBoolItem *pItem)
1378 {
1379 //  EnableItem(SID_STYLE_WATERCAN, pItem != 0);
1380     bWaterDisabled =  pItem == 0;
1381 //added by BerryJia for fixing Bug76391 2003-1-7
1382     if(!bWaterDisabled)
1383         bWaterDisabled = !HasSelectedStyle();
1384 
1385     if(pItem && !bWaterDisabled)
1386     {
1387         CheckItem(SID_STYLE_WATERCAN, pItem->GetValue());
1388         EnableItem( SID_STYLE_WATERCAN, sal_True );
1389     }
1390     else
1391         if(!bWaterDisabled)
1392             EnableItem(SID_STYLE_WATERCAN, sal_True);
1393         else
1394             EnableItem(SID_STYLE_WATERCAN, sal_False);
1395 
1396 //Waehrend Giesskannenmodus Statusupdates ignorieren.
1397 
1398     sal_uInt16 nCount=pStyleFamilies->Count();
1399     pBindings->EnterRegistrations();
1400     for(sal_uInt16 n=0; n<nCount; n++)
1401     {
1402         SfxControllerItem *pCItem=pBoundItems[n];
1403         sal_Bool bChecked = pItem && pItem->GetValue();
1404         if( pCItem->IsBound() == bChecked )
1405         {
1406             if( !bChecked )
1407                 pCItem->ReBind();
1408             else
1409                 pCItem->UnBind();
1410         }
1411     }
1412     pBindings->LeaveRegistrations();
1413 }
1414 
1415 //-------------------------------------------------------------------------
1416 
1417 // Item mit dem Status einer Family wird kopiert und gemerkt
1418 // (Aktualisierung erfolgt, wenn alle Stati aktualisiert worden sind.
1419 // Siehe auch: <SfxBindings::AddDoneHdl(const Link &)>
1420 
1421 void SfxCommonTemplateDialog_Impl::SetFamilyState( sal_uInt16 nSlotId, const SfxTemplateItem* pItem )
1422 {
1423     sal_uInt16 nIdx = nSlotId - SID_STYLE_FAMILY_START;
1424     DELETEZ(pFamilyState[nIdx]);
1425     if ( pItem )
1426         pFamilyState[nIdx] = new SfxTemplateItem(*pItem);
1427     bUpdate = sal_True;
1428 
1429     // Wenn verwendete Vorlagen ( wie zum Teufel findet man das heraus ?? )
1430     bUpdateFamily = sal_True;
1431 }
1432 
1433 //-------------------------------------------------------------------------
1434 
1435 // Benachrichtigung durch SfxBindings, da"s die Aktualisierung
1436 // beendet ist. St"o\st die Aktualisierung der Anzeige an.
1437 
1438 void SfxCommonTemplateDialog_Impl::Update_Impl()
1439 {
1440     sal_Bool bDocChanged=sal_False;
1441     SfxStyleSheetBasePool* pNewPool = NULL;
1442     SfxViewFrame* pViewFrame = pBindings->GetDispatcher_Impl()->GetFrame();
1443     SfxObjectShell* pDocShell = pViewFrame->GetObjectShell();
1444     if( pDocShell )
1445         pNewPool = pDocShell->GetStyleSheetPool();
1446 
1447     if ( pNewPool != pStyleSheetPool && pDocShell )
1448     {
1449         SfxModule* pNewModule = pDocShell->GetModule();
1450         if( pNewModule && pNewModule != pModule )
1451         {
1452             ClearResource();
1453             ReadResource();
1454         }
1455         if ( pStyleSheetPool )
1456         {
1457             EndListening(*pStyleSheetPool);
1458             pStyleSheetPool = 0;
1459         }
1460 
1461         if ( pNewPool )
1462         {
1463             StartListening(*pNewPool);
1464             pStyleSheetPool = pNewPool;
1465             bDocChanged=sal_True;
1466         }
1467 //      InvalidateBindings();
1468     }
1469 
1470     if (bUpdateFamily)
1471         UpdateFamily_Impl();
1472 
1473     sal_uInt16 i;
1474     for(i = 0; i < MAX_FAMILIES; ++i)
1475         if(pFamilyState[i])
1476             break;
1477     if(i == MAX_FAMILIES || !pNewPool)
1478         // nichts erlaubt
1479         return;
1480 
1481      SfxTemplateItem *pItem = 0;
1482      // aktueller Bereich nicht innerhalb der erlaubten Bereiche
1483      // oder Default
1484      if(nActFamily == SFX_TEMPLDLG_FILTER_MAX || 0 == (pItem = pFamilyState[nActFamily-1] ) )
1485      {
1486          CheckItem(nActFamily, sal_False);
1487          SfxTemplateItem **ppItem = pFamilyState;
1488          const sal_uInt16 nFamilyCount = pStyleFamilies->Count();
1489          sal_uInt16 n;
1490          for(n=0;n<nFamilyCount;n++)
1491              if(ppItem[StyleNrToInfoOffset(n)])break;
1492          ppItem+=StyleNrToInfoOffset(n);
1493 
1494          nAppFilter = (*ppItem)->GetValue();
1495          FamilySelect(  StyleNrToInfoOffset(n)+1 );
1496 
1497          pItem = *ppItem;
1498      }
1499      else if( bDocChanged )
1500      {
1501          // andere DocShell -> alles neu
1502          CheckItem( nActFamily, sal_True );
1503          nActFilter = static_cast< sal_uInt16 >( LoadFactoryStyleFilter( pDocShell ) );
1504          if ( SFX_TEMPLDLG_FILTER_MAX == nActFilter )
1505             nActFilter = pDocShell->GetAutoStyleFilterIndex();
1506 
1507          nAppFilter = pItem->GetValue();
1508          if(!pTreeBox)
1509          {
1510              UpdateStyles_Impl(UPDATE_FAMILY_LIST);
1511          }
1512          else
1513              FillTreeBox();
1514      }
1515      else
1516      {
1517          // anderer Filter fuer automatisch
1518          CheckItem( nActFamily, sal_True );
1519          const SfxStyleFamilyItem *pStyleItem =  GetFamilyItem_Impl();
1520          if(0 == pStyleItem->GetFilterList().GetObject(nActFilter)->nFlags
1521             && nAppFilter != pItem->GetValue())
1522          {
1523              nAppFilter = pItem->GetValue();
1524              if(!pTreeBox)
1525                  UpdateStyles_Impl(UPDATE_FAMILY_LIST);
1526              else
1527                  FillTreeBox();
1528          }
1529          else
1530              nAppFilter = pItem->GetValue();
1531      }
1532      const String aStyle(pItem->GetStyleName());
1533      SelectStyle(aStyle);
1534      EnableDelete();
1535      EnableNew( bCanNew );
1536 }
1537 
1538 //-------------------------------------------------------------------------
1539 
1540 IMPL_LINK( SfxCommonTemplateDialog_Impl, TimeOut, Timer *, pTim )
1541 {
1542     (void)pTim; // unused
1543     if(!bDontUpdate)
1544     {
1545         bDontUpdate=sal_True;
1546         if(!pTreeBox)
1547             UpdateStyles_Impl(UPDATE_FAMILY_LIST);
1548         else
1549         {
1550             FillTreeBox();
1551             SfxTemplateItem *pState = pFamilyState[nActFamily-1];
1552             if(pState)
1553             {
1554                 const String aStyle(pState->GetStyleName());
1555                 SelectStyle(aStyle);
1556                 EnableDelete();
1557             }
1558         }
1559         bDontUpdate=sal_False;
1560         DELETEZ(pTimer);
1561     }
1562     else
1563         pTimer->Start();
1564     return 0;
1565 }
1566 
1567 
1568 //-------------------------------------------------------------------------
1569 void SfxCommonTemplateDialog_Impl::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& rHint)
1570 {
1571     // Aktualisierung anstossen
1572     if(rHint.Type() == TYPE(SfxSimpleHint))
1573     {
1574         switch(((SfxSimpleHint&) rHint ).GetId())
1575         {
1576           case SFX_HINT_UPDATEDONE:
1577             {
1578                 SfxViewFrame *pViewFrame = pBindings->GetDispatcher_Impl()->GetFrame();
1579                 SfxObjectShell *pDocShell = pViewFrame->GetObjectShell();
1580                 if (
1581                     bUpdate &&
1582                     (
1583                      !IsCheckedItem(SID_STYLE_WATERCAN) ||
1584                      (pDocShell && pDocShell->GetStyleSheetPool() != pStyleSheetPool)
1585                     )
1586                    )
1587                 {
1588                     bUpdate = sal_False;
1589                     Update_Impl();
1590                 }
1591                 else if ( bUpdateFamily )
1592                 {
1593                     UpdateFamily_Impl();
1594                 }
1595 
1596                 if( pStyleSheetPool )
1597                 {
1598                     String aStr = GetSelectedEntry();
1599                     if( aStr.Len() && pStyleSheetPool )
1600                     {
1601                         const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
1602                         if( !pItem ) break;
1603                         const SfxStyleFamily eFam = pItem->GetFamily();
1604                         SfxStyleSheetBase *pStyle =
1605                             pStyleSheetPool->Find(
1606                                 aStr, eFam, SFXSTYLEBIT_ALL );
1607                         if( pStyle )
1608                             EnableEdit(
1609                                 !(pStyle->GetMask() & SFXSTYLEBIT_READONLY) );
1610                         else
1611                             EnableEdit(sal_False);
1612                     }
1613                 }
1614                 break;
1615             }
1616         // noetig, wenn zwichen Dokumenten umgeschaltet wird,
1617         // aber in beiden Dokumenten die gleiche Vorlage gilt.
1618         // Nicht sofort Update_Impl rufen, fuer den Fall da\s eines
1619         // der Dokumente ein internes InPlaceObjekt ist!
1620           case SFX_HINT_DOCCHANGED:
1621             bUpdate = sal_True;
1622             break;
1623           case SFX_HINT_DYING:
1624           {
1625             EndListening(*pStyleSheetPool);
1626             pStyleSheetPool=0;
1627             break;
1628           }
1629         }
1630     }
1631 
1632     // Timer nicht aufsetzen, wenn der StyleSheetPool in die Kiste geht, denn
1633     // es kann sein, da\s sich ein neuer erst anmeldet, nachdem der Timer
1634     // abgelaufen ist - macht sich schlecht in UpdateStyles_Impl() !
1635 
1636     sal_uIntPtr nId = rHint.ISA(SfxSimpleHint) ? ( (SfxSimpleHint&)rHint ).GetId() : 0;
1637 
1638     if(!bDontUpdate && nId != SFX_HINT_DYING &&
1639        (rHint.Type() == TYPE(SfxStyleSheetPoolHint)||
1640        rHint.Type() == TYPE(SfxStyleSheetHint) ||
1641        rHint.Type() == TYPE( SfxStyleSheetHintExtended )))
1642     {
1643         if(!pTimer)
1644         {
1645             pTimer=new Timer;
1646             pTimer->SetTimeout(500);
1647             pTimer->SetTimeoutHdl(LINK(this,SfxCommonTemplateDialog_Impl,TimeOut));
1648         }
1649         pTimer->Start();
1650 
1651     }
1652 }
1653 
1654 
1655 //-------------------------------------------------------------------------
1656 
1657 // Anderer Filter; kann durch den Benutzer umgeschaltet werden
1658 // oder als Folge von Neu oder Bearbeiten, wenn die aktuelle
1659 // Vorlage einem anderen Filter zugewiesen wurde.
1660 void SfxCommonTemplateDialog_Impl::FilterSelect(
1661                 sal_uInt16 nEntry,                  // Idx des neuen Filters
1662                 sal_Bool bForce )                   // Aktualisierung erzwingen, auch wenn der neue Filter gleich dem aktuellen ist
1663 {
1664     if( nEntry != nActFilter || bForce )
1665     {
1666         nActFilter = nEntry;
1667         SfxViewFrame *pViewFrame = pBindings->GetDispatcher_Impl()->GetFrame();
1668         SfxObjectShell *pDocShell = pViewFrame->GetObjectShell();
1669         if (pDocShell)
1670         {
1671             pDocShell->SetAutoStyleFilterIndex(nActFilter);
1672             SaveFactoryStyleFilter( pDocShell, nActFilter );
1673         }
1674 
1675         SfxStyleSheetBasePool *pOldStyleSheetPool = pStyleSheetPool;
1676         pStyleSheetPool = pDocShell? pDocShell->GetStyleSheetPool(): 0;
1677         if ( pOldStyleSheetPool != pStyleSheetPool )
1678         {
1679             if ( pOldStyleSheetPool )
1680                 EndListening(*pOldStyleSheetPool);
1681             if ( pStyleSheetPool )
1682                 StartListening(*pOldStyleSheetPool);
1683         }
1684 
1685         UpdateStyles_Impl(UPDATE_FAMILY_LIST);
1686     }
1687 }
1688 
1689 //-------------------------------------------------------------------------
1690 
1691 // Intern: Ausf"uhren von Funktionen "uber den Dispatcher
1692 sal_Bool SfxCommonTemplateDialog_Impl::Execute_Impl(
1693     sal_uInt16 nId, const String &rStr, const String& rRefStr, sal_uInt16 nFamily,
1694     sal_uInt16 nMask, sal_uInt16 *pIdx, const sal_uInt16* pModifier)
1695 {
1696     SfxDispatcher &rDispatcher = *SFX_APP()->GetDispatcher_Impl();
1697     SfxStringItem aItem(nId, rStr);
1698     SfxUInt16Item aFamily(SID_STYLE_FAMILY, nFamily);
1699     SfxUInt16Item aMask( SID_STYLE_MASK, nMask );
1700     SfxStringItem aUpdName(SID_STYLE_UPD_BY_EX_NAME, rStr);
1701     SfxStringItem aRefName( SID_STYLE_REFERENCE, rRefStr );
1702     const SfxPoolItem* pItems[ 6 ];
1703     sal_uInt16 nCount = 0;
1704     if( rStr.Len() )
1705         pItems[ nCount++ ] = &aItem;
1706     pItems[ nCount++ ] = &aFamily;
1707     if( nMask )
1708         pItems[ nCount++ ] = &aMask;
1709     if(SID_STYLE_UPDATE_BY_EXAMPLE == nId)
1710     {
1711         //Sonderloesung fuer Numerierungsupdate im Writer
1712         const String aTemplName(GetSelectedEntry());
1713         aUpdName.SetValue(aTemplName);
1714         pItems[ nCount++ ] = &aUpdName;
1715     }
1716     if ( rRefStr.Len() )
1717         pItems[ nCount++ ] = &aRefName;
1718 
1719     pItems[ nCount++ ] = 0;
1720 
1721     Deleted aDeleted;
1722     pbDeleted = &aDeleted;
1723     sal_uInt16 nModi = pModifier ? *pModifier : 0;
1724     const SfxPoolItem* pItem = rDispatcher.Execute(
1725         nId, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD | SFX_CALLMODE_MODAL,
1726         pItems, nModi );
1727 
1728     // FIXME: Dialog can be destroyed while in Execute() check stack variable for dtor flag!
1729     if ( !pItem || aDeleted() )
1730         return sal_False;
1731 
1732     if ( nId == SID_STYLE_NEW || SID_STYLE_EDIT == nId )
1733     {
1734         SfxUInt16Item *pFilterItem = PTR_CAST(SfxUInt16Item, pItem);
1735         DBG_ASSERT(pFilterItem, "SfxUINT16Item erwartet");
1736         sal_uInt16 nFilterFlags = pFilterItem->GetValue() & ~SFXSTYLEBIT_USERDEF;
1737         if(!nFilterFlags)       // Benutzervorlage?
1738             nFilterFlags = pFilterItem->GetValue();
1739         const SfxStyleFamilyItem *pFamilyItem = GetFamilyItem_Impl();
1740         const sal_uInt16 nFilterCount = (sal_uInt16) pFamilyItem->GetFilterList().Count();
1741 
1742         for ( sal_uInt16 i = 0; i < nFilterCount; ++i )
1743         {
1744             const SfxFilterTupel *pTupel =
1745                 pFamilyItem->GetFilterList().GetObject(i);
1746 
1747             if ( ( pTupel->nFlags & nFilterFlags ) == nFilterFlags && pIdx )
1748                 *pIdx = i;
1749         }
1750     }
1751 
1752     // Reset destroyed flag otherwise we use the pointer in the dtor
1753     // where the local stack object is already destroyed. This would
1754     // overwrite objects on the stack!! See #i100110
1755     pbDeleted = NULL;
1756     return sal_True;
1757 }
1758 
1759 //-------------------------------------------------------------------------
1760 
1761 // Handler der Listbox der Filter
1762 IMPL_LINK( SfxCommonTemplateDialog_Impl, FilterSelectHdl, ListBox *, pBox )
1763 {
1764     if ( pBox->GetSelectEntry() ==  String(SfxResId(STR_STYLE_FILTER_HIERARCHICAL)) )
1765     {
1766         if ( !bHierarchical )
1767         {
1768             // TreeView einschalten
1769             bHierarchical=sal_True;
1770             const String aSelectEntry( GetSelectedEntry());
1771             aFmtLb.Hide();
1772             // aFilterLb.Disable();
1773 
1774             pTreeBox = new StyleTreeListBox_Impl(
1775                     this, WB_HASBUTTONS | WB_HASLINES |
1776                     WB_BORDER | WB_TABSTOP | WB_HASLINESATROOT |
1777                     WB_HASBUTTONSATROOT | WB_HIDESELECTION | WB_QUICK_SEARCH );
1778             pTreeBox->SetFont( aFmtLb.GetFont() );
1779 
1780             pTreeBox->SetPosSizePixel(aFmtLb.GetPosPixel(), aFmtLb.GetSizePixel());
1781             pTreeBox->SetNodeDefaultImages();
1782             pTreeBox->SetSelectHdl(
1783                 LINK(this, SfxCommonTemplateDialog_Impl, FmtSelectHdl));
1784             ((StyleTreeListBox_Impl*)pTreeBox)->
1785                 SetDoubleClickHdl(
1786                     LINK(this, SfxCommonTemplateDialog_Impl,  ApplyHdl));
1787             ((StyleTreeListBox_Impl*)pTreeBox)->
1788                 SetDropHdl(LINK(this, SfxCommonTemplateDialog_Impl,  DropHdl));
1789             pTreeBox->SetIndent(10);
1790 
1791             FillTreeBox();
1792             SelectStyle(aSelectEntry);
1793             pTreeBox->SetAccessibleName(SfxResId(STR_STYLE_ELEMTLIST));
1794             pTreeBox->Show();
1795 
1796             // Save the filter state
1797             SfxViewFrame *pViewFrame = pBindings->GetDispatcher_Impl()->GetFrame();
1798             SfxObjectShell *pDocShell = pViewFrame->GetObjectShell();
1799             if (pDocShell)
1800             {
1801                 // only in the configuration
1802                 // SetAutoStyleFilterIndex would update nActFilter
1803                 // which should only contain a valid listbox entry
1804                 SaveFactoryStyleFilter( pDocShell, SFX_TEMPLDLG_FILTER_HIERARCHICAL );
1805             }
1806         }
1807     }
1808 
1809     else
1810     {
1811         DELETEZ(pTreeBox);
1812         aFmtLb.Show();
1813         //                              aFilterLb.Enable();
1814         // Falls bHierarchical, kann sich die Familie geaendert haben
1815         // minus one since hierarchical is inserted at the start
1816         FilterSelect(pBox->GetSelectEntryPos() - 1, bHierarchical );
1817         bHierarchical=sal_False;
1818 //      UpdateStyles_Impl(UPDATE_FAMILY_LIST);  // Anzeige aktualisieren
1819     }
1820 
1821     return 0;
1822 }
1823 
1824 //-------------------------------------------------------------------------
1825 
1826 // Select-Handler der Toolbox
1827 void SfxCommonTemplateDialog_Impl::FamilySelect(sal_uInt16 nEntry)
1828 {
1829     if( nEntry != nActFamily )
1830     {
1831         CheckItem( nActFamily, sal_False );
1832         nActFamily = nEntry;
1833         SfxDispatcher* pDispat = pBindings->GetDispatcher_Impl();
1834         SfxUInt16Item aItem( SID_STYLE_FAMILY, nEntry );
1835         pDispat->Execute( SID_STYLE_FAMILY, SFX_CALLMODE_SYNCHRON, &aItem, 0L );
1836         pBindings->Invalidate( SID_STYLE_FAMILY );
1837         pBindings->Update( SID_STYLE_FAMILY );
1838         UpdateFamily_Impl();
1839     }
1840 }
1841 
1842 //-------------------------------------------------------------------------
1843 
1844 void SfxCommonTemplateDialog_Impl::ActionSelect(sal_uInt16 nEntry)
1845 {
1846     String aEmpty;
1847     switch(nEntry)
1848     {
1849         case SID_STYLE_WATERCAN:
1850         {
1851             const sal_Bool bState = IsCheckedItem(nEntry);
1852             sal_Bool bCheck;
1853             SfxBoolItem aBool;
1854             // wenn eine Vorlage ausgewaehlt ist.
1855             if(!bState && aFmtLb.GetSelectionCount())
1856             {
1857                 const String aTemplName(
1858                     GetSelectedEntry());
1859                 Execute_Impl(
1860                     SID_STYLE_WATERCAN, aTemplName, aEmpty,
1861                     (sal_uInt16)GetFamilyItem_Impl()->GetFamily() );
1862                 bCheck = sal_True;
1863             }
1864             else
1865             {
1866                 Execute_Impl(SID_STYLE_WATERCAN, aEmpty, aEmpty, 0);
1867                 bCheck = sal_False;
1868             }
1869             CheckItem(nEntry, bCheck);
1870             aBool.SetValue(bCheck);
1871             SetWaterCanState(&aBool);
1872             break;
1873         }
1874         case SID_STYLE_NEW_BY_EXAMPLE:
1875         {
1876             if(pStyleSheetPool && nActFamily != SFX_TEMPLDLG_FILTER_MAX)
1877             {
1878                 const SfxStyleFamily eFam=GetFamilyItem_Impl()->GetFamily();
1879 //pStyleSheetPool->GetSearchFamily();
1880                 const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
1881                 sal_uInt16 nFilter;
1882                 if(pItem&&nActFilter!=SFX_TEMPLDLG_FILTER_MAX)
1883                 {
1884                     nFilter = pItem->GetFilterList().GetObject(
1885                         nActFilter)->nFlags;
1886                     if(!nFilter)    // automatisch
1887                         nFilter = nAppFilter;
1888                 }
1889                 else
1890                     nFilter=pStyleSheetPool->GetSearchMask();
1891                 pStyleSheetPool->SetSearchMask( eFam, SFXSTYLEBIT_USERDEF );
1892 
1893                 SfxNewStyleDlg *pDlg =
1894                     // why? : FloatingWindow must not be parent of a modal dialog
1895                     new SfxNewStyleDlg(pWindow, *pStyleSheetPool);
1896                 if(RET_OK == pDlg->Execute())
1897                 {
1898                     pStyleSheetPool->SetSearchMask(eFam, nFilter);
1899                     const String aTemplName(pDlg->GetName());
1900                     Execute_Impl(SID_STYLE_NEW_BY_EXAMPLE,
1901                                  aTemplName, aEmpty,
1902                                  (sal_uInt16)GetFamilyItem_Impl()->GetFamily(),
1903                                  nFilter);
1904                 }
1905                 pStyleSheetPool->SetSearchMask( eFam, nFilter );
1906                 delete pDlg;
1907             }
1908             break;
1909         }
1910         case SID_STYLE_UPDATE_BY_EXAMPLE:
1911         {
1912             Execute_Impl(SID_STYLE_UPDATE_BY_EXAMPLE,
1913                     aEmpty, aEmpty,
1914                     (sal_uInt16)GetFamilyItem_Impl()->GetFamily());
1915             break;
1916         }
1917         case SID_TEMPLATE_LOAD:
1918             SFX_APP()->GetDispatcher_Impl()->Execute(nEntry);
1919         break;
1920         default: DBG_ERROR("not implemented"); break;
1921     }
1922 }
1923 
1924 //-------------------------------------------------------------------------
1925 
1926 static rtl::OUString getModuleIdentifier( const Reference< XModuleManager >& i_xModMgr, SfxObjectShell* i_pObjSh )
1927 {
1928     DBG_ASSERT( i_xModMgr.is(), "getModuleIdentifier(): no XModuleManager" );
1929     DBG_ASSERT( i_pObjSh, "getModuleIdentifier(): no ObjectShell" );
1930 
1931     ::rtl::OUString sIdentifier;
1932 
1933     try
1934     {
1935         sIdentifier = i_xModMgr->identify( i_pObjSh->GetModel() );
1936     }
1937     catch ( ::com::sun::star::frame::UnknownModuleException& )
1938     {
1939         DBG_WARNING( "getModuleIdentifier(): unknown module" );
1940     }
1941     catch ( Exception& )
1942     {
1943         DBG_ERRORFILE( "getModuleIdentifier(): exception of XModuleManager::identify()" );
1944     }
1945 
1946     return sIdentifier;
1947 }
1948 
1949 //-------------------------------------------------------------------------
1950 
1951 sal_Int32 SfxCommonTemplateDialog_Impl::LoadFactoryStyleFilter( SfxObjectShell* i_pObjSh )
1952 {
1953     DBG_ASSERT( i_pObjSh, "SfxCommonTemplateDialog_Impl::LoadFactoryStyleFilter(): no ObjectShell" );
1954     sal_Int32 nFilter = -1;
1955 
1956     Sequence< PropertyValue > lProps;
1957     Reference< ::com::sun::star::container::XNameAccess > xContainer( xModuleManager, UNO_QUERY );
1958     if ( xContainer.is() )
1959     {
1960         ::comphelper::SequenceAsHashMap aFactoryProps(
1961             xContainer->getByName( getModuleIdentifier( xModuleManager, i_pObjSh ) ) );
1962         sal_Int32 nDefault = -1;
1963         nFilter = aFactoryProps.getUnpackedValueOrDefault( DEFINE_CONST_UNICODE("ooSetupFactoryStyleFilter"), nDefault );
1964     }
1965 
1966     return nFilter;
1967 }
1968 
1969 //-------------------------------------------------------------------------
1970 
1971 void SfxCommonTemplateDialog_Impl::SaveFactoryStyleFilter( SfxObjectShell* i_pObjSh, sal_Int32 i_nFilter )
1972 {
1973     DBG_ASSERT( i_pObjSh, "SfxCommonTemplateDialog_Impl::SaveFactoryStyleFilter(): no ObjectShell" );
1974     Reference< ::com::sun::star::container::XNameReplace > xContainer( xModuleManager, UNO_QUERY );
1975     if ( xContainer.is() )
1976     {
1977         Sequence< PropertyValue > lProps(1);
1978         lProps[0].Name = DEFINE_CONST_UNICODE("ooSetupFactoryStyleFilter");
1979         lProps[0].Value = makeAny( i_nFilter );;
1980         xContainer->replaceByName( getModuleIdentifier( xModuleManager, i_pObjSh ), makeAny( lProps ) );
1981     }
1982 }
1983 
1984 //-------------------------------------------------------------------------
1985 
1986 IMPL_LINK( SfxCommonTemplateDialog_Impl, DropHdl, StyleTreeListBox_Impl *, pBox )
1987 {
1988     bDontUpdate=sal_True;
1989     const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
1990     const SfxStyleFamily eFam = pItem->GetFamily();
1991     long ret= pStyleSheetPool->SetParent(eFam,pBox->GetStyle(), pBox->GetParent())? 1L: 0L;
1992     bDontUpdate=sal_False;
1993     return ret;
1994 }
1995 
1996 //-------------------------------------------------------------------------
1997 
1998 // Handler des Neu-Buttons
1999 void SfxCommonTemplateDialog_Impl::NewHdl(void *)
2000 {
2001     String aEmpty;
2002     if ( nActFamily != SFX_TEMPLDLG_FILTER_MAX )
2003     {
2004         Window* pTmp;
2005         pTmp = Application::GetDefDialogParent();
2006         if ( ISA(SfxTemplateDialog_Impl) )
2007             Application::SetDefDialogParent( pWindow->GetParent() );
2008         else
2009             Application::SetDefDialogParent( pWindow );
2010 
2011         const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
2012         const SfxStyleFamily eFam=pItem->GetFamily();
2013         sal_uInt16 nMask;
2014         if(pItem&&nActFilter!=SFX_TEMPLDLG_FILTER_MAX)
2015         {
2016             nMask = pItem->GetFilterList().GetObject(
2017                 nActFilter)->nFlags;
2018             if(!nMask)    // automatisch
2019                 nMask = nAppFilter;
2020         }
2021         else
2022             nMask=pStyleSheetPool->GetSearchMask();
2023 
2024         pStyleSheetPool->SetSearchMask(eFam,nMask);
2025 
2026         Execute_Impl(SID_STYLE_NEW,
2027                      aEmpty, GetSelectedEntry(),
2028                      ( sal_uInt16 )GetFamilyItem_Impl()->GetFamily(),
2029                      nMask);
2030 
2031         Application::SetDefDialogParent( pTmp );
2032 
2033 /*              {
2034             DBG_ASSERT(nFilter < aFilterLb.GetEntryCount(),
2035                        "Filter ueberindiziert");
2036 
2037             if(!pTreeBox)
2038             {
2039 //                              aFilterLb.SelectEntryPos(nFilter);
2040                 FilterSelect(nActFilter, sal_True);
2041             }
2042             else
2043             {
2044                 FillTreeBox();
2045                 SfxTemplateItem *pState = pFamilyState[nActFamily-1];
2046                 if(pState)
2047                 {
2048                     const String aStyle(pState->GetStyleName());
2049                     SelectStyle(aStyle);
2050                 }
2051                 EnableDelete();
2052             }*/
2053 //              }
2054     }
2055 }
2056 
2057 //-------------------------------------------------------------------------
2058 
2059 // Handler des Bearbeiten-Buttons
2060 void SfxCommonTemplateDialog_Impl::EditHdl(void *)
2061 {
2062     if(IsInitialized() && HasSelectedStyle())
2063     {
2064         sal_uInt16 nFilter = nActFilter;
2065         String aTemplName(GetSelectedEntry());
2066         const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
2067         const SfxStyleFamily eFam = pItem->GetFamily();
2068         pStyleSheetPool->Find(aTemplName,eFam,SFXSTYLEBIT_ALL);  // -Wall required??
2069         Window* pTmp;
2070         //DefModalDialogParent setzen fuer
2071         //Modalitaet der nachfolgenden Dialoge
2072         pTmp = Application::GetDefDialogParent();
2073         if ( ISA(SfxTemplateDialog_Impl) )
2074             Application::SetDefDialogParent( pWindow->GetParent() );
2075         else
2076             Application::SetDefDialogParent( pWindow );
2077         if ( Execute_Impl( SID_STYLE_EDIT, aTemplName, String(),
2078                           (sal_uInt16)GetFamilyItem_Impl()->GetFamily(), 0, &nFilter ) )
2079         {
2080 //          DBG_ASSERT(nFilter < aFilterLb.GetEntryCount(), "Filter ueberindiziert");
2081 //          aTemplName = pStyle->GetName();
2082 // kann durch Bearbeiten umbenannt worden sein
2083 /*                      if(!pTreeBox)
2084             {
2085                 //                              aFilterLb.SelectEntryPos(nFilter);
2086                 //                              FilterSelect(nFilter, sal_True);
2087             }
2088             else
2089                 FillTreeBox();*/
2090         }
2091         Application::SetDefDialogParent( pTmp );
2092     }
2093 }
2094 
2095 //-------------------------------------------------------------------------
2096 
2097 // Handler des L"oschen-Buttons
2098 void SfxCommonTemplateDialog_Impl::DeleteHdl(void *)
2099 {
2100     if ( IsInitialized() && HasSelectedStyle() )
2101     {
2102         const String aTemplName( GetSelectedEntry() );
2103         const SfxStyleFamilyItem* pItem = GetFamilyItem_Impl();
2104         SfxStyleSheetBase* pStyle =
2105             pStyleSheetPool->Find( aTemplName, pItem->GetFamily(), SFXSTYLEBIT_ALL );
2106         if ( pStyle )
2107         {
2108             String aMsg;
2109             if ( pStyle->IsUsed() )
2110                 aMsg = String( SfxResId( STR_DELETE_STYLE_USED ) );
2111             aMsg += String ( SfxResId( STR_DELETE_STYLE ) );
2112             aMsg.SearchAndReplaceAscii( "$1", aTemplName );
2113 #if defined UNX
2114             QueryBox aBox( SFX_APP()->GetTopWindow(), WB_YES_NO | WB_DEF_NO, aMsg );
2115 #else
2116             QueryBox aBox( GetWindow(), WB_YES_NO | WB_DEF_NO , aMsg );
2117 #endif
2118             if ( RET_YES == aBox.Execute() )
2119             {
2120                 PrepareDeleteAction();
2121 
2122                 if ( pTreeBox ) // Damit die Treelistbox beim L"oschen nicht zuklappt
2123                 {
2124                     bDontUpdate = sal_True;
2125                 }
2126                 Execute_Impl( SID_STYLE_DELETE, aTemplName,
2127                             String(), (sal_uInt16)GetFamilyItem_Impl()->GetFamily() );
2128 
2129                 if ( pTreeBox )
2130                 {
2131                     pTreeBox->RemoveParentKeepChilds( pTreeBox->FirstSelected() );
2132                     bDontUpdate = sal_False;
2133                 }
2134             }
2135         }
2136     }
2137 }
2138 
2139 //-------------------------------------------------------------------------
2140 
2141 void    SfxCommonTemplateDialog_Impl::EnableDelete()
2142 {
2143     if(IsInitialized() && HasSelectedStyle())
2144     {
2145         DBG_ASSERT(pStyleSheetPool, "Kein StyleSheetPool");
2146         const String aTemplName(GetSelectedEntry());
2147         const SfxStyleFamilyItem *pItem = GetFamilyItem_Impl();
2148         const SfxStyleFamily eFam = pItem->GetFamily();
2149         sal_uInt16 nFilter = 0;
2150         if(pItem->GetFilterList().Count() > nActFilter)
2151             nFilter = pItem->GetFilterList().GetObject(nActFilter)->nFlags;
2152         if(!nFilter)    // automatisch
2153             nFilter = nAppFilter;
2154         const SfxStyleSheetBase *pStyle =
2155             pStyleSheetPool->Find(aTemplName,eFam,
2156                                   pTreeBox? SFXSTYLEBIT_ALL: nFilter);
2157         DBG_ASSERT(pStyle, "Style nicht gefunden");
2158         if(pStyle && pStyle->IsUserDefined())
2159         {
2160             EnableDel(sal_True);
2161         }
2162         else
2163         {
2164             EnableDel(sal_False);
2165         }
2166     }
2167     else
2168     {
2169         EnableDel(sal_False);
2170     }
2171 //  rBindings.Invalidate( SID_STYLE_DELETE );
2172 //  rBindings.Update( SID_STYLE_DELETE );
2173 }
2174 
2175 //-------------------------------------------------------------------------
2176 
2177 // nach Selektion eines Eintrags den Focus gfs. wieder auf das App-Fenster
2178 // setzen
2179 void    SfxCommonTemplateDialog_Impl::ResetFocus()
2180 {
2181     if(ISA(SfxTemplateDialog_Impl))
2182     {
2183         SfxViewFrame *pViewFrame = pBindings->GetDispatcher_Impl()->GetFrame();
2184         SfxViewShell *pVu = pViewFrame->GetViewShell();
2185         Window *pAppWin = pVu ? pVu->GetWindow(): 0;
2186         if(pAppWin)
2187             pAppWin->GrabFocus();
2188     }
2189 }
2190 
2191 //-------------------------------------------------------------------------
2192 
2193 // Doppelclick auf ein StyleSheet in der ListBox, wird angewendet.
2194 IMPL_LINK( SfxCommonTemplateDialog_Impl, ApplyHdl, Control *, pControl )
2195 {
2196     (void)pControl; //unused
2197     // nur, wenn dieser Bereich erlaubt ist
2198     if ( IsInitialized() && 0 != pFamilyState[nActFamily-1] &&
2199          GetSelectedEntry().Len() )
2200     {
2201         sal_uInt16 nModifier = aFmtLb.GetModifier();
2202         Execute_Impl(SID_STYLE_APPLY,
2203                      GetSelectedEntry(), String(),
2204                      ( sal_uInt16 )GetFamilyItem_Impl()->GetFamily(),
2205                      0, 0, &nModifier );
2206         if(ISA(SfxTemplateCatalog_Impl))
2207             ((SfxTemplateCatalog_Impl*) this)->pReal->EndDialog(RET_OK);
2208     }
2209     ResetFocus();
2210     return 0;
2211 }
2212 
2213 //-------------------------------------------------------------------------
2214 
2215 // Selektion einer Vorlage w"ahrend des Watercan-Status
2216 IMPL_LINK( SfxCommonTemplateDialog_Impl, FmtSelectHdl, SvTreeListBox *, pListBox )
2217 {
2218     // HilfePI antriggern, wenn von Call als Handler und Bereich erlaubt ist
2219     if( !pListBox || pListBox->IsSelected( pListBox->GetHdlEntry() ) )
2220     {
2221         // nur, wenn Giesskanne an ist
2222         if ( IsInitialized() &&
2223              IsCheckedItem(SID_STYLE_WATERCAN) &&
2224              // nur, wenn dieser Bereich erlaubt ist
2225              0 != pFamilyState[nActFamily-1] )
2226         {
2227             String aEmpty;
2228             Execute_Impl(SID_STYLE_WATERCAN,
2229                          aEmpty, aEmpty, 0);
2230             Execute_Impl(SID_STYLE_WATERCAN,
2231                          GetSelectedEntry(), aEmpty,
2232                          ( sal_uInt16 )GetFamilyItem_Impl()->GetFamily());
2233         }
2234 //      EnableEdit(sal_True);
2235         EnableItem(SID_STYLE_WATERCAN, !bWaterDisabled);
2236         EnableDelete();
2237     }
2238     if( pListBox )
2239         SelectStyle( pListBox->GetEntryText( pListBox->GetHdlEntry() ));
2240 
2241     return 0;
2242 }
2243 
2244 //-------------------------------------------------------------------------
2245 
2246 IMPL_LINK( SfxCommonTemplateDialog_Impl, MenuSelectHdl, Menu *, pMenu )
2247 {
2248     if( pMenu )
2249     {
2250         nLastItemId = pMenu->GetCurItemId();
2251         Application::PostUserEvent(
2252             LINK( this, SfxCommonTemplateDialog_Impl, MenuSelectHdl ), 0 );
2253         return sal_True;
2254     }
2255 
2256     switch(nLastItemId) {
2257     case ID_NEW: NewHdl(0); break;
2258     case ID_EDIT: EditHdl(0); break;
2259     case ID_DELETE: DeleteHdl(0); break;
2260     default: return sal_False;
2261     }
2262     return sal_True;
2263 }
2264 
2265 // -----------------------------------------------------------------------
2266 
2267 void SfxCommonTemplateDialog_Impl::ExecuteContextMenu_Impl( const Point& rPos, Window* pWin )
2268 {
2269     // Bug# 94152: This part should never be called, because before this happens, the TreeListBox should captured this!
2270     DBG_ASSERT( sal_False, "+SfxCommonTemplateDialog_Impl::ExecuteContextMenu_Impl(): How could this happen? Please infirm developer ASAP!" );
2271 
2272     PopupMenu* pMenu = CreateContextMenu();
2273     pMenu->Execute( pWin, rPos );
2274     delete pMenu;
2275 }
2276 
2277 // -----------------------------------------------------------------------
2278 
2279 SfxStyleFamily SfxCommonTemplateDialog_Impl::GetActualFamily() const
2280 {
2281     const SfxStyleFamilyItem *pFamilyItem = GetFamilyItem_Impl();
2282     if( !pFamilyItem || nActFamily == SFX_TEMPLDLG_FILTER_MAX )
2283         return SFX_STYLE_FAMILY_PARA;
2284     else
2285         return pFamilyItem->GetFamily();
2286 }
2287 
2288 // -----------------------------------------------------------------------
2289 
2290 void SfxCommonTemplateDialog_Impl::EnableExample_Impl(sal_uInt16 nId, sal_Bool bEnable)
2291 {
2292     if( nId == SID_STYLE_NEW_BY_EXAMPLE )
2293         bNewByExampleDisabled = !bEnable;
2294     else if( nId == SID_STYLE_UPDATE_BY_EXAMPLE )
2295         bUpdateByExampleDisabled = !bEnable;
2296     EnableItem(nId, bEnable);
2297 }
2298 
2299 void SfxCommonTemplateDialog_Impl::PrepareDeleteAction()
2300 {
2301 }
2302 
2303 // -----------------------------------------------------------------------
2304 
2305 PopupMenu* SfxCommonTemplateDialog_Impl::CreateContextMenu( void )
2306 {
2307     if ( bBindingUpdate )
2308     {
2309         pBindings->Invalidate( SID_STYLE_NEW, sal_True, sal_False );
2310         pBindings->Update( SID_STYLE_NEW );
2311         bBindingUpdate = sal_False;
2312     }
2313     PopupMenu* pMenu = new PopupMenu( SfxResId( MN_CONTEXT_TEMPLDLG ) );
2314     pMenu->SetSelectHdl( LINK( this, SfxCommonTemplateDialog_Impl, MenuSelectHdl ) );
2315     pMenu->EnableItem( ID_EDIT, bCanEdit );
2316     pMenu->EnableItem( ID_DELETE, bCanDel );
2317     pMenu->EnableItem( ID_NEW, bCanNew );
2318 
2319     return pMenu;
2320 }
2321 
2322 // ------------------------------------------------------------------------
2323 
2324 SfxTemplateDialog_Impl::SfxTemplateDialog_Impl(
2325     Window* /*pParent*/, SfxBindings* pB, SfxTemplateDialog* pDlgWindow ) :
2326 
2327     SfxCommonTemplateDialog_Impl( pB, pDlgWindow ),
2328 
2329     m_pFloat            ( pDlgWindow ),
2330     m_bZoomIn           ( sal_False ),
2331     m_aActionTbL        ( pDlgWindow, this ),
2332     m_aActionTbR        ( pDlgWindow, SfxResId( TB_ACTION ) )
2333 
2334 {
2335     pDlgWindow->FreeResource();
2336 
2337     // Read the filter stored in the configuration
2338     // This is already done in ReadResource(), invoked by Initialize()
2339     // and stored in nActFilter, but we can't rely on nActFilter's value
2340     // because it is changed in UpdateStyles_Impl
2341     SfxViewFrame* pViewFrame = pBindings->GetDispatcher_Impl()->GetFrame();
2342     pCurObjShell = pViewFrame->GetObjectShell();
2343     const sal_uInt16 nConfigFilter = pCurObjShell ?
2344         static_cast< sal_uInt16 >( LoadFactoryStyleFilter( pCurObjShell ) ) : 0;
2345 
2346     Initialize();
2347 
2348     m_aActionTbL.SetSelectHdl(LINK(this, SfxTemplateDialog_Impl, ToolBoxLSelect));
2349     m_aActionTbR.SetSelectHdl(LINK(this, SfxTemplateDialog_Impl, ToolBoxRSelect));
2350     m_aActionTbR.SetDropdownClickHdl(LINK(this, SfxTemplateDialog_Impl, ToolBoxRClick));
2351     m_aActionTbL.Show();
2352     m_aActionTbR.Show();
2353     Font aFont=aFilterLb.GetFont();
2354     aFont.SetWeight( WEIGHT_NORMAL );
2355     aFilterLb.SetFont( aFont );
2356     m_aActionTbL.SetHelpId( HID_TEMPLDLG_TOOLBOX_LEFT );
2357 
2358     if ( nConfigFilter == SFX_TEMPLDLG_FILTER_HIERARCHICAL )
2359     {
2360         bHierarchical = sal_False;
2361         aFilterLb.SelectEntry(String(SfxResId(STR_STYLE_FILTER_HIERARCHICAL)));
2362         FilterSelectHdl(&aFilterLb);
2363     }
2364 }
2365 
2366 // ------------------------------------------------------------------------
2367 
2368 void SfxTemplateDialog_Impl::EnableFamilyItem( sal_uInt16 nId, sal_Bool bEnable )
2369 {
2370     m_aActionTbL.EnableItem( nId, bEnable );
2371 }
2372 
2373 //-------------------------------------------------------------------------
2374 
2375 void SfxTemplateDialog_Impl::InsertFamilyItem(sal_uInt16 nId,const SfxStyleFamilyItem *pItem)
2376 {
2377     rtl::OString sHelpId;
2378     switch( (sal_uInt16) pItem->GetFamily() )
2379     {
2380         case SFX_STYLE_FAMILY_CHAR:     sHelpId = ".uno:CharStyle"; break;
2381         case SFX_STYLE_FAMILY_PARA:     sHelpId = ".uno:ParaStyle"; break;
2382         case SFX_STYLE_FAMILY_FRAME:    sHelpId = ".uno:FrameStyle"; break;
2383         case SFX_STYLE_FAMILY_PAGE:     sHelpId = ".uno:PageStyle"; break;
2384         case SFX_STYLE_FAMILY_PSEUDO:   sHelpId = ".uno:ListStyle"; break;
2385         default: DBG_ERROR("unknown StyleFamily"); break;
2386     }
2387     m_aActionTbL.InsertItem( nId, pItem->GetImage(), pItem->GetText(), 0, 0);
2388     m_aActionTbL.SetHelpId( nId, sHelpId );
2389 }
2390 
2391 // ------------------------------------------------------------------------
2392 
2393 void SfxTemplateDialog_Impl::ReplaceUpdateButtonByMenu()
2394 {
2395     m_aActionTbR.HideItem(SID_STYLE_UPDATE_BY_EXAMPLE);
2396     m_aActionTbR.SetItemBits( SID_STYLE_NEW_BY_EXAMPLE,
2397             TIB_DROPDOWNONLY|m_aActionTbR.GetItemBits( SID_STYLE_NEW_BY_EXAMPLE ));
2398 }
2399 
2400 // ------------------------------------------------------------------------
2401 void SfxTemplateDialog_Impl::updateFamilyImages()
2402 {
2403     if ( !m_pStyleFamiliesId )
2404         // we do not have a resource id to load the new images from
2405         return;
2406 
2407     // let the families collection update the images
2408     sal_Bool bIsHighContrast = m_pFloat->GetSettings().GetStyleSettings().GetHighContrastMode();
2409     pStyleFamilies->updateImages( *m_pStyleFamiliesId, bIsHighContrast ? BMP_COLOR_HIGHCONTRAST : BMP_COLOR_NORMAL );
2410 
2411     // and set the new images on our toolbox
2412     sal_uInt16 nLoop = pStyleFamilies->Count();
2413     for( ; nLoop--; )
2414     {
2415         const SfxStyleFamilyItem *pItem = pStyleFamilies->GetObject( nLoop );
2416         sal_uInt16 nId = SfxFamilyIdToNId( pItem->GetFamily() );
2417         m_aActionTbL.SetItemImage( nId, pItem->GetImage() );
2418     }
2419 }
2420 
2421 // ------------------------------------------------------------------------
2422 void SfxTemplateDialog_Impl::updateNonFamilyImages()
2423 {
2424     m_aActionTbR.SetImageList( ImageList( SfxResId(
2425         m_pFloat->GetSettings().GetStyleSettings().GetHighContrastMode() ? IMG_LST_STYLE_DESIGNER_HC
2426                                                              : DLG_STYLE_DESIGNER ) ) );
2427 }
2428 
2429 // ------------------------------------------------------------------------
2430 
2431 void SfxTemplateDialog_Impl::ClearFamilyList()
2432 {
2433     m_aActionTbL.Clear();
2434 }
2435 
2436 //-------------------------------------------------------------------------
2437 
2438 void SfxCommonTemplateDialog_Impl::InvalidateBindings()
2439 {
2440     pBindings->Invalidate(SID_STYLE_NEW_BY_EXAMPLE, sal_True, sal_False);
2441     pBindings->Update( SID_STYLE_NEW_BY_EXAMPLE );
2442     pBindings->Invalidate(SID_STYLE_UPDATE_BY_EXAMPLE, sal_True, sal_False);
2443     pBindings->Update( SID_STYLE_UPDATE_BY_EXAMPLE );
2444     pBindings->Invalidate( SID_STYLE_WATERCAN, sal_True, sal_False);
2445     pBindings->Update( SID_STYLE_WATERCAN );
2446     pBindings->Invalidate( SID_STYLE_NEW, sal_True, sal_False );
2447     pBindings->Update( SID_STYLE_NEW );
2448     pBindings->Invalidate( SID_STYLE_DRAGHIERARCHIE, sal_True, sal_False );
2449     pBindings->Update( SID_STYLE_DRAGHIERARCHIE );
2450 }
2451 
2452 //-------------------------------------------------------------------------
2453 
2454 SfxTemplateDialog_Impl::~SfxTemplateDialog_Impl()
2455 {
2456 /*
2457     SfxImageManager* pImgMgr = pBindings->GetImageManager();
2458     if ( pImgMgr )
2459     {
2460         pImgMgr->ReleaseToolBox( &m_aActionTbL );
2461         pImgMgr->ReleaseToolBox( &m_aActionTbR );
2462     }
2463 */
2464 }
2465 
2466 //-------------------------------------------------------------------------
2467 
2468 void SfxTemplateDialog_Impl::LoadedFamilies()
2469 {
2470     updateFamilyImages();
2471     Resize();
2472 }
2473 
2474 //-------------------------------------------------------------------------
2475 
2476 // "Uberladener Resize-Handler ( StarView )
2477 // Die Groesse der Listboxen wird angepasst
2478 void SfxTemplateDialog_Impl::Resize()
2479 {
2480     FloatingWindow *pF = m_pFloat->GetFloatingWindow();
2481     if ( pF )
2482     {
2483 //      if(pF->IsZoomedIn() && m_bZoomIn==sal_False)
2484 //          pF->SetText(String(SfxResId( DLG_STYLE_DESIGNER )));
2485 //      if(!pF->IsZoomedIn() && m_bZoomIn==sal_True && GetFamilyItem_Impl())
2486 //          UpdateStyles_Impl(UPDATE_FAMILY); //Bereich wieder in Titel schreiben
2487         m_bZoomIn = pF->IsRollUp();
2488         if ( m_bZoomIn )
2489             return;
2490     }
2491 
2492     Size aDlgSize=m_pFloat->PixelToLogic(m_pFloat->GetOutputSizePixel());
2493     Size aSizeATL=m_pFloat->PixelToLogic(m_aActionTbL.CalcWindowSizePixel());
2494     Size aSizeATR=m_pFloat->PixelToLogic(m_aActionTbR.CalcWindowSizePixel());
2495     Size aMinSize = GetMinOutputSizePixel();
2496 
2497     long nListHeight = m_pFloat->PixelToLogic( aFilterLb.GetSizePixel() ).Height();
2498     long nWidth = aDlgSize.Width()- 2 * SFX_TEMPLDLG_HFRAME;
2499 
2500     m_aActionTbL.SetPosSizePixel(m_pFloat->LogicToPixel(Point(SFX_TEMPLDLG_HFRAME,SFX_TEMPLDLG_VTOPFRAME)),
2501                                  m_pFloat->LogicToPixel(aSizeATL));
2502 
2503     // Die Position der rechten Toolbox nur ver"andern, wenn das Fenster
2504     // breit genug ist
2505     Point aPosATR(aDlgSize.Width()-SFX_TEMPLDLG_HFRAME-aSizeATR.Width(),SFX_TEMPLDLG_VTOPFRAME);
2506     if(aDlgSize.Width() >= aMinSize.Width())
2507         m_aActionTbR.SetPosPixel(m_pFloat->LogicToPixel(aPosATR));
2508     else
2509         m_aActionTbR.SetPosPixel( m_pFloat->LogicToPixel(
2510             Point( SFX_TEMPLDLG_HFRAME + aSizeATL.Width() + SFX_TEMPLDLG_MIDHSPACE,
2511                    SFX_TEMPLDLG_VTOPFRAME ) ) );
2512 
2513     m_aActionTbR.SetSizePixel(m_pFloat->LogicToPixel(aSizeATR));
2514 
2515     Point aFilterPos(
2516         m_pFloat->LogicToPixel(Point(SFX_TEMPLDLG_HFRAME,
2517             aDlgSize.Height()-SFX_TEMPLDLG_VBOTFRAME-nListHeight)) );
2518 
2519     Size aFilterSize(
2520         m_pFloat->LogicToPixel(Size(nWidth,SFX_TEMPLDLG_FILTERHEIGHT)) );
2521 
2522     Point aFmtPos(
2523         m_pFloat->LogicToPixel(Point(SFX_TEMPLDLG_HFRAME, SFX_TEMPLDLG_VTOPFRAME +
2524                             SFX_TEMPLDLG_MIDVSPACE+aSizeATL.Height())) );
2525     Size aFmtSize(
2526         m_pFloat->LogicToPixel(Size(nWidth,
2527                     aDlgSize.Height() - SFX_TEMPLDLG_VBOTFRAME -
2528                     SFX_TEMPLDLG_VTOPFRAME - 2*SFX_TEMPLDLG_MIDVSPACE-
2529                     nListHeight-aSizeATL.Height())) );
2530 
2531     // Die Position der Listboxen nur ver"andern, wenn das Fenster
2532     // hoch genug ist
2533     if(aDlgSize.Height() >= aMinSize.Height())
2534     {
2535         aFilterLb.SetPosPixel(aFilterPos);
2536         aFmtLb.SetPosPixel( aFmtPos );
2537         if(pTreeBox)
2538             pTreeBox->SetPosPixel(aFmtPos);
2539     }
2540     else
2541         aFmtSize.Height() += aFilterSize.Height();
2542 
2543     aFilterLb.SetSizePixel(aFilterSize);
2544     aFmtLb.SetSizePixel( aFmtSize );
2545     if(pTreeBox)
2546         pTreeBox->SetSizePixel(aFmtSize);
2547 }
2548 
2549 // -----------------------------------------------------------------------
2550 
2551 
2552 Size SfxTemplateDialog_Impl::GetMinOutputSizePixel()
2553 {
2554     Size aSizeATL=m_pFloat->PixelToLogic(m_aActionTbL.CalcWindowSizePixel());
2555     Size aSizeATR=m_pFloat->PixelToLogic(m_aActionTbR.CalcWindowSizePixel());
2556     Size aMinSize=Size(
2557         aSizeATL.Width()+aSizeATR.Width()+
2558         2*SFX_TEMPLDLG_HFRAME + SFX_TEMPLDLG_MIDHSPACE,
2559         4*aSizeATL.Height()+2*SFX_TEMPLDLG_MIDVSPACE);
2560     return aMinSize;
2561 }
2562 
2563 //-------------------------------------------------------------------------
2564 
2565 void SfxTemplateDialog_Impl::Command( const CommandEvent& rCEvt )
2566 {
2567     if(COMMAND_CONTEXTMENU  == rCEvt.GetCommand())
2568         ExecuteContextMenu_Impl( rCEvt.GetMousePosPixel(), m_pFloat );
2569     else
2570         m_pFloat->Command(rCEvt);
2571 }
2572 
2573 //-------------------------------------------------------------------------
2574 
2575 void SfxTemplateDialog_Impl::EnableItem(sal_uInt16 nMesId, sal_Bool bCheck)
2576 {
2577     String aEmpty;
2578     switch(nMesId)
2579     {
2580       case SID_STYLE_WATERCAN :
2581           if(!bCheck && IsCheckedItem(SID_STYLE_WATERCAN))
2582             Execute_Impl(SID_STYLE_WATERCAN, aEmpty, aEmpty, 0);
2583       case SID_STYLE_NEW_BY_EXAMPLE:
2584       case SID_STYLE_UPDATE_BY_EXAMPLE:
2585         m_aActionTbR.EnableItem(nMesId,bCheck);
2586         break;
2587     }
2588 }
2589 
2590 //-------------------------------------------------------------------------
2591 
2592 void SfxTemplateDialog_Impl::CheckItem(sal_uInt16 nMesId, sal_Bool bCheck)
2593 {
2594     switch(nMesId)
2595     {
2596         case SID_STYLE_WATERCAN :
2597             bIsWater=bCheck;
2598             m_aActionTbR.CheckItem(SID_STYLE_WATERCAN,bCheck);
2599             break;
2600         default:
2601             m_aActionTbL.CheckItem(nMesId,bCheck); break;
2602     }
2603 }
2604 
2605 //-------------------------------------------------------------------------
2606 
2607 sal_Bool SfxTemplateDialog_Impl::IsCheckedItem(sal_uInt16 nMesId)
2608 {
2609     switch(nMesId)
2610     {
2611         case SID_STYLE_WATERCAN :
2612             return m_aActionTbR.GetItemState(SID_STYLE_WATERCAN)==STATE_CHECK;
2613         default:
2614             return m_aActionTbL.GetItemState(nMesId)==STATE_CHECK;
2615     }
2616 }
2617 
2618 //-------------------------------------------------------------------------
2619 
2620 IMPL_LINK_INLINE_START( SfxTemplateDialog_Impl, ToolBoxLSelect, ToolBox *, pBox )
2621 {
2622     const sal_uInt16 nEntry = pBox->GetCurItemId();
2623     FamilySelect(nEntry);
2624     return 0;
2625 }
2626 IMPL_LINK_INLINE_END( SfxTemplateDialog_Impl, ToolBoxLSelect, ToolBox *, pBox )
2627 
2628 //-------------------------------------------------------------------------
2629 ::rtl::OUString lcl_GetLabel(uno::Any& rAny)
2630 {
2631     ::rtl::OUString sRet;
2632     uno::Sequence< beans::PropertyValue >aPropSeq;
2633     if ( rAny >>= aPropSeq )
2634     {
2635         for( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ )
2636         {
2637             if ( aPropSeq[i].Name.equalsAscii( "Label" ))
2638             {
2639                 aPropSeq[i].Value >>= sRet;
2640                 break;
2641             }
2642         }
2643     }
2644     return sRet;
2645 }
2646 //-------------------------------------------------------------------------
2647 
2648 IMPL_LINK( SfxTemplateDialog_Impl, ToolBoxRSelect, ToolBox *, pBox )
2649 {
2650     const sal_uInt16 nEntry = pBox->GetCurItemId();
2651     if(nEntry != SID_STYLE_NEW_BY_EXAMPLE ||
2652             TIB_DROPDOWN != (pBox->GetItemBits(nEntry)&TIB_DROPDOWN))
2653         ActionSelect(nEntry);
2654     return 0;
2655 }
2656 //-------------------------------------------------------------------------
2657 IMPL_LINK( SfxTemplateDialog_Impl, ToolBoxRClick, ToolBox *, pBox )
2658 {
2659     const sal_uInt16 nEntry = pBox->GetCurItemId();
2660     if(nEntry == SID_STYLE_NEW_BY_EXAMPLE &&
2661             TIB_DROPDOWN == (pBox->GetItemBits(nEntry)&TIB_DROPDOWN))
2662     {
2663         //create a popup menu in Writer
2664         PopupMenu *pMenu = new PopupMenu;
2665         uno::Reference< container::XNameAccess > xNameAccess(
2666                     ::comphelper::getProcessServiceFactory()->
2667                     createInstance( ::rtl::OUString::createFromAscii(
2668                             "com.sun.star.frame.UICommandDescription") ), uno::UNO_QUERY );
2669         uno::Reference< container::XNameAccess > xUICommands;
2670         if ( xNameAccess.is() )
2671         {
2672             rtl::OUString sTextDoc = ::rtl::OUString::createFromAscii("com.sun.star.text.TextDocument");
2673             if(xNameAccess->hasByName(sTextDoc))
2674             {
2675                 uno::Any a = xNameAccess->getByName( sTextDoc );
2676                 a >>= xUICommands;
2677             }
2678         }
2679         if(!xUICommands.is())
2680             return 0;
2681         try
2682         {
2683             uno::Sequence< beans::PropertyValue > aPropSeq;
2684             uno::Any aCommand = xUICommands->getByName(::rtl::OUString::createFromAscii(".uno:StyleNewByExample"));
2685             ::rtl::OUString sLabel = lcl_GetLabel( aCommand );
2686             pMenu->InsertItem( SID_STYLE_NEW_BY_EXAMPLE, sLabel );
2687             pMenu->SetHelpId(SID_STYLE_NEW_BY_EXAMPLE, HID_TEMPLDLG_NEWBYEXAMPLE);
2688 
2689             aCommand = xUICommands->getByName(::rtl::OUString::createFromAscii(".uno:StyleUpdateByExample"));
2690             sLabel = lcl_GetLabel( aCommand );
2691 
2692             pMenu->InsertItem( SID_STYLE_UPDATE_BY_EXAMPLE, sLabel );
2693             pMenu->SetHelpId(SID_STYLE_UPDATE_BY_EXAMPLE, HID_TEMPLDLG_UPDATEBYEXAMPLE);
2694 
2695             aCommand = xUICommands->getByName(::rtl::OUString::createFromAscii(".uno:LoadStyles"));
2696             sLabel = lcl_GetLabel( aCommand );
2697             pMenu->InsertItem( SID_TEMPLATE_LOAD, sLabel );
2698             pMenu->SetHelpId(SID_TEMPLATE_LOAD, ".uno:LoadStyles");
2699 
2700             pMenu->SetSelectHdl(LINK(this, SfxTemplateDialog_Impl, MenuSelectHdl));
2701             pMenu->Execute( pBox,
2702                             pBox->GetItemRect(nEntry),
2703                             POPUPMENU_EXECUTE_DOWN );
2704             pBox->EndSelection();
2705         }
2706         catch(uno::Exception&)
2707         {
2708         }
2709         delete pMenu;
2710         pBox->Invalidate();
2711     }
2712     return 0;
2713 }
2714 //-------------------------------------------------------------------------
2715 IMPL_LINK( SfxTemplateDialog_Impl, MenuSelectHdl, Menu*, pMenu)
2716 {
2717     sal_uInt16 nMenuId = pMenu->GetCurItemId();
2718     ActionSelect(nMenuId);
2719     return 0;
2720 }
2721 //-------------------------------------------------------------------------
2722 
2723 SfxTemplateCatalog_Impl::SfxTemplateCatalog_Impl( Window* /*pParent*/, SfxBindings* pB,
2724                                                   SfxTemplateCatalog* pTmpWindow ) :
2725 
2726     SfxCommonTemplateDialog_Impl( pB, pTmpWindow ),
2727 
2728     aFamList    ( pTmpWindow, SfxResId( BT_TOOL ) ),
2729     aOkBtn      ( pTmpWindow, SfxResId( BT_OK ) ),
2730     aCancelBtn  ( pTmpWindow, SfxResId( BT_CANCEL ) ),
2731     aNewBtn     ( pTmpWindow, SfxResId( BT_NEW ) ),
2732     aChangeBtn  ( pTmpWindow, SfxResId( BT_EDIT ) ),
2733     aDelBtn     ( pTmpWindow, SfxResId( BT_DEL ) ),
2734     aOrgBtn     ( pTmpWindow, SfxResId( BT_ORG ) ),
2735     aHelpBtn    ( pTmpWindow, SfxResId( BT_HELP ) ),
2736     pReal       ( pTmpWindow ),
2737     aHelper     ( pTmpWindow )
2738 
2739 {
2740     aNewBtn.Disable();
2741     aDelBtn.Disable();
2742     aChangeBtn.Disable();
2743 
2744     SFX_APP()->Get_Impl()->pTemplateCommon = GetISfxTemplateCommon();
2745     pTmpWindow->FreeResource();
2746 
2747     Initialize();
2748 
2749     aFamList.SetSelectHdl(  LINK( this, SfxTemplateCatalog_Impl, FamListSelect ) );
2750     aOkBtn.SetClickHdl(     LINK( this, SfxTemplateCatalog_Impl, OkHdl ) );
2751     aCancelBtn.SetClickHdl( LINK( this, SfxTemplateCatalog_Impl, CancelHdl ) );
2752     aNewBtn.SetClickHdl(    LINK( this, SfxTemplateCatalog_Impl, NewHdl ) );
2753     aDelBtn.SetClickHdl(    LINK( this, SfxTemplateCatalog_Impl, DelHdl ) );
2754     aChangeBtn.SetClickHdl( LINK( this, SfxTemplateCatalog_Impl, ChangeHdl ) );
2755     aOrgBtn.SetClickHdl(    LINK( this, SfxTemplateCatalog_Impl, OrgHdl ) );
2756 }
2757 
2758 //-------------------------------------------------------------------------
2759 
2760 SfxTemplateCatalog_Impl::~SfxTemplateCatalog_Impl()
2761 {
2762     SFX_APP()->Get_Impl()->pTemplateCommon = 0;
2763 }
2764 
2765 //-------------------------------------------------------------------------
2766 
2767 IMPL_LINK_INLINE_START( SfxTemplateCatalog_Impl, OkHdl, Button *, pButton )
2768 {
2769     (void)pButton; //unused
2770     ApplyHdl( NULL );
2771     pReal->EndDialog( RET_OK );
2772     return 0;
2773 }
2774 IMPL_LINK_INLINE_END( SfxTemplateCatalog_Impl, OkHdl, Button *, pButton )
2775 
2776 //-------------------------------------------------------------------------
2777 
2778 IMPL_LINK_INLINE_START( SfxTemplateCatalog_Impl, CancelHdl, Button *, pButton )
2779 {
2780     (void)pButton; //unused
2781     pReal->EndDialog( RET_CANCEL );
2782     return 0;
2783 }
2784 IMPL_LINK_INLINE_END( SfxTemplateCatalog_Impl, CancelHdl, Button *, pButton )
2785 
2786 //-------------------------------------------------------------------------
2787 
2788 IMPL_LINK_INLINE_START( SfxTemplateCatalog_Impl, NewHdl, Button *, pButton )
2789 {
2790     (void)pButton; //unused
2791     aCancelBtn.SetText( String( SfxResId( STR_CLOSE ) ) );
2792     SfxCommonTemplateDialog_Impl::NewHdl( NULL );
2793     return 0;
2794 }
2795 IMPL_LINK_INLINE_END( SfxTemplateCatalog_Impl, NewHdl, Button *, pButton )
2796 
2797 //-------------------------------------------------------------------------
2798 
2799 IMPL_LINK_INLINE_START( SfxTemplateCatalog_Impl, ChangeHdl, Button *, pButton )
2800 {
2801     (void)pButton; //unused
2802     aCancelBtn.SetText( String( SfxResId( STR_CLOSE ) ) );
2803     SfxCommonTemplateDialog_Impl::EditHdl( NULL );
2804     return 0;
2805 }
2806 IMPL_LINK_INLINE_END( SfxTemplateCatalog_Impl, ChangeHdl, Button *, pButton )
2807 
2808 //-------------------------------------------------------------------------
2809 
2810 IMPL_LINK_INLINE_START( SfxTemplateCatalog_Impl, DelHdl, Button *, pButton )
2811 {
2812     (void)pButton; //unused
2813     SfxCommonTemplateDialog_Impl::DeleteHdl( NULL );
2814     return 0;
2815 }
2816 IMPL_LINK_INLINE_END( SfxTemplateCatalog_Impl, DelHdl, Button *, pButton )
2817 
2818 //-------------------------------------------------------------------------
2819 
2820 IMPL_LINK( SfxTemplateCatalog_Impl, OrgHdl, Button *, pButton )
2821 {
2822     (void)pButton; //unused
2823     aCancelBtn.SetText( String( SfxResId( STR_CLOSE ) ) );
2824     SfxDocumentTemplates aTemplates;
2825     aTemplates.Construct();
2826     SfxTemplateOrganizeDlg* pDlg = new SfxTemplateOrganizeDlg( pReal, &aTemplates );
2827     const short nRet = pDlg->Execute();
2828     delete pDlg;
2829     if ( RET_OK == nRet )
2830         Update_Impl();
2831     else if ( RET_EDIT_STYLE == nRet )
2832         pReal->EndDialog( RET_CANCEL );
2833     return 0;
2834 }
2835 
2836 //-------------------------------------------------------------------------
2837 
2838 void SfxTemplateCatalog_Impl::EnableEdit( sal_Bool bEnable )
2839 {
2840     SfxCommonTemplateDialog_Impl::EnableEdit( bEnable );
2841     aChangeBtn.Enable( bEnable );
2842 }
2843 
2844 //-------------------------------------------------------------------------
2845 
2846 void SfxTemplateCatalog_Impl::EnableDel( sal_Bool bEnable )
2847 {
2848     SfxCommonTemplateDialog_Impl::EnableDel( bEnable );
2849     aDelBtn.Enable( bEnable );
2850 }
2851 
2852 void SfxTemplateCatalog_Impl::EnableNew(sal_Bool bEnable)
2853 {
2854     SfxCommonTemplateDialog_Impl::EnableNew( bEnable );
2855     aNewBtn.Enable( bEnable );
2856 }
2857 
2858 //-------------------------------------------------------------------------
2859 
2860 IMPL_LINK_INLINE_START( SfxTemplateCatalog_Impl, FamListSelect, ListBox *, pList )
2861 {
2862     const sal_uInt16 nEntry = aFamIds[pList->GetSelectEntryPos()];
2863     FamilySelect(nEntry);
2864     return 0;
2865 }
2866 IMPL_LINK_INLINE_END( SfxTemplateCatalog_Impl, FamListSelect, ListBox *, pList )
2867 
2868 //-------------------------------------------------------------------------
2869 
2870 void SfxTemplateCatalog_Impl::EnableItem( sal_uInt16 nMesId, sal_Bool bCheck )
2871 {
2872     if ( nMesId == SID_STYLE_WATERCAN )
2873         aOkBtn.Enable( bCheck );
2874     if ( nMesId > SFX_STYLE_FAMILY_PSEUDO || nMesId < SFX_STYLE_FAMILY_CHAR )
2875         return;
2876 
2877 /*      for(sal_uInt16 i=0;i<aFamIds.Count&&aFamIds[i]!=nMesId;i++);
2878     if(i!=aFamIds.Count())
2879         aFamList.SelectEntry(aFamIds[i]);
2880     else
2881         DBG_ERROR("Entry nicht gefunden");*/
2882 
2883 }
2884 
2885 //-------------------------------------------------------------------------
2886 
2887 void SfxTemplateCatalog_Impl::CheckItem(sal_uInt16 nMesId, sal_Bool /*bCheck*/)
2888 {
2889     if ( nMesId > SFX_STYLE_FAMILY_PSEUDO || nMesId < SFX_STYLE_FAMILY_CHAR )
2890         return;
2891     sal_uInt16 i;
2892     for ( i = 0; i < aFamIds.Count() && aFamIds[i] != nMesId; i++ ) ;
2893     aFamList.SelectEntryPos(i);
2894 }
2895 
2896 //-------------------------------------------------------------------------
2897 
2898 sal_Bool SfxTemplateCatalog_Impl::IsCheckedItem(sal_uInt16 nMesId)
2899 {
2900     if ( nMesId > SFX_STYLE_FAMILY_PSEUDO || nMesId < SFX_STYLE_FAMILY_CHAR )
2901         return sal_False;
2902     sal_uInt16 i;
2903     for ( i = 0; i < aFamIds.Count() && aFamIds[i] != nMesId; i++ )
2904         ;
2905     return aFamList.IsEntrySelected( String::CreateFromInt32(i) );
2906 }
2907 
2908 //-------------------------------------------------------------------------
2909 
2910 // Der Katalog muss nur das Disablen beherrschen, da waehrend seiner
2911 // Lebenszeit keine Selektionsaenderungen vorgenommen werden koennen
2912 void SfxTemplateCatalog_Impl::EnableFamilyItem( sal_uInt16 nId, sal_Bool bEnable )
2913 {
2914     if ( !bEnable )
2915         for ( sal_uInt16 nPos = aFamIds.Count(); nPos--; )
2916             if ( aFamIds[ nPos ] == nId )
2917             {
2918                 aFamIds.Remove( nPos );
2919                 aFamList.RemoveEntry( nPos );
2920             }
2921 }
2922 
2923 void SfxTemplateCatalog_Impl::InsertFamilyItem( sal_uInt16 nId, const SfxStyleFamilyItem* pItem )
2924 {
2925     if ( nId > SFX_STYLE_FAMILY_PSEUDO || nId < SFX_STYLE_FAMILY_CHAR )
2926         return;
2927     aFamList.InsertEntry( pItem->GetText(), 0 );
2928     aFamIds.Insert( nId, 0 );
2929 }
2930 
2931 void SfxTemplateCatalog_Impl::ClearFamilyList()
2932 {
2933     aFamList.Clear();
2934     aFamIds.Remove( 0, aFamIds.Count() );
2935 }
2936 
2937 void SfxTemplateCatalog_Impl::PrepareDeleteAction()
2938 {
2939     aDelBtn.Disable();
2940     aCancelBtn.SetText( String( SfxResId( STR_CLOSE ) ) );
2941 }
2942 
2943 
2944 void SfxCommonTemplateDialog_Impl::SetFamily( sal_uInt16 nId )
2945 {
2946     if ( nId != nActFamily )
2947     {
2948         if ( nActFamily != SFX_TEMPLDLG_FILTER_MAX )
2949             CheckItem( nActFamily, sal_False );
2950         nActFamily = nId;
2951         if ( nId != SFX_TEMPLDLG_FILTER_MAX )
2952             bUpdateFamily = sal_True;
2953     }
2954 }
2955 
2956 void SfxCommonTemplateDialog_Impl::UpdateFamily_Impl()
2957 {
2958     bUpdateFamily = sal_False;
2959 
2960     SfxDispatcher* pDispat = pBindings->GetDispatcher_Impl();
2961     SfxViewFrame *pViewFrame = pDispat->GetFrame();
2962     SfxObjectShell *pDocShell = pViewFrame->GetObjectShell();
2963 
2964     SfxStyleSheetBasePool *pOldStyleSheetPool = pStyleSheetPool;
2965     pStyleSheetPool = pDocShell? pDocShell->GetStyleSheetPool(): 0;
2966     if ( pOldStyleSheetPool != pStyleSheetPool )
2967     {
2968         if ( pOldStyleSheetPool )
2969             EndListening(*pOldStyleSheetPool);
2970         if ( pStyleSheetPool )
2971             StartListening(*pOldStyleSheetPool);
2972     }
2973 
2974     bWaterDisabled = sal_False;
2975     bCanNew = sal_True;
2976     bTreeDrag = sal_True;
2977     bUpdateByExampleDisabled = sal_False;
2978 
2979     if ( pStyleSheetPool )
2980     {
2981         if(!pTreeBox)
2982             UpdateStyles_Impl(UPDATE_FAMILY | UPDATE_FAMILY_LIST);
2983         else
2984         {
2985             UpdateStyles_Impl(UPDATE_FAMILY);
2986             FillTreeBox();
2987         }
2988     }
2989 
2990     InvalidateBindings();
2991 
2992     if ( IsCheckedItem( SID_STYLE_WATERCAN ) &&
2993          // nur, wenn dieser Bereich erlaubt ist
2994          0 != pFamilyState[ nActFamily - 1 ] )
2995         Execute_Impl( SID_STYLE_APPLY, GetSelectedEntry(),
2996                       String(), (sal_uInt16)GetFamilyItem_Impl()->GetFamily() );
2997 }
2998 void SfxCommonTemplateDialog_Impl::ReplaceUpdateButtonByMenu()
2999 {
3000     //does nothing
3001 }
3002 
3003 void SfxTemplateDialog::StateChanged( StateChangedType nStateChange )
3004 {
3005     if ( nStateChange == STATE_CHANGE_INITSHOW )
3006     {
3007         SfxViewFrame *pFrame = GetBindings().GetDispatcher_Impl()->GetFrame();
3008         Window* pEditWin = pFrame->GetViewShell()->GetWindow();
3009 
3010         Size aSize = pEditWin->GetSizePixel();
3011         Point aPoint = pEditWin->OutputToScreenPixel( pEditWin->GetPosPixel() );
3012         aPoint = GetParent()->ScreenToOutputPixel( aPoint );
3013         Size aWinSize = GetSizePixel();
3014         aPoint.X() += aSize.Width() - aWinSize.Width() - 20;
3015         aPoint.Y() += aSize.Height() / 2 - aWinSize.Height() / 2;
3016         SetFloatingPos( aPoint );
3017     }
3018 
3019     SfxDockingWindow::StateChanged( nStateChange );
3020 }
3021 
3022 /*-- 10.12.2003 11:44:35---------------------------------------------------
3023 
3024   -----------------------------------------------------------------------*/
3025 DropToolBox_Impl::DropToolBox_Impl(Window* pParent, SfxTemplateDialog_Impl* pTemplateDialog) :
3026     ToolBox(pParent),
3027     DropTargetHelper(this),
3028     rParent(*pTemplateDialog)
3029 {
3030 }
3031 /*-- 10.12.2003 11:44:35---------------------------------------------------
3032 
3033   -----------------------------------------------------------------------*/
3034 DropToolBox_Impl::~DropToolBox_Impl()
3035 {
3036 }
3037 /*-- 10.12.2003 11:44:35---------------------------------------------------
3038 
3039   -----------------------------------------------------------------------*/
3040 sal_Int8    DropToolBox_Impl::AcceptDrop( const AcceptDropEvent& rEvt )
3041 {
3042     sal_Int8 nReturn = DND_ACTION_NONE;
3043     sal_uInt16 nItemId = GetItemId( rEvt.maPosPixel );
3044     if(USHRT_MAX != nItemId && !IsItemChecked( nItemId ))
3045     {
3046         SetCurItemId(nItemId);
3047         GetSelectHdl().Call(this);
3048     }
3049     // special case: page styles are allowed to create new styles by example
3050     // but not allowed to be created by drag and drop
3051     if ( nItemId != SfxCommonTemplateDialog_Impl::SfxFamilyIdToNId( SFX_STYLE_FAMILY_PAGE )&&
3052         IsDropFormatSupported( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) &&
3053         !rParent.bNewByExampleDisabled )
3054     {
3055         nReturn = DND_ACTION_COPY;
3056     }
3057     return nReturn;
3058 }
3059 /*-- 10.12.2003 11:44:35---------------------------------------------------
3060 
3061   -----------------------------------------------------------------------*/
3062 sal_Int8    DropToolBox_Impl::ExecuteDrop( const ExecuteDropEvent& rEvt )
3063 {
3064      return rParent.aFmtLb.ExecuteDrop(rEvt);
3065 }
3066 
3067