summaryrefslogtreecommitdiff
path: root/freebsdtvision/lib/TDirListBox.cc
diff options
context:
space:
mode:
Diffstat (limited to 'freebsdtvision/lib/TDirListBox.cc')
-rw-r--r--freebsdtvision/lib/TDirListBox.cc197
1 files changed, 197 insertions, 0 deletions
diff --git a/freebsdtvision/lib/TDirListBox.cc b/freebsdtvision/lib/TDirListBox.cc
new file mode 100644
index 0000000..f183d3c
--- /dev/null
+++ b/freebsdtvision/lib/TDirListBox.cc
@@ -0,0 +1,197 @@
+/*
+ * TDirListBox.cc
+ *
+ * Turbo Vision - Version 2.0
+ *
+ * Copyright (c) 1994 by Borland International
+ * All Rights Reserved.
+ *
+ * Modified by Sergio Sigala <sergio@sigala.it>
+ */
+
+#define Uses_TDirListBox
+#define Uses_TEvent
+#define Uses_TDirCollection
+#define Uses_TChDirDialog
+#define Uses_TDirEntry
+#define Uses_TButton
+#include <tvision/tv.h>
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <stdio.h>
+#include <string.h>
+
+TDirListBox::TDirListBox( const TRect& bounds, TScrollBar *aScrollBar ) :
+ TListBox( bounds, 1, aScrollBar ),
+ cur( 0 )
+{
+ *dir = EOS;
+}
+
+TDirListBox::~TDirListBox()
+{
+ if ( list() )
+ destroy( list() );
+}
+
+void TDirListBox::getText( char *text, short item, short maxChars )
+{
+ strncpy( text, list()->at(item)->text(), maxChars );
+ text[maxChars] = '\0';
+}
+
+void TDirListBox::selectItem( short item )
+{
+ message( owner, evCommand, cmChangeDir, list()->at(item) );
+}
+
+/*
+void TDirListBox::handleEvent( TEvent& event )
+{
+ if( event.what == evMouseDown && (event.mouse.eventFlags & meDoubleClick) )
+ {
+ event.what = evCommand;
+ event.message.command = cmChangeDir;
+ putEvent( event );
+ clearEvent( event );
+ }
+ else
+ TListBox::handleEvent( event );
+}
+*/
+
+Boolean TDirListBox::isSelected( short item )
+{
+ return Boolean( item == cur );
+}
+
+void TDirListBox::showDrives( TDirCollection* )
+{
+ /* SS: do nothing */
+}
+
+void TDirListBox::showDirs( TDirCollection *dirs )
+{
+ /* SS: changed */
+
+ char buf[PATH_MAX * 2];
+ char *curDir = dir;
+ char *end;
+ char *name = buf + sizeof(buf) / 2;
+ const int indentSize = 2;
+ int indent = 0, len;
+
+ /* extract directories from path string */
+
+ memset(buf, ' ', sizeof(buf));
+ strcpy(name, pathDir);
+ len = strlen(pathDir);
+ while((end = strchr(curDir, '/' )) != NULL)
+ {
+ /* special case: root directory */
+
+ if (end == dir) dirs->insert(new TDirEntry("/", ""));
+ else
+ {
+ memcpy(name + len, curDir, end - curDir);
+ name[len + end - curDir] = EOS;
+ *end = EOS;
+ dirs->insert(new TDirEntry(name - indent, dir));
+ *end = '/';
+ indent += indentSize;
+ }
+ curDir = end + 1;
+ }
+ cur = dirs->getCount() - 1;
+
+ /* read subdirectories in the current directory */
+
+ Boolean isFirst = True;
+ DIR *dp;
+ char path[PATH_MAX];
+ dirent *de;
+ struct stat s;
+
+ sprintf(path, "%s.", dir);
+ if ((dp = opendir(path)) != NULL)
+ {
+ while ((de = readdir(dp)) != NULL)
+ {
+ /* we don't want these directories */
+
+ if (strcmp(de->d_name, ".") == 0 ||
+ strcmp(de->d_name, "..") == 0) continue;
+
+ /* is it a directory ? */
+
+ sprintf(path, "%s%s", dir, de->d_name);
+ if (stat(path, &s) == 0 && S_ISDIR(s.st_mode))
+ {
+ if (isFirst)
+ {
+ isFirst = False;
+ strcpy(name, firstDir);
+ len = strlen(firstDir);
+ }
+ else
+ {
+ strcpy(name, middleDir);
+ len = strlen(middleDir);
+ }
+ strcpy(name + len, de->d_name);
+ dirs->insert(new TDirEntry(name - indent,
+ path));
+ }
+ }
+ closedir(dp);
+ }
+
+ /* old code */
+
+ char *p = dirs->at(dirs->getCount()-1)->text();
+ char *i = strchr( p, graphics[0] );
+ if( i == 0 )
+ {
+ i = strchr( p, graphics[1] );
+ if( i != 0 )
+ *i = graphics[0];
+ }
+ else
+ {
+ *(i+1) = graphics[2];
+ *(i+2) = graphics[2];
+ }
+}
+
+void TDirListBox::newDirectory( const char *str )
+{
+ /* SS: changed */
+
+ strcpy( dir, str );
+ TDirCollection *dirs = new TDirCollection( 5, 5 );
+ showDirs( dirs );
+ newList( dirs );
+ focusItem( cur );
+}
+
+void TDirListBox::setState( ushort nState, Boolean enable )
+{
+ TListBox::setState( nState, enable );
+ if( (nState & sfFocused) != 0 )
+#ifndef __UNPATCHED
+ message(owner, evCommand, cmDirSelection, (void *)enable); //!!
+#else
+ ((TChDirDialog *)owner)->chDirButton->makeDefault( enable );
+#endif
+}
+
+#if !defined(NO_STREAMABLE)
+
+TStreamable *TDirListBox::build()
+{
+ return new TDirListBox( streamableInit );
+}
+
+#endif