2000-09-18 11:07:07 -05:00
/*************************************************************************
*
2008-04-10 17:14:32 -05:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
2000-09-18 11:07:07 -05:00
*
2010-02-12 08:01:35 -06:00
* Copyright 2000 , 2010 Oracle and / or its affiliates .
2000-09-18 11:07:07 -05:00
*
2008-04-10 17:14:32 -05:00
* OpenOffice . org - a multi - platform office productivity suite
2000-09-18 11:07:07 -05:00
*
2008-04-10 17:14:32 -05:00
* This file is part of OpenOffice . org .
2000-09-18 11:07:07 -05:00
*
2008-04-10 17:14:32 -05:00
* 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 .
2000-09-18 11:07:07 -05:00
*
2008-04-10 17:14:32 -05:00
* 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 ) .
2000-09-18 11:07:07 -05:00
*
2008-04-10 17:14:32 -05:00
* 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 .
2000-09-18 11:07:07 -05:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-09-16 13:39:49 -05:00
// MARKER(update_precomp.py): autogen include statement, do not remove
# include "precompiled_sd.hxx"
2004-01-20 05:48:48 -06:00
# include "DrawViewShell.hxx"
2009-10-15 17:05:16 -05:00
# include <svl/aeitem.hxx>
# include <svl/itemset.hxx>
2000-09-18 11:07:07 -05:00
# include <sfx2/request.hxx>
# ifndef _SVXIDS_HRC
# include <svx/svxids.hrc>
# endif
# include <svx/fmshell.hxx>
# include <sfx2/dispatch.hxx>
# include "app.hrc"
# include "strings.hrc"
# include "sdpage.hxx"
2004-01-20 05:48:48 -06:00
# ifndef SD_FRAME_VIEW
# include "FrameView.hxx"
# endif
2000-09-18 11:07:07 -05:00
# include "sdresid.hxx"
# include "drawdoc.hxx"
2004-01-20 05:48:48 -06:00
# include "DrawDocShell.hxx"
# include "Window.hxx"
# include "GraphicViewShell.hxx"
2000-09-18 11:07:07 -05:00
# include "drawview.hxx"
2004-01-20 05:48:48 -06:00
2008-04-03 09:18:57 -05:00
# include "slideshow.hxx"
2004-01-20 05:48:48 -06:00
namespace sd {
2000-09-18 11:07:07 -05:00
# define TABCONTROL_INITIAL_SIZE 500
/*************************************************************************
| *
| * Sprung zu Bookmark
| *
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-01-20 05:48:48 -06:00
BOOL DrawViewShell : : GotoBookmark ( const String & rBookmark )
2000-09-18 11:07:07 -05:00
{
2004-12-23 04:02:25 -06:00
BOOL bRet = FALSE ;
: : sd : : DrawDocShell * pDocSh = GetDocSh ( ) ;
if ( pDocSh )
{
if ( ! pDocSh - > GetViewShell ( ) ) //#i26016# this case occurs if the jump-target-document was opened already with file open dialog before triggering the jump via hyperlink
pDocSh - > Connect ( this ) ;
bRet = ( pDocSh - > GotoBookmark ( rBookmark ) ) ;
}
return bRet ;
2000-09-18 11:07:07 -05:00
}
/*************************************************************************
| *
| * Bereich sichtbar machen ( Bildausschnitt scrollen )
| *
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-07-13 08:57:57 -05:00
void DrawViewShell : : MakeVisible ( const Rectangle & rRect , : : Window & rWin )
2000-09-18 11:07:07 -05:00
{
2004-07-13 08:57:57 -05:00
// #98568# In older versions, if in X or Y the size of the object was
// smaller than the visible area, the user-defined zoom was
// changed. This was decided to be a bug for 6.x, thus I developed a
// version which instead handles X/Y bigger/smaller and visibility
// questions seperately. The new behaviour is triggered with the
// bZoomAllowed parameter which for old behaviour should be set to
// sal_True. I looked at all uses of MakeVisible() in the application
// and found no valid reason for really changing the zoom factor, thus I
// decided to NOT expand (incompatible) this virtual method to get one
// more parameter. If this is wanted in later versions, feel free to add
// that bool to the parameter list.
2002-04-12 06:44:07 -05:00
sal_Bool bZoomAllowed ( sal_False ) ;
2000-09-18 11:07:07 -05:00
Size aLogicSize ( rRect . GetSize ( ) ) ;
// Sichtbarer Bereich
Size aVisSizePixel ( rWin . GetOutputSizePixel ( ) ) ;
Rectangle aVisArea ( rWin . PixelToLogic ( Rectangle ( Point ( 0 , 0 ) , aVisSizePixel ) ) ) ;
Size aVisAreaSize ( aVisArea . GetSize ( ) ) ;
2008-04-03 09:18:57 -05:00
if ( ! aVisArea . IsInside ( rRect ) & & ! SlideShow : : IsRunning ( GetViewShellBase ( ) ) )
2000-09-18 11:07:07 -05:00
{
// Objekt liegt nicht komplett im sichtbaren Bereich
2002-04-12 06:44:07 -05:00
sal_Int32 nFreeSpaceX ( aVisAreaSize . Width ( ) - aLogicSize . Width ( ) ) ;
sal_Int32 nFreeSpaceY ( aVisAreaSize . Height ( ) - aLogicSize . Height ( ) ) ;
2000-09-18 11:07:07 -05:00
2002-04-12 06:44:07 -05:00
if ( bZoomAllowed & & ( nFreeSpaceX < 0 | | nFreeSpaceY < 0 ) )
2000-09-18 11:07:07 -05:00
{
// Objekt passt nicht in sichtbaren Bereich -> auf Objektgroesse zoomen
SetZoomRect ( rRect ) ;
}
else
{
2002-04-12 06:44:07 -05:00
// #98568# allow a mode for move-only visibility without zooming.
const sal_Int32 nPercentBorder ( 30 ) ;
const Rectangle aInnerRectangle (
aVisArea . Left ( ) + ( ( aVisAreaSize . Width ( ) * nPercentBorder ) / 200 ) ,
aVisArea . Top ( ) + ( ( aVisAreaSize . Height ( ) * nPercentBorder ) / 200 ) ,
aVisArea . Right ( ) - ( ( aVisAreaSize . Width ( ) * nPercentBorder ) / 200 ) ,
aVisArea . Bottom ( ) - ( ( aVisAreaSize . Height ( ) * nPercentBorder ) / 200 )
) ;
Point aNewPos ( aVisArea . TopLeft ( ) ) ;
if ( nFreeSpaceX < 0 )
{
if ( aInnerRectangle . Left ( ) > rRect . Right ( ) )
{
// object moves out to the left
aNewPos . X ( ) - = aVisAreaSize . Width ( ) / 2 ;
}
if ( aInnerRectangle . Right ( ) < rRect . Left ( ) )
{
// object moves out to the right
aNewPos . X ( ) + = aVisAreaSize . Width ( ) / 2 ;
}
}
else
{
if ( nFreeSpaceX > rRect . GetWidth ( ) )
nFreeSpaceX = rRect . GetWidth ( ) ;
while ( rRect . Right ( ) > aNewPos . X ( ) + aVisAreaSize . Width ( ) )
aNewPos . X ( ) + = nFreeSpaceX ;
while ( rRect . Left ( ) < aNewPos . X ( ) )
aNewPos . X ( ) - = nFreeSpaceX ;
}
if ( nFreeSpaceY < 0 )
{
if ( aInnerRectangle . Top ( ) > rRect . Bottom ( ) )
{
// object moves out to the top
aNewPos . Y ( ) - = aVisAreaSize . Height ( ) / 2 ;
}
if ( aInnerRectangle . Bottom ( ) < rRect . Top ( ) )
{
// object moves out to the right
aNewPos . Y ( ) + = aVisAreaSize . Height ( ) / 2 ;
}
}
else
{
if ( nFreeSpaceY > rRect . GetHeight ( ) )
nFreeSpaceY = rRect . GetHeight ( ) ;
while ( rRect . Bottom ( ) > aNewPos . Y ( ) + aVisAreaSize . Height ( ) )
aNewPos . Y ( ) + = nFreeSpaceY ;
while ( rRect . Top ( ) < aNewPos . Y ( ) )
aNewPos . Y ( ) - = nFreeSpaceY ;
}
// did position change? Does it need to be set?
if ( aNewPos ! = aVisArea . TopLeft ( ) )
{
aVisArea . SetPos ( aNewPos ) ;
SetZoomRect ( aVisArea ) ;
}
2000-09-18 11:07:07 -05:00
}
}
}
2004-01-20 05:48:48 -06:00
}