blob: 592087d568b11dc6d9e4e434ffa3a76f0b67568e [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_chart2.hxx"
#include "ChartFrameloader.hxx"
#include "servicenames.hxx"
#include "MediaDescriptorHelper.hxx"
#include "macros.hxx"
#include <comphelper/mediadescriptor.hxx>
#include <com/sun/star/document/XImporter.hpp>
#include <com/sun/star/document/XFilter.hpp>
#include <com/sun/star/frame/XLoadable.hpp>
//.............................................................................
namespace chart
{
//.............................................................................
using namespace ::com::sun::star;
ChartFrameLoader::ChartFrameLoader(
uno::Reference<uno::XComponentContext> const & xContext)
: m_bCancelRequired( sal_False )
{
m_xCC = xContext;
m_oCancelFinished.reset();
}
ChartFrameLoader::~ChartFrameLoader()
{
}
sal_Bool ChartFrameLoader
::impl_checkCancel()
{
if(m_bCancelRequired)
{
m_oCancelFinished.set();
return sal_True;
}
return sal_False;
}
//-----------------------------------------------------------------
// lang::XServiceInfo
//-----------------------------------------------------------------
APPHELPER_XSERVICEINFO_IMPL(ChartFrameLoader,CHART_FRAMELOADER_SERVICE_IMPLEMENTATION_NAME)
uno::Sequence< rtl::OUString > ChartFrameLoader
::getSupportedServiceNames_Static()
{
uno::Sequence< rtl::OUString > aSNS( 1 );
aSNS.getArray()[ 0 ] = CHART_FRAMELOADER_SERVICE_NAME;
return aSNS;
}
//-----------------------------------------------------------------
// frame::XFrameLoader
//-----------------------------------------------------------------
sal_Bool SAL_CALL ChartFrameLoader
::load( const uno::Sequence< beans::PropertyValue >& rMediaDescriptor
, const uno::Reference<frame::XFrame >& xFrame )
throw (uno::RuntimeException)
{
//@todo ? need to add as terminate listener to desktop?
uno::Reference< frame::XModel > xModel;
bool bHaveLoadedModel = false;
comphelper::MediaDescriptor aMediaDescriptor(rMediaDescriptor);
{
comphelper::MediaDescriptor::const_iterator aIt( aMediaDescriptor.find( aMediaDescriptor.PROP_MODEL()));
if( aIt != aMediaDescriptor.end())
{
xModel.set( (*aIt).second.get< uno::Reference< frame::XModel > >());
bHaveLoadedModel = true;
}
}
//create and initialize the model
if( ! xModel.is())
{
//@todo?? load mechanism to cancel during loading of document
xModel.set(
m_xCC->getServiceManager()->createInstanceWithContext(
CHART_MODEL_SERVICE_IMPLEMENTATION_NAME, m_xCC )
, uno::UNO_QUERY );
if( impl_checkCancel() )
return sal_False;
}
//create the controller(+XWindow)
uno::Reference< frame::XController > xController = NULL;
uno::Reference< awt::XWindow > xComponentWindow = NULL;
{
xController = uno::Reference< frame::XController >(
m_xCC->getServiceManager()->createInstanceWithContext(
CHART_CONTROLLER_SERVICE_IMPLEMENTATION_NAME,m_xCC )
, uno::UNO_QUERY );
//!!!it is a special characteristic of the example application
//that the controller simultaniously provides the XWindow controller functionality
xComponentWindow =
uno::Reference< awt::XWindow >( xController, uno::UNO_QUERY );
if( impl_checkCancel() )
return sal_False;
}
//connect frame, controller and model one to each other:
if(xController.is()&&xModel.is())
{
xModel->connectController(xController);
xModel->setCurrentController(xController);
xController->attachModel(xModel);
if(xFrame.is())
xFrame->setComponent(xComponentWindow,xController);
//creates the view and menu
//for correct menu creation the initialized component must be already set into the frame
xController->attachFrame(xFrame);
}
// call initNew() or load() at XLoadable
if(!bHaveLoadedModel)
try
{
comphelper::MediaDescriptor::const_iterator aIt( aMediaDescriptor.find( aMediaDescriptor.PROP_URL()));
if( aIt != aMediaDescriptor.end())
{
::rtl::OUString aURL( (*aIt).second.get< ::rtl::OUString >());
if( aURL.matchAsciiL(
RTL_CONSTASCII_STRINGPARAM( "private:factory/schart" )))
{
// create new file
uno::Reference< frame::XLoadable > xLoadable( xModel, uno::UNO_QUERY_THROW );
xLoadable->initNew();
}
else
{
aMediaDescriptor.addInputStream();
uno::Sequence< beans::PropertyValue > aCompleteMediaDescriptor;
aMediaDescriptor >> aCompleteMediaDescriptor;
apphelper::MediaDescriptorHelper aMDHelper( aCompleteMediaDescriptor );
// load file
// @todo: replace: aMediaDescriptorHelper.getReducedForModel()
uno::Reference< frame::XLoadable > xLoadable( xModel, uno::UNO_QUERY_THROW );
xLoadable->load( aCompleteMediaDescriptor );
//resize standalone files to get correct size:
if( xComponentWindow.is() && aMDHelper.ISSET_FilterName && aMDHelper.FilterName.equals( C2U("StarChart 5.0")) )
{
awt::Rectangle aRect( xComponentWindow->getPosSize() );
sal_Int16 nFlags=0;
xComponentWindow->setPosSize( aRect.X, aRect.Y, aRect.Width, aRect.Height, nFlags );
}
}
}
}
catch( uno::Exception & ex )
{
ASSERT_EXCEPTION( ex );
}
return sal_True;
}
void SAL_CALL ChartFrameLoader
::cancel() throw (uno::RuntimeException)
{
m_oCancelFinished.reset();
m_bCancelRequired = sal_True;
m_oCancelFinished.wait();
m_bCancelRequired = sal_False;
}
//.............................................................................
} //namespace chart
//.............................................................................