diff options
Diffstat (limited to 'freebsdtvision/lib/TFrame.cc')
-rw-r--r-- | freebsdtvision/lib/TFrame.cc | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/freebsdtvision/lib/TFrame.cc b/freebsdtvision/lib/TFrame.cc new file mode 100644 index 0000000..18dde0c --- /dev/null +++ b/freebsdtvision/lib/TFrame.cc @@ -0,0 +1,205 @@ +/* + * TFrame.cc + * + * Turbo Vision - Version 2.0 + * + * Copyright (c) 1994 by Borland International + * All Rights Reserved. + * + * Modified by Sergio Sigala <sergio@sigala.it> + */ + +#define Uses_TFrame +#define Uses_TDrawBuffer +#define Uses_TWindow +#define Uses_TRect +#define Uses_TPoint +#define Uses_TEvent +#include <tvision/tv.h> + +#include <string.h> + +#define cpFrame "\x01\x01\x02\x02\x03" + +TFrame::TFrame( const TRect& bounds ) : TView( bounds ) +{ + growMode = gfGrowHiX + gfGrowHiY; + eventMask |= evBroadcast | evMouseUp; +} + +void TFrame::draw() +{ + ushort cFrame, cTitle; + short f, i, l, width; + TDrawBuffer b; + + if( (state & sfDragging) != 0 ) + { + cFrame = 0x0505; + cTitle = 0x0005; + f = 0; + } + else if( (state & sfActive) == 0 ) + { + cFrame = 0x0101; + cTitle = 0x0002; + f = 0; + } + else + { + cFrame = 0x0503; + cTitle = 0x0004; + f = 9; + } + + cFrame = getColor(cFrame); + cTitle = getColor(cTitle); + + width = size.x; + l = width - 10; + + if( ( ((TWindow *)owner)->flags & (wfClose | wfZoom) ) != 0 ) + l -= 6; + frameLine( b, 0, f, uchar(cFrame) ); + if( ((TWindow *)owner)->number != wnNoNumber && + ((TWindow *)owner)->number < 10 + ) + { + l -= 4; + if( ( ((TWindow *)owner)->flags & wfZoom ) != 0 ) + i = 7; + else + i = 3; + b.putChar( width-i, ((TWindow *)owner)->number + '0' ); + } + + if( owner != 0 ) + { + const char *title = ((TWindow *)owner)->getTitle(l); + if( title != 0 ) + { + l = min( cstrlen(title), width - 10 ); + l = max( l, 0 ); + i = (width - l) >> 1; + b.putChar( i-1, ' ' ); + b.moveBuf( i, title, cTitle, l ); + b.putChar( i+l, ' ' ); + } + } + + if( (state & sfActive) != 0 ) + { + if( ( ((TWindow *)owner)->flags & wfClose ) != 0 ) + b.moveCStr( 2, closeIcon, cFrame ); + if( ( ((TWindow *)owner)->flags & wfZoom ) != 0 ) + { + TPoint minSize, maxSize; + owner->sizeLimits( minSize, maxSize ); + if( owner->size == maxSize ) + b.moveCStr( width-5, unZoomIcon, cFrame ); + else + b.moveCStr( width-5, zoomIcon, cFrame ); + } + } + + writeLine( 0, 0, size.x, 1, b ); + for( i = 1; i <= size.y - 2; i++ ) + { + frameLine( b, i, f + 3, cFrame ); + writeLine( 0, i, size.x, 1, b ); + } + frameLine( b, size.y - 1, f + 6, cFrame ); + if( (state & sfActive) != 0 ) + if( ( ((TWindow *)owner)->flags & wfGrow ) != 0 ) + b.moveCStr( width-2, dragIcon, cFrame ); + writeLine( 0, size.y - 1, size.x, 1, b ); +} + +TPalette& TFrame::getPalette() const +{ + static TPalette palette( cpFrame, sizeof( cpFrame )-1 ); + return palette; +} + +void TFrame::dragWindow( TEvent& event, uchar mode ) +{ + TRect limits; + TPoint min, max; + + limits = owner->owner->getExtent(); + owner->sizeLimits( min, max ); + owner->dragView( event, owner->dragMode | mode, limits, min, max ); + clearEvent( event ); +} + +void TFrame::handleEvent( TEvent& event ) +{ + TView::handleEvent(event); + if( event.what == evMouseDown ) + { + TPoint mouse = makeLocal( event.mouse.where ); + if( mouse.y == 0 ) + { + if( (((TWindow *)owner)->flags & wfClose ) != 0 && + (state & sfActive) && + mouse.x >= 2 && + mouse.x <= 4 + ) + { + while(mouseEvent( event, evMouse )) + ; + mouse = makeLocal( event.mouse.where ); + if( mouse.y == 0 && mouse.x >= 2 && mouse.x <= 4 ) + { + event.what = evCommand; + event.message.command = cmClose; + event.message.infoPtr = owner; + putEvent( event ); + clearEvent( event ); + } + } + else + if( (((TWindow *)owner)->flags & wfZoom) != 0 && + (state & sfActive) && + ((mouse.x >= size.x - 5 && mouse.x <= size.x - 3) || + (event.mouse.eventFlags & meDoubleClick) + ) + ) + { + event.what = evCommand; + event.message.command = cmZoom; + event.message.infoPtr = owner; + putEvent( event ); + clearEvent( event ); + } + else + if( ( ((TWindow *)owner)->flags & wfMove ) != 0 ) + dragWindow( event, dmDragMove ); + } + else + if( (mouse.x >= size.x - 2 && mouse.y >= size.y - 1 ) && + (state & sfActive)) + if( ( ((TWindow *)owner)->flags & wfGrow ) != 0 ) + dragWindow( event, dmDragGrow ); + } +} + +void TFrame::setState( ushort aState, Boolean enable ) +{ + TView::setState( aState, enable ); + if( (aState & (sfActive | sfDragging)) != 0 ) + drawView(); +} + +#if !defined(NO_STREAMABLE) + +TStreamable *TFrame::build() +{ + return new TFrame( streamableInit ); +} + +TFrame::TFrame( StreamableInit ) : TView( streamableInit ) +{ +} + +#endif |