home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 110 / EnigmaAmiga110CD.iso / indispensabili / utility / apdf / xpdf-0.80 / ltk / ltkfilereq.cc < prev    next >
C/C++ Source or Header  |  1998-11-27  |  6KB  |  224 lines

  1. //========================================================================
  2. //
  3. // LTKFileReq.cc
  4. //
  5. // Copyright 1997 Derek B. Noonburg
  6. //
  7. //========================================================================
  8.  
  9. #ifdef __GNUC__
  10. #pragma implementation
  11. #endif
  12.  
  13. #include <stdlib.h>
  14. #include <stdarg.h>
  15. #include <stddef.h>
  16. #include <X11/Xlib.h>
  17. #include <X11/Xutil.h>
  18. #include "GString.h"
  19. #include "gfile.h"
  20. #include "LTKBox.h"
  21. #include "LTKLabel.h"
  22. #include "LTKList.h"
  23. #include "LTKScrollbar.h"
  24. #include "LTKTextIn.h"
  25. #include "LTKEmpty.h"
  26. #include "LTKFileReq.h"
  27.  
  28. #define dirLabelLen 50
  29.  
  30. LTKFileReq::LTKFileReq(char *name1, int widgetNum1,
  31.                LTKStringValCbk selectCbk1, char *fontName1):
  32.     LTKCompoundWidget(name1, widgetNum1) {
  33.   selectCbk = selectCbk1;
  34.   fontName = fontName1;
  35.   dir = getCurrentDir();
  36.   selection = NULL;
  37.   makeWidgets();
  38. }
  39.  
  40. void LTKFileReq::makeWidgets() {
  41.   LTKEmpty *empty;
  42.   LTKLabel *dirLabel, *fileLabel;
  43.   LTKBox *dirNameBox1, *dirNameBox2, *dirNameBox;
  44.   LTKBox *fileNameBox1, *fileNameBox2, *fileNameBox;
  45.   LTKBox *listBox, *hScrollBox, *vScrollBox, *emptyBox, *listBox2;
  46.  
  47.   dirLabel = new LTKLabel(NULL, 0, ltkLabelStatic, -1, NULL, "Dir:");
  48.   dirNameBox1 = new LTKBox(NULL, 1, 1, 0, 0, 0, 0, ltkBorderNone, 0, 0,
  49.                dirLabel);
  50.   dirName = new LTKTextIn(NULL, 0, 40, fontName, &dirNameCbk, NULL);
  51.   dirNameBox2 = new LTKBox(NULL, 1, 1, 0, 0, 0, 0, ltkBorderSunken, 1, 0,
  52.                dirName);
  53.   dirNameBox = new LTKBox(NULL, 2, 1, 0, 0, 0, 2, ltkBorderNone, 1, 0,
  54.               dirNameBox1, dirNameBox2);
  55.  
  56.   list = new LTKList(NULL, 0, 250, 10, gTrue, fontName);
  57.   list->setClickCbk(&clickCbk);
  58.   list->setDblClickCbk(&dblClickCbk);
  59.   listBox = new LTKBox(NULL, 1, 1, 0, 0, 0, 0, ltkBorderSunken, 1, 1,
  60.                list);
  61.   hScrollbar = new LTKScrollbar(NULL, 0, gFalse, 0, 1, &hScrollCbk);
  62.   hScrollBox = new LTKBox(NULL, 1, 1, 0, 0, 0, 0, ltkBorderNone, 1, 0,
  63.              hScrollbar);
  64.   vScrollbar = new LTKScrollbar(NULL, 0, gTrue, 0, 1, &vScrollCbk);
  65.   vScrollBox = new LTKBox(NULL, 1, 1, 0, 0, 0, 0, ltkBorderNone, 0, 1,
  66.               vScrollbar);
  67.   empty = new LTKEmpty();
  68.   emptyBox = new LTKBox(NULL, 1, 1, 0, 0, 0, 0, ltkBorderNone, 0, 0,
  69.             empty);
  70.   listBox2 = new LTKBox(NULL, 2, 2, 0, 0, 0, 2, ltkBorderNone, 1, 1,
  71.             listBox, vScrollBox, hScrollBox, emptyBox);
  72.  
  73.   fileLabel = new LTKLabel(NULL, 0, ltkLabelStatic, -1, NULL, "File:");
  74.   fileNameBox1 = new LTKBox(NULL, 1, 1, 0, 0, 0, 0, ltkBorderNone, 0, 0,
  75.                 fileLabel);
  76.   fileName = new LTKTextIn(NULL, 0, 40, fontName, NULL, NULL);
  77.   fileNameBox2 = new LTKBox(NULL, 1, 1, 0, 0, 0, 0, ltkBorderSunken, 1, 0,
  78.                 fileName);
  79.   fileNameBox = new LTKBox(NULL, 2, 1, 0, 0, 0, 0, ltkBorderNone, 1, 0,
  80.                fileNameBox1, fileNameBox2);
  81.  
  82.   box = new LTKBox(NULL, 1, 3, 0, 0, 0, 0, ltkBorderNone, 1, 1,
  83.            dirNameBox, listBox2, fileNameBox);
  84.   box->setCompoundParent(this);
  85. }
  86.  
  87. LTKFileReq::~LTKFileReq() {
  88.   delete dir;
  89.   if (selection)
  90.     delete selection;
  91. }
  92.  
  93. GString *LTKFileReq::getSelection() {
  94.   if (selection) {
  95.     delete selection;
  96.     selection = NULL;
  97.   }
  98.   if (fileName->getText()->getLength() == 0)
  99.     return NULL;
  100.   selection = dir->copy();
  101.   appendToPath(selection, fileName->getText()->getCString());
  102.   return selection;
  103. }
  104.  
  105. void LTKFileReq::setDir(GString *dir1) {
  106.   delete dir;
  107.   dir = dir1->copy();
  108.   if (mapped)
  109.     loadDirList();
  110. }
  111.  
  112. void LTKFileReq::layout3() {
  113.   LTKCompoundWidget::layout3();
  114.   hScrollbar->setLimits(0, list->getMaxWidth() - 1);
  115.   hScrollbar->setPos(hScrollbar->getPos(), list->getWidth());
  116.   vScrollbar->setLimits(0, list->getNumLines() - 1);
  117.   vScrollbar->setPos(vScrollbar->getPos(), list->getDisplayedLines());
  118. }
  119.  
  120. void LTKFileReq::map() {
  121.   loadDirList();
  122.   LTKCompoundWidget::map();
  123. }
  124.  
  125. void LTKFileReq::loadDirList() {
  126.   GDir *d;
  127.   GDirEntry *ent;
  128.   GString *s;
  129.   int i;
  130.  
  131.   // initialize
  132.   makePathAbsolute(dir);
  133.   dirName->setText(dir->getCString());
  134.   list->deleteAll();
  135.  
  136.   // scan directory and add entries to list
  137.   d = new GDir(dir->getCString());
  138.   numDirs = 0;
  139.   while ((ent = d->getNextEntry())) {
  140.     if (ent->isDir()) {
  141.       s = ent->getName()->copy();
  142.       for (i = 0; i < numDirs; ++i) {
  143.     if (s->cmpN(list->getLine(i), list->getLine(i)->getLength() - 1) < 0)
  144.       break;
  145.       }
  146. #ifndef VMS
  147.       s->append('/');
  148. #endif
  149.       list->insertLine(i, s->getCString());
  150.       delete s;
  151.       ++numDirs;
  152.     } else {
  153.       s = ent->getName();
  154.       for (i = numDirs; i < list->getNumLines(); ++i) {
  155.     if (s->cmp(list->getLine(i)) < 0)
  156.       break;
  157.       }
  158.       list->insertLine(i, s->getCString());
  159.     }
  160.     delete ent;
  161.   }
  162.   delete d;
  163.  
  164.   // reset scrollbars
  165.   hScrollbar->setLimits(0, list->getMaxWidth() - 1);
  166.   hScrollbar->setPos(0, list->getWidth());
  167.   vScrollbar->setLimits(0, list->getNumLines() - 1);
  168.   vScrollbar->setPos(0, list->getDisplayedLines());
  169.  
  170. }
  171.  
  172. void LTKFileReq::clickCbk(LTKWidget *widget, int widgetNum, int line) {
  173.   LTKFileReq *fileReq;
  174.  
  175.   fileReq = (LTKFileReq *)widget->getCompoundParent();
  176.   if (line >= fileReq->numDirs)
  177.     fileReq->fileName->setText(fileReq->list->getLine(line)->getCString());
  178.   else
  179.     fileReq->fileName->setText("");
  180. }
  181.  
  182. void LTKFileReq::dblClickCbk(LTKWidget *widget, int widgetNum, int line) {
  183.   LTKFileReq *fileReq;
  184.   GString *subDir;
  185.  
  186.   fileReq = (LTKFileReq *)widget->getCompoundParent();
  187.   if (line < fileReq->numDirs) {
  188.     subDir = fileReq->list->getLine(line);
  189. #ifndef VMS
  190.     subDir->del(subDir->getLength() - 1);
  191. #endif
  192.     appendToPath(fileReq->dir, subDir->getCString());
  193.     fileReq->loadDirList();
  194.   } else {
  195.     if (fileReq->selectCbk)
  196.       (*fileReq->selectCbk)(widget, widgetNum, fileReq->getSelection());
  197.   }
  198. }
  199.  
  200. void LTKFileReq::dirNameCbk(LTKWidget *widget, int widgetNum, GString *val) {
  201.   LTKFileReq *fileReq;
  202.  
  203.   fileReq = (LTKFileReq *)widget->getCompoundParent();
  204.   delete fileReq->dir;
  205.   fileReq->dir = val->copy();
  206.   fileReq->loadDirList();
  207. }
  208.  
  209. void LTKFileReq::hScrollCbk(LTKWidget *widget, int widgetNum, int val) {
  210.   LTKFileReq *fileReq;
  211.  
  212.   fileReq = (LTKFileReq *)widget->getCompoundParent();
  213.   fileReq->list->scrollTo(fileReq->vScrollbar->getPos(), val);
  214.   XSync(widget->getDisplay(), False);
  215. }
  216.  
  217. void LTKFileReq::vScrollCbk(LTKWidget *widget, int widgetNum, int val) {
  218.   LTKFileReq *fileReq;
  219.  
  220.   fileReq = (LTKFileReq *)widget->getCompoundParent();
  221.   fileReq->list->scrollTo(val, fileReq->hScrollbar->getPos());
  222.   XSync(widget->getDisplay(), False);
  223. }
  224.