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_framework.hxx" 26 #include <xml/acceleratorconfigurationwriter.hxx> 27 28 //_______________________________________________ 29 // own includes 30 #include <acceleratorconst.h> 31 #include <threadhelp/readguard.hxx> 32 33 //_______________________________________________ 34 // interface includes 35 #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> 36 #include <com/sun/star/xml/sax/XAttributeList.hpp> 37 #include <com/sun/star/awt/KeyModifier.hpp> 38 39 //_______________________________________________ 40 // other includes 41 #include <vcl/svapp.hxx> 42 #include <rtl/ustrbuf.hxx> 43 44 #include <comphelper/attributelist.hxx> 45 46 47 //_______________________________________________ 48 // namespace 49 50 namespace framework{ 51 52 53 //----------------------------------------------- 54 AcceleratorConfigurationWriter::AcceleratorConfigurationWriter(const AcceleratorCache& rContainer, 55 const css::uno::Reference< css::xml::sax::XDocumentHandler >& xConfig ) 56 : ThreadHelpBase(&Application::GetSolarMutex()) 57 , m_xConfig (xConfig ) 58 , m_rContainer (rContainer ) 59 { 60 } 61 62 //----------------------------------------------- 63 AcceleratorConfigurationWriter::~AcceleratorConfigurationWriter() 64 { 65 } 66 67 //----------------------------------------------- 68 void AcceleratorConfigurationWriter::flush() 69 { 70 // SAFE -> ---------------------------------- 71 ReadGuard aReadLock(m_aLock); 72 73 css::uno::Reference< css::xml::sax::XDocumentHandler > xCFG = m_xConfig; 74 css::uno::Reference< css::xml::sax::XExtendedDocumentHandler > xExtendedCFG(m_xConfig, css::uno::UNO_QUERY_THROW); 75 76 aReadLock.unlock(); 77 // <- SAFE ---------------------------------- 78 79 // prepare attribute list 80 ::comphelper::AttributeList* pAttribs = new ::comphelper::AttributeList; 81 css::uno::Reference< css::xml::sax::XAttributeList > xAttribs(static_cast< css::xml::sax::XAttributeList* >(pAttribs), css::uno::UNO_QUERY); 82 83 pAttribs->AddAttribute(AL_XMLNS_ACCEL, ATTRIBUTE_TYPE_CDATA, NS_XMLNS_ACCEL); 84 pAttribs->AddAttribute(AL_XMLNS_XLINK, ATTRIBUTE_TYPE_CDATA, NS_XMLNS_XLINK); 85 86 // generate xml 87 xCFG->startDocument(); 88 89 xExtendedCFG->unknown(DOCTYPE_ACCELERATORS); 90 xCFG->ignorableWhitespace(::rtl::OUString()); 91 92 xCFG->startElement(AL_ELEMENT_ACCELERATORLIST, xAttribs); 93 xCFG->ignorableWhitespace(::rtl::OUString()); 94 95 // TODO think about threadsafe using of cache 96 AcceleratorCache::TKeyList lKeys = m_rContainer.getAllKeys(); 97 AcceleratorCache::TKeyList::const_iterator pKey ; 98 for ( pKey = lKeys.begin(); 99 pKey != lKeys.end() ; 100 ++pKey ) 101 { 102 const css::awt::KeyEvent& rKey = *pKey; 103 const ::rtl::OUString& rCommand = m_rContainer.getCommandByKey(rKey); 104 impl_ts_writeKeyCommandPair(rKey, rCommand, xCFG); 105 } 106 107 /* TODO write key-command list 108 std::vector< SfxAcceleratorConfigItem>::const_iterator p; 109 for ( p = m_aWriteAcceleratorList.begin(); p != m_aWriteAcceleratorList.end(); p++ ) 110 WriteAcceleratorItem( *p ); 111 */ 112 113 xCFG->ignorableWhitespace(::rtl::OUString()); 114 xCFG->endElement(AL_ELEMENT_ACCELERATORLIST); 115 xCFG->ignorableWhitespace(::rtl::OUString()); 116 xCFG->endDocument(); 117 } 118 119 //----------------------------------------------- 120 void AcceleratorConfigurationWriter::impl_ts_writeKeyCommandPair(const css::awt::KeyEvent& aKey , 121 const ::rtl::OUString& sCommand, 122 const css::uno::Reference< css::xml::sax::XDocumentHandler >& xConfig ) 123 { 124 ::comphelper::AttributeList* pAttribs = new ::comphelper::AttributeList; 125 css::uno::Reference< css::xml::sax::XAttributeList > xAttribs (static_cast< css::xml::sax::XAttributeList* >(pAttribs) , css::uno::UNO_QUERY_THROW); 126 127 ::rtl::OUString sKey = m_rKeyMapping->mapCodeToIdentifier(aKey.KeyCode); 128 // TODO check if key is empty! 129 130 pAttribs->AddAttribute(AL_ATTRIBUTE_KEYCODE, ATTRIBUTE_TYPE_CDATA, sKey ); 131 pAttribs->AddAttribute(AL_ATTRIBUTE_URL , ATTRIBUTE_TYPE_CDATA, sCommand); 132 133 if ((aKey.Modifiers & css::awt::KeyModifier::SHIFT) == css::awt::KeyModifier::SHIFT) 134 pAttribs->AddAttribute(AL_ATTRIBUTE_MOD_SHIFT, ATTRIBUTE_TYPE_CDATA, ::rtl::OUString::createFromAscii("true")); 135 136 if ((aKey.Modifiers & css::awt::KeyModifier::MOD1) == css::awt::KeyModifier::MOD1) 137 pAttribs->AddAttribute(AL_ATTRIBUTE_MOD_MOD1, ATTRIBUTE_TYPE_CDATA, ::rtl::OUString::createFromAscii("true")); 138 139 if ((aKey.Modifiers & css::awt::KeyModifier::MOD2) == css::awt::KeyModifier::MOD2) 140 pAttribs->AddAttribute(AL_ATTRIBUTE_MOD_MOD2, ATTRIBUTE_TYPE_CDATA, ::rtl::OUString::createFromAscii("true")); 141 142 if ((aKey.Modifiers & css::awt::KeyModifier::MOD3) == css::awt::KeyModifier::MOD3) 143 pAttribs->AddAttribute(AL_ATTRIBUTE_MOD_MOD3, ATTRIBUTE_TYPE_CDATA, ::rtl::OUString::createFromAscii("true")); 144 145 xConfig->ignorableWhitespace(::rtl::OUString()); 146 xConfig->startElement(AL_ELEMENT_ITEM, xAttribs); 147 xConfig->ignorableWhitespace(::rtl::OUString()); 148 xConfig->endElement(AL_ELEMENT_ITEM); 149 xConfig->ignorableWhitespace(::rtl::OUString()); 150 } 151 152 } // namespace framework 153