xref: /AOO41X/main/chart2/source/controller/main/ChartFrameloader.cxx (revision cde9e8dc2218e857da4894ecba5c903312256674)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_chart2.hxx"
26 #include "ChartFrameloader.hxx"
27 #include "servicenames.hxx"
28 #include "MediaDescriptorHelper.hxx"
29 #include "macros.hxx"
30 #include <comphelper/mediadescriptor.hxx>
31 #include <com/sun/star/document/XImporter.hpp>
32 #include <com/sun/star/document/XFilter.hpp>
33 #include <com/sun/star/frame/XLoadable.hpp>
34 
35 //.............................................................................
36 namespace chart
37 {
38 //.............................................................................
39 
40 using namespace ::com::sun::star;
41 
ChartFrameLoader(uno::Reference<uno::XComponentContext> const & xContext)42 ChartFrameLoader::ChartFrameLoader(
43         uno::Reference<uno::XComponentContext> const & xContext)
44         : m_bCancelRequired( sal_False )
45 {
46     m_xCC = xContext;
47     m_oCancelFinished.reset();
48 }
49 
~ChartFrameLoader()50 ChartFrameLoader::~ChartFrameLoader()
51 {
52 }
53 
54     sal_Bool ChartFrameLoader
impl_checkCancel()55 ::impl_checkCancel()
56 {
57     if(m_bCancelRequired)
58     {
59         m_oCancelFinished.set();
60         return sal_True;
61     }
62     return sal_False;
63 }
64 
65 //-----------------------------------------------------------------
66 // lang::XServiceInfo
67 //-----------------------------------------------------------------
68 
APPHELPER_XSERVICEINFO_IMPL(ChartFrameLoader,CHART_FRAMELOADER_SERVICE_IMPLEMENTATION_NAME)69 APPHELPER_XSERVICEINFO_IMPL(ChartFrameLoader,CHART_FRAMELOADER_SERVICE_IMPLEMENTATION_NAME)
70 
71     uno::Sequence< rtl::OUString > ChartFrameLoader
72 ::getSupportedServiceNames_Static()
73 {
74     uno::Sequence< rtl::OUString > aSNS( 1 );
75     aSNS.getArray()[ 0 ] = CHART_FRAMELOADER_SERVICE_NAME;
76     return aSNS;
77 }
78 
79 //-----------------------------------------------------------------
80 // frame::XFrameLoader
81 //-----------------------------------------------------------------
82 
83     sal_Bool SAL_CALL ChartFrameLoader
load(const uno::Sequence<beans::PropertyValue> & rMediaDescriptor,const uno::Reference<frame::XFrame> & xFrame)84 ::load( const uno::Sequence< beans::PropertyValue >& rMediaDescriptor
85         , const uno::Reference<frame::XFrame >& xFrame )
86         throw (uno::RuntimeException)
87 {
88     //@todo ? need to add as terminate listener to desktop?
89 
90     uno::Reference< frame::XModel >         xModel;
91     bool bHaveLoadedModel = false;
92 
93     comphelper::MediaDescriptor aMediaDescriptor(rMediaDescriptor);
94     {
95         comphelper::MediaDescriptor::const_iterator aIt( aMediaDescriptor.find( aMediaDescriptor.PROP_MODEL()));
96         if( aIt != aMediaDescriptor.end())
97         {
98             xModel.set( (*aIt).second.get< uno::Reference< frame::XModel > >());
99             bHaveLoadedModel = true;
100         }
101     }
102 
103     //create and initialize the model
104     if( ! xModel.is())
105     {
106         //@todo?? load mechanism to cancel during loading of document
107         xModel.set(
108                 m_xCC->getServiceManager()->createInstanceWithContext(
109                 CHART_MODEL_SERVICE_IMPLEMENTATION_NAME, m_xCC )
110                 , uno::UNO_QUERY );
111 
112         if( impl_checkCancel() )
113             return sal_False;
114     }
115 
116     //create the controller(+XWindow)
117     uno::Reference< frame::XController >    xController = NULL;
118     uno::Reference< awt::XWindow >          xComponentWindow = NULL;
119     {
120         xController = uno::Reference< frame::XController >(
121             m_xCC->getServiceManager()->createInstanceWithContext(
122             CHART_CONTROLLER_SERVICE_IMPLEMENTATION_NAME,m_xCC )
123             , uno::UNO_QUERY );
124 
125         //!!!it is a special characteristic of the example application
126         //that the controller simultaniously provides the XWindow controller functionality
127         xComponentWindow =
128                       uno::Reference< awt::XWindow >( xController, uno::UNO_QUERY );
129 
130         if( impl_checkCancel() )
131             return sal_False;
132     }
133 
134 
135     //connect frame, controller and model one to each other:
136     if(xController.is()&&xModel.is())
137     {
138         xModel->connectController(xController);
139         xModel->setCurrentController(xController);
140         xController->attachModel(xModel);
141         if(xFrame.is())
142             xFrame->setComponent(xComponentWindow,xController);
143         //creates the view and menu
144         //for correct menu creation the initialized component must be already set into the frame
145         xController->attachFrame(xFrame);
146     }
147 
148     // call initNew() or load() at XLoadable
149     if(!bHaveLoadedModel)
150     try
151     {
152         comphelper::MediaDescriptor::const_iterator aIt( aMediaDescriptor.find( aMediaDescriptor.PROP_URL()));
153         if( aIt != aMediaDescriptor.end())
154         {
155             ::rtl::OUString aURL( (*aIt).second.get< ::rtl::OUString >());
156             if( aURL.matchAsciiL(
157                 RTL_CONSTASCII_STRINGPARAM( "private:factory/schart" )))
158             {
159                 // create new file
160                 uno::Reference< frame::XLoadable > xLoadable( xModel, uno::UNO_QUERY_THROW );
161                 xLoadable->initNew();
162             }
163             else
164             {
165                 aMediaDescriptor.addInputStream();
166                 uno::Sequence< beans::PropertyValue > aCompleteMediaDescriptor;
167                 aMediaDescriptor >> aCompleteMediaDescriptor;
168                 apphelper::MediaDescriptorHelper aMDHelper( aCompleteMediaDescriptor );
169 
170                 // load file
171                 // @todo: replace: aMediaDescriptorHelper.getReducedForModel()
172                 uno::Reference< frame::XLoadable > xLoadable( xModel, uno::UNO_QUERY_THROW );
173                 xLoadable->load( aCompleteMediaDescriptor );
174 
175                 //resize standalone files to get correct size:
176                 if( xComponentWindow.is() && aMDHelper.ISSET_FilterName && aMDHelper.FilterName.equals( C2U("StarChart 5.0")) )
177                 {
178                     awt::Rectangle aRect( xComponentWindow->getPosSize() );
179                     sal_Int16 nFlags=0;
180                     xComponentWindow->setPosSize( aRect.X, aRect.Y, aRect.Width, aRect.Height, nFlags );
181                 }
182             }
183         }
184     }
185     catch( uno::Exception & ex )
186     {
187         ASSERT_EXCEPTION( ex );
188     }
189 
190     return sal_True;
191 }
192 
193     void SAL_CALL ChartFrameLoader
cancel()194 ::cancel() throw (uno::RuntimeException)
195 {
196     m_oCancelFinished.reset();
197     m_bCancelRequired = sal_True;
198     m_oCancelFinished.wait();
199     m_bCancelRequired = sal_False;
200 }
201 
202 //.............................................................................
203 } //namespace chart
204 //.............................................................................
205