summaryrefslogtreecommitdiff
path: root/freebsdtvision/lib/TButton.cc
diff options
context:
space:
mode:
Diffstat (limited to 'freebsdtvision/lib/TButton.cc')
-rw-r--r--freebsdtvision/lib/TButton.cc323
1 files changed, 323 insertions, 0 deletions
diff --git a/freebsdtvision/lib/TButton.cc b/freebsdtvision/lib/TButton.cc
new file mode 100644
index 0000000..3a827c0
--- /dev/null
+++ b/freebsdtvision/lib/TButton.cc
@@ -0,0 +1,323 @@
+/*
+ * TButton.cc
+ *
+ * Turbo Vision - Version 2.0
+ *
+ * Copyright (c) 1994 by Borland International
+ * All Rights Reserved.
+ *
+ * Modified by Sergio Sigala <sergio@sigala.it>
+ */
+
+#define Uses_TButton
+#define Uses_TDrawBuffer
+#define Uses_TEvent
+#define Uses_TRect
+#define Uses_TGroup
+#define Uses_opstream
+#define Uses_ipstream
+#include <tvision/tv.h>
+
+#include <ctype.h>
+#include <string.h>
+
+const
+
+ int cmGrabDefault = 61,
+ cmReleaseDefault = 62;
+
+#define cpButton "\x0A\x0B\x0C\x0D\x0E\x0E\x0E\x0F"
+
+TButton::TButton( const TRect& bounds,
+ const char *aTitle,
+ ushort aCommand,
+ ushort aFlags) :
+ TView( bounds ),
+ title( newStr( aTitle ) ),
+ command( aCommand ),
+ flags( aFlags ),
+ amDefault( Boolean( (aFlags & bfDefault) != 0 ) )
+{
+ options |= ofSelectable | ofFirstClick | ofPreProcess | ofPostProcess;
+ eventMask |= evBroadcast;
+ if( !commandEnabled(aCommand) )
+ state |= sfDisabled;
+}
+
+TButton::~TButton()
+{
+ delete (char *)title;
+}
+
+void TButton::draw()
+{
+ drawState(False);
+}
+
+void TButton::drawTitle( TDrawBuffer &b,
+ int s,
+ int i,
+ ushort cButton,
+ Boolean down
+ )
+{
+ int l, scOff;
+ if( (flags & bfLeftJust) != 0 )
+ l = 1;
+ else
+ {
+ l = (s - cstrlen(title) - 1)/2;
+ if( l < 1 )
+ l = 1;
+ }
+ b.moveCStr( i+l, title, cButton );
+
+ if( showMarkers == True && !down )
+ {
+ if( (state & sfSelected) != 0 )
+ scOff = 0;
+ else if( amDefault )
+ scOff = 2;
+ else
+ scOff = 4;
+ b.putChar( 0, specialChars[scOff] );
+ b.putChar( s, specialChars[scOff+1] );
+ }
+}
+
+void TButton::drawState(Boolean down)
+{
+ ushort cButton, cShadow;
+ char ch = ' ';
+ int i;
+ TDrawBuffer b;
+
+ if( (state & sfDisabled) != 0 )
+ cButton = getColor(0x0404);
+ else
+ {
+ cButton = getColor(0x0501);
+ if( (state & sfActive) != 0 )
+ if( (state & sfSelected) != 0 )
+ cButton = getColor(0x0703);
+ else if( amDefault )
+ cButton = getColor(0x0602);
+ }
+ cShadow = getColor(8);
+ int s = size.x-1;
+ int T = size.y / 2 - 1;
+
+ for( int y = 0; y <= size.y-2; y++ )
+ {
+ b.moveChar( 0, ' ', cButton, size.x );
+ b.putAttribute( 0, cShadow );
+ if( down )
+ {
+ b.putAttribute( 1, cShadow );
+ ch = ' ';
+ i = 2;
+ }
+ else
+ {
+ b.putAttribute( s, cShadow );
+ if( showMarkers == True )
+ ch = ' ';
+ else
+ {
+ if( y == 0 )
+ b.putChar( s, shadows[0] );
+ else
+ b.putChar( s, shadows[1] );
+ ch = shadows[2];
+ }
+ i = 1;
+ }
+
+ if( y == T && title != 0 )
+ drawTitle( b, s, i, cButton, down );
+
+ if( showMarkers && !down )
+ {
+ b.putChar( 1, markers[0] );
+ b.putChar( s-1, markers[1] );
+ }
+ writeLine( 0, y, size.x, 1, b );
+ }
+ b.moveChar( 0, ' ', cShadow, 2 );
+ b.moveChar( 2, ch, cShadow, s-1 );
+ writeLine( 0, size.y-1, size.x, 1, b );
+}
+
+TPalette& TButton::getPalette() const
+{
+ static TPalette palette( cpButton, sizeof( cpButton )-1 );
+ return palette;
+}
+
+void TButton::handleEvent( TEvent& event )
+{
+ TPoint mouse;
+ TRect clickRect;
+
+ clickRect = getExtent();
+ clickRect.a.x++;
+ clickRect.b.x--;
+ clickRect.b.y--;
+
+ if( event.what == evMouseDown )
+ {
+ mouse = makeLocal( event.mouse.where );
+ if( !clickRect.contains(mouse) )
+ clearEvent( event );
+ }
+ if (flags & bfGrabFocus)
+ TView::handleEvent(event);
+
+ char c = hotKey( title );
+ switch( event.what )
+ {
+ case evMouseDown:
+ if ((state & sfDisabled) == 0)
+ {
+ clickRect.b.x++;
+ Boolean down = False;
+ do {
+ mouse = makeLocal( event.mouse.where );
+ if( down != clickRect.contains( mouse ) )
+ {
+ down = Boolean( !down );
+ drawState( down );
+ }
+ } while( mouseEvent( event, evMouseMove ) );
+ if( down )
+ {
+ press();
+ drawState( False );
+ }
+ }
+ clearEvent( event );
+ break;
+
+ case evKeyDown:
+ if( event.keyDown.keyCode == getAltCode(c) ||
+ ( owner->phase == phPostProcess &&
+ c != 0 &&
+ toupper(event.keyDown.charScan.charCode) == c
+ ) ||
+ ( (state & sfFocused) != 0 &&
+ event.keyDown.charScan.charCode == ' '
+ )
+ )
+ {
+ press();
+ clearEvent( event );
+ }
+ break;
+
+ case evBroadcast:
+ switch( event.message.command )
+ {
+ case cmDefault:
+ if( amDefault && !(state & sfDisabled) )
+ {
+ press();
+ clearEvent(event);
+ }
+ break;
+
+ case cmGrabDefault:
+ case cmReleaseDefault:
+ if( (flags & bfDefault) != 0 )
+ {
+ amDefault = Boolean(event.message.command == cmReleaseDefault);
+ drawView();
+ }
+ break;
+
+ case cmCommandSetChanged:
+ setState(sfDisabled,Boolean(!commandEnabled(command)));
+ drawView();
+ break;
+ }
+ break;
+ }
+}
+
+void TButton::makeDefault( Boolean enable )
+{
+ if( (flags & bfDefault) == 0 )
+ {
+ message( owner,
+ evBroadcast,
+ (enable == True) ? cmGrabDefault : cmReleaseDefault,
+ this
+ );
+ amDefault = enable;
+ drawView();
+ }
+}
+
+void TButton::setState( ushort aState, Boolean enable )
+{
+ TView::setState(aState, enable);
+ if( aState & (sfSelected | sfActive) )
+#ifndef __UNPATCHED
+ {
+ if(!enable)
+ { // BUG FIX - EFW - Thu 10/19/95
+ state &= ~sfFocused;
+ makeDefault(False);
+ }
+ drawView();
+ }
+#else
+ drawView();
+#endif
+ if( (aState & sfFocused) != 0 )
+ makeDefault( enable );
+}
+
+void TButton::press()
+{
+ message( owner, evBroadcast, cmRecordHistory, 0 );
+ if( (flags & bfBroadcast) != 0 )
+ message( owner, evBroadcast, command, this );
+ else
+ {
+ TEvent e;
+ e.what = evCommand;
+ e.message.command = command;
+ e.message.infoPtr = this;
+ putEvent( e );
+ }
+}
+
+#if !defined(NO_STREAMABLE)
+
+void TButton::write( opstream& os )
+{
+ TView::write( os );
+ os.writeString( title );
+ os << command << flags << (int)amDefault;
+}
+
+void *TButton::read( ipstream& is )
+{
+ TView::read( is );
+ title = is.readString();
+ int temp;
+ is >> command >> flags >> temp;
+ amDefault = Boolean(temp);
+ if( TButton::commandEnabled( command ) )
+ state &= ~sfDisabled;
+ else
+ state |= sfDisabled;
+ return this;
+}
+
+TStreamable *TButton::build()
+{
+ return new TButton( streamableInit );
+}
+
+#endif