Files
libreoffice/svx/source/svdraw/svdhlpln.cxx
Ivo Hinkelmann 75322bad14 INTEGRATION: CWS rt16 (1.10.86); FILE MERGED
2006/08/07 12:14:34 rt 1.10.86.1: #i68214# Remove empty file
2006-08-29 13:39:14 +00:00

299 lines
9.0 KiB
C++

/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: svdhlpln.cxx,v $
*
* $Revision: 1.11 $
*
* last change: $Author: ihi $ $Date: 2006-08-29 14:38:50 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 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
*
************************************************************************/
#include "svdhlpln.hxx"
#ifndef _TOOLS_COLOR_HXX
#include <tools/color.hxx>
#endif
#ifndef _OUTDEV_HXX //autogen
#include <vcl/outdev.hxx>
#endif
#ifndef _SV_WINDOW_HXX //autogen
#include <vcl/window.hxx>
#endif
#ifndef _TL_POLY_HXX
#include <tools/poly.hxx>
#endif
#ifndef _SV_LINEINFO_HXX
#include <vcl/lineinfo.hxx>
#endif
////////////////////////////////////////////////////////////////////////////////////////////////////
Pointer SdrHelpLine::GetPointer() const
{
switch (eKind) {
case SDRHELPLINE_VERTICAL : return Pointer(POINTER_ESIZE);
case SDRHELPLINE_HORIZONTAL: return Pointer(POINTER_SSIZE);
default : return Pointer(POINTER_MOVE);
} // switch
}
// #i27493#
// Helper method to draw a hor or ver two-colored dashed line
void SdrHelpLine::ImpDrawDashedTwoColorLine(OutputDevice& rOut, sal_Int32 nStart, sal_Int32 nEnd, sal_Int32 nFixPos,
sal_Int32 nStepWidth, Color aColA, Color aColB, sal_Bool bHorizontal) const
{
for(sal_Int32 a(nStart), b(0L); a < nEnd; a += nStepWidth, b++)
{
rOut.SetLineColor((b % 2) ? aColA : aColB);
sal_Int32 nNextPos(a + nStepWidth - 1L);
if(nNextPos > nEnd)
nNextPos = nEnd;
if(bHorizontal)
rOut.DrawLine(Point(a, nFixPos), Point(nNextPos, nFixPos));
else
rOut.DrawLine(Point(nFixPos, a), Point(nFixPos, nNextPos));
}
}
void SdrHelpLine::Draw(OutputDevice& rOut, const Point& rOfs) const
{
// #i27493# New implementation for 8. Will be replaced later when we have overlays.
Point aPnt(rOut.LogicToPixel(aPos + rOfs));
const sal_Int32 xPos(aPnt.X());
const sal_Int32 yPos(aPnt.Y());
const sal_Bool bOldMapModeWasEnabled(rOut.IsMapModeEnabled());
const Size aOutSizePixel(rOut.GetOutputSizePixel());
rOut.EnableMapMode(sal_False);
switch(eKind)
{
case SDRHELPLINE_VERTICAL :
{
ImpDrawDashedTwoColorLine(rOut, 0L, aOutSizePixel.Height(),
xPos, 4L , Color(COL_BLACK), Color(COL_WHITE), sal_False);
break;
}
case SDRHELPLINE_HORIZONTAL :
{
ImpDrawDashedTwoColorLine(rOut, 0L, aOutSizePixel.Width(),
yPos, 4L , Color(COL_BLACK), Color(COL_WHITE), sal_True);
break;
}
case SDRHELPLINE_POINT :
{
ImpDrawDashedTwoColorLine(rOut, xPos - SDRHELPLINE_POINT_PIXELSIZE, xPos + SDRHELPLINE_POINT_PIXELSIZE,
yPos, 4L , Color(COL_BLACK), Color(COL_WHITE), sal_True);
ImpDrawDashedTwoColorLine(rOut, yPos - SDRHELPLINE_POINT_PIXELSIZE, yPos + SDRHELPLINE_POINT_PIXELSIZE,
xPos, 4L , Color(COL_BLACK), Color(COL_WHITE), sal_False);
break;
}
}
rOut.EnableMapMode(bOldMapModeWasEnabled);
}
FASTBOOL SdrHelpLine::IsHit(const Point& rPnt, USHORT nTolLog, const OutputDevice& rOut) const
{
Size a1Pix(rOut.PixelToLogic(Size(1,1)));
FASTBOOL bXHit=rPnt.X()>=aPos.X()-nTolLog && rPnt.X()<=aPos.X()+nTolLog+a1Pix.Width();
FASTBOOL bYHit=rPnt.Y()>=aPos.Y()-nTolLog && rPnt.Y()<=aPos.Y()+nTolLog+a1Pix.Height();
switch (eKind) {
case SDRHELPLINE_VERTICAL : return bXHit;
case SDRHELPLINE_HORIZONTAL: return bYHit;
case SDRHELPLINE_POINT: {
if (bXHit || bYHit) {
Size aRad(rOut.PixelToLogic(Size(SDRHELPLINE_POINT_PIXELSIZE,SDRHELPLINE_POINT_PIXELSIZE)));
return rPnt.X()>=aPos.X()-aRad.Width() && rPnt.X()<=aPos.X()+aRad.Width()+a1Pix.Width() &&
rPnt.Y()>=aPos.Y()-aRad.Height() && rPnt.Y()<=aPos.Y()+aRad.Height()+a1Pix.Height();
}
} break;
} // switch
return FALSE;
}
Rectangle SdrHelpLine::GetBoundRect(const OutputDevice& rOut) const
{
Rectangle aRet(aPos,aPos);
Point aOfs(rOut.GetMapMode().GetOrigin());
Size aSiz(rOut.GetOutputSize());
switch (eKind) {
case SDRHELPLINE_VERTICAL : aRet.Top()=-aOfs.Y(); aRet.Bottom()=-aOfs.Y()+aSiz.Height(); break;
case SDRHELPLINE_HORIZONTAL: aRet.Left()=-aOfs.X(); aRet.Right()=-aOfs.X()+aSiz.Width(); break;
case SDRHELPLINE_POINT : {
Size aRad(rOut.PixelToLogic(Size(SDRHELPLINE_POINT_PIXELSIZE,SDRHELPLINE_POINT_PIXELSIZE)));
aRet.Left() -=aRad.Width();
aRet.Right() +=aRad.Width();
aRet.Top() -=aRad.Height();
aRet.Bottom()+=aRad.Height();
} break;
} // switch
return aRet;
}
bool SdrHelpLine::IsVisibleEqual( const SdrHelpLine& rHelpLine, const OutputDevice& rOut ) const
{
if( eKind == rHelpLine.eKind)
{
Point aPt1(rOut.LogicToPixel(aPos)), aPt2(rOut.LogicToPixel(rHelpLine.aPos));
switch( eKind )
{
case SDRHELPLINE_POINT:
return aPt1 == aPt2;
case SDRHELPLINE_VERTICAL:
return aPt1.X() == aPt2.X();
case SDRHELPLINE_HORIZONTAL:
return aPt1.Y() == aPt2.Y();
}
}
return false;
}
//BFS01SvStream& operator<<(SvStream& rOut, const SdrHelpLine& rHL)
//BFS01{
//BFS01 SdrIOHeader aHead(rOut,STREAM_WRITE,SdrIOHlpLID);
//BFS01 rOut<<UINT16(rHL.eKind);
//BFS01 rOut<<rHL.aPos;
//BFS01 return rOut;
//BFS01}
//BFS01SvStream& operator>>(SvStream& rIn, SdrHelpLine& rHL)
//BFS01{
//BFS01 SdrIOHeader aHead(rIn,STREAM_READ);
//BFS01 UINT16 nDum;
//BFS01 rIn>>nDum;
//BFS01 rHL.eKind=(SdrHelpLineKind)nDum;
//BFS01 rIn>>rHL.aPos;
//BFS01 return rIn;
//BFS01}
void SdrHelpLineList::Clear()
{
USHORT nAnz=GetCount();
for (USHORT i=0; i<nAnz; i++) {
delete GetObject(i);
}
aList.Clear();
}
void SdrHelpLineList::operator=(const SdrHelpLineList& rSrcList)
{
Clear();
USHORT nAnz=rSrcList.GetCount();
for (USHORT i=0; i<nAnz; i++) {
Insert(rSrcList[i]);
}
}
FASTBOOL SdrHelpLineList::operator==(const SdrHelpLineList& rSrcList) const
{
FASTBOOL bEqual=FALSE;
USHORT nAnz=GetCount();
if (nAnz==rSrcList.GetCount()) {
bEqual=TRUE;
for (USHORT i=0; i<nAnz && bEqual; i++) {
if (*GetObject(i)!=*rSrcList.GetObject(i)) {
bEqual=FALSE;
}
}
}
return bEqual;
}
void SdrHelpLineList::DrawAll(OutputDevice& rOut, const Point& rOfs) const
{
sal_uInt16 nAnz = GetCount();
sal_uInt16 i,j;
SdrHelpLine *pHL, *pHL2;
for(i=0; i<nAnz; i++)
{
pHL = GetObject(i);
// check if we already drawn a help line like this one
if( pHL )
{
for(j=0;j<i;j++)
{
pHL2 = GetObject(j);
if( pHL2 && pHL->IsVisibleEqual( *pHL2, rOut) )
{
pHL = NULL;
break;
}
}
}
if( pHL )
pHL->Draw(rOut,rOfs);
}
}
USHORT SdrHelpLineList::HitTest(const Point& rPnt, USHORT nTolLog, const OutputDevice& rOut) const
{
USHORT nAnz=GetCount();
for (USHORT i=nAnz; i>0;) {
i--;
if (GetObject(i)->IsHit(rPnt,nTolLog,rOut)) return i;
}
return SDRHELPLINE_NOTFOUND;
}
//BFS01SvStream& operator<<(SvStream& rOut, const SdrHelpLineList& rHLL)
//BFS01{
//BFS01 SdrIOHeader aHead(rOut,STREAM_WRITE,SdrIOHLstID);
//BFS01 USHORT nAnz=rHLL.GetCount();
//BFS01 rOut<<nAnz;
//BFS01 for (USHORT i=0; i<nAnz; i++) {
//BFS01 rOut<<rHLL[i];
//BFS01 }
//BFS01 return rOut;
//BFS01}
//BFS01SvStream& operator>>(SvStream& rIn, SdrHelpLineList& rHLL)
//BFS01{
//BFS01 SdrIOHeader aHead(rIn,STREAM_READ);
//BFS01 rHLL.Clear();
//BFS01 USHORT nAnz;
//BFS01 rIn>>nAnz;
//BFS01 for (USHORT i=0; i<nAnz; i++) {
//BFS01 SdrHelpLine* pHL=new SdrHelpLine;
//BFS01 rIn>>*pHL;
//BFS01 rHLL.aList.Insert(pHL,CONTAINER_APPEND);
//BFS01 }
//BFS01 return rIn;
//BFS01}
// eof