Files
libreoffice/svx/source/dialog/frmsel.cxx
Jens-Heiner Rechtien fd069bee7e initial import
2000-09-18 16:07:07 +00:00

1266 lines
44 KiB
C++

/*************************************************************************
*
* $RCSfile: frmsel.cxx,v $
*
* $Revision: 1.1.1.1 $
*
* last change: $Author: hr $ $Date: 2000-09-18 17:01: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): _______________________________________
*
*
************************************************************************/
// include ---------------------------------------------------------------
#ifndef _SV_VIRDEV_HXX
#include <vcl/virdev.hxx>
#endif
#pragma hdrstop
#define _SVX_FRMSEL_CXX
#define ITEMID_BOX SID_ATTR_BORDER_OUTER
#define ITEMID_BOXINFO SID_ATTR_BORDER_INNER
#include "frmsel.hxx"
#include "linelink.hxx"
#ifndef _SVX_BOXITEM_HXX //autogen
#include <boxitem.hxx>
#endif
// class SvxFrameLine ----------------------------------------------------
struct SvxLineStruct SvxFrameLine::NO_LINE = { 0,0,0 };
struct SvxLineStruct SvxFrameLine::THIN_LINE = { 1,0,0 };
struct SvxLineStruct SvxFrameLine::THICK_LINE = { 3,0,0 };
struct SvxLineStruct SvxFrameLine::THIN_DOUBLE_LINE = { 1,1,1 };
struct SvxLineStruct SvxFrameLine::THICK_DOUBLE_LINE = { 2,1,2 };
//------------------------------------------------------------------------
SvxFrameLine::SvxFrameLine()
: aStartPos ( 0, 0 ),
aMidPos ( 0, 0 ),
aEndPos ( 0, 0 ),
aColor ( COL_BLACK ),
theState ( SVX_FRMLINESTATE_HIDE ),
#ifndef MIPS
theStyle ( NO_LINE ),
theCoreStyle ( NO_LINE ),
#endif
bIsSelected ( FALSE )
{
#if defined MIPS
theStyle.nLeft=0;
theStyle.nMiddle=0;
theStyle.nRight=0;
theCoreStyle.nLeft=0;
theCoreStyle.nMiddle=0;
theCoreStyle.nRight=0;
#endif
}
//------------------------------------------------------------------------
#define WIDTH_THICK (DEF_LINE_WIDTH_2 *100)
void SvxFrameLine::SetStyle( const SvxLineStruct& aStyle )
{
theCoreStyle = aStyle;
/*
* Mapping: (in TWIPS, 1pt = 100 * 20 TWIPS = duenn)
* alles was <=0 ist -> NO_LINE
* alles was <=DEF_SLINE_WIDTH_2 ist -> THIN_LINE
* alles andere -> THICK_LINE
*/
if ( ( aStyle.nLeft <= 0 ) && ( aStyle.nRight <= 0 ) )
{
theStyle = NO_LINE;
theState = SVX_FRMLINESTATE_HIDE;
}
else if ( ( aStyle.nRight == 0 ) && // einzelne Linie
( aStyle.nLeft > 0 ) && // sichtbar
( aStyle.nLeft < WIDTH_THICK ) ) // duenn
{
theStyle = THIN_LINE;
theState = SVX_FRMLINESTATE_SHOW;
}
else if ( ( aStyle.nRight == 0 ) && // einzelne Linie
( aStyle.nLeft > 0 ) && // sichtbar
( aStyle.nLeft >= WIDTH_THICK ) ) // dick
{
theStyle = THICK_LINE;
theState = SVX_FRMLINESTATE_SHOW;
}
else if ( ( aStyle.nRight > 0 ) && // doppelte Linie
( aStyle.nLeft > 0 ) && // sichtbar
( aStyle.nLeft < WIDTH_THICK ) ) // duenn
{
theStyle = THIN_DOUBLE_LINE;
theState = SVX_FRMLINESTATE_SHOW;
}
else if ( ( aStyle.nRight > 0 ) && // doppelte Linie
( aStyle.nLeft > 0 ) && // sichtbar
( aStyle.nLeft >= WIDTH_THICK ) ) // dick
{
theStyle = THICK_DOUBLE_LINE;
theState = SVX_FRMLINESTATE_SHOW;
}
}
#undef WIDTH_THICK
//------------------------------------------------------------------------
void SvxFrameLine::SetState( SvxFrameLineState eState )
{
theState = eState;
if ( SVX_FRMLINESTATE_DONT_CARE == eState )
{
theStyle = THICK_LINE;
theCoreStyle = NO_LINE;
}
}
// class SvxFrameSelector ------------------------------------------------
SvxFrameSelector::SvxFrameSelector( Window* pParent,
SvxFrameSelectorType eType,
BOOL bDontCare )
: Window ( pParent, (WinBits)0x0000 ),
eSel ( eType ),
eShadow ( SVX_FRMSHADOW_NONE ),
theCurLineStyle ( SvxFrameLine::NO_LINE ),
theCurLineCol ( COL_BLACK ),
theShadowCol ( COL_BLACK ),
bIsDontCare ( bDontCare ),
bIsClicked ( FALSE )
{
Size aSzBmp( ( eSel == SVX_FRMSELTYPE_TABLE )
? Size( 60, 42 )
: Size( 50, 50 ) );
aSzBmp = pParent->LogicToPixel(aSzBmp, MAP_APPFONT);
Size aSzParent( pParent->GetSizePixel() );
long nXCenter = ( aSzParent.Width() - aSzBmp.Width() ) / 2;
long nYCenter = ( aSzParent.Height() - aSzBmp.Height() ) / 2;
Point atPos( ( nXCenter < 0 ) ? 0 : nXCenter,
( nYCenter < 0 ) ? 0 : nYCenter );
InitBitmap_Impl( aSzBmp );
SetPosSizePixel( atPos, theBmp.GetSizePixel() );
Show();
}
// -----------------------------------------------------------------------
void SvxFrameSelector::InitBitmap_Impl( const Size& rSize )
{
VirtualDevice aVirDev;
long nX = rSize.Width();
long nY = rSize.Height();
long nXMid = nX / 2;
long nYMid = nY / 2;
/*
* Berechnen des Frame-Rects und der Linie-Mittelpunkte
*/
theBoundingRect = aRectFrame = Rectangle( 21, 21, nX-21, nY-21 );
theLeftLine.aStartPos = Point( 21, 21 );
theLeftLine.aEndPos = Point( 21, nY - 21 );
theLeftLine.aMidPos = Point( 21, nYMid );
theRightLine.aStartPos = Point( nX - 21, 21 );
theRightLine.aEndPos = Point( nX - 21, nY - 21 );
theRightLine.aMidPos = Point( nX - 21, nYMid );
theVerLine.aStartPos = Point( nXMid, 21 );
theVerLine.aEndPos = Point( nXMid, nY - 21 );
theVerLine.aMidPos = Point( nXMid, nYMid );
theTopLine.aStartPos = theLeftLine.aStartPos;
theTopLine.aEndPos = theRightLine.aStartPos;
theTopLine.aMidPos = theVerLine.aStartPos;
theBottomLine.aStartPos = theLeftLine.aEndPos;
theBottomLine.aEndPos = theRightLine.aEndPos;
theBottomLine.aMidPos = theVerLine.aEndPos;
theHorLine.aStartPos = theLeftLine.aMidPos;
theHorLine.aEndPos = theRightLine.aMidPos;
theHorLine.aMidPos = theVerLine.aMidPos;
// HotSpot-Rectangles:
aSpotLeft = Rectangle( Point( 0, 0 ),
Size( theLeftLine.aStartPos.X() + 3,
rSize.Height() ) );
aSpotRight = Rectangle( Point( theRightLine.aStartPos.X() - 3, 0 ),
aSpotLeft.GetSize() );
aSpotTop = Rectangle( Point( theTopLine.aStartPos.X(), 0 ),
Size( aRectFrame.GetWidth(),
theTopLine.aStartPos.Y() + 3 ) );
aSpotBottom = Rectangle( theBottomLine.aStartPos - Point( 0, 3 ),
aSpotTop.GetSize() );
aSpotHor = ( eSel == SVX_FRMSELTYPE_TABLE )
? Rectangle( theHorLine.aStartPos + Point( 0, -2 ),
Size( aRectFrame.GetWidth(), 5 ) )
: Rectangle( Point( -1, -1 ), Size(- 1, -1 ) );
aSpotVer = ( eSel == SVX_FRMSELTYPE_TABLE )
? Rectangle( theVerLine.aStartPos + Point( -2, 0 ),
Size( 5, aRectFrame.GetHeight() ) )
: Rectangle( Point( -1, -1 ), Size( -1, -1 ) );
/*
* Initialisieren der Bitmap:
*/
aVirDev.SetOutputSizePixel( rSize );
aVirDev.SetLineColor( Color( COL_BLACK ) );
aVirDev.SetFillColor( Color( COL_WHITE ) );
aVirDev.DrawRect( Rectangle( Point( 0, 0 ), rSize ) );
DrawContents_Impl( aVirDev );
/*
* Malen der vier Eck-Winkel:
*/
aVirDev.SetLineColor( Color( COL_GRAY ) );
// links/rechts oben:
aVirDev.DrawLine( Point( 10, 15 ), Point( 15, 15 ) );
aVirDev.DrawLine( Point( 15, 15 ), Point( 15, 10 ) );
aVirDev.DrawLine( Point( nX - 10, 15 ), Point( nX - 15, 15 ) );
aVirDev.DrawLine( Point( nX - 15, 15 ), Point( nX - 15, 10 ) );
// links/rechts unten:
aVirDev.DrawLine( Point( 10, nY - 15 ), Point( 15, nY - 15 ) );
aVirDev.DrawLine( Point( 15, nY - 15 ), Point( 15, nY - 10 ) );
aVirDev.DrawLine( Point( nX -10, nY - 15 ), Point( nX - 15, nY - 15 ) );
aVirDev.DrawLine( Point( nX -15, nY - 15 ), Point( nX - 15, nY - 10 ) );
/*
* Tabelle: Malen der vier Mitte-Winkel:
*/
if ( eSel == SVX_FRMSELTYPE_TABLE )
{
// links/rechts
aVirDev.DrawLine( Point( 10, nYMid ), Point( 15, nYMid ) );
aVirDev.DrawLine( Point( 15, nYMid-2 ), Point( 15, nYMid+2 ) );
aVirDev.DrawLine( Point( nX-10, nYMid ), Point( nX-15, nYMid ) );
aVirDev.DrawLine( Point( nX-15, nYMid-2 ), Point( nX-15, nYMid+2 ) );
// horizontal/vertikal
aVirDev.DrawLine( Point( nXMid, 10 ), Point( nXMid, 15 ) );
aVirDev.DrawLine( Point( nXMid-2, 15 ), Point( nXMid+2, 15 ) );
aVirDev.DrawLine( Point( nXMid, nY-10 ), Point( nXMid, nY-15 ) );
aVirDev.DrawLine( Point( nXMid-2, nY-15 ), Point( nXMid+2, nY-15 ) );
}
theBmp = aVirDev.GetBitmap( Point( 0, 0 ), rSize );
}
// -----------------------------------------------------------------------
void SvxFrameSelector::DrawFrameLine_Impl( OutputDevice& rVirDev, Point from,
Point to, BOOL bHor, SvxLineStruct& dline, SvxLineStruct& lt,
SvxLineStruct& lLine, SvxLineStruct& lb, SvxLineStruct& rt,
SvxLineStruct& rLine, SvxLineStruct& rb )
{
short diffArr[4]; // Kreuzungspunkt-Differenzen
short nHeight = 0;
Point from2( from );
Point to2( to );
if ( bHor ) // horizontale Linien
{
// Berechnung der Differenzen der Linienlaenge
// in den Kreuzungspunkten:
LinkLine( dline, lt, lLine, lb, rt, rLine, rb, diffArr );
nHeight = dline.nLeft + dline.nMiddle + dline.nRight;
from.Y() -= nHeight/2;
to.Y() -= nHeight/2;
to.Y() += ( dline.nLeft - 1 );
from.X() += diffArr[0];
to.X() += diffArr[2];
rVirDev.DrawRect( Rectangle( from, to ) );
// noch eine zweite Linie zu malen?
if ( dline.nRight != 0 )
{
from2.Y() -= nHeight / 2;
from2.Y() += dline.nLeft + dline.nMiddle;
to2.Y() -= nHeight / 2;
to2.Y() += dline.nMiddle + dline.nLeft;
to2.Y() += ( dline.nRight - 1 );
from2.X() += diffArr[1];
to2.X() += diffArr[3];
rVirDev.DrawRect( Rectangle( from2, to2 ) );
}
}
else // vertikale Linien
{
// Berechnung der Differenzen der Linienlaenge
// in den Kreuzungspunkten:
LinkLine( dline, lt, lLine, lb, rt, rLine, rb, diffArr );
nHeight = dline.nLeft + dline.nMiddle + dline.nRight;
from.X() -= nHeight / 2;
to.X() -= nHeight / 2;
to.X() += ( dline.nLeft - 1 );
from.Y() -= diffArr[2];
to.Y() -= diffArr[0];
rVirDev.DrawRect( Rectangle( from, to ) );
// noch eine zweite Linie zu malen?
if ( dline.nRight != 0 )
{
from2.X() -= nHeight / 2;
from2.X() += dline.nLeft + dline.nMiddle;
to2.X() -= nHeight / 2;
to2.X() += dline.nMiddle + dline.nLeft;
to2.X() += ( dline.nRight - 1 );
from2.Y() -= diffArr[3];
to2.Y() -= diffArr[1];
rVirDev.DrawRect( Rectangle( from2, to2 ) );
}
}
/*
* Anpassen des umgebenden Rectangles:
*/
long x1 = Min( from.X(), from2.X() );
long x2 = Max( to.X(), to2.X() );
long y1 = Min( from.Y(), from2.Y() );
long y2 = Max( to.Y(), to2.Y() );
if ( x1 < theBoundingRect.Left() )
theBoundingRect.Left() = x1;
else if ( x1 > theBoundingRect.Right() )
theBoundingRect.Right() = x1;
if ( x2 < theBoundingRect.Left() )
theBoundingRect.Left() = x2;
else if ( x2 > theBoundingRect.Right() )
theBoundingRect.Right() = x2;
if ( y1 < theBoundingRect.Top() )
theBoundingRect.Top() = y1;
else if ( y1 > theBoundingRect.Bottom() )
theBoundingRect.Bottom() = y1;
if ( y2 < theBoundingRect.Top() )
theBoundingRect.Top() = y2;
else if ( y2 > theBoundingRect.Bottom() )
theBoundingRect.Bottom() = y2;
}
// class SvxFrameSelector ------------------------------------------------
void SvxFrameSelector::HideLines()
{
theLeftLine.theState =
theRightLine.theState =
theTopLine.theState =
theBottomLine.theState =
theHorLine.theState =
theVerLine.theState = SVX_FRMLINESTATE_HIDE;
theLeftLine.theStyle =
theRightLine.theStyle =
theTopLine.theStyle =
theBottomLine.theStyle =
theHorLine.theStyle =
theHorLine.theStyle =
theVerLine.theStyle = SvxFrameLine::NO_LINE;
ShowLines();
}
// -----------------------------------------------------------------------
void SvxFrameSelector::ShowLines()
{
VirtualDevice aVirDev;
Color aFillColor;
aVirDev.SetOutputSizePixel( theBmp.GetSizePixel() );
aVirDev.DrawBitmap( Point( 0, 0 ), theBmp );
// gesamten Rahmen loeschen und Inhalt malen
aVirDev.SetLineColor();
aVirDev.SetFillColor( Color( COL_WHITE ) );
aVirDev.DrawRect( theBoundingRect );
DrawContents_Impl( aVirDev );
theBoundingRect = aRectFrame;
/*
* Zeichnen aller Linien:
* ----------------------
* Eine Linie wird in zwei Abschnitten gemalt, um die Kreuzungs-
* punkte mit anderen Linien beruecksichtigen zu koennen.
* Diese Aufgabe uebernimmt die Methode DrawFrameLine_Impl().
*/
// innere Linien: ---------------------------------------------
if ( eSel == SVX_FRMSELTYPE_TABLE &&
( theVerLine.theState == SVX_FRMLINESTATE_SHOW ||
theVerLine.theState == SVX_FRMLINESTATE_DONT_CARE ) )
{
if ( theVerLine.theState == SVX_FRMLINESTATE_SHOW )
aFillColor = theVerLine.aColor;
else
aFillColor = Color( COL_LIGHTGRAY );
aVirDev.SetLineColor();
aVirDev.SetFillColor( aFillColor );
DrawFrameLine_Impl( aVirDev,
theVerLine.aStartPos,
theVerLine.aMidPos,
FALSE,
theVerLine.theStyle, // dline
theHorLine.theStyle, // rb
theVerLine.theStyle, // lLine
theHorLine.theStyle, // rt
theTopLine.theStyle, // lb
SvxFrameLine::NO_LINE, // rLine
theTopLine.theStyle // lt
);
DrawFrameLine_Impl( aVirDev,
theVerLine.aMidPos,
theVerLine.aEndPos,
FALSE,
theVerLine.theStyle, // dline
theBottomLine.theStyle, // rb
SvxFrameLine::NO_LINE, // lLine
theBottomLine.theStyle, // rb
theHorLine.theStyle, // lb
theVerLine.theStyle, // rLine
theHorLine.theStyle // lt
);
}
if ( eSel == SVX_FRMSELTYPE_TABLE &&
( theHorLine.theState == SVX_FRMLINESTATE_SHOW ||
theHorLine.theState == SVX_FRMLINESTATE_DONT_CARE ) )
{
if ( theHorLine.theState == SVX_FRMLINESTATE_SHOW )
aFillColor = theHorLine.aColor;
else
aFillColor = Color( COL_LIGHTGRAY );
aVirDev.SetLineColor();
aVirDev.SetFillColor( aFillColor );
DrawFrameLine_Impl( aVirDev,
theHorLine.aStartPos,
theHorLine.aMidPos,
TRUE,
theHorLine.theStyle, // dline
theLeftLine.theStyle, // lt
SvxFrameLine::NO_LINE, // lLine
theLeftLine.theStyle, // lb
theVerLine.theStyle, // rt
theHorLine.theStyle, // rLine
theVerLine.theStyle // rb
);
DrawFrameLine_Impl( aVirDev,
theHorLine.aMidPos,
theHorLine.aEndPos,
TRUE,
theHorLine.theStyle, // dline
theVerLine.theStyle, // lt
theHorLine.theStyle, // lLine
theVerLine.theStyle, // lb
theRightLine.theStyle, // rt
SvxFrameLine::NO_LINE, // rLine
theRightLine.theStyle // rb
);
}
// aeussere Linien: -------------------------------------------
if ( theLeftLine.theState == SVX_FRMLINESTATE_SHOW ||
theLeftLine.theState == SVX_FRMLINESTATE_DONT_CARE )
{
if ( theLeftLine.theState == SVX_FRMLINESTATE_SHOW )
aFillColor = theLeftLine.aColor;
else
aFillColor = Color( COL_LIGHTGRAY );
aVirDev.SetLineColor();
aVirDev.SetFillColor( aFillColor );
DrawFrameLine_Impl( aVirDev,
theLeftLine.aStartPos,
theLeftLine.aMidPos,
FALSE,
theLeftLine.theStyle, // dline
SvxFrameLine::NO_LINE, // lb
theLeftLine.theStyle, // lLine
theHorLine.theStyle, // lt
SvxFrameLine::NO_LINE, // rb
SvxFrameLine::NO_LINE, // rLine
theTopLine.theStyle // rt
);
DrawFrameLine_Impl( aVirDev,
theLeftLine.aMidPos,
theLeftLine.aEndPos,
FALSE,
theLeftLine.theStyle, // dline
SvxFrameLine::NO_LINE, // lb
SvxFrameLine::NO_LINE, // lLine
theBottomLine.theStyle, // lt
SvxFrameLine::NO_LINE, // rb
theLeftLine.theStyle, // rLine
theHorLine.theStyle // rt
);
}
if ( theRightLine.theState == SVX_FRMLINESTATE_SHOW ||
theRightLine.theState == SVX_FRMLINESTATE_DONT_CARE )
{
if ( theRightLine.theState == SVX_FRMLINESTATE_SHOW )
aFillColor = theRightLine.aColor;
else
aFillColor = Color( COL_LIGHTGRAY );
aVirDev.SetLineColor();
aVirDev.SetFillColor( aFillColor );
DrawFrameLine_Impl( aVirDev,
theRightLine.aStartPos,
theRightLine.aMidPos,
FALSE,
theRightLine.theStyle, // dline
theHorLine.theStyle, // rb
theRightLine.theStyle, // lLine
SvxFrameLine::NO_LINE, // rt
theTopLine.theStyle, // lb
SvxFrameLine::NO_LINE, // eLine
SvxFrameLine::NO_LINE // lt
);
DrawFrameLine_Impl( aVirDev,
theRightLine.aMidPos,
theRightLine.aEndPos,
FALSE,
theRightLine.theStyle, // dline
theBottomLine.theStyle, // rb
SvxFrameLine::NO_LINE, // lLine
SvxFrameLine::NO_LINE, // lt
theHorLine.theStyle, // lb
theRightLine.theStyle, // lLine
SvxFrameLine::NO_LINE // rt
);
}
if ( theTopLine.theState == SVX_FRMLINESTATE_SHOW ||
theTopLine.theState == SVX_FRMLINESTATE_DONT_CARE )
{
if ( theTopLine.theState == SVX_FRMLINESTATE_SHOW )
aFillColor = theTopLine.aColor;
else
aFillColor = Color( COL_LIGHTGRAY );
aVirDev.SetLineColor();
aVirDev.SetFillColor( aFillColor );
DrawFrameLine_Impl( aVirDev,
theTopLine.aStartPos,
theTopLine.aMidPos,
TRUE,
theTopLine.theStyle, // dline
SvxFrameLine::NO_LINE, // lt
SvxFrameLine::NO_LINE, // lLine
theLeftLine.theStyle, // lb
SvxFrameLine::NO_LINE, // rt
theTopLine.theStyle, // rLine
theVerLine.theStyle // rb
);
DrawFrameLine_Impl( aVirDev,
theTopLine.aMidPos,
theTopLine.aEndPos,
TRUE,
theTopLine.theStyle, // dline
SvxFrameLine::NO_LINE, // lt
theTopLine.theStyle, // lLine
theVerLine.theStyle, // lb
SvxFrameLine::NO_LINE, // rt
SvxFrameLine::NO_LINE, // rLine
theRightLine.theStyle // rb
);
}
if ( theBottomLine.theState == SVX_FRMLINESTATE_SHOW ||
theBottomLine.theState == SVX_FRMLINESTATE_DONT_CARE )
{
if ( theBottomLine.theState == SVX_FRMLINESTATE_SHOW )
aFillColor = theBottomLine.aColor;
else
aFillColor = Color( COL_LIGHTGRAY );
aVirDev.SetLineColor();
aVirDev.SetFillColor( aFillColor );
DrawFrameLine_Impl( aVirDev,
theBottomLine.aStartPos,
theBottomLine.aMidPos,
TRUE,
theBottomLine.theStyle, // dline
theLeftLine.theStyle, // lt
SvxFrameLine::NO_LINE, // lLine
SvxFrameLine::NO_LINE, // lb
theVerLine.theStyle, // rt
theBottomLine.theStyle, // rLine
SvxFrameLine::NO_LINE // rb
);
DrawFrameLine_Impl( aVirDev,
theBottomLine.aMidPos,
theBottomLine.aEndPos,
TRUE,
theBottomLine.theStyle, // dline
theVerLine.theStyle, // lt
theBottomLine.theStyle, // lLine
SvxFrameLine::NO_LINE, // lb
theRightLine.theStyle, // rt
SvxFrameLine::NO_LINE, // rLine
SvxFrameLine::NO_LINE // rb
);
}
theBmp = aVirDev.GetBitmap( Point(0,0), theBmp.GetSizePixel() );
if ( eShadow != SVX_FRMSHADOW_NONE )
ShowShadow();
else
Invalidate( INVALIDATE_NOERASE );
}
// -----------------------------------------------------------------------
void SvxFrameSelector::SetCurLineStyle( const SvxLineStruct& aStyle )
{
theCurLineStyle = aStyle;
if ( theLeftLine.bIsSelected ) theLeftLine.SetStyle( aStyle );
if ( theRightLine.bIsSelected ) theRightLine.SetStyle( aStyle );
if ( theTopLine.bIsSelected ) theTopLine.SetStyle( aStyle );
if ( theBottomLine.bIsSelected ) theBottomLine.SetStyle( aStyle );
if ( theHorLine.bIsSelected ) theHorLine.SetStyle( aStyle );
if ( theVerLine.bIsSelected ) theVerLine.SetStyle( aStyle );
}
//------------------------------------------------------------------------
void SvxFrameSelector::SetCurLineColor( const Color& aColor )
{
theCurLineCol = aColor;
if ( theLeftLine.bIsSelected ) theLeftLine.aColor = aColor;
if ( theRightLine.bIsSelected ) theRightLine.aColor = aColor;
if ( theTopLine.bIsSelected ) theTopLine.aColor = aColor;
if ( theBottomLine.bIsSelected ) theBottomLine.aColor = aColor;
if ( theHorLine.bIsSelected ) theHorLine.aColor = aColor;
if ( theVerLine.bIsSelected ) theVerLine.aColor = aColor;
}
//------------------------------------------------------------------------
void SvxFrameSelector::DrawContents_Impl( OutputDevice& rVirDev )
{
/*
* Malen des Inhaltes:
*/
if ( eSel == SVX_FRMSELTYPE_TABLE )
{
Color aPrevLineColor = rVirDev.GetLineColor();
rVirDev.SetLineColor( Color( COL_LIGHTGRAY ) );
Color aPrevFillColor = rVirDev.GetFillColor();
rVirDev.SetFillColor( Color( COL_LIGHTGRAY ) );
Size aContentsSize =
Size( theVerLine.aStartPos.X() - theLeftLine.aStartPos.X() - 8,
theHorLine.aStartPos.Y() - theTopLine.aStartPos.Y() - 8 );
// links-oben
rVirDev.DrawRect( Rectangle( theLeftLine.aStartPos + Point( 4, 4 ),
aContentsSize ) );
// rechts-oben
rVirDev.DrawRect( Rectangle( theVerLine.aStartPos + Point( 4, 4 ),
aContentsSize ) );
// links-unten
rVirDev.DrawRect( Rectangle( theHorLine.aStartPos + Point( 4, 4 ),
aContentsSize ) );
// rechts-unten
rVirDev.DrawRect( Rectangle( theHorLine.aMidPos + Point( 4, 4 ),
aContentsSize ) );
rVirDev.SetLineColor( aPrevLineColor );
rVirDev.SetFillColor( aPrevFillColor);
}
else
{
Color aPrevLineColor = rVirDev.GetLineColor();
rVirDev.SetLineColor( Color( COL_LIGHTGRAY ) );
Color aPrevFillColor = rVirDev.GetFillColor();
rVirDev.SetFillColor( Color( COL_LIGHTGRAY ) );
Size aContentsSize =
Size( theRightLine.aStartPos.X() - theLeftLine.aStartPos.X() - 8 ,
theBottomLine.aStartPos.Y() - theLeftLine.aStartPos.Y() - 8 );
rVirDev.DrawRect( Rectangle( theLeftLine.aStartPos + Point( 4, 4 ),
aContentsSize ) );
/* symbolisierter Paragraph ist nicht gewuenscht - vielleicht spaeter mal wieder...
Size aContentsSize =
Size( theRightLine.aStartPos.X() - theLeftLine.aStartPos.X() - 8,
theBottomLine.aStartPos.Y() - theLeftLine.aStartPos.Y() - 13 );
rVirDev.DrawRect( Rectangle( theLeftLine.aStartPos + Point( 4, 4 ),
aContentsSize ) );
rVirDev.DrawRect( Rectangle( theLeftLine.aEndPos + Point( 4, -13 ),
Size( 20, 8 ) ) );
*/
/* -------------------------------------------------------------------
kann StarWriter noch nicht - vielleicht spaeter mal:
Size aContentsSize =
Size( theRightLine.aStartPos.X()
- theLeftLine.aStartPos.X()
- 8,
theHorLine.aStartPos.Y()
- theLeftLine.aStartPos.Y()
- 13 );
// oben
rVirDev.DrawRect( Rectangle( theLeftLine.aStartPos + Point(4,4),
aContentsSize ) );
rVirDev.DrawRect( Rectangle( theLeftLine.aMidPos + Point(4,-13),
Size(20,8) ) );
// unten
rVirDev.DrawRect( Rectangle( theLeftLine.aMidPos + Point(4,4),
aContentsSize ) );
rVirDev.DrawRect( Rectangle( theLeftLine.aEndPos + Point(4,-13),
Size(20,8) ) );
--------------------------------------------------------------------*/
}
}
//------------------------------------------------------------------------
void SvxFrameSelector::SelectLine( SvxFrameSelectorLine eNewLine, BOOL bSet )
{
VirtualDevice aVirDev;
Color aDrawColor(
( bSet && ( eNewLine != SVX_FRMSELLINE_NONE ) ) ? COL_BLACK : COL_WHITE );
long nX = theBmp.GetSizePixel().Width();
long nY = theBmp.GetSizePixel().Height();
long nXMid = theVerLine.aStartPos.X();
long nYMid = theHorLine.aStartPos.Y();
aVirDev.SetOutputSizePixel( theBmp.GetSizePixel() );
aVirDev.DrawBitmap( Point( 0, 0 ), theBmp );
switch ( eNewLine )
{
case SVX_FRMSELLINE_LEFT:
{
DrawSelArrow_Impl( aVirDev, Point( 13, 3 ), aDrawColor,
SVX_SELARROWTYPE_DOWN );
DrawSelArrow_Impl( aVirDev, Point( 13, nY - 8 ), aDrawColor,
SVX_SELARROWTYPE_UP );
theLeftLine.bIsSelected = bSet;
}
break;
case SVX_FRMSELLINE_RIGHT:
{
DrawSelArrow_Impl( aVirDev, Point( nX - 17, 3 ), aDrawColor,
SVX_SELARROWTYPE_DOWN );
DrawSelArrow_Impl( aVirDev, Point( nX - 17, nY - 8 ), aDrawColor,
SVX_SELARROWTYPE_UP );
theRightLine.bIsSelected = bSet;
}
break;
case SVX_FRMSELLINE_TOP:
{
DrawSelArrow_Impl( aVirDev, Point( 3, 13 ), aDrawColor,
SVX_SELARROWTYPE_RIGHT );
DrawSelArrow_Impl( aVirDev, Point( nX - 8, 13 ), aDrawColor,
SVX_SELARROWTYPE_LEFT );
theTopLine.bIsSelected = bSet;
}
break;
case SVX_FRMSELLINE_BOTTOM:
{
DrawSelArrow_Impl( aVirDev, Point( 3, nY - 17 ), aDrawColor,
SVX_SELARROWTYPE_RIGHT );
DrawSelArrow_Impl( aVirDev, Point( nX - 8, nY - 17 ), aDrawColor,
SVX_SELARROWTYPE_LEFT );
theBottomLine.bIsSelected = bSet;
}
break;
case SVX_FRMSELLINE_HOR:
if ( eSel == SVX_FRMSELTYPE_TABLE )
{
DrawSelArrow_Impl( aVirDev, Point( 3, nYMid - 2 ), aDrawColor,
SVX_SELARROWTYPE_RIGHT );
DrawSelArrow_Impl( aVirDev, Point( nX - 8, nYMid - 2 ), aDrawColor,
SVX_SELARROWTYPE_LEFT );
theHorLine.bIsSelected = bSet;
}
break;
case SVX_FRMSELLINE_VER:
if ( eSel == SVX_FRMSELTYPE_TABLE )
{
DrawSelArrow_Impl( aVirDev, Point( nXMid - 2, 3 ), aDrawColor,
SVX_SELARROWTYPE_DOWN);
DrawSelArrow_Impl( aVirDev, Point( nXMid - 2, nY - 8 ), aDrawColor,
SVX_SELARROWTYPE_UP );
theVerLine.bIsSelected = bSet;
}
break;
case SVX_FRMSELLINE_NONE:
{
// links
DrawSelArrow_Impl( aVirDev, Point( 13, 3 ), aDrawColor,
SVX_SELARROWTYPE_DOWN );
DrawSelArrow_Impl( aVirDev, Point( 13, nY - 8 ), aDrawColor,
SVX_SELARROWTYPE_UP );
// rechts
DrawSelArrow_Impl( aVirDev, Point( nX - 17, 3 ), aDrawColor,
SVX_SELARROWTYPE_DOWN );
DrawSelArrow_Impl( aVirDev, Point( nX - 17, nY - 8 ), aDrawColor,
SVX_SELARROWTYPE_UP );
// oben
DrawSelArrow_Impl( aVirDev, Point( 3, 13 ), aDrawColor,
SVX_SELARROWTYPE_RIGHT );
DrawSelArrow_Impl( aVirDev, Point( nX - 8, 13 ), aDrawColor,
SVX_SELARROWTYPE_LEFT );
// unten
DrawSelArrow_Impl( aVirDev, Point( 3, nY - 17 ), aDrawColor,
SVX_SELARROWTYPE_RIGHT );
DrawSelArrow_Impl( aVirDev, Point( nX - 8, nY - 17 ), aDrawColor,
SVX_SELARROWTYPE_LEFT );
if ( eSel == SVX_FRMSELTYPE_TABLE )
{
// horizontal
DrawSelArrow_Impl( aVirDev, Point( 3, nYMid-2 ), aDrawColor,
SVX_SELARROWTYPE_RIGHT );
DrawSelArrow_Impl( aVirDev, Point( nX - 8, nYMid - 2 ), aDrawColor,
SVX_SELARROWTYPE_LEFT );
// vertikal
DrawSelArrow_Impl( aVirDev, Point( nXMid - 2, 3 ),aDrawColor,
SVX_SELARROWTYPE_DOWN );
DrawSelArrow_Impl( aVirDev, Point( nXMid - 2, nY - 8 ), aDrawColor,
SVX_SELARROWTYPE_UP );
}
theLeftLine.bIsSelected =
theRightLine.bIsSelected =
theTopLine.bIsSelected =
theBottomLine.bIsSelected =
theHorLine.bIsSelected =
theVerLine.bIsSelected = FALSE;
}
}
theBmp = aVirDev.GetBitmap( Point( 0, 0 ), theBmp.GetSizePixel() );
Invalidate( INVALIDATE_NOERASE );
if(aSelectLink.IsSet())
aSelectLink.Call(0);
}
//------------------------------------------------------------------------
void SvxFrameSelector::DrawSelArrow_Impl(
OutputDevice& rDev, Point aPos, Color aCol, SvxSelArrowType eType )
{
Point aPtArray[5];
Color aPrevLineColor = rDev.GetLineColor();
Color aPrevFillColor = rDev.GetFillColor();
rDev.SetLineColor( aCol );
rDev.SetFillColor( aCol );
switch ( eType )
{
case SVX_SELARROWTYPE_LEFT:
aPtArray[0] = aPos + Point( 3, 0 );
aPtArray[1] = aPos + Point( 4, 4 );
aPtArray[2] = aPos + Point( 1, 1 );
aPtArray[3] = aPos + Point( 2, 3 );
aPtArray[4] = aPos + Point( 0, 2 );
break;
case SVX_SELARROWTYPE_RIGHT:
aPtArray[0] = aPos;
aPtArray[1] = aPos + Point( 1, 4 );
aPtArray[2] = aPos + Point( 2, 1 );
aPtArray[3] = aPos + Point( 3, 3 );
aPtArray[4] = aPos + Point( 4, 2 );
break;
case SVX_SELARROWTYPE_UP:
aPtArray[0] = aPos + Point( 0, 3 );
aPtArray[1] = aPos + Point( 4, 4 );
aPtArray[2] = aPos + Point( 1, 1 );
aPtArray[3] = aPos + Point( 3, 2 );
aPtArray[4] = aPos + Point( 2, 0 );
break;
case SVX_SELARROWTYPE_DOWN:
aPtArray[0] = aPos;
aPtArray[1] = aPos + Point( 4, 1 );
aPtArray[2] = aPos + Point( 1, 2 );
aPtArray[3] = aPos + Point( 3, 3 );
aPtArray[4] = aPos + Point( 2, 4 );
break;
}
rDev.DrawRect( Rectangle( aPtArray[0], aPtArray[1] ) );
rDev.DrawRect( Rectangle( aPtArray[2], aPtArray[3] ) );
rDev.DrawLine( aPtArray[4], aPtArray[4] );
rDev.SetLineColor( aPrevLineColor );
rDev.SetFillColor( aPrevFillColor );
}
//------------------------------------------------------------------------
void SvxFrameSelector::SetShadowPos( SvxFrameShadow eShadowPos )
{
eShadow = eShadowPos;
}
//------------------------------------------------------------------------
void SvxFrameSelector::ShowShadow()
{
VirtualDevice aVirDev;
Bitmap theFrameBmp;
Color aWhiteCol( COL_WHITE );
Color theDrawCol =
eShadow != SVX_FRMSHADOW_NONE ? theShadowCol : aWhiteCol;
long nX = theBmp.GetSizePixel().Width();
long nY = theBmp.GetSizePixel().Height();
Point theOldPos;
Rectangle theFrameRect = theBoundingRect;
Rectangle theEraseRect( Point( 16, 16 ), Size( nX - 31, nY - 31 ) );
aVirDev.SetOutputSizePixel( theBmp.GetSizePixel() );
aVirDev.DrawBitmap( Point( 0, 0 ), theBmp );
// Rahmen-Bitmap sichern
theFrameBmp = aVirDev.GetBitmap( theFrameRect.TopLeft(),
theFrameRect.GetSize() );
// aktuellen Schatten entfernen:
aVirDev.SetLineColor( aWhiteCol );
aVirDev.SetFillColor( aWhiteCol );
aVirDev.DrawRect( theEraseRect );
aVirDev.SetLineColor( theDrawCol );
aVirDev.SetFillColor( theDrawCol );
if ( eShadow != SVX_FRMSHADOW_NONE )
{
Point aDeltaPnt( 3, 3 );
switch ( eShadow )
{
case SVX_FRMSHADOW_TOP_RIGHT:
aDeltaPnt.Y() *= -1; break;
case SVX_FRMSHADOW_BOT_LEFT:
aDeltaPnt.X() *= -1;
break;
case SVX_FRMSHADOW_TOP_LEFT:
aDeltaPnt.X() *= -1; aDeltaPnt.Y() *= -1;
break;
}
Rectangle aTempRect( Point( theFrameRect.Left()+aDeltaPnt.X(),
theFrameRect.Top()+aDeltaPnt.Y() ),
theFrameRect.GetSize() );
aVirDev.DrawRect( aTempRect );
}
aVirDev.DrawBitmap( theFrameRect.TopLeft(), theFrameBmp );
theBmp = aVirDev.GetBitmap( Point( 0, 0 ), theBmp.GetSizePixel() );
Invalidate( INVALIDATE_NOERASE );
}
//------------------------------------------------------------------------
void SvxFrameSelector::SetShadowColor( const Color& aColor )
{
theShadowCol = aColor;
}
// -----------------------------------------------------------------------
Color SvxFrameSelector::GetShadowColor() const
{
return theShadowCol;
}
// -----------------------------------------------------------------------
SvxFrameShadow SvxFrameSelector::GetShadowPos() const
{
return eShadow;
}
// -----------------------------------------------------------------------
void SvxFrameSelector::Paint( const Rectangle& )
{
DrawBitmap( Point( 0, 0 ), theBmp );
}
// -----------------------------------------------------------------------
void SvxFrameSelector::MouseButtonDown( const MouseEvent& rMEvt )
{
if ( rMEvt.IsLeft() && ( rMEvt.GetClicks() == 1 ) )
{
CaptureMouse();
}
}
// -----------------------------------------------------------------------
void SvxFrameSelector::MouseButtonUp( const MouseEvent& rMEvt )
{
/* Verhalten bei Mausclicks:
* -------------------------
* o nur Einfachclicks
* o Shift-Einfachclick -> Mehrfachselektion
* o einzelne Linien:
* - ist die Linie bereits selektiert -> an/aus-Toggle
* - sonst -> an
* o Kreuzungspunkt vertikal/horizontal (Mitte)
* - ist eine oder keine Linie selektiert -> an
* - sonst -> an/aus-Toggle beide
* o Click auf die gleiche Linie -> Toggle SHOW/HIDE/DONT_CARE
*/
if ( rMEvt.IsLeft() )
{
Point aBtnUpPos( rMEvt.GetPosPixel() );
if ( !bIsClicked && !bIsDontCare )
{
bIsClicked = TRUE;
// wenn Linien auf DontCare sind, muessen diese auf HIDE
// gesetzt werden (ausser der aktuellen Linie)
if ( theLeftLine.theState == SVX_FRMLINESTATE_DONT_CARE &&
!aSpotLeft.IsInside( aBtnUpPos ) )
{
theLeftLine.SetStyle( SvxFrameLine::NO_LINE );
}
if ( theRightLine.theState == SVX_FRMLINESTATE_DONT_CARE &&
!aSpotRight.IsInside( aBtnUpPos ) )
{
theRightLine.SetStyle( SvxFrameLine::NO_LINE );
}
if ( theTopLine.theState == SVX_FRMLINESTATE_DONT_CARE &&
!aSpotTop.IsInside( aBtnUpPos ) )
{
theTopLine.SetStyle( SvxFrameLine::NO_LINE );
}
if ( theBottomLine.theState == SVX_FRMLINESTATE_DONT_CARE &&
!aSpotBottom.IsInside( aBtnUpPos ) )
{
theBottomLine.SetStyle( SvxFrameLine::NO_LINE );
}
if ( theVerLine.theState == SVX_FRMLINESTATE_DONT_CARE &&
!aSpotVer.IsInside( aBtnUpPos ) )
{
theVerLine.SetStyle( SvxFrameLine::NO_LINE );
}
if ( theHorLine.theState == SVX_FRMLINESTATE_DONT_CARE &&
!aSpotHor.IsInside( aBtnUpPos ) )
{
theHorLine.SetStyle( SvxFrameLine::NO_LINE );
}
}
if ( aSpotLeft.IsInside( aBtnUpPos ) )
{
LineClicked_Impl( theLeftLine, rMEvt.IsShift(),
( rMEvt.GetClicks() != 1 ) );
SelectLine( SVX_FRMSELLINE_LEFT );
}
else if ( aSpotRight.IsInside( aBtnUpPos ) )
{
LineClicked_Impl( theRightLine, rMEvt.IsShift(),
( rMEvt.GetClicks() != 1 ) );
SelectLine( SVX_FRMSELLINE_RIGHT );
}
else if ( aSpotTop.IsInside( aBtnUpPos ) )
{
LineClicked_Impl( theTopLine, rMEvt.IsShift(),
( rMEvt.GetClicks() != 1 ) );
SelectLine( SVX_FRMSELLINE_TOP );
}
else if ( aSpotBottom.IsInside( aBtnUpPos ) )
{
LineClicked_Impl( theBottomLine, rMEvt.IsShift(),
( rMEvt.GetClicks() != 1 ) );
SelectLine( SVX_FRMSELLINE_BOTTOM );
}
else if ( aSpotVer.IsInside( aBtnUpPos ) &&
aSpotHor.IsInside( aBtnUpPos ) )
{
if ( !theHorLine.bIsSelected || !theVerLine.bIsSelected )
{
theVerLine.aColor =
theHorLine.aColor = theCurLineCol;
theVerLine.SetStyle( theCurLineStyle );
theHorLine.SetStyle( theCurLineStyle );
if ( !rMEvt.IsShift() )
SelectLine( SVX_FRMSELLINE_NONE );
SelectLine( SVX_FRMSELLINE_VER );
SelectLine( SVX_FRMSELLINE_HOR );
}
else if ( theHorLine.bIsSelected && theVerLine.bIsSelected )
{
if ( !rMEvt.IsShift() )
SelectLine( SVX_FRMSELLINE_NONE );
SelectLine( SVX_FRMSELLINE_VER );
SelectLine( SVX_FRMSELLINE_HOR );
LineClicked_Impl( theVerLine, TRUE, ( rMEvt.GetClicks() != 1 ) );
LineClicked_Impl( theHorLine, TRUE, ( rMEvt.GetClicks() != 1 ) );
}
}
else if ( aSpotVer.IsInside( aBtnUpPos ) )
{
LineClicked_Impl( theVerLine, rMEvt.IsShift(),
( rMEvt.GetClicks() != 1 ) );
SelectLine( SVX_FRMSELLINE_VER );
}
else if ( aSpotHor.IsInside( aBtnUpPos ) )
{
LineClicked_Impl( theHorLine, rMEvt.IsShift(),
( rMEvt.GetClicks() != 1 ) );
SelectLine( SVX_FRMSELLINE_HOR );
}
ShowLines();
ReleaseMouse();
}
}
// -----------------------------------------------------------------------
void SvxFrameSelector::LineClicked_Impl( SvxFrameLine& aLine,
BOOL bShiftPressed,
BOOL bDoubleClick )
{
if ( aLine.bIsSelected )
{
int nMod = bIsDontCare ? 3 : 2;
aLine.theState = SvxFrameLineState(
( ( (int)aLine.theState ) + ( ( !bDoubleClick ) ? 1 : 2 ) ) % nMod );
switch ( aLine.theState )
{
case SVX_FRMLINESTATE_SHOW:
aLine.SetStyle( theCurLineStyle );
aLine.aColor = theCurLineCol;
break;
case SVX_FRMLINESTATE_HIDE:
aLine.SetStyle( SvxFrameLine::NO_LINE );
break;
case SVX_FRMLINESTATE_DONT_CARE:
aLine.theStyle = SvxFrameLine::THICK_LINE;
break;
}
}
else
{
aLine.theState = SVX_FRMLINESTATE_SHOW;
aLine.aColor = theCurLineCol;
aLine.SetStyle( theCurLineStyle );
}
if ( !bShiftPressed )
SelectLine( SVX_FRMSELLINE_NONE );
}
// -----------------------------------------------------------------------
BOOL SvxFrameSelector::IsAnyLineSet() const
{
if( theLeftLine.theState == SVX_FRMLINESTATE_SHOW ||
theRightLine.theState == SVX_FRMLINESTATE_SHOW ||
theTopLine.theState == SVX_FRMLINESTATE_SHOW ||
theBottomLine.theState == SVX_FRMLINESTATE_SHOW ||
theHorLine.theState == SVX_FRMLINESTATE_SHOW ||
theVerLine.theState == SVX_FRMLINESTATE_SHOW )
return TRUE;
else
return FALSE;
}