Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <vcl/help.hxx>
21 : #include <vcl/msgbox.hxx>
22 : #include <vcl/metric.hxx>
23 : #include <vcl/vclmedit.hxx>
24 : #include "selector.hxx"
25 : #include <dialmgr.hxx>
26 : #include <svx/fmresids.hrc>
27 : #include <svx/dialmgr.hxx>
28 : #include <cuires.hrc>
29 : #include <sfx2/app.hxx>
30 : #include <sfx2/msg.hxx>
31 : #include <sfx2/msgpool.hxx>
32 : #include <sfx2/minfitem.hxx>
33 : #include <sfx2/objsh.hxx>
34 : #include <sfx2/dispatch.hxx>
35 :
36 : #include <comphelper/documentinfo.hxx>
37 : #include <comphelper/processfactory.hxx>
38 :
39 : #include <com/sun/star/beans/XPropertySet.hpp>
40 : #include <com/sun/star/container/XChild.hpp>
41 : #include <com/sun/star/container/XEnumerationAccess.hpp>
42 : #include <com/sun/star/container/XEnumeration.hpp>
43 : #include <com/sun/star/document/XEmbeddedScripts.hpp>
44 : #include <com/sun/star/document/XScriptInvocationContext.hpp>
45 : #include <com/sun/star/frame/ModuleManager.hpp>
46 : #include <com/sun/star/frame/Desktop.hpp>
47 : #include <com/sun/star/frame/XDispatchInformationProvider.hpp>
48 : #include <com/sun/star/frame/DispatchInformation.hpp>
49 : #include <com/sun/star/frame/theUICommandDescription.hpp>
50 : #include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
51 : #include <com/sun/star/script/provider/XScriptProvider.hpp>
52 : #include <com/sun/star/script/browse/theBrowseNodeFactory.hpp>
53 : #include <com/sun/star/script/browse/XBrowseNode.hpp>
54 : #include <com/sun/star/script/browse/BrowseNodeTypes.hpp>
55 : #include <com/sun/star/script/browse/XBrowseNodeFactory.hpp>
56 : #include <com/sun/star/script/browse/BrowseNodeFactoryViewTypes.hpp>
57 : #include <com/sun/star/ui/theUICategoryDescription.hpp>
58 :
59 :
60 : using namespace ::com::sun::star;
61 : using namespace ::com::sun::star::uno;
62 : using namespace ::com::sun::star::script;
63 : using namespace ::com::sun::star::frame;
64 : using namespace ::com::sun::star::document;
65 : using namespace ::com::sun::star::container;
66 :
67 : #include <svtools/imagemgr.hxx>
68 : #include "svtools/treelistentry.hxx"
69 : #include <tools/urlobj.hxx>
70 : #include <tools/diagnose_ex.h>
71 :
72 : /*
73 : * The implementations of SvxConfigFunctionListBox and
74 : * SvxConfigGroupListBox are copied from sfx2/source/dialog/cfg.cxx
75 : */
76 0 : SvxConfigFunctionListBox::SvxConfigFunctionListBox(vcl::Window* pParent, WinBits nStyle)
77 : : SvTreeListBox(pParent, nStyle | WB_CLIPCHILDREN | WB_HSCROLL | WB_SORT | WB_TABSTOP)
78 : , pCurEntry(0)
79 0 : , m_pDraggingEntry(0)
80 : {
81 0 : GetModel()->SetSortMode( SortAscending );
82 :
83 : // Timer for the BallonHelp
84 0 : aTimer.SetTimeout( 200 );
85 : aTimer.SetTimeoutHdl(
86 0 : LINK( this, SvxConfigFunctionListBox, TimerHdl ) );
87 0 : }
88 :
89 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSvxConfigFunctionListBox(vcl::Window *pParent, VclBuilder::stringmap &rMap)
90 : {
91 0 : WinBits nWinBits = WB_TABSTOP;
92 :
93 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
94 0 : if (!sBorder.isEmpty())
95 0 : nWinBits |= WB_BORDER;
96 :
97 0 : return new SvxConfigFunctionListBox(pParent, nWinBits);
98 : }
99 :
100 0 : SvxConfigFunctionListBox::~SvxConfigFunctionListBox()
101 : {
102 0 : ClearAll();
103 0 : }
104 :
105 0 : SvTreeListEntry* SvxConfigFunctionListBox::GetLastSelectedEntry()
106 : {
107 0 : if ( m_pDraggingEntry != NULL )
108 : {
109 0 : return m_pDraggingEntry;
110 : }
111 : else
112 : {
113 0 : return FirstSelected();
114 : }
115 : }
116 :
117 0 : void SvxConfigFunctionListBox::MouseMove( const MouseEvent& rMEvt )
118 : {
119 0 : Point aMousePos = rMEvt.GetPosPixel();
120 0 : pCurEntry = GetCurEntry();
121 :
122 0 : if ( pCurEntry && GetEntry( aMousePos ) == pCurEntry )
123 0 : aTimer.Start();
124 : else
125 : {
126 0 : Help::ShowBalloon( this, aMousePos, OUString() );
127 0 : aTimer.Stop();
128 : }
129 0 : }
130 :
131 :
132 0 : IMPL_LINK_NOARG(SvxConfigFunctionListBox, TimerHdl)
133 : {
134 0 : aTimer.Stop();
135 0 : Point aMousePos = GetPointerPosPixel();
136 0 : SvTreeListEntry *pEntry = GetCurEntry();
137 0 : if ( pEntry && GetEntry( aMousePos ) == pEntry && pCurEntry == pEntry )
138 0 : Help::ShowBalloon( this, OutputToScreenPixel( aMousePos ), GetHelpText( pEntry ) );
139 0 : return 0L;
140 : }
141 :
142 0 : void SvxConfigFunctionListBox::ClearAll()
143 : {
144 0 : aArr.clear();
145 0 : Clear();
146 0 : }
147 :
148 0 : OUString SvxConfigFunctionListBox::GetHelpText( SvTreeListEntry *pEntry )
149 : {
150 : SvxGroupInfo_Impl *pInfo =
151 0 : pEntry ? (SvxGroupInfo_Impl*) pEntry->GetUserData(): 0;
152 :
153 0 : if ( pInfo )
154 : {
155 0 : if ( pInfo->nKind == SVX_CFGFUNCTION_SLOT )
156 : {
157 0 : OUString aCmdURL( pInfo->sURL );
158 :
159 0 : OUString aHelpText = Application::GetHelp()->GetHelpText( aCmdURL, this );
160 :
161 0 : return aHelpText;
162 : }
163 0 : else if ( pInfo->nKind == SVX_CFGFUNCTION_SCRIPT )
164 : {
165 0 : return pInfo->sHelpText;
166 : }
167 : }
168 :
169 0 : return OUString();
170 : }
171 :
172 0 : void SvxConfigFunctionListBox::FunctionSelected()
173 : {
174 0 : Help::ShowBalloon( this, Point(), OUString() );
175 0 : }
176 :
177 : // drag and drop support
178 0 : DragDropMode SvxConfigFunctionListBox::NotifyStartDrag(
179 : TransferDataContainer& /*aTransferDataContainer*/, SvTreeListEntry* pEntry )
180 : {
181 0 : m_pDraggingEntry = pEntry;
182 0 : return GetDragDropMode();
183 : }
184 :
185 0 : void SvxConfigFunctionListBox::DragFinished( sal_Int8 /*nDropAction*/ )
186 : {
187 0 : m_pDraggingEntry = NULL;
188 0 : }
189 :
190 : sal_Int8
191 0 : SvxConfigFunctionListBox::AcceptDrop( const AcceptDropEvent& /*rEvt*/ )
192 : {
193 0 : return DND_ACTION_NONE;
194 : }
195 :
196 0 : SvxConfigGroupListBox::SvxConfigGroupListBox(vcl::Window* pParent, WinBits nStyle)
197 : : SvTreeListBox(pParent, nStyle |
198 : WB_CLIPCHILDREN | WB_HSCROLL | WB_HASBUTTONS | WB_HASLINES | WB_HASLINESATROOT | WB_HASBUTTONSATROOT | WB_TABSTOP)
199 : , m_bShowSlots(false)
200 : , pFunctionListBox(NULL)
201 : , m_pImageProvider(NULL)
202 0 : , m_hdImage(CUI_RES(RID_CUIIMG_HARDDISK))
203 0 : , m_libImage(CUI_RES(RID_CUIIMG_LIB))
204 0 : , m_macImage(CUI_RES(RID_CUIIMG_MACRO))
205 0 : , m_docImage(CUI_RES(RID_CUIIMG_DOC))
206 0 : , m_sMyMacros(CUI_RESSTR(RID_SVXSTR_MYMACROS))
207 0 : , m_sProdMacros(CUI_RESSTR(RID_SVXSTR_PRODMACROS))
208 : {
209 0 : ImageList aNavigatorImages( SVX_RES( RID_SVXIMGLIST_FMEXPL ) );
210 :
211 : SetNodeBitmaps(
212 : aNavigatorImages.GetImage( RID_SVXIMG_COLLAPSEDNODE ),
213 : aNavigatorImages.GetImage( RID_SVXIMG_EXPANDEDNODE )
214 0 : );
215 0 : }
216 :
217 0 : extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeSvxConfigGroupListBox(vcl::Window *pParent, VclBuilder::stringmap &rMap)
218 : {
219 0 : WinBits nWinBits = WB_TABSTOP;
220 :
221 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
222 0 : if (!sBorder.isEmpty())
223 0 : nWinBits |= WB_BORDER;
224 :
225 0 : return new SvxConfigGroupListBox(pParent, nWinBits);
226 : }
227 :
228 0 : SvxConfigGroupListBox::~SvxConfigGroupListBox()
229 : {
230 0 : ClearAll();
231 0 : }
232 :
233 0 : void SvxConfigGroupListBox::ClearAll()
234 : {
235 0 : aArr.clear();
236 0 : Clear();
237 0 : }
238 :
239 :
240 : namespace
241 : {
242 :
243 : /** examines a component whether it supports XEmbeddedScripts, or provides access to such a
244 : component by implementing XScriptInvocationContext.
245 : @return
246 : the model which supports the embedded scripts, or <NULL/> if it cannot find such a
247 : model
248 : */
249 0 : static Reference< XModel > lcl_getDocumentWithScripts_throw( const Reference< XInterface >& _rxComponent )
250 : {
251 0 : Reference< XEmbeddedScripts > xScripts( _rxComponent, UNO_QUERY );
252 0 : if ( !xScripts.is() )
253 : {
254 0 : Reference< XScriptInvocationContext > xContext( _rxComponent, UNO_QUERY );
255 0 : if ( xContext.is() )
256 0 : xScripts.set( xContext->getScriptContainer(), UNO_QUERY );
257 : }
258 :
259 0 : return Reference< XModel >( xScripts, UNO_QUERY );
260 : }
261 :
262 :
263 0 : static Reference< XModel > lcl_getScriptableDocument_nothrow( const Reference< XFrame >& _rxFrame )
264 : {
265 0 : Reference< XModel > xDocument;
266 :
267 : // examine our associated frame
268 : try
269 : {
270 : OSL_ENSURE( _rxFrame.is(), "lcl_getScriptableDocument_nothrow: you need to pass a frame to this dialog/tab page!" );
271 0 : if ( _rxFrame.is() )
272 : {
273 : // first try the model in the frame
274 0 : Reference< XController > xController( _rxFrame->getController(), UNO_SET_THROW );
275 0 : xDocument = lcl_getDocumentWithScripts_throw( xController->getModel() );
276 :
277 0 : if ( !xDocument.is() )
278 : {
279 : // if there is no suitable document in the frame, try the controller
280 0 : xDocument = lcl_getDocumentWithScripts_throw( _rxFrame->getController() );
281 0 : }
282 : }
283 : }
284 0 : catch( const Exception& )
285 : {
286 : DBG_UNHANDLED_EXCEPTION();
287 : }
288 :
289 0 : return xDocument;
290 : }
291 : }
292 :
293 0 : void SvxConfigGroupListBox::fillScriptList( const Reference< browse::XBrowseNode >& _rxRootNode, SvTreeListEntry* _pParentEntry, bool _bCheapChildrenOnDemand )
294 : {
295 : OSL_PRECOND( _rxRootNode.is(), "SvxConfigGroupListBox::fillScriptList: invalid root node!" );
296 0 : if ( !_rxRootNode.is() )
297 0 : return;
298 :
299 : try
300 : {
301 0 : if ( _rxRootNode->hasChildNodes() )
302 : {
303 : Sequence< Reference< browse::XBrowseNode > > children =
304 0 : _rxRootNode->getChildNodes();
305 :
306 0 : bool bIsRootNode = _rxRootNode->getName() == "Root";
307 :
308 : /* To mimic current starbasic behaviour we
309 : need to make sure that only the current document
310 : is displayed in the config tree. Tests below
311 : set the bDisplay flag to sal_False if the current
312 : node is a first level child of the Root and is NOT
313 : either the current document, user or share */
314 0 : OUString sCurrentDocTitle;
315 0 : Reference< XModel > xWorkingDocument = lcl_getScriptableDocument_nothrow( m_xFrame );
316 0 : if ( xWorkingDocument.is() )
317 : {
318 0 : sCurrentDocTitle = ::comphelper::DocumentInfo::getDocumentTitle( xWorkingDocument );
319 : }
320 :
321 0 : for ( long n = 0; n < children.getLength(); ++n )
322 : {
323 0 : Reference< browse::XBrowseNode >& theChild = children[n];
324 : //#139111# some crash reports show that it might be unset
325 0 : if ( !theChild.is() )
326 0 : continue;
327 0 : OUString sUIName = theChild->getName();
328 0 : bool bDisplay = true;
329 :
330 0 : if ( bIsRootNode
331 0 : || ( m_bShowSlots && _pParentEntry && ( GetModel()->GetDepth( _pParentEntry ) == 0 ) )
332 : // if we show slots (as in the customize dialog)
333 : // then the user & share are added at depth=1
334 : )
335 : {
336 0 : if ( sUIName == "user" )
337 : {
338 0 : sUIName = m_sMyMacros;
339 0 : bIsRootNode = true;
340 : }
341 0 : else if ( sUIName == "share" )
342 : {
343 0 : sUIName = m_sProdMacros;
344 0 : bIsRootNode = true;
345 : }
346 0 : else if ( !sUIName.equals( sCurrentDocTitle ) )
347 : {
348 0 : bDisplay = false;
349 : }
350 : }
351 :
352 0 : if ( !bDisplay )
353 0 : continue;
354 :
355 0 : if ( children[n]->getType() == browse::BrowseNodeTypes::SCRIPT )
356 0 : continue;
357 :
358 0 : SvTreeListEntry* pNewEntry = InsertEntry( sUIName, _pParentEntry );
359 :
360 0 : Image aImage = GetImage( theChild, comphelper::getProcessComponentContext(), bIsRootNode );
361 0 : SetExpandedEntryBmp( pNewEntry, aImage );
362 0 : SetCollapsedEntryBmp( pNewEntry, aImage );
363 :
364 : SvxGroupInfo_Impl* pInfo =
365 0 : new SvxGroupInfo_Impl( SVX_CFGGROUP_SCRIPTCONTAINER, 0, theChild );
366 0 : pNewEntry->SetUserData( pInfo );
367 0 : aArr.push_back( pInfo );
368 :
369 0 : if ( _bCheapChildrenOnDemand )
370 : {
371 : /* i30923 - Would be nice if there was a better
372 : * way to determine if a basic lib had children
373 : * without having to ask for them (which forces
374 : * the library to be loaded */
375 0 : pNewEntry->EnableChildrenOnDemand( true );
376 : }
377 : else
378 : {
379 : // if there are granchildren we're interested in, display the '+' before
380 : // the entry, but do not yet expand
381 : Sequence< Reference< browse::XBrowseNode > > grandchildren =
382 0 : children[n]->getChildNodes();
383 :
384 0 : for ( sal_Int32 m = 0; m < grandchildren.getLength(); ++m )
385 : {
386 0 : if ( grandchildren[m]->getType() == browse::BrowseNodeTypes::CONTAINER )
387 : {
388 0 : pNewEntry->EnableChildrenOnDemand( true );
389 0 : break;
390 : }
391 0 : }
392 : }
393 0 : }
394 : }
395 : }
396 0 : catch (const Exception&)
397 : {
398 : DBG_UNHANDLED_EXCEPTION();
399 : }
400 : }
401 :
402 0 : void SvxConfigGroupListBox::Init(bool bShowSlots, const Reference< frame::XFrame >& xFrame)
403 : {
404 0 : m_bShowSlots = bShowSlots;
405 0 : m_xFrame.set(xFrame);
406 :
407 0 : SetUpdateMode(false);
408 0 : ClearAll();
409 :
410 : Reference< XComponentContext > xContext(
411 0 : comphelper::getProcessComponentContext() );
412 :
413 : // are we showing builtin commands?
414 0 : if ( m_bShowSlots && m_xFrame.is() )
415 : {
416 : Reference< frame::XDispatchInformationProvider > xDIP(
417 0 : m_xFrame, UNO_QUERY );
418 :
419 0 : Reference< frame::XModuleManager2 > xModuleManager( frame::ModuleManager::create(xContext) );
420 :
421 0 : OUString aModuleId;
422 : try{
423 0 : aModuleId = xModuleManager->identify( m_xFrame );
424 0 : }catch(const uno::Exception&)
425 0 : { aModuleId = OUString(); }
426 :
427 : Reference< container::XNameAccess > const xNameAccess(
428 0 : frame::theUICommandDescription::get(xContext) );
429 0 : xNameAccess->getByName( aModuleId ) >>= m_xModuleCommands;
430 :
431 : Reference< container::XNameAccess > xAllCategories =
432 0 : ui::theUICategoryDescription::get( xContext );
433 :
434 0 : Reference< container::XNameAccess > xModuleCategories;
435 0 : if ( !aModuleId.isEmpty() )
436 : {
437 : try
438 : {
439 0 : xModuleCategories = Reference< container::XNameAccess >(
440 0 : xAllCategories->getByName( aModuleId ), UNO_QUERY );
441 : }
442 0 : catch ( container::NoSuchElementException& )
443 : {
444 : }
445 : }
446 :
447 0 : if ( !xModuleCategories.is() )
448 : {
449 0 : xModuleCategories = xAllCategories;
450 : }
451 :
452 0 : if ( xModuleCategories.is() )
453 : {
454 : Sequence< sal_Int16 > gids =
455 0 : xDIP->getSupportedCommandGroups();
456 :
457 0 : for ( sal_Int32 i = 0; i < gids.getLength(); ++i )
458 : {
459 0 : Sequence< frame::DispatchInformation > commands;
460 : try
461 : {
462 0 : commands =
463 0 : xDIP->getConfigurableDispatchInformation( gids[i] );
464 : }
465 0 : catch ( container::NoSuchElementException& )
466 : {
467 0 : continue;
468 : }
469 :
470 0 : if ( commands.getLength() == 0 )
471 : {
472 0 : continue;
473 : }
474 :
475 0 : sal_Int32 gid = gids[i];
476 0 : OUString idx = OUString::number( gid );
477 0 : OUString group = idx;
478 : try
479 : {
480 0 : xModuleCategories->getByName( idx ) >>= group;
481 : }
482 0 : catch ( container::NoSuchElementException& )
483 : {
484 : }
485 :
486 0 : SvTreeListEntry *pEntry = InsertEntry( group, NULL );
487 :
488 : SvxGroupInfo_Impl *pInfo =
489 0 : new SvxGroupInfo_Impl( SVX_CFGGROUP_FUNCTION, gids[i] );
490 0 : aArr.push_back( pInfo );
491 :
492 0 : pEntry->SetUserData( pInfo );
493 0 : }
494 0 : }
495 : }
496 :
497 : // Add Scripting Framework entries
498 0 : Reference< browse::XBrowseNode > rootNode;
499 :
500 : try
501 : {
502 0 : Reference< browse::XBrowseNodeFactory > xFac = browse::theBrowseNodeFactory::get( xContext );
503 0 : rootNode.set( xFac->createView( browse::BrowseNodeFactoryViewTypes::MACROSELECTOR ) );
504 : }
505 0 : catch( const Exception& )
506 : {
507 : DBG_UNHANDLED_EXCEPTION();
508 : }
509 :
510 0 : if ( rootNode.is() )
511 : {
512 0 : if ( m_bShowSlots )
513 : {
514 : SvxGroupInfo_Impl *pInfo =
515 0 : new SvxGroupInfo_Impl( SVX_CFGGROUP_SCRIPTCONTAINER, 0, rootNode );
516 :
517 0 : OUString aTitle = CUI_RESSTR(RID_SVXSTR_PRODMACROS);
518 :
519 0 : SvTreeListEntry *pNewEntry = InsertEntry( aTitle, NULL );
520 0 : pNewEntry->SetUserData( pInfo );
521 0 : pNewEntry->EnableChildrenOnDemand( true );
522 0 : aArr.push_back( pInfo );
523 : }
524 : else
525 : {
526 0 : fillScriptList( rootNode, NULL, false );
527 : }
528 : }
529 0 : MakeVisible( GetEntry( 0,0 ) );
530 0 : SetUpdateMode( true );
531 0 : }
532 :
533 0 : Image SvxConfigGroupListBox::GetImage(
534 : Reference< browse::XBrowseNode > node,
535 : Reference< XComponentContext > xCtx,
536 : bool bIsRootNode
537 : )
538 : {
539 0 : Image aImage;
540 0 : if ( bIsRootNode )
541 : {
542 0 : if ( node->getName() == "user" || node->getName() == "share" )
543 : {
544 0 : aImage = m_hdImage;
545 : }
546 : else
547 : {
548 0 : OUString factoryURL;
549 0 : OUString nodeName = node->getName();
550 0 : Reference<XInterface> xDocumentModel = getDocumentModel(xCtx, nodeName );
551 0 : if ( xDocumentModel.is() )
552 : {
553 0 : Reference< frame::XModuleManager2 > xModuleManager( frame::ModuleManager::create(xCtx) );
554 : // get the long name of the document:
555 0 : OUString appModule( xModuleManager->identify(
556 0 : xDocumentModel ) );
557 0 : Sequence<beans::PropertyValue> moduleDescr;
558 0 : Any aAny = xModuleManager->getByName(appModule);
559 0 : if( !( aAny >>= moduleDescr ) )
560 : {
561 0 : throw RuntimeException("SFTreeListBox::Init: failed to get PropertyValue");
562 : }
563 : beans::PropertyValue const * pmoduleDescr =
564 0 : moduleDescr.getConstArray();
565 0 : for ( sal_Int32 pos = moduleDescr.getLength(); pos--; )
566 : {
567 0 : if ( pmoduleDescr[ pos ].Name == "ooSetupFactoryEmptyDocumentURL" )
568 : {
569 0 : pmoduleDescr[ pos ].Value >>= factoryURL;
570 0 : break;
571 : }
572 0 : }
573 : }
574 0 : if( !factoryURL.isEmpty() )
575 : {
576 0 : aImage = SvFileInformationManager::GetFileImage( INetURLObject(factoryURL), false );
577 : }
578 : else
579 : {
580 0 : aImage = m_docImage;
581 0 : }
582 : }
583 : }
584 : else
585 : {
586 0 : if( node->getType() == browse::BrowseNodeTypes::SCRIPT )
587 0 : aImage = m_macImage;
588 : else
589 0 : aImage = m_libImage;
590 : }
591 0 : return aImage;
592 : }
593 :
594 : Reference< XInterface >
595 0 : SvxConfigGroupListBox::getDocumentModel(
596 : Reference< XComponentContext >& xCtx, OUString& docName )
597 : {
598 0 : Reference< XInterface > xModel;
599 0 : Reference< frame::XDesktop2 > desktop = Desktop::create(xCtx);
600 :
601 : Reference< container::XEnumerationAccess > componentsAccess =
602 0 : desktop->getComponents();
603 : Reference< container::XEnumeration > components =
604 0 : componentsAccess->createEnumeration();
605 0 : while (components->hasMoreElements())
606 : {
607 : Reference< frame::XModel > model(
608 0 : components->nextElement(), UNO_QUERY );
609 0 : if ( model.is() )
610 : {
611 0 : OUString sTdocUrl = ::comphelper::DocumentInfo::getDocumentTitle( model );
612 0 : if( sTdocUrl.equals( docName ) )
613 : {
614 0 : xModel = model;
615 0 : break;
616 0 : }
617 : }
618 0 : }
619 0 : return xModel;
620 : }
621 :
622 0 : void SvxConfigGroupListBox::GroupSelected()
623 : {
624 0 : SvTreeListEntry *pEntry = FirstSelected();
625 0 : SvxGroupInfo_Impl *pInfo = (SvxGroupInfo_Impl*) pEntry->GetUserData();
626 0 : pFunctionListBox->SetUpdateMode(false);
627 0 : pFunctionListBox->ClearAll();
628 0 : if ( pInfo->nKind != SVX_CFGGROUP_FUNCTION &&
629 0 : pInfo->nKind != SVX_CFGGROUP_SCRIPTCONTAINER )
630 : {
631 0 : pFunctionListBox->SetUpdateMode(true);
632 0 : return;
633 : }
634 :
635 0 : switch ( pInfo->nKind )
636 : {
637 : case SVX_CFGGROUP_FUNCTION :
638 : {
639 0 : SvTreeListEntry *_pEntry = FirstSelected();
640 0 : if ( _pEntry != NULL )
641 : {
642 : SvxGroupInfo_Impl *_pInfo =
643 0 : (SvxGroupInfo_Impl*) _pEntry->GetUserData();
644 :
645 : Reference< frame::XDispatchInformationProvider > xDIP(
646 0 : m_xFrame, UNO_QUERY );
647 :
648 0 : Sequence< frame::DispatchInformation > commands;
649 : try
650 : {
651 0 : commands = xDIP->getConfigurableDispatchInformation(
652 0 : _pInfo->nOrd );
653 : }
654 0 : catch ( container::NoSuchElementException& )
655 : {
656 : }
657 :
658 0 : for ( sal_Int32 i = 0; i < commands.getLength(); ++i )
659 : {
660 0 : if ( commands[i].Command.isEmpty() )
661 : {
662 0 : continue;
663 : }
664 :
665 0 : Image aImage;
666 :
667 0 : OUString aCmdURL( commands[i].Command );
668 :
669 0 : if ( m_pImageProvider )
670 : {
671 0 : aImage = m_pImageProvider->GetImage( aCmdURL );
672 : }
673 :
674 0 : OUString aLabel;
675 : try
676 : {
677 0 : Any a = m_xModuleCommands->getByName( aCmdURL );
678 0 : Sequence< beans::PropertyValue > aPropSeq;
679 :
680 0 : if ( a >>= aPropSeq )
681 : {
682 0 : for ( sal_Int32 k = 0; k < aPropSeq.getLength(); ++k )
683 : {
684 0 : if ( aPropSeq[k].Name == "Name" )
685 : {
686 0 : aPropSeq[k].Value >>= aLabel;
687 0 : break;
688 : }
689 : }
690 0 : }
691 : }
692 0 : catch ( container::NoSuchElementException& )
693 : {
694 : }
695 :
696 0 : if ( aLabel.isEmpty() )
697 : {
698 0 : aLabel = commands[i].Command;
699 : }
700 :
701 0 : SvTreeListEntry* pFuncEntry = NULL;
702 0 : if ( !!aImage )
703 : {
704 : pFuncEntry = pFunctionListBox->InsertEntry(
705 0 : aLabel, aImage, aImage );
706 : }
707 : else
708 : {
709 : pFuncEntry = pFunctionListBox->InsertEntry(
710 0 : aLabel, NULL );
711 : }
712 :
713 : SvxGroupInfo_Impl *_pGroupInfo = new SvxGroupInfo_Impl(
714 0 : SVX_CFGFUNCTION_SLOT, 123, aCmdURL, OUString() );
715 :
716 0 : pFunctionListBox->aArr.push_back( _pGroupInfo );
717 :
718 0 : pFuncEntry->SetUserData( _pGroupInfo );
719 0 : }
720 : }
721 0 : break;
722 : }
723 :
724 : case SVX_CFGGROUP_SCRIPTCONTAINER:
725 : {
726 0 : Reference< browse::XBrowseNode > rootNode( pInfo->xBrowseNode );
727 :
728 : try {
729 0 : if ( rootNode->hasChildNodes() )
730 : {
731 : Sequence< Reference< browse::XBrowseNode > > children =
732 0 : rootNode->getChildNodes();
733 :
734 0 : for ( sal_Int32 n = 0; n < children.getLength(); ++n )
735 : {
736 0 : if (!children[n].is())
737 0 : continue;
738 0 : if (children[n]->getType() == browse::BrowseNodeTypes::SCRIPT)
739 : {
740 0 : OUString uri;
741 0 : OUString description;
742 :
743 0 : Reference < beans::XPropertySet >xPropSet( children[n], UNO_QUERY );
744 0 : if (!xPropSet.is())
745 : {
746 0 : continue;
747 : }
748 :
749 0 : Any value = xPropSet->getPropertyValue(
750 0 : OUString("URI"));
751 0 : value >>= uri;
752 :
753 : try
754 : {
755 0 : value = xPropSet->getPropertyValue(
756 0 : OUString("Description"));
757 0 : value >>= description;
758 : }
759 0 : catch (Exception &) {
760 : // do nothing, the description will be empty
761 : }
762 :
763 : SvxGroupInfo_Impl* _pGroupInfo =
764 : new SvxGroupInfo_Impl(
765 0 : SVX_CFGFUNCTION_SCRIPT, 123, uri, description );
766 :
767 0 : Image aImage = GetImage( children[n], Reference< XComponentContext >(), false );
768 : SvTreeListEntry* pNewEntry =
769 0 : pFunctionListBox->InsertEntry( children[n]->getName(), NULL );
770 0 : pFunctionListBox->SetExpandedEntryBmp( pNewEntry, aImage );
771 0 : pFunctionListBox->SetCollapsedEntryBmp(pNewEntry, aImage );
772 :
773 0 : pNewEntry->SetUserData( _pGroupInfo );
774 :
775 0 : pFunctionListBox->aArr.push_back( _pGroupInfo );
776 :
777 : }
778 0 : }
779 : }
780 : }
781 0 : catch (const Exception&)
782 : {
783 : DBG_UNHANDLED_EXCEPTION();
784 : }
785 0 : break;
786 : }
787 :
788 : default:
789 : {
790 0 : return;
791 : }
792 : }
793 :
794 0 : if ( pFunctionListBox->GetEntryCount() )
795 0 : pFunctionListBox->Select( pFunctionListBox->GetEntry( 0, 0 ) );
796 :
797 0 : pFunctionListBox->SetUpdateMode(true);
798 : }
799 :
800 0 : bool SvxConfigGroupListBox::Expand( SvTreeListEntry* pParent )
801 : {
802 0 : bool bRet = SvTreeListBox::Expand( pParent );
803 0 : if ( bRet )
804 : {
805 0 : sal_uLong nEntries = GetOutputSizePixel().Height() / GetEntryHeight();
806 :
807 0 : sal_uLong nChildCount = GetVisibleChildCount( pParent );
808 :
809 0 : if ( nChildCount+1 > nEntries )
810 : {
811 0 : MakeVisible( pParent, true );
812 : }
813 : else
814 : {
815 0 : SvTreeListEntry *pEntry = GetFirstEntryInView();
816 0 : sal_uLong nParentPos = 0;
817 0 : while ( pEntry && pEntry != pParent )
818 : {
819 0 : ++nParentPos;
820 0 : pEntry = GetNextEntryInView( pEntry );
821 : }
822 :
823 0 : if ( nParentPos + nChildCount + 1 > nEntries )
824 0 : ScrollOutputArea( (short)( nEntries - ( nParentPos + nChildCount + 1 ) ) );
825 : }
826 : }
827 :
828 0 : return bRet;
829 : }
830 :
831 0 : void SvxConfigGroupListBox::RequestingChildren( SvTreeListEntry *pEntry )
832 : {
833 0 : SvxGroupInfo_Impl *pInfo = (SvxGroupInfo_Impl*) pEntry->GetUserData();
834 0 : pInfo->bWasOpened = true;
835 0 : switch ( pInfo->nKind )
836 : {
837 : case SVX_CFGGROUP_SCRIPTCONTAINER:
838 : {
839 0 : if ( !GetChildCount( pEntry ) )
840 : {
841 0 : Reference< browse::XBrowseNode > rootNode( pInfo->xBrowseNode ) ;
842 0 : fillScriptList( rootNode, pEntry, true /* i30923 */ );
843 : }
844 0 : break;
845 : }
846 :
847 : default:
848 : OSL_FAIL( "Falscher Gruppentyp!" );
849 0 : break;
850 : }
851 0 : }
852 :
853 : /*
854 : * Implementation of SvxScriptSelectorDialog
855 : *
856 : * This dialog is used for selecting Slot API commands
857 : * and Scripting Framework Scripts.
858 : */
859 :
860 0 : SvxScriptSelectorDialog::SvxScriptSelectorDialog(
861 : vcl::Window* pParent, bool bShowSlots, const Reference< frame::XFrame >& xFrame)
862 : : ModelessDialog(pParent, "MacroSelectorDialog", "cui/ui/macroselectordialog.ui")
863 0 : , m_bShowSlots(bShowSlots)
864 : {
865 0 : get<FixedText>("libraryft")->Show(!m_bShowSlots);
866 0 : get<FixedText>("categoryft")->Show(m_bShowSlots);
867 0 : get<FixedText>("macronameft")->Show(!m_bShowSlots);
868 0 : get<FixedText>("commandsft")->Show(m_bShowSlots);
869 0 : get(m_pDescriptionText, "description");
870 0 : get(m_pCommands, "commands");
871 0 : if (m_bShowSlots)
872 : {
873 : // If we are showing Slot API commands update labels in the UI, and
874 : // enable drag'n'drop
875 0 : SetText(CUI_RESSTR(RID_SVXSTR_SELECTOR_ADD_COMMANDS));
876 0 : m_pCommands->SetDragDropMode( SV_DRAGDROP_APP_COPY );
877 :
878 0 : get(m_pCancelButton, "close");
879 0 : get(m_pDialogDescription, "helptoolbar");
880 0 : get(m_pOKButton, "add");
881 : }
882 : else
883 : {
884 0 : get(m_pCancelButton, "cancel");
885 0 : get(m_pDialogDescription, "helpmacro");
886 0 : get(m_pOKButton, "ok");
887 : }
888 0 : m_pCancelButton->Show();
889 0 : m_pDialogDescription->Show();
890 0 : m_pOKButton->Show();
891 :
892 0 : get(m_pCategories, "categories");
893 0 : m_pCategories->SetFunctionListBox(m_pCommands);
894 0 : m_pCategories->Init(bShowSlots, xFrame);
895 :
896 : m_pCategories->SetSelectHdl(
897 0 : LINK( this, SvxScriptSelectorDialog, SelectHdl ) );
898 0 : m_pCommands->SetSelectHdl( LINK( this, SvxScriptSelectorDialog, SelectHdl ) );
899 0 : m_pCommands->SetDoubleClickHdl( LINK( this, SvxScriptSelectorDialog, FunctionDoubleClickHdl ) );
900 :
901 0 : m_pOKButton->SetClickHdl( LINK( this, SvxScriptSelectorDialog, ClickHdl ) );
902 0 : m_pCancelButton->SetClickHdl( LINK( this, SvxScriptSelectorDialog, ClickHdl ) );
903 :
904 0 : m_sDefaultDesc = m_pDescriptionText->GetText();
905 :
906 0 : UpdateUI();
907 0 : }
908 :
909 0 : SvxScriptSelectorDialog::~SvxScriptSelectorDialog()
910 : {
911 0 : }
912 :
913 0 : IMPL_LINK( SvxScriptSelectorDialog, SelectHdl, Control*, pCtrl )
914 : {
915 0 : if (pCtrl == m_pCategories)
916 : {
917 0 : m_pCategories->GroupSelected();
918 : }
919 0 : else if (pCtrl == m_pCommands)
920 : {
921 0 : m_pCommands->FunctionSelected();
922 : }
923 0 : UpdateUI();
924 0 : return 0;
925 : }
926 :
927 0 : IMPL_LINK( SvxScriptSelectorDialog, FunctionDoubleClickHdl, Control*, pCtrl )
928 : {
929 : (void)pCtrl;
930 0 : if (m_pOKButton->IsEnabled())
931 0 : return ClickHdl(m_pOKButton);
932 0 : return 0;
933 : }
934 :
935 : // Check if command is selected and enable the OK button accordingly
936 : // Grab the help text for this id if available and update the description field
937 : void
938 0 : SvxScriptSelectorDialog::UpdateUI()
939 : {
940 0 : OUString url = GetScriptURL();
941 0 : if ( url != NULL && !url.isEmpty() )
942 : {
943 : OUString sMessage =
944 0 : m_pCommands->GetHelpText(m_pCommands->FirstSelected());
945 0 : m_pDescriptionText->SetText(sMessage.isEmpty() ? m_sDefaultDesc : sMessage);
946 :
947 0 : m_pOKButton->Enable( true );
948 : }
949 : else
950 : {
951 0 : m_pDescriptionText->SetText(m_sDefaultDesc);
952 0 : m_pOKButton->Enable( false );
953 0 : }
954 0 : }
955 :
956 0 : IMPL_LINK( SvxScriptSelectorDialog, ClickHdl, Button *, pButton )
957 : {
958 0 : if (pButton == m_pCancelButton)
959 : {
960 : // If we are displaying Slot API commands then the dialog is being
961 : // run from Tools/Configure and we should not close it, just hide it
962 0 : if ( m_bShowSlots == false )
963 : {
964 0 : EndDialog( RET_CANCEL );
965 : }
966 : else
967 : {
968 0 : Hide();
969 : }
970 : }
971 0 : else if (pButton == m_pOKButton)
972 : {
973 0 : GetAddHdl().Call( this );
974 :
975 : // If we are displaying Slot API commands then this the dialog is being
976 : // run from Tools/Configure and we should not close it
977 0 : if ( m_bShowSlots == false )
978 : {
979 0 : EndDialog( RET_OK );
980 : }
981 : else
982 : {
983 : // Select the next entry in the list if possible
984 0 : SvTreeListEntry* current = m_pCommands->FirstSelected();
985 0 : SvTreeListEntry* next = m_pCommands->NextSibling( current );
986 :
987 0 : if ( next != NULL )
988 : {
989 0 : m_pCommands->Select( next );
990 : }
991 : }
992 : }
993 :
994 0 : return 0;
995 : }
996 :
997 : void
998 0 : SvxScriptSelectorDialog::SetRunLabel()
999 : {
1000 0 : m_pOKButton->SetText(CUI_RESSTR(RID_SVXSTR_SELECTOR_RUN));
1001 0 : }
1002 :
1003 : void
1004 0 : SvxScriptSelectorDialog::SetDialogDescription( const OUString& rDescription )
1005 : {
1006 0 : m_pDialogDescription->SetText( rDescription );
1007 0 : }
1008 :
1009 : OUString
1010 0 : SvxScriptSelectorDialog::GetScriptURL() const
1011 : {
1012 0 : OUString result;
1013 :
1014 0 : SvTreeListEntry *pEntry = const_cast< SvxScriptSelectorDialog* >( this )->m_pCommands->GetLastSelectedEntry();
1015 0 : if ( pEntry )
1016 : {
1017 0 : SvxGroupInfo_Impl *pData = (SvxGroupInfo_Impl*) pEntry->GetUserData();
1018 0 : if ( ( pData->nKind == SVX_CFGFUNCTION_SLOT )
1019 0 : || ( pData->nKind == SVX_CFGFUNCTION_SCRIPT )
1020 : )
1021 : {
1022 0 : result = pData->sURL;
1023 : }
1024 : }
1025 :
1026 0 : return result;
1027 : }
1028 :
1029 : OUString
1030 0 : SvxScriptSelectorDialog::GetSelectedDisplayName()
1031 : {
1032 0 : return m_pCommands->GetEntryText( m_pCommands->GetLastSelectedEntry() );
1033 0 : }
1034 :
1035 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|