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