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