2009-01-13 19:18:08 +0100 aw r266250 : #i96669# changed initialisation order in Embedded3DPrimitive2D::Embedded3DPrimitive2D due to TinderBox 2009-01-13 19:15:37 +0100 aw r266249 : #i96669# changed initialisation order in Embedded3DPrimitive2D::Embedded3DPrimitive2D due to TinderBox 2009-01-12 11:53:37 +0100 aw r266141 : #i97874# corrected include for TinderBox build 2009-01-08 17:48:23 +0100 aw r266029 : #i97874# extended SdrTextObj::ImpConvertAddText to copy needed attributes from original object 2009-01-08 14:59:08 +0100 aw r266015 : #i96350# added fallback to solid fill in shadow TabPage when no fill is defined to get a reasonable shadow preview 2009-01-08 12:40:49 +0100 aw r265995 : #i94832# remuved not needed E3DModifySceneSnapRectUpdater usages 2009-01-08 01:53:46 +0100 thb r265982 : #i94860# Blacklisting another ATI card/driver that causes blank screens 2009-01-08 01:46:38 +0100 thb r265981 : #i97853# Changed all gradient texture methods to use basegfx gradienttools. consolidated quite some code 2009-01-08 01:45:09 +0100 thb r265980 : #i97853# Added lerp methods, slight changes to have everything necessary contained in the ODFGradientInfo struct 2009-01-08 00:01:54 +0100 thb r265979 : #i97853# First part of the move - duplicated the stuff to basegfx 2009-01-06 16:23:09 +0100 aw r265930 : #i97197# Changed SwDrawVirtObj to work well with changed aOutRect and bBoundRectValid functionality 2009-01-06 12:41:24 +0100 aw r265909 : #i97784# corrected regression with connectors 2009-01-05 17:30:31 +0100 aw r265881 : #i97772# added missing usage of reduce factor for BitmapPrimitive creation 2009-01-05 12:24:01 +0100 aw r265863 : #i97321# added direct handling of HatchTexturePrimitive3D to not use it's decomposition for HitTest 2008-12-23 13:57:27 +0100 aw r265782 : #i96669# changed SW's FlyFrame paint fallback with primitives to use createLocalDecomposition since get2Decomposition does not have to stay virtual on the long run 2008-12-23 13:47:59 +0100 aw r265781 : #i96669# optimized impCreateTextPortionPrimitive to only create TextDecoratedPortionPrimitive2D when needed 2008-12-23 13:44:45 +0100 aw r265780 : #i96669# added B2DRange buffering to some primitive implementations where it is most necessary 2008-12-19 15:45:45 +0100 aw r265729 : #i96669# prepared TextPrimitives to work without DXarray, too. Had to rework impSplitSingleWords which gets active when a text portion has some word-wise decorations. Tested before committing 2008-12-19 15:44:16 +0100 aw r265728 : #i96669# corrected error in createPolygonFromUnitEllipseSegment which popped up when investigating 2008-12-18 17:45:58 +0100 aw r265708 : #i97149# added ActionChanged() call when visualisation object is modified 2008-12-18 15:34:42 +0100 aw r265695 : #i96598# corrected SdrPageObj's usage of aOutRect 2008-12-17 16:59:37 +0100 aw r265647 : #i96537# exchanged the marker for point number in string with correct one 2008-12-16 17:50:33 +0100 aw r265566 : #i93170# added a bool to EndDrawLayer() and corresponding mechanisms to allow to end without drawing FormLayer 2008-12-16 17:50:17 +0100 aw r265565 : #i93170# added a bool to EndDrawLayer() and corresponding mechanisms to allow to end without drawing FormLayer 2008-12-16 17:50:00 +0100 aw r265564 : #i93170# added a bool to EndDrawLayer() and corresponding mechanisms to allow to end without drawing FormLayer 2008-12-16 17:49:48 +0100 aw r265563 : #i93170# added a bool to EndDrawLayer() and corresponding mechanisms to allow to end without drawing FormLayer 2008-12-16 17:49:35 +0100 aw r265562 : #i93170# added a bool to EndDrawLayer() and corresponding mechanisms to allow to end without drawing FormLayer
362 lines
9.9 KiB
C++
362 lines
9.9 KiB
C++
/*************************************************************************
|
|
*
|
|
* 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: contwnd.cxx,v $
|
|
* $Revision: 1.16 $
|
|
*
|
|
* 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_svx.hxx"
|
|
#include <xoutbmp.hxx>
|
|
#include <svx/dialogs.hrc>
|
|
#include <svx/svxids.hrc>
|
|
#include <contdlg.hrc>
|
|
#include <contwnd.hxx>
|
|
#include <svx/svdpage.hxx>
|
|
#include <svx/svdopath.hxx>
|
|
#include <svx/xfltrit.hxx>
|
|
#include <svx/xfillit.hxx>
|
|
#include <basegfx/polygon/b2dpolygon.hxx>
|
|
#include <basegfx/polygon/b2dpolypolygontools.hxx>
|
|
|
|
// #i75482#
|
|
#include "sdrpaintwindow.hxx"
|
|
|
|
#define TRANSCOL Color( COL_WHITE )
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
ContourWindow::ContourWindow( Window* pParent, const ResId& rResId ) :
|
|
GraphCtrl ( pParent, rResId ),
|
|
aWorkRect ( 0, 0, 0, 0 ),
|
|
bPipetteMode ( FALSE ),
|
|
bWorkplaceMode ( FALSE ),
|
|
bClickValid ( FALSE )
|
|
{
|
|
SetWinStyle( WB_SDRMODE );
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
ContourWindow::~ContourWindow()
|
|
{
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void ContourWindow::SetPolyPolygon( const PolyPolygon& rPolyPoly )
|
|
{
|
|
SdrPage* pPage = (SdrPage*) pModel->GetPage( 0 );
|
|
const USHORT nPolyCount = rPolyPoly.Count();
|
|
|
|
// zuerst alle Zeichenobjekte loeschen
|
|
aPolyPoly = rPolyPoly;
|
|
|
|
// #117412#
|
|
// To avoid to have destroyed objects which are still selected, it is necessary to deselect
|
|
// them first (!)
|
|
pView->UnmarkAllObj();
|
|
|
|
pPage->Clear();
|
|
|
|
for ( USHORT i = 0; i < nPolyCount; i++ )
|
|
{
|
|
basegfx::B2DPolyPolygon aPolyPolygon;
|
|
aPolyPolygon.append(aPolyPoly[ i ].getB2DPolygon());
|
|
SdrPathObj* pPathObj = new SdrPathObj( OBJ_PATHFILL, aPolyPolygon );
|
|
|
|
if ( pPathObj )
|
|
{
|
|
SfxItemSet aSet( pModel->GetItemPool() );
|
|
|
|
aSet.Put( XFillStyleItem( XFILL_SOLID ) );
|
|
aSet.Put( XFillColorItem( String(), TRANSCOL ) );
|
|
aSet.Put( XFillTransparenceItem( 50 ) );
|
|
|
|
//pPathObj->SetItemSetAndBroadcast(aSet);
|
|
pPathObj->SetMergedItemSetAndBroadcast(aSet);
|
|
|
|
pPage->InsertObject( pPathObj );
|
|
}
|
|
}
|
|
|
|
if ( nPolyCount )
|
|
{
|
|
pView->MarkAll();
|
|
pView->CombineMarkedObjects( sal_False );
|
|
}
|
|
|
|
pModel->SetChanged( sal_False );
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
const PolyPolygon& ContourWindow::GetPolyPolygon()
|
|
{
|
|
if ( pModel->IsChanged() )
|
|
{
|
|
SdrPage* pPage = (SdrPage*) pModel->GetPage( 0 );
|
|
|
|
aPolyPoly = PolyPolygon();
|
|
|
|
if ( pPage && pPage->GetObjCount() )
|
|
{
|
|
SdrPathObj* pPathObj = (SdrPathObj*)pPage->GetObj(0L);
|
|
// Not sure if subdivision is needed for ContourWindow, but maybe it cannot handle
|
|
// curves at all. Keeping subdivision here for security
|
|
const basegfx::B2DPolyPolygon aB2DPolyPolygon(basegfx::tools::adaptiveSubdivideByAngle(pPathObj->GetPathPoly()));
|
|
aPolyPoly = PolyPolygon(aB2DPolyPolygon);
|
|
}
|
|
|
|
pModel->SetChanged( sal_False );
|
|
}
|
|
|
|
return aPolyPoly;
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void ContourWindow::InitSdrModel()
|
|
{
|
|
GraphCtrl::InitSdrModel();
|
|
|
|
SfxItemSet aSet( pModel->GetItemPool() );
|
|
|
|
aSet.Put( XFillColorItem( String(), TRANSCOL ) );
|
|
aSet.Put( XFillTransparenceItem( 50 ) );
|
|
pView->SetAttributes( aSet );
|
|
pView->SetFrameDragSingles( TRUE );
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void ContourWindow::SdrObjCreated( const SdrObject& )
|
|
{
|
|
pView->MarkAll();
|
|
pView->CombineMarkedObjects( sal_False );
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
BOOL ContourWindow::IsContourChanged() const
|
|
{
|
|
SdrPage* pPage = (SdrPage*) pModel->GetPage( 0 );
|
|
BOOL bRet = FALSE;
|
|
|
|
if ( pPage && pPage->GetObjCount() )
|
|
bRet = ( (SdrPathObj*) pPage->GetObj( 0 ) )->GetPathPoly().count() && pModel->IsChanged();
|
|
|
|
return bRet;
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void ContourWindow::MouseButtonDown( const MouseEvent& rMEvt )
|
|
{
|
|
if ( bWorkplaceMode )
|
|
{
|
|
const Point aLogPt( PixelToLogic( rMEvt.GetPosPixel() ) );
|
|
|
|
SetPolyPolygon( PolyPolygon() );
|
|
aWorkRect = Rectangle( aLogPt, aLogPt );
|
|
Paint( Rectangle( Point(), GetGraphicSize() ) );
|
|
SetEditMode( TRUE );
|
|
}
|
|
|
|
if ( !bPipetteMode )
|
|
GraphCtrl::MouseButtonDown( rMEvt );
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void ContourWindow::MouseMove( const MouseEvent& rMEvt )
|
|
{
|
|
bClickValid = FALSE;
|
|
|
|
if ( bPipetteMode )
|
|
{
|
|
const Point aLogPt( PixelToLogic( rMEvt.GetPosPixel() ) );
|
|
|
|
aPipetteColor = GetPixel( aLogPt );
|
|
Control::MouseMove( rMEvt );
|
|
|
|
if ( aPipetteLink.IsSet() && Rectangle( Point(), GetGraphicSize() ).IsInside( aLogPt ) )
|
|
{
|
|
SetPointer( POINTER_REFHAND );
|
|
aPipetteLink.Call( this );
|
|
}
|
|
}
|
|
else
|
|
GraphCtrl::MouseMove( rMEvt );
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void ContourWindow::MouseButtonUp(const MouseEvent& rMEvt)
|
|
{
|
|
Point aTmpPoint;
|
|
const Rectangle aGraphRect( aTmpPoint, GetGraphicSize() );
|
|
const Point aLogPt( PixelToLogic( rMEvt.GetPosPixel() ) );
|
|
|
|
bClickValid = aGraphRect.IsInside( aLogPt );
|
|
ReleaseMouse();
|
|
|
|
if ( bPipetteMode )
|
|
{
|
|
Control::MouseButtonUp( rMEvt );
|
|
|
|
if ( aPipetteClickLink.IsSet() )
|
|
aPipetteClickLink.Call( this );
|
|
}
|
|
else if ( bWorkplaceMode )
|
|
{
|
|
GraphCtrl::MouseButtonUp( rMEvt );
|
|
|
|
aWorkRect.Right() = aLogPt.X();
|
|
aWorkRect.Bottom() = aLogPt.Y();
|
|
aWorkRect.Intersection( aGraphRect );
|
|
aWorkRect.Justify();
|
|
|
|
if ( aWorkRect.Left() != aWorkRect.Right() && aWorkRect.Top() != aWorkRect.Bottom() )
|
|
{
|
|
PolyPolygon _aPolyPoly( GetPolyPolygon() );
|
|
|
|
_aPolyPoly.Clip( aWorkRect );
|
|
SetPolyPolygon( _aPolyPoly );
|
|
pView->SetWorkArea( aWorkRect );
|
|
}
|
|
else
|
|
pView->SetWorkArea( aGraphRect );
|
|
|
|
Invalidate( aGraphRect );
|
|
|
|
if ( aWorkplaceClickLink.IsSet() )
|
|
aWorkplaceClickLink.Call( this );
|
|
}
|
|
else
|
|
GraphCtrl::MouseButtonUp( rMEvt );
|
|
}
|
|
|
|
|
|
/*************************************************************************
|
|
|*
|
|
|*
|
|
|*
|
|
\************************************************************************/
|
|
|
|
void ContourWindow::Paint( const Rectangle& rRect )
|
|
{
|
|
// #i75482#
|
|
// encapsulate the redraw using Begin/End and use the returned
|
|
// data to get the target output device (e.g. when pre-rendering)
|
|
SdrPaintWindow* pPaintWindow = pView->BeginCompleteRedraw(this);
|
|
OutputDevice& rTarget = pPaintWindow->GetTargetOutputDevice();
|
|
|
|
const Graphic& rGraphic = GetGraphic();
|
|
const Color& rOldLineColor = GetLineColor();
|
|
const Color& rOldFillColor = GetFillColor();
|
|
|
|
rTarget.SetLineColor( Color( COL_BLACK ) );
|
|
rTarget.SetFillColor( Color( COL_WHITE ) );
|
|
|
|
rTarget.DrawRect( Rectangle( Point(), GetGraphicSize() ) );
|
|
|
|
rTarget.SetLineColor( rOldLineColor );
|
|
rTarget.SetFillColor( rOldFillColor );
|
|
|
|
if ( rGraphic.GetType() != GRAPHIC_NONE )
|
|
rGraphic.Draw( &rTarget, Point(), GetGraphicSize() );
|
|
|
|
if ( aWorkRect.Left() != aWorkRect.Right() && aWorkRect.Top() != aWorkRect.Bottom() )
|
|
{
|
|
PolyPolygon _aPolyPoly( 2, 2 );
|
|
const Color aOldFillColor( GetFillColor() );
|
|
|
|
_aPolyPoly.Insert( Rectangle( Point(), GetGraphicSize() ) );
|
|
_aPolyPoly.Insert( aWorkRect );
|
|
|
|
rTarget.SetFillColor( COL_LIGHTRED );
|
|
rTarget.DrawTransparent( _aPolyPoly, 50 );
|
|
rTarget.SetFillColor( aOldFillColor );
|
|
}
|
|
|
|
// #i75482#
|
|
const Region aRepaintRegion(rRect);
|
|
pView->DoCompleteRedraw(*pPaintWindow, aRepaintRegion);
|
|
pView->EndCompleteRedraw(*pPaintWindow, true);
|
|
}
|
|
|
|
// eof
|