diff options
Diffstat (limited to 'framework/source/classes/taskcreator.cxx')
-rw-r--r-- | framework/source/classes/taskcreator.cxx | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/framework/source/classes/taskcreator.cxx b/framework/source/classes/taskcreator.cxx new file mode 100644 index 000000000000..162c10e5cfa0 --- /dev/null +++ b/framework/source/classes/taskcreator.cxx @@ -0,0 +1,171 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_framework.hxx" + +//_________________________________________________________________________________________________________________ +// my own includes +//_________________________________________________________________________________________________________________ +#include <classes/taskcreator.hxx> +#include "services/taskcreatorsrv.hxx" +#include <threadhelp/readguard.hxx> +#include <loadenv/targethelper.hxx> +#include <services.h> + +//_________________________________________________________________________________________________________________ +// interface includes +//_________________________________________________________________________________________________________________ +#include <com/sun/star/lang/XSingleServiceFactory.hpp> +#include <com/sun/star/beans/NamedValue.hpp> + +//_________________________________________________________________________________________________________________ +// includes of other projects +//_________________________________________________________________________________________________________________ +#include <comphelper/configurationhelper.hxx> +#include <vcl/svapp.hxx> + +//_________________________________________________________________________________________________________________ +// includes of my own project +//_________________________________________________________________________________________________________________ + +//_________________________________________________________________________________________________________________ +// namespace +//_________________________________________________________________________________________________________________ + +namespace framework{ + +//_________________________________________________________________________________________________________________ +// non exported const +//_________________________________________________________________________________________________________________ + +//_________________________________________________________________________________________________________________ +// non exported definitions +//_________________________________________________________________________________________________________________ + +//_________________________________________________________________________________________________________________ +// declarations +//_________________________________________________________________________________________________________________ + +/*-****************************************************************************************************//** + @short initialize instance with neccessary informations + @descr We need a valid uno service manager to create or instanciate new services. + All other informations to create frames or tasks come in on right interface methods. + + @param xSMGR + points to the valid uno service manager + + @modified 16.05.2002 09:25, as96863 +*//*-*****************************************************************************************************/ +TaskCreator::TaskCreator( const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR ) + : ThreadHelpBase( ) + , m_xSMGR ( xSMGR ) +{ +} + +/*-****************************************************************************************************//** + @short deinitialize instance + @descr We should release all used ressource which are not needed any longer. + + @modified 16.05.2002 09:33, as96863 +*//*-*****************************************************************************************************/ +TaskCreator::~TaskCreator() +{ + m_xSMGR.clear(); +} + +/*-****************************************************************************************************//** + TODO document me +*//*-*****************************************************************************************************/ +css::uno::Reference< css::frame::XFrame > TaskCreator::createTask( const ::rtl::OUString& sName , + sal_Bool bVisible ) +{ + static ::rtl::OUString PACKAGE = ::rtl::OUString::createFromAscii("org.openoffice.Office.TabBrowse"); + static ::rtl::OUString RELPATH = ::rtl::OUString::createFromAscii("TaskCreatorService" ); + static ::rtl::OUString KEY = ::rtl::OUString::createFromAscii("ImplementationName" ); + + /* SAFE { */ + ReadGuard aReadLock( m_aLock ); + css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = m_xSMGR; + aReadLock.unlock(); + /* } SAFE */ + + css::uno::Reference< css::lang::XSingleServiceFactory > xCreator; + ::rtl::OUString sCreator = IMPLEMENTATIONNAME_FWK_TASKCREATOR; + + try + { + if ( + ( TargetHelper::matchSpecialTarget(sName, TargetHelper::E_BLANK ) ) || + ( TargetHelper::matchSpecialTarget(sName, TargetHelper::E_DEFAULT) ) + ) + { + ::comphelper::ConfigurationHelper::readDirectKey(xSMGR, PACKAGE, RELPATH, KEY, ::comphelper::ConfigurationHelper::E_READONLY) >>= sCreator; + } + + xCreator = css::uno::Reference< css::lang::XSingleServiceFactory >( + xSMGR->createInstance(sCreator), css::uno::UNO_QUERY_THROW); + } + catch(const css::uno::Exception&) + {} + + // no catch here ... without an task creator service we cant open ANY document window within the office. + // Thats IMHO not a good idea. Then we should accept the stacktrace showing us the real problem. + // BTW: The used fallback creator service (IMPLEMENTATIONNAME_FWK_TASKCREATOR) is implemented in the same + // library then these class here ... Why we should not be able to create it ? + if ( ! xCreator.is()) + xCreator = css::uno::Reference< css::lang::XSingleServiceFactory >( + xSMGR->createInstance(IMPLEMENTATIONNAME_FWK_TASKCREATOR), css::uno::UNO_QUERY_THROW); + + css::uno::Sequence< css::uno::Any > lArgs(5); + css::beans::NamedValue aArg ; + + aArg.Name = TaskCreatorService::ARGUMENT_PARENTFRAME; + aArg.Value <<= css::uno::Reference< css::frame::XFrame >(xSMGR->createInstance(SERVICENAME_DESKTOP), css::uno::UNO_QUERY_THROW); + lArgs[0] <<= aArg; + + aArg.Name = TaskCreatorService::ARGUMENT_CREATETOPWINDOW; + aArg.Value <<= sal_True; + lArgs[1] <<= aArg; + + aArg.Name = TaskCreatorService::ARGUMENT_MAKEVISIBLE; + aArg.Value <<= bVisible; + lArgs[2] <<= aArg; + + aArg.Name = TaskCreatorService::ARGUMENT_SUPPORTPERSISTENTWINDOWSTATE; + aArg.Value <<= sal_True; + lArgs[3] <<= aArg; + + aArg.Name = TaskCreatorService::ARGUMENT_FRAMENAME; + aArg.Value <<= sName; + lArgs[4] <<= aArg; + + css::uno::Reference< css::frame::XFrame > xTask(xCreator->createInstanceWithArguments(lArgs), css::uno::UNO_QUERY_THROW); + return xTask; +} + +} // namespace framework |