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