summaryrefslogtreecommitdiff
path: root/freebsdtvision/lib/stddlg.cc
diff options
context:
space:
mode:
Diffstat (limited to 'freebsdtvision/lib/stddlg.cc')
-rw-r--r--freebsdtvision/lib/stddlg.cc324
1 files changed, 324 insertions, 0 deletions
diff --git a/freebsdtvision/lib/stddlg.cc b/freebsdtvision/lib/stddlg.cc
new file mode 100644
index 0000000..427967a
--- /dev/null
+++ b/freebsdtvision/lib/stddlg.cc
@@ -0,0 +1,324 @@
+/*
+ * stddlg.cc
+ *
+ * Turbo Vision - Version 2.0
+ *
+ * Copyright (c) 1994 by Borland International
+ * All Rights Reserved.
+ *
+ * Modified by Sergio Sigala <sergio@sigala.it>
+ */
+
+#define Uses_MsgBox
+#define Uses_TKeys
+#define Uses_TFileInputLine
+#define Uses_TEvent
+#define Uses_TSortedListBox
+#define Uses_TSearchRec
+#define Uses_TFileInfoPane
+#define Uses_TDrawBuffer
+#define Uses_TFileDialog
+#define Uses_TSortedCollection
+#include <tvision/tv.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+void fexpand( char * );
+
+#define cpInfoPane "\x1E"
+
+TFileInputLine::TFileInputLine( const TRect& bounds, short aMaxLen ) :
+ TInputLine( bounds, aMaxLen )
+{
+ eventMask |= evBroadcast;
+}
+
+void TFileInputLine::handleEvent( TEvent& event )
+{
+ TInputLine::handleEvent(event);
+ if( event.what == evBroadcast &&
+ event.message.command == cmFileFocused &&
+ !(state & sfSelected)
+ )
+ {
+#ifndef __UNPATCHED
+ // Prevents incorrect display in the input line if wildCard has
+ // already been expanded.
+ if( (((TSearchRec *)event.message.infoPtr)->attr & FA_DIREC) != 0 )
+ {
+ strcpy( data, ((TFileDialog *)owner)->wildCard );
+ if(!strchr(data, ':') && !strchr(data, '/'))
+ {
+ strcpy( data, ((TSearchRec *)event.message.infoPtr)->name );
+ strcat( data, "/" );
+ strcat( data, ((TFileDialog *)owner)->wildCard );
+ }
+ else
+ {
+ // Insert "<name>\\" between last name or wildcard and last '/'
+ fexpand(data); // Insure complete expansion to begin with
+ char *tmp = strrchr(data, '/') + 1;
+ char *nm = ((TSearchRec *)event.message.infoPtr)->name;
+ memmove(tmp + strlen(nm) + 1, tmp, strlen(tmp) + 1);
+ memcpy(tmp, nm, strlen(nm));
+ *(tmp + strlen(nm)) = '/';
+ fexpand(data); // Expand again incase it was '..'.
+ }
+ }
+#else
+ if( (((TSearchRec *)event.message.infoPtr)->attr & FA_DIREC) != 0 )
+ {
+ strcpy( data, ((TSearchRec *)event.message.infoPtr)->name );
+ strcat( data, "/" );
+ strcat( data, ((TFileDialog *)owner)->wildCard );
+ }
+#endif
+ else
+ strcpy( data, ((TSearchRec *)event.message.infoPtr)->name );
+ drawView();
+ }
+}
+
+TSortedListBox::TSortedListBox( const TRect& bounds,
+ ushort aNumCols,
+ TScrollBar *aScrollBar) :
+ TListBox(bounds, aNumCols, aScrollBar),
+ shiftState( 0 ),
+ searchPos( -1 )
+{
+ showCursor();
+ setCursor(1, 0);
+}
+
+static Boolean equal( const char *s1, const char *s2, ushort count)
+{
+ /* SS: use a standard function */
+
+ return Boolean( strncasecmp( s1, s2, count ) == 0 );
+}
+
+void TSortedListBox::handleEvent(TEvent& event)
+{
+ char curString[256], newString[256];
+ void* k;
+ int value;
+ short oldPos, oldValue;
+
+ oldValue = focused;
+ TListBox::handleEvent( event );
+ if( oldValue != focused ||
+ ( event.what == evBroadcast &&
+ event.message.command == cmReleasedFocus )
+ )
+ searchPos = -1;
+ if( event.what == evKeyDown )
+ {
+ if( event.keyDown.charScan.charCode != 0 )
+ {
+ value = focused;
+ if( value < range )
+ getText( curString, (short) value, 255 );
+ else
+ *curString = EOS;
+ oldPos = searchPos;
+ if( event.keyDown.keyCode == kbBack )
+ {
+ if( searchPos == -1 )
+ return;
+ searchPos--;
+ if( searchPos == -1 )
+ shiftState = (ushort) event.keyDown.controlKeyState;
+ curString[searchPos+1] = EOS;
+ }
+ else if( (event.keyDown.charScan.charCode == '.') )
+ {
+ char *loc = strchr( curString, '.' );
+ if( loc == 0 )
+ searchPos = -1;
+ else
+ searchPos = short(loc - curString);
+ }
+ else
+ {
+ searchPos++;
+ if( searchPos == 0 )
+ shiftState = (ushort) event.keyDown.controlKeyState;
+ curString[searchPos] = event.keyDown.charScan.charCode;
+ curString[searchPos+1] = EOS;
+ }
+ k = getKey(curString);
+
+ /* SS: this makes g++ happy */
+
+ ccIndex c = (ccIndex) value;
+ list()->search( k, c );
+ value = (int) c;
+
+ if( value < range )
+ {
+ getText( newString, (short) value, 255 );
+ if( equal( curString, newString, (ushort) (searchPos+1) ) )
+ {
+ if( value != oldValue )
+ {
+ focusItem( (short) value );
+ setCursor( cursor.x+searchPos+1, cursor.y );
+ }
+ else
+ setCursor(cursor.x+(searchPos-oldPos), cursor.y );
+ }
+ else
+ searchPos = oldPos;
+ }
+ else
+ searchPos = oldPos;
+ if( searchPos != oldPos ||
+ isalpha( event.keyDown.charScan.charCode )
+ )
+ clearEvent(event);
+ }
+ }
+}
+
+void* TSortedListBox::getKey( const char *s )
+{
+ return (void *)s;
+}
+
+void TSortedListBox::newList( TSortedCollection *aList )
+{
+ TListBox::newList( aList );
+ searchPos = -1;
+}
+
+TFileInfoPane::TFileInfoPane( const TRect& bounds ) :
+ TView(bounds)
+{
+ eventMask |= evBroadcast;
+}
+
+void TFileInfoPane::draw()
+{
+ Boolean PM;
+ TDrawBuffer b;
+ ushort color;
+ ftime *time;
+ char path[PATH_MAX];
+
+#ifndef __UNPATCHED
+ // Prevents incorrect directory name display in info pane if wildCard
+ // has already been expanded.
+ strcpy(path, ((TFileDialog *)owner)->wildCard );
+ if(!strchr(path, ':') && !strchr(path, '/'))
+ {
+ strcpy( path, ((TFileDialog *)owner)->directory );
+ strcat( path, ((TFileDialog *)owner)->wildCard );
+ fexpand( path );
+ }
+#else
+ strcpy( path, ((TFileDialog *)owner)->directory );
+ strcat( path, ((TFileDialog *)owner)->wildCard );
+ fexpand( path );
+#endif
+
+ color = getColor(0x01);
+ b.moveChar( 0, ' ', color, (ushort) size.x );
+ b.moveStr( 1, path, color );
+ writeLine( 0, 0, (ushort) size.x, 1, b );
+
+ b.moveChar( 0, ' ', color, (ushort) size.x );
+ b.moveStr( 1, file_block.name, color );
+
+ if( *(file_block.name) != EOS )
+ {
+
+ char buf[10];
+
+ /* SS: little fix */
+
+ sprintf(buf, "%ld", file_block.size);
+ b.moveStr( 14, buf, color );
+
+ time = (ftime *) &file_block.time;
+ b.moveStr( 25, months[time->ft_month], color );
+
+ sprintf(buf, "%02d", time->ft_day);
+ b.moveStr( 29, buf, color );
+
+ b.putChar( 31, ',' );
+
+ sprintf(buf, "%d", time->ft_year+1980);
+ b.moveStr( 32, buf, color );
+
+ PM = Boolean(time->ft_hour >= 12 );
+ time->ft_hour %= 12;
+
+ if( time->ft_hour == 0 )
+ time->ft_hour = 12;
+
+ sprintf(buf, "%02d", time->ft_hour);
+ b.moveStr( 38, buf, color );
+ b.putChar( 40, ':' );
+
+ sprintf(buf, "%02d", time->ft_min);
+ b.moveStr( 41, buf, color );
+
+ if( PM )
+ b.moveStr( 43, pmText, color );
+ else
+ b.moveStr( 43, amText, color );
+ }
+
+ writeLine(0, 1, (ushort) size.x, 1, b );
+ b.moveChar( 0, ' ', color, (ushort) size.x );
+ writeLine( 0, 2, (ushort) size.x, (ushort) (size.y-2), b);
+}
+
+TPalette& TFileInfoPane::getPalette() const
+{
+ static TPalette palette( cpInfoPane, sizeof( cpInfoPane )-1 );
+ return palette;
+}
+
+void TFileInfoPane::handleEvent( TEvent& event )
+{
+ TView::handleEvent(event);
+ if( event.what == evBroadcast && event.message.command == cmFileFocused )
+ {
+ file_block = *((TSearchRec *)(event.message.infoPtr));
+ drawView();
+ }
+}
+
+#if !defined(NO_STREAMABLE)
+
+TStreamable *TFileInfoPane::build()
+{
+ return new TFileInfoPane( streamableInit );
+}
+
+#ifndef __UNPATCHED
+TStreamable *TSortedListBox::build()
+{
+ return new TSortedListBox( streamableInit );
+}
+
+void *TSortedListBox::read( ipstream& is )
+{
+ TListBox::read(is);
+
+ // Must initialize these or serious memory overwrite
+ // problems can occur!
+ searchPos = -1;
+ shiftState = 0;
+
+ return this;
+}
+#endif
+
+#endif