520 lines
16 KiB
C++
520 lines
16 KiB
C++
/*************************************************************************
|
|
*
|
|
* $RCSfile: docshel2.cxx,v $
|
|
*
|
|
* $Revision: 1.14 $
|
|
*
|
|
* last change: $Author: cl $ $Date: 2002-05-07 10:17:08 $
|
|
*
|
|
* The Contents of this file are made available subject to the terms of
|
|
* either of the following licenses
|
|
*
|
|
* - GNU Lesser General Public License Version 2.1
|
|
* - Sun Industry Standards Source License Version 1.1
|
|
*
|
|
* Sun Microsystems Inc., October, 2000
|
|
*
|
|
* GNU Lesser General Public License Version 2.1
|
|
* =============================================
|
|
* Copyright 2000 by Sun Microsystems, Inc.
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
*
|
|
* 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.
|
|
*
|
|
* 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.
|
|
*
|
|
* 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
|
|
*
|
|
*
|
|
* Sun Industry Standards Source License Version 1.1
|
|
* =================================================
|
|
* The contents of this file are subject to the Sun Industry Standards
|
|
* Source License Version 1.1 (the "License"); You may not use this file
|
|
* except in compliance with the License. You may obtain a copy of the
|
|
* License at http://www.openoffice.org/license.html.
|
|
*
|
|
* Software provided under this License is provided on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
|
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
|
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
|
* See the License for the specific provisions governing your rights and
|
|
* obligations concerning the Software.
|
|
*
|
|
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
|
*
|
|
* Copyright: 2000 by Sun Microsystems, Inc.
|
|
*
|
|
* All Rights Reserved.
|
|
*
|
|
* Contributor(s): _______________________________________
|
|
*
|
|
*
|
|
************************************************************************/
|
|
|
|
#ifndef _SV_MSGBOX_HXX //autogen
|
|
#include <vcl/msgbox.hxx>
|
|
#endif
|
|
#ifndef _SVDPAGV_HXX //autogen
|
|
#include <svx/svdpagv.hxx>
|
|
#endif
|
|
#ifndef _SVX_SVXIFACT_HXX //autogen
|
|
#include <svx/svxifact.hxx>
|
|
#endif
|
|
#ifndef _SVX_DLGNAME_HXX //autogen
|
|
#include <svx/dlgname.hxx>
|
|
#endif
|
|
|
|
#pragma hdrstop
|
|
|
|
#include "docshell.hxx"
|
|
#include "viewshel.hxx"
|
|
#include "drawview.hxx"
|
|
#include "frmview.hxx"
|
|
#include "drawdoc.hxx"
|
|
#include "sdpage.hxx"
|
|
#include "sdview.hxx"
|
|
#include "clview.hxx"
|
|
#include "sdwindow.hxx"
|
|
#include "strings.hrc"
|
|
#include "res_bmp.hrc"
|
|
#include "sdresid.hxx"
|
|
#include "strmname.h"
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* Zeichnen der DocShell (mittels der Hilfsklasse SdDrawViewShell)
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void SdDrawDocShell::Draw(OutputDevice* pOut, const JobSetup& rSetup,
|
|
USHORT nAspect)
|
|
{
|
|
if (nAspect == ASPECT_THUMBNAIL)
|
|
{
|
|
/**********************************************************************
|
|
* THUMBNAIL: Hier koennte ev. einmal der Draft-Mode gesetzt werden
|
|
**********************************************************************/
|
|
}
|
|
|
|
SdClientView* pView = new SdClientView(this, pOut, NULL);
|
|
|
|
pView->SetHlplVisible(FALSE);
|
|
pView->SetGridVisible(FALSE);
|
|
pView->SetBordVisible(FALSE);
|
|
pView->SetPageVisible(FALSE);
|
|
pView->SetGlueVisible(FALSE);
|
|
|
|
SdPage* pPage = NULL;
|
|
USHORT nSelectedPage = 0;
|
|
USHORT nPageCnt = (USHORT) pDoc->GetSdPageCount(PK_STANDARD);
|
|
|
|
for (USHORT i = 0; i < nPageCnt; i++)
|
|
{
|
|
pPage = pDoc->GetSdPage(i, PK_STANDARD);
|
|
|
|
if ( pPage->IsSelected() )
|
|
{
|
|
nSelectedPage = i;
|
|
}
|
|
}
|
|
|
|
Rectangle aVisArea = GetVisArea(nAspect);
|
|
pOut->IntersectClipRegion(aVisArea);
|
|
|
|
pPage = pDoc->GetSdPage(nSelectedPage, PK_STANDARD);
|
|
pView->ShowPage(pPage, Point());
|
|
|
|
if (pOut->GetOutDevType() != OUTDEV_WINDOW)
|
|
{
|
|
MapMode aOldMapMode = pOut->GetMapMode();
|
|
|
|
if (pOut->GetOutDevType() == OUTDEV_PRINTER)
|
|
{
|
|
MapMode aMapMode = aOldMapMode;
|
|
Point aOrigin = aMapMode.GetOrigin();
|
|
aOrigin.X() += 1;
|
|
aOrigin.Y() += 1;
|
|
aMapMode.SetOrigin(aOrigin);
|
|
pOut->SetMapMode(aMapMode);
|
|
}
|
|
|
|
Region aRegion(aVisArea);
|
|
pView->InitRedraw(pOut, aRegion);
|
|
|
|
if (pOut->GetOutDevType() == OUTDEV_PRINTER)
|
|
{
|
|
pOut->SetMapMode(aOldMapMode);
|
|
}
|
|
}
|
|
|
|
delete pView;
|
|
|
|
// Fuer Testzwecke: Bitte nicht entfernen!
|
|
//
|
|
// GDIMetaFile* pMtf = pOut->GetConnectMetaFile();
|
|
//
|
|
// if( pMtf )
|
|
// {
|
|
// String aURLStr;
|
|
//
|
|
// if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( String( RTL_CONSTASCII_USTRINGPARAM( "d:\\gdi.mtf" ) ), aURLStr ) )
|
|
// {
|
|
// SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aURLStr, STREAM_WRITE | STREAM_TRUNC );
|
|
//
|
|
// if( pOStm )
|
|
// {
|
|
// *pOStm << *pMtf;
|
|
// delete pOStm;
|
|
// }
|
|
// }
|
|
// }
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void SdDrawDocShell::SetVisArea(const Rectangle& rRect)
|
|
{
|
|
// SfxInPlaceObject::SetVisArea(rRect);
|
|
|
|
if (GetCreateMode() == SFX_CREATE_MODE_EMBEDDED)
|
|
{
|
|
// Setzt das Modified-Flag
|
|
SfxInPlaceObject::SetVisArea(rRect);
|
|
}
|
|
else
|
|
{
|
|
SvEmbeddedObject::SetVisArea(rRect);
|
|
}
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
Rectangle SdDrawDocShell::GetVisArea(USHORT nAspect) const
|
|
{
|
|
Rectangle aVisArea;
|
|
|
|
if (nAspect == ASPECT_THUMBNAIL)
|
|
{
|
|
// Groesse der ersten Seite herausgeben
|
|
MapMode aSrcMapMode(MAP_PIXEL);
|
|
MapMode aDstMapMode(MAP_100TH_MM);
|
|
Size aSize = pDoc->GetSdPage(0, PK_STANDARD)->GetSize();
|
|
aSrcMapMode.SetMapUnit(MAP_100TH_MM);
|
|
|
|
aSize = Application::GetDefaultDevice()->LogicToLogic(aSize, &aSrcMapMode, &aDstMapMode);
|
|
aVisArea.SetSize(aSize);
|
|
}
|
|
else
|
|
{
|
|
aVisArea = SfxInPlaceObject::GetVisArea(nAspect);
|
|
}
|
|
|
|
if (aVisArea.IsEmpty() && pViewShell)
|
|
{
|
|
Window* pWin = pViewShell->GetActiveWindow();
|
|
|
|
if (pWin)
|
|
{
|
|
aVisArea = pWin->PixelToLogic(Rectangle(Point(0,0), pWin->GetOutputSizePixel()));
|
|
}
|
|
}
|
|
|
|
return (aVisArea);
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SdViewShell anmelden
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void SdDrawDocShell::Connect(SdViewShell* pViewSh)
|
|
{
|
|
pViewShell = pViewSh;
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* SdViewShell abmelden
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void SdDrawDocShell::Disconnect(SdViewShell* pViewSh)
|
|
{
|
|
if (pViewShell == pViewSh)
|
|
{
|
|
pViewShell = NULL;
|
|
}
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
FrameView* SdDrawDocShell::GetFrameView()
|
|
{
|
|
FrameView* pFrameView = NULL;
|
|
|
|
if (pViewShell)
|
|
{
|
|
pFrameView = pViewShell->GetFrameView();
|
|
}
|
|
|
|
return(pFrameView);
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* Groesse der ersten Seite zurueckgeben
|
|
|*
|
|
\************************************************************************/
|
|
|
|
Size SdDrawDocShell::GetFirstPageSize()
|
|
{
|
|
return SfxObjectShell::GetFirstPageSize();
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void SdDrawDocShell::UIActivate( BOOL bActive )
|
|
{
|
|
bUIActive = bActive;
|
|
SfxInPlaceObject::UIActivate( bActive );
|
|
}
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* Bitmap einer beliebigen Seite erzeugen
|
|
|*
|
|
\************************************************************************/
|
|
|
|
Bitmap SdDrawDocShell::GetPagePreviewBitmap(SdPage* pPage, USHORT nMaxEdgePixel)
|
|
{
|
|
MapMode aMapMode( MAP_100TH_MM );
|
|
const Size aSize( pPage->GetSize() );
|
|
const Point aNullPt;
|
|
VirtualDevice aVDev( *Application::GetDefaultDevice() );
|
|
|
|
aVDev.SetMapMode( aMapMode );
|
|
|
|
const Size aPixSize( aVDev.LogicToPixel( aSize ) );
|
|
const ULONG nMaxEdgePix = Max( aPixSize.Width(), aPixSize.Height() );
|
|
Fraction aFrac( nMaxEdgePixel, nMaxEdgePix );
|
|
|
|
aMapMode.SetScaleX( aFrac );
|
|
aMapMode.SetScaleY( aFrac );
|
|
aVDev.SetMapMode( aMapMode );
|
|
aVDev.SetOutputSize( aSize );
|
|
|
|
// damit die dunklen Linien am rechten und unteren Seitenrans mitkommen
|
|
aFrac = Fraction( nMaxEdgePixel - 1, nMaxEdgePix );
|
|
aMapMode.SetScaleX( aFrac );
|
|
aMapMode.SetScaleY( aFrac );
|
|
aVDev.SetMapMode( aMapMode );
|
|
|
|
SdClientView* pView = new SdClientView( this, &aVDev, NULL );
|
|
FrameView* pFrameView = GetFrameView();
|
|
|
|
pView->ShowPage( pPage, aNullPt );
|
|
|
|
if ( GetFrameView() )
|
|
{
|
|
// Initialisierungen der Zeichen-(Bildschirm-)Attribute
|
|
pView->SetGridCoarse( pFrameView->GetGridCoarse() );
|
|
pView->SetGridFine( pFrameView->GetGridFine() );
|
|
pView->SetSnapGrid( pFrameView->GetSnapGrid() );
|
|
pView->SetSnapGridWidth(pFrameView->GetSnapGridWidthX(), pFrameView->GetSnapGridWidthY());
|
|
pView->SetGridVisible( pFrameView->IsGridVisible() );
|
|
pView->SetGridFront( pFrameView->IsGridFront() );
|
|
pView->SetSnapAngle( pFrameView->GetSnapAngle() );
|
|
pView->SetGridSnap( pFrameView->IsGridSnap() );
|
|
pView->SetBordSnap( pFrameView->IsBordSnap() );
|
|
pView->SetHlplSnap( pFrameView->IsHlplSnap() );
|
|
pView->SetOFrmSnap( pFrameView->IsOFrmSnap() );
|
|
pView->SetOPntSnap( pFrameView->IsOPntSnap() );
|
|
pView->SetOConSnap( pFrameView->IsOConSnap() );
|
|
pView->SetDragStripes( pFrameView->IsDragStripes() );
|
|
pView->SetFrameDragSingles( pFrameView->IsFrameDragSingles() );
|
|
pView->SetSnapMagneticPixel( pFrameView->GetSnapMagneticPixel() );
|
|
pView->SetMarkedHitMovesAlways( pFrameView->IsMarkedHitMovesAlways() );
|
|
pView->SetMoveOnlyDragging( pFrameView->IsMoveOnlyDragging() );
|
|
pView->SetSlantButShear( pFrameView->IsSlantButShear() );
|
|
pView->SetNoDragXorPolys( pFrameView->IsNoDragXorPolys() );
|
|
pView->SetCrookNoContortion( pFrameView->IsCrookNoContortion() );
|
|
pView->SetAngleSnapEnabled( pFrameView->IsAngleSnapEnabled() );
|
|
pView->SetBigOrtho( pFrameView->IsBigOrtho() );
|
|
pView->SetOrtho( pFrameView->IsOrtho() );
|
|
|
|
SdrPageView* pPageView = pView->GetPageViewPvNum(0);
|
|
|
|
if (pPageView)
|
|
{
|
|
if ( pPageView->GetVisibleLayers() != pFrameView->GetVisibleLayers() )
|
|
pPageView->SetVisibleLayers( pFrameView->GetVisibleLayers() );
|
|
|
|
if ( pPageView->GetPrintableLayers() != pFrameView->GetPrintableLayers() )
|
|
pPageView->SetPrintableLayers( pFrameView->GetPrintableLayers() );
|
|
|
|
if ( pPageView->GetLockedLayers() != pFrameView->GetLockedLayers() )
|
|
pPageView->SetLockedLayers( pFrameView->GetLockedLayers() );
|
|
|
|
// if ( pPageView->GetHelpLines() != pFrameView->GetHelpLines() )
|
|
pPageView->SetHelpLines( pFrameView->GetStandardHelpLines() );
|
|
}
|
|
|
|
if ( pView->GetActiveLayer() != pFrameView->GetActiveLayer() )
|
|
pView->SetActiveLayer( pFrameView->GetActiveLayer() );
|
|
}
|
|
|
|
pView->InitRedraw( &aVDev, Rectangle( aNullPt, aSize ) );
|
|
|
|
while ( !pView->IsRedrawReady() ) {}
|
|
delete pView;
|
|
|
|
aVDev.SetMapMode( MapMode() );
|
|
|
|
Bitmap aPreview( aVDev.GetBitmap( aNullPt, aVDev.GetOutputSizePixel() ) );
|
|
|
|
DBG_ASSERT(!!aPreview, "Vorschau-Bitmap konnte nicht erzeugt werden");
|
|
|
|
return aPreview;
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|* Pruefen, ob die Seite vorhanden ist und dann den Anwender zwingen einen
|
|
|* noch nicht vorhandenen Namen einzugeben. Wird FALSE zurueckgegeben,
|
|
|* wurde die Aktion vom Anwender abgebrochen.
|
|
|*
|
|
\************************************************************************/
|
|
|
|
BOOL SdDrawDocShell::CheckPageName( Window* pWin, String& rName )
|
|
{
|
|
BOOL bUnique = FALSE;
|
|
|
|
String aStrPage( SdResId( STR_SD_PAGE ) );
|
|
|
|
// prevent also _future_ slide names of the form "'STR_SD_PAGE' + ' ' + '[0-9]+|[a-z]|[A-Z]|[CDILMVX]+|[cdilmvx]+'"
|
|
// (arabic, lower- and upper case single letter, lower- and upper case roman numbers)
|
|
if( rName.Search( aStrPage ) != STRING_NOTFOUND &&
|
|
rName.GetToken( 1, sal_Unicode(' ') ).Len() != 0 )
|
|
{
|
|
if( rName.GetToken( 1, sal_Unicode(' ') ).GetChar(0) >= '0' &&
|
|
rName.GetToken( 1, sal_Unicode(' ') ).GetChar(0) <= '9' )
|
|
{
|
|
// check for arabic numbering
|
|
|
|
// gobble up all following numbers
|
|
String sRemainder = rName.GetToken( 1, sal_Unicode(' ') );
|
|
while( sRemainder.Len() &&
|
|
sRemainder.GetChar(0) >= '0' &&
|
|
sRemainder.GetChar(0) <= '9' )
|
|
{
|
|
// trim by one
|
|
sRemainder.Erase(0, 1);
|
|
}
|
|
|
|
// EOL? Reserved name!
|
|
if( !sRemainder.Len() )
|
|
{
|
|
rName = String();
|
|
return( TRUE );
|
|
}
|
|
}
|
|
else if( rName.GetToken( 1, sal_Unicode(' ') ).GetChar(0) >= 'a' &&
|
|
rName.GetToken( 1, sal_Unicode(' ') ).GetChar(0) <= 'z' &&
|
|
rName.GetToken( 1, sal_Unicode(' ') ).Len() == 1 )
|
|
{
|
|
// lower case, single character: reserved
|
|
rName = String();
|
|
return( TRUE );
|
|
}
|
|
else if( rName.GetToken( 1, sal_Unicode(' ') ).GetChar(0) >= 'A' &&
|
|
rName.GetToken( 1, sal_Unicode(' ') ).GetChar(0) <= 'Z' &&
|
|
rName.GetToken( 1, sal_Unicode(' ') ).Len() == 1 )
|
|
{
|
|
// upper case, single character: reserved
|
|
rName = String();
|
|
return( TRUE );
|
|
}
|
|
else
|
|
{
|
|
// check for upper/lower case roman numbering
|
|
String sReserved( String::CreateFromAscii( "cdilmvx" ) );
|
|
|
|
// gobble up all following characters contained in one reserved class
|
|
String sRemainder = rName.GetToken( 1, sal_Unicode(' ') );
|
|
if( sReserved.Search( sRemainder.GetChar(0) ) == STRING_NOTFOUND )
|
|
sReserved.ToUpperAscii();
|
|
|
|
while( sReserved.Search( sRemainder.GetChar(0) ) != STRING_NOTFOUND )
|
|
{
|
|
// trim by one
|
|
sRemainder.Erase(0, 1);
|
|
}
|
|
|
|
// EOL? Reserved name!
|
|
if( !sRemainder.Len() )
|
|
{
|
|
rName = String();
|
|
return( TRUE );
|
|
}
|
|
}
|
|
}
|
|
|
|
// Ist der Seitenname schon vorhanden?
|
|
BOOL bIsMasterPage;
|
|
USHORT nPgNum = pDoc->GetPageByName( rName, bIsMasterPage );
|
|
|
|
if( nPgNum != SDRPAGE_NOTFOUND )
|
|
{
|
|
String aDesc( SdResId( STR_WARN_PAGE_EXISTS ) );
|
|
SvxNameDialog* pDlg = new SvxNameDialog( pWin, rName, aDesc );
|
|
|
|
if( pViewShell->GetActualFunction() )
|
|
{
|
|
KeyCode aKeyCode( KEY_ESCAPE );
|
|
KeyEvent aKeyEvent( 27, aKeyCode );
|
|
pViewShell->KeyInput( aKeyEvent, (SdWindow*)pWin );
|
|
}
|
|
|
|
while( !bUnique && pDlg->Execute() == RET_OK )
|
|
{
|
|
pDlg->GetName( rName );
|
|
|
|
nPgNum = pDoc->GetPageByName( rName, bIsMasterPage );
|
|
if( nPgNum == SDRPAGE_NOTFOUND )
|
|
{
|
|
bUnique = TRUE;
|
|
}
|
|
}
|
|
delete pDlg;
|
|
}
|
|
else
|
|
bUnique = TRUE;
|
|
|
|
return( bUnique );
|
|
}
|