2000-09-18 16:07:07 +00:00
/*************************************************************************
*
2005-09-09 06:13:01 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2000-09-18 16:07:07 +00:00
*
2005-09-09 06:13:01 +00:00
* $ RCSfile : drviewsh . cxx , v $
2000-09-18 16:07:07 +00:00
*
2006-09-16 18:39:49 +00:00
* $ Revision : 1.10 $
2000-09-18 16:07:07 +00:00
*
2006-09-16 18:39:49 +00:00
* last change : $ Author : obo $ $ Date : 2006 - 09 - 16 19 : 39 : 49 $
2000-09-18 16:07:07 +00:00
*
2005-09-09 06:13:01 +00:00
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1 .
2000-09-18 16:07:07 +00:00
*
*
2005-09-09 06:13:01 +00:00
* GNU Lesser General Public License Version 2.1
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* Copyright 2005 by Sun Microsystems , Inc .
* 901 San Antonio Road , Palo Alto , CA 94303 , USA
2000-09-18 16:07:07 +00:00
*
2005-09-09 06:13:01 +00:00
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 , as published by the Free Software Foundation .
2000-09-18 16:07:07 +00:00
*
2005-09-09 06:13:01 +00:00
* This library 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 for more details .
2000-09-18 16:07:07 +00:00
*
2005-09-09 06:13:01 +00:00
* You should have received a copy of the GNU Lesser General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston ,
* MA 02111 - 1307 USA
2000-09-18 16:07:07 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-09-16 18:39:49 +00:00
// MARKER(update_precomp.py): autogen include statement, do not remove
# include "precompiled_sd.hxx"
2004-01-20 11:48:48 +00:00
# include "DrawViewShell.hxx"
2000-09-18 16:07:07 +00:00
# ifndef _AEITEM_HXX //autogen
# include <svtools/aeitem.hxx>
# endif
# ifndef _SFXITEMSET_HXX //autogen
# include <svtools/itemset.hxx>
# endif
# ifndef _SFXREQUEST_HXX //autogen
# include <sfx2/request.hxx>
# endif
# ifndef _SVXIDS_HRC
# include <svx/svxids.hrc>
# endif
# ifndef _SVX_FMSHELL_HXX // XXX nur temp (dg)
# include <svx/fmshell.hxx>
# endif
# ifndef _SFXDISPATCH_HXX //autogen
# include <sfx2/dispatch.hxx>
# endif
# include "app.hrc"
# include "strings.hrc"
# include "sdpage.hxx"
2004-01-20 11:48:48 +00:00
# ifndef SD_FRAME_VIEW
# include "FrameView.hxx"
# endif
2000-09-18 16:07:07 +00:00
# include "sdresid.hxx"
# include "drawdoc.hxx"
2004-01-20 11:48:48 +00:00
# include "DrawDocShell.hxx"
# ifndef SD_WINDOW_HXX
# include "Window.hxx"
# endif
# ifndef SD_GRAPHIC_VIEW_SHELL_HXX
# include "GraphicViewShell.hxx"
# endif
# ifndef SD_DRAW_VIEW_HXX
2000-09-18 16:07:07 +00:00
# include "drawview.hxx"
2004-01-20 11:48:48 +00:00
# endif
namespace sd {
2000-09-18 16:07:07 +00:00
# define TABCONTROL_INITIAL_SIZE 500
/*************************************************************************
| *
| * Sprung zu Bookmark
| *
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-01-20 11:48:48 +00:00
BOOL DrawViewShell : : GotoBookmark ( const String & rBookmark )
2000-09-18 16:07:07 +00:00
{
2004-12-23 10:02:25 +00: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 16:07:07 +00:00
}
/*************************************************************************
| *
| * Bereich sichtbar machen ( Bildausschnitt scrollen )
| *
\ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-07-13 13:57:57 +00:00
void DrawViewShell : : MakeVisible ( const Rectangle & rRect , : : Window & rWin )
2000-09-18 16:07:07 +00:00
{
2004-07-13 13:57:57 +00: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 11:44:07 +00:00
sal_Bool bZoomAllowed ( sal_False ) ;
2000-09-18 16:07:07 +00:00
Size aLogicSize ( rRect . GetSize ( ) ) ;
// Sichtbarer Bereich
Size aVisSizePixel ( rWin . GetOutputSizePixel ( ) ) ;
Rectangle aVisArea ( rWin . PixelToLogic ( Rectangle ( Point ( 0 , 0 ) , aVisSizePixel ) ) ) ;
Size aVisAreaSize ( aVisArea . GetSize ( ) ) ;
2004-11-26 19:33:09 +00:00
if ( ! aVisArea . IsInside ( rRect ) & & ! mpSlideShow )
2000-09-18 16:07:07 +00:00
{
// Objekt liegt nicht komplett im sichtbaren Bereich
2002-04-12 11:44:07 +00:00
sal_Int32 nFreeSpaceX ( aVisAreaSize . Width ( ) - aLogicSize . Width ( ) ) ;
sal_Int32 nFreeSpaceY ( aVisAreaSize . Height ( ) - aLogicSize . Height ( ) ) ;
2000-09-18 16:07:07 +00:00
2002-04-12 11:44:07 +00:00
if ( bZoomAllowed & & ( nFreeSpaceX < 0 | | nFreeSpaceY < 0 ) )
2000-09-18 16:07:07 +00:00
{
// Objekt passt nicht in sichtbaren Bereich -> auf Objektgroesse zoomen
SetZoomRect ( rRect ) ;
}
else
{
2002-04-12 11:44:07 +00: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 16:07:07 +00:00
}
}
}
2004-01-20 11:48:48 +00:00
}