xref: /trunk/main/framework/source/tabwin/tabwinfactory.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_framework.hxx"
30 #include <tabwin/tabwinfactory.hxx>
31 #include <tabwin/tabwindow.hxx>
32 
33 //_________________________________________________________________________________________________________________
34 //  my own includes
35 //_________________________________________________________________________________________________________________
36 #include <threadhelp/resetableguard.hxx>
37 
38 //_________________________________________________________________________________________________________________
39 //  interface includes
40 //_________________________________________________________________________________________________________________
41 #include <com/sun/star/util/XURLTransformer.hpp>
42 #include <com/sun/star/lang/XInitialization.hpp>
43 #include <com/sun/star/awt/XTopWindow.hpp>
44 #include <com/sun/star/awt/WindowAttribute.hpp>
45 
46 //_________________________________________________________________________________________________________________
47 //  includes of other projects
48 //_________________________________________________________________________________________________________________
49 #include <vcl/svapp.hxx>
50 #include <tools/urlobj.hxx>
51 #include <rtl/ustrbuf.hxx>
52 
53 //_________________________________________________________________________________________________________________
54 //  Defines
55 //_________________________________________________________________________________________________________________
56 //
57 
58 using namespace rtl;
59 using namespace com::sun::star::uno;
60 using namespace com::sun::star::lang;
61 using namespace com::sun::star::beans;
62 using namespace com::sun::star::util;
63 
64 namespace framework
65 {
66 
67 //*****************************************************************************************************************
68 //  XInterface, XTypeProvider, XServiceInfo
69 //*****************************************************************************************************************
70 DEFINE_XSERVICEINFO_ONEINSTANCESERVICE  (   TabWinFactory                                   ,
71                                             ::cppu::OWeakObject                             ,
72                                             SERVICENAME_TABWINFACTORY                       ,
73                                             IMPLEMENTATIONNAME_TABWINFACTORY
74                                         )
75 
76 DEFINE_INIT_SERVICE                     (   TabWinFactory, {} )
77 
78 TabWinFactory::TabWinFactory( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& xServiceManager ) :
79     ThreadHelpBase( &Application::GetSolarMutex() )
80     , m_xServiceManager( xServiceManager )
81 {
82 }
83 
84 TabWinFactory::~TabWinFactory()
85 {
86 }
87 
88 css::uno::Reference< css::uno::XInterface > SAL_CALL TabWinFactory::createInstanceWithContext(
89     const css::uno::Reference< css::uno::XComponentContext >& Context )
90 throw ( css::uno::Exception, css::uno::RuntimeException )
91 {
92     css::uno::Sequence< css::uno::Any > aArgs;
93 
94     return createInstanceWithArgumentsAndContext( aArgs, Context );
95 }
96 
97 css::uno::Reference< css::uno::XInterface > SAL_CALL TabWinFactory::createInstanceWithArgumentsAndContext(
98     const css::uno::Sequence< css::uno::Any >& Arguments, const css::uno::Reference< css::uno::XComponentContext >& )
99 throw ( css::uno::Exception, css::uno::RuntimeException )
100 {
101     const rtl::OUString aTopWindowArgName( RTL_CONSTASCII_USTRINGPARAM( "TopWindow" ));
102 
103     /* SAFE AREA ----------------------------------------------------------------------------------------------- */
104     ResetableGuard aLock( m_aLock );
105     css::uno::Reference< css::awt::XToolkit > xToolkit = m_xToolkit;
106     css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR( m_xServiceManager );
107     aLock.unlock();
108     /* SAFE AREA ----------------------------------------------------------------------------------------------- */
109 
110     css::uno::Reference< css::uno::XInterface > xReturn;
111     css::uno::Reference< css::awt::XTopWindow > xTopWindow;
112     css::beans::PropertyValue                   aPropValue;
113 
114     for ( sal_Int32 i = 0; i < Arguments.getLength(); i++ )
115     {
116         if ( Arguments[i] >>= aPropValue )
117         {
118             if ( aPropValue.Name == aTopWindowArgName )
119                 aPropValue.Value >>= xTopWindow;
120         }
121     }
122 
123     if ( !xToolkit.is() && xSMGR.is() )
124     {
125         xToolkit = css::uno::Reference< css::awt::XToolkit >( xSMGR->createInstance( SERVICENAME_VCLTOOLKIT ), css::uno::UNO_QUERY );
126         if ( xToolkit.is() )
127         {
128             /* SAFE AREA ----------------------------------------------------------------------------------------------- */
129             aLock.lock();
130             m_xToolkit = xToolkit;
131             aLock.unlock();
132             /* SAFE AREA ----------------------------------------------------------------------------------------------- */
133         }
134     }
135 
136     if ( !xTopWindow.is() )
137     {
138         if ( xToolkit.is() )
139         {
140             // describe window properties.
141             css::awt::WindowDescriptor aDescriptor;
142             aDescriptor.Type                =   css::awt::WindowClass_TOP                                           ;
143             aDescriptor.ParentIndex         =   -1                                                                  ;
144             aDescriptor.Parent              =   css::uno::Reference< css::awt::XWindowPeer >()                      ;
145             aDescriptor.Bounds              =   css::awt::Rectangle(0,0,0,0)                                        ;
146             aDescriptor.WindowAttributes    =   css::awt::WindowAttribute::BORDER|
147                                                 css::awt::WindowAttribute::SIZEABLE|
148                                                 css::awt::WindowAttribute::MOVEABLE|
149                                                 css::awt::WindowAttribute::CLOSEABLE|
150                                                 css::awt::WindowAttribute::MINSIZE;
151 
152             // create a parent window
153             xTopWindow = css::uno::Reference< css::awt::XTopWindow >(
154                             xToolkit->createWindow( aDescriptor ), css::uno::UNO_QUERY );
155         }
156     }
157 
158     if ( xTopWindow.is() )
159     {
160         TabWindow* pTabWindow = new TabWindow( xSMGR );
161 
162         css::uno::Sequence< css::uno::Any > aArgs( 1 );
163 
164         aPropValue.Name  = aTopWindowArgName;
165         aPropValue.Value = css::uno::makeAny( xTopWindow );
166         aArgs[0] = css::uno::makeAny( aPropValue );
167         pTabWindow->initialize( aArgs );
168 
169         xReturn = css::uno::Reference< css::uno::XInterface >(
170                     static_cast< OWeakObject* >( pTabWindow ), css::uno::UNO_QUERY );
171     }
172 
173     return xReturn;
174 }
175 
176 }
177