diff options
Diffstat (limited to 'tools/inc/tools/gen.hxx')
-rw-r--r-- | tools/inc/tools/gen.hxx | 669 |
1 files changed, 669 insertions, 0 deletions
diff --git a/tools/inc/tools/gen.hxx b/tools/inc/tools/gen.hxx new file mode 100644 index 000000000000..e01eb98842c2 --- /dev/null +++ b/tools/inc/tools/gen.hxx @@ -0,0 +1,669 @@ +/************************************************************************* + * + * 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: gen.hxx,v $ + * $Revision: 1.4 $ + * + * 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. + * + ************************************************************************/ +#ifndef _SV_GEN_HXX +#define _SV_GEN_HXX + +#include "tools/toolsdllapi.h" +#include <tools/solar.h> + +#include <limits.h> + +class SvStream; + +// -------- +// - Pair - +// -------- + +class Pair +{ +public: + long nA; + long nB; + + Pair(); + Pair( long nA, long nB ); + + long A() const { return nA; } + long B() const { return nB; } + + long& A() { return nA; } + long& B() { return nB; } + + BOOL operator == ( const Pair& rPair ) const; + BOOL operator != ( const Pair& rPair ) const; + + TOOLS_DLLPUBLIC friend SvStream& operator>>( SvStream& rIStream, Pair& rPair ); + TOOLS_DLLPUBLIC friend SvStream& operator<<( SvStream& rOStream, const Pair& rPair ); +}; + +inline Pair::Pair() +{ + nA = nB = 0; +} + +inline Pair::Pair( long _nA, long _nB ) +{ + Pair::nA = _nA; + Pair::nB = _nB; +} + +inline BOOL Pair::operator == ( const Pair& rPair ) const +{ + return ((nA == rPair.nA) && (nB == rPair.nB)); +} + +inline BOOL Pair::operator != ( const Pair& rPair ) const +{ + return ((nA != rPair.nA) || (nB != rPair.nB)); +} + +// --------- +// - Point - +// --------- + +class Point : public Pair +{ +public: + Point(); + Point( long nX, long nY ); + + long X() const { return nA; } + long Y() const { return nB; } + + long& X() { return nA; } + long& Y() { return nB; } + + void Move( long nHorzMove, long nVertMove ); + BOOL IsAbove( const Point& rPoint ) const; + BOOL IsBelow( const Point& rPoint ) const; + BOOL IsLeft( const Point& rPoint ) const; + BOOL IsRight( const Point& rPoint ) const; + + Point& operator += ( const Point& rPoint ); + Point& operator -= ( const Point& rPoint ); + Point& operator *= ( const long nVal ); + Point& operator /= ( const long nVal ); + +#ifdef __BORLANDC__ + friend Point operator+( const Point &rVal1, const Point &rVal2 ); + friend Point operator-( const Point &rVal1, const Point &rVal2 ); + friend Point operator*( const Point &rVal1, const long nVal2 ); + friend Point operator/( const Point &rVal1, const long nVal2 ); +#else + friend inline Point operator+( const Point &rVal1, const Point &rVal2 ); + friend inline Point operator-( const Point &rVal1, const Point &rVal2 ); + friend inline Point operator*( const Point &rVal1, const long nVal2 ); + friend inline Point operator/( const Point &rVal1, const long nVal2 ); +#endif + + long getX() const { return X(); } + long getY() const { return Y(); } + void setX(long nX) { X() = nX; } + void setY(long nY) { Y() = nY; } +}; + +inline Point::Point() +{ +} + +inline Point::Point( long nX, long nY ) : Pair( nX, nY ) +{ +} + +inline void Point::Move( long nHorzMove, long nVertMove ) +{ + nA += nHorzMove; + nB += nVertMove; +} + +inline BOOL Point::IsAbove( const Point& rPoint ) const +{ + return (nB > rPoint.nB); +} + +inline BOOL Point::IsBelow( const Point& rPoint ) const +{ + return (nB < rPoint.nB); +} + +inline BOOL Point::IsLeft( const Point& rPoint ) const +{ + return (nA < rPoint.nA); +} + +inline BOOL Point::IsRight( const Point& rPoint ) const +{ + return (nA > rPoint.nA); +} + +inline Point& Point::operator += ( const Point& rPoint ) +{ + nA += rPoint.nA; + nB += rPoint.nB; + return *this; +} + +inline Point& Point::operator -= ( const Point& rPoint ) +{ + nA -= rPoint.nA; + nB -= rPoint.nB; + return *this; +} + +inline Point& Point::operator *= ( const long nVal ) +{ + nA *= nVal; + nB *= nVal; + return *this; +} + +inline Point& Point::operator /= ( const long nVal ) +{ + nA /= nVal; + nB /= nVal; + return *this; +} + +inline Point operator+( const Point &rVal1, const Point &rVal2 ) +{ + return Point( rVal1.nA+rVal2.nA, rVal1.nB+rVal2.nB ); +} + +inline Point operator-( const Point &rVal1, const Point &rVal2 ) +{ + return Point( rVal1.nA-rVal2.nA, rVal1.nB-rVal2.nB ); +} + +inline Point operator*( const Point &rVal1, const long nVal2 ) +{ + return Point( rVal1.nA*nVal2, rVal1.nB*nVal2 ); +} + +inline Point operator/( const Point &rVal1, const long nVal2 ) +{ + return Point( rVal1.nA/nVal2, rVal1.nB/nVal2 ); +} + +// -------- +// - Size - +// -------- + +class Size : public Pair +{ +public: + Size(); + Size( long nWidth, long nHeight ); + + long Width() const { return nA; } + long Height() const { return nB; } + + long& Width() { return nA; } + long& Height() { return nB; } + + long getWidth() const { return Width(); } + long getHeight() const { return Height(); } + void setWidth(long nWidth) { Width() = nWidth; } + void setHeight(long nHeight) { Height() = nHeight; } +}; + +inline Size::Size() +{ +} + +inline Size::Size( long nWidth, long nHeight ) : + Pair( nWidth, nHeight ) +{ +} + +// --------- +// - Range - +// --------- + +#define RANGE_MIN LONG_MIN +#define RANGE_MAX LONG_MAX + +class Range : public Pair +{ +public: + Range(); + Range( long nMin, long nMax ); + + long Min() const { return nA; } + long Max() const { return nB; } + long Len() const { return nB - nA + 1; } + + long& Min() { return nA; } + long& Max() { return nB; } + + BOOL IsInside( long nIs ) const; + + void Justify(); +}; + +inline Range::Range() +{ +} + +inline Range::Range( long nMin, long nMax ) : Pair( nMin, nMax ) +{ +} + +inline BOOL Range::IsInside( long nIs ) const +{ + return ((nA <= nIs) && (nIs <= nB )); +} + +inline void Range::Justify() +{ + if ( nA > nB ) + { + long nHelp = nA; + nA = nB; + nB = nHelp; + } +} + +// ------------- +// - Selection - +// ------------- + +#define SELECTION_MIN LONG_MIN +#define SELECTION_MAX LONG_MAX + +class Selection : public Pair +{ +public: + Selection(); + Selection( long nPos ); + Selection( long nMin, long nMax ); + + long Min() const { return nA; } + long Max() const { return nB; } + long Len() const { return nB - nA; } + + long& Min() { return nA; } + long& Max() { return nB; } + + BOOL IsInside( long nIs ) const; + + void Justify(); + + BOOL operator !() const { return !Len(); } + + long getMin() const { return Min(); } + long getMax() const { return Max(); } + void setMin(long nMin) { Min() = nMin; } + void setMax(long nMax) { Max() = nMax; } +}; + +inline Selection::Selection() +{ +} + +inline Selection::Selection( long nPos ) : Pair( nPos, nPos ) +{ +} + +inline Selection::Selection( long nMin, long nMax ) : + Pair( nMin, nMax ) +{ +} + +inline BOOL Selection::IsInside( long nIs ) const +{ + return ((nA <= nIs) && (nIs < nB )); +} + +inline void Selection::Justify() +{ + if ( nA > nB ) + { + long nHelp = nA; + nA = nB; + nB = nHelp; + } +} + +// ------------- +// - Rectangle - +// ------------- + +#define RECT_EMPTY ((short)-32767) + +class TOOLS_DLLPUBLIC Rectangle +{ +public: + long nLeft; + long nTop; + long nRight; + long nBottom; + + Rectangle(); + Rectangle( const Point& rLT, const Point& rRB ); + Rectangle( long nLeft, long nTop, + long nRight, long nBottom ); + Rectangle( const Point& rLT, const Size& rSize ); + + long Left() const { return nLeft; } + long Right() const { return nRight; } + long Top() const { return nTop; } + long Bottom() const { return nBottom; } + + long& Left() { return nLeft; } + long& Right() { return nRight; } + long& Top() { return nTop; } + long& Bottom() { return nBottom; } + + inline Point TopLeft() const; + Point TopRight() const; + Point TopCenter() const; + Point BottomLeft() const; + Point BottomRight() const; + Point BottomCenter() const; + Point LeftCenter() const; + Point RightCenter() const; + Point Center() const; + + void Move( long nHorzMove, long nVertMove ); + inline void SetPos( const Point& rPoint ); + void SetSize( const Size& rSize ); + inline Size GetSize() const; + + long GetWidth() const; + long GetHeight() const; + + Rectangle& Union( const Rectangle& rRect ); + Rectangle& Intersection( const Rectangle& rRect ); + Rectangle GetUnion( const Rectangle& rRect ) const; + Rectangle GetIntersection( const Rectangle& rRect ) const; + + void Justify(); + + BOOL IsInside( const Point& rPOINT ) const; + BOOL IsInside( const Rectangle& rRect ) const; + BOOL IsOver( const Rectangle& rRect ) const; + + void SetEmpty() { nRight = nBottom = RECT_EMPTY; } + BOOL IsEmpty() const; + + BOOL operator == ( const Rectangle& rRect ) const; + BOOL operator != ( const Rectangle& rRect ) const; + + Rectangle& operator += ( const Point& rPt ); + Rectangle& operator -= ( const Point& rPt ); + +#ifdef __BORLANDC__ + friend Rectangle operator + ( const Rectangle& rRect, const Point& rPt ); + friend Rectangle operator - ( const Rectangle& rRect, const Point& rPt ); +#else + friend inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt ); + friend inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt ); +#endif + + TOOLS_DLLPUBLIC friend SvStream& operator>>( SvStream& rIStream, Rectangle& rRect ); + TOOLS_DLLPUBLIC friend SvStream& operator<<( SvStream& rOStream, const Rectangle& rRect ); + + // ONE + long getX() const { return nLeft; } + long getY() const { return nTop; } + long getWidth() const { return nRight - nLeft; } + long getHeight() const { return nBottom - nTop; } + void setX( long n ) { nRight += n-nLeft; nLeft = n; } + void setY( long n ) { nBottom += n-nTop; nTop = n; } + void setWidth( long n ) { nRight = nLeft + n; } + void setHeight( long n ) { nBottom = nTop + n; } +}; + +inline Rectangle::Rectangle() +{ + nLeft = nTop = 0; + nRight = nBottom = RECT_EMPTY; +} + +inline Rectangle::Rectangle( const Point& rLT, const Point& rRB ) +{ + nLeft = rLT.X(); + nTop = rLT.Y(); + nRight = rRB.X(); + nBottom = rRB.Y(); +} + +inline Rectangle::Rectangle( long _nLeft, long _nTop, + long _nRight, long _nBottom ) +{ + nLeft = _nLeft; + nTop = _nTop; + nRight = _nRight; + nBottom = _nBottom; +} + +inline Rectangle::Rectangle( const Point& rLT, const Size& rSize ) +{ + nLeft = rLT.X(); + nTop = rLT.Y(); + nRight = rSize.Width() ? nLeft+rSize.Width()-1 : RECT_EMPTY; + nBottom = rSize.Height() ? nTop+rSize.Height()-1 : RECT_EMPTY; +} + +inline BOOL Rectangle::IsEmpty() const +{ + return ((nRight == RECT_EMPTY) || (nBottom == RECT_EMPTY)); +} + +inline Point Rectangle::TopLeft() const +{ + return Point( nLeft, nTop ); +} + +inline Point Rectangle::TopRight() const +{ + return Point( (nRight == RECT_EMPTY) ? nLeft : nRight, nTop ); +} + +inline Point Rectangle::BottomLeft() const +{ + return Point( nLeft, (nBottom == RECT_EMPTY) ? nTop : nBottom ); +} + +inline Point Rectangle::BottomRight() const +{ + return Point( (nRight == RECT_EMPTY) ? nLeft : nRight, + (nBottom == RECT_EMPTY) ? nTop : nBottom ); +} + +inline Point Rectangle::TopCenter() const +{ + if ( IsEmpty() ) + return Point( nLeft, nTop ); + else + return Point( Min( nLeft, nRight ) + Abs( (nRight - nLeft)/2 ), + Min( nTop, nBottom) ); +} + +inline Point Rectangle::BottomCenter() const +{ + if ( IsEmpty() ) + return Point( nLeft, nTop ); + else + return Point( Min( nLeft, nRight ) + Abs( (nRight - nLeft)/2 ), + Max( nTop, nBottom) ); +} + +inline Point Rectangle::LeftCenter() const +{ + if ( IsEmpty() ) + return Point( nLeft, nTop ); + else + return Point( Min( nLeft, nRight ), nTop + (nBottom - nTop)/2 ); +} + +inline Point Rectangle::RightCenter() const +{ + if ( IsEmpty() ) + return Point( nLeft, nTop ); + else + return Point( Max( nLeft, nRight ), nTop + (nBottom - nTop)/2 ); +} + +inline Point Rectangle::Center() const +{ + if ( IsEmpty() ) + return Point( nLeft, nTop ); + else + return Point( nLeft+(nRight-nLeft)/2 , nTop+(nBottom-nTop)/2 ); +} + +inline void Rectangle::Move( long nHorzMove, long nVertMove ) +{ + nLeft += nHorzMove; + nTop += nVertMove; + if ( nRight != RECT_EMPTY ) + nRight += nHorzMove; + if ( nBottom != RECT_EMPTY ) + nBottom += nVertMove; +} + +inline void Rectangle::SetPos( const Point& rPoint ) +{ + if ( nRight != RECT_EMPTY ) + nRight += rPoint.X() - nLeft; + if ( nBottom != RECT_EMPTY ) + nBottom += rPoint.Y() - nTop; + nLeft = rPoint.X(); + nTop = rPoint.Y(); +} + +inline long Rectangle::GetWidth() const +{ + long n; + if ( nRight == RECT_EMPTY ) + n = 0; + else + { + n = nRight - nLeft; + if( n < 0 ) + n--; + else + n++; + } + + return n; +} + +inline long Rectangle::GetHeight() const +{ + long n; + if ( nBottom == RECT_EMPTY ) + n = 0; + else + { + n = nBottom - nTop; + if ( n < 0 ) + n--; + else + n++; + } + + return n; +} + +inline Size Rectangle::GetSize() const +{ + return Size( GetWidth(), GetHeight() ); +} + +inline Rectangle Rectangle::GetUnion( const Rectangle& rRect ) const +{ + Rectangle aTmpRect( *this ); + return aTmpRect.Union( rRect ); +} + +inline Rectangle Rectangle::GetIntersection( const Rectangle& rRect ) const +{ + Rectangle aTmpRect( *this ); + return aTmpRect.Intersection( rRect ); +} + +inline BOOL Rectangle::operator == ( const Rectangle& rRect ) const +{ + return ((nLeft == rRect.nLeft ) && + (nTop == rRect.nTop ) && + (nRight == rRect.nRight ) && + (nBottom == rRect.nBottom )); +} + +inline BOOL Rectangle::operator != ( const Rectangle& rRect ) const +{ + return ((nLeft != rRect.nLeft ) || + (nTop != rRect.nTop ) || + (nRight != rRect.nRight ) || + (nBottom != rRect.nBottom )); +} + +inline Rectangle& Rectangle::operator +=( const Point& rPt ) +{ + nLeft += rPt.X(); + nTop += rPt.Y(); + if ( nRight != RECT_EMPTY ) + nRight += rPt.X(); + if ( nBottom != RECT_EMPTY ) + nBottom += rPt.Y(); + return *this; +} + +inline Rectangle& Rectangle::operator -= ( const Point& rPt ) +{ + nLeft -= rPt.X(); + nTop -= rPt.Y(); + if ( nRight != RECT_EMPTY ) + nRight -= rPt.X(); + if ( nBottom != RECT_EMPTY ) + nBottom -= rPt.Y(); + return *this; +} + +inline Rectangle operator + ( const Rectangle& rRect, const Point& rPt ) +{ + Rectangle aRect( rRect.nLeft + rPt.X(), rRect.nTop + rPt.Y(), + (rRect.nRight == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight + rPt.X(), + (rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom + rPt.Y() ); + return aRect; +} + +inline Rectangle operator - ( const Rectangle& rRect, const Point& rPt ) +{ + Rectangle aRect( rRect.nLeft - rPt.X(), + rRect.nTop - rPt.Y(), + (rRect.nRight == RECT_EMPTY) ? RECT_EMPTY : rRect.nRight - rPt.X(), + (rRect.nBottom == RECT_EMPTY) ? RECT_EMPTY : rRect.nBottom - rPt.Y() ); + return aRect; +} + +#endif // _GEN_HXX |