diff options
author | Mathias Bauer <mba@openoffice.org> | 2009-12-05 19:29:07 +0100 |
---|---|---|
committer | Mathias Bauer <mba@openoffice.org> | 2009-12-05 19:29:07 +0100 |
commit | 315c7c2f877e41080f8442cfba35396511903bc1 (patch) | |
tree | 37f504855c23e07915c42219e95d2c00258a8e54 /sd/source/ui | |
parent | 1919fd6149aa492c5637df5d54f47e36ba0109ff (diff) | |
parent | f06dd4493d6bdc97371138ae1e28ac5d37bc188e (diff) |
merge to m67
Diffstat (limited to 'sd/source/ui')
22 files changed, 506 insertions, 507 deletions
diff --git a/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx b/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx index 2f86b8f8f1ad..55d485e7b08b 100644 --- a/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx +++ b/sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx @@ -39,17 +39,11 @@ #include <com/sun/star/frame/XFrame.hpp> #include <com/sun/star/document/XEventBroadcaster.hpp> #include <com/sun/star/beans/XPropertySet.hpp> -#ifndef _COM_SUN_STAR_ACCESSIBLE_ACCESSIBLEEVENTID_HPP_ #include <com/sun/star/accessibility/AccessibleEventId.hpp> -#endif #include <com/sun/star/lang/IndexOutOfBoundsException.hpp> -#ifndef _COM_SUN_STAR_LANG_XMULSTISERVICEFACTORY_HPP_ #include <com/sun/star/lang/XMultiServiceFactory.hpp> -#endif #include <rtl/ustring.h> -#ifndef _SFXFRAME_HXX #include<sfx2/viewfrm.hxx> -#endif #include <svx/AccessibleShape.hxx> @@ -279,7 +273,7 @@ sal_Int32 SAL_CALL Reference<XAccessible> SAL_CALL AccessibleDocumentViewBase::getAccessibleChild (sal_Int32 nIndex) - throw (uno::RuntimeException) + throw (uno::RuntimeException, lang::IndexOutOfBoundsException) { ThrowIfDisposed (); diff --git a/sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx b/sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx index 38350f246bf1..1ea7d53ea35a 100644 --- a/sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx +++ b/sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx @@ -40,20 +40,11 @@ #include <com/sun/star/frame/XFrame.hpp> #include <com/sun/star/document/XEventBroadcaster.hpp> #include <com/sun/star/beans/XPropertySet.hpp> -#ifndef _COM_SUN_STAR_ACCESSIBLE_ACCESSIBLEEVENTID_HPP_ #include <com/sun/star/accessibility/AccessibleEventId.hpp> -#endif -#ifndef _COM_SUN_STAR_ACCESSIBLE_ACCESSIBLESTATETYPE_HPP_ #include <com/sun/star/accessibility/AccessibleStateType.hpp> -#endif -#include <com/sun/star/lang/IndexOutOfBoundsException.hpp> -#ifndef _COM_SUN_STAR_LANG_XMULSTISERVICEFACTORY_HPP_ #include <com/sun/star/lang/XMultiServiceFactory.hpp> -#endif #include <rtl/ustring.h> -#ifndef _SFXFRAME_HXX #include<sfx2/viewfrm.hxx> -#endif #include <svx/AccessibleShape.hxx> @@ -243,7 +234,7 @@ sal_Int32 SAL_CALL uno::Reference<XAccessible> SAL_CALL AccessibleDrawDocumentView::getAccessibleChild (sal_Int32 nIndex) - throw (::com::sun::star::uno::RuntimeException) + throw (uno::RuntimeException, lang::IndexOutOfBoundsException) { ThrowIfDisposed (); diff --git a/sd/source/ui/dlg/docprev.cxx b/sd/source/ui/dlg/docprev.cxx index b53b570f813e..b8c2f0b0867d 100644 --- a/sd/source/ui/dlg/docprev.cxx +++ b/sd/source/ui/dlg/docprev.cxx @@ -67,7 +67,11 @@ void SdDocPreviewWin::SetObjectShell( SfxObjectShell* pObj, sal_uInt16 nShowPage { mpObj = pObj; mnShowPage = nShowPage; - mxSlideShow.clear(); + if (mxSlideShow.is()) + { + mxSlideShow->end(); + mxSlideShow.clear(); + } updateViewSettings(); } diff --git a/sd/source/ui/docshell/docshell.cxx b/sd/source/ui/docshell/docshell.cxx index d9e5f43535ef..7d18f19f1993 100644 --- a/sd/source/ui/docshell/docshell.cxx +++ b/sd/source/ui/docshell/docshell.cxx @@ -92,7 +92,6 @@ #include "FrameView.hxx" #endif #include "unomodel.hxx" -#include "formatclipboard.hxx" #include "undo/undomanager.hxx" #include "undo/undofactory.hxx" #include "OutlineView.hxx" @@ -169,7 +168,6 @@ DrawDocShell::DrawDocShell(SfxObjectCreateMode eMode, BOOL bDataObject, DocumentType eDocumentType,BOOL bScriptSupport) : SfxObjectShell( eMode == SFX_CREATE_MODE_INTERNAL ? SFX_CREATE_MODE_EMBEDDED : eMode), - mpFormatClipboard(new SdFormatClipboard()), mpDoc(NULL), mpUndoManager(NULL), mpPrinter(NULL), @@ -196,7 +194,6 @@ DrawDocShell::DrawDocShell(SdDrawDocument* pDoc, SfxObjectCreateMode eMode, BOOL bDataObject, DocumentType eDocumentType) : SfxObjectShell(eMode == SFX_CREATE_MODE_INTERNAL ? SFX_CREATE_MODE_EMBEDDED : eMode), - mpFormatClipboard(new SdFormatClipboard()), mpDoc(pDoc), mpUndoManager(NULL), mpPrinter(NULL), @@ -235,9 +232,6 @@ DrawDocShell::~DrawDocShell() mpDoc->SetSdrUndoManager( 0 ); delete mpUndoManager; - if(mpFormatClipboard) - delete mpFormatClipboard; - if (mbOwnPrinter) delete mpPrinter; diff --git a/sd/source/ui/docshell/formatclipboard.cxx b/sd/source/ui/docshell/formatclipboard.cxx deleted file mode 100644 index ba4fb8efae99..000000000000 --- a/sd/source/ui/docshell/formatclipboard.cxx +++ /dev/null @@ -1,237 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: formatclipboard.cxx,v $ - * $Revision: 1.10 $ - * - * 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_sd.hxx" - -#include "formatclipboard.hxx" -#include <svx/globl3d.hxx> - -// header for class SfxItemIter -#include <svl/itemiter.hxx> - -// header for class SfxStyleSheet -#include <svl/style.hxx> - -/*-------------------------------------------------------------------- - --------------------------------------------------------------------*/ - -SdFormatClipboard::SdFormatClipboard() - : m_pItemSet(0) - , m_bPersistentCopy(false) - , m_nType_Inventor(0) - , m_nType_Identifier(0) -{ -} -SdFormatClipboard::~SdFormatClipboard() -{ - if(m_pItemSet) - delete m_pItemSet; -} - -bool SdFormatClipboard::HasContent() const -{ - return m_pItemSet!=0; -} - -bool SdFormatClipboard::CanCopyThisType( UINT32 nObjectInventor, UINT16 nObjectIdentifier ) const -{ - if( nObjectInventor != SdrInventor && nObjectInventor != E3dInventor ) - return false; - switch(nObjectIdentifier) - { - case OBJ_NONE: - case OBJ_GRUP: - return false; - case OBJ_LINE: - case OBJ_RECT: - case OBJ_CIRC: - case OBJ_SECT: - case OBJ_CARC: - case OBJ_CCUT: - case OBJ_POLY: - case OBJ_PLIN: - case OBJ_PATHLINE: - case OBJ_PATHFILL: - case OBJ_FREELINE: - case OBJ_FREEFILL: - case OBJ_SPLNLINE: - case OBJ_SPLNFILL: - case OBJ_TEXT: - case OBJ_TEXTEXT: - case OBJ_TITLETEXT: - return true; - case OBJ_OUTLINETEXT: - case OBJ_GRAF: - case OBJ_OLE2: - case OBJ_EDGE: - case OBJ_CAPTION: - return false; - case OBJ_PATHPOLY: - case OBJ_PATHPLIN: - return true; - case OBJ_PAGE: - case OBJ_MEASURE: - case OBJ_DUMMY: - case OBJ_FRAME: - case OBJ_UNO: - return false; - case OBJ_CUSTOMSHAPE: - return true; - default: - return false; - } -} - -bool SdFormatClipboard::HasContentForThisType( UINT32 nObjectInventor, UINT16 nObjectIdentifier ) const -{ - if( !HasContent() ) - return false; - if( !CanCopyThisType( nObjectInventor, nObjectIdentifier ) ) - return false; - return true; -} - -void SdFormatClipboard::Copy( ::sd::View& rDrawView, bool bPersistentCopy ) -{ - this->Erase(); - m_bPersistentCopy = bPersistentCopy; - - const SdrMarkList& rMarkList = rDrawView.GetMarkedObjectList(); - if( rMarkList.GetMarkCount() >= 1 ) - { - BOOL bOnlyHardAttr = FALSE; - m_pItemSet = new SfxItemSet( rDrawView.GetAttrFromMarked(bOnlyHardAttr) ); - - SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); - m_nType_Inventor = pObj->GetObjInventor(); - m_nType_Identifier = pObj->GetObjIdentifier(); - } -} - -void SdFormatClipboard::Paste( ::sd::View& rDrawView, bool, bool ) -{ - if( !rDrawView.AreObjectsMarked() ) - { - if(!m_bPersistentCopy) - this->Erase(); - return; - } - - SdrObject* pObj = 0; - - bool bWrongTargetType = false; - { - const SdrMarkList& rMarkList = rDrawView.GetMarkedObjectList(); - if( rMarkList.GetMarkCount() != 1 ) - bWrongTargetType = true; - else - { - pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); - if( pObj && pObj->GetStyleSheet() ) - bWrongTargetType = !this->HasContentForThisType( pObj->GetObjInventor(), pObj->GetObjIdentifier() ); - } - } - if( bWrongTargetType ) - { - if(!m_bPersistentCopy) - this->Erase(); - return; - } - if(m_pItemSet) - { - //modify source itemset - { - boost::shared_ptr< SfxItemSet > pTargetSet; - - if( pObj->GetStyleSheet() ) - { - pTargetSet.reset( new SfxItemSet( pObj->GetStyleSheet()->GetItemSet() ) ); - } - else - { - SdrModel* pModel = pObj->GetModel(); - if( pModel ) - { - pTargetSet.reset( new SfxItemSet( pModel->GetItemPool() ) ); - } - } - - if( pTargetSet.get() ) - { - USHORT nWhich=0; - SfxItemState nSourceState; - SfxItemState nTargetState; - const SfxPoolItem* pSourceItem=0; - const SfxPoolItem* pTargetItem=0; - SfxItemIter aSourceIter(*m_pItemSet); - pSourceItem = aSourceIter.FirstItem(); - while( pSourceItem!=NULL ) - { - if (!IsInvalidItem(pSourceItem)) - { - nWhich = pSourceItem->Which(); - if(nWhich) - { - nSourceState = m_pItemSet->GetItemState( nWhich ); - nTargetState = pTargetSet->GetItemState( nWhich ); - pTargetItem = pTargetSet->GetItem( nWhich ); - - if(!pTargetItem) - m_pItemSet->ClearItem(nWhich); - else if( (*pSourceItem) == (*pTargetItem) ) - { - //do not set items which have the same content in source and target - m_pItemSet->ClearItem(nWhich); - } - } - } - pSourceItem = aSourceIter.NextItem(); - }//end while - } - } - BOOL bReplaceAll = TRUE; - rDrawView.SetAttrToMarked(*m_pItemSet, bReplaceAll); - } - if(!m_bPersistentCopy) - this->Erase(); -} - -void SdFormatClipboard::Erase() -{ - if(m_pItemSet) - { - delete m_pItemSet; - m_pItemSet = 0; - } - m_nType_Inventor=0; - m_nType_Identifier=0; - m_bPersistentCopy = false; -} diff --git a/sd/source/ui/docshell/makefile.mk b/sd/source/ui/docshell/makefile.mk index f9e34eb03097..d33faaf69bbe 100644 --- a/sd/source/ui/docshell/makefile.mk +++ b/sd/source/ui/docshell/makefile.mk @@ -47,7 +47,6 @@ AUTOSEG=true # --- Files -------------------------------------------------------- SLOFILES = \ - $(SLO)$/formatclipboard.obj \ $(SLO)$/docshell.obj \ $(SLO)$/docshel2.obj \ $(SLO)$/docshel3.obj \ diff --git a/sd/source/ui/func/fuformatpaintbrush.cxx b/sd/source/ui/func/fuformatpaintbrush.cxx index 1eaee6385175..eb4ca01ba621 100644 --- a/sd/source/ui/func/fuformatpaintbrush.cxx +++ b/sd/source/ui/func/fuformatpaintbrush.cxx @@ -31,19 +31,30 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sd.hxx" +#include <sfx2/request.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/dispatch.hxx> + +#include <svtools/itemiter.hxx> + +#include <svx/globl3d.hxx> +#include <svx/svxids.hrc> +#include <svx/svdotable.hxx> +#include <svx/outliner.hxx> +#include <svx/eeitem.hxx> +#include <svx/editeng.hxx> + #define _SD_DLL // fuer SD_MOD() #include "sdmod.hxx" #include "fuformatpaintbrush.hxx" -#include "formatclipboard.hxx" -#include "View.hxx" -#include "ViewShell.hxx" +#include "drawview.hxx" #include "DrawDocShell.hxx" -// header for class SfxBindings -#include <sfx2/bindings.hxx> -/* -#include <svx/svxids.hrc> -*/ +#include "DrawViewShell.hxx" +#include "FrameView.hxx" +#include "drawdoc.hxx" +#include "Outliner.hxx" +#include "ViewShellBase.hxx" #ifndef SD_WINDOW_SHELL_HXX #include "Window.hxx" @@ -51,66 +62,137 @@ namespace sd { -TYPEINIT1( FuFormatPaintBrush, FuPoor ); +TYPEINIT1( FuFormatPaintBrush, FuText ); -FuFormatPaintBrush::FuFormatPaintBrush( - ViewShell* pViewSh - , ::sd::Window* pWin - , ::sd::View* pView - , SdDrawDocument* pDoc - , SfxRequest& rReq ) - : FuPoor(pViewSh, pWin, pView, pDoc, rReq) +FuFormatPaintBrush::FuFormatPaintBrush( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) +: FuText(pViewSh, pWin, pView, pDoc, rReq) +, mbPermanent( false ) +, mbOldIsQuickTextEditMode( true ) { } FunctionReference FuFormatPaintBrush::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) { FunctionReference xFunc( new FuFormatPaintBrush( pViewSh, pWin, pView, pDoc, rReq ) ); + xFunc->DoExecute( rReq ); return xFunc; } +void FuFormatPaintBrush::DoExecute( SfxRequest& rReq ) +{ + const SfxItemSet *pArgs = rReq.GetArgs(); + if( pArgs && pArgs->Count() >= 1 ) + { + mbPermanent = static_cast<bool>(((SfxBoolItem &)pArgs->Get(SID_FORMATPAINTBRUSH)).GetValue()); + } + + if( mpView ) + { + mpView->TakeFormatPaintBrush( mpItemSet ); + } +} + +void FuFormatPaintBrush::implcancel() +{ + if( mpViewShell && mpViewShell->GetViewFrame() ) + { + SfxViewFrame* pViewFrame = mpViewShell->GetViewFrame(); + pViewFrame->GetBindings().Invalidate(SID_FORMATPAINTBRUSH); + pViewFrame->GetDispatcher()->Execute(SID_OBJECT_SELECT, SFX_CALLMODE_ASYNCHRON); + } +} + +static void unmarkimpl( SdrView* pView ) +{ + pView->SdrEndTextEdit(); + pView->UnMarkAll(); +} + BOOL FuFormatPaintBrush::MouseButtonDown(const MouseEvent& rMEvt) { if(mpView&&mpWindow) { - USHORT nHitLog = USHORT ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); - BOOL bToggle = FALSE; - mpView->UnMarkAll(); - mpView->MarkObj(mpWindow->PixelToLogic( rMEvt.GetPosPixel() ), nHitLog, bToggle, FALSE); + SdrViewEvent aVEvt; + SdrHitKind eHit = mpView->PickAnything(rMEvt, SDRMOUSEBUTTONDOWN, aVEvt); + + if( (eHit == SDRHIT_TEXTEDIT) || (eHit == SDRHIT_TEXTEDITOBJ && ( mpViewShell->GetFrameView()->IsQuickEdit() || dynamic_cast< sdr::table::SdrTableObj* >( aVEvt.pObj ) != NULL ) )) + { + SdrObject* pPickObj=0; + SdrPageView* pPV=0; + USHORT nHitLog = USHORT ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + mpView->PickObj( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ),nHitLog, pPickObj, pPV, SDRSEARCH_PICKMARKABLE); + + if( (pPickObj != 0) && !pPickObj->IsEmptyPresObj() ) + { + // if we text hit another shape than the one currently selected, unselect the old one now + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + if( rMarkList.GetMarkCount() >= 1 ) + { + if( rMarkList.GetMarkCount() == 1 ) + { + if( rMarkList.GetMark(0)->GetMarkedSdrObj() != pPickObj ) + { + + // if current selected shape is not that of the hit text edit, deselect it + unmarkimpl( mpView ); + } + } + else + { + // more than one shape selected, deselect all of them + unmarkimpl( mpView ); + } + } + MouseEvent aMEvt( rMEvt.GetPosPixel(), rMEvt.GetClicks(), rMEvt.GetMode(), rMEvt.GetButtons(), 0 ); + return FuText::MouseButtonDown(aMEvt); + } + + if( aVEvt.pObj == 0 ) + aVEvt.pObj = pPickObj; + } + + unmarkimpl( mpView ); + + if( aVEvt.pObj ) + { + USHORT nHitLog = USHORT ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + BOOL bToggle = FALSE; + mpView->MarkObj(mpWindow->PixelToLogic( rMEvt.GetPosPixel() ), nHitLog, bToggle, FALSE); + return TRUE; + } } return FALSE; } BOOL FuFormatPaintBrush::MouseMove(const MouseEvent& rMEvt) { - SdFormatClipboard* pFormatClipboard = 0; - if(mpViewShell) - pFormatClipboard = mpViewShell->GetDocSh()->mpFormatClipboard; - if(mpView&&mpWindow&&pFormatClipboard&&pFormatClipboard->HasContent()) + BOOL bReturn = FALSE; + if( mpWindow && mpView ) { - USHORT nHitLog = USHORT ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); - SdrObject* pObj=0; - SdrPageView* pPV=0; - BOOL bOverMarkableObject = mpView->PickObj( - mpWindow->PixelToLogic( rMEvt.GetPosPixel() ) - ,nHitLog, pObj, pPV, SDRSEARCH_PICKMARKABLE); - - if(bOverMarkableObject && pFormatClipboard->HasContentForThisType(pObj->GetObjInventor(),pObj->GetObjIdentifier()) ) + if ( mpView->IsTextEdit() ) + { + bReturn = FuText::MouseMove( rMEvt ); mpWindow->SetPointer(Pointer(POINTER_FILL)); + } else - mpWindow->SetPointer(Pointer(POINTER_ARROW)); + { + USHORT nHitLog = USHORT ( mpWindow->PixelToLogic(Size(HITPIX,0)).Width() ); + SdrObject* pObj=0; + SdrPageView* pPV=0; + BOOL bOverMarkableObject = mpView->PickObj( mpWindow->PixelToLogic( rMEvt.GetPosPixel() ),nHitLog, pObj, pPV, SDRSEARCH_PICKMARKABLE); + + if(bOverMarkableObject && HasContentForThisType(pObj->GetObjInventor(),pObj->GetObjIdentifier()) ) + mpWindow->SetPointer(Pointer(POINTER_FILL)); + else + mpWindow->SetPointer(Pointer(POINTER_ARROW)); + } } - else - mpWindow->SetPointer(Pointer(POINTER_ARROW)); - return FALSE; + return bReturn; } BOOL FuFormatPaintBrush::MouseButtonUp(const MouseEvent& rMEvt) { - SdFormatClipboard* pFormatClipboard = 0; - if(mpViewShell) - pFormatClipboard = mpViewShell->GetDocSh()->mpFormatClipboard; - if( pFormatClipboard && mpView && mpView->AreObjectsMarked() ) + if( mpItemSet.get() && mpView && mpView->AreObjectsMarked() ) { bool bNoCharacterFormats = false; bool bNoParagraphFormats = false; @@ -120,37 +202,97 @@ BOOL FuFormatPaintBrush::MouseButtonUp(const MouseEvent& rMEvt) else if( rMEvt.GetModifier() & KEY_MOD1 ) bNoParagraphFormats = true; } - pFormatClipboard->Paste( *mpView, bNoCharacterFormats, bNoParagraphFormats ); + + OutlinerView* pOLV = mpView->GetTextEditOutlinerView(); + if( pOLV ) + pOLV->MouseButtonUp(rMEvt); + + Paste( bNoCharacterFormats, bNoParagraphFormats ); if(mpViewShell) mpViewShell->GetViewFrame()->GetBindings().Invalidate(SID_FORMATPAINTBRUSH); + + if( mbPermanent ) + return TRUE; } - if(mpViewShell && pFormatClipboard && !pFormatClipboard->HasContent() ) - mpViewShell->Cancel(); + + implcancel(); return TRUE; } BOOL FuFormatPaintBrush::KeyInput(const KeyEvent& rKEvt) { - if( rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE && mpViewShell ) + if( (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE) && mpViewShell ) { - SdFormatClipboard* pFormatClipboard = mpViewShell->GetDocSh()->mpFormatClipboard; - if(pFormatClipboard) - { - pFormatClipboard->Erase(); - mpViewShell->GetViewFrame()->GetBindings().Invalidate(SID_FORMATPAINTBRUSH); - mpViewShell->Cancel(); - - return TRUE; - } + implcancel(); + return TRUE; } return FuPoor::KeyInput(rKEvt); } void FuFormatPaintBrush::Activate() { + mbOldIsQuickTextEditMode = mpViewShell->GetFrameView()->IsQuickEdit(); + if( !mbOldIsQuickTextEditMode ) + { + mpViewShell->GetFrameView()->SetQuickEdit(TRUE); + mpView->SetQuickTextEditMode(TRUE); + } } void FuFormatPaintBrush::Deactivate() { + if( !mbOldIsQuickTextEditMode ) + { + mpViewShell->GetFrameView()->SetQuickEdit(FALSE); + mpView->SetQuickTextEditMode(FALSE); + } +} + +bool FuFormatPaintBrush::HasContentForThisType( UINT32 nObjectInventor, UINT16 nObjectIdentifier ) const +{ + if( mpItemSet.get() == 0 ) + return false; + if( !mpView || (!mpView->SupportsFormatPaintbrush( nObjectInventor, nObjectIdentifier) ) ) + return false; + return true; +} + +void FuFormatPaintBrush::Paste( bool bNoCharacterFormats, bool bNoParagraphFormats ) +{ + const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); + if(mpItemSet.get() && (rMarkList.GetMarkCount() == 1) ) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + + if( mpDoc->IsUndoEnabled() ) + { + String sLabel( mpViewShell->GetViewShellBase().RetrieveLabelFromCommand( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FormatPaintbrush" ) ) ) ); + mpDoc->BegUndo( sLabel ); + mpDoc->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoAttrObject(*pObj,FALSE,TRUE)); + } + + mpView->ApplyFormatPaintBrush( *mpItemSet.get(), bNoCharacterFormats, bNoParagraphFormats ); + + if( mpDoc->IsUndoEnabled() ) + { + mpDoc->EndUndo(); + } + } } + +/* static */ void FuFormatPaintBrush::GetMenuState( DrawViewShell& rDrawViewShell, SfxItemSet &rSet ) +{ + const SdrMarkList& rMarkList = rDrawViewShell.GetDrawView()->GetMarkedObjectList(); + const ULONG nMarkCount = rMarkList.GetMarkCount(); + + if( nMarkCount == 1 ) + { + SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); + if( pObj && rDrawViewShell.GetDrawView()->SupportsFormatPaintbrush(pObj->GetObjInventor(),pObj->GetObjIdentifier()) ) + return; + } + rSet.DisableItem( SID_FORMATPAINTBRUSH ); +} + + } // end of namespace sd diff --git a/sd/source/ui/inc/AccessibleDocumentViewBase.hxx b/sd/source/ui/inc/AccessibleDocumentViewBase.hxx index c0def8ca27a4..e371da534b67 100644 --- a/sd/source/ui/inc/AccessibleDocumentViewBase.hxx +++ b/sd/source/ui/inc/AccessibleDocumentViewBase.hxx @@ -42,6 +42,7 @@ #include <com/sun/star/awt/XFocusListener.hpp> #include <com/sun/star/beans/XPropertyChangeListener.hpp> #include <com/sun/star/accessibility/XAccessible.hpp> +#include <com/sun/star/lang/IndexOutOfBoundsException.hpp> #include <tools/link.hxx> namespace sd { @@ -159,7 +160,8 @@ public: virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible> SAL_CALL getAccessibleChild (sal_Int32 nIndex) - throw (::com::sun::star::uno::RuntimeException); + throw (::com::sun::star::uno::RuntimeException, + ::com::sun::star::lang::IndexOutOfBoundsException); //===== XAccessibleComponent ============================================ diff --git a/sd/source/ui/inc/AccessibleDrawDocumentView.hxx b/sd/source/ui/inc/AccessibleDrawDocumentView.hxx index 74aef069d7f5..cc09d31464a9 100644 --- a/sd/source/ui/inc/AccessibleDrawDocumentView.hxx +++ b/sd/source/ui/inc/AccessibleDrawDocumentView.hxx @@ -33,7 +33,6 @@ #include "AccessibleDocumentViewBase.hxx" - namespace accessibility { @@ -78,7 +77,8 @@ public: virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible> SAL_CALL getAccessibleChild (sal_Int32 nIndex) - throw (::com::sun::star::uno::RuntimeException); + throw (::com::sun::star::uno::RuntimeException, + ::com::sun::star::lang::IndexOutOfBoundsException); //===== lang::XEventListener ============================================ diff --git a/sd/source/ui/inc/DrawDocShell.hxx b/sd/source/ui/inc/DrawDocShell.hxx index fb2d83ba4be9..6348f330e081 100644 --- a/sd/source/ui/inc/DrawDocShell.hxx +++ b/sd/source/ui/inc/DrawDocShell.hxx @@ -52,7 +52,6 @@ class SfxPrinter; struct SdrDocumentStreamInfo; struct SpellCallbackInfo; class AbstractSvxNameDialog; -class SdFormatClipboard; namespace sd { @@ -209,9 +208,6 @@ public: void ClearUndoBuffer(); -public: - SdFormatClipboard* mpFormatClipboard; - protected: SdDrawDocument* mpDoc; diff --git a/sd/source/ui/inc/ViewShellBase.hxx b/sd/source/ui/inc/ViewShellBase.hxx index 8187d308bfb8..383bd12fcdb5 100644 --- a/sd/source/ui/inc/ViewShellBase.hxx +++ b/sd/source/ui/inc/ViewShellBase.hxx @@ -259,6 +259,10 @@ public: CustomHandleManager& getCustomHandleManager() const; + /** returns the ui descriptive name for the given uno slot. The result is taken from the configuration + and not cached, so do not use it excessive (f.e. in status updates) */ + ::rtl::OUString RetrieveLabelFromCommand( const ::rtl::OUString& aCmdURL ) const;
+ protected: osl::Mutex maMutex; diff --git a/sd/source/ui/inc/formatclipboard.hxx b/sd/source/ui/inc/formatclipboard.hxx deleted file mode 100644 index cd8d3b801bf8..000000000000 --- a/sd/source/ui/inc/formatclipboard.hxx +++ /dev/null @@ -1,64 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: formatclipboard.hxx,v $ - * $Revision: 1.4 $ - * - * 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. - * - ************************************************************************/ - -#ifndef _SDFORMATCLIPBOARD_HXX -#define _SDFORMATCLIPBOARD_HXX - -#include "View.hxx" -// header for class SfxItemSet -#include <svl/itemset.hxx> - -//----------------------------------------------------------------------------- -/** This class acts as data container and execution class for the format paintbrush feature in draw and impress. -*/ - -class SdFormatClipboard -{ -public: - SdFormatClipboard(); - virtual ~SdFormatClipboard(); - - bool HasContent() const; - bool CanCopyThisType( UINT32 nObjectInventor, UINT16 nObjectIdentifier ) const; - bool HasContentForThisType( UINT32 nObjectInventor, UINT16 nObjectIdentifier ) const; - - void Copy( ::sd::View& rDrawView, bool bPersistentCopy=false ); - void Paste( ::sd::View& rDrawView - , bool bNoCharacterFormats=false, bool bNoParagraphFormats=false ); - void Erase(); - -private: - SfxItemSet* m_pItemSet; - bool m_bPersistentCopy; - UINT32 m_nType_Inventor; - UINT16 m_nType_Identifier; -}; - -#endif diff --git a/sd/source/ui/inc/fuformatpaintbrush.hxx b/sd/source/ui/inc/fuformatpaintbrush.hxx index 223b766296c5..d14664a5b66b 100644 --- a/sd/source/ui/inc/fuformatpaintbrush.hxx +++ b/sd/source/ui/inc/fuformatpaintbrush.hxx @@ -31,15 +31,17 @@ #ifndef SD_FU_FORMATPAINTBRUSH_HXX #define SD_FU_FORMATPAINTBRUSH_HXX -#include "fupoor.hxx" +#include "futext.hxx" // header for class SfxItemSet #include <svl/itemset.hxx> +#include <boost/scoped_ptr.hpp> namespace sd { -class FuFormatPaintBrush - : public FuPoor +class DrawViewShell; + +class FuFormatPaintBrush : public FuText { public: TYPEINFO(); @@ -54,14 +56,22 @@ public: virtual void Activate(); virtual void Deactivate(); + static void GetMenuState( DrawViewShell& rDrawViewShell, SfxItemSet &rSet ); + static bool CanCopyThisType( UINT32 nObjectInventor, UINT16 nObjectIdentifier ); + private: - FuFormatPaintBrush ( - ViewShell* pViewSh, - ::sd::Window* pWin, - ::sd::View* pView, - SdDrawDocument* pDoc, - SfxRequest& rReq); + FuFormatPaintBrush ( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq); + + void DoExecute( SfxRequest& rReq ); + + bool HasContentForThisType( UINT32 nObjectInventor, UINT16 nObjectIdentifier ) const; + void Paste( bool, bool ); + + void implcancel(); + ::boost::shared_ptr<SfxItemSet> mpItemSet; + bool mbPermanent; + bool mbOldIsQuickTextEditMode; }; } // end of namespace sd diff --git a/sd/source/ui/slideshow/slideshowimpl.cxx b/sd/source/ui/slideshow/slideshowimpl.cxx index a3d117322e84..e59f45b71e12 100644 --- a/sd/source/ui/slideshow/slideshowimpl.cxx +++ b/sd/source/ui/slideshow/slideshowimpl.cxx @@ -169,7 +169,9 @@ public: bool nextSlide(); bool previousSlide(); - void displayCurrentSlide( const Reference< XSlideShow >& xShow ); + void displayCurrentSlide( + const Reference< XSlideShow >& xShow, + const bool bSkipAllMainSequenceEffects); sal_Int32 getNextSlideIndex() const; sal_Int32 getPreviousSlideIndex() const; @@ -466,15 +468,17 @@ bool AnimationSlideController::previousSlide() return jumpToSlideIndex( getPreviousSlideIndex() ); } -void AnimationSlideController::displayCurrentSlide( const Reference< XSlideShow >& xShow ) +void AnimationSlideController::displayCurrentSlide( + const Reference< XSlideShow >& xShow, + const bool bSkipAllMainSequenceEffects) { const sal_Int32 nCurrentSlideNumber = getCurrentSlideNumber(); if( xShow.is() && (nCurrentSlideNumber != -1 ) ) { - Sequence< PropertyValue > aProperties; Reference< XDrawPage > xSlide; Reference< XAnimationNode > xAnimNode; + ::std::vector<PropertyValue> aProperties; const sal_Int32 nNextSlideNumber = getNextSlideNumber(); if( getSlideAPI( nNextSlideNumber, xSlide, xAnimNode ) ) @@ -482,13 +486,40 @@ void AnimationSlideController::displayCurrentSlide( const Reference< XSlideShow Sequence< Any > aValue(2); aValue[0] <<= xSlide; aValue[1] <<= xAnimNode; - aProperties.realloc(1); - aProperties[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "Prefetch" ) ); - aProperties[0].Value <<= aValue; + aProperties.push_back( + PropertyValue( + OUString( RTL_CONSTASCII_USTRINGPARAM( "Prefetch" ) ), + -1, + Any(aValue), + PropertyState_DIRECT_VALUE)); + } + if (bSkipAllMainSequenceEffects) + { + // Add one property that prevents the slide transition from being + // shown (to speed up the transition to the previous slide) and + // one to show all main sequence effects so that the user can + // continue to undo effects. + aProperties.push_back( + PropertyValue( + OUString( RTL_CONSTASCII_USTRINGPARAM("SkipAllMainSequenceEffects")), + -1, + Any(sal_True), + PropertyState_DIRECT_VALUE)); + aProperties.push_back( + PropertyValue( + OUString( RTL_CONSTASCII_USTRINGPARAM("SkipSlideTransition")), + -1, + Any(sal_True), + PropertyState_DIRECT_VALUE)); } + // Convert vector into uno Sequence. + Sequence< PropertyValue > aPropertySequence (aProperties.size()); + for (int nIndex=0,nCount=aProperties.size();nIndex<nCount; ++nIndex) + aPropertySequence[nIndex] = aProperties[nIndex]; + if( getSlideAPI( nCurrentSlideNumber, xSlide, xAnimNode ) ) - xShow->displaySlide( xSlide, xAnimNode, aProperties ); + xShow->displaySlide( xSlide, xAnimNode, aPropertySequence ); } } @@ -730,6 +761,9 @@ void SAL_CALL SlideshowImpl::disposing() setActiveXToolbarsVisible( sal_True ); + Application::EnableNoYieldMode(false); + Application::RemovePostYieldListener(LINK(this, SlideshowImpl, PostYieldListener)); + mbDisposed = true; } @@ -1235,9 +1269,12 @@ void SAL_CALL SlideshowImpl::removeSlideShowListener( const Reference< XSlideSho // --------------------------------------------------------- -void SlideshowImpl::slideEnded() +void SlideshowImpl::slideEnded(const bool bReverse) { - gotoNextSlide(); + if (bReverse) + gotoPreviousSlide(true); + else + gotoNextSlide(); } // --------------------------------------------------------- @@ -1387,14 +1424,14 @@ void SlideshowImpl::registerShapeEvents( Reference< XShapes >& xShapes ) throw( // --------------------------------------------------------- -void SlideshowImpl::displayCurrentSlide() +void SlideshowImpl::displayCurrentSlide (const bool bSkipAllMainSequenceEffects) { stopSound(); removeShapeEvents(); if( mpSlideController.get() && mxShow.is() ) { - mpSlideController->displayCurrentSlide( mxShow ); + mpSlideController->displayCurrentSlide( mxShow, bSkipAllMainSequenceEffects ); registerShapeEvents(mpSlideController->getCurrentSlideNumber()); update(); @@ -1822,11 +1859,34 @@ IMPL_LINK( SlideshowImpl, updateHdl, Timer*, EMPTYARG ) { mnUpdateEvent = 0; + return updateSlideShow(); +} + + + + +IMPL_LINK( SlideshowImpl, PostYieldListener, void*, EMPTYARG ) +{ + Application::EnableNoYieldMode(false); + Application::RemovePostYieldListener(LINK(this, SlideshowImpl, PostYieldListener)); + if (mbDisposed) + return 0; + return updateSlideShow(); +} + + + + +sal_Int32 SlideshowImpl::updateSlideShow (void) +{ // doing some nMagic const rtl::Reference<SlideshowImpl> this_(this); Reference< XSlideShow > xShow( mxShow ); - if( xShow.is() ) try + if ( ! xShow.is()) + return 0; + + try { // TODO(Q3): Evaluate under various systems and setups, // whether this is really necessary. Under WinXP and Matrox @@ -1841,32 +1901,37 @@ IMPL_LINK( SlideshowImpl, updateHdl, Timer*, EMPTYARG ) if( !xShow->update(fUpdate) ) fUpdate = -1.0; - if( mxShow.is() && ( fUpdate >= 0.0 ) ) + if (mxShow.is() && (fUpdate >= 0.0)) { -/* - if( fUpdate < 0.25 ) + if (::basegfx::fTools::equalZero(fUpdate)) { - mnUpdateEvent = Application::PostUserEvent(LINK(this, SlideshowImpl, updateHdl)); + // Use post yield listener for short update intervalls. + Application::EnableNoYieldMode(true); + Application::AddPostYieldListener(LINK(this, SlideshowImpl, PostYieldListener)); } else -*/ { // Avoid busy loop when the previous call to update() - // returns 0. The minimum value is small enough to allow - // high frame rates. Values larger than 0 are typically - // also larger then the small minimum value and thus are - // used to determine the frame rate. - const float MIN_UPDATE = 0.01f; // 10ms corresponds to 100 frames per second. - if( fUpdate < MIN_UPDATE ) - fUpdate = MIN_UPDATE; - else - { - const float MAX_UPDATE = 4.0f; // do not wait longer than 4 seconds for next refresh, because dilbert said so - if( fUpdate > MAX_UPDATE ) - fUpdate = MAX_UPDATE; - } - maUpdateTimer.SetTimeout( - ::std::max( 1UL, static_cast<ULONG>(fUpdate * 1000.0) ) ); + // returns a small positive number but not 0 (which is + // handled above). Also, make sure that calls to update() + // have a minimum frequency. + // => Allow up to 60 frames per second. Call at least once + // every 4 seconds. + const static sal_Int32 mnMaximumFrameCount (60); + const static double mnMinimumTimeout (1.0 / mnMaximumFrameCount); + const static double mnMaximumTimeout (4.0); + fUpdate = ::basegfx::clamp(fUpdate, mnMinimumTimeout, mnMaximumTimeout); + + // Make sure that the maximum frame count has not been set + // too high (only then conversion to milliseconds and long + // integer may lead to zero value.) + OSL_ASSERT(static_cast<ULONG>(fUpdate * 1000.0) > 0); + + Application::EnableNoYieldMode(false); + Application::RemovePostYieldListener(LINK(this, SlideshowImpl, PostYieldListener)); + + // Use a timer for the asynchronous callback. + maUpdateTimer.SetTimeout(static_cast<ULONG>(fUpdate * 1000.0)); maUpdateTimer.Start(); } } @@ -1875,11 +1940,10 @@ IMPL_LINK( SlideshowImpl, updateHdl, Timer*, EMPTYARG ) { static_cast<void>(e); DBG_ERROR( - (OString("sd::SlideshowImpl::updateHdl(), " - "exception caught: ") + - rtl::OUStringToOString( - comphelper::anyToString( cppu::getCaughtException() ), - RTL_TEXTENCODING_UTF8 )).getStr() ); + (OString("sd::SlideshowImpl::updateSlideShow(), exception caught: ") + + rtl::OUStringToOString( + comphelper::anyToString( cppu::getCaughtException() ), + RTL_TEXTENCODING_UTF8 )).getStr() ); } return 0; } @@ -1968,11 +2032,17 @@ bool SlideshowImpl::keyInput(const KeyEvent& rKEvt) break; case KEY_PAGEUP: + if(rKEvt.GetKeyCode().IsMod2()) + { + gotoPreviousSlide(); + break; + } + // warning, fall through! case KEY_LEFT: case KEY_UP: case KEY_P: case KEY_BACKSPACE: - gotoPreviousSlide(); + gotoPreviousEffect(); break; case KEY_HOME: @@ -2930,6 +3000,30 @@ void SAL_CALL SlideshowImpl::gotoNextEffect( ) throw (RuntimeException) // -------------------------------------------------------------------- +void SAL_CALL SlideshowImpl::gotoPreviousEffect( ) throw (RuntimeException) +{ + ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); + + if( mxShow.is() && mpSlideController.get() && mpShowWindow ) + { + if( mbIsPaused ) + resume(); + + const ShowWindowMode eMode = mpShowWindow->GetShowWindowMode(); + if( (eMode == SHOWWINDOWMODE_PAUSE) || (eMode == SHOWWINDOWMODE_BLANK) ) + { + mpShowWindow->RestartShow(); + } + else + { + mxShow->previousEffect(); + update(); + } + } +} + +// -------------------------------------------------------------------- + void SAL_CALL SlideshowImpl::gotoFirstSlide( ) throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); @@ -3050,6 +3144,11 @@ void SAL_CALL SlideshowImpl::gotoNextSlide( ) throw (RuntimeException) void SAL_CALL SlideshowImpl::gotoPreviousSlide( ) throw (RuntimeException) { + gotoPreviousSlide(false); +} + +void SlideshowImpl::gotoPreviousSlide (const bool bSkipAllMainSequenceEffects) +{ ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); if( mxShow.is() && mpSlideController.get() ) try @@ -3070,8 +3169,22 @@ void SAL_CALL SlideshowImpl::gotoPreviousSlide( ) throw (RuntimeException) } else { - if( mpSlideController->previousSlide() ) - displayCurrentSlide(); + if( mpSlideController->previousSlide()) + displayCurrentSlide(bSkipAllMainSequenceEffects); + else if (bSkipAllMainSequenceEffects) + { + // We could not go to the previous slide (probably because + // the current slide is already the first one). We still + // have to call displayCurrentSlide because the calling + // slideshow can not determine whether there is a previous + // slide or not and has already prepared for a slide change. + // This slide change has to be completed now, even when + // changing to the same slide. + // Note that in this special case we do NOT pass + // bSkipAllMainSequenceEffects because we display the same + // slide as before and do not want to show all its effects. + displayCurrentSlide(false); + } } } catch( Exception& e ) @@ -3522,19 +3635,20 @@ void SAL_CALL SlideShowListenerProxy::slideAnimationsEnded( ) throw (::com::sun // --------------------------------------------------------- -void SlideShowListenerProxy::slideEnded() throw (RuntimeException) +void SlideShowListenerProxy::slideEnded(sal_Bool bReverse) throw (RuntimeException) { { ::osl::MutexGuard aGuard( m_aMutex ); if( maListeners.getLength() >= 0 ) - maListeners.forEach<XSlideShowListener>( boost::mem_fn( &XSlideShowListener::slideEnded ) ); + maListeners.forEach<XSlideShowListener>( + boost::bind( &XSlideShowListener::slideEnded, _1, bReverse) ); } { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); if( mxController.is() ) - mxController->slideEnded(); + mxController->slideEnded(bReverse); } } diff --git a/sd/source/ui/slideshow/slideshowimpl.hxx b/sd/source/ui/slideshow/slideshowimpl.hxx index 5ae10b9ca872..96b24913c45e 100644 --- a/sd/source/ui/slideshow/slideshowimpl.hxx +++ b/sd/source/ui/slideshow/slideshowimpl.hxx @@ -166,7 +166,7 @@ public: virtual void SAL_CALL slideTransitionStarted() throw (css::uno::RuntimeException); virtual void SAL_CALL slideTransitionEnded() throw (css::uno::RuntimeException); virtual void SAL_CALL slideAnimationsEnded() throw (css::uno::RuntimeException); - virtual void SAL_CALL slideEnded() throw (css::uno::RuntimeException); + virtual void SAL_CALL slideEnded(sal_Bool bReverse) throw (css::uno::RuntimeException); virtual void SAL_CALL hyperLinkClicked(const ::rtl::OUString & hyperLink) throw (css::uno::RuntimeException); // css::lang::XEventListener: @@ -208,6 +208,7 @@ public: virtual void SAL_CALL addSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener ) throw (css::uno::RuntimeException); virtual void SAL_CALL removeSlideShowListener( const css::uno::Reference< css::presentation::XSlideShowListener >& Listener ) throw (css::uno::RuntimeException); virtual void SAL_CALL gotoNextEffect( ) throw (css::uno::RuntimeException); + virtual void SAL_CALL gotoPreviousEffect( ) throw (css::uno::RuntimeException); virtual void SAL_CALL gotoFirstSlide( ) throw (css::uno::RuntimeException); virtual void SAL_CALL gotoNextSlide( ) throw (css::uno::RuntimeException); virtual void SAL_CALL gotoPreviousSlide( ) throw (css::uno::RuntimeException); @@ -237,7 +238,7 @@ public: virtual ::sal_Bool SAL_CALL hasElements( ) throw (::com::sun::star::uno::RuntimeException); // will be called from the SlideShowListenerProxy when this event is fired from the XSlideShow - void slideEnded(); + void slideEnded(const bool bReverse); void hyperLinkClicked(const ::rtl::OUString & hyperLink) throw (css::uno::RuntimeException); void click(const css::uno::Reference< css::drawing::XShape > & xShape, const css::awt::MouseEvent & aOriginalEvent); @@ -278,7 +279,7 @@ private: void createSlideList( bool bAll, bool bStartWithActualSlide, const String& rPresSlide ); - void displayCurrentSlide(); + void displayCurrentSlide (const bool bSkipAllMainSequenceEffects = false); void displaySlideNumber( sal_Int32 nSlide ); void displaySlideIndex( sal_Int32 nIndex ); @@ -297,6 +298,7 @@ private: void setActiveXToolbarsVisible( sal_Bool bVisible ); DECL_LINK( updateHdl, Timer* ); + DECL_LINK( PostYieldListener, void* ); DECL_LINK( ReadyForNextInputHdl, Timer* ); DECL_LINK( endPresentationHdl, void* ); DECL_LINK( ContextMenuSelectHdl, Menu * ); @@ -330,6 +332,14 @@ private: css::uno::Reference< css::presentation::XSlideShow > createSlideShow() const; void setAutoSaveState( bool bOn ); + void gotoPreviousSlide (const bool bSkipAllMainSequenceEffects); + + /** Called by PostYieldListener and updateHdl handlers this method is + responsible to call the slideshow update() method and, depending on + its return value, wait for a certain amount of time before another + call to update() is scheduled. + */ + sal_Int32 updateSlideShow (void); css::uno::Reference< css::presentation::XSlideShow > mxShow; comphelper::ImplementationReference< ::sd::SlideShowView, css::presentation::XSlideShowView > mxView; diff --git a/sd/source/ui/slidesorter/controller/SlideSorterController.cxx b/sd/source/ui/slidesorter/controller/SlideSorterController.cxx index f355ada7089f..5303b9dc6426 100644 --- a/sd/source/ui/slidesorter/controller/SlideSorterController.cxx +++ b/sd/source/ui/slidesorter/controller/SlideSorterController.cxx @@ -604,7 +604,7 @@ IMPL_LINK(SlideSorterController, WindowEventHandler, VclWindowEvent*, pEvent) case VCLEVENT_WINDOW_GETFOCUS: if (pActiveWindow != NULL && pWindow == pActiveWindow) - GetFocusManager().ShowFocus(); + GetFocusManager().ShowFocus(false); break; case VCLEVENT_WINDOW_LOSEFOCUS: diff --git a/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx b/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx index 009a24910d5a..1077184b7db7 100644 --- a/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx +++ b/sd/source/ui/slidesorter/controller/SlsFocusManager.cxx @@ -133,17 +133,17 @@ void FocusManager::MoveFocus (FocusMoveDirection eDirection) } if (mbPageIsFocused) - ShowFocusIndicator(GetFocusedPageDescriptor()); + ShowFocusIndicator(GetFocusedPageDescriptor(), true); } } -void FocusManager::ShowFocus (void) +void FocusManager::ShowFocus (const bool bScrollToFocus) { mbPageIsFocused = true; - ShowFocusIndicator(GetFocusedPageDescriptor()); + ShowFocusIndicator(GetFocusedPageDescriptor(), bScrollToFocus); } @@ -254,20 +254,25 @@ void FocusManager::HideFocusIndicator (const model::SharedPageDescriptor& rpDesc -void FocusManager::ShowFocusIndicator (const model::SharedPageDescriptor& rpDescriptor) +void FocusManager::ShowFocusIndicator ( + const model::SharedPageDescriptor& rpDescriptor, + const bool bScrollToFocus) { if (rpDescriptor.get() != NULL) { rpDescriptor->SetFocus (); - // Scroll the focused page object into the visible area and repaint - // it, so that the focus indicator becomes visible. - view::SlideSorterView& rView (mrSlideSorter.GetView()); - mrSlideSorter.GetController().GetSelectionManager()->MakeRectangleVisible ( - rView.GetPageBoundingBox ( - GetFocusedPageDescriptor(), - view::SlideSorterView::CS_MODEL, - view::SlideSorterView::BBT_INFO)); + if (bScrollToFocus) + { + // Scroll the focused page object into the visible area and repaint + // it, so that the focus indicator becomes visible. + view::SlideSorterView& rView (mrSlideSorter.GetView()); + mrSlideSorter.GetController().GetSelectionManager()->MakeRectangleVisible ( + rView.GetPageBoundingBox ( + GetFocusedPageDescriptor(), + view::SlideSorterView::CS_MODEL, + view::SlideSorterView::BBT_INFO)); + } mrSlideSorter.GetView().RequestRepaint (rpDescriptor); NotifyFocusChangeListeners(); diff --git a/sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx b/sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx index 00678c83058d..4384e1a66d9d 100644 --- a/sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx +++ b/sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx @@ -87,8 +87,11 @@ public: void MoveFocus (FocusMoveDirection eDirection); /** Show the focus indicator of the current slide. + @param bScrollToFocus + When <TRUE/> (the default) then the view is scrolled so that the + focus rectangle lies inside its visible area. */ - void ShowFocus (void); + void ShowFocus (const bool bScrollToFocus = true); /** Hide the focus indicator. */ @@ -215,8 +218,13 @@ private: made visible. @param pDescriptor When NULL is given then the call is ignored. + @param bScrollToFocus + When <TRUE/> (the default) then the view is scrolled so that the + focus rectangle lies inside its visible area. */ - void ShowFocusIndicator (const model::SharedPageDescriptor& rpDescriptor); + void ShowFocusIndicator ( + const model::SharedPageDescriptor& rpDescriptor, + const bool bScrollToFocus); /** Call all currently registered listeners that a focus change has happended. The focus may be hidden or shown or moved from one page diff --git a/sd/source/ui/view/ViewShellBase.cxx b/sd/source/ui/view/ViewShellBase.cxx index 2bcddeb6aaef..3e0f6297f8d6 100644 --- a/sd/source/ui/view/ViewShellBase.cxx +++ b/sd/source/ui/view/ViewShellBase.cxx @@ -31,6 +31,13 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sd.hxx" +#include <comphelper/processfactory.hxx> + +#include <com/sun/star/frame/UnknownModuleException.hpp>
+#include <com/sun/star/frame/XModuleManager.hpp>
+#include <com/sun/star/container/XNameAccess.hpp> +#include <com/sun/star/beans/PropertyValue.hpp> + #include "ViewShellBase.hxx" #include <algorithm> #include "EventMultiplexer.hxx" @@ -94,6 +101,11 @@ using namespace sd; using ::sd::framework::FrameworkHelper; using ::rtl::OUString; +using namespace com::sun::star::uno; +using namespace com::sun::star::frame; +using namespace com::sun::star::container; +using namespace com::sun::star::lang; +using namespace com::sun::star::beans; namespace { @@ -1210,6 +1222,47 @@ CustomHandleManager& ViewShellBase::getCustomHandleManager() const return *mpImpl->mpCustomHandleManager.get(); } +::rtl::OUString ViewShellBase::RetrieveLabelFromCommand( const ::rtl::OUString& aCmdURL ) const
+{
+ ::rtl::OUString aLabel;
+ + if ( aCmdURL.getLength() > 0 ) try
+ {
+ Reference< XMultiServiceFactory > xServiceManager( ::comphelper::getProcessServiceFactory(), UNO_QUERY_THROW ); +
+ Reference< XModuleManager > xModuleManager( xServiceManager->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ModuleManager") ) ), UNO_QUERY_THROW ); + Reference< XInterface > xIfac( GetMainViewShell()->GetViewFrame()->GetFrame()->GetFrameInterface(), UNO_QUERY_THROW ); +
+ ::rtl::OUString aModuleIdentifier( xModuleManager->identify( xIfac ) );
+
+ if( aModuleIdentifier.getLength() > 0 )
+ {
+ Reference< XNameAccess > xNameAccess( xServiceManager->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.UICommandDescription" ) ) ), UNO_QUERY );
+ if( xNameAccess.is() )
+ {
+ Reference< ::com::sun::star::container::XNameAccess > m_xUICommandLabels( xNameAccess->getByName( aModuleIdentifier ), UNO_QUERY_THROW );
+ Sequence< PropertyValue > aPropSeq;
+ if( m_xUICommandLabels->getByName( aCmdURL ) >>= aPropSeq )
+ {
+ for( sal_Int32 i = 0; i < aPropSeq.getLength(); i++ )
+ {
+ if( aPropSeq[i].Name.equalsAscii( "Name" ))
+ {
+ aPropSeq[i].Value >>= aLabel;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ catch ( Exception& )
+ {
+ }
+
+ return aLabel;
+}
+ //===== ViewShellBase::Implementation ========================================= diff --git a/sd/source/ui/view/drviews6.cxx b/sd/source/ui/view/drviews6.cxx index 8c10effa061b..d89bb43a0098 100644 --- a/sd/source/ui/view/drviews6.cxx +++ b/sd/source/ui/view/drviews6.cxx @@ -81,12 +81,8 @@ #include "fusumry.hxx" #include "fucushow.hxx" #include "drawview.hxx" -#ifndef SD_FRAME_VIEW #include "FrameView.hxx" -#endif #include "Window.hxx" -#include "fuformatpaintbrush.hxx" -#include "formatclipboard.hxx" #include "DrawDocShell.hxx" #include "TaskPaneViewShell.hxx" #include "framework/FrameworkHelper.hxx" @@ -501,35 +497,6 @@ void DrawViewShell::FuTemp04(SfxRequest& rReq) USHORT nSId = rReq.GetSlot(); switch( nSId ) { - case SID_FORMATPAINTBRUSH: - { - SdFormatClipboard* pFormatClipboard = GetDocSh()->mpFormatClipboard; - if(pFormatClipboard) - { - if( pFormatClipboard->HasContent() ) - { - pFormatClipboard->Erase(); - GetViewFrame()->GetBindings().Invalidate(SID_FORMATPAINTBRUSH); - Cancel(); - rReq.Ignore (); - } - else - { - bool bPersistentCopy = false; - const SfxItemSet *pArgs = rReq.GetArgs(); - if( pArgs && pArgs->Count() >= 1 ) - { - bPersistentCopy = static_cast<bool>(((SfxBoolItem &)pArgs->Get( - SID_FORMATPAINTBRUSH)).GetValue()); - } - - pFormatClipboard->Copy( *mpDrawView, bPersistentCopy ); - SetCurrentFunction( FuFormatPaintBrush::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) ); - GetViewFrame()->GetBindings().Invalidate(SID_FORMATPAINTBRUSH); - } - } - } - break; case SID_FONTWORK: { if ( rReq.GetArgs() ) diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx index cfe52759033a..cc7fd3106fa2 100644 --- a/sd/source/ui/view/drviews7.cxx +++ b/sd/source/ui/view/drviews7.cxx @@ -87,7 +87,6 @@ #include "zoomlist.hxx" #include "slideshow.hxx" #include "drawview.hxx" -#include "formatclipboard.hxx" #include "ViewShellBase.hxx" #include "ViewShellManager.hxx" #include "LayerTabBar.hxx" @@ -95,6 +94,7 @@ #include "Window.hxx" #include "fuediglu.hxx" #include "fubullet.hxx" +#include "fuformatpaintbrush.hxx" using ::rtl::OUString; using namespace ::com::sun::star; @@ -249,19 +249,7 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet ) const ULONG nMarkCount = rMarkList.GetMarkCount(); //format paintbrush - { - SdFormatClipboard* pFormatClipboard = GetDocSh()->mpFormatClipboard; - bool bHasContent = pFormatClipboard && pFormatClipboard->HasContent(); - rSet.Put(SfxBoolItem(SID_FORMATPAINTBRUSH,bHasContent)); - if( ( nMarkCount!=1 && !bHasContent ) || mpDrawView->IsTextEdit() ) - rSet.DisableItem( SID_FORMATPAINTBRUSH ); - if( !bHasContent && nMarkCount==1 ) - { - SdrObject* pObj = rMarkList.GetMark(0)->GetMarkedSdrObj(); - if( !pFormatClipboard->CanCopyThisType(pObj->GetObjInventor(),pObj->GetObjIdentifier()) ) - rSet.DisableItem( SID_FORMATPAINTBRUSH ); - } - } + FuFormatPaintBrush::GetMenuState( *this, rSet ); // Stati der SfxChild-Windows (Animator, Fontwork etc.) SetChildWindowState( rSet ); diff --git a/sd/source/ui/view/drviewse.cxx b/sd/source/ui/view/drviewse.cxx index f722f1b56477..1dbfa7211a76 100644 --- a/sd/source/ui/view/drviewse.cxx +++ b/sd/source/ui/view/drviewse.cxx @@ -106,7 +106,7 @@ #include "anminfo.hxx" #include "optsitem.hxx" #include "Window.hxx" - +#include "fuformatpaintbrush.hxx" using ::rtl::OUString; using namespace ::com::sun::star; @@ -203,13 +203,22 @@ void DrawViewShell::FuPermanent(SfxRequest& rReq) if(HasCurrentFunction()) { - if(GetOldFunction() == GetCurrentFunction()) + if( (nSId == SID_FORMATPAINTBRUSH) && (GetCurrentFunction()->GetSlotID() == SID_TEXTEDIT) ) + { + // save text edit mode for format paintbrush! + SetOldFunction( GetCurrentFunction() ); + } + else { - SetOldFunction(0); + if(GetOldFunction() == GetCurrentFunction()) + { + SetOldFunction(0); + } } if ( nSId != SID_TEXTEDIT && nSId != SID_ATTR_CHAR && nSId != SID_TEXT_FITTOSIZE && nSId != SID_ATTR_CHAR_VERTICAL && nSId != SID_TEXT_FITTOSIZE_VERTICAL && + nSId != SID_FORMATPAINTBRUSH && mpDrawView->IsTextEdit() ) { mpDrawView->SdrEndTextEdit(); @@ -526,8 +535,18 @@ void DrawViewShell::FuPermanent(SfxRequest& rReq) } break; + case SID_FORMATPAINTBRUSH: + { + SetCurrentFunction( FuFormatPaintBrush::Create( this, GetActiveWindow(), mpDrawView, GetDoc(), rReq ) ); + rReq.Done(); + SfxBindings& rBind = GetViewFrame()->GetBindings(); + rBind.Invalidate( nSId ); + rBind.Update( nSId ); + break; + } + default: - break; + break; } if(HasOldFunction()) |