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_svx.hxx"
26
27
28 #include <sot/formats.hxx>
29 #include <vcl/msgbox.hxx>
30 #include <svtools/valueset.hxx>
31 #include <svl/urlbmk.hxx>
32 #include <svl/stritem.hxx>
33 #include <svl/intitem.hxx>
34 #include <svl/eitem.hxx>
35 #include <svtools/transfer.hxx>
36 #include <sfx2/bindings.hxx>
37 #include <sfx2/dispatch.hxx>
38 #include <sfx2/viewfrm.hxx>
39 #include <sfx2/sfxsids.hrc>
40 #include "svtools/filter.hxx"
41 #include <editeng/brshitem.hxx>
42 #include "helpid.hrc"
43 #include "svx/gallery.hxx"
44 #include "galobj.hxx"
45 #include "svx/gallery1.hxx"
46 #include "svx/galtheme.hxx"
47 #include "svx/galctrl.hxx"
48 #include "svx/galmisc.hxx"
49 #include "galbrws2.hxx"
50 #include "gallery.hrc"
51 #include <vcl/svapp.hxx>
52 #include <svx/fmmodel.hxx>
53 #include <svx/dialmgr.hxx>
54 #include <svx/svxdlg.hxx>
55 #include <svx/dialogs.hrc>
56 #include "GalleryControl.hxx"
57
58 #include <svx/svxcommands.h>
59 #include <svx/galleryitem.hxx>
60 #include <comphelper/processfactory.hxx>
61 #include <com/sun/star/frame/FrameSearchFlag.hpp>
62 #include <com/sun/star/gallery/GalleryItemType.hpp>
63 #include <com/sun/star/graphic/XGraphic.hpp>
64 #include <com/sun/star/style/GraphicLocation.hpp>
65 #include <map>
66
67 // -----------
68 // - Defines -
69 // -----------
70
71 #undef GALLERY_USE_CLIPBOARD
72
73 #define TBX_ID_ICON 1
74 #define TBX_ID_LIST 2
75
76 #define C2U( cstr ) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(cstr)))
77
78 namespace css = ::com::sun::star;
79 using rtl::OUString;
80
81 // -----------
82 // - statics -
83 // -----------
84
85 GalleryBrowserMode GalleryBrowser2::meInitMode = GALLERYBROWSERMODE_ICON;
86
87 struct DispatchInfo
88 {
89 css::util::URL TargetURL;
90 css::uno::Sequence< css::beans::PropertyValue > Arguments;
91 css::uno::Reference< css::frame::XDispatch > Dispatch;
92 };
93
IMPL_STATIC_LINK_NOINSTANCE(GalleryBrowser2,AsyncDispatch_Impl,DispatchInfo *,pDispatchInfo)94 IMPL_STATIC_LINK_NOINSTANCE( GalleryBrowser2, AsyncDispatch_Impl, DispatchInfo*, pDispatchInfo )
95 {
96 if ( pDispatchInfo && pDispatchInfo->Dispatch.is() )
97 {
98 try
99 {
100 pDispatchInfo->Dispatch->dispatch( pDispatchInfo->TargetURL,
101 pDispatchInfo->Arguments );
102 }
103 catch ( const css::uno::Exception& )
104 {
105 }
106 }
107
108 delete pDispatchInfo;
109 return 0;
110 }
111
112 namespace
113 {
114
115 struct CommandInfo
116 {
117 css::util::URL URL;
118 css::uno::Reference< css::frame::XDispatch > Dispatch;
119
CommandInfo__anon4a32f31c0111::CommandInfo120 CommandInfo( const OUString &rURL )
121 {
122 URL.Complete = rURL;
123 }
124 };
125
126 class GalleryThemePopup : public ::cppu::WeakImplHelper1< css::frame::XStatusListener >
127 {
128 private:
129 const GalleryTheme* mpTheme;
130 sal_uIntPtr mnObjectPos;
131 sal_Bool mbPreview;
132 PopupMenu maPopupMenu;
133 PopupMenu maBackgroundPopup;
134 GalleryBrowser2* mpBrowser;
135
136 typedef std::map< int, CommandInfo > CommandInfoMap;
137 CommandInfoMap m_aCommandInfo;
138
139 void Execute( const CommandInfo &rCmdInfo,
140 const css::uno::Sequence< css::beans::PropertyValue > &rArguments );
141
142 DECL_LINK( MenuSelectHdl, Menu* pMenu );
143 DECL_LINK( BackgroundMenuSelectHdl, Menu* pMenu );
144 public:
145 GalleryThemePopup( const GalleryTheme* pTheme,
146 sal_uIntPtr nObjectPos,
147 sal_Bool bPreview,
148 GalleryBrowser2* pBrowser );
149 ~GalleryThemePopup();
150
151 void ExecutePopup( Window *pParent, const ::Point &aPos );
152
153 virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent &rEvent);
154 virtual void SAL_CALL disposing( const css::lang::EventObject &rSource);
155 };
156
DBG_NAME(GalleryThemePopup)157 DBG_NAME(GalleryThemePopup)
158
159 GalleryThemePopup::GalleryThemePopup(
160 const GalleryTheme* pTheme,
161 sal_uIntPtr nObjectPos,
162 sal_Bool bPreview,
163 GalleryBrowser2* pBrowser )
164 : mpTheme( pTheme )
165 , mnObjectPos( nObjectPos )
166 , mbPreview( bPreview )
167 , maPopupMenu( GAL_RESID( RID_SVXMN_GALLERY2 ) )
168 , maBackgroundPopup()
169 , mpBrowser( pBrowser )
170 {
171 DBG_CTOR(GalleryThemePopup,NULL);
172
173 // SID_GALLERY_ENABLE_ADDCOPY
174 m_aCommandInfo.insert(
175 CommandInfoMap::value_type(
176 SID_GALLERY_ENABLE_ADDCOPY,
177 CommandInfo( C2U(CMD_SID_GALLERY_ENABLE_ADDCOPY ))));
178 // SID_GALLERY_BG_BRUSH
179 m_aCommandInfo.insert(
180 CommandInfoMap::value_type(
181 SID_GALLERY_BG_BRUSH,
182 CommandInfo(C2U(CMD_SID_GALLERY_BG_BRUSH ))));
183 // SID_GALLERY_FORMATS
184 m_aCommandInfo.insert(
185 CommandInfoMap::value_type(
186 SID_GALLERY_FORMATS,
187 CommandInfo(C2U(CMD_SID_GALLERY_FORMATS ))));
188
189 }
190
~GalleryThemePopup()191 GalleryThemePopup::~GalleryThemePopup()
192 {
193 DBG_DTOR(GalleryThemePopup,NULL);
194 }
195
statusChanged(const css::frame::FeatureStateEvent & rEvent)196 void SAL_CALL GalleryThemePopup::statusChanged(
197 const css::frame::FeatureStateEvent &rEvent )
198 {
199 const OUString &rURL = rEvent.FeatureURL.Complete;
200 if ( rURL.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( CMD_SID_GALLERY_ENABLE_ADDCOPY ) ) )
201 {
202 if ( !rEvent.IsEnabled )
203 {
204 PopupMenu *pAddMenu = maPopupMenu.GetPopupMenu( MN_ADDMENU );
205 pAddMenu->EnableItem( MN_ADD, sal_False );
206 pAddMenu->EnableItem( MN_ADD_LINK, sal_False );
207 }
208 }
209 else if ( rURL.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( CMD_SID_GALLERY_BG_BRUSH ) ) )
210 {
211 maBackgroundPopup.Clear();
212 if ( rEvent.IsEnabled )
213 {
214 OUString sItem;
215 css::uno::Sequence< OUString > sItems;
216 if ( ( rEvent.State >>= sItem ) && sItem.getLength() )
217 {
218 maBackgroundPopup.InsertItem( 1, sItem );
219 }
220 else if ( ( rEvent.State >>= sItems ) && sItems.getLength() )
221 {
222 const OUString *pStr = sItems.getConstArray();
223 const OUString *pEnd = pStr + sItems.getLength();
224 for ( sal_uInt16 nId = 1; pStr != pEnd; pStr++, nId++ )
225 {
226 maBackgroundPopup.InsertItem( nId, *pStr );
227 }
228 }
229 }
230 }
231 }
232
disposing(const css::lang::EventObject &)233 void SAL_CALL GalleryThemePopup::disposing(
234 const css::lang::EventObject &/*rSource*/)
235 {
236 }
237
Execute(const CommandInfo & rCmdInfo,const css::uno::Sequence<css::beans::PropertyValue> & rArguments)238 void GalleryThemePopup::Execute(
239 const CommandInfo &rCmdInfo,
240 const css::uno::Sequence< css::beans::PropertyValue > &rArguments )
241 {
242 if ( rCmdInfo.Dispatch.is() )
243 {
244 DispatchInfo *pInfo = new DispatchInfo;
245 pInfo->TargetURL = rCmdInfo.URL;
246 pInfo->Arguments = rArguments;
247 pInfo->Dispatch = rCmdInfo.Dispatch;
248
249 if ( !Application::PostUserEvent(
250 STATIC_LINK( 0, GalleryBrowser2, AsyncDispatch_Impl), pInfo ) )
251 delete pInfo;
252 }
253 }
254
ExecutePopup(Window * pWindow,const::Point & aPos)255 void GalleryThemePopup::ExecutePopup( Window *pWindow, const ::Point &aPos )
256 {
257 css::uno::Reference< css::frame::XStatusListener > xThis( this );
258
259 const SgaObjKind eObjKind = mpTheme->GetObjectKind( mnObjectPos );
260 PopupMenu* pAddMenu = maPopupMenu.GetPopupMenu( MN_ADDMENU );
261 INetURLObject aURL;
262
263 const_cast< GalleryTheme* >( mpTheme )->GetURL( mnObjectPos, aURL );
264 const sal_Bool bValidURL = ( aURL.GetProtocol() != INET_PROT_NOT_VALID );
265
266 pAddMenu->EnableItem( MN_ADD, bValidURL && SGA_OBJ_SOUND != eObjKind );
267 pAddMenu->EnableItem( MN_ADD_LINK, bValidURL && SGA_OBJ_SVDRAW != eObjKind );
268
269 maPopupMenu.EnableItem( MN_ADDMENU, pAddMenu->IsItemEnabled( MN_ADD ) || pAddMenu->IsItemEnabled( MN_ADD_LINK ) );
270 maPopupMenu.EnableItem( MN_PREVIEW, bValidURL );
271
272 maPopupMenu.CheckItem( MN_PREVIEW, mbPreview );
273
274 if( mpTheme->IsReadOnly() || !mpTheme->GetObjectCount() )
275 {
276 maPopupMenu.EnableItem( MN_DELETE, sal_False );
277 maPopupMenu.EnableItem( MN_TITLE, sal_False );
278
279 if( mpTheme->IsReadOnly() )
280 maPopupMenu.EnableItem( MN_PASTECLIPBOARD, sal_False );
281
282 if( !mpTheme->GetObjectCount() )
283 maPopupMenu.EnableItem( MN_COPYCLIPBOARD, sal_False );
284 }
285 else
286 {
287 maPopupMenu.EnableItem( MN_DELETE, !mbPreview );
288 maPopupMenu.EnableItem( MN_TITLE, sal_True );
289 maPopupMenu.EnableItem( MN_COPYCLIPBOARD, sal_True );
290 maPopupMenu.EnableItem( MN_PASTECLIPBOARD, sal_True );
291 }
292
293 #ifdef GALLERY_USE_CLIPBOARD
294 if( maPopupMenu.IsItemEnabled( MN_PASTECLIPBOARD ) )
295 {
296 TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( this ) );
297 sal_Bool bEnable = sal_False;
298
299 if( aDataHelper.GetFormatCount() )
300 {
301 if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ) ||
302 aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) ||
303 aDataHelper.HasFormat( FORMAT_FILE ) ||
304 aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ) ||
305 aDataHelper.HasFormat( FORMAT_GDIMETAFILE ) ||
306 aDataHelper.HasFormat( FORMAT_BITMAP ) )
307 {
308 bEnable = sal_True;
309 }
310 }
311
312 if( !bEnable )
313 maPopupMenu.EnableItem( MN_PASTECLIPBOARD, sal_False );
314 }
315 #else
316 maPopupMenu.EnableItem( MN_COPYCLIPBOARD, sal_False );
317 maPopupMenu.EnableItem( MN_PASTECLIPBOARD, sal_False );
318 #endif
319
320 // update status
321 css::uno::Reference< css::frame::XDispatchProvider> xDispatchProvider(
322 mpBrowser->GetFrame(), css::uno::UNO_QUERY );
323 css::uno::Reference< css::util::XURLTransformer > xTransformer(
324 mpBrowser->GetURLTransformer() );
325 for ( CommandInfoMap::iterator it = m_aCommandInfo.begin();
326 it != m_aCommandInfo.end(); it++ )
327 {
328 try
329 {
330 CommandInfo &rCmdInfo = it->second;
331 if ( xTransformer.is() )
332 xTransformer->parseStrict( rCmdInfo.URL );
333
334 if ( xDispatchProvider.is() )
335 {
336 rCmdInfo.Dispatch = xDispatchProvider->queryDispatch(
337 rCmdInfo.URL,
338 C2U( "_self" ),
339 css::frame::FrameSearchFlag::SELF );
340 }
341
342 if ( rCmdInfo.Dispatch.is() )
343 {
344 rCmdInfo.Dispatch->addStatusListener( this, rCmdInfo.URL );
345 rCmdInfo.Dispatch->removeStatusListener( this, rCmdInfo.URL );
346 }
347 }
348 catch ( ... )
349 {}
350 }
351
352 if( !maBackgroundPopup.GetItemCount() || ( eObjKind == SGA_OBJ_SVDRAW ) || ( eObjKind == SGA_OBJ_SOUND ) )
353 pAddMenu->EnableItem( MN_BACKGROUND, sal_False );
354 else
355 {
356 pAddMenu->EnableItem( MN_BACKGROUND, sal_True );
357 pAddMenu->SetPopupMenu( MN_BACKGROUND, &maBackgroundPopup );
358 maBackgroundPopup.SetSelectHdl( LINK( this, GalleryThemePopup, BackgroundMenuSelectHdl ) );
359 }
360
361 pAddMenu->RemoveDisabledEntries();
362 if ( !pAddMenu->GetItemCount() )
363 maPopupMenu.EnableItem( MN_ADDMENU, sal_False );
364 maPopupMenu.RemoveDisabledEntries();
365
366 maPopupMenu.SetSelectHdl( LINK( this, GalleryThemePopup, MenuSelectHdl ) );
367 maPopupMenu.Execute( pWindow, aPos );
368 }
369
IMPL_LINK(GalleryThemePopup,MenuSelectHdl,Menu *,pMenu)370 IMPL_LINK( GalleryThemePopup, MenuSelectHdl, Menu*, pMenu )
371 {
372 if( !pMenu )
373 return 0;
374
375 sal_uInt16 nId( pMenu->GetCurItemId() );
376 switch ( nId )
377 {
378 case( MN_ADD ):
379 case( MN_ADD_LINK ):
380 {
381 const CommandInfoMap::const_iterator it = m_aCommandInfo.find( SID_GALLERY_FORMATS );
382 if ( it != m_aCommandInfo.end() )
383 mpBrowser->Dispatch( nId,
384 it->second.Dispatch,
385 it->second.URL );
386 }
387 break;
388
389 default:
390 mpBrowser->Execute( nId );
391 }
392
393 return 0;
394 }
395
IMPL_LINK(GalleryThemePopup,BackgroundMenuSelectHdl,Menu *,pMenu)396 IMPL_LINK( GalleryThemePopup, BackgroundMenuSelectHdl, Menu*, pMenu )
397 {
398 if( !pMenu )
399 return 0;
400
401 sal_uInt16 nPos( pMenu->GetCurItemId() - 1 );
402 OUString aURL( mpBrowser->GetURL().GetMainURL( INetURLObject::NO_DECODE ) );
403 OUString aFilterName( mpBrowser->GetFilterName() );
404
405 css::uno::Sequence< css::beans::PropertyValue > aArgs( 6 );
406 aArgs[0].Name = C2U( "Background.Transparent" );
407 aArgs[0].Value <<= sal_Int32( 0 ); // 0 - 100
408 aArgs[1].Name = C2U( "Background.BackColor" );
409 aArgs[1].Value <<= sal_Int32( - 1 );
410 aArgs[2].Name = C2U( "Background.URL" );
411 aArgs[2].Value <<= aURL;
412 aArgs[3].Name = C2U( "Background.Filtername" ); // FIXME should be FilterName
413 aArgs[3].Value <<= aFilterName;
414 aArgs[4].Name = C2U( "Background.Position" );
415 aArgs[4].Value <<= css::style::GraphicLocation_TILED;
416 aArgs[5].Name = C2U( "Position" );
417 aArgs[5].Value <<= nPos;
418
419 const CommandInfoMap::const_iterator it = m_aCommandInfo.find( SID_GALLERY_BG_BRUSH );
420 if ( it != m_aCommandInfo.end() )
421 Execute( it->second, aArgs );
422
423 return 0;
424 }
425
426 } // end anonymous namespace
427
428 // ------------------
429 // - GalleryToolBox -
430 // ------------------
DBG_NAME(GalleryToolBox)431 DBG_NAME(GalleryToolBox)
432
433 GalleryToolBox::GalleryToolBox( GalleryBrowser2* pParent ) :
434 ToolBox( pParent, WB_TABSTOP )
435 {
436 DBG_CTOR(GalleryToolBox,NULL);
437
438 }
439
440 // ------------------------------------------------------------------------
441
~GalleryToolBox()442 GalleryToolBox::~GalleryToolBox()
443 {
444
445 DBG_DTOR(GalleryToolBox,NULL);
446 }
447
448 // ------------------------------------------------------------------------
449
KeyInput(const KeyEvent & rKEvt)450 void GalleryToolBox::KeyInput( const KeyEvent& rKEvt )
451 {
452 if( !static_cast< GalleryBrowser2* >( GetParent() )->KeyInput( rKEvt, this ) )
453 ToolBox::KeyInput( rKEvt );
454 }
455
456 // -------------------
457 // - GalleryBrowser2 -
458 // -------------------
DBG_NAME(GalleryBrowser2)459 DBG_NAME(GalleryBrowser2)
460
461 GalleryBrowser2::GalleryBrowser2( Window* pParent, const ResId& rResId, Gallery* pGallery ) :
462 Control ( pParent, rResId ),
463 mpGallery ( pGallery ),
464 mpCurTheme ( NULL ),
465 mpIconView ( new GalleryIconView( this, NULL ) ),
466 mpListView ( new GalleryListView( this, NULL ) ),
467 mpPreview ( new GalleryPreview( this, NULL ) ),
468 maViewBox ( this ),
469 maSeparator ( this, WB_VERT ),
470 maInfoBar ( this, WB_LEFT | WB_VCENTER ),
471 mnCurActionPos ( 0xffffffff ),
472 meMode ( GALLERYBROWSERMODE_NONE ),
473 meLastMode ( GALLERYBROWSERMODE_NONE )
474 {
475 DBG_CTOR(GalleryBrowser2,NULL);
476
477 m_xContext.set( ::comphelper::getProcessComponentContext() );
478
479 m_xTransformer.set(
480 m_xContext->getServiceManager()->createInstanceWithContext(
481 C2U( "com.sun.star.util.URLTransformer" ), m_xContext ),
482 css::uno::UNO_QUERY );
483
484 Image aDummyImage;
485 const Link aSelectHdl( LINK( this, GalleryBrowser2, SelectObjectHdl ) );
486 Font aInfoFont( maInfoBar.GetControlFont() );
487
488 maMiscOptions.AddListenerLink( LINK( this, GalleryBrowser2, MiscHdl ) );
489
490 maViewBox.InsertItem( TBX_ID_ICON, aDummyImage );
491 maViewBox.SetItemBits( TBX_ID_ICON, TIB_RADIOCHECK | TIB_AUTOCHECK );
492 maViewBox.SetHelpId( TBX_ID_ICON, HID_GALLERY_ICONVIEW );
493 maViewBox.SetQuickHelpText( TBX_ID_ICON, String( GAL_RESID( RID_SVXSTR_GALLERY_ICONVIEW ) ) );
494
495 maViewBox.InsertItem( TBX_ID_LIST, aDummyImage );
496 maViewBox.SetItemBits( TBX_ID_LIST, TIB_RADIOCHECK | TIB_AUTOCHECK );
497 maViewBox.SetHelpId( TBX_ID_LIST, HID_GALLERY_LISTVIEW );
498 maViewBox.SetQuickHelpText( TBX_ID_LIST, String( GAL_RESID( RID_SVXSTR_GALLERY_LISTVIEW ) ) );
499
500 maViewBox.SetBorder( 0, 1 );
501 MiscHdl( NULL );
502 maViewBox.SetSelectHdl( LINK( this, GalleryBrowser2, SelectTbxHdl ) );
503 maViewBox.Show();
504
505 mpIconView->SetAccessibleName(String( SVX_RES( RID_SVXSTR_GALLERY_THEMEITEMS ) ));
506 mpListView->SetAccessibleName(String( SVX_RES( RID_SVXSTR_GALLERY_THEMEITEMS ) ));
507
508 maInfoBar.Show();
509 maSeparator.Show();
510
511 mpIconView->SetSelectHdl( aSelectHdl );
512 mpListView->SetSelectHdl( aSelectHdl );
513
514 InitSettings();
515
516 SetMode( ( GALLERYBROWSERMODE_PREVIEW != GalleryBrowser2::meInitMode ) ? GalleryBrowser2::meInitMode : GALLERYBROWSERMODE_ICON );
517
518 if(maInfoBar.GetText().Len() == 0)
519 mpIconView->SetAccessibleRelationLabeledBy(mpIconView);
520 else
521 mpIconView->SetAccessibleRelationLabeledBy(&maInfoBar);
522 mpIconView->SetAccessibleRelationMemberOf(mpIconView);
523 }
524
525 // -----------------------------------------------------------------------------
526
~GalleryBrowser2()527 GalleryBrowser2::~GalleryBrowser2()
528 {
529 maMiscOptions.RemoveListenerLink( LINK( this, GalleryBrowser2, MiscHdl ) );
530
531 delete mpPreview;
532 delete mpListView;
533 delete mpIconView;
534
535 if( mpCurTheme )
536 mpGallery->ReleaseTheme( mpCurTheme, *this );
537
538 DBG_DTOR(GalleryBrowser2,NULL);
539 }
540
541 // -----------------------------------------------------------------------------
542
InitSettings()543 void GalleryBrowser2::InitSettings()
544 {
545 Font aInfoFont( maInfoBar.GetControlFont() );
546
547 aInfoFont.SetWeight( WEIGHT_BOLD );
548 aInfoFont.SetColor( GALLERY_FG_COLOR );
549 maInfoBar.SetControlFont( aInfoFont );
550
551 maInfoBar.SetBackground( Wallpaper( GALLERY_DLG_COLOR ) );
552 maInfoBar.SetControlBackground( GALLERY_DLG_COLOR );
553
554 maSeparator.SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
555 maSeparator.SetControlBackground( GALLERY_BG_COLOR );
556 maSeparator.SetControlForeground( GALLERY_FG_COLOR );
557 }
558
559 // -----------------------------------------------------------------------------
560
DataChanged(const DataChangedEvent & rDCEvt)561 void GalleryBrowser2::DataChanged( const DataChangedEvent& rDCEvt )
562 {
563 if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
564 InitSettings();
565 else
566 Control::DataChanged( rDCEvt );
567 }
568
569 // -----------------------------------------------------------------------------
570
Resize()571 void GalleryBrowser2::Resize()
572 {
573 Control::Resize();
574
575 mpIconView->Hide();
576 mpListView->Hide();
577 mpPreview->Hide();
578
579 const Size aOutSize( GetOutputSizePixel() );
580 const Size aBoxSize( maViewBox.GetOutputSizePixel() );
581 const long nOffset = 2, nSepWidth = 2;
582 const long nInfoBarX = aBoxSize.Width() + ( nOffset * 3 ) + nSepWidth;
583 const Point aPt( 0, aBoxSize.Height() + 3 );
584 const Size aSz( aOutSize.Width(), aOutSize.Height() - aPt.Y() );
585
586 maSeparator.SetPosSizePixel( Point( aBoxSize.Width() + nOffset, 0 ), Size( nSepWidth, aBoxSize.Height() ) );
587 maInfoBar.SetPosSizePixel( Point( nInfoBarX, 0 ), Size( aOutSize.Width() - nInfoBarX, aBoxSize.Height() ) );
588
589 mpIconView->SetPosSizePixel( aPt, aSz );
590 mpListView->SetPosSizePixel( aPt, aSz );
591 mpPreview->SetPosSizePixel( aPt, aSz );
592
593 switch( GetMode() )
594 {
595 case( GALLERYBROWSERMODE_ICON ): mpIconView->Show(); break;
596 case( GALLERYBROWSERMODE_LIST ): mpListView->Show(); break;
597 case( GALLERYBROWSERMODE_PREVIEW ): mpPreview->Show(); break;
598
599 default:
600 break;
601 }
602 }
603
604 // -----------------------------------------------------------------------------
605
Notify(SfxBroadcaster &,const SfxHint & rHint)606 void GalleryBrowser2::Notify( SfxBroadcaster&, const SfxHint& rHint )
607 {
608 const GalleryHint& rGalleryHint = (const GalleryHint&) rHint;
609
610 switch( rGalleryHint.GetType() )
611 {
612 case( GALLERY_HINT_THEME_UPDATEVIEW ):
613 {
614 if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
615 SetMode( meLastMode );
616
617 ImplUpdateViews( (sal_uInt16) rGalleryHint.GetData1() + 1 );
618 }
619 break;
620
621 default:
622 break;
623 }
624 }
625
626 // -----------------------------------------------------------------------------
627
AcceptDrop(DropTargetHelper & rTarget,const AcceptDropEvent &)628 sal_Int8 GalleryBrowser2::AcceptDrop( DropTargetHelper& rTarget, const AcceptDropEvent& )
629 {
630 sal_Int8 nRet = DND_ACTION_NONE;
631
632 if( mpCurTheme && !mpCurTheme->IsReadOnly() && !mpCurTheme ->IsImported() )
633 {
634 if( !mpCurTheme->IsDragging() )
635 {
636 if( rTarget.IsDropFormatSupported( SOT_FORMATSTR_ID_DRAWING ) ||
637 rTarget.IsDropFormatSupported( SOT_FORMAT_FILE_LIST ) ||
638 rTarget.IsDropFormatSupported( FORMAT_FILE ) ||
639 rTarget.IsDropFormatSupported( SOT_FORMATSTR_ID_SVXB ) ||
640 rTarget.IsDropFormatSupported( FORMAT_GDIMETAFILE ) ||
641 rTarget.IsDropFormatSupported( FORMAT_BITMAP ) )
642 {
643 nRet = DND_ACTION_COPY;
644 }
645 }
646 else
647 nRet = DND_ACTION_COPY;
648 }
649
650 return nRet;
651 }
652
653 // -----------------------------------------------------------------------------
654
ExecuteDrop(DropTargetHelper &,const ExecuteDropEvent & rEvt)655 sal_Int8 GalleryBrowser2::ExecuteDrop( DropTargetHelper&, const ExecuteDropEvent& rEvt )
656 {
657 sal_Int8 nRet = DND_ACTION_NONE;
658
659 if( mpCurTheme )
660 {
661 Point aSelPos;
662 const sal_uIntPtr nItemId = ImplGetSelectedItemId( &rEvt.maPosPixel, aSelPos );
663 const sal_uIntPtr nInsertPos = ( nItemId ? ( nItemId - 1 ) : LIST_APPEND );
664
665 if( mpCurTheme->IsDragging() )
666 mpCurTheme->ChangeObjectPos( mpCurTheme->GetDragPos(), nInsertPos );
667 else
668 nRet = mpCurTheme->InsertTransferable( rEvt.maDropEvent.Transferable, nInsertPos );
669 }
670
671 return nRet;
672 }
673
674 // -----------------------------------------------------------------------------
675
StartDrag(Window *,const Point * pDragPoint)676 void GalleryBrowser2::StartDrag( Window*, const Point* pDragPoint )
677 {
678 if( mpCurTheme )
679 {
680 Point aSelPos;
681 const sal_uIntPtr nItemId = ImplGetSelectedItemId( pDragPoint, aSelPos );
682
683 if( nItemId )
684 mpCurTheme->StartDrag( this, nItemId - 1 );
685 }
686 }
687
688 // -----------------------------------------------------------------------------
689
TogglePreview(Window *,const Point *)690 void GalleryBrowser2::TogglePreview( Window*, const Point* )
691 {
692 SetMode( ( GALLERYBROWSERMODE_PREVIEW != GetMode() ) ? GALLERYBROWSERMODE_PREVIEW : meLastMode );
693 GetViewWindow()->GrabFocus();
694 }
695
696 // -----------------------------------------------------------------------------
697
ShowContextMenu(Window *,const Point * pContextPoint)698 void GalleryBrowser2::ShowContextMenu( Window*, const Point* pContextPoint )
699 {
700 Point aSelPos;
701 const sal_uIntPtr nItemId = ImplGetSelectedItemId( pContextPoint, aSelPos );
702
703 if( mpCurTheme && nItemId && ( nItemId <= mpCurTheme->GetObjectCount() ) )
704 {
705 ImplSelectItemId( nItemId );
706
707 css::uno::Reference< css::frame::XFrame > xFrame( GetFrame() );
708 if ( xFrame.is() )
709 {
710 mnCurActionPos = nItemId - 1;
711 rtl::Reference< GalleryThemePopup > rPopup(
712 new GalleryThemePopup(
713 mpCurTheme,
714 mnCurActionPos,
715 GALLERYBROWSERMODE_PREVIEW == GetMode(),
716 this ) );
717 rPopup->ExecutePopup( this, aSelPos );
718 }
719 }
720 }
721
722 // -----------------------------------------------------------------------------
723
KeyInput(const KeyEvent & rKEvt,Window * pWindow)724 sal_Bool GalleryBrowser2::KeyInput( const KeyEvent& rKEvt, Window* pWindow )
725 {
726 Point aSelPos;
727 const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
728 GalleryBrowser* pParentBrowser = dynamic_cast<GalleryBrowser*>(GetParent());
729 sal_Bool bRet = sal_False;
730 if (pParentBrowser != NULL)
731 bRet = pParentBrowser->KeyInput( rKEvt, pWindow );
732 else
733 {
734 svx::sidebar::GalleryControl* pParentControl = dynamic_cast<svx::sidebar::GalleryControl*>(GetParent());
735 if (pParentControl != NULL)
736 bRet = pParentControl->KeyInput(rKEvt, pWindow);
737 }
738
739 if( !bRet && !maViewBox.HasFocus() && nItemId && mpCurTheme )
740 {
741 sal_uInt16 nExecuteId = 0;
742 const SgaObjKind eObjKind = mpCurTheme->GetObjectKind( nItemId - 1 );
743 INetURLObject aURL;
744
745 const_cast< GalleryTheme* >( mpCurTheme )->GetURL( nItemId - 1, aURL );
746
747 const sal_Bool bValidURL = ( aURL.GetProtocol() != INET_PROT_NOT_VALID );
748 sal_Bool bPreview = bValidURL;
749 sal_Bool bAdd = bValidURL;
750 sal_Bool bAddLink = ( bValidURL && SGA_OBJ_SVDRAW != eObjKind );
751 sal_Bool bDelete = sal_False;
752 sal_Bool bTitle = sal_False;
753
754 if( !mpCurTheme->IsReadOnly() && mpCurTheme->GetObjectCount() )
755 {
756 bDelete = ( GALLERYBROWSERMODE_PREVIEW != GetMode() );
757 bTitle = sal_True;
758 }
759
760 switch( rKEvt.GetKeyCode().GetCode() )
761 {
762 case( KEY_SPACE ):
763 case( KEY_RETURN ):
764 case( KEY_P ):
765 {
766 if( bPreview )
767 {
768 TogglePreview( pWindow );
769 bRet = sal_True;
770 }
771 }
772 break;
773
774 case( KEY_INSERT ):
775 case( KEY_I ):
776 {
777 // Inserting a gallery item in the document must be dispatched
778 if( bAddLink && rKEvt.GetKeyCode().IsShift() && rKEvt.GetKeyCode().IsMod1() )
779 nExecuteId = MN_ADD_LINK;
780 else if( bAdd )
781 nExecuteId = MN_ADD;
782 if( nExecuteId )
783 {
784 Dispatch( nExecuteId );
785 return sal_True;
786 }
787 }
788 break;
789
790 case( KEY_DELETE ):
791 case( KEY_D ):
792 {
793 if( bDelete )
794 nExecuteId = MN_DELETE;
795 }
796 break;
797
798 case( KEY_T ):
799 {
800 if( bTitle )
801 nExecuteId = MN_TITLE;
802 }
803 break;
804
805 default:
806 break;
807 }
808
809 if( nExecuteId )
810 {
811 Execute( nExecuteId );
812 bRet = sal_True;
813 }
814 }
815
816 return bRet;
817 }
818
819 // -----------------------------------------------------------------------------
820
SelectTheme(const String & rThemeName)821 void GalleryBrowser2::SelectTheme( const String& rThemeName )
822 {
823 delete mpIconView, mpIconView = NULL;
824 delete mpListView, mpListView = NULL;
825 delete mpPreview, mpPreview = NULL;
826
827 if( mpCurTheme )
828 mpGallery->ReleaseTheme( mpCurTheme, *this );
829
830 mpCurTheme = mpGallery->AcquireTheme( rThemeName, *this );
831
832 mpIconView = new GalleryIconView( this, mpCurTheme );
833 mpListView = new GalleryListView( this, mpCurTheme );
834 mpPreview = new GalleryPreview( this, mpCurTheme );
835
836 mpIconView->SetAccessibleName(String( SVX_RES( RID_SVXSTR_GALLERY_THEMEITEMS ) ));
837 mpListView->SetAccessibleName(String( SVX_RES( RID_SVXSTR_GALLERY_THEMEITEMS ) ));
838 mpPreview->SetAccessibleName(String( SVX_RES( RID_SVXSTR_GALLERY_PREVIEW ) ));
839
840 const Link aSelectHdl( LINK( this, GalleryBrowser2, SelectObjectHdl ) );
841
842 mpIconView->SetSelectHdl( aSelectHdl );
843 mpListView->SetSelectHdl( aSelectHdl );
844
845 if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
846 meMode = meLastMode;
847
848 Resize();
849 ImplUpdateViews( 1 );
850
851 maViewBox.EnableItem( TBX_ID_ICON, sal_True );
852 maViewBox.EnableItem( TBX_ID_LIST, sal_True );
853 maViewBox.CheckItem( ( GALLERYBROWSERMODE_ICON == GetMode() ) ? TBX_ID_ICON : TBX_ID_LIST, sal_True );
854
855 if(maInfoBar.GetText().Len() == 0)
856 mpIconView->SetAccessibleRelationLabeledBy(mpIconView);
857 else
858 mpIconView->SetAccessibleRelationLabeledBy(&maInfoBar);
859 mpIconView->SetAccessibleRelationMemberOf(mpIconView);
860 }
861
862 // -----------------------------------------------------------------------------
863
SetMode(GalleryBrowserMode eMode)864 void GalleryBrowser2::SetMode( GalleryBrowserMode eMode )
865 {
866 if( GetMode() != eMode )
867 {
868 meLastMode = GetMode();
869
870 switch( eMode )
871 {
872 case( GALLERYBROWSERMODE_ICON ):
873 {
874 mpListView->Hide();
875
876 mpPreview->Hide();
877 mpPreview->SetGraphic( Graphic() );
878 mpPreview->PreviewMedia( INetURLObject() );
879
880 mpIconView->Show();
881
882 maViewBox.EnableItem( TBX_ID_ICON, sal_True );
883 maViewBox.EnableItem( TBX_ID_LIST, sal_True );
884
885 maViewBox.CheckItem( TBX_ID_ICON, sal_True );
886 maViewBox.CheckItem( TBX_ID_LIST, sal_False );
887 }
888 break;
889
890 case( GALLERYBROWSERMODE_LIST ):
891 {
892 mpIconView->Hide();
893
894 mpPreview->Hide();
895 mpPreview->SetGraphic( Graphic() );
896 mpPreview->PreviewMedia( INetURLObject() );
897
898 mpListView->Show();
899
900 maViewBox.EnableItem( TBX_ID_ICON, sal_True );
901 maViewBox.EnableItem( TBX_ID_LIST, sal_True );
902
903 maViewBox.CheckItem( TBX_ID_ICON, sal_False );
904 maViewBox.CheckItem( TBX_ID_LIST, sal_True );
905 }
906 break;
907
908 case( GALLERYBROWSERMODE_PREVIEW ):
909 {
910 Graphic aGraphic;
911 Point aSelPos;
912 const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
913
914 if( nItemId )
915 {
916 const sal_uIntPtr nPos = nItemId - 1;
917
918 mpIconView->Hide();
919 mpListView->Hide();
920
921 if( mpCurTheme )
922 mpCurTheme->GetGraphic( nPos, aGraphic );
923
924 mpPreview->SetGraphic( aGraphic );
925 mpPreview->Show();
926
927 if( mpCurTheme && mpCurTheme->GetObjectKind( nPos ) == SGA_OBJ_SOUND )
928 mpPreview->PreviewMedia( mpCurTheme->GetObjectURL( nPos ) );
929
930 maViewBox.EnableItem( TBX_ID_ICON, sal_False );
931 maViewBox.EnableItem( TBX_ID_LIST, sal_False );
932 }
933 }
934 break;
935
936 default:
937 break;
938 }
939
940 GalleryBrowser2::meInitMode = meMode = eMode;
941 }
942 }
943
944 // -----------------------------------------------------------------------------
945
GetViewWindow() const946 Window* GalleryBrowser2::GetViewWindow() const
947 {
948 Window* pRet;
949
950 switch( GetMode() )
951 {
952 case( GALLERYBROWSERMODE_LIST ): pRet = mpListView; break;
953 case( GALLERYBROWSERMODE_PREVIEW ): pRet = mpPreview; break;
954
955 default:
956 pRet = mpIconView;
957 break;
958 }
959
960 return pRet;
961 }
962
963 // -----------------------------------------------------------------------------
964
Travel(GalleryBrowserTravel eTravel)965 void GalleryBrowser2::Travel( GalleryBrowserTravel eTravel )
966 {
967 if( mpCurTheme )
968 {
969 Point aSelPos;
970 const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
971
972 if( nItemId )
973 {
974 sal_uIntPtr nNewItemId = nItemId;
975
976 switch( eTravel )
977 {
978 case( GALLERYBROWSERTRAVEL_FIRST ): nNewItemId = 1; break;
979 case( GALLERYBROWSERTRAVEL_LAST ): nNewItemId = mpCurTheme->GetObjectCount(); break;
980 case( GALLERYBROWSERTRAVEL_PREVIOUS ): nNewItemId--; break;
981 case( GALLERYBROWSERTRAVEL_NEXT ): nNewItemId++; break;
982 default:
983 break;
984 }
985
986 if( nNewItemId < 1 )
987 nNewItemId = 1;
988 else if( nNewItemId > mpCurTheme->GetObjectCount() )
989 nNewItemId = mpCurTheme->GetObjectCount();
990
991 if( nNewItemId != nItemId )
992 {
993 ImplSelectItemId( nNewItemId );
994 ImplUpdateInfoBar();
995
996 if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
997 {
998 Graphic aGraphic;
999 const sal_uIntPtr nPos = nNewItemId - 1;
1000
1001 mpCurTheme->GetGraphic( nPos, aGraphic );
1002 mpPreview->SetGraphic( aGraphic );
1003
1004 if( SGA_OBJ_SOUND == mpCurTheme->GetObjectKind( nPos ) )
1005 mpPreview->PreviewMedia( mpCurTheme->GetObjectURL( nPos ) );
1006
1007 mpPreview->Invalidate();
1008 }
1009 }
1010 }
1011 }
1012 }
1013
1014 // -----------------------------------------------------------------------------
1015
ImplUpdateViews(sal_uInt16 nSelectionId)1016 void GalleryBrowser2::ImplUpdateViews( sal_uInt16 nSelectionId )
1017 {
1018 mpIconView->Hide();
1019 mpListView->Hide();
1020 mpPreview->Hide();
1021
1022 mpIconView->Clear();
1023 mpListView->Clear();
1024
1025 if( mpCurTheme )
1026 {
1027 for( sal_uIntPtr i = 0, nCount = mpCurTheme->GetObjectCount(); i < nCount; )
1028 {
1029 mpListView->RowInserted( i++ );
1030 mpIconView->InsertItem( (sal_uInt16) i );
1031 }
1032
1033 ImplSelectItemId( ( ( nSelectionId > mpCurTheme->GetObjectCount() ) ? mpCurTheme->GetObjectCount() : nSelectionId ) );
1034 }
1035
1036 switch( GetMode() )
1037 {
1038 case( GALLERYBROWSERMODE_ICON ): mpIconView->Show(); break;
1039 case( GALLERYBROWSERMODE_LIST ): mpListView->Show(); break;
1040 case( GALLERYBROWSERMODE_PREVIEW ): mpPreview->Show(); break;
1041
1042 default:
1043 break;
1044 }
1045
1046 ImplUpdateInfoBar();
1047 }
1048
1049 // -----------------------------------------------------------------------------
1050
ImplUpdateInfoBar()1051 void GalleryBrowser2::ImplUpdateInfoBar()
1052 {
1053 String aInfoText;
1054
1055 if( mpCurTheme )
1056 {
1057 Point aSelPos;
1058 const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
1059
1060 if( nItemId )
1061 {
1062 const sal_uIntPtr nPos = nItemId - 1;
1063
1064 aInfoText = mpCurTheme->GetName();
1065
1066 if( nPos < mpCurTheme->GetObjectCount() )
1067 {
1068 SgaObject* pObj = mpCurTheme->AcquireObject( nPos );
1069
1070 if( pObj )
1071 {
1072 aInfoText = GetItemText( *mpCurTheme, *pObj, GALLERY_ITEM_THEMENAME | GALLERY_ITEM_TITLE | GALLERY_ITEM_PATH );
1073 mpCurTheme->ReleaseObject( pObj );
1074 }
1075 }
1076 }
1077 }
1078
1079 maInfoBar.SetText( aInfoText );
1080 }
1081
1082 // -----------------------------------------------------------------------------
1083
ImplGetSelectedItemId(const Point * pSelPos,Point & rSelPos)1084 sal_uIntPtr GalleryBrowser2::ImplGetSelectedItemId( const Point* pSelPos, Point& rSelPos )
1085 {
1086 const Size aOutputSizePixel( GetOutputSizePixel() );
1087 sal_uIntPtr nRet = 0;
1088
1089 if( GALLERYBROWSERMODE_PREVIEW == GetMode() )
1090 {
1091 nRet = ( ( GALLERYBROWSERMODE_ICON == meLastMode ) ? mpIconView->GetSelectItemId() : ( mpListView->FirstSelectedRow() + 1 ) );
1092
1093 if( pSelPos )
1094 rSelPos = GetPointerPosPixel();
1095 else
1096 rSelPos = Point( aOutputSizePixel.Width() >> 1, aOutputSizePixel.Height() >> 1 );
1097 }
1098 else if( GALLERYBROWSERMODE_ICON == GetMode() )
1099 {
1100 if( pSelPos )
1101 {
1102 nRet = mpIconView->GetItemId( *pSelPos );
1103 rSelPos = GetPointerPosPixel();
1104 }
1105 else
1106 {
1107 nRet = mpIconView->GetSelectItemId();
1108 rSelPos = mpIconView->GetItemRect( (sal_uInt16) nRet ).Center();
1109 }
1110 }
1111 else
1112 {
1113 if( pSelPos )
1114 {
1115 nRet = mpListView->GetRowAtYPosPixel( pSelPos->Y() ) + 1;
1116 rSelPos = GetPointerPosPixel();
1117 }
1118 else
1119 {
1120 nRet = mpListView->FirstSelectedRow() + 1;
1121 rSelPos = mpListView->GetFieldRectPixel( (sal_uInt16) nRet, 1 ).Center();
1122 }
1123 }
1124
1125 rSelPos.X() = Max( Min( rSelPos.X(), aOutputSizePixel.Width() - 1L ), 0L );
1126 rSelPos.Y() = Max( Min( rSelPos.Y(), aOutputSizePixel.Height() - 1L ), 0L );
1127
1128 if( nRet && ( !mpCurTheme || ( nRet > mpCurTheme->GetObjectCount() ) ) )
1129 {
1130 nRet = 0;
1131 }
1132
1133 return nRet;
1134 }
1135
1136 // -----------------------------------------------------------------------------
1137
ImplSelectItemId(sal_uIntPtr nItemId)1138 void GalleryBrowser2::ImplSelectItemId( sal_uIntPtr nItemId )
1139 {
1140 if( nItemId )
1141 {
1142
1143 mpIconView->SelectItem( (sal_uInt16) nItemId );
1144 mpListView->SelectRow( nItemId - 1 );
1145 }
1146 }
1147
1148 // -----------------------------------------------------------------------------
1149
1150 css::uno::Reference< css::frame::XFrame >
GetFrame() const1151 GalleryBrowser2::GetFrame() const
1152 {
1153 css::uno::Reference< css::frame::XFrame > xFrame;
1154 SfxViewFrame* pCurrentViewFrame = SfxViewFrame::Current();
1155 if ( pCurrentViewFrame )
1156 {
1157 SfxBindings& rBindings = pCurrentViewFrame->GetBindings();
1158 xFrame.set( rBindings.GetActiveFrame() );
1159 }
1160
1161 return xFrame;
1162 }
1163
Dispatch(sal_uInt16 nId,const css::uno::Reference<css::frame::XDispatch> & rxDispatch,const css::util::URL & rURL)1164 void GalleryBrowser2::Dispatch(
1165 sal_uInt16 nId,
1166 const css::uno::Reference< css::frame::XDispatch > &rxDispatch,
1167 const css::util::URL &rURL )
1168 {
1169 Point aSelPos;
1170 const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
1171
1172 if( !mpCurTheme || !nItemId )
1173 return;
1174
1175 mnCurActionPos = nItemId - 1;
1176
1177 switch( nId )
1178 {
1179 case( MN_ADD ):
1180 case( MN_ADD_LINK ):
1181 {
1182 css::uno::Reference< css::frame::XDispatch > xDispatch( rxDispatch );
1183 css::util::URL aURL = rURL;
1184
1185 if ( !xDispatch.is() )
1186 {
1187 css::uno::Reference< css::frame::XDispatchProvider > xDispatchProvider(
1188 GetFrame(), css::uno::UNO_QUERY );
1189 if ( !xDispatchProvider.is() || !m_xTransformer.is() )
1190 return;
1191
1192 aURL.Complete = C2U( CMD_SID_GALLERY_FORMATS );
1193 m_xTransformer->parseStrict( aURL );
1194 xDispatch = xDispatchProvider->queryDispatch(
1195 aURL,
1196 C2U( "_self" ),
1197 css::frame::FrameSearchFlag::SELF );
1198 }
1199
1200 if ( !xDispatch.is() )
1201 return;
1202
1203 sal_Int8 nType = 0;
1204 sal_Bool bIsLink( MN_ADD_LINK == nId );
1205 OUString aFileURL, aFilterName;
1206 css::uno::Reference< css::lang::XComponent > xDrawing;
1207 css::uno::Reference< css::graphic::XGraphic > xGraphic;
1208
1209 aFilterName = GetFilterName();
1210
1211 switch( mpCurTheme->GetObjectKind( mnCurActionPos ) )
1212 {
1213 case( SGA_OBJ_BMP ):
1214 case( SGA_OBJ_ANIM ):
1215 case( SGA_OBJ_INET ):
1216 // TODO drawing objects are inserted as drawings only via drag&drop
1217 case( SGA_OBJ_SVDRAW ):
1218 nType = css::gallery::GalleryItemType::GRAPHIC;
1219 break;
1220
1221 case ( SGA_OBJ_SOUND ) :
1222 nType = css::gallery::GalleryItemType::MEDIA;
1223 break;
1224
1225 default:
1226 nType = css::gallery::GalleryItemType::EMPTY;
1227 break;
1228 }
1229
1230 if ( bIsLink )
1231 {
1232 aFileURL = mpCurTheme->GetObjectURL( mnCurActionPos ).GetMainURL( INetURLObject::NO_DECODE );
1233 OSL_ENSURE( aFileURL.getLength(), "gallery item is link but no URL!" );
1234 }
1235
1236 Graphic aGraphic;
1237 sal_Bool bGraphic = mpCurTheme->GetGraphic( mnCurActionPos, aGraphic );
1238 if ( bGraphic && !!aGraphic )
1239 xGraphic.set( aGraphic.GetXGraphic() );
1240 OSL_ENSURE( xGraphic.is(), "gallery item is graphic, but the reference is invalid!" );
1241
1242 css::uno::Sequence< css::beans::PropertyValue > aSeq( SVXGALLERYITEM_PARAMS );
1243
1244 aSeq[0].Name = C2U( SVXGALLERYITEM_TYPE );
1245 aSeq[0].Value <<= nType;
1246 aSeq[1].Name = C2U( SVXGALLERYITEM_LINK );
1247 aSeq[1].Value <<= bIsLink;
1248 aSeq[2].Name = C2U( SVXGALLERYITEM_URL );
1249 aSeq[2].Value <<= aFileURL;
1250 aSeq[3].Name = C2U( SVXGALLERYITEM_FILTER );
1251 aSeq[3].Value <<= aFilterName;
1252 aSeq[4].Name = C2U( SVXGALLERYITEM_DRAWING );
1253 aSeq[4].Value <<= xDrawing;
1254 aSeq[5].Name = C2U( SVXGALLERYITEM_GRAPHIC );
1255 aSeq[5].Value <<= xGraphic;
1256
1257 css::uno::Sequence< css::beans::PropertyValue > aArgs( 1 );
1258 aArgs[0].Name = C2U( SVXGALLERYITEM_ARGNAME );
1259 aArgs[0].Value <<= aSeq;
1260
1261 DispatchInfo *pInfo = new DispatchInfo;
1262 pInfo->TargetURL = aURL;
1263 pInfo->Arguments = aArgs;
1264 pInfo->Dispatch = xDispatch;
1265
1266 if ( !Application::PostUserEvent(
1267 STATIC_LINK( 0, GalleryBrowser2, AsyncDispatch_Impl), pInfo ) )
1268 delete pInfo;
1269 }
1270 break;
1271
1272 default:
1273 break;
1274 }
1275 }
1276
Execute(sal_uInt16 nId)1277 void GalleryBrowser2::Execute( sal_uInt16 nId )
1278 {
1279 Point aSelPos;
1280 const sal_uIntPtr nItemId = ImplGetSelectedItemId( NULL, aSelPos );
1281
1282 if( mpCurTheme && nItemId )
1283 {
1284 mnCurActionPos = nItemId - 1;
1285
1286 switch( nId )
1287 {
1288 case( MN_PREVIEW ):
1289 SetMode( ( GALLERYBROWSERMODE_PREVIEW != GetMode() ) ? GALLERYBROWSERMODE_PREVIEW : meLastMode );
1290 break;
1291
1292 case( MN_DELETE ):
1293 {
1294 if( !mpCurTheme->IsReadOnly() &&
1295 QueryBox( NULL, WB_YES_NO, String( GAL_RESID( RID_SVXSTR_GALLERY_DELETEOBJ ) ) ).Execute() == RET_YES )
1296 {
1297 mpCurTheme->RemoveObject( mnCurActionPos );
1298 }
1299 }
1300 break;
1301
1302 case( MN_TITLE ):
1303 {
1304 SgaObject* pObj = mpCurTheme->AcquireObject( mnCurActionPos );
1305
1306 if( pObj )
1307 {
1308 const String aOldTitle( GetItemText( *mpCurTheme, *pObj, GALLERY_ITEM_TITLE ) );
1309 //CHINA001 TitleDialog aDlg( this, aOldTitle );
1310 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1311 if(pFact)
1312 {
1313 AbstractTitleDialog* aDlg = pFact->CreateTitleDialog( this, aOldTitle );
1314 DBG_ASSERT(aDlg, "Dialogdiet fail!");//CHINA001
1315 if( aDlg->Execute() == RET_OK )//CHINA001 if( aDlg.Execute() == RET_OK )
1316 {
1317 String aNewTitle( aDlg->GetTitle() );//CHINA001 String aNewTitle( aDlg.GetTitle() );
1318
1319 if( ( !aNewTitle.Len() && pObj->GetTitle().Len() ) || ( aNewTitle != aOldTitle ) )
1320 {
1321 if( !aNewTitle.Len() )
1322 aNewTitle = String( RTL_CONSTASCII_USTRINGPARAM( "__<empty>__" ) );
1323
1324 pObj->SetTitle( aNewTitle );
1325 mpCurTheme->InsertObject( *pObj );
1326 }
1327 }
1328
1329 mpCurTheme->ReleaseObject( pObj );
1330 delete aDlg; //add CHINA001
1331 }
1332 }
1333 }
1334 break;
1335
1336 case( MN_COPYCLIPBOARD ):
1337 {
1338 Window* pWindow;
1339
1340 switch( GetMode() )
1341 {
1342 case( GALLERYBROWSERMODE_ICON ): pWindow = (Window*) mpIconView; break;
1343 case( GALLERYBROWSERMODE_LIST ): pWindow = (Window*) mpListView; break;
1344 case( GALLERYBROWSERMODE_PREVIEW ): pWindow = (Window*) mpPreview; break;
1345
1346 default:
1347 pWindow = NULL;
1348 break;
1349 }
1350
1351 mpCurTheme->CopyToClipboard( pWindow, mnCurActionPos );
1352 }
1353 break;
1354
1355 case( MN_PASTECLIPBOARD ):
1356 {
1357 if( !mpCurTheme->IsReadOnly() )
1358 {
1359 TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( this ) );
1360 mpCurTheme->InsertTransferable( aDataHelper.GetTransferable(), mnCurActionPos );
1361 }
1362 }
1363 break;
1364
1365 default:
1366 break;
1367 }
1368 }
1369 }
1370
1371 // -----------------------------------------------------------------------------
1372
GetItemText(const GalleryTheme & rTheme,const SgaObject & rObj,sal_uIntPtr nItemTextFlags)1373 String GalleryBrowser2::GetItemText( const GalleryTheme& rTheme, const SgaObject& rObj, sal_uIntPtr nItemTextFlags )
1374 {
1375 INetURLObject aURL;
1376 String aRet;
1377
1378 if( rTheme.IsImported() )
1379 {
1380 aURL = rTheme.GetParent()->GetImportURL( rTheme.GetName() );
1381
1382 aURL.removeSegment();
1383 aURL.Append( rObj.GetURL().GetName() );
1384 }
1385 else
1386 aURL = rObj.GetURL();
1387
1388 if( nItemTextFlags & GALLERY_ITEM_THEMENAME )
1389 {
1390 aRet += rTheme.GetName();
1391 aRet += String( RTL_CONSTASCII_USTRINGPARAM( " - " ) );
1392 }
1393
1394 if( nItemTextFlags & GALLERY_ITEM_TITLE )
1395 {
1396 String aTitle( rObj.GetTitle() );
1397
1398 if( !aTitle.Len() )
1399 aTitle = aURL.getBase( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_UNAMBIGUOUS );
1400
1401 if( !aTitle.Len() )
1402 {
1403 aTitle = aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
1404 aTitle = aTitle.GetToken( aTitle.GetTokenCount( '/' ) - 1, '/' );
1405 }
1406
1407 aRet += aTitle;
1408 }
1409
1410 if( nItemTextFlags & GALLERY_ITEM_PATH )
1411 {
1412 const String aPath( aURL.getFSysPath( INetURLObject::FSYS_DETECT ) );
1413
1414 if( aPath.Len() && ( nItemTextFlags & GALLERY_ITEM_TITLE ) )
1415 aRet += String( RTL_CONSTASCII_USTRINGPARAM( " (" ) );
1416
1417 aRet += String(aURL.getFSysPath( INetURLObject::FSYS_DETECT ));
1418
1419 if( aPath.Len() && ( nItemTextFlags & GALLERY_ITEM_TITLE ) )
1420 aRet += ')';
1421 }
1422
1423 return aRet;
1424 }
1425
1426 // -----------------------------------------------------------------------------
1427
GetURL() const1428 INetURLObject GalleryBrowser2::GetURL() const
1429 {
1430 INetURLObject aURL;
1431
1432 if( mpCurTheme && mnCurActionPos != 0xffffffff )
1433 aURL = mpCurTheme->GetObjectURL( mnCurActionPos );
1434
1435 return aURL;
1436 }
1437
1438 // -----------------------------------------------------------------------------
1439
GetFilterName() const1440 String GalleryBrowser2::GetFilterName() const
1441 {
1442 String aFilterName;
1443
1444 if( mpCurTheme && mnCurActionPos != 0xffffffff )
1445 {
1446 const SgaObjKind eObjKind = mpCurTheme->GetObjectKind( mnCurActionPos );
1447
1448 if( ( SGA_OBJ_BMP == eObjKind ) || ( SGA_OBJ_ANIM == eObjKind ) )
1449 {
1450 GraphicFilter* pFilter = GraphicFilter::GetGraphicFilter();
1451 INetURLObject aURL; mpCurTheme->GetURL( mnCurActionPos, aURL );
1452 sal_uInt16 nFilter = pFilter->GetImportFormatNumberForShortName( aURL.GetExtension() );
1453
1454 if( GRFILTER_FORMAT_DONTKNOW != nFilter )
1455 aFilterName = pFilter->GetImportFormatName( nFilter );
1456 }
1457 }
1458
1459 return aFilterName;
1460 }
1461
1462 // -----------------------------------------------------------------------------
1463
GetGraphic() const1464 Graphic GalleryBrowser2::GetGraphic() const
1465 {
1466 Graphic aGraphic;
1467
1468 if( mpCurTheme && mnCurActionPos != 0xffffffff )
1469 mpCurTheme->GetGraphic( mnCurActionPos, aGraphic );
1470
1471 return aGraphic;
1472 }
1473
1474 // -----------------------------------------------------------------------------
1475
GetVCDrawModel(FmFormModel & rModel) const1476 sal_Bool GalleryBrowser2::GetVCDrawModel( FmFormModel& rModel ) const
1477 {
1478 sal_Bool bRet = sal_False;
1479
1480 if( mpCurTheme && mnCurActionPos != 0xffffffff )
1481 bRet = mpCurTheme->GetModel( mnCurActionPos, rModel );
1482
1483 return bRet;
1484 }
1485
1486 // -----------------------------------------------------------------------------
1487
IMPL_LINK(GalleryBrowser2,SelectObjectHdl,void *,EMPTYARG)1488 IMPL_LINK( GalleryBrowser2, SelectObjectHdl, void*, EMPTYARG )
1489 {
1490 ImplUpdateInfoBar();
1491 return 0L;
1492 }
1493
1494 // -----------------------------------------------------------------------------
1495
IMPL_LINK(GalleryBrowser2,SelectTbxHdl,ToolBox *,pBox)1496 IMPL_LINK( GalleryBrowser2, SelectTbxHdl, ToolBox*, pBox )
1497 {
1498 if( pBox->GetCurItemId() == TBX_ID_ICON )
1499 SetMode( GALLERYBROWSERMODE_ICON );
1500 else if( pBox->GetCurItemId() == TBX_ID_LIST )
1501 SetMode( GALLERYBROWSERMODE_LIST );
1502
1503 return 0L;
1504 }
1505
1506 // -----------------------------------------------------------------------------
1507
IMPL_LINK(GalleryBrowser2,MiscHdl,void *,EMPTYARG)1508 IMPL_LINK( GalleryBrowser2, MiscHdl, void*, EMPTYARG )
1509 {
1510 const sal_Bool bHC = maViewBox.GetSettings().GetStyleSettings().GetHighContrastMode();
1511
1512 maViewBox.SetOutStyle( maMiscOptions.GetToolboxStyle() );
1513
1514 BitmapEx aIconBmpEx = BitmapEx( Image( GAL_RESID( bHC? RID_SVXIMG_GALLERY_VIEW_ICON_HC : RID_SVXIMG_GALLERY_VIEW_ICON ) ).GetBitmapEx() );
1515 BitmapEx aListBmpEx = BitmapEx( Image( GAL_RESID( bHC? RID_SVXIMG_GALLERY_VIEW_LIST_HC : RID_SVXIMG_GALLERY_VIEW_LIST ) ).GetBitmapEx() );
1516
1517 if( maMiscOptions.AreCurrentSymbolsLarge() )
1518 {
1519 const Size aLargeSize( 24, 24);
1520
1521 aIconBmpEx.Scale( aLargeSize );
1522 aListBmpEx.Scale( aLargeSize );
1523 }
1524
1525 maViewBox.SetItemImage( TBX_ID_ICON, aIconBmpEx );
1526 maViewBox.SetItemImage( TBX_ID_LIST, aListBmpEx );
1527 maViewBox.SetSizePixel( maViewBox.CalcWindowSizePixel() );
1528
1529 Resize();
1530
1531 return 0L;
1532 }
1533