SCROLL.C 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
  12. */
  13. /*
  14. * $Source: f:/miner/source/ui/rcs/scroll.c $
  15. * $Revision: 1.5 $
  16. * $Author: john $
  17. * $Date: 1994/11/18 23:07:33 $
  18. *
  19. * Routines for doing vertical scroll bars.
  20. *
  21. * $Log: scroll.c $
  22. * Revision 1.5 1994/11/18 23:07:33 john
  23. * Changed a bunch of shorts to ints.
  24. *
  25. * Revision 1.4 1993/12/07 12:30:35 john
  26. * new version.
  27. *
  28. * Revision 1.3 1993/10/26 13:46:10 john
  29. * *** empty log message ***
  30. *
  31. * Revision 1.2 1993/10/05 17:31:04 john
  32. * *** empty log message ***
  33. *
  34. * Revision 1.1 1993/09/20 10:35:29 john
  35. * Initial revision
  36. *
  37. *
  38. */
  39. #pragma off (unreferenced)
  40. static char rcsid[] = "$Id: scroll.c 1.5 1994/11/18 23:07:33 john Exp $";
  41. #pragma on (unreferenced)
  42. #include <stdlib.h>
  43. #include "fix.h"
  44. #include "types.h"
  45. #include "gr.h"
  46. #include "ui.h"
  47. #include "key.h"
  48. #define TICKER (*(volatile int *)0x46C)
  49. void ui_draw_scrollbar( UI_GADGET_SCROLLBAR * scrollbar )
  50. {
  51. int x, y;
  52. if (scrollbar->status==0)
  53. return;
  54. scrollbar->status = 0;
  55. x = y = 0;
  56. ui_mouse_hide();
  57. gr_set_current_canvas( scrollbar->canvas );
  58. if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)scrollbar)
  59. gr_setcolor( CRED );
  60. else
  61. gr_setcolor( CGREY );
  62. gr_rect( 0, 0, scrollbar->width-1, scrollbar->fake_position-1 );
  63. gr_rect( 0, scrollbar->fake_position+scrollbar->fake_size, scrollbar->width-1, scrollbar->height-1);
  64. ui_draw_box_out(0, scrollbar->fake_position, scrollbar->width-1, scrollbar->fake_position+scrollbar->fake_size-1 );
  65. ui_mouse_show();
  66. }
  67. UI_GADGET_SCROLLBAR * ui_add_gadget_scrollbar( UI_WINDOW * wnd, short x, short y, short w, short h, int start, int stop, int position, int window_size )
  68. {
  69. int tw, th, taw;
  70. UI_GADGET_SCROLLBAR * scrollbar;
  71. char up[2];
  72. char down[2];
  73. up[0] = 30; up[1] = 0;
  74. down[0] = 31; down[1] = 0;
  75. gr_get_string_size( up, &tw, &th, &taw );
  76. w = tw + 10;
  77. if (stop < start ) stop = start;
  78. scrollbar = (UI_GADGET_SCROLLBAR *)ui_gadget_add( wnd, 3, x, y+w, x+w-1, y+h-w-1 );
  79. scrollbar->up_button = ui_add_gadget_button( wnd, x, y, w, w, up, NULL );
  80. scrollbar->up_button->parent = (UI_GADGET *)scrollbar;
  81. scrollbar->down_button =ui_add_gadget_button( wnd, x, y+h-w, w, w, down, NULL );
  82. scrollbar->down_button->parent = (UI_GADGET *)scrollbar;
  83. scrollbar->horz = 0;
  84. scrollbar->width = scrollbar->x2-scrollbar->x1+1;
  85. scrollbar->height = scrollbar->y2-scrollbar->y1+1;
  86. scrollbar->start = start;
  87. scrollbar->stop = stop;
  88. scrollbar->position = position;
  89. scrollbar->window_size = window_size;
  90. scrollbar->fake_length = scrollbar->height;
  91. scrollbar->fake_position = 0;
  92. if (stop!=start)
  93. scrollbar->fake_size = (window_size * scrollbar->height)/(stop-start+1+window_size);
  94. else
  95. scrollbar->fake_size = scrollbar->height;
  96. if (scrollbar->fake_size < 7) scrollbar->fake_size = 7;
  97. scrollbar->dragging = 0;
  98. scrollbar->moved=0;
  99. scrollbar->last_scrolled = 0;
  100. return scrollbar;
  101. }
  102. void ui_scrollbar_do( UI_GADGET_SCROLLBAR * scrollbar, int keypress )
  103. {
  104. int OnMe, OnSlider, keyfocus;
  105. int oldpos, op;
  106. keyfocus = 0;
  107. keypress = keypress;
  108. if (CurWindow->keyboard_focus_gadget==(UI_GADGET *)scrollbar)
  109. keyfocus = 1;
  110. if (scrollbar->start==scrollbar->stop)
  111. {
  112. scrollbar->position = 0;
  113. scrollbar->fake_position = 0;
  114. ui_draw_scrollbar( scrollbar );
  115. return;
  116. }
  117. op = scrollbar->position;
  118. oldpos = scrollbar->fake_position;
  119. scrollbar->moved = 0;
  120. if ( (scrollbar->up_button->position!=0) || (keyfocus && keyd_pressed[KEY_UP]) )
  121. {
  122. if (TICKER > scrollbar->last_scrolled+1)
  123. {
  124. scrollbar->last_scrolled = TICKER;
  125. scrollbar->position--;
  126. if (scrollbar->position < scrollbar->start )
  127. scrollbar->position = scrollbar->start;
  128. scrollbar->fake_position = scrollbar->position-scrollbar->start;
  129. scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
  130. scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
  131. }
  132. }
  133. if ( (scrollbar->down_button->position!=0) || (keyfocus && keyd_pressed[KEY_DOWN]) )
  134. {
  135. if (TICKER > scrollbar->last_scrolled+1)
  136. {
  137. scrollbar->last_scrolled = TICKER;
  138. scrollbar->position++;
  139. if (scrollbar->position > scrollbar->stop )
  140. scrollbar->position = scrollbar->stop;
  141. scrollbar->fake_position = scrollbar->position-scrollbar->start;
  142. scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
  143. scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
  144. }
  145. }
  146. OnMe = ui_mouse_on_gadget( (UI_GADGET *)scrollbar );
  147. //gr_ubox(0, scrollbar->fake_position, scrollbar->width-1, scrollbar->fake_position+scrollbar->fake_size-1 );
  148. if (!B1_PRESSED )
  149. scrollbar->dragging = 0;
  150. //if (B1_PRESSED && OnMe )
  151. // listbox->dragging = 1;
  152. OnSlider = 0;
  153. if ((Mouse.y >= scrollbar->fake_position+scrollbar->y1) && \
  154. (Mouse.y < scrollbar->fake_position+scrollbar->y1+scrollbar->fake_size) && OnMe )
  155. OnSlider = 1;
  156. if (B1_JUST_PRESSED && OnSlider )
  157. {
  158. scrollbar->dragging = 1;
  159. scrollbar->drag_x = Mouse.x;
  160. scrollbar->drag_y = Mouse.y;
  161. scrollbar->drag_starting = scrollbar->fake_position;
  162. }
  163. if ( B1_PRESSED && OnMe && !OnSlider && (TICKER > scrollbar->last_scrolled+4) )
  164. {
  165. scrollbar->last_scrolled = TICKER;
  166. if ( Mouse.y < scrollbar->fake_position+scrollbar->y1 )
  167. {
  168. // Page Up
  169. scrollbar->position -= scrollbar->window_size;
  170. if (scrollbar->position < scrollbar->start )
  171. scrollbar->position = scrollbar->start;
  172. } else {
  173. // Page Down
  174. scrollbar->position += scrollbar->window_size;
  175. if (scrollbar->position > scrollbar->stop )
  176. scrollbar->position = scrollbar->stop;
  177. }
  178. scrollbar->fake_position = scrollbar->position-scrollbar->start;
  179. scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
  180. scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
  181. }
  182. if ((selected_gadget==(UI_GADGET *)scrollbar) && B1_PRESSED && scrollbar->dragging )
  183. {
  184. //Mouse.x = scrollbar->drag_x;
  185. scrollbar->fake_position = scrollbar->drag_starting + (Mouse.y - scrollbar->drag_y );
  186. if (scrollbar->fake_position<0)
  187. {
  188. scrollbar->fake_position = 0;
  189. //Mouse.y = scrollbar->fake_position + scrollbar->drag_y - scrollbar->drag_starting;
  190. }
  191. if (scrollbar->fake_position > (scrollbar->height-scrollbar->fake_size))
  192. {
  193. scrollbar->fake_position = (scrollbar->height-scrollbar->fake_size);
  194. //Mouse.y = scrollbar->fake_position + scrollbar->drag_y - scrollbar->drag_starting;
  195. }
  196. //mouse_set_pos( Mouse.x, Mouse.y );
  197. scrollbar->position = scrollbar->fake_position;
  198. scrollbar->position *= (scrollbar->stop-scrollbar->start);
  199. scrollbar->position /= ( scrollbar->height-scrollbar->fake_size ) ;
  200. scrollbar->position += scrollbar->start;
  201. if (scrollbar->position > scrollbar->stop )
  202. scrollbar->position = scrollbar->stop;
  203. if (scrollbar->position < scrollbar->start )
  204. scrollbar->position = scrollbar->start;
  205. //scrollbar->fake_position = scrollbar->position-scrollbar->start;
  206. //scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
  207. //scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
  208. }
  209. if (op != scrollbar->position )
  210. scrollbar->moved = 1;
  211. if (oldpos != scrollbar->fake_position)
  212. scrollbar->status = 1;
  213. ui_draw_scrollbar( scrollbar );
  214. }
  215.