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

  1. //========================================================================
  2. //
  3. // LTKScrollbar.cc
  4. //
  5. // Copyright 1996 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 "LTKApp.h"
  19. #include "LTKWindow.h"
  20. #include "LTKScrollbar.h"
  21. #include "LTKBorder.h"
  22.  
  23. //------------------------------------------------------------------------
  24.  
  25. #define ltkScrollbarRepeatDelay  400000  // delay (us) before first repeat
  26.  
  27. #define ltkScrollbarRepeatPeriod  30000  // default time (us) between
  28.                          //   repeats
  29.  
  30. //------------------------------------------------------------------------
  31. // LTKScrollbar
  32. //------------------------------------------------------------------------
  33.  
  34. LTKScrollbar::LTKScrollbar(char *name1, int widgetNum1,
  35.                GBool vertical1, int minPos1, int maxPos1,
  36.                LTKIntValCbk moveCbk1):
  37.     LTKWidget(name1, widgetNum1) {
  38.   vertical = vertical1;
  39.   minPos = minPos1;
  40.   maxPos = maxPos1;
  41.   moveCbk = moveCbk1;
  42.  
  43.   pos = minPos;
  44.   if ((size = (maxPos - minPos) / 8) == 0)
  45.     size = 1;
  46.   scrollDelta = -1;
  47.   repeatPeriod = ltkScrollbarRepeatPeriod;
  48.   sliderPressed = gFalse;
  49.   upPressed = downPressed = gFalse;
  50. }
  51.  
  52. long LTKScrollbar::getEventMask() {
  53.   return LTKWidget::getEventMask() |
  54.          ButtonPressMask | ButtonReleaseMask | ButtonMotionMask |
  55.          PointerMotionHintMask;
  56. }
  57.  
  58. void LTKScrollbar::layout1() {
  59.   if (vertical) {
  60.     width = 12 + 2 * ltkBorderWidth;
  61.     height = 40 + 2 * ltkBorderWidth;
  62.   } else {
  63.     width = 40 + 2 * ltkBorderWidth;
  64.     height = 12 + 2 * ltkBorderWidth;
  65.   }
  66. }
  67.  
  68. void LTKScrollbar::redraw() {
  69.   ltkDrawBorder(getDisplay(), xwin, getBrightGC(), getDarkGC(), getBgGC(),
  70.         0, 0, width, height, ltkBorderSunken);
  71.   drawUpButton();
  72.   drawDownButton();
  73.   drawSlider(pos, gTrue);
  74. }
  75.  
  76. void LTKScrollbar::setLimits(int minPos1, int maxPos1) {
  77.   if (getXWindow() != None)
  78.     drawSlider(pos, gFalse);
  79.   minPos = minPos1;
  80.   maxPos = maxPos1;
  81.   if (maxPos < minPos)
  82.     maxPos = minPos;
  83.   if (size > maxPos - minPos + 1)
  84.     size = maxPos - minPos + 1;
  85.   if (pos < minPos)
  86.     pos = minPos;
  87.   else if (pos > maxPos - size + 1)
  88.     pos = maxPos - size + 1;
  89.   if (getXWindow() != None)
  90.     drawSlider(pos, gTrue);
  91. }
  92.  
  93. void LTKScrollbar::setPos(int pos1, int size1) {
  94.   if (getXWindow() != None)
  95.     drawSlider(pos, gFalse);
  96.   pos = pos1;
  97.   size = size1;
  98.   if (size > maxPos - minPos + 1)
  99.     size = maxPos - minPos + 1;
  100.   if (pos < minPos)
  101.     pos = minPos;
  102.   else if (pos > maxPos - size + 1)
  103.     pos = maxPos - size + 1;
  104.   if (getXWindow() != None)
  105.     drawSlider(pos, gTrue);
  106. }
  107.  
  108. void LTKScrollbar::drawUpButton() {
  109.   if (vertical)
  110.     ltkDrawTriBorder(getDisplay(), xwin, getBrightGC(), getDarkGC(), getBgGC(),
  111.              ltkBorderWidth+1, ltkBorderWidth+1, 10, 10,
  112.              ltkTriUp,
  113.              upPressed ? ltkBorderSunken : ltkBorderRaised);
  114.   else
  115.     ltkDrawTriBorder(getDisplay(), xwin, getBrightGC(), getDarkGC(), getBgGC(),
  116.              ltkBorderWidth+1, ltkBorderWidth+1, 10, 10,
  117.              ltkTriLeft,
  118.              upPressed ? ltkBorderSunken : ltkBorderRaised);
  119. }
  120.  
  121. void LTKScrollbar::drawDownButton() {
  122.   if (vertical)
  123.     ltkDrawTriBorder(getDisplay(), xwin, getBrightGC(), getDarkGC(), getBgGC(),
  124.              ltkBorderWidth+1, height-ltkBorderWidth-11, 10, 10,
  125.              ltkTriDown,
  126.              downPressed ? ltkBorderSunken : ltkBorderRaised);
  127.   else
  128.     ltkDrawTriBorder(getDisplay(), xwin, getBrightGC(), getDarkGC(), getBgGC(),
  129.              width-ltkBorderWidth-11, ltkBorderWidth+1, 10, 10,
  130.              ltkTriRight,
  131.              downPressed ? ltkBorderSunken : ltkBorderRaised);
  132. }
  133.  
  134. void LTKScrollbar::drawSlider(int pos1, Bool on) {
  135.   int w1, h1;
  136.   int tx, ty, tw, th;
  137.   LTKBorder border;
  138.  
  139.   if (vertical) {
  140.     h1 = height - 2 * ltkBorderWidth - 24;
  141.     th = (size * h1) / (maxPos - minPos + 1);
  142.     ty = ltkBorderWidth + 12;
  143.     if (minPos < maxPos)
  144.       ty += ((pos1 - minPos) * h1) / (maxPos - minPos + 1);
  145.     if (th < 16)
  146.       th = 16;
  147.     if (ty + th > height - ltkBorderWidth - 12)
  148.       ty = height - ltkBorderWidth - 12 - th;
  149.     tw = width - 2 * ltkBorderWidth;
  150.     tx = ltkBorderWidth;
  151.     pixelPos = ty;
  152.     pixelSize = th;
  153.   } else {
  154.     w1 = width - 2 * ltkBorderWidth - 24;
  155.     tw = (size * w1) / (maxPos - minPos + 1);
  156.     tx = ltkBorderWidth + 12;
  157.     if (minPos < maxPos)
  158.       tx += ((pos1 - minPos) * w1) / (maxPos - minPos + 1);
  159.     else
  160.       tx = ltkBorderWidth;
  161.     if (tw < 16)
  162.       tw = 16;
  163.     if (tx + tw > width - ltkBorderWidth - 12)
  164.       tx = width - ltkBorderWidth - 12 - tw;
  165.     th = height - 2 * ltkBorderWidth;
  166.     ty = ltkBorderWidth;
  167.     pixelPos = tx;
  168.     pixelSize = tw;
  169.   }
  170.   if (on)
  171.     border = sliderPressed ? ltkBorderSunken : ltkBorderRaised;
  172.   else
  173.     border = ltkBorderNone;
  174.   ltkDrawBorder(getDisplay(), xwin, getBrightGC(), getDarkGC(), getBgGC(),
  175.         tx, ty, tw, th, border);
  176. }
  177.  
  178. void LTKScrollbar::buttonPress(int mx, int my, int button, GBool dblClick) {
  179.   int oldPos;
  180.  
  181.   // scroll up/left
  182.   if ((vertical && my < ltkBorderWidth + 11) ||
  183.       (!vertical && mx < ltkBorderWidth + 11)) {
  184.     upPressed = gTrue;
  185.     drawUpButton();
  186.     doScroll();
  187.     //~ user-settable period
  188.     parent->getApp()->setRepeatEvent(this, ltkScrollbarRepeatDelay,
  189.                      repeatPeriod);
  190.  
  191.   // page up/left
  192.   } else if ((vertical && my < pixelPos) ||
  193.          (!vertical && mx < pixelPos)) {
  194.     oldPos = pos;
  195.     if ((pos -= size) < minPos)
  196.       pos = minPos;
  197.     if (pos != oldPos) {
  198.       drawSlider(oldPos, gFalse);
  199.       drawSlider(pos, gTrue);
  200.       (*moveCbk)(this, widgetNum, pos);
  201.     }
  202.  
  203.   // drag
  204.   } else if ((vertical && my < pixelPos + pixelSize) ||
  205.          (!vertical && mx < pixelPos + pixelSize)) {
  206.     pushPixel = vertical ? my : mx;
  207.     pushPos = pos;
  208.     sliderPressed = gTrue;
  209.     drawSlider(pos, gTrue);
  210.  
  211.   // page down/right
  212.   } else if ((vertical && my < height - ltkBorderWidth - 11) ||
  213.          (!vertical && mx < width - ltkBorderWidth - 11)) {
  214.     oldPos = pos;
  215.     if ((pos += size) > maxPos - size + 1)
  216.       pos = maxPos - size + 1;
  217.     if (pos != oldPos) {
  218.       drawSlider(oldPos, gFalse);
  219.       drawSlider(pos, gTrue);
  220.       (*moveCbk)(this, widgetNum, pos);
  221.     }
  222.  
  223.   // scroll down/right
  224.   } else {
  225.     downPressed = gTrue;
  226.     drawDownButton();
  227.     doScroll();
  228.     //~ user-settable period
  229.     parent->getApp()->setRepeatEvent(this, ltkScrollbarRepeatDelay,
  230.                      repeatPeriod);
  231.   }
  232. }
  233.  
  234. void LTKScrollbar::buttonRelease(int mx, int my, int button, GBool click) {
  235.   if (sliderPressed) {
  236.     sliderPressed = gFalse;
  237.     drawSlider(pos, gTrue);
  238.   } else if (upPressed) {
  239.     upPressed = gFalse;
  240.     drawUpButton();
  241.     parent->getApp()->setRepeatEvent(NULL, 0, 0);
  242.   } else if (downPressed) {
  243.     downPressed = gFalse;
  244.     drawDownButton();
  245.     parent->getApp()->setRepeatEvent(NULL, 0, 0);
  246.   }
  247. }
  248.  
  249. void LTKScrollbar::mouseMove(int mx, int my, int btn) {
  250.   int oldPos = pos;
  251.   int w1, h1;
  252.  
  253.   if (sliderPressed) {
  254.     if (vertical) {
  255.       h1 = height - 2 * ltkBorderWidth - 24;
  256.       pos = pushPos + ((my - pushPixel) * (maxPos - minPos + 1)) / h1;
  257.     } else {
  258.       w1 = width - 2 * ltkBorderWidth - 24;
  259.       pos = pushPos + ((mx - pushPixel) * (maxPos - minPos + 1)) / w1;
  260.     }
  261.     if (pos < minPos)
  262.       pos = minPos;
  263.     else if (pos > maxPos - size + 1)
  264.       pos = maxPos - size + 1;
  265.     if (pos != oldPos) {
  266.       drawSlider(oldPos, gFalse);
  267.       drawSlider(pos, gTrue);
  268.       (*moveCbk)(this, widgetNum, pos);
  269.     }
  270.   }
  271. }
  272.  
  273. void LTKScrollbar::repeatEvent() {
  274.   doScroll();
  275. }
  276.  
  277. void LTKScrollbar::doScroll() {
  278.   int oldPos;
  279.   int size1;
  280.  
  281.   oldPos = pos;
  282.   if (upPressed) {
  283.     if (scrollDelta > 0) {
  284.       pos -= scrollDelta;
  285.     } else {
  286.       size1 = (vertical ? height : width) - 2 * ltkBorderWidth - 24;
  287.       if (maxPos - minPos + 1 > size1)
  288.     pos -= (maxPos - minPos + 1) / size1;
  289.       else
  290.     --pos;
  291.     }
  292.     if (pos < minPos)
  293.       pos = minPos;
  294.     if (pos != oldPos) {
  295.       drawSlider(oldPos, gFalse);
  296.       drawSlider(pos, gTrue);
  297.       (*moveCbk)(this, widgetNum, pos);
  298.     }
  299.   } else if (downPressed) {
  300.     if (scrollDelta > 0) {
  301.       pos += scrollDelta;
  302.     } else {
  303.       size1 = (vertical ? height : width) - 2 * ltkBorderWidth - 24;
  304.       if (maxPos - minPos + 1 > size1)
  305.     pos += (maxPos - minPos + 1) / size1;
  306.       else
  307.     ++pos;
  308.     }
  309.     if (pos > maxPos - size + 1)
  310.       pos = maxPos - size + 1;
  311.     if (pos != oldPos) {
  312.       drawSlider(oldPos, gFalse);
  313.       drawSlider(pos, gTrue);
  314.       (*moveCbk)(this, widgetNum, pos);
  315.     }
  316.   }
  317. }
  318.