summaryrefslogtreecommitdiff
path: root/sd
diff options
context:
space:
mode:
Diffstat (limited to 'sd')
-rw-r--r--sd/sdi/_drvwsh.sdi2
-rw-r--r--sd/source/core/sdpage.cxx36
-rw-r--r--sd/source/ui/accessibility/AccessibleDocumentViewBase.cxx8
-rw-r--r--sd/source/ui/accessibility/AccessibleDrawDocumentView.cxx11
-rw-r--r--sd/source/ui/dlg/docprev.cxx6
-rw-r--r--sd/source/ui/docshell/docshell.cxx6
-rw-r--r--sd/source/ui/docshell/formatclipboard.cxx237
-rw-r--r--sd/source/ui/docshell/makefile.mk1
-rw-r--r--sd/source/ui/func/fuformatpaintbrush.cxx248
-rw-r--r--sd/source/ui/inc/AccessibleDocumentViewBase.hxx4
-rw-r--r--sd/source/ui/inc/AccessibleDrawDocumentView.hxx4
-rw-r--r--sd/source/ui/inc/DrawDocShell.hxx4
-rw-r--r--sd/source/ui/inc/ViewShellBase.hxx4
-rw-r--r--sd/source/ui/inc/formatclipboard.hxx64
-rw-r--r--sd/source/ui/inc/fuformatpaintbrush.hxx30
-rw-r--r--sd/source/ui/slideshow/slideshowimpl.cxx200
-rw-r--r--sd/source/ui/slideshow/slideshowimpl.hxx16
-rw-r--r--sd/source/ui/slidesorter/controller/SlideSorterController.cxx2
-rw-r--r--sd/source/ui/slidesorter/controller/SlsFocusManager.cxx29
-rw-r--r--sd/source/ui/slidesorter/inc/controller/SlsFocusManager.hxx12
-rw-r--r--sd/source/ui/view/ViewShellBase.cxx53
-rw-r--r--sd/source/ui/view/drviews6.cxx33
-rw-r--r--sd/source/ui/view/drviews7.cxx16
-rw-r--r--sd/source/ui/view/drviewse.cxx27
24 files changed, 510 insertions, 543 deletions
diff --git a/sd/sdi/_drvwsh.sdi b/sd/sdi/_drvwsh.sdi
index b641ab64a1a0..5021249c4ff9 100644
--- a/sd/sdi/_drvwsh.sdi
+++ b/sd/sdi/_drvwsh.sdi
@@ -2226,7 +2226,7 @@ interface DrawView
SID_FORMATPAINTBRUSH //
[
- ExecMethod = FuTemporary ;
+ ExecMethod = FuPermanent ;
StateMethod = GetMenuState ;
]
diff --git a/sd/source/core/sdpage.cxx b/sd/source/core/sdpage.cxx
index 7f80b5bd763a..14e60b3c5807 100644
--- a/sd/source/core/sdpage.cxx
+++ b/sd/source/core/sdpage.cxx
@@ -2049,40 +2049,6 @@ void SdPage::ScaleObjects(const Size& rNewPageSize, const Rectangle& rNewBorderR
pObj->NbcMove(aVec);
}
- Rectangle aBoundRect = pObj->GetCurrentBoundRect();
-
- if (!aBorderRect.IsInside(aBoundRect))
- {
- /**********************************************************
- * Objekt liegt nicht vollstaendig innerhalb der Raender
- * -> Position korrigieren
- **********************************************************/
- Point aOldPos(aBoundRect.TopLeft());
- aNewPos = aOldPos;
-
- // Position links oben ggf. korrigieren
- aNewPos.X() = Max(aNewPos.X(), aBorderRect.Left());
- aNewPos.Y() = Max(aNewPos.Y(), aBorderRect.Top());
- aVec = Size(aNewPos.X() - aOldPos.X(), aNewPos.Y() - aOldPos.Y());
-
- if (aVec.Height() != 0 || aVec.Width() != 0)
- {
- pObj->NbcMove(aVec);
- }
-
- // Position rechts unten ggf. korrigieren
- aOldPos = aBoundRect.BottomRight();
- aNewPos = aOldPos;
- aNewPos.X() = Min(aNewPos.X(), aBorderRect.Right());
- aNewPos.Y() = Min(aNewPos.Y(), aBorderRect.Bottom());
- aVec = Size(aNewPos.X() - aOldPos.X(), aNewPos.Y() - aOldPos.Y());
-
- if (aVec.Height() != 0 || aVec.Width() != 0)
- {
- pObj->NbcMove(aVec);
- }
- }
-
pObj->SetChanged();
pObj->BroadcastObjectChange();
}
@@ -2883,7 +2849,7 @@ bool SdPage::checkVisibility(
}
}
} // check for placeholders on master
- else if( pCheckPage->IsMasterPage() && ( pVisualizedPage != pCheckPage ) )
+ else if( (eKind != PRESOBJ_NONE) && pCheckPage->IsMasterPage() && ( pVisualizedPage != pCheckPage ) )
{
// presentation objects on master slide are always invisible if slide is shown.
return false;
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 f9381d08a219..d6cc2a000b1d 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 8035e78150c7..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 <svtools/itemiter.hxx>
-
-// header for class SfxStyleSheet
-#include <svtools/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 67f77e2a406b..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 <svtools/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 44b6548b50ce..7c4b9da4ea95 100644
--- a/sd/source/ui/inc/fuformatpaintbrush.hxx
+++ b/sd/source/ui/inc/fuformatpaintbrush.hxx
@@ -31,15 +31,19 @@
#ifndef SD_FU_FORMATPAINTBRUSH_HXX
#define SD_FU_FORMATPAINTBRUSH_HXX
-#include "fupoor.hxx"
+#include "futext.hxx"
// header for class SfxItemSet
#include <svtools/itemset.hxx>
+#include <boost/scoped_ptr.hpp>
+
+class SfxItemSet;
namespace sd {
-class FuFormatPaintBrush
- : public FuPoor
+class DrawViewShell;
+
+class FuFormatPaintBrush : public FuText
{
public:
TYPEINFO();
@@ -54,14 +58,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 c0b4857f3f6b..c0e550f69378 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 b9d5506ff2f3..7240e6efa087 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 25fca9e0bae7..bbf1b69ad68a 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 983033be7b8c..5eda0d648f8b 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 0b3ecf1af6e7..1ae3e4e1c40e 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())