xref: /trunk/main/cui/source/customize/cfgutil.cxx (revision 2ee96f1c)
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_cui.hxx"
26 
27 #include "cfgutil.hxx"
28 
29 #include <com/sun/star/beans/XPropertySet.hpp>
30 #include <com/sun/star/frame/XDispatchInformationProvider.hpp>
31 #include <com/sun/star/uno/RuntimeException.hpp>
32 #include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
33 #include <com/sun/star/script/provider/XScriptProvider.hpp>
34 #include <com/sun/star/script/browse/XBrowseNode.hpp>
35 #include <com/sun/star/script/browse/BrowseNodeTypes.hpp>
36 
37 #include <com/sun/star/script/browse/XBrowseNodeFactory.hpp>
38 #include <com/sun/star/script/browse/BrowseNodeFactoryViewTypes.hpp>
39 #include <com/sun/star/frame/XModuleManager.hpp>
40 #include <com/sun/star/frame/XDesktop.hpp>
41 #include <com/sun/star/container/XEnumerationAccess.hpp>
42 #include <com/sun/star/container/XEnumeration.hpp>
43 #include <com/sun/star/document/XDocumentInfoSupplier.hpp>
44 #include <com/sun/star/document/XScriptInvocationContext.hpp>
45 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
46 
47 #include "acccfg.hrc"
48 #include "helpid.hrc"
49 #include <basic/sbx.hxx>
50 #include <basic/basicmanagerrepository.hxx>
51 #include <basic/sbstar.hxx>
52 #include <basic/sbxmeth.hxx>
53 #include <basic/sbmod.hxx>
54 #include <basic/basmgr.hxx>
55 #include <tools/urlobj.hxx>
56 #include "cuires.hrc"
57 #include <sfx2/app.hxx>
58 #include <sfx2/minfitem.hxx>
59 #include <unotools/processfactory.hxx>
60 #include <comphelper/documentinfo.hxx>
61 #include <svtools/imagemgr.hxx>
62 #include <rtl/ustrbuf.hxx>
63 #include <comphelper/sequenceashashmap.hxx>
64 #include <unotools/configmgr.hxx>
65 #include "dialmgr.hxx"
66 #include <svl/stritem.hxx>
67 
68 #define _SVSTDARR_STRINGSDTOR
69 #include <svl/svstdarr.hxx>
70 
71 using namespace ::com::sun::star;
72 using namespace ::com::sun::star::uno;
73 using namespace ::com::sun::star::script;
74 using namespace ::com::sun::star::frame;
75 using namespace ::com::sun::star::document;
76 namespace css = ::com::sun::star;
77 
78 static ::rtl::OUString SERVICE_UICATEGORYDESCRIPTION = ::rtl::OUString::createFromAscii("com.sun.star.ui.UICategoryDescription"         );
79 static ::rtl::OUString SERVICE_UICMDDESCRIPTION      = ::rtl::OUString::createFromAscii("com.sun.star.frame.UICommandDescription");
80 
SfxStylesInfo_Impl()81 SfxStylesInfo_Impl::SfxStylesInfo_Impl()
82 {}
83 
setModel(const::com::sun::star::uno::Reference<::com::sun::star::frame::XModel> & xModel)84 void SfxStylesInfo_Impl::setModel(const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& xModel)
85 {
86     m_xDoc = xModel;
87 }
88 
89 static ::rtl::OUString FAMILY_CHARACTERSTYLE = ::rtl::OUString::createFromAscii("CharacterStyles");
90 static ::rtl::OUString FAMILY_PARAGRAPHSTYLE = ::rtl::OUString::createFromAscii("ParagraphStyles");
91 static ::rtl::OUString FAMILY_FRAMESTYLE     = ::rtl::OUString::createFromAscii("FrameStyles"    );
92 static ::rtl::OUString FAMILY_PAGESTYLE      = ::rtl::OUString::createFromAscii("PageStyles"     );
93 static ::rtl::OUString FAMILY_NUMBERINGSTYLE = ::rtl::OUString::createFromAscii("NumberingStyles");
94 
95 static ::rtl::OUString CMDURL_SPART  = ::rtl::OUString::createFromAscii(".uno:StyleApply?Style:string=");
96 static ::rtl::OUString CMDURL_FPART2 = ::rtl::OUString::createFromAscii("&FamilyName:string=");
97 
98 static ::rtl::OUString CMDURL_STYLEPROT_ONLY = ::rtl::OUString::createFromAscii(".uno:StyleApply?");
99 static ::rtl::OUString CMDURL_SPART_ONLY     = ::rtl::OUString::createFromAscii("Style:string=");
100 static ::rtl::OUString CMDURL_FPART_ONLY     = ::rtl::OUString::createFromAscii("FamilyName:string=");
101 
102 static ::rtl::OUString STYLEPROP_UINAME = ::rtl::OUString::createFromAscii("DisplayName");
103 
generateCommand(const::rtl::OUString & sFamily,const::rtl::OUString & sStyle)104 ::rtl::OUString SfxStylesInfo_Impl::generateCommand(const ::rtl::OUString& sFamily, const ::rtl::OUString& sStyle)
105 {
106     ::rtl::OUStringBuffer sCommand(1024);
107     sCommand.append(CMDURL_SPART );
108     sCommand.append(sStyle       );
109     sCommand.append(CMDURL_FPART2);
110     sCommand.append(sFamily      );
111     return sCommand.makeStringAndClear();
112 }
113 
parseStyleCommand(SfxStyleInfo_Impl & aStyle)114 sal_Bool SfxStylesInfo_Impl::parseStyleCommand(SfxStyleInfo_Impl& aStyle)
115 {
116     static sal_Int32 LEN_STYLEPROT = CMDURL_STYLEPROT_ONLY.getLength();
117     static sal_Int32 LEN_SPART     = CMDURL_SPART_ONLY.getLength();
118     static sal_Int32 LEN_FPART     = CMDURL_FPART_ONLY.getLength();
119 
120     if (aStyle.sCommand.indexOf(CMDURL_STYLEPROT_ONLY, 0) != 0)
121         return sal_False;
122 
123     aStyle.sFamily = ::rtl::OUString();
124     aStyle.sStyle  = ::rtl::OUString();
125 
126     sal_Int32       nCmdLen  = aStyle.sCommand.getLength();
127     ::rtl::OUString sCmdArgs = aStyle.sCommand.copy(LEN_STYLEPROT, nCmdLen-LEN_STYLEPROT);
128     sal_Int32       i        = sCmdArgs.indexOf('&');
129     if (i<0)
130         return sal_False;
131 
132     ::rtl::OUString sArg = sCmdArgs.copy(0, i);
133     if (sArg.indexOf(CMDURL_SPART_ONLY) == 0)
134         aStyle.sStyle = sArg.copy(LEN_SPART, sArg.getLength()-LEN_SPART);
135     else
136     if (sArg.indexOf(CMDURL_FPART_ONLY) == 0)
137         aStyle.sFamily = sArg.copy(LEN_FPART, sArg.getLength()-LEN_FPART);
138 
139     sArg = sCmdArgs.copy(i+1, sCmdArgs.getLength()-i-1);
140     if (sArg.indexOf(CMDURL_SPART_ONLY) == 0)
141         aStyle.sStyle = sArg.copy(LEN_SPART, sArg.getLength()-LEN_SPART);
142     else
143     if (sArg.indexOf(CMDURL_FPART_ONLY) == 0)
144         aStyle.sFamily = sArg.copy(LEN_FPART, sArg.getLength()-LEN_FPART);
145 
146     if (aStyle.sFamily.getLength() && aStyle.sStyle.getLength())
147         return sal_True;
148 
149     return sal_False;
150 }
151 
getLabel4Style(SfxStyleInfo_Impl & aStyle)152 void SfxStylesInfo_Impl::getLabel4Style(SfxStyleInfo_Impl& aStyle)
153 {
154     try
155     {
156         css::uno::Reference< css::style::XStyleFamiliesSupplier > xModel(m_xDoc, css::uno::UNO_QUERY);
157 
158         css::uno::Reference< css::container::XNameAccess > xFamilies;
159         if (xModel.is())
160             xFamilies = xModel->getStyleFamilies();
161 
162         css::uno::Reference< css::container::XNameAccess > xStyleSet;
163         if (xFamilies.is())
164             xFamilies->getByName(aStyle.sFamily) >>= xStyleSet;
165 
166         css::uno::Reference< css::beans::XPropertySet > xStyle;
167         if (xStyleSet.is())
168             xStyleSet->getByName(aStyle.sStyle) >>= xStyle;
169 
170         aStyle.sLabel = ::rtl::OUString();
171         if (xStyle.is())
172             xStyle->getPropertyValue(STYLEPROP_UINAME) >>= aStyle.sLabel;
173     }
174     catch(const css::uno::RuntimeException& exRun)
175         { throw exRun; }
176     catch(const css::uno::Exception&)
177         { aStyle.sLabel = ::rtl::OUString(); }
178 
179     if (!aStyle.sLabel.getLength())
180     {
181         aStyle.sLabel = aStyle.sCommand;
182         /*
183         #if OSL_DEBUG_LEVEL > 1
184         ::rtl::OUStringBuffer sMsg(256);
185         sMsg.appendAscii("There is no UIName for the style command \"");
186         sMsg.append     (aStyle.sCommand                              );
187         sMsg.appendAscii("\". The UI will be invalid then ..."        );
188         OSL_ENSURE(sal_False, ::rtl::OUStringToOString(sMsg.makeStringAndClear(), RTL_TEXTENCODING_UTF8).getStr());
189         #endif
190         */
191     }
192 }
193 
getStyleFamilies()194 ::std::vector< SfxStyleInfo_Impl > SfxStylesInfo_Impl::getStyleFamilies()
195 {
196     // Its an optional interface!
197     css::uno::Reference< css::style::XStyleFamiliesSupplier > xModel(m_xDoc, css::uno::UNO_QUERY);
198     if (!xModel.is())
199         return ::std::vector< SfxStyleInfo_Impl >();
200 
201     css::uno::Reference< css::container::XNameAccess > xCont = xModel->getStyleFamilies();
202     css::uno::Sequence< ::rtl::OUString > lFamilyNames = xCont->getElementNames();
203     ::std::vector< SfxStyleInfo_Impl > lFamilies;
204     sal_Int32 c = lFamilyNames.getLength();
205     sal_Int32 i = 0;
206     for(i=0; i<c; ++i)
207     {
208         SfxStyleInfo_Impl aFamilyInfo;
209         aFamilyInfo.sFamily = lFamilyNames[i];
210 
211         try
212         {
213             css::uno::Reference< css::beans::XPropertySet > xFamilyInfo;
214             xCont->getByName(aFamilyInfo.sFamily) >>= xFamilyInfo;
215             if (!xFamilyInfo.is())
216             {
217                 // TODO_AS currently there is no support for an UIName property .. use internal family name instead
218                 aFamilyInfo.sLabel = aFamilyInfo.sFamily;
219             }
220             else
221                 xFamilyInfo->getPropertyValue(STYLEPROP_UINAME) >>= aFamilyInfo.sLabel;
222         }
223         catch(const css::uno::RuntimeException& exRun)
224             { throw exRun; }
225         catch(const css::uno::Exception&)
226             { return ::std::vector< SfxStyleInfo_Impl >(); }
227 
228         lFamilies.push_back(aFamilyInfo);
229     }
230 
231     return lFamilies;
232 }
233 
getStyles(const::rtl::OUString & sFamily)234 ::std::vector< SfxStyleInfo_Impl > SfxStylesInfo_Impl::getStyles(const ::rtl::OUString& sFamily)
235 {
236     static ::rtl::OUString PROP_UINAME = ::rtl::OUString::createFromAscii("DisplayName");
237 
238     css::uno::Sequence< ::rtl::OUString > lStyleNames;
239     css::uno::Reference< css::style::XStyleFamiliesSupplier > xModel(m_xDoc, css::uno::UNO_QUERY_THROW);
240     css::uno::Reference< css::container::XNameAccess > xFamilies = xModel->getStyleFamilies();
241     css::uno::Reference< css::container::XNameAccess > xStyleSet;
242     try
243     {
244         xFamilies->getByName(sFamily) >>= xStyleSet;
245         lStyleNames = xStyleSet->getElementNames();
246     }
247     catch(const css::uno::RuntimeException& exRun)
248         { throw exRun; }
249     catch(const css::uno::Exception&)
250         { return ::std::vector< SfxStyleInfo_Impl >(); }
251 
252     ::std::vector< SfxStyleInfo_Impl > lStyles;
253     sal_Int32                          c      = lStyleNames.getLength();
254     sal_Int32                          i      = 0;
255     for (i=0; i<c; ++i)
256     {
257         SfxStyleInfo_Impl aStyleInfo;
258         aStyleInfo.sFamily  = sFamily;
259         aStyleInfo.sStyle   = lStyleNames[i];
260         aStyleInfo.sCommand = SfxStylesInfo_Impl::generateCommand(aStyleInfo.sFamily, aStyleInfo.sStyle);
261 
262         try
263         {
264             css::uno::Reference< css::beans::XPropertySet > xStyle;
265             xStyleSet->getByName(aStyleInfo.sStyle) >>= xStyle;
266             if (!xStyle.is())
267                 continue;
268             xStyle->getPropertyValue(PROP_UINAME) >>= aStyleInfo.sLabel;
269         }
270         catch(const css::uno::RuntimeException& exRun)
271             { throw exRun; }
272         catch(const css::uno::Exception&)
273             { continue; }
274 
275         lStyles.push_back(aStyleInfo);
276     }
277     return lStyles;
278 }
279 SV_IMPL_PTRARR(SfxGroupInfoArr_Impl, SfxGroupInfoPtr);
SfxConfigFunctionListBox_Impl(Window * pParent,const ResId & rResId)280 SfxConfigFunctionListBox_Impl::SfxConfigFunctionListBox_Impl( Window* pParent, const ResId& rResId)
281 	: SvTreeListBox( pParent, rResId )
282 	, pCurEntry( 0 )
283     , pStylesInfo( 0 )
284 {
285 	SetStyle( GetStyle() | WB_CLIPCHILDREN | WB_HSCROLL | WB_SORT );
286 	GetModel()->SetSortMode( SortAscending );
287 
288 	// Timer f"ur die BallonHelp
289 	aTimer.SetTimeout( 200 );
290 	aTimer.SetTimeoutHdl(
291 		LINK( this, SfxConfigFunctionListBox_Impl, TimerHdl ) );
292 }
293 
~SfxConfigFunctionListBox_Impl()294 SfxConfigFunctionListBox_Impl::~SfxConfigFunctionListBox_Impl()
295 {
296 	ClearAll();
297 }
298 
MouseMove(const MouseEvent &)299 void SfxConfigFunctionListBox_Impl::MouseMove( const MouseEvent& )
300 {
301     /* --> PB 2004-12-01 #i37000# - no own help text needed any longer
302 	Point aMousePos = rMEvt.GetPosPixel();
303 	pCurEntry = GetCurEntry();
304 
305 	if ( pCurEntry && GetEntry( aMousePos ) == pCurEntry )
306 		aTimer.Start();
307 	else
308 	{
309         Help::ShowBalloon( this, aMousePos, String() );
310 		aTimer.Stop();
311 	}
312     */
313 }
314 
315 
IMPL_LINK(SfxConfigFunctionListBox_Impl,TimerHdl,Timer *,pTimer)316 IMPL_LINK( SfxConfigFunctionListBox_Impl, TimerHdl, Timer*, pTimer)
317 /*  Beschreibung
318 	Timer-Handler f"ur die Einblendung eines Hilfetextes. Wenn nach Ablauf des Timers
319 	der Mauszeiger immer noch auf dem aktuell selektierten Eintrag steht, wird der
320 	Helptext des Entries als Balloon-Help eingeblendet.
321 */
322 {
323     (void)pTimer; // unused
324     /* --> PB 2004-12-01 #i37000# - no own help text needed any longer
325 	aTimer.Stop();
326 	Point aMousePos = GetPointerPosPixel();
327 	SvLBoxEntry *pEntry = GetCurEntry();
328 	if ( pEntry && GetEntry( aMousePos ) == pEntry && pCurEntry == pEntry )
329     {
330         String sHelpText = GetHelpText( pEntry );
331         Help::ShowBalloon( this, OutputToScreenPixel( aMousePos ), sHelpText );
332     }
333     */
334 	return 0L;
335 }
336 
ClearAll()337 void SfxConfigFunctionListBox_Impl::ClearAll()
338 /* 	Beschreibung
339 	L"oscht alle Eintr"age in der FunctionListBox, alle UserDaten und alle evtl.
340 	vorhandenen MacroInfos.
341 */
342 {
343 	sal_uInt16 nCount = aArr.Count();
344 	for ( sal_uInt16 i=0; i<nCount; i++ )
345 	{
346 		SfxGroupInfo_Impl *pData = aArr[i];
347 
348 		if ( pData->nKind == SFX_CFGFUNCTION_SCRIPT )
349 		{
350 			String* pScriptURI = (String*)pData->pObject;
351 			delete pScriptURI;
352 		}
353 
354 		if  (   pData->nKind == SFX_CFGGROUP_SCRIPTCONTAINER
355             )
356 		{
357 			XInterface* xi = static_cast<XInterface *>(pData->pObject);
358 			if (xi != NULL)
359 			{
360 				xi->release();
361 			}
362 		}
363 
364 		delete pData;
365 	}
366 
367 	aArr.Remove( 0, nCount );
368 	Clear();
369 }
370 
GetSelectedScriptURI()371 String SfxConfigFunctionListBox_Impl::GetSelectedScriptURI()
372 {
373 	SvLBoxEntry *pEntry = FirstSelected();
374 	if ( pEntry )
375 	{
376 		SfxGroupInfo_Impl *pData = (SfxGroupInfo_Impl*) pEntry->GetUserData();
377 		if ( pData && ( pData->nKind == SFX_CFGFUNCTION_SCRIPT ) )
378 			return *(String*)pData->pObject;
379 	}
380 	return String();
381 }
382 
GetCurCommand()383 String SfxConfigFunctionListBox_Impl::GetCurCommand()
384 {
385 	SvLBoxEntry *pEntry = FirstSelected();
386     if (!pEntry)
387         return String();
388 	SfxGroupInfo_Impl *pData = (SfxGroupInfo_Impl*) pEntry->GetUserData();
389     if (!pData)
390         return String();
391     return pData->sCommand;
392 }
393 
GetCurLabel()394 String SfxConfigFunctionListBox_Impl::GetCurLabel()
395 {
396 	SvLBoxEntry *pEntry = FirstSelected();
397     if (!pEntry)
398         return String();
399 	SfxGroupInfo_Impl *pData = (SfxGroupInfo_Impl*) pEntry->GetUserData();
400     if (!pData)
401         return String();
402     if (pData->sLabel.Len())
403         return pData->sLabel;
404     return pData->sCommand;
405 }
406 
FunctionSelected()407 void SfxConfigFunctionListBox_Impl::FunctionSelected()
408 /*	Beschreibung
409 	Setzt die Balloonhelp zur"uck, da diese immer den Helptext des selektierten
410 	Entry anzeigen soll.
411 */
412 {
413     /* --> PB 2004-12-01 #i37000# - no own help text needed any longer
414     Help::ShowBalloon( this, Point(), String() );
415     */
416 }
417 
SetStylesInfo(SfxStylesInfo_Impl * pStyles)418 void SfxConfigFunctionListBox_Impl::SetStylesInfo(SfxStylesInfo_Impl* pStyles)
419 {
420     pStylesInfo = pStyles;
421 }
422 
423 struct SvxConfigGroupBoxResource_Impl : public Resource
424 {
425     Image m_hdImage;
426     Image m_hdImage_hc;
427     Image m_libImage;
428     Image m_libImage_hc;
429     Image m_macImage;
430     Image m_macImage_hc;
431     Image m_docImage;
432     Image m_docImage_hc;
433     ::rtl::OUString m_sMyMacros;
434     ::rtl::OUString m_sProdMacros;
435 	String m_sMacros;
436 	String m_sDlgMacros;
437 	String m_aHumanAppName;
438 	String m_aStrGroupStyles;
439 	Image m_collapsedImage;
440 	Image m_collapsedImage_hc;
441 	Image m_expandedImage;
442 	Image m_expandedImage_hc;
443 
444     SvxConfigGroupBoxResource_Impl();
445 };
446 
SvxConfigGroupBoxResource_Impl()447 SvxConfigGroupBoxResource_Impl::SvxConfigGroupBoxResource_Impl() :
448     Resource(CUI_RES(RID_SVXPAGE_CONFIGGROUPBOX)),
449     m_hdImage(CUI_RES(IMG_HARDDISK)),
450     m_hdImage_hc(CUI_RES(IMG_HARDDISK_HC)),
451     m_libImage(CUI_RES(IMG_LIB)),
452     m_libImage_hc(CUI_RES(IMG_LIB_HC)),
453     m_macImage(CUI_RES(IMG_MACRO)),
454     m_macImage_hc(CUI_RES(IMG_MACRO_HC)),
455     m_docImage(CUI_RES(IMG_DOC)),
456     m_docImage_hc(CUI_RES(IMG_DOC_HC)),
457     m_sMyMacros(String(CUI_RES(STR_MYMACROS))),
458     m_sProdMacros(String(CUI_RES(STR_PRODMACROS))),
459     m_sMacros(String(CUI_RES(STR_BASICMACROS))),
460     m_sDlgMacros(String(CUI_RES(STR_DLG_MACROS))),
461 	m_aHumanAppName(String(CUI_RES(STR_HUMAN_APPNAME))),
462 	m_aStrGroupStyles(String(CUI_RES(STR_GROUP_STYLES))),
463 	m_collapsedImage(CUI_RES(BMP_COLLAPSED)),
464 	m_collapsedImage_hc(CUI_RES(BMP_COLLAPSED_HC)),
465 	m_expandedImage(CUI_RES(BMP_EXPANDED)),
466 	m_expandedImage_hc(CUI_RES(BMP_EXPANDED_HC))
467 {
468     FreeResource();
469 }
470 
SfxConfigGroupListBox_Impl(Window * pParent,const ResId & rResId,sal_uLong nConfigMode)471 SfxConfigGroupListBox_Impl::SfxConfigGroupListBox_Impl(
472 	Window* pParent, const ResId& rResId, sal_uLong nConfigMode )
473 		: SvTreeListBox( pParent, rResId )
474 		, pImp(new SvxConfigGroupBoxResource_Impl()), pFunctionListBox(0), nMode( nConfigMode ), pStylesInfo(0)
475 {
476     SetStyle( GetStyle() | WB_CLIPCHILDREN | WB_HSCROLL | WB_HASBUTTONS | WB_HASLINES | WB_HASLINESATROOT | WB_HASBUTTONSATROOT );
477 	SetNodeBitmaps( pImp->m_collapsedImage, pImp->m_expandedImage, BMP_COLOR_NORMAL );
478 	SetNodeBitmaps( pImp->m_collapsedImage_hc, pImp->m_expandedImage_hc, BMP_COLOR_HIGHCONTRAST );
479 }
480 
481 
~SfxConfigGroupListBox_Impl()482 SfxConfigGroupListBox_Impl::~SfxConfigGroupListBox_Impl()
483 {
484 	ClearAll();
485 }
486 
ClearAll()487 void SfxConfigGroupListBox_Impl::ClearAll()
488 {
489 	sal_uInt16 nCount = aArr.Count();
490 	for ( sal_uInt16 i=0; i<nCount; i++ )
491 	{
492 		SfxGroupInfo_Impl *pData = aArr[i];
493 		if  (   pData->nKind == SFX_CFGGROUP_SCRIPTCONTAINER
494             )
495 		{
496 			XInterface* xi = static_cast<XInterface *>(pData->pObject);
497 			if (xi != NULL)
498 			{
499 				xi->release();
500 			}
501 		}
502 		delete pData;
503 	}
504 
505 	aArr.Remove( 0, nCount );
506 	Clear();
507 }
508 
SetStylesInfo(SfxStylesInfo_Impl * pStyles)509 void SfxConfigGroupListBox_Impl::SetStylesInfo(SfxStylesInfo_Impl* pStyles)
510 {
511     pStylesInfo = pStyles;
512 }
513 
GetGroup()514 String SfxConfigGroupListBox_Impl::GetGroup()
515 /*	Beschreibung
516 	Gibt den Namen der selektierten Funktionsgruppe bzw. des selektierten
517 	Basics zur"uck.
518 */
519 {
520     SvLBoxEntry *pEntry = FirstSelected();
521     while ( pEntry )
522     {
523         SfxGroupInfo_Impl *pInfo = (SfxGroupInfo_Impl*) pEntry->GetUserData();
524 	    if ( pInfo->nKind == SFX_CFGGROUP_FUNCTION )
525             return GetEntryText( pEntry );
526 
527         pEntry = GetParent( pEntry );
528     }
529 
530     return String();
531 }
532 
533 //-----------------------------------------------
InitModule()534 void SfxConfigGroupListBox_Impl::InitModule()
535 {
536     try
537     {
538         css::uno::Reference< css::frame::XDispatchInformationProvider > xProvider(m_xFrame, css::uno::UNO_QUERY_THROW);
539         css::uno::Sequence< sal_Int16 > lGroups = xProvider->getSupportedCommandGroups();
540         sal_Int32                       c1      = lGroups.getLength();
541         sal_Int32                       i1      = 0;
542 
543         for (i1=0; i1<c1; ++i1)
544         {
545             sal_Int16&      rGroupID   = lGroups[i1];
546             ::rtl::OUString sGroupID   = ::rtl::OUString::valueOf((sal_Int32)rGroupID);
547             ::rtl::OUString sGroupName ;
548 
549             try
550             {
551                 m_xModuleCategoryInfo->getByName(sGroupID) >>= sGroupName;
552                 if (!sGroupName.getLength())
553                     continue;
554             }
555             catch(const css::container::NoSuchElementException&)
556                 { continue; }
557 
558             SvLBoxEntry*        pEntry = InsertEntry(sGroupName, NULL);
559             SfxGroupInfo_Impl* pInfo   = new SfxGroupInfo_Impl(SFX_CFGGROUP_FUNCTION, rGroupID);
560             pEntry->SetUserData(pInfo);
561         }
562     }
563     catch(const css::uno::RuntimeException& exRun)
564         { throw exRun; }
565     catch(const css::uno::Exception&)
566         {}
567 }
568 
569 //-----------------------------------------------
InitBasic()570 void SfxConfigGroupListBox_Impl::InitBasic()
571 {
572 }
573 
574 //-----------------------------------------------
InitStyles()575 void SfxConfigGroupListBox_Impl::InitStyles()
576 {
577 }
578 
579 //-----------------------------------------------
580 namespace
581 {
582     //...........................................
583     /** examines a component whether it supports XEmbeddedScripts, or provides access to such a
584         component by implementing XScriptInvocationContext.
585         @return
586             the model which supports the embedded scripts, or <NULL/> if it cannot find such a
587             model
588     */
lcl_getDocumentWithScripts_throw(const Reference<XInterface> & _rxComponent)589     static Reference< XModel > lcl_getDocumentWithScripts_throw( const Reference< XInterface >& _rxComponent )
590     {
591         Reference< XEmbeddedScripts > xScripts( _rxComponent, UNO_QUERY );
592         if ( !xScripts.is() )
593         {
594             Reference< XScriptInvocationContext > xContext( _rxComponent, UNO_QUERY );
595             if ( xContext.is() )
596                 xScripts.set( xContext->getScriptContainer(), UNO_QUERY );
597         }
598 
599         return Reference< XModel >( xScripts, UNO_QUERY );
600     }
601 
602     //...........................................
lcl_getScriptableDocument_nothrow(const Reference<XFrame> & _rxFrame)603     static Reference< XModel > lcl_getScriptableDocument_nothrow( const Reference< XFrame >& _rxFrame )
604     {
605         Reference< XModel > xDocument;
606 
607         // examine our associated frame
608         try
609         {
610             OSL_ENSURE( _rxFrame.is(), "lcl_getScriptableDocument_nothrow: you need to pass a frame to this dialog/tab page!" );
611             if ( _rxFrame.is() )
612             {
613                 // first try the model in the frame
614                 Reference< XController > xController( _rxFrame->getController(), UNO_SET_THROW );
615                 xDocument = lcl_getDocumentWithScripts_throw( xController->getModel() );
616 
617                 if ( !xDocument.is() )
618                 {
619                     // if there is no suitable document in the frame, try the controller
620                     xDocument = lcl_getDocumentWithScripts_throw( _rxFrame->getController() );
621                 }
622             }
623         }
624         catch( const Exception& )
625         {
626         	//DBG_UNHANDLED_EXCEPTION();
627         }
628 
629         return xDocument;
630     }
631 }
632 
633 //-----------------------------------------------
Init(const css::uno::Reference<css::lang::XMultiServiceFactory> & xSMGR,const css::uno::Reference<css::frame::XFrame> & xFrame,const::rtl::OUString & sModuleLongName)634 void SfxConfigGroupListBox_Impl::Init(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR          ,
635                                       const css::uno::Reference< css::frame::XFrame >&              xFrame         ,
636                                       const ::rtl::OUString&                                        sModuleLongName)
637 {
638 	SetUpdateMode(sal_False);
639 	ClearAll(); // Remove all old entries from treelist box
640 
641     m_xFrame = xFrame;
642     if ( xSMGR.is())
643     {
644         m_xSMGR           = xSMGR;
645         m_sModuleLongName = sModuleLongName;
646 
647         m_xGlobalCategoryInfo = css::uno::Reference< css::container::XNameAccess >(m_xSMGR->createInstance(SERVICE_UICATEGORYDESCRIPTION), css::uno::UNO_QUERY_THROW);
648         m_xModuleCategoryInfo = css::uno::Reference< css::container::XNameAccess >(m_xGlobalCategoryInfo->getByName(m_sModuleLongName)   , css::uno::UNO_QUERY_THROW);
649         m_xUICmdDescription   = css::uno::Reference< css::container::XNameAccess >(m_xSMGR->createInstance(SERVICE_UICMDDESCRIPTION)     , css::uno::UNO_QUERY_THROW);
650 
651         InitModule();
652         InitBasic();
653         InitStyles();
654     }
655 
656     OSL_TRACE("** ** About to initialise SF Scripts");
657 	// Add Scripting Framework entries
658 	Reference< browse::XBrowseNode > rootNode;
659     Reference< XComponentContext > xCtx;
660 	try
661 	{
662 		Reference < beans::XPropertySet > xProps(
663 			::comphelper::getProcessServiceFactory(), UNO_QUERY_THROW );
664 		xCtx.set( xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), UNO_QUERY_THROW );
665 		Reference< browse::XBrowseNodeFactory > xFac( xCtx->getValueByName(
666 			::rtl::OUString::createFromAscii( "/singletons/com.sun.star.script.browse.theBrowseNodeFactory") ), UNO_QUERY_THROW );
667 		rootNode.set( xFac->createView( browse::BrowseNodeFactoryViewTypes::MACROSELECTOR ) );
668 		//rootNode.set( xFac->createView( browse::BrowseNodeFactoryViewTypes::MACROORGANIZER ) );
669 	}
670 	catch( Exception& e )
671 	{
672 		OSL_TRACE(" Caught some exception whilst retrieving browse nodes from factory... Exception: %s",
673 			::rtl::OUStringToOString( e.Message , RTL_TEXTENCODING_ASCII_US ).pData->buffer );
674 		// TODO exception handling
675 	}
676 
677 
678 	if ( rootNode.is() )
679 	{
680 		if ( nMode )
681 		{
682 				//We call acquire on the XBrowseNode so that it does not
683 				//get autodestructed and become invalid when accessed later.
684 			rootNode->acquire();
685 
686 			SfxGroupInfo_Impl *pInfo =
687 				new SfxGroupInfo_Impl( SFX_CFGGROUP_SCRIPTCONTAINER, 0,
688 					static_cast<void *>(rootNode.get()));
689 
690 			String aTitle(pImp->m_sDlgMacros);
691 			SvLBoxEntry *pNewEntry = InsertEntry( aTitle, NULL );
692 			pNewEntry->SetUserData( pInfo );
693 			pNewEntry->EnableChildsOnDemand( sal_True );
694 			aArr.Insert( pInfo, aArr.Count() );
695 		}
696 		else
697 		{
698 			 //We are only showing scripts not slot APIs so skip
699 			 //Root node and show location nodes
700 			try {
701 				if ( rootNode->hasChildNodes() )
702 				{
703 					Sequence< Reference< browse::XBrowseNode > > children =
704 						rootNode->getChildNodes();
705 					sal_Bool bIsRootNode = sal_False;
706 
707 					::rtl::OUString user = ::rtl::OUString::createFromAscii("user");
708 					::rtl::OUString share = ::rtl::OUString::createFromAscii("share");
709 					if ( rootNode->getName().equals(::rtl::OUString::createFromAscii("Root") ))
710 					{
711 						bIsRootNode = sal_True;
712 					}
713 
714 					//To mimic current starbasic behaviour we
715 					//need to make sure that only the current document
716 					//is displayed in the config tree. Tests below
717 					//set the bDisplay flag to FALSE if the current
718 					//node is a first level child of the Root and is NOT
719 					//either the current document, user or share
720 					::rtl::OUString currentDocTitle;
721                     Reference< XModel > xDocument( lcl_getScriptableDocument_nothrow( m_xFrame ) );
722                     if ( xDocument.is() )
723                     {
724                         currentDocTitle = ::comphelper::DocumentInfo::getDocumentTitle( xDocument );
725 					}
726 
727                     for ( sal_Int32 n = 0; n < children.getLength(); n++ )
728 					{
729 						Reference< browse::XBrowseNode >& theChild = children[n];
730 						sal_Bool bDisplay = sal_True;
731                         ::rtl::OUString uiName = theChild->getName();
732 						if ( bIsRootNode )
733 						{
734 							if (  ! ((theChild->getName().equals( user )  || theChild->getName().equals( share ) ||
735 								theChild->getName().equals( currentDocTitle ) ) ) )
736 							{
737 								bDisplay=sal_False;
738 							}
739                             else
740                             {
741                                 if ( uiName.equals( user ) )
742                                 {
743                                     uiName = pImp->m_sMyMacros;
744                                 }
745                                 else if ( uiName.equals( share ) )
746                                 {
747                                     uiName = pImp->m_sProdMacros;
748                                 }
749                             }
750 						}
751 						if (children[n]->getType() != browse::BrowseNodeTypes::SCRIPT  && bDisplay )
752 						{
753 
754 //									We call acquire on the XBrowseNode so that it does not
755 //									get autodestructed and become invalid when accessed later.
756 							theChild->acquire();
757 
758 							SfxGroupInfo_Impl* pInfo =
759 								new SfxGroupInfo_Impl(SFX_CFGGROUP_SCRIPTCONTAINER,
760 									0, static_cast<void *>( theChild.get()));
761 
762                             Image aImage = GetImage( theChild, xCtx, bIsRootNode,BMP_COLOR_NORMAL );
763 							SvLBoxEntry* pNewEntry =
764 								InsertEntry( uiName, NULL);
765                             SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL);
766                             SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL);
767                             aImage = GetImage( theChild, xCtx, bIsRootNode,BMP_COLOR_HIGHCONTRAST );
768                             SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST);
769                             SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST);
770 
771 							pNewEntry->SetUserData( pInfo );
772 							aArr.Insert( pInfo, aArr.Count() );
773 
774 							if ( children[n]->hasChildNodes() )
775 							{
776 								Sequence< Reference< browse::XBrowseNode > > grandchildren =
777 									children[n]->getChildNodes();
778 
779                                 for ( sal_Int32 m = 0; m < grandchildren.getLength(); m++ )
780 								{
781 									if ( grandchildren[m]->getType() == browse::BrowseNodeTypes::CONTAINER )
782 									{
783 										pNewEntry->EnableChildsOnDemand( sal_True );
784 										m = grandchildren.getLength();
785 									}
786 								}
787 							}
788 						}
789 					}
790 				}
791 			}
792             catch (RuntimeException&) {
793 				// do nothing, the entry will not be displayed in the UI
794 			}
795 		}
796 	}
797 
798     // add styles
799     if ( m_xSMGR.is() )
800     {
801         String sStyle( pImp->m_aStrGroupStyles );
802         SvLBoxEntry *pEntry = InsertEntry( sStyle, 0 );
803         SfxGroupInfo_Impl *pInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_STYLES, 0, 0 ); // TODO last parameter should contain user data
804         aArr.Insert( pInfo, aArr.Count() );
805         pEntry->SetUserData( pInfo );
806         pEntry->EnableChildsOnDemand( sal_True );
807     }
808 
809 	MakeVisible( GetEntry( 0,0 ) );
810 	SetUpdateMode( sal_True );
811 }
GetImage(Reference<browse::XBrowseNode> node,Reference<XComponentContext> xCtx,bool bIsRootNode,bool bHighContrast)812 Image SfxConfigGroupListBox_Impl::GetImage( Reference< browse::XBrowseNode > node, Reference< XComponentContext > xCtx, bool bIsRootNode, bool bHighContrast )
813 {
814     Image aImage;
815     if ( bIsRootNode )
816     {
817         ::rtl::OUString user = ::rtl::OUString::createFromAscii("user");
818         ::rtl::OUString share = ::rtl::OUString::createFromAscii("share");
819         if (node->getName().equals( user ) || node->getName().equals(share ) )
820         {
821             if( bHighContrast == BMP_COLOR_NORMAL )
822                 aImage = pImp->m_hdImage;
823             else
824 				aImage = pImp->m_hdImage_hc;
825         }
826         else
827         {
828             ::rtl::OUString factoryURL;
829             ::rtl::OUString nodeName = node->getName();
830             Reference<XInterface> xDocumentModel = getDocumentModel(xCtx, nodeName );
831             if ( xDocumentModel.is() )
832             {
833                 Reference< ::com::sun::star::frame::XModuleManager >
834                     xModuleManager(
835                         xCtx->getServiceManager()
836                             ->createInstanceWithContext(
837                                 ::rtl::OUString::createFromAscii("" // xxx todo
838                                       "com.sun.star.frame.ModuleManager"),
839                                 xCtx ),
840                             UNO_QUERY_THROW );
841                 Reference<container::XNameAccess> xModuleConfig(
842                     xModuleManager, UNO_QUERY_THROW );
843                 // get the long name of the document:
844                 ::rtl::OUString appModule( xModuleManager->identify(
845                                     xDocumentModel ) );
846                 Sequence<beans::PropertyValue> moduleDescr;
847                 Any aAny = xModuleConfig->getByName(appModule);
848                 if( sal_True != ( aAny >>= moduleDescr ) )
849                 {
850                     throw RuntimeException(::rtl::OUString::createFromAscii("SFTreeListBox::Init: failed to get PropertyValue"), Reference< XInterface >());
851                 }
852                 beans::PropertyValue const * pmoduleDescr =
853                     moduleDescr.getConstArray();
854                 for ( sal_Int32 pos = moduleDescr.getLength(); pos--; )
855                 {
856                     if (pmoduleDescr[ pos ].Name.equalsAsciiL(
857                             RTL_CONSTASCII_STRINGPARAM(
858                                 "ooSetupFactoryEmptyDocumentURL") ))
859                     {
860                         pmoduleDescr[ pos ].Value >>= factoryURL;
861                         OSL_TRACE("factory url for doc images is %s",
862                         ::rtl::OUStringToOString( factoryURL , RTL_TEXTENCODING_ASCII_US ).pData->buffer );
863                         break;
864                     }
865                 }
866             }
867             if( factoryURL.getLength() > 0 )
868             {
869                 if( bHighContrast == BMP_COLOR_NORMAL )
870                     aImage = SvFileInformationManager::GetFileImage(
871                         INetURLObject(factoryURL), false,
872                         BMP_COLOR_NORMAL );
873                 else
874                     aImage = SvFileInformationManager::GetFileImage(
875                         INetURLObject(factoryURL), false,
876                         BMP_COLOR_HIGHCONTRAST );
877             }
878             else
879             {
880                 if( bHighContrast == BMP_COLOR_NORMAL )
881                     aImage = pImp->m_docImage;
882                 else
883                     aImage = pImp->m_docImage_hc;
884             }
885         }
886     }
887     else
888     {
889         if( node->getType() == browse::BrowseNodeTypes::SCRIPT )
890         {
891             if( bHighContrast == BMP_COLOR_NORMAL )
892                 aImage = pImp->m_macImage;
893             else
894                 aImage = pImp->m_macImage_hc;
895         }
896         else
897         {
898             if( bHighContrast == BMP_COLOR_NORMAL )
899                 aImage = pImp->m_libImage;
900             else
901                 aImage = pImp->m_libImage_hc;
902         }
903     }
904     return aImage;
905 }
906 
907 Reference< XInterface  >
getDocumentModel(Reference<XComponentContext> & xCtx,::rtl::OUString & docName)908 SfxConfigGroupListBox_Impl::getDocumentModel( Reference< XComponentContext >& xCtx, ::rtl::OUString& docName )
909 {
910     Reference< XInterface > xModel;
911     Reference< lang::XMultiComponentFactory > mcf =
912             xCtx->getServiceManager();
913     Reference< frame::XDesktop > desktop (
914         mcf->createInstanceWithContext(
915             ::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop"),                 xCtx ),
916             UNO_QUERY );
917 
918     Reference< container::XEnumerationAccess > componentsAccess =
919         desktop->getComponents();
920     Reference< container::XEnumeration > components =
921         componentsAccess->createEnumeration();
922     while (components->hasMoreElements())
923     {
924         Reference< frame::XModel > model(
925             components->nextElement(), UNO_QUERY );
926         if ( model.is() )
927         {
928             ::rtl::OUString sTdocUrl =
929                 ::comphelper::DocumentInfo::getDocumentTitle( model );
930             if( sTdocUrl.equals( docName ) )
931             {
932                 xModel = model;
933                 break;
934             }
935         }
936     }
937     return xModel;
938 }
939 
940 //-----------------------------------------------
MapCommand2UIName(const::rtl::OUString & sCommand)941 ::rtl::OUString SfxConfigGroupListBox_Impl::MapCommand2UIName(const ::rtl::OUString& sCommand)
942 {
943     ::rtl::OUString sUIName;
944     try
945     {
946         css::uno::Reference< css::container::XNameAccess > xModuleConf;
947         m_xUICmdDescription->getByName(m_sModuleLongName) >>= xModuleConf;
948         if (xModuleConf.is())
949         {
950             ::comphelper::SequenceAsHashMap lProps(xModuleConf->getByName(sCommand));
951             sUIName = lProps.getUnpackedValueOrDefault(::rtl::OUString::createFromAscii("Name"), ::rtl::OUString());
952         }
953     }
954     catch(const css::uno::RuntimeException& exRun)
955         { throw exRun; }
956     catch(css::uno::Exception&)
957         { sUIName = ::rtl::OUString(); }
958 
959     // fallback for missing UINames !?
960     if (!sUIName.getLength())
961     {
962         sUIName = sCommand;
963         /*
964         #if OSL_DEBUG_LEVEL > 1
965         ::rtl::OUStringBuffer sMsg(256);
966         sMsg.appendAscii("There is no UIName for the internal command \"");
967         sMsg.append     (sCommand                                        );
968         sMsg.appendAscii("\". The UI will be invalid then ..."           );
969         OSL_ENSURE(sal_False, ::rtl::OUStringToOString(sMsg.makeStringAndClear(), RTL_TEXTENCODING_UTF8).getStr());
970         #endif
971         */
972     }
973 
974     return sUIName;
975 }
976 
977 //-----------------------------------------------
GroupSelected()978 void SfxConfigGroupListBox_Impl::GroupSelected()
979 /*	Beschreibung
980 	Eine Funktionsgruppe oder eine Basicmodul wurde selektiert. Alle Funktionen bzw.
981 	Macros werden in der Functionlistbox anzeigt.
982 */
983 {
984 	SvLBoxEntry *pEntry = FirstSelected();
985 	SfxGroupInfo_Impl *pInfo = (SfxGroupInfo_Impl*) pEntry->GetUserData();
986 	pFunctionListBox->SetUpdateMode(sal_False);
987 	pFunctionListBox->ClearAll();
988 	if ( pInfo->nKind != SFX_CFGGROUP_FUNCTION &&
989 			 pInfo->nKind != SFX_CFGGROUP_SCRIPTCONTAINER &&
990              pInfo->nKind != SFX_CFGGROUP_STYLES )
991 	{
992 		pFunctionListBox->SetUpdateMode(sal_True);
993 		return;
994 	}
995 
996 	switch ( pInfo->nKind )
997 	{
998 		case SFX_CFGGROUP_FUNCTION :
999 		{
1000 			sal_uInt16                                                          nGroup    = pInfo->nUniqueID;
1001             css::uno::Reference< css::frame::XDispatchInformationProvider > xProvider (m_xFrame, css::uno::UNO_QUERY_THROW);
1002             css::uno::Sequence< css::frame::DispatchInformation >           lCommands = xProvider->getConfigurableDispatchInformation(nGroup);
1003             sal_Int32                                                       c         = lCommands.getLength();
1004             sal_Int32                                                       i         = 0;
1005 
1006             for (i=0; i<c; ++i)
1007             {
1008                 const css::frame::DispatchInformation& rInfo      = lCommands[i];
1009                 ::rtl::OUString                        sUIName    = MapCommand2UIName(rInfo.Command);
1010                 SvLBoxEntry*                           pFuncEntry = pFunctionListBox->InsertEntry(sUIName, NULL);
1011                 SfxGroupInfo_Impl*                     pGrpInfo   = new SfxGroupInfo_Impl(SFX_CFGFUNCTION_SLOT, 0);
1012                 pGrpInfo->sCommand = rInfo.Command;
1013                 pGrpInfo->sLabel   = sUIName;
1014                 pFuncEntry->SetUserData(pGrpInfo);
1015             }
1016 
1017 			break;
1018 		}
1019 
1020 		case SFX_CFGGROUP_SCRIPTCONTAINER:
1021 		{
1022 			if ( !GetChildCount( pEntry ) )
1023 			{
1024 				Reference< browse::XBrowseNode > rootNode(
1025 					reinterpret_cast< browse::XBrowseNode* >( pInfo->pObject ) ) ;
1026 
1027 				try {
1028 					if ( rootNode->hasChildNodes() )
1029 					{
1030 						Sequence< Reference< browse::XBrowseNode > > children =
1031 							rootNode->getChildNodes();
1032 
1033                         for ( sal_Int32 n = 0; n < children.getLength(); n++ )
1034 						{
1035 							if (children[n]->getType() == browse::BrowseNodeTypes::SCRIPT)
1036 							{
1037 								::rtl::OUString uri;
1038 
1039 								Reference < beans::XPropertySet >xPropSet( children[n], UNO_QUERY );
1040 								if (!xPropSet.is())
1041 								{
1042 									continue;
1043 								}
1044 
1045 								Any value =
1046 									xPropSet->getPropertyValue( String::CreateFromAscii( "URI" ) );
1047 								value >>= uri;
1048 
1049 								String* pScriptURI = new String( uri );
1050 								SfxGroupInfo_Impl* pGrpInfo = new SfxGroupInfo_Impl( SFX_CFGFUNCTION_SCRIPT, 0, pScriptURI );
1051 
1052                                 Image aImage = GetImage( children[n], Reference< XComponentContext >(), sal_False, BMP_COLOR_NORMAL );
1053 								SvLBoxEntry* pNewEntry =
1054 									pFunctionListBox->InsertEntry( children[n]->getName(), NULL );
1055                                 pFunctionListBox->SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL);
1056                                 pFunctionListBox->SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL);
1057                                 aImage = GetImage( children[n], Reference< XComponentContext >(), sal_False, BMP_COLOR_HIGHCONTRAST );
1058                                 pFunctionListBox->SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST);
1059                                 pFunctionListBox->SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST);
1060 
1061                                 pGrpInfo->sCommand = uri;
1062                                 pGrpInfo->sLabel = children[n]->getName();
1063 								pNewEntry->SetUserData( pGrpInfo );
1064 
1065 								pFunctionListBox->aArr.Insert(
1066 									pGrpInfo, pFunctionListBox->aArr.Count() );
1067 
1068 							}
1069 						}
1070 					}
1071 				}
1072                 catch (RuntimeException&) {
1073 					// do nothing, the entry will not be displayed in the UI
1074 				}
1075 			}
1076 			break;
1077 		}
1078 
1079 		case SFX_CFGGROUP_STYLES :
1080 		{
1081             SfxStyleInfo_Impl* pFamily = (SfxStyleInfo_Impl*)(pInfo->pObject);
1082             if (pFamily)
1083             {
1084                 const ::std::vector< SfxStyleInfo_Impl > lStyles = pStylesInfo->getStyles(pFamily->sFamily);
1085                 ::std::vector< SfxStyleInfo_Impl >::const_iterator pIt;
1086                 for (  pIt  = lStyles.begin();
1087                        pIt != lStyles.end()  ;
1088                      ++pIt                   )
1089                 {
1090                     SfxStyleInfo_Impl* pStyle = new SfxStyleInfo_Impl(*pIt);
1091 				    SvLBoxEntry* pFuncEntry = pFunctionListBox->InsertEntry( pStyle->sLabel, NULL );
1092 				    SfxGroupInfo_Impl *pGrpInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_STYLES, 0, pStyle );
1093 				    pFunctionListBox->aArr.Insert( pGrpInfo, pFunctionListBox->aArr.Count() );
1094                     pGrpInfo->sCommand = pStyle->sCommand;
1095                     pGrpInfo->sLabel = pStyle->sLabel;
1096 				    pFuncEntry->SetUserData( pGrpInfo );
1097                 }
1098             }
1099             break;
1100         }
1101 
1102 		default:
1103 			return;
1104 	}
1105 
1106 	if ( pFunctionListBox->GetEntryCount() )
1107 		pFunctionListBox->Select( pFunctionListBox->GetEntry( 0, 0 ) );
1108 
1109 	pFunctionListBox->SetUpdateMode(sal_True);
1110 }
1111 
Expand(SvLBoxEntry * pParent)1112 sal_Bool SfxConfigGroupListBox_Impl::Expand( SvLBoxEntry* pParent )
1113 {
1114 	sal_Bool bRet = SvTreeListBox::Expand( pParent );
1115 	if ( bRet )
1116 	{
1117 		// Wieviele Entries k"onnen angezeigt werden ?
1118 		sal_uLong nEntries = GetOutputSizePixel().Height() / GetEntryHeight();
1119 
1120 		// Wieviele Kinder sollen angezeigt werden ?
1121 		sal_uLong nChildCount = GetVisibleChildCount( pParent );
1122 
1123 		// Passen alle Kinder und der parent gleichzeitig in die View ?
1124 		if ( nChildCount+1 > nEntries )
1125 		{
1126 			// Wenn nicht, wenigstens parent ganz nach oben schieben
1127 			MakeVisible( pParent, sal_True );
1128 		}
1129 		else
1130 		{
1131 			// An welcher relativen ViewPosition steht der aufzuklappende parent
1132 			SvLBoxEntry *pEntry = GetFirstEntryInView();
1133 			sal_uLong nParentPos = 0;
1134 			while ( pEntry && pEntry != pParent )
1135 			{
1136 				nParentPos++;
1137 				pEntry = GetNextEntryInView( pEntry );
1138 			}
1139 
1140 			// Ist unter dem parent noch genug Platz f"ur alle Kinder ?
1141 			if ( nParentPos + nChildCount + 1 > nEntries )
1142 				ScrollOutputArea( (short)( nEntries - ( nParentPos + nChildCount + 1 ) ) );
1143 		}
1144 	}
1145 
1146 	return bRet;
1147 }
1148 
RequestingChilds(SvLBoxEntry * pEntry)1149 void SfxConfigGroupListBox_Impl::RequestingChilds( SvLBoxEntry *pEntry )
1150 /*	Beschreibung
1151 	Ein Basic oder eine Bibliothek werden ge"offnet
1152 */
1153 {
1154 	SfxGroupInfo_Impl *pInfo = (SfxGroupInfo_Impl*) pEntry->GetUserData();
1155 	pInfo->bWasOpened = sal_True;
1156 	switch ( pInfo->nKind )
1157 	{
1158 		case SFX_CFGGROUP_SCRIPTCONTAINER:
1159 		{
1160 			if ( !GetChildCount( pEntry ) )
1161 			{
1162 				Reference< browse::XBrowseNode > rootNode(
1163 					reinterpret_cast< browse::XBrowseNode* >( pInfo->pObject ) ) ;
1164 
1165 				try {
1166 					if ( rootNode->hasChildNodes() )
1167 					{
1168 						Sequence< Reference< browse::XBrowseNode > > children =
1169 							rootNode->getChildNodes();
1170 						sal_Bool bIsRootNode = sal_False;
1171 
1172 						::rtl::OUString user = ::rtl::OUString::createFromAscii("user");
1173 						::rtl::OUString share = ::rtl::OUString::createFromAscii("share");
1174 						if ( rootNode->getName().equals(::rtl::OUString::createFromAscii("Root") ))
1175 						{
1176 							bIsRootNode = sal_True;
1177 						}
1178 
1179 						/* To mimic current starbasic behaviour we
1180 						need to make sure that only the current document
1181 						is displayed in the config tree. Tests below
1182 						set the bDisplay flag to sal_False if the current
1183 						node is a first level child of the Root and is NOT
1184 						either the current document, user or share */
1185 						::rtl::OUString currentDocTitle;
1186                         Reference< XModel > xDocument( lcl_getScriptableDocument_nothrow( m_xFrame ) );
1187                         if ( xDocument.is() )
1188                         {
1189                             currentDocTitle = ::comphelper::DocumentInfo::getDocumentTitle( xDocument );
1190 						}
1191 
1192 						sal_Int32 nLen = children.getLength();
1193                         for ( sal_Int32 n = 0; n < nLen; n++ )
1194 						{
1195 							Reference< browse::XBrowseNode >& theChild = children[n];
1196 							::rtl::OUString aName( theChild->getName() );
1197 							sal_Bool bDisplay = sal_True;
1198 							if ( bIsRootNode )
1199 							{
1200 								if ( !( (aName.equals(user) || aName.equals(share) || aName.equals(currentDocTitle) ) ) )
1201 									bDisplay=sal_False;
1202 							}
1203 							if ( children[n].is() && children[n]->getType() != browse::BrowseNodeTypes::SCRIPT && bDisplay )
1204 							{
1205 
1206 								/*
1207 									We call acquire on the XBrowseNode so that it does not
1208 									get autodestructed and become invalid when accessed later.
1209 								*/
1210 								theChild->acquire();
1211 
1212 								SfxGroupInfo_Impl* pGrpInfo =
1213 									new SfxGroupInfo_Impl(SFX_CFGGROUP_SCRIPTCONTAINER,
1214 										0, static_cast<void *>( theChild.get()));
1215 
1216                                 Image aImage = GetImage( theChild, Reference< XComponentContext >(), sal_False, BMP_COLOR_NORMAL );
1217 								SvLBoxEntry* pNewEntry =
1218 									InsertEntry( theChild->getName(), pEntry );
1219                                 SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL);
1220                                 SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_NORMAL);
1221                                 aImage = GetImage( theChild, Reference< XComponentContext >(), sal_False, BMP_COLOR_HIGHCONTRAST );
1222                                 SetExpandedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST);
1223                                 SetCollapsedEntryBmp(pNewEntry, aImage, BMP_COLOR_HIGHCONTRAST);
1224 
1225 								pNewEntry->SetUserData( pGrpInfo );
1226 								aArr.Insert( pGrpInfo, aArr.Count() );
1227 
1228 								if ( children[n]->hasChildNodes() )
1229 								{
1230 									Sequence< Reference< browse::XBrowseNode > > grandchildren =
1231 										children[n]->getChildNodes();
1232 
1233                                     for ( sal_Int32 m = 0; m < grandchildren.getLength(); m++ )
1234 									{
1235 										if ( grandchildren[m]->getType() == browse::BrowseNodeTypes::CONTAINER )
1236 										{
1237 											pNewEntry->EnableChildsOnDemand( sal_True );
1238 											m = grandchildren.getLength();
1239 										}
1240 									}
1241 								}
1242 							}
1243 						}
1244 					}
1245 				}
1246                 catch (RuntimeException&) {
1247 					// do nothing, the entry will not be displayed in the UI
1248 				}
1249 			}
1250 			break;
1251 		}
1252 
1253 		case SFX_CFGGROUP_STYLES:
1254 		{
1255 			if ( !GetChildCount( pEntry ) )
1256 			{
1257                 const ::std::vector< SfxStyleInfo_Impl >                 lStyleFamilies = pStylesInfo->getStyleFamilies();
1258                       ::std::vector< SfxStyleInfo_Impl >::const_iterator pIt;
1259 				for (  pIt  = lStyleFamilies.begin();
1260 				       pIt != lStyleFamilies.end()  ;
1261                      ++pIt                          )
1262 				{
1263                     SfxStyleInfo_Impl* pFamily = new SfxStyleInfo_Impl(*pIt);
1264                     SvLBoxEntry* pStyleEntry = InsertEntry( pFamily->sLabel, pEntry );
1265 					SfxGroupInfo_Impl *pGrpInfo = new SfxGroupInfo_Impl( SFX_CFGGROUP_STYLES, 0, pFamily );
1266 					aArr.Insert( pGrpInfo, aArr.Count() );
1267 					pStyleEntry->SetUserData( pGrpInfo );
1268 					pStyleEntry->EnableChildsOnDemand( sal_False );
1269 				}
1270 			}
1271             break;
1272         }
1273 
1274 		default:
1275 			DBG_ERROR( "Falscher Gruppentyp!" );
1276 			break;
1277 	}
1278 }
1279 
SelectMacro(const SfxMacroInfoItem * pItem)1280 void SfxConfigGroupListBox_Impl::SelectMacro( const SfxMacroInfoItem *pItem )
1281 {
1282 	SelectMacro( pItem->GetBasicManager()->GetName(),
1283 				 pItem->GetQualifiedName() );
1284 }
1285 
SelectMacro(const String & rBasic,const String & rMacro)1286 void SfxConfigGroupListBox_Impl::SelectMacro( const String& rBasic,
1287 		 const String& rMacro )
1288 {
1289 	String aBasicName( rBasic );
1290 	aBasicName += ' ';
1291 	aBasicName += pImp->m_sMacros;
1292 	String aLib, aModule, aMethod;
1293 	sal_uInt16 nCount = rMacro.GetTokenCount('.');
1294 	aMethod = rMacro.GetToken( nCount-1, '.' );
1295 	if ( nCount > 2 )
1296 	{
1297 		aLib = rMacro.GetToken( 0, '.' );
1298 		aModule = rMacro.GetToken( nCount-2, '.' );
1299 	}
1300 
1301 	SvLBoxEntry *pEntry = FirstChild(0);
1302 	while ( pEntry )
1303 	{
1304 		String aEntryBas = GetEntryText( pEntry );
1305 		if ( aEntryBas == aBasicName )
1306 		{
1307 			Expand( pEntry );
1308 			SvLBoxEntry *pLib = FirstChild( pEntry );
1309 			while ( pLib )
1310 			{
1311 				String aEntryLib = GetEntryText( pLib );
1312 				if ( aEntryLib == aLib )
1313 				{
1314 					Expand( pLib );
1315 					SvLBoxEntry *pMod = FirstChild( pLib );
1316 					while ( pMod )
1317 					{
1318 						String aEntryMod = GetEntryText( pMod );
1319 						if ( aEntryMod == aModule )
1320 						{
1321 							Expand( pMod );
1322 							MakeVisible( pMod );
1323 							Select( pMod );
1324 							SvLBoxEntry *pMethod = pFunctionListBox->First();
1325 							while ( pMethod )
1326 							{
1327 								String aEntryMethod = GetEntryText( pMethod );
1328 								if ( aEntryMethod == aMethod )
1329 								{
1330 									pFunctionListBox->Select( pMethod );
1331 									pFunctionListBox->MakeVisible( pMethod );
1332 									return;
1333 								}
1334 								pMethod = pFunctionListBox->Next( pMethod );
1335 							}
1336 						}
1337 						pMod = NextSibling( pMod );
1338 					}
1339 				}
1340 				pLib = NextSibling( pLib );
1341 			}
1342 		}
1343 		pEntry = NextSibling( pEntry );
1344 	}
1345 }
1346