diff options
Diffstat (limited to 'svx/source/gallery2/galbrws2.cxx')
-rw-r--r-- | svx/source/gallery2/galbrws2.cxx | 1253 |
1 files changed, 1253 insertions, 0 deletions
diff --git a/svx/source/gallery2/galbrws2.cxx b/svx/source/gallery2/galbrws2.cxx new file mode 100644 index 000000000000..0483a1bc1425 --- /dev/null +++ b/svx/source/gallery2/galbrws2.cxx @@ -0,0 +1,1253 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svx.hxx" + + +#include <sot/formats.hxx> +#include <vcl/msgbox.hxx> +#include <svtools/valueset.hxx> +#include <svl/urlbmk.hxx> +#include <svl/stritem.hxx> +#include <svl/intitem.hxx> +#include <svl/eitem.hxx> +#include <svtools/transfer.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/viewfrm.hxx> +#include <sfx2/sfxsids.hrc> +#include "svtools/filter.hxx" +#include <editeng/brshitem.hxx> +#include "helpid.hrc" +#include "gallery.hxx" +#include "galobj.hxx" +#include "svx/gallery1.hxx" +#include "galtheme.hxx" +#include "galctrl.hxx" +#include "svx/galmisc.hxx" +#include "galbrws2.hxx" +#include "gallery.hrc" +#include <vcl/svapp.hxx> +#include <svx/fmmodel.hxx> +#include <svx/svxdlg.hxx> //CHINA001 +//CHINA001 #include <svx/dialogs.hrc> //CHINA001 + +// ----------- +// - Defines - +// ----------- + +#undef GALLERY_USE_CLIPBOARD + +#define TBX_ID_ICON 1 +#define TBX_ID_LIST 2 + +// ----------- +// - statics - +// ----------- + +GalleryBrowserMode GalleryBrowser2::meInitMode = GALLERYBROWSERMODE_ICON; + +// -------------------------- +// - GalleryBackgroundPopup - +// -------------------------- + +class GalleryBackgroundPopup : public PopupMenu, public SfxControllerItem +{ + const GalleryTheme* mpTheme; + ULONG mnObjectPos; + + virtual void Select(); + virtual void StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState ); + +public: + + GalleryBackgroundPopup( const GalleryTheme* pTheme, ULONG nObjectPos ); + ~GalleryBackgroundPopup(); +}; + +// ------------------------------------------------------------------------ + +GalleryBackgroundPopup::GalleryBackgroundPopup( const GalleryTheme* pTheme, ULONG nObjectPos ) : + SfxControllerItem ( SID_GALLERY_BG_BRUSH, SfxViewFrame::Current()->GetBindings() ), + mpTheme ( pTheme ), + mnObjectPos ( nObjectPos ) +{ + SfxViewFrame::Current()->GetBindings().Update( SID_GALLERY_BG_BRUSH ); + RemoveDisabledEntries(); +} + +// ------------------------------------------------------------------------ + +GalleryBackgroundPopup::~GalleryBackgroundPopup() +{ +} + +// ------------------------------------------------------------------------ + +void GalleryBackgroundPopup::StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pItem ) +{ + if ( ( nSID == SID_GALLERY_BG_BRUSH ) && pItem && ( eState != SFX_ITEM_DISABLED ) ) + { + SfxStringListItem* pStrLstItem; + SfxStringItem* pStrItem; + + PopupMenu::Clear(); + + if( ( pStrLstItem = PTR_CAST( SfxStringListItem, pItem ) ) != NULL ) + { + List* pList = pStrLstItem->GetList(); + + if( pList ) + for ( ULONG i = 0, nCount = pList->Count(); i < nCount; i++ ) + InsertItem( (USHORT) i + 1, *(String*) pList->GetObject( i ) ); + } + else if( ( pStrItem = PTR_CAST( SfxStringItem, pItem ) ) != NULL ) + InsertItem( 1, pStrItem->GetValue() ); + else + { + DBG_ERROR( "SgaBGPopup::StateChanged(...): Wrong item type!" ); + } + } +} + +// ------------------------------------------------------------------------ + +void GalleryBackgroundPopup::Select() +{ + Menu::Select(); + + const INetURLObject aURL( mpTheme->GetObjectURL( mnObjectPos ) ); + const SvxBrushItem aBrushItem( aURL.GetMainURL( INetURLObject::NO_DECODE ), String(), GPOS_TILED, SID_GALLERY_BG_BRUSH ); + const SfxUInt16Item aPosItem( SID_GALLERY_BG_POS, GetCurItemId() - 1 ); + const SfxStringItem aPathItem( SID_FILE_NAME, aURL.GetMainURL( INetURLObject::NO_DECODE ) ); + + SfxViewFrame::Current()->GetBindings().GetDispatcher()->Execute( SID_GALLERY_BG_BRUSH, + SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, + &aBrushItem, &aPosItem, &aPathItem, 0L ); +} + +// --------------------- +// - GalleryThemePopup - +// --------------------- + +class GalleryThemePopup : public PopupMenu, public SfxControllerItem +{ + GalleryBackgroundPopup maBackgroundPopup; + const GalleryTheme* mpTheme; + ULONG mnObjectPos; + BOOL mbPreview; + + virtual void StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pState ); + +public: + + GalleryThemePopup( const GalleryTheme* pTheme, ULONG nObjectPos, BOOL bPreview ); + ~GalleryThemePopup(); +}; + +// ------------------------------------------------------------------------ + +GalleryThemePopup::GalleryThemePopup( const GalleryTheme* pTheme, ULONG nObjectPos, BOOL bPreview ) : + PopupMenu ( GAL_RESID( RID_SVXMN_GALLERY2 ) ), + SfxControllerItem ( SID_GALLERY_ENABLE_ADDCOPY, SfxViewFrame::Current()->GetBindings() ), + maBackgroundPopup ( pTheme, nObjectPos ), + mpTheme ( pTheme ), + mnObjectPos ( nObjectPos ), + mbPreview ( bPreview ) +{ + const SgaObjKind eObjKind = mpTheme->GetObjectKind( mnObjectPos ); + PopupMenu* pAddMenu = GetPopupMenu( MN_ADDMENU ); + SfxBindings& rBindings = SfxViewFrame::Current()->GetBindings(); + INetURLObject aURL; + + const_cast< GalleryTheme* >( mpTheme )->GetURL( mnObjectPos, aURL ); + const BOOL bValidURL = ( aURL.GetProtocol() != INET_PROT_NOT_VALID ); + + pAddMenu->EnableItem( MN_ADD, bValidURL && SGA_OBJ_SOUND != eObjKind ); + pAddMenu->EnableItem( MN_ADD_LINK, bValidURL && SGA_OBJ_SVDRAW != eObjKind ); + + EnableItem( MN_ADDMENU, pAddMenu->IsItemEnabled( MN_ADD ) || pAddMenu->IsItemEnabled( MN_ADD_LINK ) ); + EnableItem( MN_PREVIEW, bValidURL ); + + CheckItem( MN_PREVIEW, mbPreview ); + + if( mpTheme->IsReadOnly() || !mpTheme->GetObjectCount() ) + { + EnableItem( MN_DELETE, FALSE ); + EnableItem( MN_TITLE, FALSE ); + + if( mpTheme->IsReadOnly() ) + EnableItem( MN_PASTECLIPBOARD, FALSE ); + + if( !mpTheme->GetObjectCount() ) + EnableItem( MN_COPYCLIPBOARD, FALSE ); + } + else + { + EnableItem( MN_DELETE, !bPreview ); + EnableItem( MN_TITLE, TRUE ); + EnableItem( MN_COPYCLIPBOARD, TRUE ); + EnableItem( MN_PASTECLIPBOARD, TRUE ); + } + +#ifdef GALLERY_USE_CLIPBOARD + if( IsItemEnabled( MN_PASTECLIPBOARD ) ) + { + TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( this ) ); + BOOL bEnable = FALSE; + + if( aDataHelper.GetFormatCount() ) + { + if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ) || + aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) || + aDataHelper.HasFormat( FORMAT_FILE ) || + aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ) || + aDataHelper.HasFormat( FORMAT_GDIMETAFILE ) || + aDataHelper.HasFormat( FORMAT_BITMAP ) ) + { + bEnable = TRUE; + } + } + + if( !bEnable ) + EnableItem( MN_PASTECLIPBOARD, FALSE ); + } +#else + EnableItem( MN_COPYCLIPBOARD, FALSE ); + EnableItem( MN_PASTECLIPBOARD, FALSE ); +#endif + + if( !maBackgroundPopup.GetItemCount() || ( eObjKind == SGA_OBJ_SVDRAW ) || ( eObjKind == SGA_OBJ_SOUND ) ) + pAddMenu->EnableItem( MN_BACKGROUND, FALSE ); + else + { + pAddMenu->EnableItem( MN_BACKGROUND, TRUE ); + pAddMenu->SetPopupMenu( MN_BACKGROUND, &maBackgroundPopup ); + } + + rBindings.Update( SID_GALLERY_ENABLE_ADDCOPY ); + RemoveDisabledEntries(); +} + +// ------------------------------------------------------------------------ + +GalleryThemePopup::~GalleryThemePopup() +{ +} + +// ------------------------------------------------------------------------ + +void GalleryThemePopup::StateChanged( USHORT nSID, SfxItemState eState, const SfxPoolItem* pItem ) +{ + if( ( nSID == SID_GALLERY_ENABLE_ADDCOPY ) && pItem && ( eState != SFX_ITEM_DISABLED ) ) + { + SfxBoolItem* pBoolItem = PTR_CAST( SfxBoolItem, pItem ); + const SgaObjKind eObjKind = mpTheme->GetObjectKind( mnObjectPos ); + + DBG_ASSERT( pBoolItem || pBoolItem == 0, "SfxBoolItem erwartet!"); + + GetPopupMenu( MN_ADDMENU )->EnableItem( MN_ADD, pBoolItem->GetValue() && ( eObjKind != SGA_OBJ_SOUND ) ); + } +} + +// ------------------ +// - GalleryToolBox - +// ------------------ + +GalleryToolBox::GalleryToolBox( GalleryBrowser2* pParent ) : + ToolBox( pParent, WB_TABSTOP ) +{ +} + +// ------------------------------------------------------------------------ + +GalleryToolBox::~GalleryToolBox() +{ +} + +// ------------------------------------------------------------------------ + +void GalleryToolBox::KeyInput( const KeyEvent& rKEvt ) +{ + if( !static_cast< GalleryBrowser2* >( GetParent() )->KeyInput( rKEvt, this ) ) + ToolBox::KeyInput( rKEvt ); +} + +// ------------------- +// - GalleryBrowser2 - +// ------------------- + +GalleryBrowser2::GalleryBrowser2( GalleryBrowser* pParent, const ResId& rResId, Gallery* pGallery ) : + Control ( pParent, rResId ), + mpGallery ( pGallery ), + mpCurTheme ( NULL ), + mpIconView ( new GalleryIconView( this, NULL ) ), + mpListView ( new GalleryListView( this, NULL ) ), + mpPreview ( new GalleryPreview( this, NULL ) ), + maViewBox ( this ), + maSeparator ( this, WB_VERT ), + maInfoBar ( this, WB_LEFT | WB_VCENTER ), + mnCurActionPos ( 0xffffffff ), + meMode ( GALLERYBROWSERMODE_NONE ), + meLastMode ( GALLERYBROWSERMODE_NONE ), + mbCurActionIsLinkage( FALSE ) +{ + Image aDummyImage; + const Link aSelectHdl( LINK( this, GalleryBrowser2, SelectObjectHdl ) ); + Font aInfoFont( maInfoBar.GetControlFont() ); + + maMiscOptions.AddListenerLink( LINK( this, GalleryBrowser2, MiscHdl ) ); + + maViewBox.InsertItem( TBX_ID_ICON, aDummyImage ); + maViewBox.SetItemBits( TBX_ID_ICON, TIB_RADIOCHECK | TIB_AUTOCHECK ); + maViewBox.SetHelpId( TBX_ID_ICON, HID_GALLERY_ICONVIEW ); + maViewBox.SetQuickHelpText( TBX_ID_ICON, String( GAL_RESID( RID_SVXSTR_GALLERY_ICONVIEW ) ) ); + + maViewBox.InsertItem( TBX_ID_LIST, aDummyImage ); + maViewBox.SetItemBits( TBX_ID_LIST, TIB_RADIOCHECK | TIB_AUTOCHECK ); + maViewBox.SetHelpId( TBX_ID_LIST, HID_GALLERY_LISTVIEW ); + maViewBox.SetQuickHelpText( TBX_ID_LIST, String( GAL_RESID( RID_SVXSTR_GALLERY_LISTVIEW ) ) ); + + maViewBox.SetBorder( 0, 1 ); + MiscHdl( NULL ); + maViewBox.SetSelectHdl( LINK( this, GalleryBrowser2, SelectTbxHdl ) ); + maViewBox.Show(); + + maInfoBar.Show(); + maSeparator.Show(); + + mpIconView->SetSelectHdl( aSelectHdl ); + mpListView->SetSelectHdl( aSelectHdl ); + + InitSettings(); + + SetMode( ( GALLERYBROWSERMODE_PREVIEW != GalleryBrowser2::meInitMode ) ? GalleryBrowser2::meInitMode : GALLERYBROWSERMODE_ICON ); +} + +// ----------------------------------------------------------------------------- + +GalleryBrowser2::~GalleryBrowser2() +{ + maMiscOptions.RemoveListenerLink( LINK( this, GalleryBrowser2, MiscHdl ) ); + + delete mpPreview; + delete mpListView; + delete mpIconView; + + if( mpCurTheme ) + mpGallery->ReleaseTheme( mpCurTheme, *this ); +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::InitSettings() +{ + Font aInfoFont( maInfoBar.GetControlFont() ); + + aInfoFont.SetWeight( WEIGHT_BOLD ); + aInfoFont.SetColor( GALLERY_FG_COLOR ); + maInfoBar.SetControlFont( aInfoFont ); + + maInfoBar.SetBackground( Wallpaper( GALLERY_DLG_COLOR ) ); + maInfoBar.SetControlBackground( GALLERY_DLG_COLOR ); + + maSeparator.SetBackground( Wallpaper( GALLERY_BG_COLOR ) ); + maSeparator.SetControlBackground( GALLERY_BG_COLOR ); + maSeparator.SetControlForeground( GALLERY_FG_COLOR ); +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::DataChanged( const DataChangedEvent& rDCEvt ) +{ + if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) ) + InitSettings(); + else + Control::DataChanged( rDCEvt ); +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::Resize() +{ + Control::Resize(); + + mpIconView->Hide(); + mpListView->Hide(); + mpPreview->Hide(); + + const Size aOutSize( GetOutputSizePixel() ); + const Size aBoxSize( maViewBox.GetOutputSizePixel() ); + const long nOffset = 2, nSepWidth = 2; + const long nInfoBarX = aBoxSize.Width() + ( nOffset * 3 ) + nSepWidth; + const Point aPt( 0, aBoxSize.Height() + 3 ); + const Size aSz( aOutSize.Width(), aOutSize.Height() - aPt.Y() ); + + maSeparator.SetPosSizePixel( Point( aBoxSize.Width() + nOffset, 0 ), Size( nSepWidth, aBoxSize.Height() ) ); + maInfoBar.SetPosSizePixel( Point( nInfoBarX, 0 ), Size( aOutSize.Width() - nInfoBarX, aBoxSize.Height() ) ); + + mpIconView->SetPosSizePixel( aPt, aSz ); + mpListView->SetPosSizePixel( aPt, aSz ); + mpPreview->SetPosSizePixel( aPt, aSz ); + + switch( GetMode() ) + { + case( GALLERYBROWSERMODE_ICON ): mpIconView->Show(); break; + case( GALLERYBROWSERMODE_LIST ): mpListView->Show(); break; + case( GALLERYBROWSERMODE_PREVIEW ): mpPreview->Show(); break; + + default: + break; + } +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::Notify( SfxBroadcaster&, const SfxHint& rHint ) +{ + const GalleryHint& rGalleryHint = (const GalleryHint&) rHint; + + switch( rGalleryHint.GetType() ) + { + case( GALLERY_HINT_THEME_UPDATEVIEW ): + { + if( GALLERYBROWSERMODE_PREVIEW == GetMode() ) + SetMode( meLastMode ); + + ImplUpdateViews( (USHORT) rGalleryHint.GetData1() + 1 ); + } + break; + + default: + break; + } +} + +// ----------------------------------------------------------------------------- + +sal_Int8 GalleryBrowser2::AcceptDrop( DropTargetHelper& rTarget, const AcceptDropEvent& ) +{ + sal_Int8 nRet = DND_ACTION_NONE; + + if( mpCurTheme && !mpCurTheme->IsReadOnly() && !mpCurTheme ->IsImported() ) + { + if( !mpCurTheme->IsDragging() ) + { + if( rTarget.IsDropFormatSupported( SOT_FORMATSTR_ID_DRAWING ) || + rTarget.IsDropFormatSupported( SOT_FORMAT_FILE_LIST ) || + rTarget.IsDropFormatSupported( FORMAT_FILE ) || + rTarget.IsDropFormatSupported( SOT_FORMATSTR_ID_SVXB ) || + rTarget.IsDropFormatSupported( FORMAT_GDIMETAFILE ) || + rTarget.IsDropFormatSupported( FORMAT_BITMAP ) ) + { + nRet = DND_ACTION_COPY; + } + } + else + nRet = DND_ACTION_COPY; + } + + return nRet; +} + +// ----------------------------------------------------------------------------- + +sal_Int8 GalleryBrowser2::ExecuteDrop( DropTargetHelper&, const ExecuteDropEvent& rEvt ) +{ + sal_Int8 nRet = DND_ACTION_NONE; + + if( mpCurTheme ) + { + Point aSelPos; + const ULONG nItemId = ImplGetSelectedItemId( &rEvt.maPosPixel, aSelPos ); + const ULONG nInsertPos = ( nItemId ? ( nItemId - 1 ) : LIST_APPEND ); + + if( mpCurTheme->IsDragging() ) + mpCurTheme->ChangeObjectPos( mpCurTheme->GetDragPos(), nInsertPos ); + else + nRet = mpCurTheme->InsertTransferable( rEvt.maDropEvent.Transferable, nInsertPos ); + } + + return nRet; +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::StartDrag( Window*, const Point* pDragPoint ) +{ + if( mpCurTheme ) + { + Point aSelPos; + const ULONG nItemId = ImplGetSelectedItemId( pDragPoint, aSelPos ); + + if( nItemId ) + mpCurTheme->StartDrag( this, nItemId - 1 ); + } +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::TogglePreview( Window*, const Point* ) +{ + SetMode( ( GALLERYBROWSERMODE_PREVIEW != GetMode() ) ? GALLERYBROWSERMODE_PREVIEW : meLastMode ); + GetViewWindow()->GrabFocus(); +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::ShowContextMenu( Window*, const Point* pContextPoint ) +{ + Point aSelPos; + const ULONG nItemId = ImplGetSelectedItemId( pContextPoint, aSelPos ); + + if( mpCurTheme && nItemId && ( nItemId <= mpCurTheme->GetObjectCount() ) ) + { + ImplSelectItemId( nItemId ); + + SfxViewFrame* pCurrentViewFrame = SfxViewFrame::Current(); + if ( pCurrentViewFrame ) + { + SfxBindings& rBindings = pCurrentViewFrame->GetBindings(); + rBindings.ENTERREGISTRATIONS(); + GalleryThemePopup aMenu( mpCurTheme, nItemId - 1, GALLERYBROWSERMODE_PREVIEW == GetMode() ); + rBindings.LEAVEREGISTRATIONS(); + aMenu.SetSelectHdl( LINK( this, GalleryBrowser2, MenuSelectHdl ) ); + aMenu.Execute( this, aSelPos ); + } + } +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryBrowser2::KeyInput( const KeyEvent& rKEvt, Window* pWindow ) +{ + Point aSelPos; + const ULONG nItemId = ImplGetSelectedItemId( NULL, aSelPos ); + BOOL bRet = static_cast< GalleryBrowser* >( GetParent() )->KeyInput( rKEvt, pWindow ); + + if( !bRet && !maViewBox.HasFocus() && nItemId && mpCurTheme ) + { + USHORT nExecuteId = 0; + const SgaObjKind eObjKind = mpCurTheme->GetObjectKind( nItemId - 1 ); + INetURLObject aURL; + + const_cast< GalleryTheme* >( mpCurTheme )->GetURL( nItemId - 1, aURL ); + + const BOOL bValidURL = ( aURL.GetProtocol() != INET_PROT_NOT_VALID ); + BOOL bPreview = bValidURL; + BOOL bAdd = bValidURL; + BOOL bAddLink = ( bValidURL && SGA_OBJ_SVDRAW != eObjKind ); + BOOL bDelete = FALSE; + BOOL bTitle = FALSE; + + if( !mpCurTheme->IsReadOnly() && mpCurTheme->GetObjectCount() ) + { + bDelete = ( GALLERYBROWSERMODE_PREVIEW != GetMode() ); + bTitle = TRUE; + } + + switch( rKEvt.GetKeyCode().GetCode() ) + { + case( KEY_SPACE ): + case( KEY_RETURN ): + case( KEY_P ): + { + if( bPreview ) + { + TogglePreview( pWindow ); + bRet = TRUE; + } + } + break; + + case( KEY_INSERT ): + case( KEY_I ): + { + if( bAddLink && rKEvt.GetKeyCode().IsShift() && rKEvt.GetKeyCode().IsMod1() ) + nExecuteId = MN_ADD_LINK; + else if( bAdd ) + nExecuteId = MN_ADD; + } + break; + + case( KEY_DELETE ): + case( KEY_D ): + { + if( bDelete ) + nExecuteId = MN_DELETE; + } + break; + + case( KEY_T ): + { + if( bTitle ) + nExecuteId = MN_TITLE; + } + break; + + default: + break; + } + + if( nExecuteId ) + { + ImplExecute( nExecuteId ); + bRet = TRUE; + } + } + + return bRet; +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::SelectTheme( const String& rThemeName ) +{ + delete mpIconView, mpIconView = NULL; + delete mpListView, mpListView = NULL; + delete mpPreview, mpPreview = NULL; + + if( mpCurTheme ) + mpGallery->ReleaseTheme( mpCurTheme, *this ); + + mpCurTheme = mpGallery->AcquireTheme( rThemeName, *this ); + + mpIconView = new GalleryIconView( this, mpCurTheme ); + mpListView = new GalleryListView( this, mpCurTheme ); + mpPreview = new GalleryPreview( this, mpCurTheme ); + + const Link aSelectHdl( LINK( this, GalleryBrowser2, SelectObjectHdl ) ); + + mpIconView->SetSelectHdl( aSelectHdl ); + mpListView->SetSelectHdl( aSelectHdl ); + + if( GALLERYBROWSERMODE_PREVIEW == GetMode() ) + meMode = meLastMode; + + Resize(); + ImplUpdateViews( 1 ); + + maViewBox.EnableItem( TBX_ID_ICON, TRUE ); + maViewBox.EnableItem( TBX_ID_LIST, TRUE ); + maViewBox.CheckItem( ( GALLERYBROWSERMODE_ICON == GetMode() ) ? TBX_ID_ICON : TBX_ID_LIST, TRUE ); +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::SetMode( GalleryBrowserMode eMode ) +{ + if( GetMode() != eMode ) + { + meLastMode = GetMode(); + + switch( eMode ) + { + case( GALLERYBROWSERMODE_ICON ): + { + mpListView->Hide(); + + mpPreview->Hide(); + mpPreview->SetGraphic( Graphic() ); + mpPreview->PreviewMedia( INetURLObject() ); + + mpIconView->Show(); + + maViewBox.EnableItem( TBX_ID_ICON, TRUE ); + maViewBox.EnableItem( TBX_ID_LIST, TRUE ); + + maViewBox.CheckItem( TBX_ID_ICON, TRUE ); + maViewBox.CheckItem( TBX_ID_LIST, FALSE ); + } + break; + + case( GALLERYBROWSERMODE_LIST ): + { + mpIconView->Hide(); + + mpPreview->Hide(); + mpPreview->SetGraphic( Graphic() ); + mpPreview->PreviewMedia( INetURLObject() ); + + mpListView->Show(); + + maViewBox.EnableItem( TBX_ID_ICON, TRUE ); + maViewBox.EnableItem( TBX_ID_LIST, TRUE ); + + maViewBox.CheckItem( TBX_ID_ICON, FALSE ); + maViewBox.CheckItem( TBX_ID_LIST, TRUE ); + } + break; + + case( GALLERYBROWSERMODE_PREVIEW ): + { + Graphic aGraphic; + Point aSelPos; + const ULONG nItemId = ImplGetSelectedItemId( NULL, aSelPos ); + + if( nItemId ) + { + const ULONG nPos = nItemId - 1; + + mpIconView->Hide(); + mpListView->Hide(); + + if( mpCurTheme ) + mpCurTheme->GetGraphic( nPos, aGraphic ); + + mpPreview->SetGraphic( aGraphic ); + mpPreview->Show(); + + if( mpCurTheme && mpCurTheme->GetObjectKind( nPos ) == SGA_OBJ_SOUND ) + mpPreview->PreviewMedia( mpCurTheme->GetObjectURL( nPos ) ); + + maViewBox.EnableItem( TBX_ID_ICON, FALSE ); + maViewBox.EnableItem( TBX_ID_LIST, FALSE ); + } + } + break; + + default: + break; + } + + GalleryBrowser2::meInitMode = meMode = eMode; + } +} + +// ----------------------------------------------------------------------------- + +Window* GalleryBrowser2::GetViewWindow() const +{ + Window* pRet; + + switch( GetMode() ) + { + case( GALLERYBROWSERMODE_LIST ): pRet = mpListView; break; + case( GALLERYBROWSERMODE_PREVIEW ): pRet = mpPreview; break; + + default: + pRet = mpIconView; + break; + } + + return pRet; +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::Travel( GalleryBrowserTravel eTravel ) +{ + if( mpCurTheme ) + { + Point aSelPos; + const ULONG nItemId = ImplGetSelectedItemId( NULL, aSelPos ); + + if( nItemId ) + { + ULONG nNewItemId = nItemId; + + switch( eTravel ) + { + case( GALLERYBROWSERTRAVEL_FIRST ): nNewItemId = 1; break; + case( GALLERYBROWSERTRAVEL_LAST ): nNewItemId = mpCurTheme->GetObjectCount(); break; + case( GALLERYBROWSERTRAVEL_PREVIOUS ): nNewItemId--; break; + case( GALLERYBROWSERTRAVEL_NEXT ): nNewItemId++; break; + default: + break; + } + + if( nNewItemId < 1 ) + nNewItemId = 1; + else if( nNewItemId > mpCurTheme->GetObjectCount() ) + nNewItemId = mpCurTheme->GetObjectCount(); + + if( nNewItemId != nItemId ) + { + ImplSelectItemId( nNewItemId ); + ImplUpdateInfoBar(); + + if( GALLERYBROWSERMODE_PREVIEW == GetMode() ) + { + Graphic aGraphic; + const ULONG nPos = nNewItemId - 1; + + mpCurTheme->GetGraphic( nPos, aGraphic ); + mpPreview->SetGraphic( aGraphic ); + + if( SGA_OBJ_SOUND == mpCurTheme->GetObjectKind( nPos ) ) + mpPreview->PreviewMedia( mpCurTheme->GetObjectURL( nPos ) ); + + mpPreview->Invalidate(); + } + } + } + } +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::ImplUpdateViews( USHORT nSelectionId ) +{ + mpIconView->Hide(); + mpListView->Hide(); + mpPreview->Hide(); + + mpIconView->Clear(); + mpListView->Clear(); + + if( mpCurTheme ) + { + for( ULONG i = 0, nCount = mpCurTheme->GetObjectCount(); i < nCount; ) + { + mpListView->RowInserted( i++ ); + mpIconView->InsertItem( (USHORT) i ); + } + + ImplSelectItemId( ( ( nSelectionId > mpCurTheme->GetObjectCount() ) ? mpCurTheme->GetObjectCount() : nSelectionId ) ); + } + + switch( GetMode() ) + { + case( GALLERYBROWSERMODE_ICON ): mpIconView->Show(); break; + case( GALLERYBROWSERMODE_LIST ): mpListView->Show(); break; + case( GALLERYBROWSERMODE_PREVIEW ): mpPreview->Show(); break; + + default: + break; + } + + ImplUpdateInfoBar(); +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::ImplUpdateInfoBar() +{ + String aInfoText; + + if( mpCurTheme ) + { + Point aSelPos; + const ULONG nItemId = ImplGetSelectedItemId( NULL, aSelPos ); + + if( nItemId ) + { + const ULONG nPos = nItemId - 1; + + aInfoText = mpCurTheme->GetName(); + + if( nPos < mpCurTheme->GetObjectCount() ) + { + SgaObject* pObj = mpCurTheme->AcquireObject( nPos ); + + if( pObj ) + { + aInfoText = GetItemText( *mpCurTheme, *pObj, GALLERY_ITEM_THEMENAME | GALLERY_ITEM_TITLE | GALLERY_ITEM_PATH ); + mpCurTheme->ReleaseObject( pObj ); + } + } + } + } + + maInfoBar.SetText( aInfoText ); +} + +// ----------------------------------------------------------------------------- + +ULONG GalleryBrowser2::ImplGetSelectedItemId( const Point* pSelPos, Point& rSelPos ) +{ + const Size aOutputSizePixel( GetOutputSizePixel() ); + ULONG nRet = 0; + + if( GALLERYBROWSERMODE_PREVIEW == GetMode() ) + { + nRet = ( ( GALLERYBROWSERMODE_ICON == meLastMode ) ? mpIconView->GetSelectItemId() : ( mpListView->FirstSelectedRow() + 1 ) ); + + if( pSelPos ) + rSelPos = GetPointerPosPixel(); + else + rSelPos = Point( aOutputSizePixel.Width() >> 1, aOutputSizePixel.Height() >> 1 ); + } + else if( GALLERYBROWSERMODE_ICON == GetMode() ) + { + if( pSelPos ) + { + nRet = mpIconView->GetItemId( *pSelPos ); + rSelPos = GetPointerPosPixel(); + } + else + { + nRet = mpIconView->GetSelectItemId(); + rSelPos = mpIconView->GetItemRect( (USHORT) nRet ).Center(); + } + } + else + { + if( pSelPos ) + { + nRet = mpListView->GetRowAtYPosPixel( pSelPos->Y() ) + 1; + rSelPos = GetPointerPosPixel(); + } + else + { + nRet = mpListView->FirstSelectedRow() + 1; + rSelPos = mpListView->GetFieldRectPixel( (USHORT) nRet, 1 ).Center(); + } + } + + rSelPos.X() = Max( Min( rSelPos.X(), aOutputSizePixel.Width() - 1L ), 0L ); + rSelPos.Y() = Max( Min( rSelPos.Y(), aOutputSizePixel.Height() - 1L ), 0L ); + + if( nRet && ( !mpCurTheme || ( nRet > mpCurTheme->GetObjectCount() ) ) ) + { + nRet = 0; + } + + return nRet; +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::ImplSelectItemId( ULONG nItemId ) +{ + if( nItemId ) + { + + mpIconView->SelectItem( (USHORT) nItemId ); + mpListView->SelectRow( nItemId - 1 ); + } +} + +// ----------------------------------------------------------------------------- + +void GalleryBrowser2::ImplExecute( USHORT nId ) +{ + Point aSelPos; + const ULONG nItemId = ImplGetSelectedItemId( NULL, aSelPos ); + + if( mpCurTheme && nItemId ) + { + mnCurActionPos = nItemId - 1; + + switch( nId ) + { + case( MN_ADD ): + case( MN_ADD_LINK ): + { + sal_uInt32 nFormat = 0; + + mbCurActionIsLinkage = ( MN_ADD_LINK == nId ); + + switch( mpCurTheme->GetObjectKind( mnCurActionPos ) ) + { + case( SGA_OBJ_BMP ): + case( SGA_OBJ_ANIM ): + case( SGA_OBJ_INET ): + nFormat = SGA_FORMAT_GRAPHIC | SGA_FORMAT_STRING; + break; + + case ( SGA_OBJ_SOUND ) : + nFormat = SGA_FORMAT_SOUND | SGA_FORMAT_STRING; + break; + + case( SGA_OBJ_SVDRAW ): + nFormat = SGA_FORMAT_GRAPHIC | SGA_FORMAT_SVDRAW | SGA_FORMAT_STRING; + break; + + default : + break; + } + + const SfxUInt32Item aItem( SID_GALLERY_FORMATS, nFormat ); + SfxViewFrame::Current()->GetBindings().GetDispatcher()->Execute( + SID_GALLERY_FORMATS, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L ); + } + break; + + case( MN_PREVIEW ): + SetMode( ( GALLERYBROWSERMODE_PREVIEW != GetMode() ) ? GALLERYBROWSERMODE_PREVIEW : meLastMode ); + break; + + case( MN_DELETE ): + { + if( !mpCurTheme->IsReadOnly() && + QueryBox( NULL, WB_YES_NO, String( GAL_RESID( RID_SVXSTR_GALLERY_DELETEOBJ ) ) ).Execute() == RET_YES ) + { + mpCurTheme->RemoveObject( mnCurActionPos ); + } + } + break; + + case( MN_TITLE ): + { + SgaObject* pObj = mpCurTheme->AcquireObject( mnCurActionPos ); + + if( pObj ) + { + const String aOldTitle( GetItemText( *mpCurTheme, *pObj, GALLERY_ITEM_TITLE ) ); + //CHINA001 TitleDialog aDlg( this, aOldTitle ); + SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); + if(pFact) + { + AbstractTitleDialog* aDlg = pFact->CreateTitleDialog( this, aOldTitle ); + DBG_ASSERT(aDlg, "Dialogdiet fail!");//CHINA001 + if( aDlg->Execute() == RET_OK )//CHINA001 if( aDlg.Execute() == RET_OK ) + { + String aNewTitle( aDlg->GetTitle() );//CHINA001 String aNewTitle( aDlg.GetTitle() ); + + if( ( !aNewTitle.Len() && pObj->GetTitle().Len() ) || ( aNewTitle != aOldTitle ) ) + { + if( !aNewTitle.Len() ) + aNewTitle = String( RTL_CONSTASCII_USTRINGPARAM( "__<empty>__" ) ); + + pObj->SetTitle( aNewTitle ); + mpCurTheme->InsertObject( *pObj ); + } + } + + mpCurTheme->ReleaseObject( pObj ); + delete aDlg; //add CHINA001 + } + } + } + break; + + case( MN_COPYCLIPBOARD ): + { + Window* pWindow; + + switch( GetMode() ) + { + case( GALLERYBROWSERMODE_ICON ): pWindow = (Window*) mpIconView; break; + case( GALLERYBROWSERMODE_LIST ): pWindow = (Window*) mpListView; break; + case( GALLERYBROWSERMODE_PREVIEW ): pWindow = (Window*) mpPreview; break; + + default: + pWindow = NULL; + break; + } + + mpCurTheme->CopyToClipboard( pWindow, mnCurActionPos ); + } + break; + + case( MN_PASTECLIPBOARD ): + { + if( !mpCurTheme->IsReadOnly() ) + { + TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( this ) ); + mpCurTheme->InsertTransferable( aDataHelper.GetTransferable(), mnCurActionPos ); + } + } + break; + + default: + break; + } + } +} + +// ----------------------------------------------------------------------------- + +String GalleryBrowser2::GetItemText( const GalleryTheme& rTheme, const SgaObject& rObj, ULONG nItemTextFlags ) +{ + INetURLObject aURL; + String aRet; + + if( rTheme.IsImported() ) + { + aURL = rTheme.GetParent()->GetImportURL( rTheme.GetName() ); + + aURL.removeSegment(); + aURL.Append( rObj.GetURL().GetName() ); + } + else + aURL = rObj.GetURL(); + + if( nItemTextFlags & GALLERY_ITEM_THEMENAME ) + { + aRet += rTheme.GetName(); + aRet += String( RTL_CONSTASCII_USTRINGPARAM( " - " ) ); + } + + if( nItemTextFlags & GALLERY_ITEM_TITLE ) + { + String aTitle( rObj.GetTitle() ); + + if( !aTitle.Len() ) + aTitle = aURL.getBase( INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_UNAMBIGUOUS ); + + if( !aTitle.Len() ) + { + aTitle = aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ); + aTitle = aTitle.GetToken( aTitle.GetTokenCount( '/' ) - 1, '/' ); + } + + aRet += aTitle; + } + + if( nItemTextFlags & GALLERY_ITEM_PATH ) + { + const String aPath( aURL.getFSysPath( INetURLObject::FSYS_DETECT ) ); + + if( aPath.Len() && ( nItemTextFlags & GALLERY_ITEM_TITLE ) ) + aRet += String( RTL_CONSTASCII_USTRINGPARAM( " (" ) ); + + aRet += String(aURL.getFSysPath( INetURLObject::FSYS_DETECT )); + + if( aPath.Len() && ( nItemTextFlags & GALLERY_ITEM_TITLE ) ) + aRet += ')'; + } + + return aRet; +} + +// ----------------------------------------------------------------------------- + +INetURLObject GalleryBrowser2::GetURL() const +{ + INetURLObject aURL; + + if( mpCurTheme && mnCurActionPos != 0xffffffff ) + aURL = mpCurTheme->GetObjectURL( mnCurActionPos ); + + return aURL; +} + +// ----------------------------------------------------------------------------- + +String GalleryBrowser2::GetFilterName() const +{ + String aFilterName; + + if( mpCurTheme && mnCurActionPos != 0xffffffff ) + { + const SgaObjKind eObjKind = mpCurTheme->GetObjectKind( mnCurActionPos ); + + if( ( SGA_OBJ_BMP == eObjKind ) || ( SGA_OBJ_ANIM == eObjKind ) ) + { + GraphicFilter* pFilter = GraphicFilter::GetGraphicFilter(); + INetURLObject aURL; mpCurTheme->GetURL( mnCurActionPos, aURL ); + sal_uInt16 nFilter = pFilter->GetImportFormatNumberForShortName( aURL.GetExtension() ); + + if( GRFILTER_FORMAT_DONTKNOW != nFilter ) + aFilterName = pFilter->GetImportFormatName( nFilter ); + } + } + + return aFilterName; +} + +// ----------------------------------------------------------------------------- + +Graphic GalleryBrowser2::GetGraphic() const +{ + Graphic aGraphic; + + if( mpCurTheme && mnCurActionPos != 0xffffffff ) + mpCurTheme->GetGraphic( mnCurActionPos, aGraphic ); + + return aGraphic; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryBrowser2::GetVCDrawModel( FmFormModel& rModel ) const +{ + BOOL bRet = FALSE; + + if( mpCurTheme && mnCurActionPos != 0xffffffff ) + bRet = mpCurTheme->GetModel( mnCurActionPos, rModel ); + + return bRet; +} + +// ----------------------------------------------------------------------------- + +BOOL GalleryBrowser2::IsLinkage() const +{ + return mbCurActionIsLinkage; +} + +// ----------------------------------------------------------------------------- + +IMPL_LINK( GalleryBrowser2, MenuSelectHdl, Menu*, pMenu ) +{ + if( pMenu ) + ImplExecute( pMenu->GetCurItemId() ); + + return 0; +} + +// ----------------------------------------------------------------------------- + +IMPL_LINK( GalleryBrowser2, SelectObjectHdl, void*, EMPTYARG ) +{ + ImplUpdateInfoBar(); + return 0L; +} + +// ----------------------------------------------------------------------------- + +IMPL_LINK( GalleryBrowser2, SelectTbxHdl, ToolBox*, pBox ) +{ + if( pBox->GetCurItemId() == TBX_ID_ICON ) + SetMode( GALLERYBROWSERMODE_ICON ); + else if( pBox->GetCurItemId() == TBX_ID_LIST ) + SetMode( GALLERYBROWSERMODE_LIST ); + + return 0L; +} + +// ----------------------------------------------------------------------------- + +IMPL_LINK( GalleryBrowser2, MiscHdl, void*, EMPTYARG ) +{ + const sal_Bool bHC = maViewBox.GetSettings().GetStyleSettings().GetHighContrastMode(); + + maViewBox.SetOutStyle( maMiscOptions.GetToolboxStyle() ); + + BitmapEx aIconBmpEx = BitmapEx( Image( GAL_RESID( bHC? RID_SVXIMG_GALLERY_VIEW_ICON_HC : RID_SVXIMG_GALLERY_VIEW_ICON ) ).GetBitmapEx() ); + BitmapEx aListBmpEx = BitmapEx( Image( GAL_RESID( bHC? RID_SVXIMG_GALLERY_VIEW_LIST_HC : RID_SVXIMG_GALLERY_VIEW_LIST ) ).GetBitmapEx() ); + + if( maMiscOptions.AreCurrentSymbolsLarge() ) + { + const Size aLargeSize( 24, 24); + + aIconBmpEx.Scale( aLargeSize ); + aListBmpEx.Scale( aLargeSize ); + } + + maViewBox.SetItemImage( TBX_ID_ICON, aIconBmpEx ); + maViewBox.SetItemImage( TBX_ID_LIST, aListBmpEx ); + maViewBox.SetSizePixel( maViewBox.CalcWindowSizePixel() ); + + Resize(); + + return 0L; +} |