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 27 #include <stdio.h> 28 29 //_________________________________________________________________________________________________________________ 30 // my own includes 31 //_________________________________________________________________________________________________________________ 32 33 #include <threadhelp/resetableguard.hxx> 34 #include <xml/toolboxdocumenthandler.hxx> 35 #include <macros/debug.hxx> 36 #include <xml/toolboxconfigurationdefines.hxx> 37 38 //_________________________________________________________________________________________________________________ 39 // interface includes 40 //_________________________________________________________________________________________________________________ 41 #include <com/sun/star/xml/sax/XExtendedDocumentHandler.hpp> 42 #include <com/sun/star/ui/ItemType.hpp> 43 #include <com/sun/star/ui/ItemStyle.hpp> 44 #include <com/sun/star/beans/XPropertySet.hpp> 45 46 //_________________________________________________________________________________________________________________ 47 // other includes 48 //_________________________________________________________________________________________________________________ 49 50 #include <sal/config.h> 51 #include <vcl/svapp.hxx> 52 #include <vcl/toolbox.hxx> 53 #include <rtl/ustrbuf.hxx> 54 55 #include <comphelper/attributelist.hxx> 56 57 //_________________________________________________________________________________________________________________ 58 // namespace 59 //_________________________________________________________________________________________________________________ 60 61 using namespace ::com::sun::star::uno; 62 using namespace ::com::sun::star::beans; 63 using namespace ::com::sun::star::container; 64 using namespace ::com::sun::star::xml::sax; 65 66 67 #define TOOLBAR_DOCTYPE "<!DOCTYPE toolbar:toolbar PUBLIC \"-//OpenOffice.org//DTD OfficeDocument 1.0//EN\" \"toolbar.dtd\">" 68 69 namespace framework 70 { 71 72 // Property names of a menu/menu item ItemDescriptor 73 static const char ITEM_DESCRIPTOR_COMMANDURL[] = "CommandURL"; 74 static const char ITEM_DESCRIPTOR_HELPURL[] = "HelpURL"; 75 static const char ITEM_DESCRIPTOR_TOOLTIP[] = "Tooltip"; 76 static const char ITEM_DESCRIPTOR_LABEL[] = "Label"; 77 static const char ITEM_DESCRIPTOR_TYPE[] = "Type"; 78 static const char ITEM_DESCRIPTOR_STYLE[] = "Style"; 79 static const char ITEM_DESCRIPTOR_VISIBLE[] = "IsVisible"; 80 static const char ITEM_DESCRIPTOR_WIDTH[] = "Width"; 81 82 static void ExtractToolbarParameters( const Sequence< PropertyValue > rProp, 83 ::rtl::OUString& rCommandURL, 84 ::rtl::OUString& rLabel, 85 ::rtl::OUString& rHelpURL, 86 ::rtl::OUString& rTooltip, 87 sal_Int16& rStyle, 88 sal_Int16& rWidth, 89 sal_Bool& rVisible, 90 sal_Int16& rType ) 91 { 92 for ( sal_Int32 i = 0; i < rProp.getLength(); i++ ) 93 { 94 if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_COMMANDURL )) 95 { 96 rProp[i].Value >>= rCommandURL; 97 rCommandURL = rCommandURL.intern(); 98 } 99 else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_HELPURL )) 100 rProp[i].Value >>= rHelpURL; 101 else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_TOOLTIP )) 102 rProp[i].Value >>= rTooltip; 103 else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_LABEL )) 104 rProp[i].Value >>= rLabel; 105 else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_TYPE )) 106 rProp[i].Value >>= rType; 107 else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_VISIBLE )) 108 rProp[i].Value >>= rVisible; 109 else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_WIDTH )) 110 rProp[i].Value >>= rWidth; 111 else if ( rProp[i].Name.equalsAscii( ITEM_DESCRIPTOR_STYLE )) 112 rProp[i].Value >>= rStyle; 113 } 114 } 115 116 struct ToolboxStyleItem 117 { 118 sal_Int16 nBit; 119 const char* attrName; 120 }; 121 122 ToolboxStyleItem Styles[ ] = { 123 { ::com::sun::star::ui::ItemStyle::RADIO_CHECK, ATTRIBUTE_ITEMSTYLE_RADIO }, 124 { ::com::sun::star::ui::ItemStyle::ALIGN_LEFT, ATTRIBUTE_ITEMSTYLE_LEFT }, 125 { ::com::sun::star::ui::ItemStyle::AUTO_SIZE, ATTRIBUTE_ITEMSTYLE_AUTO }, 126 { ::com::sun::star::ui::ItemStyle::REPEAT, ATTRIBUTE_ITEMSTYLE_REPEAT }, 127 { ::com::sun::star::ui::ItemStyle::DROPDOWN_ONLY, ATTRIBUTE_ITEMSTYLE_DROPDOWNONLY }, 128 { ::com::sun::star::ui::ItemStyle::DROP_DOWN, ATTRIBUTE_ITEMSTYLE_DROPDOWN }, 129 { ::com::sun::star::ui::ItemStyle::ICON, ATTRIBUTE_ITEMSTYLE_IMAGE }, 130 { ::com::sun::star::ui::ItemStyle::TEXT, ATTRIBUTE_ITEMSTYLE_TEXT }, 131 }; 132 133 sal_Int32 nStyleItemEntries = sizeof( Styles ) / sizeof( Styles[ 0 ] ); 134 135 struct ToolBarEntryProperty 136 { 137 OReadToolBoxDocumentHandler::ToolBox_XML_Namespace nNamespace; 138 char aEntryName[20]; 139 }; 140 141 ToolBarEntryProperty ToolBoxEntries[OReadToolBoxDocumentHandler::TB_XML_ENTRY_COUNT] = 142 { 143 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ELEMENT_TOOLBAR }, 144 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ELEMENT_TOOLBARITEM }, 145 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ELEMENT_TOOLBARSPACE }, 146 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ELEMENT_TOOLBARBREAK }, 147 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ELEMENT_TOOLBARSEPARATOR }, 148 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ATTRIBUTE_TEXT }, 149 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ATTRIBUTE_BITMAP }, 150 { OReadToolBoxDocumentHandler::TB_NS_XLINK, ATTRIBUTE_URL }, 151 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ATTRIBUTE_ITEMBITS }, 152 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ATTRIBUTE_VISIBLE }, 153 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ATTRIBUTE_WIDTH }, 154 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ATTRIBUTE_USER }, 155 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ATTRIBUTE_HELPID }, 156 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ATTRIBUTE_ITEMSTYLE }, 157 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ATTRIBUTE_UINAME }, 158 { OReadToolBoxDocumentHandler::TB_NS_TOOLBAR, ATTRIBUTE_TOOLTIP }, 159 }; 160 161 OReadToolBoxDocumentHandler::OReadToolBoxDocumentHandler( const Reference< XIndexContainer >& rItemContainer ) : 162 ThreadHelpBase( &Application::GetSolarMutex() ), 163 m_rItemContainer( rItemContainer ), 164 m_aType( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_TYPE )), 165 m_aLabel( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_LABEL )), 166 m_aStyle( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_STYLE )), 167 m_aHelpURL( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_HELPURL )), 168 m_aTooltip( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_TOOLTIP )), 169 m_aIsVisible( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_VISIBLE )), 170 m_aCommandURL( RTL_CONSTASCII_USTRINGPARAM( ITEM_DESCRIPTOR_COMMANDURL )) 171 { 172 ::rtl::OUString aNamespaceToolBar( RTL_CONSTASCII_USTRINGPARAM( XMLNS_TOOLBAR )); 173 ::rtl::OUString aNamespaceXLink( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK )); 174 ::rtl::OUString aSeparator( RTL_CONSTASCII_USTRINGPARAM( XMLNS_FILTER_SEPARATOR )); 175 176 // create hash map 177 for ( int i = 0; i < (int)TB_XML_ENTRY_COUNT; i++ ) 178 { 179 if ( ToolBoxEntries[i].nNamespace == TB_NS_TOOLBAR ) 180 { 181 ::rtl::OUString temp( aNamespaceToolBar ); 182 temp += aSeparator; 183 temp += ::rtl::OUString::createFromAscii( ToolBoxEntries[i].aEntryName ); 184 m_aToolBoxMap.insert( ToolBoxHashMap::value_type( temp, (ToolBox_XML_Entry)i ) ); 185 } 186 else 187 { 188 ::rtl::OUString temp( aNamespaceXLink ); 189 temp += aSeparator; 190 temp += ::rtl::OUString::createFromAscii( ToolBoxEntries[i].aEntryName ); 191 m_aToolBoxMap.insert( ToolBoxHashMap::value_type( temp, (ToolBox_XML_Entry)i ) ); 192 } 193 } 194 195 // pre-calculate a hash code for all style strings to speed up xml read process 196 m_nHashCode_Style_Radio = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_RADIO ).hashCode(); 197 m_nHashCode_Style_Auto = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_AUTO ).hashCode(); 198 m_nHashCode_Style_Left = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_LEFT ).hashCode(); 199 m_nHashCode_Style_AutoSize = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_AUTOSIZE ).hashCode(); 200 m_nHashCode_Style_DropDown = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_DROPDOWN ).hashCode(); 201 m_nHashCode_Style_Repeat = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_REPEAT ).hashCode(); 202 m_nHashCode_Style_DropDownOnly = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_DROPDOWNONLY ).hashCode(); 203 m_nHashCode_Style_Text = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_TEXT ).hashCode(); 204 m_nHashCode_Style_Image = ::rtl::OUString::createFromAscii( ATTRIBUTE_ITEMSTYLE_IMAGE ).hashCode(); 205 206 m_bToolBarStartFound = sal_False; 207 m_bToolBarEndFound = sal_False; 208 m_bToolBarItemStartFound = sal_False; 209 m_bToolBarSpaceStartFound = sal_False; 210 m_bToolBarBreakStartFound = sal_False; 211 m_bToolBarSeparatorStartFound = sal_False; 212 } 213 214 OReadToolBoxDocumentHandler::~OReadToolBoxDocumentHandler() 215 { 216 } 217 218 // XDocumentHandler 219 void SAL_CALL OReadToolBoxDocumentHandler::startDocument(void) 220 throw ( SAXException, RuntimeException ) 221 { 222 } 223 224 void SAL_CALL OReadToolBoxDocumentHandler::endDocument(void) 225 throw( SAXException, RuntimeException ) 226 { 227 ResetableGuard aGuard( m_aLock ); 228 229 if (( m_bToolBarStartFound && !m_bToolBarEndFound ) || 230 ( !m_bToolBarStartFound && m_bToolBarEndFound ) ) 231 { 232 ::rtl::OUString aErrorMessage = getErrorLineString(); 233 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "No matching start or end element 'toolbar' found!" )); 234 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 235 } 236 } 237 238 void SAL_CALL OReadToolBoxDocumentHandler::startElement( 239 const ::rtl::OUString& aName, const Reference< XAttributeList > &xAttribs ) 240 throw( SAXException, RuntimeException ) 241 { 242 ResetableGuard aGuard( m_aLock ); 243 244 ToolBoxHashMap::const_iterator pToolBoxEntry = m_aToolBoxMap.find( aName ) ; 245 if ( pToolBoxEntry != m_aToolBoxMap.end() ) 246 { 247 switch ( pToolBoxEntry->second ) 248 { 249 case TB_ELEMENT_TOOLBAR: 250 { 251 if ( m_bToolBarStartFound ) 252 { 253 ::rtl::OUString aErrorMessage = getErrorLineString(); 254 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'toolbar:toolbar' cannot be embedded into 'toolbar:toolbar'!" )); 255 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 256 } 257 else 258 { 259 // Check if we have a UI name set in our XML file 260 ::rtl::OUString aUIName; 261 for ( sal_Int16 n = 0; n < xAttribs->getLength(); n++ ) 262 { 263 pToolBoxEntry = m_aToolBoxMap.find( xAttribs->getNameByIndex( n ) ); 264 if ( pToolBoxEntry != m_aToolBoxMap.end() ) 265 { 266 switch ( pToolBoxEntry->second ) 267 { 268 case TB_ATTRIBUTE_UINAME: 269 aUIName = xAttribs->getValueByIndex( n ); 270 break; 271 default: 272 break; 273 } 274 } 275 } 276 277 if ( aUIName.getLength() > 0 ) 278 { 279 // Try to set UI name as a container property 280 Reference< XPropertySet > xPropSet( m_rItemContainer, UNO_QUERY ); 281 if ( xPropSet.is() ) 282 { 283 try 284 { 285 xPropSet->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UIName" )), makeAny( aUIName ) ); 286 } 287 catch ( UnknownPropertyException& ) 288 { 289 } 290 } 291 } 292 } 293 294 m_bToolBarStartFound = sal_True; 295 } 296 break; 297 298 case TB_ELEMENT_TOOLBARITEM: 299 { 300 if ( !m_bToolBarStartFound ) 301 { 302 ::rtl::OUString aErrorMessage = getErrorLineString(); 303 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'toolbar:toolbaritem' must be embedded into element 'toolbar:toolbar'!" )); 304 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 305 } 306 307 if ( m_bToolBarSeparatorStartFound || 308 m_bToolBarBreakStartFound || 309 m_bToolBarSpaceStartFound || 310 m_bToolBarItemStartFound ) 311 { 312 ::rtl::OUString aErrorMessage = getErrorLineString(); 313 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbaritem is not a container!" )); 314 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 315 } 316 317 ::rtl::OUString aAttribute; 318 sal_Bool bAttributeURL = sal_False; 319 320 m_bToolBarItemStartFound = sal_True; 321 ::rtl::OUString aLabel; 322 ::rtl::OUString aCommandURL; 323 ::rtl::OUString aHelpURL; 324 ::rtl::OUString aTooltip; 325 ::rtl::OUString aBitmapName; 326 sal_uInt16 nItemBits( 0 ); 327 sal_uInt16 nWidth( 0 ); 328 sal_uInt16 nUserDef( 0 ); 329 sal_Bool bVisible( sal_True ); 330 331 for ( sal_Int16 n = 0; n < xAttribs->getLength(); n++ ) 332 { 333 pToolBoxEntry = m_aToolBoxMap.find( xAttribs->getNameByIndex( n ) ); 334 if ( pToolBoxEntry != m_aToolBoxMap.end() ) 335 { 336 switch ( pToolBoxEntry->second ) 337 { 338 case TB_ATTRIBUTE_TEXT: 339 { 340 aLabel = xAttribs->getValueByIndex( n ); 341 } 342 break; 343 344 case TB_ATTRIBUTE_BITMAP: 345 { 346 aBitmapName = xAttribs->getValueByIndex( n ); 347 } 348 break; 349 350 case TB_ATTRIBUTE_URL: 351 { 352 bAttributeURL = sal_True; 353 aCommandURL = xAttribs->getValueByIndex( n ).intern(); 354 } 355 break; 356 357 case TB_ATTRIBUTE_ITEMBITS: 358 { 359 nItemBits = (sal_uInt16)(xAttribs->getValueByIndex( n ).toInt32()); 360 } 361 break; 362 363 case TB_ATTRIBUTE_VISIBLE: 364 { 365 if ( xAttribs->getValueByIndex( n ).equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_BOOLEAN_TRUE )) ) 366 bVisible = sal_True; 367 else if ( xAttribs->getValueByIndex( n ).equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_BOOLEAN_FALSE )) ) 368 bVisible = sal_False; 369 else 370 { 371 ::rtl::OUString aErrorMessage = getErrorLineString(); 372 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Attribute toolbar:visible must have value 'true' or 'false'!" )); 373 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 374 } 375 } 376 break; 377 378 case TB_ATTRIBUTE_WIDTH: 379 { 380 nWidth = (sal_uInt16)(xAttribs->getValueByIndex( n ).toInt32()); 381 } 382 break; 383 384 case TB_ATTRIBUTE_USER: 385 { 386 nUserDef = (sal_uInt16)(xAttribs->getValueByIndex( n ).toInt32()); 387 } 388 break; 389 390 case TB_ATTRIBUTE_HELPID: 391 { 392 aHelpURL = xAttribs->getValueByIndex( n ); 393 } 394 break; 395 396 case TB_ATTRIBUTE_TOOLTIP: 397 { 398 aTooltip = xAttribs->getValueByIndex( n ); 399 } 400 break; 401 402 case TB_ATTRIBUTE_STYLE: 403 { 404 // read space separated item style list 405 ::rtl::OUString aTemp = xAttribs->getValueByIndex( n ); 406 sal_Int32 nIndex = 0; 407 408 do 409 { 410 ::rtl::OUString aToken = aTemp.getToken( 0, ' ', nIndex ); 411 if ( aToken.getLength() > 0 ) 412 { 413 sal_Int32 nHashCode = aToken.hashCode(); 414 if ( nHashCode == m_nHashCode_Style_Radio ) 415 nItemBits |= ::com::sun::star::ui::ItemStyle::RADIO_CHECK; 416 else if ( nHashCode == m_nHashCode_Style_Left ) 417 nItemBits |= ::com::sun::star::ui::ItemStyle::ALIGN_LEFT; 418 else if ( nHashCode == m_nHashCode_Style_AutoSize ) 419 nItemBits |= ::com::sun::star::ui::ItemStyle::AUTO_SIZE; 420 else if ( nHashCode == m_nHashCode_Style_DropDown ) 421 nItemBits |= ::com::sun::star::ui::ItemStyle::DROP_DOWN; 422 else if ( nHashCode == m_nHashCode_Style_Repeat ) 423 nItemBits |= ::com::sun::star::ui::ItemStyle::REPEAT; 424 else if ( nHashCode == m_nHashCode_Style_DropDownOnly ) 425 nItemBits |= ::com::sun::star::ui::ItemStyle::DROPDOWN_ONLY; 426 else if ( nHashCode == m_nHashCode_Style_DropDown ) 427 nItemBits |= ::com::sun::star::ui::ItemStyle::DROP_DOWN; 428 else if ( nHashCode == m_nHashCode_Style_Text ) 429 nItemBits |= ::com::sun::star::ui::ItemStyle::TEXT; 430 else if ( nHashCode == m_nHashCode_Style_Image ) 431 nItemBits |= ::com::sun::star::ui::ItemStyle::ICON; 432 } 433 } 434 while ( nIndex >= 0 ); 435 } 436 break; 437 438 default: 439 break; 440 } 441 } 442 } // for 443 444 if ( !bAttributeURL ) 445 { 446 ::rtl::OUString aErrorMessage = getErrorLineString(); 447 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Required attribute toolbar:url must have a value!" )); 448 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 449 } 450 451 if ( aCommandURL.getLength() > 0 ) 452 { 453 Sequence< PropertyValue > aToolbarItemProp( 7 ); 454 aToolbarItemProp[0].Name = m_aCommandURL; 455 aToolbarItemProp[1].Name = m_aHelpURL; 456 aToolbarItemProp[2].Name = m_aLabel; 457 aToolbarItemProp[3].Name = m_aType; 458 aToolbarItemProp[4].Name = m_aStyle; 459 aToolbarItemProp[5].Name = m_aIsVisible; 460 aToolbarItemProp[6].Name = m_aTooltip; 461 462 aToolbarItemProp[0].Value <<= aCommandURL; 463 aToolbarItemProp[1].Value <<= aHelpURL; 464 aToolbarItemProp[2].Value <<= aLabel; 465 aToolbarItemProp[3].Value = makeAny( ::com::sun::star::ui::ItemType::DEFAULT ); 466 aToolbarItemProp[4].Value <<= nItemBits; 467 aToolbarItemProp[5].Value <<= bVisible; 468 aToolbarItemProp[6].Value <<= aTooltip; 469 470 m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) ); 471 } 472 } 473 break; 474 475 case TB_ELEMENT_TOOLBARSPACE: 476 { 477 if ( m_bToolBarSeparatorStartFound || 478 m_bToolBarBreakStartFound || 479 m_bToolBarSpaceStartFound || 480 m_bToolBarItemStartFound ) 481 { 482 ::rtl::OUString aErrorMessage = getErrorLineString(); 483 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbarspace is not a container!" )); 484 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 485 } 486 487 m_bToolBarSpaceStartFound = sal_True; 488 489 Sequence< PropertyValue > aToolbarItemProp( 2 ); 490 aToolbarItemProp[0].Name = m_aCommandURL; 491 aToolbarItemProp[1].Name = m_aType; 492 493 aToolbarItemProp[0].Value <<= rtl::OUString(); 494 aToolbarItemProp[1].Value <<= ::com::sun::star::ui::ItemType::SEPARATOR_SPACE; 495 496 m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) ); 497 } 498 break; 499 500 case TB_ELEMENT_TOOLBARBREAK: 501 { 502 if ( m_bToolBarSeparatorStartFound || 503 m_bToolBarBreakStartFound || 504 m_bToolBarSpaceStartFound || 505 m_bToolBarItemStartFound ) 506 { 507 ::rtl::OUString aErrorMessage = getErrorLineString(); 508 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbarbreak is not a container!" )); 509 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 510 } 511 512 m_bToolBarBreakStartFound = sal_True; 513 514 Sequence< PropertyValue > aToolbarItemProp( 2 ); 515 aToolbarItemProp[0].Name = m_aCommandURL; 516 aToolbarItemProp[1].Name = m_aType; 517 518 aToolbarItemProp[0].Value <<= rtl::OUString(); 519 aToolbarItemProp[1].Value <<= ::com::sun::star::ui::ItemType::SEPARATOR_LINEBREAK; 520 521 m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) ); 522 } 523 break; 524 525 case TB_ELEMENT_TOOLBARSEPARATOR: 526 { 527 if ( m_bToolBarSeparatorStartFound || 528 m_bToolBarBreakStartFound || 529 m_bToolBarSpaceStartFound || 530 m_bToolBarItemStartFound ) 531 { 532 ::rtl::OUString aErrorMessage = getErrorLineString(); 533 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbarseparator is not a container!" )); 534 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 535 } 536 537 m_bToolBarSeparatorStartFound = sal_True; 538 539 Sequence< PropertyValue > aToolbarItemProp( 2 ); 540 aToolbarItemProp[0].Name = m_aCommandURL; 541 aToolbarItemProp[1].Name = m_aType; 542 543 aToolbarItemProp[0].Value <<= rtl::OUString(); 544 aToolbarItemProp[1].Value <<= ::com::sun::star::ui::ItemType::SEPARATOR_LINE; 545 546 m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) ); 547 } 548 break; 549 550 default: 551 break; 552 } 553 } 554 } 555 556 void SAL_CALL OReadToolBoxDocumentHandler::endElement(const ::rtl::OUString& aName) 557 throw( SAXException, RuntimeException ) 558 { 559 ResetableGuard aGuard( m_aLock ); 560 561 ToolBoxHashMap::const_iterator pToolBoxEntry = m_aToolBoxMap.find( aName ) ; 562 if ( pToolBoxEntry != m_aToolBoxMap.end() ) 563 { 564 switch ( pToolBoxEntry->second ) 565 { 566 case TB_ELEMENT_TOOLBAR: 567 { 568 if ( !m_bToolBarStartFound ) 569 { 570 ::rtl::OUString aErrorMessage = getErrorLineString(); 571 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar' found, but no start element 'toolbar'" )); 572 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 573 } 574 575 m_bToolBarStartFound = sal_False; 576 } 577 break; 578 579 case TB_ELEMENT_TOOLBARITEM: 580 { 581 if ( !m_bToolBarItemStartFound ) 582 { 583 ::rtl::OUString aErrorMessage = getErrorLineString(); 584 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbaritem' found, but no start element 'toolbar:toolbaritem'" )); 585 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 586 } 587 588 m_bToolBarItemStartFound = sal_False; 589 } 590 break; 591 592 case TB_ELEMENT_TOOLBARBREAK: 593 { 594 if ( !m_bToolBarBreakStartFound ) 595 { 596 ::rtl::OUString aErrorMessage = getErrorLineString(); 597 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbarbreak' found, but no start element 'toolbar:toolbarbreak'" )); 598 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 599 } 600 601 m_bToolBarBreakStartFound = sal_False; 602 } 603 break; 604 605 case TB_ELEMENT_TOOLBARSPACE: 606 { 607 if ( !m_bToolBarSpaceStartFound ) 608 { 609 ::rtl::OUString aErrorMessage = getErrorLineString(); 610 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbarspace' found, but no start element 'toolbar:toolbarspace'" )); 611 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 612 } 613 614 m_bToolBarSpaceStartFound = sal_False; 615 } 616 break; 617 618 case TB_ELEMENT_TOOLBARSEPARATOR: 619 { 620 if ( !m_bToolBarSeparatorStartFound ) 621 { 622 ::rtl::OUString aErrorMessage = getErrorLineString(); 623 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbarseparator' found, but no start element 'toolbar:toolbarseparator'" )); 624 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 625 } 626 627 m_bToolBarSeparatorStartFound = sal_False; 628 } 629 break; 630 631 default: 632 break; 633 } 634 } 635 } 636 637 void SAL_CALL OReadToolBoxDocumentHandler::characters(const ::rtl::OUString&) 638 throw( SAXException, RuntimeException ) 639 { 640 } 641 642 void SAL_CALL OReadToolBoxDocumentHandler::ignorableWhitespace(const ::rtl::OUString&) 643 throw( SAXException, RuntimeException ) 644 { 645 } 646 647 void SAL_CALL OReadToolBoxDocumentHandler::processingInstruction( 648 const ::rtl::OUString& /*aTarget*/, const ::rtl::OUString& /*aData*/ ) 649 throw( SAXException, RuntimeException ) 650 { 651 } 652 653 void SAL_CALL OReadToolBoxDocumentHandler::setDocumentLocator( 654 const Reference< XLocator > &xLocator) 655 throw( SAXException, RuntimeException ) 656 { 657 ResetableGuard aGuard( m_aLock ); 658 659 m_xLocator = xLocator; 660 } 661 662 ::rtl::OUString OReadToolBoxDocumentHandler::getErrorLineString() 663 { 664 ResetableGuard aGuard( m_aLock ); 665 666 char buffer[32]; 667 668 if ( m_xLocator.is() ) 669 { 670 snprintf( buffer, sizeof(buffer), "Line: %ld - ", static_cast<long>( m_xLocator->getLineNumber() )); 671 return ::rtl::OUString::createFromAscii( buffer ); 672 } 673 else 674 return ::rtl::OUString(); 675 } 676 677 678 //_________________________________________________________________________________________________________________ 679 // OWriteToolBoxDocumentHandler 680 //_________________________________________________________________________________________________________________ 681 682 OWriteToolBoxDocumentHandler::OWriteToolBoxDocumentHandler( 683 const Reference< XIndexAccess >& rItemAccess, 684 Reference< XDocumentHandler >& rWriteDocumentHandler ) : 685 ThreadHelpBase( &Application::GetSolarMutex() ), 686 m_xWriteDocumentHandler( rWriteDocumentHandler ), 687 m_rItemAccess( rItemAccess ) 688 { 689 ::comphelper::AttributeList* pList = new ::comphelper::AttributeList; 690 m_xEmptyList = Reference< XAttributeList >( (XAttributeList *) pList, UNO_QUERY ); 691 m_aAttributeType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TYPE_CDATA )); 692 m_aXMLXlinkNS = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK_PREFIX )); 693 m_aXMLToolbarNS = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_TOOLBAR_PREFIX )); 694 } 695 696 OWriteToolBoxDocumentHandler::~OWriteToolBoxDocumentHandler() 697 { 698 } 699 700 void OWriteToolBoxDocumentHandler::WriteToolBoxDocument() throw 701 ( SAXException, RuntimeException ) 702 { 703 ResetableGuard aGuard( m_aLock ); 704 705 m_xWriteDocumentHandler->startDocument(); 706 707 // write DOCTYPE line! 708 Reference< XExtendedDocumentHandler > xExtendedDocHandler( m_xWriteDocumentHandler, UNO_QUERY ); 709 if ( xExtendedDocHandler.is() ) 710 { 711 xExtendedDocHandler->unknown( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( TOOLBAR_DOCTYPE )) ); 712 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 713 } 714 715 ::rtl::OUString aUIName; 716 Reference< XPropertySet > xPropSet( m_rItemAccess, UNO_QUERY ); 717 if ( xPropSet.is() ) 718 { 719 try 720 { 721 xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UIName" ))) >>= aUIName; 722 } 723 catch ( UnknownPropertyException& ) 724 { 725 } 726 } 727 728 ::comphelper::AttributeList* pList = new ::comphelper::AttributeList; 729 Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY ); 730 731 pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XMLNS_TOOLBAR )), 732 m_aAttributeType, 733 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_TOOLBAR )) ); 734 735 pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XMLNS_XLINK )), 736 m_aAttributeType, 737 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK )) ); 738 739 if ( aUIName.getLength() > 0 ) 740 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_UINAME )), 741 m_aAttributeType, 742 aUIName ); 743 744 m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBAR )), pList ); 745 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 746 747 sal_Int32 nItemCount = m_rItemAccess->getCount(); 748 Any aAny; 749 750 for ( sal_Int32 nItemPos = 0; nItemPos < nItemCount; nItemPos++ ) 751 { 752 Sequence< PropertyValue > aProps; 753 aAny = m_rItemAccess->getByIndex( nItemPos ); 754 if ( aAny >>= aProps ) 755 { 756 ::rtl::OUString aCommandURL; 757 ::rtl::OUString aLabel; 758 ::rtl::OUString aHelpURL; 759 ::rtl::OUString aTooltip; 760 sal_Bool bVisible( sal_True ); 761 sal_Int16 nType( ::com::sun::star::ui::ItemType::DEFAULT ); 762 sal_Int16 nWidth( 0 ); 763 sal_Int16 nStyle( 0 ); 764 765 ExtractToolbarParameters( aProps, aCommandURL, aLabel, aHelpURL, aTooltip, nStyle, nWidth, bVisible, nType ); 766 if ( nType == ::com::sun::star::ui::ItemType::DEFAULT ) 767 WriteToolBoxItem( aCommandURL, aLabel, aHelpURL, aTooltip, nStyle, nWidth, bVisible ); 768 else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_SPACE ) 769 WriteToolBoxSpace(); 770 else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_LINE ) 771 WriteToolBoxSeparator(); 772 else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_LINEBREAK ) 773 WriteToolBoxBreak(); 774 } 775 } 776 777 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 778 m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBAR )) ); 779 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 780 m_xWriteDocumentHandler->endDocument(); 781 } 782 783 //_________________________________________________________________________________________________________________ 784 // protected member functions 785 //_________________________________________________________________________________________________________________ 786 787 void OWriteToolBoxDocumentHandler::WriteToolBoxItem( 788 const ::rtl::OUString& rCommandURL, 789 const ::rtl::OUString& rLabel, 790 const ::rtl::OUString& rHelpURL, 791 const ::rtl::OUString& rTooltip, 792 sal_Int16 nStyle, 793 sal_Int16 nWidth, 794 sal_Bool bVisible ) 795 throw ( SAXException, RuntimeException ) 796 { 797 ::comphelper::AttributeList* pList = new ::comphelper::AttributeList; 798 Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY ); 799 800 if ( m_aAttributeURL.getLength() == 0 ) 801 { 802 m_aAttributeURL = m_aXMLXlinkNS; 803 m_aAttributeURL += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_URL )); 804 } 805 806 // save required attribute (URL) 807 pList->AddAttribute( m_aAttributeURL, m_aAttributeType, rCommandURL ); 808 809 if ( rLabel.getLength() > 0 ) 810 { 811 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TEXT )), 812 m_aAttributeType, 813 rLabel ); 814 } 815 816 if ( bVisible == sal_False ) 817 { 818 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_VISIBLE )), 819 m_aAttributeType, 820 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_BOOLEAN_FALSE )) ); 821 } 822 823 if ( rHelpURL.getLength() > 0 ) 824 { 825 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_HELPID )), 826 m_aAttributeType, 827 rHelpURL ); 828 } 829 830 if ( rTooltip.getLength() > 0 ) 831 { 832 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TOOLTIP )), 833 m_aAttributeType, 834 rTooltip ); 835 } 836 837 if ( nStyle > 0 ) 838 { 839 rtl::OUString aValue; 840 ToolboxStyleItem* pStyle = Styles; 841 842 for ( sal_Int32 nIndex = 0; nIndex < nStyleItemEntries; ++nIndex, ++pStyle ) 843 { 844 if ( nStyle & pStyle->nBit ) 845 { 846 if ( aValue.getLength() ) 847 aValue = aValue.concat( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(" ") ) ); 848 aValue += rtl::OUString::createFromAscii( pStyle->attrName ); 849 } 850 } 851 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_ITEMSTYLE )), 852 m_aAttributeType, 853 aValue ); 854 } 855 856 if ( nWidth > 0 ) 857 { 858 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_WIDTH )), 859 m_aAttributeType, 860 ::rtl::OUString::valueOf( sal_Int32( nWidth )) ); 861 } 862 863 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 864 m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARITEM )), xList ); 865 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 866 m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARITEM )) ); 867 } 868 869 void OWriteToolBoxDocumentHandler::WriteToolBoxSpace() throw 870 ( SAXException, RuntimeException ) 871 { 872 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 873 m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSPACE )), m_xEmptyList ); 874 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 875 m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSPACE )) ); 876 } 877 878 void OWriteToolBoxDocumentHandler::WriteToolBoxBreak() throw 879 ( SAXException, RuntimeException ) 880 { 881 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 882 m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARBREAK )), m_xEmptyList ); 883 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 884 m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARBREAK )) ); 885 } 886 887 void OWriteToolBoxDocumentHandler::WriteToolBoxSeparator() throw 888 ( SAXException, RuntimeException ) 889 { 890 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 891 m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSEPARATOR )), m_xEmptyList ); 892 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 893 m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSEPARATOR )) ); 894 } 895 896 } // namespace framework 897 898