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 { 221 } 222 223 void SAL_CALL OReadToolBoxDocumentHandler::endDocument(void) 224 { 225 ResetableGuard aGuard( m_aLock ); 226 227 if (( m_bToolBarStartFound && !m_bToolBarEndFound ) || 228 ( !m_bToolBarStartFound && m_bToolBarEndFound ) ) 229 { 230 ::rtl::OUString aErrorMessage = getErrorLineString(); 231 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "No matching start or end element 'toolbar' found!" )); 232 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 233 } 234 } 235 236 void SAL_CALL OReadToolBoxDocumentHandler::startElement( 237 const ::rtl::OUString& aName, const Reference< XAttributeList > &xAttribs ) 238 { 239 ResetableGuard aGuard( m_aLock ); 240 241 ToolBoxHashMap::const_iterator pToolBoxEntry = m_aToolBoxMap.find( aName ) ; 242 if ( pToolBoxEntry != m_aToolBoxMap.end() ) 243 { 244 switch ( pToolBoxEntry->second ) 245 { 246 case TB_ELEMENT_TOOLBAR: 247 { 248 if ( m_bToolBarStartFound ) 249 { 250 ::rtl::OUString aErrorMessage = getErrorLineString(); 251 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'toolbar:toolbar' cannot be embedded into 'toolbar:toolbar'!" )); 252 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 253 } 254 else 255 { 256 // Check if we have a UI name set in our XML file 257 ::rtl::OUString aUIName; 258 for ( sal_Int16 n = 0; n < xAttribs->getLength(); n++ ) 259 { 260 pToolBoxEntry = m_aToolBoxMap.find( xAttribs->getNameByIndex( n ) ); 261 if ( pToolBoxEntry != m_aToolBoxMap.end() ) 262 { 263 switch ( pToolBoxEntry->second ) 264 { 265 case TB_ATTRIBUTE_UINAME: 266 aUIName = xAttribs->getValueByIndex( n ); 267 break; 268 default: 269 break; 270 } 271 } 272 } 273 274 if ( aUIName.getLength() > 0 ) 275 { 276 // Try to set UI name as a container property 277 Reference< XPropertySet > xPropSet( m_rItemContainer, UNO_QUERY ); 278 if ( xPropSet.is() ) 279 { 280 try 281 { 282 xPropSet->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UIName" )), makeAny( aUIName ) ); 283 } 284 catch ( UnknownPropertyException& ) 285 { 286 } 287 } 288 } 289 } 290 291 m_bToolBarStartFound = sal_True; 292 } 293 break; 294 295 case TB_ELEMENT_TOOLBARITEM: 296 { 297 if ( !m_bToolBarStartFound ) 298 { 299 ::rtl::OUString aErrorMessage = getErrorLineString(); 300 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element 'toolbar:toolbaritem' must be embedded into element 'toolbar:toolbar'!" )); 301 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 302 } 303 304 if ( m_bToolBarSeparatorStartFound || 305 m_bToolBarBreakStartFound || 306 m_bToolBarSpaceStartFound || 307 m_bToolBarItemStartFound ) 308 { 309 ::rtl::OUString aErrorMessage = getErrorLineString(); 310 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbaritem is not a container!" )); 311 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 312 } 313 314 ::rtl::OUString aAttribute; 315 sal_Bool bAttributeURL = sal_False; 316 317 m_bToolBarItemStartFound = sal_True; 318 ::rtl::OUString aLabel; 319 ::rtl::OUString aCommandURL; 320 ::rtl::OUString aHelpURL; 321 ::rtl::OUString aTooltip; 322 ::rtl::OUString aBitmapName; 323 sal_uInt16 nItemBits( 0 ); 324 sal_uInt16 nWidth( 0 ); 325 sal_uInt16 nUserDef( 0 ); 326 sal_Bool bVisible( sal_True ); 327 328 for ( sal_Int16 n = 0; n < xAttribs->getLength(); n++ ) 329 { 330 pToolBoxEntry = m_aToolBoxMap.find( xAttribs->getNameByIndex( n ) ); 331 if ( pToolBoxEntry != m_aToolBoxMap.end() ) 332 { 333 switch ( pToolBoxEntry->second ) 334 { 335 case TB_ATTRIBUTE_TEXT: 336 { 337 aLabel = xAttribs->getValueByIndex( n ); 338 } 339 break; 340 341 case TB_ATTRIBUTE_BITMAP: 342 { 343 aBitmapName = xAttribs->getValueByIndex( n ); 344 } 345 break; 346 347 case TB_ATTRIBUTE_URL: 348 { 349 bAttributeURL = sal_True; 350 aCommandURL = xAttribs->getValueByIndex( n ).intern(); 351 } 352 break; 353 354 case TB_ATTRIBUTE_ITEMBITS: 355 { 356 nItemBits = (sal_uInt16)(xAttribs->getValueByIndex( n ).toInt32()); 357 } 358 break; 359 360 case TB_ATTRIBUTE_VISIBLE: 361 { 362 if ( xAttribs->getValueByIndex( n ).equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_BOOLEAN_TRUE )) ) 363 bVisible = sal_True; 364 else if ( xAttribs->getValueByIndex( n ).equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( ATTRIBUTE_BOOLEAN_FALSE )) ) 365 bVisible = sal_False; 366 else 367 { 368 ::rtl::OUString aErrorMessage = getErrorLineString(); 369 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Attribute toolbar:visible must have value 'true' or 'false'!" )); 370 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 371 } 372 } 373 break; 374 375 case TB_ATTRIBUTE_WIDTH: 376 { 377 nWidth = (sal_uInt16)(xAttribs->getValueByIndex( n ).toInt32()); 378 } 379 break; 380 381 case TB_ATTRIBUTE_USER: 382 { 383 nUserDef = (sal_uInt16)(xAttribs->getValueByIndex( n ).toInt32()); 384 } 385 break; 386 387 case TB_ATTRIBUTE_HELPID: 388 { 389 aHelpURL = xAttribs->getValueByIndex( n ); 390 } 391 break; 392 393 case TB_ATTRIBUTE_TOOLTIP: 394 { 395 aTooltip = xAttribs->getValueByIndex( n ); 396 } 397 break; 398 399 case TB_ATTRIBUTE_STYLE: 400 { 401 // read space separated item style list 402 ::rtl::OUString aTemp = xAttribs->getValueByIndex( n ); 403 sal_Int32 nIndex = 0; 404 405 do 406 { 407 ::rtl::OUString aToken = aTemp.getToken( 0, ' ', nIndex ); 408 if ( aToken.getLength() > 0 ) 409 { 410 sal_Int32 nHashCode = aToken.hashCode(); 411 if ( nHashCode == m_nHashCode_Style_Radio ) 412 nItemBits |= ::com::sun::star::ui::ItemStyle::RADIO_CHECK; 413 else if ( nHashCode == m_nHashCode_Style_Left ) 414 nItemBits |= ::com::sun::star::ui::ItemStyle::ALIGN_LEFT; 415 else if ( nHashCode == m_nHashCode_Style_AutoSize ) 416 nItemBits |= ::com::sun::star::ui::ItemStyle::AUTO_SIZE; 417 else if ( nHashCode == m_nHashCode_Style_DropDown ) 418 nItemBits |= ::com::sun::star::ui::ItemStyle::DROP_DOWN; 419 else if ( nHashCode == m_nHashCode_Style_Repeat ) 420 nItemBits |= ::com::sun::star::ui::ItemStyle::REPEAT; 421 else if ( nHashCode == m_nHashCode_Style_DropDownOnly ) 422 nItemBits |= ::com::sun::star::ui::ItemStyle::DROPDOWN_ONLY; 423 else if ( nHashCode == m_nHashCode_Style_DropDown ) 424 nItemBits |= ::com::sun::star::ui::ItemStyle::DROP_DOWN; 425 else if ( nHashCode == m_nHashCode_Style_Text ) 426 nItemBits |= ::com::sun::star::ui::ItemStyle::TEXT; 427 else if ( nHashCode == m_nHashCode_Style_Image ) 428 nItemBits |= ::com::sun::star::ui::ItemStyle::ICON; 429 } 430 } 431 while ( nIndex >= 0 ); 432 } 433 break; 434 435 default: 436 break; 437 } 438 } 439 } // for 440 441 if ( !bAttributeURL ) 442 { 443 ::rtl::OUString aErrorMessage = getErrorLineString(); 444 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Required attribute toolbar:url must have a value!" )); 445 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 446 } 447 448 if ( aCommandURL.getLength() > 0 ) 449 { 450 Sequence< PropertyValue > aToolbarItemProp( 7 ); 451 aToolbarItemProp[0].Name = m_aCommandURL; 452 aToolbarItemProp[1].Name = m_aHelpURL; 453 aToolbarItemProp[2].Name = m_aLabel; 454 aToolbarItemProp[3].Name = m_aType; 455 aToolbarItemProp[4].Name = m_aStyle; 456 aToolbarItemProp[5].Name = m_aIsVisible; 457 aToolbarItemProp[6].Name = m_aTooltip; 458 459 aToolbarItemProp[0].Value <<= aCommandURL; 460 aToolbarItemProp[1].Value <<= aHelpURL; 461 aToolbarItemProp[2].Value <<= aLabel; 462 aToolbarItemProp[3].Value = makeAny( ::com::sun::star::ui::ItemType::DEFAULT ); 463 aToolbarItemProp[4].Value <<= nItemBits; 464 aToolbarItemProp[5].Value <<= bVisible; 465 aToolbarItemProp[6].Value <<= aTooltip; 466 467 m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) ); 468 } 469 } 470 break; 471 472 case TB_ELEMENT_TOOLBARSPACE: 473 { 474 if ( m_bToolBarSeparatorStartFound || 475 m_bToolBarBreakStartFound || 476 m_bToolBarSpaceStartFound || 477 m_bToolBarItemStartFound ) 478 { 479 ::rtl::OUString aErrorMessage = getErrorLineString(); 480 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbarspace is not a container!" )); 481 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 482 } 483 484 m_bToolBarSpaceStartFound = sal_True; 485 486 Sequence< PropertyValue > aToolbarItemProp( 2 ); 487 aToolbarItemProp[0].Name = m_aCommandURL; 488 aToolbarItemProp[1].Name = m_aType; 489 490 aToolbarItemProp[0].Value <<= rtl::OUString(); 491 aToolbarItemProp[1].Value <<= ::com::sun::star::ui::ItemType::SEPARATOR_SPACE; 492 493 m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) ); 494 } 495 break; 496 497 case TB_ELEMENT_TOOLBARBREAK: 498 { 499 if ( m_bToolBarSeparatorStartFound || 500 m_bToolBarBreakStartFound || 501 m_bToolBarSpaceStartFound || 502 m_bToolBarItemStartFound ) 503 { 504 ::rtl::OUString aErrorMessage = getErrorLineString(); 505 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbarbreak is not a container!" )); 506 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 507 } 508 509 m_bToolBarBreakStartFound = sal_True; 510 511 Sequence< PropertyValue > aToolbarItemProp( 2 ); 512 aToolbarItemProp[0].Name = m_aCommandURL; 513 aToolbarItemProp[1].Name = m_aType; 514 515 aToolbarItemProp[0].Value <<= rtl::OUString(); 516 aToolbarItemProp[1].Value <<= ::com::sun::star::ui::ItemType::SEPARATOR_LINEBREAK; 517 518 m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) ); 519 } 520 break; 521 522 case TB_ELEMENT_TOOLBARSEPARATOR: 523 { 524 if ( m_bToolBarSeparatorStartFound || 525 m_bToolBarBreakStartFound || 526 m_bToolBarSpaceStartFound || 527 m_bToolBarItemStartFound ) 528 { 529 ::rtl::OUString aErrorMessage = getErrorLineString(); 530 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Element toolbar:toolbarseparator is not a container!" )); 531 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 532 } 533 534 m_bToolBarSeparatorStartFound = sal_True; 535 536 Sequence< PropertyValue > aToolbarItemProp( 2 ); 537 aToolbarItemProp[0].Name = m_aCommandURL; 538 aToolbarItemProp[1].Name = m_aType; 539 540 aToolbarItemProp[0].Value <<= rtl::OUString(); 541 aToolbarItemProp[1].Value <<= ::com::sun::star::ui::ItemType::SEPARATOR_LINE; 542 543 m_rItemContainer->insertByIndex( m_rItemContainer->getCount(), makeAny( aToolbarItemProp ) ); 544 } 545 break; 546 547 default: 548 break; 549 } 550 } 551 } 552 553 void SAL_CALL OReadToolBoxDocumentHandler::endElement(const ::rtl::OUString& aName) 554 { 555 ResetableGuard aGuard( m_aLock ); 556 557 ToolBoxHashMap::const_iterator pToolBoxEntry = m_aToolBoxMap.find( aName ) ; 558 if ( pToolBoxEntry != m_aToolBoxMap.end() ) 559 { 560 switch ( pToolBoxEntry->second ) 561 { 562 case TB_ELEMENT_TOOLBAR: 563 { 564 if ( !m_bToolBarStartFound ) 565 { 566 ::rtl::OUString aErrorMessage = getErrorLineString(); 567 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar' found, but no start element 'toolbar'" )); 568 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 569 } 570 571 m_bToolBarStartFound = sal_False; 572 } 573 break; 574 575 case TB_ELEMENT_TOOLBARITEM: 576 { 577 if ( !m_bToolBarItemStartFound ) 578 { 579 ::rtl::OUString aErrorMessage = getErrorLineString(); 580 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbaritem' found, but no start element 'toolbar:toolbaritem'" )); 581 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 582 } 583 584 m_bToolBarItemStartFound = sal_False; 585 } 586 break; 587 588 case TB_ELEMENT_TOOLBARBREAK: 589 { 590 if ( !m_bToolBarBreakStartFound ) 591 { 592 ::rtl::OUString aErrorMessage = getErrorLineString(); 593 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbarbreak' found, but no start element 'toolbar:toolbarbreak'" )); 594 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 595 } 596 597 m_bToolBarBreakStartFound = sal_False; 598 } 599 break; 600 601 case TB_ELEMENT_TOOLBARSPACE: 602 { 603 if ( !m_bToolBarSpaceStartFound ) 604 { 605 ::rtl::OUString aErrorMessage = getErrorLineString(); 606 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbarspace' found, but no start element 'toolbar:toolbarspace'" )); 607 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 608 } 609 610 m_bToolBarSpaceStartFound = sal_False; 611 } 612 break; 613 614 case TB_ELEMENT_TOOLBARSEPARATOR: 615 { 616 if ( !m_bToolBarSeparatorStartFound ) 617 { 618 ::rtl::OUString aErrorMessage = getErrorLineString(); 619 aErrorMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "End element 'toolbar:toolbarseparator' found, but no start element 'toolbar:toolbarseparator'" )); 620 throw SAXException( aErrorMessage, Reference< XInterface >(), Any() ); 621 } 622 623 m_bToolBarSeparatorStartFound = sal_False; 624 } 625 break; 626 627 default: 628 break; 629 } 630 } 631 } 632 633 void SAL_CALL OReadToolBoxDocumentHandler::characters(const ::rtl::OUString&) 634 { 635 } 636 637 void SAL_CALL OReadToolBoxDocumentHandler::ignorableWhitespace(const ::rtl::OUString&) 638 { 639 } 640 641 void SAL_CALL OReadToolBoxDocumentHandler::processingInstruction( 642 const ::rtl::OUString& /*aTarget*/, const ::rtl::OUString& /*aData*/ ) 643 { 644 } 645 646 void SAL_CALL OReadToolBoxDocumentHandler::setDocumentLocator( 647 const Reference< XLocator > &xLocator) 648 { 649 ResetableGuard aGuard( m_aLock ); 650 651 m_xLocator = xLocator; 652 } 653 654 ::rtl::OUString OReadToolBoxDocumentHandler::getErrorLineString() 655 { 656 ResetableGuard aGuard( m_aLock ); 657 658 char buffer[32]; 659 660 if ( m_xLocator.is() ) 661 { 662 snprintf( buffer, sizeof(buffer), "Line: %ld - ", static_cast<long>( m_xLocator->getLineNumber() )); 663 return ::rtl::OUString::createFromAscii( buffer ); 664 } 665 else 666 return ::rtl::OUString(); 667 } 668 669 670 //_________________________________________________________________________________________________________________ 671 // OWriteToolBoxDocumentHandler 672 //_________________________________________________________________________________________________________________ 673 674 OWriteToolBoxDocumentHandler::OWriteToolBoxDocumentHandler( 675 const Reference< XIndexAccess >& rItemAccess, 676 Reference< XDocumentHandler >& rWriteDocumentHandler ) : 677 ThreadHelpBase( &Application::GetSolarMutex() ), 678 m_xWriteDocumentHandler( rWriteDocumentHandler ), 679 m_rItemAccess( rItemAccess ) 680 { 681 ::comphelper::AttributeList* pList = new ::comphelper::AttributeList; 682 m_xEmptyList = Reference< XAttributeList >( (XAttributeList *) pList, UNO_QUERY ); 683 m_aAttributeType = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TYPE_CDATA )); 684 m_aXMLXlinkNS = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK_PREFIX )); 685 m_aXMLToolbarNS = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_TOOLBAR_PREFIX )); 686 } 687 688 OWriteToolBoxDocumentHandler::~OWriteToolBoxDocumentHandler() 689 { 690 } 691 692 void OWriteToolBoxDocumentHandler::WriteToolBoxDocument() 693 { 694 ResetableGuard aGuard( m_aLock ); 695 696 m_xWriteDocumentHandler->startDocument(); 697 698 // write DOCTYPE line! 699 Reference< XExtendedDocumentHandler > xExtendedDocHandler( m_xWriteDocumentHandler, UNO_QUERY ); 700 if ( xExtendedDocHandler.is() ) 701 { 702 xExtendedDocHandler->unknown( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( TOOLBAR_DOCTYPE )) ); 703 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 704 } 705 706 ::rtl::OUString aUIName; 707 Reference< XPropertySet > xPropSet( m_rItemAccess, UNO_QUERY ); 708 if ( xPropSet.is() ) 709 { 710 try 711 { 712 xPropSet->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "UIName" ))) >>= aUIName; 713 } 714 catch ( UnknownPropertyException& ) 715 { 716 } 717 } 718 719 ::comphelper::AttributeList* pList = new ::comphelper::AttributeList; 720 Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY ); 721 722 pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XMLNS_TOOLBAR )), 723 m_aAttributeType, 724 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_TOOLBAR )) ); 725 726 pList->AddAttribute( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_XMLNS_XLINK )), 727 m_aAttributeType, 728 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( XMLNS_XLINK )) ); 729 730 if ( aUIName.getLength() > 0 ) 731 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_UINAME )), 732 m_aAttributeType, 733 aUIName ); 734 735 m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBAR )), pList ); 736 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 737 738 sal_Int32 nItemCount = m_rItemAccess->getCount(); 739 Any aAny; 740 741 for ( sal_Int32 nItemPos = 0; nItemPos < nItemCount; nItemPos++ ) 742 { 743 Sequence< PropertyValue > aProps; 744 aAny = m_rItemAccess->getByIndex( nItemPos ); 745 if ( aAny >>= aProps ) 746 { 747 ::rtl::OUString aCommandURL; 748 ::rtl::OUString aLabel; 749 ::rtl::OUString aHelpURL; 750 ::rtl::OUString aTooltip; 751 sal_Bool bVisible( sal_True ); 752 sal_Int16 nType( ::com::sun::star::ui::ItemType::DEFAULT ); 753 sal_Int16 nWidth( 0 ); 754 sal_Int16 nStyle( 0 ); 755 756 ExtractToolbarParameters( aProps, aCommandURL, aLabel, aHelpURL, aTooltip, nStyle, nWidth, bVisible, nType ); 757 if ( nType == ::com::sun::star::ui::ItemType::DEFAULT ) 758 WriteToolBoxItem( aCommandURL, aLabel, aHelpURL, aTooltip, nStyle, nWidth, bVisible ); 759 else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_SPACE ) 760 WriteToolBoxSpace(); 761 else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_LINE ) 762 WriteToolBoxSeparator(); 763 else if ( nType == ::com::sun::star::ui::ItemType::SEPARATOR_LINEBREAK ) 764 WriteToolBoxBreak(); 765 } 766 } 767 768 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 769 m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBAR )) ); 770 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 771 m_xWriteDocumentHandler->endDocument(); 772 } 773 774 //_________________________________________________________________________________________________________________ 775 // protected member functions 776 //_________________________________________________________________________________________________________________ 777 778 void OWriteToolBoxDocumentHandler::WriteToolBoxItem( 779 const ::rtl::OUString& rCommandURL, 780 const ::rtl::OUString& rLabel, 781 const ::rtl::OUString& rHelpURL, 782 const ::rtl::OUString& rTooltip, 783 sal_Int16 nStyle, 784 sal_Int16 nWidth, 785 sal_Bool bVisible ) 786 { 787 ::comphelper::AttributeList* pList = new ::comphelper::AttributeList; 788 Reference< XAttributeList > xList( (XAttributeList *) pList , UNO_QUERY ); 789 790 if ( m_aAttributeURL.getLength() == 0 ) 791 { 792 m_aAttributeURL = m_aXMLXlinkNS; 793 m_aAttributeURL += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_URL )); 794 } 795 796 // save required attribute (URL) 797 pList->AddAttribute( m_aAttributeURL, m_aAttributeType, rCommandURL ); 798 799 if ( rLabel.getLength() > 0 ) 800 { 801 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TEXT )), 802 m_aAttributeType, 803 rLabel ); 804 } 805 806 if ( bVisible == sal_False ) 807 { 808 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_VISIBLE )), 809 m_aAttributeType, 810 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_BOOLEAN_FALSE )) ); 811 } 812 813 if ( rHelpURL.getLength() > 0 ) 814 { 815 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_HELPID )), 816 m_aAttributeType, 817 rHelpURL ); 818 } 819 820 if ( rTooltip.getLength() > 0 ) 821 { 822 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_TOOLTIP )), 823 m_aAttributeType, 824 rTooltip ); 825 } 826 827 if ( nStyle > 0 ) 828 { 829 rtl::OUString aValue; 830 ToolboxStyleItem* pStyle = Styles; 831 832 for ( sal_Int32 nIndex = 0; nIndex < nStyleItemEntries; ++nIndex, ++pStyle ) 833 { 834 if ( nStyle & pStyle->nBit ) 835 { 836 if ( aValue.getLength() ) 837 aValue = aValue.concat( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(" ") ) ); 838 aValue += rtl::OUString::createFromAscii( pStyle->attrName ); 839 } 840 } 841 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_ITEMSTYLE )), 842 m_aAttributeType, 843 aValue ); 844 } 845 846 if ( nWidth > 0 ) 847 { 848 pList->AddAttribute( m_aXMLToolbarNS + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ATTRIBUTE_WIDTH )), 849 m_aAttributeType, 850 ::rtl::OUString::valueOf( sal_Int32( nWidth )) ); 851 } 852 853 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 854 m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARITEM )), xList ); 855 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 856 m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARITEM )) ); 857 } 858 859 void OWriteToolBoxDocumentHandler::WriteToolBoxSpace() 860 { 861 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 862 m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSPACE )), m_xEmptyList ); 863 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 864 m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSPACE )) ); 865 } 866 867 void OWriteToolBoxDocumentHandler::WriteToolBoxBreak() 868 { 869 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 870 m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARBREAK )), m_xEmptyList ); 871 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 872 m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARBREAK )) ); 873 } 874 875 void OWriteToolBoxDocumentHandler::WriteToolBoxSeparator() 876 { 877 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 878 m_xWriteDocumentHandler->startElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSEPARATOR )), m_xEmptyList ); 879 m_xWriteDocumentHandler->ignorableWhitespace( ::rtl::OUString() ); 880 m_xWriteDocumentHandler->endElement( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ELEMENT_NS_TOOLBARSEPARATOR )) ); 881 } 882 883 } // namespace framework 884