diff options
Diffstat (limited to 'freebsdtvision/lib/TFileDialog.cc')
-rw-r--r-- | freebsdtvision/lib/TFileDialog.cc | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/freebsdtvision/lib/TFileDialog.cc b/freebsdtvision/lib/TFileDialog.cc new file mode 100644 index 0000000..d6b4022 --- /dev/null +++ b/freebsdtvision/lib/TFileDialog.cc @@ -0,0 +1,335 @@ +/* + * TFileDialog.cc + * + * Turbo Vision - Version 2.0 + * + * Copyright (c) 1994 by Borland International + * All Rights Reserved. + * + * Modified by Sergio Sigala <sergio@sigala.it> + */ + +#define Uses_TFileDialog +#define Uses_MsgBox +#define Uses_TRect +#define Uses_TFileInputLine +#define Uses_TButton +#define Uses_TLabel +#define Uses_TFileList +#define Uses_THistory +#define Uses_TScrollBar +#define Uses_TEvent +#define Uses_TFileInfoPane +#define Uses_opstream +#define Uses_ipstream +#include <tvision/tv.h> + +#include <ctype.h> +#include <errno.h> +#include <stdio.h> +#include <string.h> + +// File dialog flags +const + int ffOpen = 0x0001, + ffSaveAs = 0x0002; + +const + int cmOpenDialogOpen = 100, + cmOpenDialogReplace = 101; + +TFileDialog::TFileDialog( const char *aWildCard, + const char *aTitle, + const char *inputName, + ushort aOptions, + uchar histId + ) : + TDialog( TRect( 15, 1, 64, 20 ), aTitle ), + TWindowInit( &TFileDialog::initFrame ), + directory( newStr("") ) +{ + options |= ofCentered; + strcpy( wildCard, aWildCard ); + + fileName = new TFileInputLine( TRect( 3, 3, 31, 4 ), 79 ); + strcpy( fileName->data, wildCard ); + insert( fileName ); + + insert( new TLabel( TRect( 2, 2, 3+cstrlen(inputName), 3 ), + inputName, + fileName + ) ); + insert( new THistory( TRect( 31, 3, 34, 4 ), fileName, histId ) ); + TScrollBar *sb = new TScrollBar( TRect( 3, 14, 34, 15 ) ); + insert( sb ); + insert( fileList = new TFileList( TRect( 3, 6, 34, 14 ), sb ) ); + insert( new TLabel( TRect( 2, 5, 8, 6 ), filesText, fileList ) ); + + ushort opt = bfDefault; + TRect r( 35, 3, 46, 5 ); + + if( (aOptions & fdOpenButton) != 0 ) + { + insert( new TButton( r, openText, cmFileOpen, opt ) ); + opt = bfNormal; + r.a.y += 3; + r.b.y += 3; + } + + if( (aOptions & fdOKButton) != 0 ) + { + insert( new TButton( r, okText, cmFileOpen, opt ) ); + opt = bfNormal; + r.a.y += 3; + r.b.y += 3; + } + + if( (aOptions & fdReplaceButton) != 0 ) + { + insert( new TButton( r, replaceText, cmFileReplace, opt ) ); + opt = bfNormal; + r.a.y += 3; + r.b.y += 3; + } + + if( (aOptions & fdClearButton) != 0 ) + { + insert( new TButton( r, clearText, cmFileClear, opt ) ); +#ifndef __UNPATCHED + // opt = bfNormal; +#else + opt = bfNormal; +#endif + r.a.y += 3; + r.b.y += 3; + } + + insert( new TButton( r, cancelText, cmCancel, bfNormal ) ); + r.a.y += 3; + r.b.y += 3; + + if( (aOptions & fdHelpButton) != 0 ) + { + insert( new TButton( r, helpText, cmHelp, bfNormal ) ); +#ifndef __UNPATCHED + // opt = bfNormal; +#else + opt = bfNormal; +#endif + r.a.y += 3; + r.b.y += 3; + } + + insert( new TFileInfoPane( TRect( 1, 16, 48, 18 ) ) ); + + selectNext( False ); + if( (aOptions & fdNoLoadDir) == 0 ) + readDirectory(); +} + +TFileDialog::~TFileDialog() +{ + delete (char *)directory; +} + +void TFileDialog::shutDown() +{ + fileName = 0; + fileList = 0; + TDialog::shutDown(); +} + +static Boolean relativePath( const char *path ) +{ + /* SS: changed */ + + if (path[0] == '/') return False; + else return True; +} + +/* Function defined but not used +static void noWildChars( char *dest, const char *src ) +{ + while( *src != EOS ) + { + if( *src != '?' && *src != '*' ) + *dest++ = *src; + src++; + } + *dest = EOS; +} +*/ + +/* 'src' is cast to unsigned char * so that isspace sign extends it + correctly. */ +static void trim( char *dest, const char *src ) +{ + while( *src != EOS && isspace( * (const unsigned char *) src ) ) + src++; + while( *src != EOS && !isspace( * (const unsigned char *) src ) ) + *dest++ = *src++; + *dest = EOS; +} + +void TFileDialog::getFileName( char *s ) +{ + /* SS: changed */ + + char buf[PATH_MAX]; + + trim( buf, fileName->data ); + if( relativePath( buf ) == True ) + { + strcpy( buf, directory ); + trim( buf + strlen(buf), fileName->data ); + } + fexpand( buf ); + strcpy( s, buf ); +} + +void TFileDialog::handleEvent(TEvent& event) +{ + TDialog::handleEvent(event); + if( event.what == evCommand ) + { + switch( event.message.command ) + { + case cmFileOpen: + case cmFileReplace: + case cmFileClear: + endModal(event.message.command); + clearEvent(event); + break; + default: + break; + } + } + else if( event.what == evBroadcast && event.message.command == cmFileDoubleClicked ) + { + event.what = evCommand; + event.message.command = cmOK; + putEvent( event ); + clearEvent( event ); + } +} + +void TFileDialog::readDirectory() +{ + char curDir[PATH_MAX]; + getCurDir( curDir ); + if( directory ) + delete (char *)directory; + directory = newStr( curDir ); + fileList->readDirectory( wildCard ); +} + +void TFileDialog::setData( void *rec ) +{ + TDialog::setData( rec ); + if( *(char *)rec != EOS && isWild( (char *)rec ) ) + { + valid( cmFileInit ); + fileName->select(); + } +} + +void TFileDialog::getData( void *rec ) +{ + getFileName( (char *)rec ); +} + +Boolean TFileDialog::checkDirectory( const char *str ) +{ + if( pathValid( str ) ) + return True; + else + { + messageBox( invalidDriveText, mfError | mfOKButton ); + fileName->select(); + return False; + } +} + +Boolean TFileDialog::valid(ushort command) +{ + /* SS: changed */ + + char fName[PATH_MAX]; + char name[PATH_MAX]; + + if( command == 0 ) + return True; + + if( TDialog::valid( command ) ) + { + if( command != cmCancel && command != cmFileClear ) + { + getFileName( fName ); + + if( isWild( fName ) ) + { + /* SS: changed */ + + char path[PATH_MAX]; + expandPath(fName, path, name); + if( checkDirectory( path ) ) + { + delete (char *)directory; + directory = newStr( path ); + strcpy( wildCard, name ); + if( command != cmFileInit ) + fileList->select(); + fileList->readDirectory( directory, wildCard ); + } + } + else if( isDir( fName ) ) + { + if( checkDirectory( fName ) ) + { + delete (char *)directory; + strcat( fName, "/" ); + directory = newStr( fName ); + if( command != cmFileInit ) + fileList->select(); + fileList->readDirectory( directory, wildCard ); + } + } + else if( validFileName( fName ) ) + return True; + else + { + messageBox( invalidFileText, mfError | mfOKButton ); + return False; + } + } + else + return True; + } + return False; +} + +#if !defined(NO_STREAMABLE) + +void TFileDialog::write( opstream& os ) +{ + TDialog::write( os ); + os.writeString( wildCard ); + os << fileName << fileList; +} + +void *TFileDialog::read( ipstream& is ) +{ + TDialog::read( is ); + is.readString( wildCard, sizeof(wildCard) ); + is >> fileName >> fileList; + readDirectory(); + return this; +} + +TStreamable *TFileDialog::build() +{ + return new TFileDialog( streamableInit ); +} + + +#endif |