summaryrefslogtreecommitdiff
path: root/unotools/source/config/accelcfg.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'unotools/source/config/accelcfg.cxx')
-rw-r--r--unotools/source/config/accelcfg.cxx292
1 files changed, 292 insertions, 0 deletions
diff --git a/unotools/source/config/accelcfg.cxx b/unotools/source/config/accelcfg.cxx
new file mode 100644
index 000000000000..f911b36e83fe
--- /dev/null
+++ b/unotools/source/config/accelcfg.cxx
@@ -0,0 +1,292 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: accelcfg.cxx,v $
+ * $Revision: 1.9 $
+ *
+ * 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_unotools.hxx"
+#ifndef GCC
+#endif
+#include "rtl/instance.hxx"
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/io/XActiveDataSource.hpp>
+#include <com/sun/star/io/XInputStream.hpp>
+#include <com/sun/star/io/XOutputStream.hpp>
+#include <com/sun/star/xml/sax/XParser.hpp>
+#include <unotools/configmgr.hxx>
+#include <unotools/configitem.hxx>
+#include <tools/debug.hxx>
+
+#include <osl/mutex.hxx>
+#include <tools/string.hxx>
+#include <tools/urlobj.hxx>
+#include <unotools/streamwrap.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <comphelper/processfactory.hxx>
+
+#include <unotools/accelcfg.hxx>
+#include <unotools/xmlaccelcfg.hxx>
+#include <unotools/pathoptions.hxx>
+#include "itemholder1.hxx"
+
+
+using namespace utl;
+using namespace rtl;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::io;
+using namespace com::sun::star::xml::sax;
+
+
+static SvtAcceleratorConfig_Impl* pOptions = NULL;
+static sal_Int32 nRefCount = 0;
+
+class SvtAcceleratorConfig_Impl
+{
+public:
+
+ SvtAcceleratorItemList aList;
+ bool bModified;
+
+ SvtAcceleratorConfig_Impl()
+ : bModified( FALSE )
+ {}
+
+ SvtAcceleratorConfig_Impl( Reference< XInputStream >& xInputStream );
+ bool Commit( Reference< XOutputStream >& xOutputStream );
+};
+
+// -----------------------------------------------------------------------
+
+SvtAcceleratorConfig_Impl::SvtAcceleratorConfig_Impl( Reference< XInputStream >& rInputStream )
+ : bModified( false )
+{
+ Reference< XParser > xParser( ::comphelper::getProcessServiceFactory()->createInstance(
+ ::rtl::OUString::createFromAscii( "com.sun.star.xml.sax.Parser" )),
+ UNO_QUERY);
+
+ // connect stream to input stream to the parser
+ InputSource aInputSource;
+ aInputSource.aInputStream = rInputStream;
+
+ // get filter
+ Reference< XDocumentHandler > xFilter( new OReadAccelatorDocumentHandler( aList ));
+
+ // connect parser and filter
+ xParser->setDocumentHandler( xFilter );
+ xParser->parseStream( aInputSource );
+}
+
+bool SvtAcceleratorConfig_Impl::Commit( Reference< XOutputStream >& rOutputStream )
+{
+ Reference< XDocumentHandler > xWriter;
+
+ xWriter = Reference< XDocumentHandler >( ::comphelper::getProcessServiceFactory()->createInstance(
+ ::rtl::OUString::createFromAscii( "com.sun.star.xml.sax.Writer" )), UNO_QUERY) ;
+
+ Reference< ::com::sun::star::io::XActiveDataSource> xDataSource( xWriter , UNO_QUERY );
+ xDataSource->setOutputStream( rOutputStream );
+ try
+ {
+ OWriteAccelatorDocumentHandler aWriteHandler( aList, xWriter );
+ aWriteHandler.WriteAcceleratorDocument();
+ rOutputStream->flush();
+ return true;
+ }
+ catch ( RuntimeException& )
+ {
+ }
+ catch ( SAXException& )
+ {
+ }
+ catch ( ::com::sun::star::io::IOException& )
+ {
+ }
+
+ return false;
+}
+
+namespace
+{
+ class LocalSingleton : public rtl::Static< osl::Mutex, LocalSingleton >
+ {
+ };
+}
+
+SvtAcceleratorConfiguration::SvtAcceleratorConfiguration()
+{
+ // Global access, must be guarded (multithreading)
+ ::osl::MutexGuard aGuard( LocalSingleton::get() );
+ if ( !pOptions )
+ {
+ SvStream* pStream = GetDefaultStream( STREAM_STD_READ );
+ ::utl::OInputStreamWrapper aHelper( *pStream );
+ com::sun::star::uno::Reference < ::com::sun::star::io::XInputStream > xOut( &aHelper );
+
+ try
+ {
+ pOptions = new SvtAcceleratorConfig_Impl( xOut );
+ }
+ catch ( RuntimeException& )
+ {
+ pOptions = new SvtAcceleratorConfig_Impl();
+ }
+ catch( SAXException& )
+ {
+ pOptions = new SvtAcceleratorConfig_Impl();
+ }
+ catch( ::com::sun::star::io::IOException& )
+ {
+ pOptions = new SvtAcceleratorConfig_Impl();
+ }
+
+ if (pOptions)
+ ItemHolder1::holdConfigItem(E_ACCELCFG);
+
+ delete pStream;
+ }
+
+ ++nRefCount;
+ pImp = pOptions;
+}
+
+SvtAcceleratorConfiguration* SvtAcceleratorConfiguration::CreateFromStream( SvStream& rStream )
+{
+ SvtAcceleratorConfiguration* pRet = new SvtAcceleratorConfiguration;
+ ::utl::OInputStreamWrapper aHelper( rStream );
+ com::sun::star::uno::Reference < ::com::sun::star::io::XInputStream > xOut( &aHelper );
+ try
+ {
+ pRet->pImp = new SvtAcceleratorConfig_Impl( xOut );
+ }
+ catch ( RuntimeException& )
+ {
+ DELETEZ( pRet );
+ }
+ catch( SAXException& )
+ {
+ DELETEZ( pRet );
+ }
+ catch( ::com::sun::star::io::IOException& )
+ {
+ DELETEZ( pRet );
+ }
+
+ return pRet;
+}
+
+// -----------------------------------------------------------------------
+
+SvtAcceleratorConfiguration::~SvtAcceleratorConfiguration()
+{
+ if ( pImp == pOptions )
+ {
+ // Global access, must be guarded (multithreading)
+ ::osl::MutexGuard aGuard( LocalSingleton::get() );
+ if ( !--nRefCount )
+ {
+ if ( pImp->bModified )
+ {
+ String aUserConfig = SvtPathOptions().GetUserConfigPath();
+ INetURLObject aObj( aUserConfig );
+ aObj.insertName( String::CreateFromAscii("GlobalKeyBindings.xml") );
+ SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( aObj.GetMainURL( INetURLObject::NO_DECODE ), STREAM_STD_READWRITE|STREAM_TRUNC );
+ ::utl::OOutputStreamWrapper aHelper( *pStream );
+ com::sun::star::uno::Reference < ::com::sun::star::io::XOutputStream > xOut( &aHelper );
+ pImp->Commit( xOut );
+ delete pStream;
+ }
+
+ DELETEZ( pOptions );
+ }
+ }
+ else
+ {
+ delete pImp;
+ }
+}
+
+::rtl::OUString SvtAcceleratorConfiguration::GetCommand( const ::com::sun::star::awt::KeyEvent& rKeyEvent )
+{
+ sal_Int16 nCode=rKeyEvent.KeyCode, nModifier=rKeyEvent.Modifiers;
+ if ( !nCode )
+ nCode = rKeyEvent.KeyFunc;
+
+ std::list< SvtAcceleratorConfigItem>::const_iterator p;
+ for ( p = pImp->aList.begin(); p != pImp->aList.end(); p++ )
+ if ( p->nCode == nCode && p->nModifier == nModifier )
+ return p->aCommand;
+
+ return ::rtl::OUString();
+}
+
+const SvtAcceleratorItemList& SvtAcceleratorConfiguration::GetItems()
+{
+ return pImp->aList;
+}
+
+void SvtAcceleratorConfiguration::SetCommand( const SvtAcceleratorConfigItem& rItem )
+{
+ std::list< SvtAcceleratorConfigItem>::iterator p;
+ for ( p = pImp->aList.begin(); p != pImp->aList.end(); p++ )
+ if ( p->nCode == rItem.nCode && p->nModifier == rItem.nModifier )
+ {
+ p->aCommand = rItem.aCommand;
+ return;
+ }
+
+ pImp->aList.push_back( rItem );
+
+}
+
+void SvtAcceleratorConfiguration::SetItems( const SvtAcceleratorItemList& rItems, bool bClear )
+{
+ if ( bClear )
+ {
+ pImp->aList = rItems;
+ }
+ else
+ {
+ std::list< SvtAcceleratorConfigItem>::const_iterator p;
+ for ( p = rItems.begin(); p != rItems.end(); p++ )
+ SetCommand( *p );
+ }
+}
+
+String SvtAcceleratorConfiguration::GetStreamName()
+{
+ return String::CreateFromAscii("KeyBindings.xml");
+}
+
+SvStream* SvtAcceleratorConfiguration::GetDefaultStream( StreamMode nMode )
+{
+ String aUserConfig = SvtPathOptions().GetUserConfigPath();
+ INetURLObject aObj( aUserConfig );
+ aObj.insertName( GetStreamName() );
+ return ::utl::UcbStreamHelper::CreateStream( aObj.GetMainURL( INetURLObject::NO_DECODE ), nMode );
+}