1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_scripting.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include <cppuhelper/weakref.hxx>
28*b1cdbd2cSJim Jagielski #include <cppuhelper/implementationentry.hxx>
29*b1cdbd2cSJim Jagielski #include <cppuhelper/factory.hxx>
30*b1cdbd2cSJim Jagielski #include <cppuhelper/exc_hlp.hxx>
31*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
32*b1cdbd2cSJim Jagielski #include <comphelper/mediadescriptor.hxx>
33*b1cdbd2cSJim Jagielski
34*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiComponentFactory.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XModel.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/reflection/XProxyFactory.hpp>
37*b1cdbd2cSJim Jagielski
38*b1cdbd2cSJim Jagielski #include <com/sun/star/script/provider/XScriptProviderFactory.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/script/browse/BrowseNodeFactoryViewTypes.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/document/XScriptInvocationContext.hpp>
41*b1cdbd2cSJim Jagielski
42*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h>
43*b1cdbd2cSJim Jagielski
44*b1cdbd2cSJim Jagielski #include "BrowseNodeFactoryImpl.hxx"
45*b1cdbd2cSJim Jagielski #include "ActiveMSPList.hxx"
46*b1cdbd2cSJim Jagielski #include <util/MiscUtils.hxx>
47*b1cdbd2cSJim Jagielski #include <util/util.hxx>
48*b1cdbd2cSJim Jagielski
49*b1cdbd2cSJim Jagielski #include <vector>
50*b1cdbd2cSJim Jagielski #include <algorithm>
51*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
52*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
53*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::script;
54*b1cdbd2cSJim Jagielski using namespace ::sf_misc;
55*b1cdbd2cSJim Jagielski
56*b1cdbd2cSJim Jagielski namespace browsenodefactory
57*b1cdbd2cSJim Jagielski {
58*b1cdbd2cSJim Jagielski class BrowseNodeAggregator :
59*b1cdbd2cSJim Jagielski public ::cppu::WeakImplHelper1< browse::XBrowseNode >
60*b1cdbd2cSJim Jagielski {
61*b1cdbd2cSJim Jagielski private:
62*b1cdbd2cSJim Jagielski ::rtl::OUString m_Name;
63*b1cdbd2cSJim Jagielski Sequence< Reference< browse::XBrowseNode > > m_Nodes;
64*b1cdbd2cSJim Jagielski
65*b1cdbd2cSJim Jagielski public:
66*b1cdbd2cSJim Jagielski
BrowseNodeAggregator(const Reference<browse::XBrowseNode> & node)67*b1cdbd2cSJim Jagielski BrowseNodeAggregator( const Reference< browse::XBrowseNode >& node )
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski m_Name = node->getName();
70*b1cdbd2cSJim Jagielski m_Nodes.realloc( 1 );
71*b1cdbd2cSJim Jagielski m_Nodes[ 0 ] = node;
72*b1cdbd2cSJim Jagielski }
73*b1cdbd2cSJim Jagielski
~BrowseNodeAggregator()74*b1cdbd2cSJim Jagielski ~BrowseNodeAggregator()
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski }
77*b1cdbd2cSJim Jagielski
addBrowseNode(const Reference<browse::XBrowseNode> & node)78*b1cdbd2cSJim Jagielski void addBrowseNode( const Reference< browse::XBrowseNode>& node )
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski sal_Int32 index = m_Nodes.getLength();
81*b1cdbd2cSJim Jagielski
82*b1cdbd2cSJim Jagielski m_Nodes.realloc( index + 1 );
83*b1cdbd2cSJim Jagielski m_Nodes[ index ] = node;
84*b1cdbd2cSJim Jagielski }
85*b1cdbd2cSJim Jagielski
86*b1cdbd2cSJim Jagielski virtual ::rtl::OUString
getName()87*b1cdbd2cSJim Jagielski SAL_CALL getName()
88*b1cdbd2cSJim Jagielski throw ( RuntimeException )
89*b1cdbd2cSJim Jagielski {
90*b1cdbd2cSJim Jagielski return m_Name;
91*b1cdbd2cSJim Jagielski }
92*b1cdbd2cSJim Jagielski
93*b1cdbd2cSJim Jagielski virtual Sequence< Reference< browse::XBrowseNode > > SAL_CALL
getChildNodes()94*b1cdbd2cSJim Jagielski getChildNodes()
95*b1cdbd2cSJim Jagielski throw ( RuntimeException )
96*b1cdbd2cSJim Jagielski {
97*b1cdbd2cSJim Jagielski std::vector< Sequence< Reference < browse::XBrowseNode > > > seqs;
98*b1cdbd2cSJim Jagielski seqs.reserve( m_Nodes.getLength() );
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski sal_Int32 numChildren = 0;
101*b1cdbd2cSJim Jagielski
102*b1cdbd2cSJim Jagielski for ( sal_Int32 i = 0; i < m_Nodes.getLength(); i++ )
103*b1cdbd2cSJim Jagielski {
104*b1cdbd2cSJim Jagielski Sequence< Reference < browse::XBrowseNode > > childs;
105*b1cdbd2cSJim Jagielski try
106*b1cdbd2cSJim Jagielski {
107*b1cdbd2cSJim Jagielski childs = m_Nodes[ i ]->getChildNodes();
108*b1cdbd2cSJim Jagielski seqs.push_back( childs );
109*b1cdbd2cSJim Jagielski numChildren += childs.getLength();
110*b1cdbd2cSJim Jagielski }
111*b1cdbd2cSJim Jagielski catch ( Exception& )
112*b1cdbd2cSJim Jagielski {
113*b1cdbd2cSJim Jagielski // some form of exception getting child nodes so they
114*b1cdbd2cSJim Jagielski // won't be displayed
115*b1cdbd2cSJim Jagielski }
116*b1cdbd2cSJim Jagielski }
117*b1cdbd2cSJim Jagielski
118*b1cdbd2cSJim Jagielski std::vector< Sequence< Reference < browse::XBrowseNode > > >::const_iterator it = seqs.begin();
119*b1cdbd2cSJim Jagielski std::vector< Sequence< Reference < browse::XBrowseNode > > >::const_iterator it_end = seqs.end();
120*b1cdbd2cSJim Jagielski
121*b1cdbd2cSJim Jagielski Sequence< Reference < browse::XBrowseNode > > result( numChildren );
122*b1cdbd2cSJim Jagielski for ( sal_Int32 index = 0; it != it_end && index < numChildren ; ++it )
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski Sequence< Reference < browse::XBrowseNode > > childs = *it;
125*b1cdbd2cSJim Jagielski for ( sal_Int32 j = 0; j < childs.getLength(); j++ )
126*b1cdbd2cSJim Jagielski {
127*b1cdbd2cSJim Jagielski result[ index++ ] = childs[ j ];
128*b1cdbd2cSJim Jagielski }
129*b1cdbd2cSJim Jagielski }
130*b1cdbd2cSJim Jagielski return result;
131*b1cdbd2cSJim Jagielski }
132*b1cdbd2cSJim Jagielski
133*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL
hasChildNodes()134*b1cdbd2cSJim Jagielski hasChildNodes()
135*b1cdbd2cSJim Jagielski throw ( RuntimeException )
136*b1cdbd2cSJim Jagielski {
137*b1cdbd2cSJim Jagielski if ( m_Nodes.getLength() != 0 )
138*b1cdbd2cSJim Jagielski {
139*b1cdbd2cSJim Jagielski for ( sal_Int32 i = 0 ; i < m_Nodes.getLength(); i++ )
140*b1cdbd2cSJim Jagielski {
141*b1cdbd2cSJim Jagielski try
142*b1cdbd2cSJim Jagielski {
143*b1cdbd2cSJim Jagielski if ( m_Nodes[ i ]->hasChildNodes() )
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski return sal_True;
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski }
148*b1cdbd2cSJim Jagielski catch ( Exception& )
149*b1cdbd2cSJim Jagielski {
150*b1cdbd2cSJim Jagielski // some form of exception getting child nodes so move
151*b1cdbd2cSJim Jagielski // on to the next one
152*b1cdbd2cSJim Jagielski }
153*b1cdbd2cSJim Jagielski }
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski return sal_False;
157*b1cdbd2cSJim Jagielski }
158*b1cdbd2cSJim Jagielski
getType()159*b1cdbd2cSJim Jagielski virtual sal_Int16 SAL_CALL getType()
160*b1cdbd2cSJim Jagielski throw ( RuntimeException )
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski return browse::BrowseNodeTypes::CONTAINER;
163*b1cdbd2cSJim Jagielski }
164*b1cdbd2cSJim Jagielski };
165*b1cdbd2cSJim Jagielski
166*b1cdbd2cSJim Jagielski
167*b1cdbd2cSJim Jagielski //typedef ::std::map< ::rtl::OUString, Reference< browse::XBrowseNode > >
168*b1cdbd2cSJim Jagielski typedef ::std::hash_map< ::rtl::OUString, Reference< browse::XBrowseNode >,
169*b1cdbd2cSJim Jagielski ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > >
170*b1cdbd2cSJim Jagielski BrowseNodeAggregatorHash;
171*b1cdbd2cSJim Jagielski typedef ::std::vector< ::rtl::OUString > vString;
172*b1cdbd2cSJim Jagielski
173*b1cdbd2cSJim Jagielski
174*b1cdbd2cSJim Jagielski struct alphaSort
175*b1cdbd2cSJim Jagielski {
operator ()browsenodefactory::alphaSort176*b1cdbd2cSJim Jagielski bool operator()( const ::rtl::OUString& a, const ::rtl::OUString& b )
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski return a.compareTo( b ) < 0;
179*b1cdbd2cSJim Jagielski }
180*b1cdbd2cSJim Jagielski };
181*b1cdbd2cSJim Jagielski class LocationBrowseNode :
182*b1cdbd2cSJim Jagielski public ::cppu::WeakImplHelper1< browse::XBrowseNode >
183*b1cdbd2cSJim Jagielski {
184*b1cdbd2cSJim Jagielski private:
185*b1cdbd2cSJim Jagielski BrowseNodeAggregatorHash* m_hBNA;
186*b1cdbd2cSJim Jagielski vString m_vStr;
187*b1cdbd2cSJim Jagielski ::rtl::OUString m_sNodeName;
188*b1cdbd2cSJim Jagielski Reference< browse::XBrowseNode > m_origNode;
189*b1cdbd2cSJim Jagielski
190*b1cdbd2cSJim Jagielski public:
191*b1cdbd2cSJim Jagielski
LocationBrowseNode(const Reference<browse::XBrowseNode> & node)192*b1cdbd2cSJim Jagielski LocationBrowseNode( const Reference< browse::XBrowseNode >& node )
193*b1cdbd2cSJim Jagielski {
194*b1cdbd2cSJim Jagielski m_sNodeName = node->getName();
195*b1cdbd2cSJim Jagielski m_hBNA = NULL;
196*b1cdbd2cSJim Jagielski m_origNode.set( node );
197*b1cdbd2cSJim Jagielski }
198*b1cdbd2cSJim Jagielski
~LocationBrowseNode()199*b1cdbd2cSJim Jagielski ~LocationBrowseNode()
200*b1cdbd2cSJim Jagielski {
201*b1cdbd2cSJim Jagielski if (m_hBNA)
202*b1cdbd2cSJim Jagielski {
203*b1cdbd2cSJim Jagielski delete m_hBNA;
204*b1cdbd2cSJim Jagielski }
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski
207*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
208*b1cdbd2cSJim Jagielski // XBrowseNode
209*b1cdbd2cSJim Jagielski // -------------------------------------------------------------------------
210*b1cdbd2cSJim Jagielski
getName()211*b1cdbd2cSJim Jagielski virtual ::rtl::OUString SAL_CALL getName()
212*b1cdbd2cSJim Jagielski throw ( RuntimeException )
213*b1cdbd2cSJim Jagielski {
214*b1cdbd2cSJim Jagielski return m_sNodeName;
215*b1cdbd2cSJim Jagielski }
216*b1cdbd2cSJim Jagielski
217*b1cdbd2cSJim Jagielski virtual Sequence< Reference< browse::XBrowseNode > > SAL_CALL
getChildNodes()218*b1cdbd2cSJim Jagielski getChildNodes()
219*b1cdbd2cSJim Jagielski throw ( RuntimeException )
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski if ( m_hBNA == NULL )
222*b1cdbd2cSJim Jagielski {
223*b1cdbd2cSJim Jagielski loadChildNodes();
224*b1cdbd2cSJim Jagielski }
225*b1cdbd2cSJim Jagielski
226*b1cdbd2cSJim Jagielski Sequence< Reference< browse::XBrowseNode > > children( m_hBNA->size() );
227*b1cdbd2cSJim Jagielski sal_Int32 index = 0;
228*b1cdbd2cSJim Jagielski
229*b1cdbd2cSJim Jagielski vString::const_iterator it = m_vStr.begin();
230*b1cdbd2cSJim Jagielski
231*b1cdbd2cSJim Jagielski for ( ; it != m_vStr.end(); ++it, index++ )
232*b1cdbd2cSJim Jagielski {
233*b1cdbd2cSJim Jagielski children[ index ].set( m_hBNA->find( *it )->second );
234*b1cdbd2cSJim Jagielski }
235*b1cdbd2cSJim Jagielski
236*b1cdbd2cSJim Jagielski return children;
237*b1cdbd2cSJim Jagielski }
238*b1cdbd2cSJim Jagielski
hasChildNodes()239*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL hasChildNodes()
240*b1cdbd2cSJim Jagielski throw ( RuntimeException )
241*b1cdbd2cSJim Jagielski {
242*b1cdbd2cSJim Jagielski return sal_True;
243*b1cdbd2cSJim Jagielski }
244*b1cdbd2cSJim Jagielski
getType()245*b1cdbd2cSJim Jagielski virtual sal_Int16 SAL_CALL getType()
246*b1cdbd2cSJim Jagielski throw ( RuntimeException )
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski return browse::BrowseNodeTypes::CONTAINER;
249*b1cdbd2cSJim Jagielski }
250*b1cdbd2cSJim Jagielski
251*b1cdbd2cSJim Jagielski private:
252*b1cdbd2cSJim Jagielski
loadChildNodes()253*b1cdbd2cSJim Jagielski void loadChildNodes()
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski m_hBNA = new BrowseNodeAggregatorHash();
256*b1cdbd2cSJim Jagielski
257*b1cdbd2cSJim Jagielski Sequence< Reference< browse::XBrowseNode > > langNodes =
258*b1cdbd2cSJim Jagielski m_origNode->getChildNodes();
259*b1cdbd2cSJim Jagielski
260*b1cdbd2cSJim Jagielski for ( sal_Int32 i = 0; i < langNodes.getLength(); i++ )
261*b1cdbd2cSJim Jagielski {
262*b1cdbd2cSJim Jagielski Reference< browse::XBrowseNode > xbn;
263*b1cdbd2cSJim Jagielski if ( langNodes[ i ]->getName().equals(::rtl::OUString::createFromAscii("uno_packages")) )
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski xbn.set( new LocationBrowseNode( langNodes[ i ] ) );
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski else
268*b1cdbd2cSJim Jagielski {
269*b1cdbd2cSJim Jagielski xbn.set( langNodes[ i ] );
270*b1cdbd2cSJim Jagielski }
271*b1cdbd2cSJim Jagielski
272*b1cdbd2cSJim Jagielski Sequence< Reference< browse::XBrowseNode > > grandchildren =
273*b1cdbd2cSJim Jagielski xbn->getChildNodes();
274*b1cdbd2cSJim Jagielski
275*b1cdbd2cSJim Jagielski for ( sal_Int32 j = 0; j < grandchildren.getLength(); j++ )
276*b1cdbd2cSJim Jagielski {
277*b1cdbd2cSJim Jagielski Reference< browse::XBrowseNode > grandchild(grandchildren[j]);
278*b1cdbd2cSJim Jagielski
279*b1cdbd2cSJim Jagielski BrowseNodeAggregatorHash::iterator h_it =
280*b1cdbd2cSJim Jagielski m_hBNA->find( grandchild->getName() );
281*b1cdbd2cSJim Jagielski
282*b1cdbd2cSJim Jagielski if ( h_it != m_hBNA->end() )
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski BrowseNodeAggregator* bna = static_cast< BrowseNodeAggregator* >( h_it->second.get() );
285*b1cdbd2cSJim Jagielski bna->addBrowseNode( grandchild );
286*b1cdbd2cSJim Jagielski }
287*b1cdbd2cSJim Jagielski else
288*b1cdbd2cSJim Jagielski {
289*b1cdbd2cSJim Jagielski Reference< browse::XBrowseNode > bna(
290*b1cdbd2cSJim Jagielski new BrowseNodeAggregator( grandchild ) );
291*b1cdbd2cSJim Jagielski (*m_hBNA)[ grandchild->getName() ].set( bna );
292*b1cdbd2cSJim Jagielski m_vStr.push_back( grandchild->getName() );
293*b1cdbd2cSJim Jagielski }
294*b1cdbd2cSJim Jagielski }
295*b1cdbd2cSJim Jagielski }
296*b1cdbd2cSJim Jagielski // sort children alpahbetically
297*b1cdbd2cSJim Jagielski ::std::sort( m_vStr.begin(), m_vStr.end(), alphaSort() );
298*b1cdbd2cSJim Jagielski }
299*b1cdbd2cSJim Jagielski };
300*b1cdbd2cSJim Jagielski
301*b1cdbd2cSJim Jagielski namespace
302*b1cdbd2cSJim Jagielski {
303*b1cdbd2cSJim Jagielski
getAllBrowseNodes(const Reference<XComponentContext> & xCtx)304*b1cdbd2cSJim Jagielski Sequence< Reference< browse::XBrowseNode > > getAllBrowseNodes( const Reference< XComponentContext >& xCtx )
305*b1cdbd2cSJim Jagielski {
306*b1cdbd2cSJim Jagielski Reference< lang::XMultiComponentFactory > mcf =
307*b1cdbd2cSJim Jagielski xCtx->getServiceManager();
308*b1cdbd2cSJim Jagielski
309*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > openDocs =
310*b1cdbd2cSJim Jagielski MiscUtils::allOpenTDocUrls( xCtx );
311*b1cdbd2cSJim Jagielski
312*b1cdbd2cSJim Jagielski Reference< provider::XScriptProviderFactory > xFac;
313*b1cdbd2cSJim Jagielski sal_Int32 initialSize = openDocs.getLength() + 2;
314*b1cdbd2cSJim Jagielski sal_Int32 mspIndex = 0;
315*b1cdbd2cSJim Jagielski
316*b1cdbd2cSJim Jagielski Sequence < Reference < browse::XBrowseNode > > locnBNs( initialSize );
317*b1cdbd2cSJim Jagielski try
318*b1cdbd2cSJim Jagielski {
319*b1cdbd2cSJim Jagielski xFac.set(
320*b1cdbd2cSJim Jagielski xCtx->getValueByName(
321*b1cdbd2cSJim Jagielski OUSTR("/singletons/com.sun.star.script.provider.theMasterScriptProviderFactory") ), UNO_QUERY_THROW );
322*b1cdbd2cSJim Jagielski
323*b1cdbd2cSJim Jagielski locnBNs[ mspIndex++ ] = Reference< browse::XBrowseNode >( xFac->createScriptProvider( makeAny( ::rtl::OUString::createFromAscii("user") ) ), UNO_QUERY_THROW );
324*b1cdbd2cSJim Jagielski locnBNs[ mspIndex++ ] = Reference< browse::XBrowseNode >( xFac->createScriptProvider( makeAny( ::rtl::OUString::createFromAscii("share") ) ), UNO_QUERY_THROW );
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski // TODO proper exception handling, should throw
327*b1cdbd2cSJim Jagielski catch( Exception& e )
328*b1cdbd2cSJim Jagielski {
329*b1cdbd2cSJim Jagielski (void)e;
330*b1cdbd2cSJim Jagielski OSL_TRACE("Caught Exception %s",
331*b1cdbd2cSJim Jagielski ::rtl::OUStringToOString( e.Message , RTL_TEXTENCODING_ASCII_US ).pData->buffer );
332*b1cdbd2cSJim Jagielski locnBNs.realloc( mspIndex );
333*b1cdbd2cSJim Jagielski return locnBNs;
334*b1cdbd2cSJim Jagielski }
335*b1cdbd2cSJim Jagielski
336*b1cdbd2cSJim Jagielski for ( sal_Int32 i = 0; i < openDocs.getLength(); i++ )
337*b1cdbd2cSJim Jagielski {
338*b1cdbd2cSJim Jagielski try
339*b1cdbd2cSJim Jagielski {
340*b1cdbd2cSJim Jagielski Reference< frame::XModel > model( MiscUtils::tDocUrlToModel( openDocs[ i ] ), UNO_QUERY_THROW );
341*b1cdbd2cSJim Jagielski
342*b1cdbd2cSJim Jagielski // #i44599 Check if it's a real document or something special like Hidden/Preview
343*b1cdbd2cSJim Jagielski css::uno::Reference< css::frame::XController > xCurrentController = model->getCurrentController();
344*b1cdbd2cSJim Jagielski if( xCurrentController.is() )
345*b1cdbd2cSJim Jagielski {
346*b1cdbd2cSJim Jagielski comphelper::MediaDescriptor aMD( model->getArgs() );
347*b1cdbd2cSJim Jagielski sal_Bool bDefault = false;
348*b1cdbd2cSJim Jagielski sal_Bool bHidden = aMD.getUnpackedValueOrDefault( comphelper::MediaDescriptor::PROP_HIDDEN(), bDefault );
349*b1cdbd2cSJim Jagielski sal_Bool bPreview = aMD.getUnpackedValueOrDefault( comphelper::MediaDescriptor::PROP_PREVIEW(), bDefault );
350*b1cdbd2cSJim Jagielski if( !bHidden && !bPreview )
351*b1cdbd2cSJim Jagielski {
352*b1cdbd2cSJim Jagielski Reference< document::XEmbeddedScripts > xScripts( model, UNO_QUERY );
353*b1cdbd2cSJim Jagielski if ( xScripts.is() )
354*b1cdbd2cSJim Jagielski locnBNs[ mspIndex++ ] = Reference< browse::XBrowseNode >(
355*b1cdbd2cSJim Jagielski xFac->createScriptProvider( makeAny( model ) ), UNO_QUERY_THROW );
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski }
358*b1cdbd2cSJim Jagielski }
359*b1cdbd2cSJim Jagielski catch( const Exception& )
360*b1cdbd2cSJim Jagielski {
361*b1cdbd2cSJim Jagielski DBG_UNHANDLED_EXCEPTION();
362*b1cdbd2cSJim Jagielski }
363*b1cdbd2cSJim Jagielski
364*b1cdbd2cSJim Jagielski }
365*b1cdbd2cSJim Jagielski
366*b1cdbd2cSJim Jagielski Sequence < Reference < browse::XBrowseNode > > locnBNs_Return( mspIndex );
367*b1cdbd2cSJim Jagielski for ( sal_Int32 j = 0; j < mspIndex; j++ )
368*b1cdbd2cSJim Jagielski locnBNs_Return[j] = locnBNs[j];
369*b1cdbd2cSJim Jagielski
370*b1cdbd2cSJim Jagielski return locnBNs_Return;
371*b1cdbd2cSJim Jagielski }
372*b1cdbd2cSJim Jagielski
373*b1cdbd2cSJim Jagielski } // namespace
374*b1cdbd2cSJim Jagielski
375*b1cdbd2cSJim Jagielski typedef ::std::vector< Reference< browse::XBrowseNode > > vXBrowseNodes;
376*b1cdbd2cSJim Jagielski
377*b1cdbd2cSJim Jagielski struct alphaSortForBNodes
378*b1cdbd2cSJim Jagielski {
operator ()browsenodefactory::alphaSortForBNodes379*b1cdbd2cSJim Jagielski bool operator()( const Reference< browse::XBrowseNode >& a, const Reference< browse::XBrowseNode >& b )
380*b1cdbd2cSJim Jagielski {
381*b1cdbd2cSJim Jagielski return a->getName().compareTo( b->getName() ) < 0;
382*b1cdbd2cSJim Jagielski }
383*b1cdbd2cSJim Jagielski };
384*b1cdbd2cSJim Jagielski
385*b1cdbd2cSJim Jagielski typedef ::cppu::WeakImplHelper1< browse::XBrowseNode > t_BrowseNodeBase;
386*b1cdbd2cSJim Jagielski class DefaultBrowseNode :
387*b1cdbd2cSJim Jagielski public t_BrowseNodeBase
388*b1cdbd2cSJim Jagielski {
389*b1cdbd2cSJim Jagielski
390*b1cdbd2cSJim Jagielski private:
391*b1cdbd2cSJim Jagielski Reference< browse::XBrowseNode > m_xWrappedBrowseNode;
392*b1cdbd2cSJim Jagielski Reference< lang::XTypeProvider > m_xWrappedTypeProv;
393*b1cdbd2cSJim Jagielski Reference< XAggregation > m_xAggProxy;
394*b1cdbd2cSJim Jagielski Reference< XComponentContext > m_xCtx;
395*b1cdbd2cSJim Jagielski
396*b1cdbd2cSJim Jagielski DefaultBrowseNode();
397*b1cdbd2cSJim Jagielski public:
DefaultBrowseNode(const Reference<XComponentContext> & xCtx,const Reference<browse::XBrowseNode> & xNode)398*b1cdbd2cSJim Jagielski DefaultBrowseNode( const Reference< XComponentContext >& xCtx, const Reference< browse::XBrowseNode>& xNode ) : m_xWrappedBrowseNode( xNode ), m_xWrappedTypeProv( xNode, UNO_QUERY ), m_xCtx( xCtx, UNO_QUERY )
399*b1cdbd2cSJim Jagielski {
400*b1cdbd2cSJim Jagielski OSL_ENSURE( m_xWrappedBrowseNode.is(), "DefaultBrowseNode::DefaultBrowseNode(): No BrowseNode to wrap" );
401*b1cdbd2cSJim Jagielski OSL_ENSURE( m_xWrappedTypeProv.is(), "DefaultBrowseNode::DefaultBrowseNode(): No BrowseNode to wrap" );
402*b1cdbd2cSJim Jagielski OSL_ENSURE( m_xCtx.is(), "DefaultBrowseNode::DefaultBrowseNode(): No ComponentContext" );
403*b1cdbd2cSJim Jagielski // Use proxy factory service to create aggregatable proxy.
404*b1cdbd2cSJim Jagielski try
405*b1cdbd2cSJim Jagielski {
406*b1cdbd2cSJim Jagielski Reference< lang::XMultiComponentFactory > xMFac( m_xCtx->getServiceManager(), UNO_QUERY_THROW );
407*b1cdbd2cSJim Jagielski Reference< reflection::XProxyFactory > xProxyFac(
408*b1cdbd2cSJim Jagielski xMFac->createInstanceWithContext(
409*b1cdbd2cSJim Jagielski rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(
410*b1cdbd2cSJim Jagielski "com.sun.star.reflection.ProxyFactory" ) ),
411*b1cdbd2cSJim Jagielski m_xCtx ), UNO_QUERY_THROW );
412*b1cdbd2cSJim Jagielski m_xAggProxy = xProxyFac->createProxy( m_xWrappedBrowseNode );
413*b1cdbd2cSJim Jagielski }
414*b1cdbd2cSJim Jagielski catch( uno::Exception& )
415*b1cdbd2cSJim Jagielski {
416*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "DefaultBrowseNode::DefaultBrowseNode: Caught exception!" );
417*b1cdbd2cSJim Jagielski }
418*b1cdbd2cSJim Jagielski OSL_ENSURE( m_xAggProxy.is(),
419*b1cdbd2cSJim Jagielski "DefaultBrowseNode::DefaultBrowseNode: Wrapped BrowseNode cannot be aggregated!" );
420*b1cdbd2cSJim Jagielski
421*b1cdbd2cSJim Jagielski if ( m_xAggProxy.is() )
422*b1cdbd2cSJim Jagielski {
423*b1cdbd2cSJim Jagielski osl_incrementInterlockedCount( &m_refCount );
424*b1cdbd2cSJim Jagielski
425*b1cdbd2cSJim Jagielski /* i35609 - Fix crash on Solaris. The setDelegator call needs
426*b1cdbd2cSJim Jagielski to be in its own block to ensure that all temporary Reference
427*b1cdbd2cSJim Jagielski instances that are acquired during the call are released
428*b1cdbd2cSJim Jagielski before m_refCount is decremented again */
429*b1cdbd2cSJim Jagielski {
430*b1cdbd2cSJim Jagielski m_xAggProxy->setDelegator(
431*b1cdbd2cSJim Jagielski static_cast< cppu::OWeakObject * >( this ) );
432*b1cdbd2cSJim Jagielski }
433*b1cdbd2cSJim Jagielski
434*b1cdbd2cSJim Jagielski osl_decrementInterlockedCount( &m_refCount );
435*b1cdbd2cSJim Jagielski }
436*b1cdbd2cSJim Jagielski }
437*b1cdbd2cSJim Jagielski
~DefaultBrowseNode()438*b1cdbd2cSJim Jagielski ~DefaultBrowseNode()
439*b1cdbd2cSJim Jagielski {
440*b1cdbd2cSJim Jagielski if ( m_xAggProxy.is() )
441*b1cdbd2cSJim Jagielski {
442*b1cdbd2cSJim Jagielski m_xAggProxy->setDelegator( uno::Reference< uno::XInterface >() );
443*b1cdbd2cSJim Jagielski }
444*b1cdbd2cSJim Jagielski }
445*b1cdbd2cSJim Jagielski
446*b1cdbd2cSJim Jagielski virtual Sequence< Reference< browse::XBrowseNode > > SAL_CALL
getChildNodes()447*b1cdbd2cSJim Jagielski getChildNodes()
448*b1cdbd2cSJim Jagielski throw ( RuntimeException )
449*b1cdbd2cSJim Jagielski {
450*b1cdbd2cSJim Jagielski if ( hasChildNodes() )
451*b1cdbd2cSJim Jagielski {
452*b1cdbd2cSJim Jagielski vXBrowseNodes m_vNodes;
453*b1cdbd2cSJim Jagielski Sequence < Reference< browse::XBrowseNode > > nodes =
454*b1cdbd2cSJim Jagielski m_xWrappedBrowseNode->getChildNodes();
455*b1cdbd2cSJim Jagielski for ( sal_Int32 i=0; i<nodes.getLength(); i++ )
456*b1cdbd2cSJim Jagielski {
457*b1cdbd2cSJim Jagielski Reference< browse::XBrowseNode > xBrowseNode = nodes[ i ];
458*b1cdbd2cSJim Jagielski OSL_ENSURE( xBrowseNode.is(), "DefaultBrowseNode::getChildNodes(): Invalid BrowseNode" );
459*b1cdbd2cSJim Jagielski if( xBrowseNode.is() )
460*b1cdbd2cSJim Jagielski m_vNodes.push_back( new DefaultBrowseNode( m_xCtx, xBrowseNode ) );
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski
463*b1cdbd2cSJim Jagielski ::std::sort( m_vNodes.begin(), m_vNodes.end(), alphaSortForBNodes() );
464*b1cdbd2cSJim Jagielski Sequence < Reference< browse::XBrowseNode > > children( m_vNodes.size() );
465*b1cdbd2cSJim Jagielski vXBrowseNodes::const_iterator it = m_vNodes.begin();
466*b1cdbd2cSJim Jagielski for ( sal_Int32 i=0; it != m_vNodes.end() && i<children.getLength(); i++, ++it )
467*b1cdbd2cSJim Jagielski {
468*b1cdbd2cSJim Jagielski children[ i ].set( *it );
469*b1cdbd2cSJim Jagielski }
470*b1cdbd2cSJim Jagielski return children;
471*b1cdbd2cSJim Jagielski }
472*b1cdbd2cSJim Jagielski else
473*b1cdbd2cSJim Jagielski {
474*b1cdbd2cSJim Jagielski // no nodes
475*b1cdbd2cSJim Jagielski
476*b1cdbd2cSJim Jagielski Sequence < Reference< browse::XBrowseNode > > none;
477*b1cdbd2cSJim Jagielski return none;
478*b1cdbd2cSJim Jagielski }
479*b1cdbd2cSJim Jagielski }
480*b1cdbd2cSJim Jagielski
getType()481*b1cdbd2cSJim Jagielski virtual sal_Int16 SAL_CALL getType()
482*b1cdbd2cSJim Jagielski throw ( RuntimeException )
483*b1cdbd2cSJim Jagielski {
484*b1cdbd2cSJim Jagielski return m_xWrappedBrowseNode->getType();
485*b1cdbd2cSJim Jagielski }
486*b1cdbd2cSJim Jagielski
487*b1cdbd2cSJim Jagielski virtual ::rtl::OUString
getName()488*b1cdbd2cSJim Jagielski SAL_CALL getName()
489*b1cdbd2cSJim Jagielski throw ( RuntimeException )
490*b1cdbd2cSJim Jagielski {
491*b1cdbd2cSJim Jagielski return m_xWrappedBrowseNode->getName();
492*b1cdbd2cSJim Jagielski }
493*b1cdbd2cSJim Jagielski
494*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL
hasChildNodes()495*b1cdbd2cSJim Jagielski hasChildNodes()
496*b1cdbd2cSJim Jagielski throw ( RuntimeException )
497*b1cdbd2cSJim Jagielski {
498*b1cdbd2cSJim Jagielski return m_xWrappedBrowseNode->hasChildNodes();
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski
501*b1cdbd2cSJim Jagielski // XInterface
queryInterface(const Type & aType)502*b1cdbd2cSJim Jagielski virtual Any SAL_CALL queryInterface( const Type& aType )
503*b1cdbd2cSJim Jagielski throw ( com::sun::star::uno::RuntimeException )
504*b1cdbd2cSJim Jagielski {
505*b1cdbd2cSJim Jagielski Any aRet = t_BrowseNodeBase::queryInterface( aType );
506*b1cdbd2cSJim Jagielski if ( aRet.hasValue() )
507*b1cdbd2cSJim Jagielski {
508*b1cdbd2cSJim Jagielski return aRet;
509*b1cdbd2cSJim Jagielski }
510*b1cdbd2cSJim Jagielski if ( m_xAggProxy.is() )
511*b1cdbd2cSJim Jagielski {
512*b1cdbd2cSJim Jagielski return m_xAggProxy->queryAggregation( aType );
513*b1cdbd2cSJim Jagielski }
514*b1cdbd2cSJim Jagielski else
515*b1cdbd2cSJim Jagielski {
516*b1cdbd2cSJim Jagielski return Any();
517*b1cdbd2cSJim Jagielski }
518*b1cdbd2cSJim Jagielski }
519*b1cdbd2cSJim Jagielski
acquire()520*b1cdbd2cSJim Jagielski virtual void SAL_CALL acquire()
521*b1cdbd2cSJim Jagielski throw ()
522*b1cdbd2cSJim Jagielski
523*b1cdbd2cSJim Jagielski {
524*b1cdbd2cSJim Jagielski osl_incrementInterlockedCount( &m_refCount );
525*b1cdbd2cSJim Jagielski }
release()526*b1cdbd2cSJim Jagielski virtual void SAL_CALL release()
527*b1cdbd2cSJim Jagielski throw ()
528*b1cdbd2cSJim Jagielski {
529*b1cdbd2cSJim Jagielski if ( osl_decrementInterlockedCount( &m_refCount ) == 0 )
530*b1cdbd2cSJim Jagielski {
531*b1cdbd2cSJim Jagielski delete this;
532*b1cdbd2cSJim Jagielski }
533*b1cdbd2cSJim Jagielski }
534*b1cdbd2cSJim Jagielski // XTypeProvider (implemnented by base, but needs to be overridden for
535*b1cdbd2cSJim Jagielski // delegating to aggregate)
getTypes()536*b1cdbd2cSJim Jagielski virtual Sequence< Type > SAL_CALL getTypes()
537*b1cdbd2cSJim Jagielski throw ( com::sun::star::uno::RuntimeException )
538*b1cdbd2cSJim Jagielski {
539*b1cdbd2cSJim Jagielski return m_xWrappedTypeProv->getTypes();
540*b1cdbd2cSJim Jagielski }
getImplementationId()541*b1cdbd2cSJim Jagielski virtual Sequence< sal_Int8 > SAL_CALL getImplementationId()
542*b1cdbd2cSJim Jagielski throw ( com::sun::star::uno::RuntimeException )
543*b1cdbd2cSJim Jagielski {
544*b1cdbd2cSJim Jagielski return m_xWrappedTypeProv->getImplementationId();
545*b1cdbd2cSJim Jagielski
546*b1cdbd2cSJim Jagielski }
547*b1cdbd2cSJim Jagielski };
548*b1cdbd2cSJim Jagielski
549*b1cdbd2cSJim Jagielski class DefaultRootBrowseNode :
550*b1cdbd2cSJim Jagielski public ::cppu::WeakImplHelper1< browse::XBrowseNode >
551*b1cdbd2cSJim Jagielski {
552*b1cdbd2cSJim Jagielski
553*b1cdbd2cSJim Jagielski private:
554*b1cdbd2cSJim Jagielski vXBrowseNodes m_vNodes;
555*b1cdbd2cSJim Jagielski ::rtl::OUString m_Name;
556*b1cdbd2cSJim Jagielski
557*b1cdbd2cSJim Jagielski DefaultRootBrowseNode();
558*b1cdbd2cSJim Jagielski public:
DefaultRootBrowseNode(const Reference<XComponentContext> & xCtx)559*b1cdbd2cSJim Jagielski DefaultRootBrowseNode( const Reference< XComponentContext >& xCtx )
560*b1cdbd2cSJim Jagielski {
561*b1cdbd2cSJim Jagielski Sequence < Reference< browse::XBrowseNode > > nodes =
562*b1cdbd2cSJim Jagielski getAllBrowseNodes( xCtx );
563*b1cdbd2cSJim Jagielski
564*b1cdbd2cSJim Jagielski for ( sal_Int32 i=0; i<nodes.getLength(); i++ )
565*b1cdbd2cSJim Jagielski {
566*b1cdbd2cSJim Jagielski m_vNodes.push_back( new DefaultBrowseNode( xCtx, nodes[ i ] ) );
567*b1cdbd2cSJim Jagielski }
568*b1cdbd2cSJim Jagielski m_Name = ::rtl::OUString::createFromAscii( "Root" );
569*b1cdbd2cSJim Jagielski }
570*b1cdbd2cSJim Jagielski
~DefaultRootBrowseNode()571*b1cdbd2cSJim Jagielski ~DefaultRootBrowseNode()
572*b1cdbd2cSJim Jagielski {
573*b1cdbd2cSJim Jagielski }
574*b1cdbd2cSJim Jagielski
575*b1cdbd2cSJim Jagielski virtual Sequence< Reference< browse::XBrowseNode > > SAL_CALL
getChildNodes()576*b1cdbd2cSJim Jagielski getChildNodes()
577*b1cdbd2cSJim Jagielski throw ( RuntimeException )
578*b1cdbd2cSJim Jagielski {
579*b1cdbd2cSJim Jagielski // no need to sort user, share, doc1...docN
580*b1cdbd2cSJim Jagielski //::std::sort( m_vNodes.begin(), m_vNodes.end(), alphaSortForBNodes() );
581*b1cdbd2cSJim Jagielski Sequence < Reference< browse::XBrowseNode > > children( m_vNodes.size() );
582*b1cdbd2cSJim Jagielski vXBrowseNodes::const_iterator it = m_vNodes.begin();
583*b1cdbd2cSJim Jagielski for ( sal_Int32 i=0; it != m_vNodes.end() && i<children.getLength(); i++, ++it )
584*b1cdbd2cSJim Jagielski {
585*b1cdbd2cSJim Jagielski children[ i ].set( *it );
586*b1cdbd2cSJim Jagielski }
587*b1cdbd2cSJim Jagielski return children;
588*b1cdbd2cSJim Jagielski }
589*b1cdbd2cSJim Jagielski
getType()590*b1cdbd2cSJim Jagielski virtual sal_Int16 SAL_CALL getType()
591*b1cdbd2cSJim Jagielski throw ( RuntimeException )
592*b1cdbd2cSJim Jagielski {
593*b1cdbd2cSJim Jagielski return browse::BrowseNodeTypes::ROOT;
594*b1cdbd2cSJim Jagielski }
595*b1cdbd2cSJim Jagielski
596*b1cdbd2cSJim Jagielski virtual ::rtl::OUString
getName()597*b1cdbd2cSJim Jagielski SAL_CALL getName()
598*b1cdbd2cSJim Jagielski throw ( RuntimeException )
599*b1cdbd2cSJim Jagielski {
600*b1cdbd2cSJim Jagielski return m_Name;
601*b1cdbd2cSJim Jagielski }
602*b1cdbd2cSJim Jagielski
603*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL
hasChildNodes()604*b1cdbd2cSJim Jagielski hasChildNodes()
605*b1cdbd2cSJim Jagielski throw ( RuntimeException )
606*b1cdbd2cSJim Jagielski {
607*b1cdbd2cSJim Jagielski sal_Bool result = sal_True;
608*b1cdbd2cSJim Jagielski if ( !m_vNodes.size() )
609*b1cdbd2cSJim Jagielski {
610*b1cdbd2cSJim Jagielski result = sal_False;
611*b1cdbd2cSJim Jagielski }
612*b1cdbd2cSJim Jagielski return result;
613*b1cdbd2cSJim Jagielski }
614*b1cdbd2cSJim Jagielski };
615*b1cdbd2cSJim Jagielski
616*b1cdbd2cSJim Jagielski
617*b1cdbd2cSJim Jagielski class SelectorBrowseNode :
618*b1cdbd2cSJim Jagielski public ::cppu::WeakImplHelper1< browse::XBrowseNode >
619*b1cdbd2cSJim Jagielski {
620*b1cdbd2cSJim Jagielski private:
621*b1cdbd2cSJim Jagielski Reference< XComponentContext > m_xComponentContext;
622*b1cdbd2cSJim Jagielski
623*b1cdbd2cSJim Jagielski public:
SelectorBrowseNode(const Reference<XComponentContext> & xContext)624*b1cdbd2cSJim Jagielski SelectorBrowseNode( const Reference< XComponentContext >& xContext )
625*b1cdbd2cSJim Jagielski : m_xComponentContext( xContext )
626*b1cdbd2cSJim Jagielski {
627*b1cdbd2cSJim Jagielski }
628*b1cdbd2cSJim Jagielski
~SelectorBrowseNode()629*b1cdbd2cSJim Jagielski ~SelectorBrowseNode()
630*b1cdbd2cSJim Jagielski {
631*b1cdbd2cSJim Jagielski }
632*b1cdbd2cSJim Jagielski
getName()633*b1cdbd2cSJim Jagielski virtual ::rtl::OUString SAL_CALL getName()
634*b1cdbd2cSJim Jagielski throw ( RuntimeException )
635*b1cdbd2cSJim Jagielski {
636*b1cdbd2cSJim Jagielski return ::rtl::OUString::createFromAscii( "Root" );
637*b1cdbd2cSJim Jagielski }
638*b1cdbd2cSJim Jagielski
639*b1cdbd2cSJim Jagielski virtual Sequence< Reference< browse::XBrowseNode > > SAL_CALL
getChildNodes()640*b1cdbd2cSJim Jagielski getChildNodes()
641*b1cdbd2cSJim Jagielski throw ( RuntimeException )
642*b1cdbd2cSJim Jagielski {
643*b1cdbd2cSJim Jagielski
644*b1cdbd2cSJim Jagielski Sequence < Reference < browse::XBrowseNode > > locnBNs = getAllBrowseNodes( m_xComponentContext );
645*b1cdbd2cSJim Jagielski
646*b1cdbd2cSJim Jagielski Sequence< Reference< browse::XBrowseNode > > children(
647*b1cdbd2cSJim Jagielski locnBNs.getLength() );
648*b1cdbd2cSJim Jagielski
649*b1cdbd2cSJim Jagielski for ( sal_Int32 j = 0; j < locnBNs.getLength(); j++ )
650*b1cdbd2cSJim Jagielski {
651*b1cdbd2cSJim Jagielski children[j] = new LocationBrowseNode( locnBNs[j] );
652*b1cdbd2cSJim Jagielski }
653*b1cdbd2cSJim Jagielski
654*b1cdbd2cSJim Jagielski return children;
655*b1cdbd2cSJim Jagielski }
656*b1cdbd2cSJim Jagielski
hasChildNodes()657*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL hasChildNodes()
658*b1cdbd2cSJim Jagielski throw ( RuntimeException )
659*b1cdbd2cSJim Jagielski {
660*b1cdbd2cSJim Jagielski return sal_True; // will always be user and share
661*b1cdbd2cSJim Jagielski }
662*b1cdbd2cSJim Jagielski
getType()663*b1cdbd2cSJim Jagielski virtual sal_Int16 SAL_CALL getType()
664*b1cdbd2cSJim Jagielski throw ( RuntimeException )
665*b1cdbd2cSJim Jagielski {
666*b1cdbd2cSJim Jagielski return browse::BrowseNodeTypes::CONTAINER;
667*b1cdbd2cSJim Jagielski }
668*b1cdbd2cSJim Jagielski };
669*b1cdbd2cSJim Jagielski
BrowseNodeFactoryImpl(Reference<XComponentContext> const & xComponentContext)670*b1cdbd2cSJim Jagielski BrowseNodeFactoryImpl::BrowseNodeFactoryImpl(
671*b1cdbd2cSJim Jagielski Reference< XComponentContext > const & xComponentContext )
672*b1cdbd2cSJim Jagielski : m_xComponentContext( xComponentContext )
673*b1cdbd2cSJim Jagielski {
674*b1cdbd2cSJim Jagielski }
675*b1cdbd2cSJim Jagielski
~BrowseNodeFactoryImpl()676*b1cdbd2cSJim Jagielski BrowseNodeFactoryImpl::~BrowseNodeFactoryImpl()
677*b1cdbd2cSJim Jagielski {
678*b1cdbd2cSJim Jagielski }
679*b1cdbd2cSJim Jagielski
680*b1cdbd2cSJim Jagielski
681*b1cdbd2cSJim Jagielski //############################################################################
682*b1cdbd2cSJim Jagielski // Implementation of XBrowseNodeFactory
683*b1cdbd2cSJim Jagielski //############################################################################
684*b1cdbd2cSJim Jagielski
685*b1cdbd2cSJim Jagielski /*
686*b1cdbd2cSJim Jagielski * The selector hierarchy is the standard hierarchy for organizers with the
687*b1cdbd2cSJim Jagielski * language nodes removed.
688*b1cdbd2cSJim Jagielski */
689*b1cdbd2cSJim Jagielski Reference< browse::XBrowseNode > SAL_CALL
createView(sal_Int16 viewType)690*b1cdbd2cSJim Jagielski BrowseNodeFactoryImpl::createView( sal_Int16 viewType )
691*b1cdbd2cSJim Jagielski throw (RuntimeException)
692*b1cdbd2cSJim Jagielski {
693*b1cdbd2cSJim Jagielski switch( viewType )
694*b1cdbd2cSJim Jagielski {
695*b1cdbd2cSJim Jagielski case browse::BrowseNodeFactoryViewTypes::MACROSELECTOR:
696*b1cdbd2cSJim Jagielski return getSelectorHierarchy();
697*b1cdbd2cSJim Jagielski case browse::BrowseNodeFactoryViewTypes::MACROORGANIZER:
698*b1cdbd2cSJim Jagielski return getOrganizerHierarchy();
699*b1cdbd2cSJim Jagielski default:
700*b1cdbd2cSJim Jagielski throw RuntimeException( OUSTR("Unknown view type" ), Reference< XInterface >() );
701*b1cdbd2cSJim Jagielski }
702*b1cdbd2cSJim Jagielski }
703*b1cdbd2cSJim Jagielski
704*b1cdbd2cSJim Jagielski Reference< browse::XBrowseNode >
getSelectorHierarchy()705*b1cdbd2cSJim Jagielski BrowseNodeFactoryImpl::getSelectorHierarchy()
706*b1cdbd2cSJim Jagielski throw (RuntimeException)
707*b1cdbd2cSJim Jagielski {
708*b1cdbd2cSJim Jagielski /*if ( !m_xSelectorBrowseNode.is() )
709*b1cdbd2cSJim Jagielski {
710*b1cdbd2cSJim Jagielski m_xSelectorBrowseNode = new SelectorBrowseNode( m_xComponentContext );
711*b1cdbd2cSJim Jagielski }*/
712*b1cdbd2cSJim Jagielski return new SelectorBrowseNode( m_xComponentContext );
713*b1cdbd2cSJim Jagielski }
714*b1cdbd2cSJim Jagielski
715*b1cdbd2cSJim Jagielski Reference< browse::XBrowseNode >
getOrganizerHierarchy()716*b1cdbd2cSJim Jagielski BrowseNodeFactoryImpl::getOrganizerHierarchy()
717*b1cdbd2cSJim Jagielski throw (RuntimeException)
718*b1cdbd2cSJim Jagielski {
719*b1cdbd2cSJim Jagielski Reference< browse::XBrowseNode > xRet = new DefaultRootBrowseNode( m_xComponentContext );
720*b1cdbd2cSJim Jagielski return xRet;
721*b1cdbd2cSJim Jagielski }
722*b1cdbd2cSJim Jagielski //############################################################################
723*b1cdbd2cSJim Jagielski // Helper methods
724*b1cdbd2cSJim Jagielski //############################################################################
725*b1cdbd2cSJim Jagielski
726*b1cdbd2cSJim Jagielski //############################################################################
727*b1cdbd2cSJim Jagielski // Namespace global methods for setting up BrowseNodeFactory service
728*b1cdbd2cSJim Jagielski //############################################################################
729*b1cdbd2cSJim Jagielski
730*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > SAL_CALL
bnf_getSupportedServiceNames()731*b1cdbd2cSJim Jagielski bnf_getSupportedServiceNames( )
732*b1cdbd2cSJim Jagielski SAL_THROW( () )
733*b1cdbd2cSJim Jagielski {
734*b1cdbd2cSJim Jagielski ::rtl::OUString str_name = ::rtl::OUString::createFromAscii(
735*b1cdbd2cSJim Jagielski "com.sun.star.script.browse.BrowseNodeFactory");
736*b1cdbd2cSJim Jagielski
737*b1cdbd2cSJim Jagielski return Sequence< ::rtl::OUString >( &str_name, 1 );
738*b1cdbd2cSJim Jagielski }
739*b1cdbd2cSJim Jagielski
740*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL
bnf_getImplementationName()741*b1cdbd2cSJim Jagielski bnf_getImplementationName( )
742*b1cdbd2cSJim Jagielski SAL_THROW( () )
743*b1cdbd2cSJim Jagielski {
744*b1cdbd2cSJim Jagielski return ::rtl::OUString::createFromAscii(
745*b1cdbd2cSJim Jagielski "com.sun.star.script.browse.BrowseNodeFactory" );
746*b1cdbd2cSJim Jagielski }
747*b1cdbd2cSJim Jagielski
748*b1cdbd2cSJim Jagielski Reference< XInterface > SAL_CALL
bnf_create(Reference<XComponentContext> const & xComponentContext)749*b1cdbd2cSJim Jagielski bnf_create( Reference< XComponentContext > const & xComponentContext )
750*b1cdbd2cSJim Jagielski SAL_THROW( (Exception) )
751*b1cdbd2cSJim Jagielski {
752*b1cdbd2cSJim Jagielski return static_cast< ::cppu::OWeakObject * >(
753*b1cdbd2cSJim Jagielski new BrowseNodeFactoryImpl( xComponentContext ) );
754*b1cdbd2cSJim Jagielski }
755*b1cdbd2cSJim Jagielski
756*b1cdbd2cSJim Jagielski //############################################################################
757*b1cdbd2cSJim Jagielski // Implementation of XServiceInfo
758*b1cdbd2cSJim Jagielski //############################################################################
759*b1cdbd2cSJim Jagielski
760*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL
getImplementationName()761*b1cdbd2cSJim Jagielski BrowseNodeFactoryImpl::getImplementationName()
762*b1cdbd2cSJim Jagielski throw (RuntimeException)
763*b1cdbd2cSJim Jagielski {
764*b1cdbd2cSJim Jagielski return bnf_getImplementationName();
765*b1cdbd2cSJim Jagielski }
766*b1cdbd2cSJim Jagielski
767*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > SAL_CALL
getSupportedServiceNames()768*b1cdbd2cSJim Jagielski BrowseNodeFactoryImpl::getSupportedServiceNames()
769*b1cdbd2cSJim Jagielski throw (RuntimeException)
770*b1cdbd2cSJim Jagielski {
771*b1cdbd2cSJim Jagielski return bnf_getSupportedServiceNames();
772*b1cdbd2cSJim Jagielski }
773*b1cdbd2cSJim Jagielski
supportsService(::rtl::OUString const & serviceName)774*b1cdbd2cSJim Jagielski sal_Bool BrowseNodeFactoryImpl::supportsService(
775*b1cdbd2cSJim Jagielski ::rtl::OUString const & serviceName )
776*b1cdbd2cSJim Jagielski throw (RuntimeException)
777*b1cdbd2cSJim Jagielski {
778*b1cdbd2cSJim Jagielski // check();
779*b1cdbd2cSJim Jagielski
780*b1cdbd2cSJim Jagielski Sequence< ::rtl::OUString > supported_services(
781*b1cdbd2cSJim Jagielski getSupportedServiceNames() );
782*b1cdbd2cSJim Jagielski
783*b1cdbd2cSJim Jagielski ::rtl::OUString const * ar = supported_services.getConstArray();
784*b1cdbd2cSJim Jagielski
785*b1cdbd2cSJim Jagielski for ( sal_Int32 pos = supported_services.getLength(); pos--; )
786*b1cdbd2cSJim Jagielski {
787*b1cdbd2cSJim Jagielski if (ar[ pos ].equals( serviceName ))
788*b1cdbd2cSJim Jagielski return sal_True;
789*b1cdbd2cSJim Jagielski }
790*b1cdbd2cSJim Jagielski return sal_False;
791*b1cdbd2cSJim Jagielski }
792*b1cdbd2cSJim Jagielski
793*b1cdbd2cSJim Jagielski } // namespace browsenodefactory
794