25#include <com/sun/star/document/XEmbeddedScripts.hpp>
26#include <com/sun/star/frame/XModel.hpp>
27#include <com/sun/star/reflection/ProxyFactory.hpp>
29#include <com/sun/star/script/provider/theMasterScriptProviderFactory.hpp>
30#include <com/sun/star/script/browse/BrowseNodeFactoryViewTypes.hpp>
31#include <com/sun/star/script/browse/BrowseNodeTypes.hpp>
52class BrowseNodeAggregator :
53 public ::cppu::WeakImplHelper< browse::XBrowseNode >
57 std::vector< Reference< browse::XBrowseNode > >
m_Nodes;
61 explicit BrowseNodeAggregator(
const Reference< browse::XBrowseNode >& node )
68 void addBrowseNode(
const Reference< browse::XBrowseNode>& node )
74 SAL_CALL getName()
override
79 virtual Sequence< Reference< browse::XBrowseNode > > SAL_CALL
80 getChildNodes()
override
82 std::vector< Sequence< Reference < browse::XBrowseNode > > > seqs;
85 sal_Int32 numChildren = 0;
87 for (Reference<XBrowseNode> & xNode :
m_Nodes)
89 Sequence< Reference < browse::XBrowseNode > > children;
92 children = xNode->getChildNodes();
93 seqs.push_back( children );
94 numChildren += children.getLength();
103 Sequence< Reference < browse::XBrowseNode > >
result( numChildren );
105 for (
const Sequence< Reference < browse::XBrowseNode > >& children : seqs )
107 std::copy(children.begin(), children.end(), std::next(
result.getArray(), index));
108 index += children.getLength();
110 if (index >= numChildren)
117 hasChildNodes()
override
119 for (Reference<XBrowseNode> & xNode :
m_Nodes)
123 if ( xNode->hasChildNodes() )
138 virtual sal_Int16 SAL_CALL
getType()
override
140 return browse::BrowseNodeTypes::CONTAINER;
146 bool operator()( std::u16string_view a, std::u16string_view b )
148 return a.compare( b ) < 0;
151class LocationBrowseNode :
152 public ::cppu::WeakImplHelper< browse::XBrowseNode >
155 std::optional<std::unordered_map< OUString, Reference< browse::XBrowseNode > >>
m_hBNA;
162 explicit LocationBrowseNode(
const Reference< browse::XBrowseNode >& node )
171 virtual OUString SAL_CALL getName()
override
176 virtual Sequence< Reference< browse::XBrowseNode > > SAL_CALL
177 getChildNodes()
override
184 Sequence< Reference< browse::XBrowseNode > > children(
m_hBNA->size() );
185 auto childrenRange = asNonConstRange(children);
188 for (
const auto& str :
m_vStr )
190 childrenRange[
index ].set(
m_hBNA->find( str )->second );
197 virtual sal_Bool SAL_CALL hasChildNodes()
override
202 virtual sal_Int16 SAL_CALL
getType()
override
204 return browse::BrowseNodeTypes::CONTAINER;
209 void loadChildNodes()
213 const Sequence< Reference< browse::XBrowseNode > > langNodes =
216 for (
const auto& rLangNode : langNodes )
218 Reference< browse::XBrowseNode > xbn;
219 if ( rLangNode->getName() ==
"uno_packages" )
221 xbn.set(
new LocationBrowseNode( rLangNode ) );
225 xbn.set( rLangNode );
228 const Sequence< Reference< browse::XBrowseNode > > grandchildren =
229 xbn->getChildNodes();
231 for (
const Reference< browse::XBrowseNode >& grandchild : grandchildren )
234 m_hBNA->find( grandchild->getName() );
236 if ( h_it !=
m_hBNA->end() )
238 BrowseNodeAggregator* bna =
static_cast< BrowseNodeAggregator*
>( h_it->second.get() );
239 bna->addBrowseNode( grandchild );
243 Reference< browse::XBrowseNode > bna(
244 new BrowseNodeAggregator( grandchild ) );
245 (*m_hBNA)[ grandchild->getName() ].set( bna );
246 m_vStr.push_back( grandchild->getName() );
251 ::std::sort(
m_vStr.begin(),
m_vStr.end(), alphaSort() );
255std::vector< Reference< browse::XBrowseNode > > getAllBrowseNodes(
const Reference< XComponentContext >& xCtx )
258 MiscUtils::allOpenTDocUrls( xCtx );
260 Reference< provider::XScriptProviderFactory > xFac;
261 sal_Int32 initialSize = openDocs.getLength() + 2;
262 sal_Int32 mspIndex = 0;
264 std::vector< Reference < browse::XBrowseNode > > locnBNs( initialSize );
267 xFac = provider::theMasterScriptProviderFactory::get( xCtx );
269 locnBNs[ mspIndex++ ].set( xFac->createScriptProvider(
Any( OUString(
"user") ) ), UNO_QUERY_THROW );
270 locnBNs[ mspIndex++ ].set( xFac->createScriptProvider(
Any( OUString(
"share") ) ), UNO_QUERY_THROW );
273 catch(
const Exception& )
276 locnBNs.resize( mspIndex );
280 for (
const auto& rDoc : openDocs )
287 css::uno::Reference< css::frame::XController > xCurrentController =
model->getCurrentController();
288 if( xCurrentController.is() )
291 bool bDefault =
false;
294 if( !bHidden && !bPreview )
296 Reference< document::XEmbeddedScripts > xScripts(
model, UNO_QUERY );
298 locnBNs[ mspIndex++ ].set( xFac->createScriptProvider(
Any(
model ) ), UNO_QUERY_THROW );
302 catch(
const Exception& )
309 std::vector< Reference < browse::XBrowseNode > > locnBNs_Return( mspIndex );
310 for ( sal_Int32 j = 0; j < mspIndex; j++ )
311 locnBNs_Return[j] = locnBNs[j];
313 return locnBNs_Return;
322struct alphaSortForBNodes
324 bool operator()(
const Reference< browse::XBrowseNode >&
a,
const Reference< browse::XBrowseNode >& b )
326 return a->getName().compareTo( b->getName() ) < 0;
336class DefaultBrowseNode :
349 OSL_ENSURE(
m_xWrappedBrowseNode.is(),
"DefaultBrowseNode::DefaultBrowseNode(): No BrowseNode to wrap" );
350 OSL_ENSURE(
m_xWrappedTypeProv.is(),
"DefaultBrowseNode::DefaultBrowseNode(): No BrowseNode to wrap" );
351 OSL_ENSURE(
m_xCtx.is(),
"DefaultBrowseNode::DefaultBrowseNode(): No ComponentContext" );
355 Reference< reflection::XProxyFactory > xProxyFac =
356 reflection::ProxyFactory::create(
m_xCtx );
359 catch( uno::Exception& )
364 "DefaultBrowseNode::DefaultBrowseNode: Wrapped BrowseNode cannot be aggregated!" );
383 virtual ~DefaultBrowseNode()
override
391 virtual Sequence< Reference< browse::XBrowseNode > > SAL_CALL
392 getChildNodes()
override
394 if ( hasChildNodes() )
397 const Sequence < Reference< browse::XBrowseNode > > nodes =
399 for (
const Reference< browse::XBrowseNode >& xBrowseNode : nodes )
401 OSL_ENSURE( xBrowseNode.is(),
"DefaultBrowseNode::getChildNodes(): Invalid BrowseNode" );
402 if( xBrowseNode.is() )
403 aVNodes.push_back(
new DefaultBrowseNode(
m_xCtx, xBrowseNode ) );
406 ::std::sort( aVNodes.begin(), aVNodes.end(), alphaSortForBNodes() );
407 Sequence < Reference< browse::XBrowseNode > > children( aVNodes.size() );
408 auto childrenRange = asNonConstRange(children);
410 for (
const auto& rxNode : aVNodes )
412 childrenRange[
i ].set( rxNode );
421 Sequence < Reference< browse::XBrowseNode > >
none;
426 virtual sal_Int16 SAL_CALL
getType()
override
432 SAL_CALL getName()
override
438 hasChildNodes()
override
446 Any aRet = t_BrowseNodeBase::queryInterface( aType );
447 if ( aRet.hasValue() )
463 virtual Sequence< Type > SAL_CALL getTypes()
override
469 return css::uno::Sequence<sal_Int8>();
473class DefaultRootBrowseNode :
474 public ::cppu::WeakImplHelper< browse::XBrowseNode >
482 explicit DefaultRootBrowseNode(
const Reference< XComponentContext >& xCtx )
484 std::vector< Reference< browse::XBrowseNode > > nodes =
485 getAllBrowseNodes( xCtx );
487 for (Reference< browse::XBrowseNode > & xNode : nodes)
489 m_vNodes.push_back(
new DefaultBrowseNode( xCtx, xNode ) );
494 virtual Sequence< Reference< browse::XBrowseNode > > SAL_CALL
495 getChildNodes()
override
499 Sequence < Reference< browse::XBrowseNode > > children(
m_vNodes.size() );
500 auto childrenRange = asNonConstRange(children);
502 for (
const auto& rxNode :
m_vNodes )
504 childrenRange[
i ].set( rxNode );
510 virtual sal_Int16 SAL_CALL
getType()
override
512 return browse::BrowseNodeTypes::ROOT;
516 SAL_CALL getName()
override
522 hasChildNodes()
override
534class SelectorBrowseNode :
535 public ::cppu::WeakImplHelper< browse::XBrowseNode >
541 explicit SelectorBrowseNode(
const Reference< XComponentContext >& xContext )
546 virtual OUString SAL_CALL getName()
override
551 virtual Sequence< Reference< browse::XBrowseNode > > SAL_CALL
552 getChildNodes()
override
555 std::vector< Reference < browse::XBrowseNode > > locnBNs = getAllBrowseNodes(
m_xComponentContext );
557 Sequence< Reference< browse::XBrowseNode > > children(
559 auto childrenRange = asNonConstRange(children);
561 for (
size_t j = 0; j < locnBNs.size(); j++ )
563 childrenRange[j] =
new LocationBrowseNode( locnBNs[j] );
569 virtual sal_Bool SAL_CALL hasChildNodes()
override
574 virtual sal_Int16 SAL_CALL
getType()
override
576 return browse::BrowseNodeTypes::CONTAINER;
583 Reference< XComponentContext >
const & xComponentContext )
600Reference< browse::XBrowseNode > SAL_CALL
605 case browse::BrowseNodeFactoryViewTypes::MACROSELECTOR:
607 case browse::BrowseNodeFactoryViewTypes::MACROORGANIZER:
614Reference< browse::XBrowseNode >
627 return "com.sun.star.script.browse.BrowseNodeFactory";
633 return {
"com.sun.star.script.browse.BrowseNodeFactory" };
641extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
643 css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any>
const&)
Reference< browse::XBrowseNode > m_origNode
Reference< lang::XTypeProvider > m_xWrappedTypeProv
Reference< XComponentContext > m_xComponentContext
std::vector< OUString > m_vStr
std::optional< std::unordered_map< OUString, Reference< browse::XBrowseNode > > > m_hBNA
Reference< XAggregation > m_xAggProxy
Reference< XComponentContext > m_xCtx
std::vector< Reference< browse::XBrowseNode > > m_Nodes
Reference< browse::XBrowseNode > m_xWrappedBrowseNode
virtual OUString SAL_CALL getImplementationName() override
virtual css::uno::Reference< css::script::browse::XBrowseNode > SAL_CALL createView(sal_Int16 viewType) override
css::uno::Reference< css::uno::XComponentContext > m_xComponentContext
virtual ~BrowseNodeFactoryImpl() override
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual sal_Bool SAL_CALL supportsService(OUString const &serviceName) override
css::uno::Reference< css::script::browse::XBrowseNode > getOrganizerHierarchy() const
BrowseNodeFactoryImpl(css::uno::Reference< css::uno::XComponentContext > const &xComponentContext)
#define TOOLS_WARN_EXCEPTION(area, stream)
#define DBG_UNHANDLED_EXCEPTION(...)
::std::vector< Reference< browse::XBrowseNode > > vXBrowseNodes
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * scripting_BrowseNodeFactoryImpl_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
::cppu::WeakImplHelper< browse::XBrowseNode > t_BrowseNodeBase
css::uno::Any SAL_CALL queryInterface(const css::uno::Type &rType, Interface1 *p1)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
bool getType(BSTR name, Type &type)