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-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13 
14 #pragma off (unreferenced)
15 static char rcsid[] = "$Id: scroll.c,v 1.1.1.1 2001/01/19 03:30:14 bradleyb Exp $";
16 #pragma on (unreferenced)
17 #include <stdlib.h>
18 
19 #include "fix.h"
20 #include "types.h"
21 #include "gr.h"
22 #include "ui.h"
23 #include "key.h"
24 
25 #define TICKER (*(volatile int *)0x46C)
26 
ui_draw_scrollbar(UI_GADGET_SCROLLBAR * scrollbar)27 void ui_draw_scrollbar( UI_GADGET_SCROLLBAR * scrollbar )
28 {
29 	int x, y;
30 
31 	if (scrollbar->status==0)
32 		return;
33 
34 	scrollbar->status = 0;
35 	x = y = 0;
36 	ui_mouse_hide();
37 	gr_set_current_canvas( scrollbar->canvas );
38 
39 	if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)scrollbar)
40 		gr_setcolor( CRED );
41 	else
42 		gr_setcolor( CGREY );
43 
44 	gr_rect( 0, 0, scrollbar->width-1, scrollbar->fake_position-1 );
45 	gr_rect( 0, scrollbar->fake_position+scrollbar->fake_size, scrollbar->width-1, scrollbar->height-1);
46 
47 	ui_draw_box_out(0, scrollbar->fake_position, scrollbar->width-1, scrollbar->fake_position+scrollbar->fake_size-1 );
48 
49 	ui_mouse_show();
50 
51 }
52 
ui_add_gadget_scrollbar(UI_WINDOW * wnd,short x,short y,short w,short h,int start,int stop,int position,int window_size)53 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  )
54 {
55 	int tw, th, taw;
56 
57 	UI_GADGET_SCROLLBAR * scrollbar;
58 	char up[2];
59 	char down[2];
60 	up[0] = 30; up[1] = 0;
61 	down[0] = 31; down[1] = 0;
62 
63 	gr_get_string_size( up, &tw, &th, &taw );
64 
65 	w = tw + 10;
66 
67 	if (stop < start ) stop = start;
68 
69 	scrollbar = (UI_GADGET_SCROLLBAR *)ui_gadget_add( wnd, 3, x, y+w, x+w-1, y+h-w-1 );
70 
71 	scrollbar->up_button = ui_add_gadget_button( wnd, x, y, w, w, up, NULL );
72 	scrollbar->up_button->parent = (UI_GADGET *)scrollbar;
73 
74 	scrollbar->down_button =ui_add_gadget_button( wnd, x, y+h-w, w, w, down, NULL );
75 	scrollbar->down_button->parent = (UI_GADGET *)scrollbar;
76 
77 	scrollbar->horz = 0;
78 	scrollbar->width = scrollbar->x2-scrollbar->x1+1;
79 	scrollbar->height = scrollbar->y2-scrollbar->y1+1;
80 	scrollbar->start = start;
81 	scrollbar->stop = stop;
82 	scrollbar->position = position;
83 	scrollbar->window_size = window_size;
84 	scrollbar->fake_length = scrollbar->height;
85 	scrollbar->fake_position =  0;
86 	if (stop!=start)
87 		scrollbar->fake_size = (window_size * scrollbar->height)/(stop-start+1+window_size);
88 	else
89 		scrollbar->fake_size = scrollbar->height;
90 
91 	if (scrollbar->fake_size < 7) scrollbar->fake_size = 7;
92 	scrollbar->dragging = 0;
93 	scrollbar->moved=0;
94 	scrollbar->last_scrolled = 0;
95 	return scrollbar;
96 
97 }
98 
ui_scrollbar_do(UI_GADGET_SCROLLBAR * scrollbar,int keypress)99 void ui_scrollbar_do( UI_GADGET_SCROLLBAR * scrollbar, int keypress )
100 {
101 	int OnMe, OnSlider, keyfocus;
102 
103 	int oldpos, op;
104 
105 	keyfocus = 0;
106 	keypress = keypress;
107 
108 	if (CurWindow->keyboard_focus_gadget==(UI_GADGET *)scrollbar)
109 		keyfocus = 1;
110 
111 	if (scrollbar->start==scrollbar->stop)
112 	{
113 		scrollbar->position = 0;
114 		scrollbar->fake_position = 0;
115 		ui_draw_scrollbar( scrollbar );
116 		return;
117 	}
118 
119 	op = scrollbar->position;
120 
121 	oldpos = scrollbar->fake_position;
122 
123 	scrollbar->moved = 0;
124 
125 
126 	if ( (scrollbar->up_button->position!=0) || (keyfocus && keyd_pressed[KEY_UP]) )
127 	{
128 		if (TICKER > scrollbar->last_scrolled+1)
129 		{
130 			scrollbar->last_scrolled = TICKER;
131 			scrollbar->position--;
132 			if (scrollbar->position < scrollbar->start )
133 				scrollbar->position = scrollbar->start;
134 			scrollbar->fake_position = scrollbar->position-scrollbar->start;
135 			scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
136 			scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
137 		}
138 	}
139 
140 	if ( (scrollbar->down_button->position!=0) || (keyfocus && keyd_pressed[KEY_DOWN]) )
141 	{
142 		if (TICKER > scrollbar->last_scrolled+1)
143 		{
144 			scrollbar->last_scrolled = TICKER;
145 			scrollbar->position++;
146 			if (scrollbar->position > scrollbar->stop )
147 				scrollbar->position = scrollbar->stop;
148 			scrollbar->fake_position = scrollbar->position-scrollbar->start;
149 			scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
150 			scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
151 		}
152 	}
153 
154 	OnMe = ui_mouse_on_gadget( (UI_GADGET *)scrollbar );
155 
156 	//gr_ubox(0, scrollbar->fake_position, scrollbar->width-1, scrollbar->fake_position+scrollbar->fake_size-1 );
157 
158 	if (!B1_PRESSED )
159 		scrollbar->dragging = 0;
160 
161 	//if (B1_PRESSED && OnMe )
162 	//    listbox->dragging = 1;
163 
164 
165 	OnSlider = 0;
166 	if ((Mouse.y >= scrollbar->fake_position+scrollbar->y1) && \
167 		(Mouse.y < scrollbar->fake_position+scrollbar->y1+scrollbar->fake_size) && OnMe )
168 		OnSlider = 1;
169 
170 	if (B1_JUST_PRESSED && OnSlider )
171 	{
172 		scrollbar->dragging = 1;
173 		scrollbar->drag_x = Mouse.x;
174 		scrollbar->drag_y = Mouse.y;
175 		scrollbar->drag_starting = scrollbar->fake_position;
176 	}
177 
178 	if  ( B1_PRESSED && OnMe && !OnSlider && (TICKER > scrollbar->last_scrolled+4) )
179 	{
180 		scrollbar->last_scrolled = TICKER;
181 
182 		if ( Mouse.y < scrollbar->fake_position+scrollbar->y1 )
183 		{
184 			// Page Up
185 			scrollbar->position -= scrollbar->window_size;
186 			if (scrollbar->position < scrollbar->start )
187 				scrollbar->position = scrollbar->start;
188 
189 		} else {
190 			// Page Down
191 			scrollbar->position += scrollbar->window_size;
192 			if (scrollbar->position > scrollbar->stop )
193 				scrollbar->position = scrollbar->stop;
194 		}
195 		scrollbar->fake_position = scrollbar->position-scrollbar->start;
196 		scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
197 		scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
198 	}
199 
200 	if ((selected_gadget==(UI_GADGET *)scrollbar) && B1_PRESSED && scrollbar->dragging )
201 	{
202 		//Mouse.x = scrollbar->drag_x;
203 		scrollbar->fake_position = scrollbar->drag_starting + (Mouse.y - scrollbar->drag_y );
204 		if (scrollbar->fake_position<0)
205 		{
206 			scrollbar->fake_position = 0;
207 			//Mouse.y = scrollbar->fake_position + scrollbar->drag_y - scrollbar->drag_starting;
208 		}
209 		if (scrollbar->fake_position > (scrollbar->height-scrollbar->fake_size))
210 		{
211 			scrollbar->fake_position = (scrollbar->height-scrollbar->fake_size);
212 			//Mouse.y = scrollbar->fake_position + scrollbar->drag_y - scrollbar->drag_starting;
213 		}
214 
215 		//mouse_set_pos( Mouse.x, Mouse.y );
216 
217 		scrollbar->position = scrollbar->fake_position;
218 		scrollbar->position *= (scrollbar->stop-scrollbar->start);
219 		scrollbar->position /= ( scrollbar->height-scrollbar->fake_size ) ;
220 		scrollbar->position += scrollbar->start;
221 
222 		if (scrollbar->position > scrollbar->stop )
223 			scrollbar->position = scrollbar->stop;
224 
225 		if (scrollbar->position < scrollbar->start )
226 			scrollbar->position = scrollbar->start;
227 
228 		//scrollbar->fake_position = scrollbar->position-scrollbar->start;
229 		//scrollbar->fake_position *= scrollbar->height-scrollbar->fake_size;
230 		//scrollbar->fake_position /= (scrollbar->stop-scrollbar->start);
231 
232 	}
233 
234 	if (op != scrollbar->position )
235 		scrollbar->moved = 1;
236 
237 	if (oldpos != scrollbar->fake_position)
238 		scrollbar->status = 1;
239 	ui_draw_scrollbar( scrollbar );
240 
241 }
242 
243