Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 : #include <filter/msfilter/mstoolbar.hxx>
10 : #include <rtl/ustrbuf.hxx>
11 : #include <stdarg.h>
12 : #include <com/sun/star/ui/XUIConfigurationPersistence.hpp>
13 : #include <com/sun/star/ui/XImageManager.hpp>
14 : #include <com/sun/star/ui/ItemType.hpp>
15 : #include <com/sun/star/ui/ItemStyle.hpp>
16 : #include <com/sun/star/frame/XLayoutManager.hpp>
17 : #include <fstream>
18 : #include <vcl/dibtools.hxx>
19 : #include <vcl/graph.hxx>
20 : #include <vcl/bitmapex.hxx>
21 : #include <vcl/image.hxx>
22 : #include <map>
23 : #include <sfx2/objsh.hxx>
24 : #include <basic/basmgr.hxx>
25 : #include <filter/msfilter/msvbahelper.hxx>
26 : #include <svtools/miscopt.hxx>
27 : #include <vcl/svapp.hxx>
28 : #include <vcl/window.hxx>
29 :
30 : using namespace com::sun::star;
31 :
32 : int TBBase::nIndent = 0;
33 :
34 0 : void CustomToolBarImportHelper::ScaleImage( uno::Reference< graphic::XGraphic >& xGraphic, long nNewSize )
35 : {
36 0 : Graphic aGraphic( xGraphic );
37 0 : Size aSize = aGraphic.GetSizePixel();
38 0 : if ( aSize.Height() && ( aSize.Height() == aSize.Width() ) )
39 : {
40 0 : Image aImage( xGraphic );
41 0 : if ( aSize.Height() != nNewSize )
42 : {
43 0 : BitmapEx aBitmap = aImage.GetBitmapEx();
44 0 : BitmapEx aBitmapex = BitmapEx::AutoScaleBitmap(aBitmap, nNewSize );
45 0 : aImage = Image( aBitmapex);
46 0 : xGraphic = aImage.GetXGraphic();
47 0 : }
48 0 : }
49 0 : }
50 :
51 0 : void CustomToolBarImportHelper::applyIcons()
52 : {
53 0 : for ( std::vector< iconcontrolitem >::iterator it = iconcommands.begin(); it != iconcommands.end(); ++it )
54 : {
55 0 : uno::Sequence< OUString > commands(1);
56 0 : commands[ 0 ] = it->sCommand;
57 0 : uno::Sequence< uno::Reference< graphic::XGraphic > > images(1);
58 0 : images[ 0 ] = it->image;
59 :
60 : OSL_TRACE("About to applyIcons for command %s, have image ? %s", OUStringToOString( commands[ 0 ], RTL_TEXTENCODING_UTF8 ).getStr(), images[ 0 ].is() ? "yes" : "no" );
61 0 : uno::Reference< ui::XImageManager > xImageManager( getCfgManager()->getImageManager(), uno::UNO_QUERY_THROW );
62 0 : sal_uInt16 nColor = ui::ImageType::COLOR_NORMAL;
63 :
64 0 : vcl::Window* topwin = Application::GetActiveTopWindow();
65 0 : if ( topwin != NULL && topwin->GetDisplayBackground().GetColor().IsDark() )
66 0 : nColor = css::ui::ImageType::COLOR_HIGHCONTRAST;
67 :
68 0 : ScaleImage( images[ 0 ], 16 );
69 0 : xImageManager->replaceImages( ui::ImageType::SIZE_DEFAULT | nColor, commands, images );
70 0 : ScaleImage( images[ 0 ], 26 );
71 0 : xImageManager->replaceImages( ui::ImageType::SIZE_LARGE | nColor, commands, images );
72 0 : }
73 0 : }
74 :
75 0 : void CustomToolBarImportHelper::addIcon( const uno::Reference< graphic::XGraphic >& xImage, const OUString& sString )
76 : {
77 0 : iconcontrolitem item;
78 0 : item.sCommand = sString;
79 0 : item.image = xImage;
80 0 : iconcommands.push_back( item );
81 0 : }
82 :
83 0 : CustomToolBarImportHelper::CustomToolBarImportHelper( SfxObjectShell& rDocShell, const css::uno::Reference< css::ui::XUIConfigurationManager>& rxAppCfgMgr ) : mrDocSh( rDocShell )
84 : {
85 0 : m_xCfgSupp.set( mrDocSh.GetModel(), uno::UNO_QUERY_THROW );
86 0 : m_xAppCfgMgr.set( rxAppCfgMgr, uno::UNO_QUERY_THROW );
87 0 : }
88 :
89 : uno::Reference< ui::XUIConfigurationManager >
90 0 : CustomToolBarImportHelper::getCfgManager()
91 : {
92 0 : return m_xCfgSupp->getUIConfigurationManager();
93 : }
94 :
95 :
96 : uno::Any
97 0 : CustomToolBarImportHelper::createCommandFromMacro( const OUString& sCmd )
98 : {
99 : //"vnd.sun.star.script:Standard.Module1.Main?language=Basic&location=document"
100 : static const char scheme[] = "vnd.sun.star.script:";
101 : static const char part2 [] = "?language=Basic&location=document";
102 : // create script url
103 0 : OUString scriptURL = scheme + sCmd + part2;
104 0 : return uno::makeAny( scriptURL );
105 : }
106 :
107 0 : OUString CustomToolBarImportHelper::MSOCommandToOOCommand( sal_Int16 msoCmd )
108 : {
109 0 : OUString result;
110 0 : if ( pMSOCmdConvertor.get() )
111 0 : result = pMSOCmdConvertor->MSOCommandToOOCommand( msoCmd );
112 0 : return result;
113 : }
114 :
115 0 : OUString CustomToolBarImportHelper::MSOTCIDToOOCommand( sal_Int16 msoTCID )
116 : {
117 0 : OUString result;
118 0 : if ( pMSOCmdConvertor.get() )
119 0 : result = pMSOCmdConvertor->MSOTCIDToOOCommand( msoTCID );
120 0 : return result;
121 : }
122 :
123 : bool
124 0 : CustomToolBarImportHelper::createMenu( const OUString& rName, const uno::Reference< container::XIndexAccess >& xMenuDesc, bool bPersist )
125 : {
126 0 : bool bRes = true;
127 : try
128 : {
129 0 : uno::Reference< ui::XUIConfigurationManager > xCfgManager( getCfgManager() );
130 0 : OUString sMenuBar("private:resource/menubar/");
131 0 : sMenuBar += rName;
132 0 : uno::Reference< container::XIndexContainer > xPopup( xCfgManager->createSettings(), uno::UNO_QUERY_THROW );
133 0 : uno::Reference< beans::XPropertySet > xProps( xPopup, uno::UNO_QUERY_THROW );
134 : // set name for menubar
135 0 : xProps->setPropertyValue("UIName", uno::makeAny( rName ) );
136 0 : if ( xPopup.is() )
137 : {
138 0 : uno::Sequence< beans::PropertyValue > aPopupMenu( 4 );
139 0 : aPopupMenu[0].Name = "CommandURL";
140 0 : aPopupMenu[0].Value = uno::makeAny( "vnd.openoffice.org:" + rName );
141 0 : aPopupMenu[1].Name = "Label";
142 0 : aPopupMenu[1].Value <<= rName;
143 0 : aPopupMenu[2].Name = "ItemDescriptorContainer";
144 0 : aPopupMenu[2].Value = uno::makeAny( xMenuDesc );
145 0 : aPopupMenu[3].Name = "Type";
146 0 : aPopupMenu[3].Value <<= sal_Int32( 0 );
147 :
148 0 : xPopup->insertByIndex( xPopup->getCount(), uno::makeAny( aPopupMenu ) );
149 0 : if ( bPersist )
150 : {
151 0 : xCfgManager->insertSettings( sMenuBar, uno::Reference< container::XIndexAccess >( xPopup, uno::UNO_QUERY ) );
152 0 : uno::Reference< ui::XUIConfigurationPersistence > xPersistence( xCfgManager, uno::UNO_QUERY_THROW );
153 0 : xPersistence->store();
154 0 : }
155 0 : }
156 : }
157 0 : catch( const uno::Exception& )
158 : {
159 0 : bRes = false;
160 : }
161 0 : return bRes;
162 : }
163 :
164 : void
165 0 : TBBase::indent_printf( FILE* fp, const char* format, ... )
166 : {
167 : va_list ap;
168 0 : va_start ( ap, format );
169 :
170 : // indent nIndent spaces
171 0 : for ( int i=0; i<nIndent; ++i)
172 0 : fprintf(fp," ");
173 : // append the rest of the message
174 0 : vfprintf( fp, format, ap );
175 0 : va_end( ap );
176 0 : }
177 :
178 0 : TBCHeader::TBCHeader()
179 : : bSignature(0x3)
180 : , bVersion(0x01)
181 : , bFlagsTCR(0)
182 : , tct(0x1) // default to Button
183 : , tcid(0)
184 : , tbct(0)
185 0 : , bPriority(0)
186 : {
187 0 : }
188 :
189 0 : TBCHeader::~TBCHeader()
190 : {
191 0 : }
192 :
193 0 : bool TBCHeader::Read( SvStream &rS )
194 : {
195 : SAL_INFO("filter.ms", "stream pos " << rS.Tell());
196 0 : nOffSet = rS.Tell();
197 0 : rS.ReadSChar( bSignature ).ReadSChar( bVersion ).ReadUChar( bFlagsTCR ).ReadUChar( tct ).ReadUInt16( tcid ).ReadUInt32( tbct ).ReadUChar( bPriority );
198 : // bit 4 ( from lsb )
199 0 : if ( bFlagsTCR & 0x10 )
200 : {
201 0 : width.reset( new sal_uInt16 );
202 0 : height.reset( new sal_uInt16 );
203 0 : rS.ReadUInt16( *width ).ReadUInt16( *height );
204 : }
205 0 : return true;
206 : }
207 :
208 : #if OSL_DEBUG_LEVEL > 1
209 : void TBCHeader::Print( FILE* fp )
210 : {
211 : Indent a;
212 : indent_printf(fp,"[ 0x%x ] TBCHeader -- dump\n", nOffSet );
213 : indent_printf(fp," bSignature 0x%x\n", bSignature );
214 : indent_printf(fp," bVersion 0x%x\n", bVersion );
215 : indent_printf(fp," bFlagsTCR 0x%x\n", bFlagsTCR );
216 : indent_printf(fp," tct 0x%x\n", tct );
217 : indent_printf(fp," tcid 0x%x\n", tcid );
218 : indent_printf(fp," tbct 0x%x\n", static_cast< unsigned int >( tbct ));
219 : indent_printf(fp," bPriority 0x%x\n", bPriority );
220 : if ( width.get() )
221 : indent_printf(fp," width 0x%d(0x%x)\n", *width, *width);
222 : if ( height.get() )
223 : indent_printf(fp," height 0x%d(0x%x)\n", *height, *height);
224 : }
225 : #endif
226 :
227 0 : TBCData::TBCData( const TBCHeader& Header ) : rHeader( Header )
228 : {
229 0 : }
230 :
231 0 : bool TBCData::Read(SvStream &rS)
232 : {
233 : SAL_INFO("filter.ms", "stream pos " << rS.Tell());
234 0 : nOffSet = rS.Tell();
235 0 : if ( !controlGeneralInfo.Read(rS) /*|| !controlSpecificInfo.Read(rS)*/ )
236 0 : return false;
237 0 : switch ( rHeader.getTct() )
238 : {
239 : case 0x01: // (Button control)
240 : case 0x10: // (ExpandingGrid control)
241 0 : controlSpecificInfo.reset( new TBCBSpecific() );
242 0 : break;
243 : case 0x0A: // (Popup control)
244 : case 0x0C: // (ButtonPopup control)
245 : case 0x0D: // (SplitButtonPopup control)
246 : case 0x0E: // (SplitButtonMRUPopup control)
247 0 : controlSpecificInfo.reset( new TBCMenuSpecific() );
248 0 : break;
249 : case 0x02: // (Edit control)
250 : case 0x04: // (ComboBox control)
251 : case 0x14: // (GraphicCombo control)
252 : case 0x03: // (DropDown control)
253 : case 0x06: // (SplitDropDown control)
254 : case 0x09: // (GraphicDropDown control)
255 0 : controlSpecificInfo.reset( new TBCComboDropdownSpecific( rHeader ) );
256 0 : break;
257 : default:
258 0 : break;
259 : }
260 0 : if ( controlSpecificInfo.get() )
261 0 : return controlSpecificInfo->Read( rS );
262 : //#FIXME I need to be able to handle different controlSpecificInfo types.
263 0 : return true;
264 : }
265 :
266 0 : TBCMenuSpecific* TBCData::getMenuSpecific()
267 : {
268 0 : TBCMenuSpecific* pMenu = dynamic_cast< TBCMenuSpecific* >( controlSpecificInfo.get() );
269 0 : return pMenu;
270 : }
271 0 : bool TBCData::ImportToolBarControl( CustomToolBarImportHelper& helper, std::vector< css::beans::PropertyValue >& props, bool& bBeginGroup, bool bIsMenuBar )
272 : {
273 0 : sal_uInt16 nStyle = 0;
274 0 : bBeginGroup = rHeader.isBeginGroup();
275 0 : controlGeneralInfo.ImportToolBarControlData( helper, props );
276 0 : beans::PropertyValue aProp;
277 0 : aProp.Name = "Visible";
278 0 : aProp.Value = uno::makeAny( rHeader.isVisible() ); // where is the visible attribute stored
279 0 : props.push_back( aProp );
280 0 : if ( rHeader.getTct() == 0x01
281 0 : || rHeader.getTct() == 0x10 )
282 : {
283 0 : TBCBSpecific* pSpecificInfo = dynamic_cast< TBCBSpecific* >( controlSpecificInfo.get() );
284 0 : if ( pSpecificInfo )
285 : {
286 : // if we have a icon then lets set it for the command
287 0 : OUString sCommand;
288 0 : for ( std::vector< css::beans::PropertyValue >::iterator it = props.begin(); it != props.end(); ++it )
289 : {
290 0 : if ( it->Name == "CommandURL" )
291 0 : it->Value >>= sCommand;
292 : }
293 0 : if ( TBCBitMap* pIcon = pSpecificInfo->getIcon() )
294 : {
295 : // Without a command openoffice won't display the icon
296 0 : if ( !sCommand.isEmpty() )
297 : {
298 0 : BitmapEx aBitEx( pIcon->getBitMap() );
299 0 : if ( pSpecificInfo->getIconMask() )
300 : // according to the spec:
301 : // "the iconMask is white in all the areas in which the icon is
302 : // displayed as transparent and is black in all other areas."
303 0 : aBitEx = BitmapEx( aBitEx.GetBitmap(), pSpecificInfo->getIconMask()->getBitMap().CreateMask( Color( COL_WHITE ) ) );
304 :
305 0 : Graphic aGraphic( aBitEx );
306 0 : helper.addIcon( aGraphic.GetXGraphic(), sCommand );
307 : }
308 : }
309 0 : else if ( pSpecificInfo->getBtnFace() )
310 : {
311 :
312 0 : OUString sBuiltInCmd = helper.MSOTCIDToOOCommand( *pSpecificInfo->getBtnFace() );
313 0 : if ( !sBuiltInCmd.isEmpty() )
314 : {
315 0 : uno::Sequence< OUString> sCmds(1);
316 0 : sCmds[ 0 ] = sBuiltInCmd;
317 0 : uno::Reference< ui::XImageManager > xImageManager( helper.getAppCfgManager()->getImageManager(), uno::UNO_QUERY_THROW );
318 : // 0 = default image size
319 0 : uno::Sequence< uno::Reference< graphic::XGraphic > > sImages = xImageManager->getImages( 0, sCmds );
320 0 : if ( sImages.getLength() && sImages[0].is() )
321 0 : helper.addIcon( sImages[0], sCommand );
322 0 : }
323 0 : }
324 : }
325 : }
326 0 : else if ( rHeader.getTct() == 0x0a )
327 : {
328 0 : aProp.Name = "CommandURL";
329 0 : OUString sMenuBar("private:resource/menubar/");
330 :
331 0 : TBCMenuSpecific* pMenu = getMenuSpecific();
332 0 : if ( pMenu )
333 0 : aProp.Value = uno::makeAny( sMenuBar += pMenu->Name() ); // name of popup
334 0 : nStyle |= ui::ItemStyle::DROP_DOWN;
335 0 : props.push_back( aProp );
336 : }
337 :
338 0 : short icontext = ( rHeader.getTbct() & 0x03 );
339 0 : aProp.Name = "Style";
340 0 : if ( bIsMenuBar )
341 : {
342 0 : nStyle |= ui::ItemStyle::TEXT;
343 0 : if ( !icontext || icontext == 0x3 )
344 : // Text And image
345 0 : nStyle |= ui::ItemStyle::ICON;
346 : }
347 : else
348 : {
349 0 : if ( ( icontext & 0x02 ) == 0x02 )
350 0 : nStyle |= ui::ItemStyle::TEXT;
351 0 : if ( !icontext || ( icontext & 0x03 ) == 0x03 )
352 0 : nStyle |= ui::ItemStyle::ICON;
353 : }
354 0 : aProp.Value <<= nStyle;
355 0 : props.push_back( aProp );
356 0 : return true; // just ignore
357 : }
358 :
359 : #if OSL_DEBUG_LEVEL > 1
360 : void TBCData::Print( FILE* fp )
361 : {
362 : Indent a;
363 : indent_printf(fp,"[ 0x%x ] TBCData -- dump\n", nOffSet );
364 : indent_printf(fp," dumping controlGeneralInfo( TBCGeneralInfo )\n");
365 : controlGeneralInfo.Print( fp );
366 : //if ( rHeader.getTct() == 1 )
367 : if ( controlSpecificInfo.get() )
368 : {
369 : indent_printf(fp," dumping controlSpecificInfo( TBCBSpecificInfo )\n");
370 : controlSpecificInfo->Print( fp );
371 : }
372 : }
373 : #endif
374 :
375 : bool
376 0 : WString::Read( SvStream &rS )
377 : {
378 : SAL_INFO("filter.ms", "stream pos " << rS.Tell());
379 0 : nOffSet = rS.Tell();
380 0 : sal_uInt8 nChars = 0;
381 0 : rS.ReadUChar( nChars );
382 0 : sString = read_uInt16s_ToOUString(rS, nChars);
383 0 : return true;
384 : }
385 :
386 0 : TBCExtraInfo::TBCExtraInfo()
387 : : idHelpContext(0)
388 : , tbcu(0)
389 0 : , tbmg(0)
390 : {
391 0 : }
392 :
393 : bool
394 0 : TBCExtraInfo::Read( SvStream &rS )
395 : {
396 : SAL_INFO("filter.ms", "stream pos " << rS.Tell());
397 0 : nOffSet = rS.Tell();
398 0 : if( !wstrHelpFile.Read( rS ) )
399 0 : return false;
400 :
401 0 : rS.ReadInt32( idHelpContext );
402 :
403 0 : if ( !wstrTag.Read( rS ) || !wstrOnAction.Read( rS ) || !wstrParam.Read( rS ) )
404 0 : return false;
405 :
406 0 : rS.ReadSChar( tbcu ).ReadSChar( tbmg );
407 0 : return true;
408 : }
409 :
410 : #if OSL_DEBUG_LEVEL > 1
411 : void
412 : TBCExtraInfo::Print( FILE* fp )
413 : {
414 : Indent a;
415 : indent_printf( fp, "[ 0x%x ] TBCExtraInfo -- dump\n", nOffSet );
416 : indent_printf( fp, " wstrHelpFile %s\n",
417 : OUStringToOString( wstrHelpFile.getString(), RTL_TEXTENCODING_UTF8 ).getStr() );
418 : indent_printf( fp, " idHelpContext 0x%x\n", static_cast< unsigned int >( idHelpContext ) );
419 : indent_printf( fp, " wstrTag %s\n",
420 : OUStringToOString( wstrTag.getString(), RTL_TEXTENCODING_UTF8 ).getStr() );
421 : indent_printf( fp, " wstrOnAction %s\n",
422 : OUStringToOString( wstrOnAction.getString(), RTL_TEXTENCODING_UTF8 ).getStr() );
423 : indent_printf( fp, " wstrParam %s\n",
424 : OUStringToOString( wstrParam.getString(), RTL_TEXTENCODING_UTF8 ).getStr() );
425 : indent_printf( fp, " tbcu 0x%x\n", tbcu );
426 : indent_printf( fp, " tbmg 0x%x\n", tbmg );
427 : }
428 : #endif
429 :
430 : OUString
431 0 : TBCExtraInfo::getOnAction()
432 : {
433 0 : return wstrOnAction.getString();
434 : }
435 :
436 0 : TBCGeneralInfo::TBCGeneralInfo() : bFlags( 0 )
437 : {
438 0 : }
439 :
440 0 : bool TBCGeneralInfo::Read( SvStream &rS )
441 : {
442 : SAL_INFO("filter.ms", "stream pos " << rS.Tell());
443 0 : nOffSet = rS.Tell();
444 0 : rS.ReadUChar( bFlags );
445 :
446 0 : if ( ( bFlags & 0x1 ) && !customText.Read( rS ) )
447 0 : return false;
448 0 : if ( ( bFlags & 0x2 ) && ( !descriptionText.Read( rS ) || !tooltip.Read( rS ) ) )
449 0 : return false;
450 0 : if ( ( bFlags & 0x4 ) && !extraInfo.Read( rS ) )
451 0 : return false;
452 0 : return true;
453 : }
454 :
455 : #if OSL_DEBUG_LEVEL > 1
456 : void
457 : TBCGeneralInfo::Print( FILE* fp )
458 : {
459 : Indent a;
460 : indent_printf( fp, "[ 0x%x ] TBCGeneralInfo -- dump\n", nOffSet );
461 : indent_printf( fp, " bFlags 0x%x\n", bFlags );
462 : indent_printf( fp, " customText %s\n",
463 : OUStringToOString( customText.getString(), RTL_TEXTENCODING_UTF8 ).getStr() );
464 : indent_printf( fp, " description %s\n",
465 : OUStringToOString( descriptionText.getString(), RTL_TEXTENCODING_UTF8 ).getStr() );
466 : indent_printf( fp, " tooltip %s\n",
467 : OUStringToOString( tooltip.getString(), RTL_TEXTENCODING_UTF8 ).getStr() );
468 : if ( bFlags & 0x4 )
469 : extraInfo.Print( fp );
470 : }
471 : #endif
472 :
473 : bool
474 0 : TBCGeneralInfo::ImportToolBarControlData( CustomToolBarImportHelper& helper, std::vector< beans::PropertyValue >& sControlData )
475 : {
476 0 : if ( ( bFlags & 0x5 ) )
477 : {
478 0 : beans::PropertyValue aProp;
479 : // probably access to the header would be a better test than seeing if there is an action, e.g.
480 : // if ( rHeader.getTct() == 0x01 && rHeader.getTcID() == 0x01 ) // not defined, probably this is a command
481 0 : if ( !extraInfo.getOnAction().isEmpty() )
482 : {
483 0 : aProp.Name = "CommandURL";
484 0 : ooo::vba::MacroResolvedInfo aMacroInf = ooo::vba::resolveVBAMacro( &helper.GetDocShell(), extraInfo.getOnAction(), true );
485 0 : if ( aMacroInf.mbFound )
486 0 : aProp.Value = CustomToolBarImportHelper::createCommandFromMacro( aMacroInf.msResolvedMacro );
487 : else
488 0 : aProp.Value <<= OUString( "UnResolvedMacro[" ).concat( extraInfo.getOnAction() ).concat( OUString( "]" ) );
489 0 : sControlData.push_back( aProp );
490 : }
491 :
492 0 : aProp.Name = "Label";
493 0 : aProp.Value = uno::makeAny( customText.getString().replace('&','~') );
494 0 : sControlData.push_back( aProp );
495 :
496 0 : aProp.Name = "Type";
497 0 : aProp.Value = uno::makeAny( ui::ItemType::DEFAULT );
498 0 : sControlData.push_back( aProp );
499 :
500 0 : aProp.Name = "Tooltip";
501 0 : aProp.Value = uno::makeAny( tooltip.getString() );
502 0 : sControlData.push_back( aProp );
503 : /*
504 : aToolbarItem(0).Name = "CommandURL" wstrOnAction
505 : aToolbarItem(0).Value = Command
506 : aToolbarItem(1).Name = "Label" customText
507 : aToolbarItem(1).Value = Label
508 : aToolbarItem(2).Name = "Type"
509 : aToolbarItem(2).Value = 0
510 : aToolbarItem(3).Name = "Visible"
511 : aToolbarItem(3).Value = true
512 : */
513 : }
514 0 : return true;
515 : }
516 :
517 0 : TBCMenuSpecific::TBCMenuSpecific() : tbid( 0 )
518 : {
519 0 : }
520 :
521 : bool
522 0 : TBCMenuSpecific::Read( SvStream &rS)
523 : {
524 : SAL_INFO("filter.ms", "stream pos " << rS.Tell());
525 0 : nOffSet = rS.Tell();
526 0 : rS.ReadInt32( tbid );
527 0 : if ( tbid == 1 )
528 : {
529 0 : name.reset( new WString() );
530 0 : return name->Read( rS );
531 : }
532 0 : return true;
533 : }
534 :
535 : #if OSL_DEBUG_LEVEL > 1
536 : void
537 : TBCMenuSpecific::Print( FILE* fp )
538 : {
539 : Indent a;
540 : indent_printf( fp, "[ 0x%x ] TBCMenuSpecific -- dump\n", nOffSet );
541 : indent_printf( fp, " tbid 0x%x\n", static_cast< unsigned int >( tbid ) );
542 : if ( tbid == 1 )
543 : indent_printf( fp, " name %s\n", OUStringToOString( name->getString(), RTL_TEXTENCODING_UTF8 ).getStr() );
544 : }
545 : #endif
546 :
547 0 : OUString TBCMenuSpecific::Name()
548 : {
549 0 : OUString aName;
550 0 : if ( name.get() )
551 0 : aName = name->getString();
552 0 : return aName;
553 : }
554 0 : TBCBSpecific::TBCBSpecific() : bFlags( 0 )
555 : {
556 0 : }
557 :
558 0 : bool TBCBSpecific::Read( SvStream &rS)
559 : {
560 : SAL_INFO("filter.ms", "stream pos " << rS.Tell());
561 0 : nOffSet = rS.Tell();
562 0 : rS.ReadUChar( bFlags );
563 :
564 : // bFlags determines what we read next
565 :
566 : // bFlags.fCustomBitmap = 1 ( 0x8 ) set
567 0 : if ( bFlags & 0x8 )
568 : {
569 0 : icon.reset( new TBCBitMap() );
570 0 : iconMask.reset( new TBCBitMap() );
571 0 : if ( !icon->Read( rS ) || !iconMask->Read( rS ) )
572 0 : return false;
573 : }
574 : // if bFlags.fCustomBtnFace = 1 ( 0x10 )
575 0 : if ( bFlags & 0x10 )
576 : {
577 0 : iBtnFace.reset( new sal_uInt16 );
578 0 : rS.ReadUInt16( *iBtnFace.get() );
579 : }
580 : // if bFlags.fAccelerator equals 1 ( 0x04 )
581 0 : if ( bFlags & 0x04 )
582 : {
583 0 : wstrAcc.reset( new WString() );
584 0 : return wstrAcc->Read( rS );
585 : }
586 0 : return true;
587 : }
588 :
589 :
590 : #if OSL_DEBUG_LEVEL > 1
591 : void TBCBSpecific::Print( FILE* fp )
592 : {
593 : Indent a;
594 : indent_printf( fp, "[ 0x%x ] TBCBSpecific -- dump\n", nOffSet );
595 : indent_printf( fp, " bFlags 0x%x\n", bFlags );
596 : bool bResult = ( icon.get() != NULL );
597 : indent_printf( fp, " icon present? %s\n", bResult ? "true" : "false" );
598 : if ( bResult )
599 : {
600 : Indent b;
601 : indent_printf( fp, " icon: \n");
602 : icon->Print( fp ); // will dump size
603 : }
604 : bResult = ( iconMask.get() != NULL );
605 : indent_printf( fp, " icon mask present? %s\n", bResult ? "true" : "false" );
606 : if ( bResult )
607 : {
608 : Indent c;
609 : indent_printf( fp, " icon mask: \n");
610 : iconMask->Print( fp ); // will dump size
611 : }
612 : if ( iBtnFace.get() )
613 : {
614 : indent_printf( fp, " iBtnFace 0x%x\n", *(iBtnFace.get()) );
615 : }
616 : bResult = ( wstrAcc.get() != NULL );
617 : indent_printf( fp, " option string present? %s ->%s<-\n", bResult ? "true" : "false", bResult ? OUStringToOString( wstrAcc->getString(), RTL_TEXTENCODING_UTF8 ).getStr() : "N/A" );
618 : }
619 : #endif
620 :
621 : TBCBitMap*
622 0 : TBCBSpecific::getIcon()
623 : {
624 0 : return icon.get();
625 : }
626 :
627 : TBCBitMap*
628 0 : TBCBSpecific::getIconMask()
629 : {
630 0 : return iconMask.get();
631 : }
632 :
633 0 : TBCComboDropdownSpecific::TBCComboDropdownSpecific(const TBCHeader& header )
634 : {
635 0 : if ( header.getTcID() == 0x01 )
636 0 : data.reset( new TBCCDData() );
637 0 : }
638 :
639 0 : bool TBCComboDropdownSpecific::Read( SvStream &rS)
640 : {
641 0 : nOffSet = rS.Tell();
642 0 : if ( data.get() )
643 0 : return data->Read( rS );
644 0 : return true;
645 : }
646 :
647 : #if OSL_DEBUG_LEVEL > 1
648 : void TBCComboDropdownSpecific::Print( FILE* fp)
649 : {
650 : Indent a;
651 : indent_printf(fp,"[ 0x%x ] TBCComboDropdownSpecific -- dump\n", nOffSet );
652 : if ( data.get() )
653 : data->Print( fp );
654 : else
655 : indent_printf(fp," no data " );
656 : }
657 : #endif
658 :
659 0 : TBCCDData::TBCCDData()
660 : : cwstrItems(0)
661 : , cwstrMRU(0)
662 : , iSel(0)
663 : , cLines(0)
664 0 : , dxWidth(0)
665 : {
666 0 : }
667 :
668 0 : TBCCDData::~TBCCDData()
669 : {
670 0 : }
671 :
672 0 : bool TBCCDData::Read( SvStream &rS)
673 : {
674 0 : nOffSet = rS.Tell();
675 0 : rS.ReadInt16( cwstrItems );
676 0 : if (cwstrItems > 0)
677 : {
678 : //each WString is at least one byte
679 0 : if (rS.remainingSize() < static_cast<size_t>(cwstrItems))
680 0 : return false;
681 0 : for( sal_Int32 index=0; index < cwstrItems; ++index )
682 : {
683 0 : WString aString;
684 0 : if ( !aString.Read( rS ) )
685 0 : return false;
686 0 : wstrList.push_back( aString );
687 0 : }
688 : }
689 0 : rS.ReadInt16( cwstrMRU ).ReadInt16( iSel ).ReadInt16( cLines ).ReadInt16( dxWidth );
690 :
691 0 : return wstrEdit.Read( rS );
692 : }
693 :
694 : #if OSL_DEBUG_LEVEL > 1
695 : void TBCCDData::Print( FILE* fp)
696 : {
697 : Indent a;
698 : indent_printf(fp,"[ 0x%x ] TBCCDData -- dump\n", nOffSet );
699 : indent_printf(fp," cwstrItems items in wstrList 0x%d\n", cwstrItems);
700 : for ( sal_Int32 index=0; index < cwstrItems; ++index )
701 : {
702 : Indent b;
703 : indent_printf(fp, " wstrList[%d] %s", static_cast< int >( index ), OUStringToOString( wstrList[index].getString(), RTL_TEXTENCODING_UTF8 ).getStr() );
704 : }
705 : indent_printf(fp," cwstrMRU num most recently used string 0x%d item\n", cwstrMRU);
706 : indent_printf(fp," iSel index of selected item 0x%d item\n", iSel);
707 : indent_printf(fp," cLines num of suggested lines to display 0x%d", cLines);
708 : indent_printf(fp," dxWidth width in pixels 0x%d", dxWidth);
709 : indent_printf(fp," wstrEdit %s", OUStringToOString( wstrEdit.getString(), RTL_TEXTENCODING_UTF8 ).getStr() );
710 : }
711 : #endif
712 :
713 0 : TBCBitMap::TBCBitMap() : cbDIB( 0 )
714 : {
715 0 : }
716 :
717 0 : TBCBitMap::~TBCBitMap()
718 : {
719 0 : }
720 :
721 0 : bool TBCBitMap::Read( SvStream& rS)
722 : {
723 : SAL_INFO("filter.ms", "stream pos " << rS.Tell());
724 0 : nOffSet = rS.Tell();
725 0 : rS.ReadInt32( cbDIB );
726 : // cbDIB = sizeOf(biHeader) + sizeOf(colors) + sizeOf(bitmapData) + 10
727 0 : return ReadDIB(mBitMap, rS, false, true);
728 : }
729 :
730 : #if OSL_DEBUG_LEVEL > 1
731 : void TBCBitMap::Print( FILE* fp )
732 : {
733 : Indent a;
734 : indent_printf(fp, "[ 0x%x ] TBCBitMap -- dump\n", nOffSet );
735 : indent_printf(fp, " TBCBitMap size of bitmap data 0x%x\n", static_cast< unsigned int > ( cbDIB ) );
736 : }
737 : #endif
738 :
739 0 : TB::TB() : bSignature(0x2),
740 : bVersion(0x1),
741 : cCL(0),
742 : ltbid( 0x1 ),
743 : ltbtr(0),
744 : cRowsDefault( 0 ),
745 0 : bFlags( 0 )
746 : {
747 0 : }
748 :
749 0 : bool TB::Read(SvStream &rS)
750 : {
751 : SAL_INFO("filter.ms", "stream pos " << rS.Tell());
752 0 : nOffSet = rS.Tell();
753 0 : rS.ReadUChar( bSignature ).ReadUChar( bVersion ).ReadInt16( cCL ).ReadInt32( ltbid ).ReadUInt32( ltbtr ).ReadUInt16( cRowsDefault ).ReadUInt16( bFlags );
754 0 : name.Read( rS );
755 0 : return true;
756 :
757 : }
758 :
759 0 : bool TB::IsEnabled()
760 : {
761 0 : return ( bFlags & 0x01 ) != 0x01;
762 : }
763 :
764 : #if OSL_DEBUG_LEVEL > 1
765 : void TB::Print( FILE* fp )
766 : {
767 : Indent a;
768 : indent_printf(fp,"[ 0x%x ] TB -- dump\n", nOffSet );
769 : indent_printf(fp," bSignature 0x%x\n", bSignature );
770 : indent_printf(fp," bVersion 0x%x\n", bVersion );
771 : indent_printf(fp," cCL 0x%x\n", cCL );
772 : indent_printf(fp," ltbid 0x%x\n", ltbid );
773 : indent_printf(fp," ltbtr 0x%x\n", ltbtr );
774 : indent_printf(fp," cRowsDefault 0x%x\n", cRowsDefault );
775 : indent_printf(fp," bFlags 0x%x\n", bFlags );
776 : indent_printf(fp, " name %s\n", OUStringToOString( name.getString(), RTL_TEXTENCODING_UTF8 ).getStr() );
777 : }
778 : #endif
779 :
780 0 : TBVisualData::TBVisualData() : tbds(0), tbv(0), tbdsDock(0), iRow(0)
781 : {
782 0 : }
783 :
784 0 : bool TBVisualData::Read( SvStream& rS )
785 : {
786 : SAL_INFO("filter.ms", "stream pos " << rS.Tell());
787 0 : nOffSet = rS.Tell();
788 0 : rS.ReadSChar( tbds ).ReadSChar( tbv ).ReadSChar( tbdsDock ).ReadSChar( iRow );
789 0 : rcDock.Read( rS );
790 0 : rcFloat.Read( rS );
791 0 : return true;
792 : }
793 :
794 : #if OSL_DEBUG_LEVEL > 1
795 : void SRECT::Print( FILE* fp )
796 : {
797 : Indent a;
798 : indent_printf( fp, " left 0x%x\n", left);
799 : indent_printf( fp, " top 0x%x\n", top);
800 : indent_printf( fp, " right 0x%x\n", right);
801 : indent_printf( fp, " bottom 0x%x\n", bottom);
802 : }
803 : #endif
804 :
805 : #if OSL_DEBUG_LEVEL > 1
806 : void TBVisualData::Print( FILE* fp )
807 : {
808 : Indent a;
809 : indent_printf( fp, "[ 0x%x ] TBVisualData -- dump\n", nOffSet );
810 : indent_printf( fp, " tbds 0x%x\n", tbds);
811 : indent_printf( fp, " tbv 0x%x\n", tbv);
812 : indent_printf( fp, " tbdsDoc 0x%x\n", tbdsDock);
813 : indent_printf( fp, " iRow 0x%x\n", iRow);
814 : rcDock.Print( fp );
815 : rcFloat.Print( fp );
816 : }
817 : #endif
818 :
819 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|