Subversion Repositories Kolibri OS

Rev

Rev 7498 | Rev 7503 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7498 Rev 7500
Line 1... Line 1...
1
//íå èä¸ò äàëüøå 98 ñòðîêè 
1
//не идёт дальше 98 строки 
2
//åñëè âûäåëèòü îáëàñòü ÿ÷ååê è ñäâèíóòü êóðñîð ââîäà ñ ïîìîùüþ êëàâèø, "ñëåäû" îñòàíóòüñÿ
2
//если выделить область ячеек и сдвинуть курсор ввода с помощью клавиш, "следы" остануться
3
//íåëüçÿ ïåðåìåùàòüñÿ ïî áóêâàì â ðåäàêòèðóåìîé ñòðîêå
3
//нельзя перемещаться по буквам в редактируемой строке
Line 4... Line 4...
4
 
4
 
5
#include "func.h"
5
#include "func.h"
6
#include "parser.h"
6
#include "parser.h"
7
#include "calc.h"
7
#include "calc.h"
Line 8... Line 8...
8
#include "use_library.h"
8
#include "use_library.h"
Line 9... Line 9...
9
 
9
 
10
#define TABLE_VERSION "0.98"
10
#define TABLE_VERSION "0.98.1"
11
 
11
 
12
// ñòðîêè, êîòîðûå âûâîäèò ïðîãðàììà
12
// строки, которые выводит программа
13
const char *sFileSign = "KolibriTable File\n";
13
const char *sFileSign = "KolibriTable File\n";
14
const char sFilename[] = "Filename:";
14
const char sFilename[] = "Filename:";
Line 24... Line 24...
24
 
24
 
25
// initial window sizes
25
// initial window sizes
26
#define WND_W 640
26
#define WND_W 640
27
#define WND_H 480
27
#define WND_H 480
28
// new window size and coordinates
-
 
29
int wi;
-
 
30
int he;
28
// new window size and coordinates
31
int cWidth;
29
int cWidth;
Line 32... Line 30...
32
int cHeight;
30
int cHeight;
33
 
31
 
Line 65... Line 63...
65
char edit_text[256] = "";
63
char edit_text[256] = "";
66
edit_box cell_box = {0,9*8-5,WND_H - 16-32,0xffffff,0x6a9480,0,0x808080,0,255,(dword)&edit_text,(dword)&mouse_dd,0};
64
edit_box cell_box = {0,9*8-5,WND_H - 16-32,0xffffff,0x6a9480,0,0x808080,0,255,(dword)&edit_text,(dword)&mouse_dd,0};
67
scroll_bar scroll_v = { SCROLL_SIZE,200,398, NULL, SCROLL_SIZE,0,115,15,0,0xeeeeee,0xD2CED0,0x555555,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1};
65
scroll_bar scroll_v = { SCROLL_SIZE,200,398, NULL, SCROLL_SIZE,0,115,15,0,0xeeeeee,0xD2CED0,0x555555,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1};
68
scroll_bar scroll_h = { 200,NULL,SCROLL_SIZE, NULL, SCROLL_SIZE,0,115,15,0,0xeeeeee,0xD2CED0,0x555555,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1};
66
scroll_bar scroll_h = { 200,NULL,SCROLL_SIZE, NULL, SCROLL_SIZE,0,115,15,0,0xeeeeee,0xD2CED0,0x555555,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1};
Line 69... Line 67...
69
 
67
 
70
// ÿ÷åéêè - èõ ïàðàìåòðû è òåêñò
68
// ячейки - их параметры и текст
71
DWORD def_col_width = 80, def_row_height = 16;
69
DWORD def_col_width = 80, def_row_height = 16;
72
DWORD col_count = 200, row_count = 100;
70
DWORD col_count = 200, row_count = 100;
73
DWORD *col_width, *row_height;
71
DWORD *col_width, *row_height;
74
char ***cells;
-
 
Line -... Line 72...
-
 
72
char ***cells;
-
 
73
 
-
 
74
struct GRID
-
 
75
{
-
 
76
	int x,y,w,h;
-
 
77
} grid;
-
 
78
 
75
char ***values;	// çíà÷åíèÿ ôîðìóë, åñëè åñòü
79
char ***values;	// значения формул, если есть
Line 76... Line 80...
76
 
80
 
77
bool display_formulas = 0;	// îòîáðàæàòü ëè ôîðìóëû âìåñòî çíà÷åíèé
81
bool display_formulas = 0;	// отображать ли формулы вместо значений
Line 78... Line 82...
78
 
82
 
79
// êîîðäèíàòû îòîáðàæàåìûõ ñòîëáöîâ è ñòðîê
83
// координаты отображаемых столбцов и строк
80
DWORD *col_left, *row_top;
84
DWORD *col_left, *row_top;
81
 
85
 
Line 82... Line 86...
82
// áóôåð îáìåíà
86
// буфер обмена
83
char ***buffer = NULL;
87
char ***buffer = NULL;
84
DWORD buf_col, buf_row;
88
DWORD buf_col, buf_row;
85
DWORD buf_old_x, buf_old_y;
89
DWORD buf_old_x, buf_old_y;
86
 
90
 
87
// ýòî êîîðäèíàòû ÿ÷åéêè, îòîáðàæàåìîé â Ë óãëå
91
// это координаты ячейки, отображаемой в ЛВ угле
Line 88... Line 92...
88
DWORD scroll_x = 1, scroll_y = 1;
92
DWORD scroll_x = 1, scroll_y = 1;
89
// ýòî âûäåëåííàÿ ÿ÷åéêà
93
// это выделенная ячейка
Line 90... Line 94...
90
DWORD sel_x = 1, sel_y = 1;
94
DWORD sel_x = 1, sel_y = 1;
91
DWORD prev_x = 0, prev_y = 0;	// ïðåäûäóùàÿ âûäåëåííàÿ
95
DWORD prev_x = 0, prev_y = 0;	// предыдущая выделенная
92
int was_single_selection = 0;
96
int was_single_selection = 0;
93
 
-
 
94
// êîíåö âûäåëåíèÿ åñëè âûäåëåíî íåñêîëüêî ÿ÷ååê
97
 
95
DWORD sel_end_x = sel_x, sel_end_y = sel_y;
98
// конец выделения если выделено несколько ячеек
Line 96... Line 99...
96
 
99
DWORD sel_end_x = sel_x, sel_end_y = sel_y;
97
// ôëàã
100
 
98
bool sel_moved = 0;
101
// флаг
99
bool sel_end_move = 0;
102
bool sel_moved = 0;
Line 100... Line 103...
100
bool window_drawall = false;
103
bool sel_end_move = 0;
101
// ñêîëüêî ÿ÷ååê ïîìåùàåòñÿ â îêíå ïî õ è ó
104
// сколько ячеек помещается в окне по х и у
102
DWORD nx = 0, ny = 0;
105
DWORD nx = 0, ny = 0;
103
 
106
 
Line 104... Line 107...
104
// ôëàã ðåàäêòèðîâàíèÿ ÿ÷åéêè
107
// флаг реадктирования ячейки
105
//bool is_edit = 0;
108
//bool is_edit = 0;
106
#define ed_focus 2
109
#define ed_focus 2
107
#define is_edit (cell_box.flags & ed_focus)
110
#define is_edit (cell_box.flags & ed_focus)
108
 
111
 
109
// ðåäàêòèðîâàíèå èìåíè ôàéëà
112
// редактирование имени файла
Line 110... Line 113...
110
bool fn_edit = 0;
113
bool fn_edit = 0;
111
char fname[256];
114
char fname[256];
112
edit_box file_box = {98,9*8-5,WND_H - 16-32,0xffffff,0x6a9480,0,0x808080,0,255,(dword)&fname,(dword)&mouse_dd,0};
115
edit_box file_box = {98,9*8-5,WND_H - 16-32,0xffffff,0x6a9480,0,0x808080,0,255,(dword)&fname,(dword)&mouse_dd,0};
Line 113... Line 116...
113
 
116
 
Line 141... Line 144...
141
 
144
 
142
void DrawScrolls()
145
void DrawScrolls()
143
{
146
{
144
	// HOR
147
	// HOR
145
	scroll_h.x = 0;
148
	scroll_h.x = 0;
146
	scroll_h.y = he - SCROLL_SIZE;
149
	scroll_h.y = grid.y + grid.h;
147
	scroll_h.w = cWidth - SCROLL_SIZE;
150
	scroll_h.w = grid.w;
148
	scroll_h.all_redraw = true;
151
	scroll_h.all_redraw = true;
149
	scroll_h.max_area = col_count;
152
	scroll_h.max_area = col_count;
150
	scroll_h.cur_area = nx-scroll_x-1;
153
	scroll_h.cur_area = nx-scroll_x-1;
151
	scroll_h.position = scroll_x-1;
154
	scroll_h.position = scroll_x-1;
Line 152... Line 155...
152
	scrollbar_h_draw((DWORD)&scroll_h);
155
	scrollbar_h_draw((DWORD)&scroll_h);
153
 
156
 
154
	// VER
157
	// VER
155
	scroll_v.x = cWidth - SCROLL_SIZE - 1;
158
	scroll_v.x = grid.x + grid.w;
156
	scroll_v.y = 0;
159
	scroll_v.y = 0;
157
	scroll_v.h = he - SCROLL_SIZE;
160
	scroll_v.h = grid.h;
158
	scroll_v.all_redraw = true;
161
	scroll_v.all_redraw = true;
159
	scroll_v.max_area = row_count;
162
	scroll_v.max_area = row_count;
160
	scroll_v.cur_area = ny-scroll_y-1;
163
	scroll_v.cur_area = ny-scroll_y-1;
Line 260... Line 263...
260
		scroll_x = sel_x;
263
		scroll_x = sel_x;
261
	if (sel_y < scroll_y)
264
	if (sel_y < scroll_y)
262
		scroll_y = sel_y;
265
		scroll_y = sel_y;
Line 263... Line 266...
263
 
266
 
264
	if (sx0 != scroll_x || sy0 != scroll_y)
267
	if (sx0 != scroll_x || sy0 != scroll_y)
Line 265... Line 268...
265
		sel_moved = 0;			// íàäî ïåðåðèñîâàòü âñå
268
		sel_moved = 0;			// надо перерисовать все
Line 266... Line 269...
266
 
269
 
267
}
270
}
Line 286... Line 289...
286
	sel_end_y = sel_y;
289
	sel_end_y = sel_y;
287
	check_sel();
290
	check_sel();
288
	draw_window();
291
	draw_window();
289
}
292
}
Line 290... Line -...
290
 
-
 
291
void draw_custom_button(int x0, int y0, int sx, int sy, int blue_border)
-
 
292
{
-
 
293
	int x1 = x0 + sx;
-
 
294
	int y1 = y0 + sy;
-
 
295
 
-
 
296
	if (blue_border) kos_DrawRegion(x0-1, y0-1, sx+3, sy+3, 0x94aece, 0);
-
 
297
 
-
 
298
	// ñåðûé ïðÿìîóãîëüíèê
-
 
299
 
-
 
300
	kos_DrawBar(x0 + 1, y0 + 1, sx - 1, sy - 1, PANEL_BG_COLOR);
-
 
301
	
-
 
302
	// äâå áåëûå ëèíèè: ñâåðõó è ñëåâà
-
 
303
 
-
 
304
	kos_DrawLine(x0, y0, x1, y0, 0xffffff, 0);
-
 
305
	kos_DrawLine(x0, y0, x0, y1, 0xffffff, 0);
-
 
306
 
-
 
307
	// äâå ñåðûå ëèíèè: ñíèçó è ñïðàâà
-
 
308
	kos_DrawLine(x0, y1, x1, y1, 0xc7c7c7, 0);
-
 
309
	kos_DrawLine(x1, y0, x1, y1, 0xc7c7c7, 0);
-
 
310
}
-
 
311
 
293
 
312
// x - ìåæäó low è high ? - íåîáÿçàòåëüíî low
294
// x - между low и high ? - необязательно low
313
bool is_between(Dword x, Dword low, Dword high)
295
bool is_between(Dword x, Dword low, Dword high)
314
{
296
{
315
	return ((low= low && x <= high):(x >= high && x <= low));
297
	return ((low= low && x <= high):(x >= high && x <= low));
Line 333... Line 315...
333
	int y1 = y0;
315
	int y1 = y0;
334
	y1 += row_height[py];
316
	y1 += row_height[py];
335
	kos_DrawBar(x0 + 1, y0 + 1, x1 - x0 - 1, y1 - y0 - 1, 0xffffff);
317
	kos_DrawBar(x0 + 1, y0 + 1, x1 - x0 - 1, y1 - y0 - 1, 0xffffff);
336
}
318
}
Line 337... Line -...
337
 
-
 
338
//debug
-
 
339
const int debugcolor[10]={0xff0000,0x00ff00,0x0000ff,0xffff00,0x00ffff,0xff00ff,0x800000,0x008000,0x000080,0x800080};
-
 
Line -... Line 319...
-
 
319
 
340
int debugc=0;
320
 
341
 
321
 
342
// ðèñîâàíèå ÿ÷ååê
322
// рисование ячеек
Line 343... Line 323...
343
#define is_x_changed(v) ((v) == sel_x || (v) == prev_x)
323
#define is_x_changed(v) ((v) == sel_x || (v) == prev_x)
344
#define is_y_changed(v) ((v) == sel_y || (v) == prev_y)
324
#define is_y_changed(v) ((v) == sel_y || (v) == prev_y)
345
 
325
 
346
void draw_grid()
326
void draw_grid()
347
{
327
{
348
	int i,j;
328
	int i,j;
349
	long x0 = 0, y0 = 0, x = 0, y = 0, dx;
-
 
350
	DWORD text_color;
-
 
351
	DWORD bg_color;
-
 
352
	//int lx, ly;
-
 
Line 353... Line 329...
353
 
329
	long x0 = 0, y0 = 0, x = 0, y = 0, dx;
Line 354... Line 330...
354
//	sprintf(debuf, "%U,%U", scroll_x, scroll_y);
330
	DWORD text_color;
355
//	rtlDebugOutString(debuf);
331
	DWORD bg_color;
356
 
332
 
357
	nx=ny=0;
333
	nx=ny=0;
358
 
334
 
359
	// î÷èñòèòü îáëàñòü îêîëî âûäåëåííîé ÿ÷åéêè
335
	// очистить область около выделенной ячейки
360
	if (sel_moved)
336
	if (sel_moved)
361
	{
337
	{
362
		clear_cell_slow(sel_x, sel_y);
338
		clear_cell_slow(sel_x, sel_y);
363
		clear_cell_slow(prev_x, prev_y);
339
		clear_cell_slow(prev_x, prev_y);
364
	}
340
	}
Line 365... Line 341...
365
	else
341
	else
366
	{
342
	{
367
		// î÷èñòèòü âñþ îáëàñòü ÿ÷ååê
343
		// очистить всю область ячеек
368
		//kos_DrawBar(col_width[0]+1, row_height[0]+1, wi - SCROLL_SIZE-col_width[0]-1, he - SCROLL_SIZE-row_height[0]-1, 0xffffff);
344
		//kos_DrawBar(col_width[0]+1, row_height[0]+1, grid.w - SCROLL_SIZE-col_width[0]-1, he - SCROLL_SIZE-row_height[0]-1, 0xffffff);
369
	}
345
	}
370
 
346
 
371
	col_left[0] = 0;
347
	col_left[0] = 0;
Line 379... Line 355...
379
		{
355
		{
380
			{				
356
			{				
381
				if (!sel_moved || is_x_changed(i)) {
357
				if (!sel_moved || is_x_changed(i)) {
382
					kos_DrawLine(x-x0, 0, x-x0, row_height[0], GRID_COLOR, 0);
358
					kos_DrawLine(x-x0, 0, x-x0, row_height[0], GRID_COLOR, 0);
383
				}
359
				}
384
				// è çàãîëîâîê ÿ÷åéêè ïî õ
360
				// и заголовок ячейки по х
385
				text_color = TEXT_COLOR;
361
				text_color = TEXT_COLOR;
386
				dx = (col_width[i]-6)/2;
362
				dx = (col_width[i]-6)/2;
387
				int dy = (row_height[0] - 8) / 2 + 1;
363
				int dy = (row_height[0] - 8) / 2 + 1;
388
				int cur_width = col_width[i] - 1;
364
				int cur_width = col_width[i] - 1;
389
				if (cur_width + x - x0 > wi - SCROLL_SIZE)
365
				if (cur_width + x - x0 > grid.w)
390
					cur_width = wi - SCROLL_SIZE - x + x0 -1;
366
					cur_width = grid.w - x + x0 -1;
391
				if (!sel_moved || (is_x_changed(i))) {
367
				if (!sel_moved || (is_x_changed(i))) {
392
					if (is_between(i,sel_x,sel_end_x))	
368
					if (is_between(i,sel_x,sel_end_x))	
393
					{
369
					{
394
						bg_color = SEL_FIXED_CELL_COLOR; 
370
						bg_color = SEL_FIXED_CELL_COLOR; 
395
						text_color = TEXT_SEL_FIXED_COLOR;
371
						text_color = TEXT_SEL_FIXED_COLOR;
Line 400... Line 376...
400
						text_color = TEXT_COLOR;
376
						text_color = TEXT_COLOR;
401
					}
377
					}
402
					kos_DrawBar(x - x0 + 1,0,cur_width,row_height[0],bg_color);
378
					kos_DrawBar(x - x0 + 1,0,cur_width,row_height[0],bg_color);
403
					kos_WriteTextToWindow(x-x0+2+dx,dy,0,text_color,cells[i][0],strlen(cells[i][0]));	
379
					kos_WriteTextToWindow(x-x0+2+dx,dy,0,text_color,cells[i][0],strlen(cells[i][0]));	
404
				}
380
				}
405
				// åñòü êíîïêà ñòîáëöà è åùå êíîïêà èçìåíåíèÿ øèðèíû 
381
				// есть кнопка стоблца и еще кнопка изменения ширины 
406
				if (x - x0 + col_width[i] <= wi - col_width[0])
382
				if (x - x0 + col_width[i] <= grid.w - col_width[0])
407
				{
383
				{
408
					kos_DeleteButton(COL_HEAD_BUTTON+i);
384
					kos_DeleteButton(COL_HEAD_BUTTON+i);
409
					kos_DefineButton(x-x0+5,0,cur_width - 10,row_height[0]-1,BT_NODRAW+COL_HEAD_BUTTON+i,0);
385
					kos_DefineButton(x-x0+5,0,cur_width - 10,row_height[0]-1,BT_NODRAW+COL_HEAD_BUTTON+i,0);
410
				}
386
				}
411
				//kos_DefineButton(x-x0+col_width[i]-10,0,15,row_height[0]-1,BT_NODRAW+COL_SIZE_BUTTON+i,0);
387
				//kos_DefineButton(x-x0+col_width[i]-10,0,15,row_height[0]-1,BT_NODRAW+COL_SIZE_BUTTON+i,0);
412
				col_left[i] = x - x0;
388
				col_left[i] = x - x0;
413
			}
389
			}
414
			if (x - x0 > wi - col_width[0])
390
			if (x - x0 > grid.w - col_width[0])
415
			{
391
			{
416
				x += col_width[i];
392
				x += col_width[i];
417
				nx++;
393
				nx++;
418
				break;
394
				break;
419
			}
395
			}
Line 427... Line 403...
427
	}
403
	}
Line 428... Line 404...
428
 
404
 
Line 429... Line 405...
429
	//kos_DefineButton(0,0,0,0,0x80000000+COL_HEAD_BUTTON+i,0);
405
	//kos_DefineButton(0,0,0,0,0x80000000+COL_HEAD_BUTTON+i,0);
430
 
406
 
431
	for (j = i + 1; j < col_count; j++) 
407
	for (j = i + 1; j < col_count; j++) 
Line 432... Line 408...
432
		col_left[j] = wi;
408
		col_left[j] = grid.w;
433
	//if (!sel_moved || (is_x_changed(nx))) kos_DrawLine(x - x0, 0, x - x0, he, GRID_COLOR, 0);
409
	//if (!sel_moved || (is_x_changed(nx))) kos_DrawLine(x - x0, 0, x - x0, grid.h, GRID_COLOR, 0);
434
 
410
 
435
	// ÿ÷åéêè - çàãîëîâêè ñòðîê + ãîðèçîíò. ëèíèè
411
	// ячейки - заголовки строк + горизонт. линии
436
	y = row_height[0];
412
	y = row_height[0];
437
	ny = 1;
413
	ny = 1;
438
	row_top[0] = 0;
414
	row_top[0] = 0;
439
	for (i = 1; i < row_count && y - y0 < he - SCROLL_SIZE; i++)
415
	for (i = 1; i < row_count && y - y0 < grid.h; i++)
440
	{
416
	{
441
		row_top[i] = -1;
417
		row_top[i] = -1;
442
		if (i >= scroll_y)
418
		if (i >= scroll_y)
443
		{
419
		{
444
			{
420
			{
445
				if (!sel_moved || (is_y_changed(i))) 
421
				if (!sel_moved || (is_y_changed(i))) 
446
					kos_DrawLine(0, y - y0, wi - SCROLL_SIZE - 1, y - y0, GRID_COLOR, 0);
422
					kos_DrawLine(0, y - y0, grid.w - 1, y - y0, GRID_COLOR, 0);
447
				// è çàãîëîâîê ÿ÷åéêè ïî y
423
				// и заголовок ячейки по y
448
				text_color = TEXT_COLOR;
424
				text_color = TEXT_COLOR;
449
				dx = (col_width[0]-6 * strlen(cells[0][i]))/2;	// optimize this, change strlen
425
				dx = (col_width[0]-6 * strlen(cells[0][i]))/2;	// optimize this, change strlen
Line 478... Line 454...
478
	}
454
	}
Line 479... Line 455...
479
	
455
	
Line 480... Line 456...
480
	kos_DefineButton(0,0,0,0,0x80000000+ROW_HEAD_BUTTON+ny-1,0);
456
	kos_DefineButton(0,0,0,0,0x80000000+ROW_HEAD_BUTTON+ny-1,0);
481
 
457
 
482
	for (j = i + 1; j < row_count; j++)
458
	for (j = i + 1; j < row_count; j++)
483
		row_top[j] = he;
459
		row_top[j] = grid.h;
Line 484... Line 460...
484
	if (!sel_moved || (is_y_changed(ny))) 
460
	if (!sel_moved || (is_y_changed(ny))) 
485
		kos_DrawLine(0, y - y0, wi - SCROLL_SIZE, y - y0, GRID_COLOR, 0);
461
		kos_DrawLine(0, y - y0, grid.w, y - y0, GRID_COLOR, 0);
486
 
462
 
Line 487... Line 463...
487
	if (!sel_moved || (is_x_changed(0) && is_y_changed(0)))
463
	if (!sel_moved || (is_x_changed(0) && is_y_changed(0)))
488
		kos_DrawBar(0,0,col_width[0],row_height[0],FIXED_CELL_COLOR); 
464
		kos_DrawBar(0,0,col_width[0],row_height[0],FIXED_CELL_COLOR); 
Line 489... Line 465...
489
	// Ë ÿ÷åéêà
465
	// ЛВ ячейка
Line 490... Line 466...
490
 
466
 
491
	//sprintf(debuf, "%U, %U; %U, %U", x0, y0, nx, ny);
467
	//sprintf(debuf, "%U, %U; %U, %U", x0, y0, nx, ny);
492
	//rtlDebugOutString(debuf);
468
	//rtlDebugOutString(debuf);
493
 
469
 
494
	// ñàìè ÿ÷åéêè
470
	// cells itself
495
 
471
 
496
	y = row_height[0];
472
	y = row_height[0];
497
	for (i = scroll_y; i < ny; i++)
473
	for (i = scroll_y; i < ny; i++)
498
	{
474
	{
499
		x = col_width[0];
475
		x = col_width[0];
Line 500... Line 476...
500
		if (!sel_moved)
476
		if (!sel_moved)
501
			kos_DrawBar(col_width[0]+1, y+1, wi - SCROLL_SIZE-col_width[0]-1, row_height[i]-1, 0xffffff);
477
			kos_DrawBar(col_width[0]+1, y+1, grid.w -col_width[0]-1, row_height[i]-1, 0xffffff);
502
		for (j = scroll_x; j < nx-1; j++)
478
		for (j = scroll_x; j < nx-1; j++)
503
		{
479
		{
Line 504... Line 480...
504
			if (!sel_moved || is_x_changed(j) || is_y_changed(i)) 
480
			if (!sel_moved || is_x_changed(j) || is_y_changed(i)) 
505
				kos_DrawLine(col_left[j], row_top[i], col_left[j], row_height[i], GRID_COLOR, 0);
481
				kos_DrawLine(col_left[j], row_top[i], col_left[j], row_height[i], GRID_COLOR, 0);
506
 
482
 
507
			// çàãîëîâêè óæå íàðèñîâàíû - ïðîïóñêàåì èõ
483
			// заголовки уже нарисованы - пропускаем их
508
			if (i && j)	
484
			if (i && j)	
509
			{
485
			{
510
				//kos_DrawBar(x+1, y+1, col_width[i]-1, row_height[i]-1, 0xffffff);
486
				//kos_DrawBar(x+1, y+1, col_width[i]-1, row_height[i]-1, 0xffffff);
511
 
487
 
512
				//rtlDebugOutString(cap);
488
				//rtlDebugOutString(cap);
513
				//if (j >= sel_x && j <= sel_end_x && i >= sel_y && i <= sel_end_y)
489
				//if (j >= sel_x && j <= sel_end_x && i >= sel_y && i <= sel_end_y)
514
				if (is_between(j,sel_x,sel_end_x) && is_between(i, sel_y, sel_end_y)	// (j,i) - âûäåëåíà
490
				if (is_between(j,sel_x,sel_end_x) && is_between(i, sel_y, sel_end_y)	// (j,i) - âûäåëåíà
515
				&& ((!sel_moved) || (is_x_changed(j) && is_y_changed(i))))			// è åå íóæíî íàðèñîâàòü
491
				&& ((!sel_moved) || (is_x_changed(j) && is_y_changed(i))))			// è åå íóæíî íàðèñîâàòü
516
				{
492
				{
Line 517... Line 493...
517
					if (i == sel_y && j == sel_x) // ðàìêà
493
					if (i == sel_y && j == sel_x) // frame
518
					{
494
					{
Line 519... Line 495...
519
						DrawSelectedFrame(x+1,y, col_width[j]-1, row_height[j], TEXT_COLOR);
495
						DrawSelectedFrame(x+1,y, col_width[j]-1, row_height[j], TEXT_COLOR);
Line 552... Line 528...
552
	}
528
	}
Line 553... Line 529...
553
 
529
 
554
	DrawScrolls();
530
	DrawScrolls();
Line 555... Line 531...
555
}
531
}
556
 
532
 
557
// î÷åíü áûñòðîå ðèñîâàíèå ñåòêè, â ïðîöåññå èçìåíåíèÿ ðàçìåðîâ ÿ÷ååê
533
// очень быстрое рисование сетки, в процессе изменения размеров ячеек
558
void draw_size_grid()
534
void draw_size_grid()
Line 559... Line 535...
559
{
535
{
560
	//rtlDebugOutString("draw size grid");
536
	//rtlDebugOutString("draw size grid");
561
 
537
 
Line 562... Line 538...
562
	if (size_state == SIZE_X)
538
	if (size_state == SIZE_X)
563
	{
539
	{
564
		int x, x0, i;
540
		int x, x0, i;
565
 
541
 
566
		x = col_width[0]; 
542
		x = col_width[0]; 
567
		x0 = 0;
543
		x0 = 0;
568
		for (i = 1; i < col_count && x - x0 + col_width[i] < wi - 10; i++)
544
		for (i = 1; i < col_count && x - x0 + col_width[i] < grid.w - 10; i++)
569
		{
545
		{
570
			if (i >= scroll_x)
546
			if (i >= scroll_x)
571
			{
547
			{
572
				if (i >= size_id)
548
				if (i >= size_id)
573
					kos_DrawLine(x - x0, 0, x - x0, he, 0, 1);
549
					kos_DrawLine(x - x0, 0, x - x0, grid.h, 0, 1);
574
			}
550
			}
575
			else
551
			else
576
				x0 += col_width[i];
552
				x0 += col_width[i];
577
			x += col_width[i];
553
			x += col_width[i];
578
		}
554
		}
579
		kos_DrawLine(x - x0, 0, x - x0, he, 0, 1);
555
		kos_DrawLine(x - x0, 0, x - x0, grid.h, 0, 1);
Line 580... Line 556...
580
	}
556
	}
581
	else
557
	else
582
	{
558
	{
583
		int y, y0, i;
559
		int y, y0, i;
584
 
560
 
585
		y = row_height[0]; 
561
		y = row_height[0]; 
586
		y0 = 0;
562
		y0 = 0;
587
		for (i = 1; i < col_count && y - y0 + row_height[i] < he - 10; i++)
563
		for (i = 1; i < col_count && y - y0 + row_height[i] < grid.h - 10; i++)
588
		{
564
		{
589
			if (i >= scroll_y)
565
			if (i >= scroll_y)
590
			{
566
			{
591
				if (i >= size_id)
567
				if (i >= size_id)
592
					kos_DrawLine(0, y - y0, wi, y - y0, 0, 1);
568
					kos_DrawLine(0, y - y0, grid.w, y - y0, 0, 1);
593
			}
569
			}
594
			else
570
			else
Line 595... Line 571...
595
				y0 += row_height[i];
571
				y0 += row_height[i];
Line 596... Line 572...
596
			y += row_height[i];
572
			y += row_height[i];
597
		}
573
		}
598
		kos_DrawLine(0, y - y0, wi, y - y0, 0, 1);
574
		kos_DrawLine(0, y - y0, grid.w, y - y0, 0, 1);
599
	}
575
	}
600
 
576
 
601
}
577
}
602
 
578
 
Line 603... Line 579...
603
 
579
 
604
// áûñòðîå ðèñîâàíèå âûäåëåííîé îáëàñòè ïðè âûäåëåíèè ìûøüþ
580
// быстрое рисование выделенной области при выделении мышью
605
#define DCOLOR 0
581
#define DCOLOR 0
606
//0xff0000
582
//0xff0000
Line 607... Line 583...
607
#define DINVERT 1
583
#define DINVERT 1
608
void draw_drag()
584
void draw_drag()
609
{
585
{
610
	// ñîáñòâåííî, 4 èíâåðñíûå ëèíèè
586
	// inverted lines
611
 
587
 
612
	int k0 = min(sel_x, sel_end_x);
588
	int k0 = min(sel_x, sel_end_x);
613
	int k1 = max(sel_x, sel_end_x);
589
	int k1 = max(sel_x, sel_end_x);
614
	int n0 = min(sel_y, sel_end_y);
590
	int n0 = min(sel_y, sel_end_y);
Line 615... Line 591...
615
	int n1 = max(sel_y, sel_end_y);
591
	int n1 = max(sel_y, sel_end_y);
616
 
592
 
Line 617... Line 593...
617
	DWORD x0 = col_left[k0] - 1;
593
	DWORD x0 = col_left[k0] - 1;
618
	DWORD x1 = col_left[k1] + col_width[k1] + 1;
594
	DWORD x1 = col_left[k1] + col_width[k1] + 1;
619
	DWORD y0 = row_top[n0] - 1;	
595
	DWORD y0 = row_top[n0] - 1;	
620
	DWORD y1 = row_top[n1] + row_height[n1] + 1;
596
	DWORD y1 = row_top[n1] + row_height[n1] + 1;
621
	if (x0 > wi - 1) x0 = wi - 1;
597
	if (x0 > grid.w - 1) x0 = grid.w - 1;
Line 622... Line 598...
622
	if (x1 > wi - 1) x1 = wi - 1;
598
	if (x1 > grid.w - 1) x1 = grid.w - 1;
623
	if (y0 > he - 1) y0 = he - 1;
599
	if (y0 > grid.h - 1) y0 = grid.h - 1;
624
	if (y1 > he - 1) y1 = he - 1;
-
 
625
 
-
 
626
	//sprintf(debuf,"drag %U %U %U %U",k0,k1,n0,n1);
-
 
627
	//rtlDebugOutString(debuf);
-
 
628
 
-
 
629
	kos_DrawLine(x0, y0, x0, y1, DCOLOR, DINVERT);
600
	if (y1 > grid.h - 1) y1 = grid.h - 1;
630
	kos_DrawLine(x0, y0, x1, y0, DCOLOR, DINVERT);
601
 
631
	kos_DrawLine(x1, y0, x1, y1, DCOLOR, DINVERT);
602
	//sprintf(debuf,"drag %U %U %U %U",k0,k1,n0,n1);
Line 632... Line 603...
632
	kos_DrawLine(x0, y1, x1, y1, DCOLOR, DINVERT);
603
	//rtlDebugOutString(debuf);
633
}
604
 
634
 
-
 
635
void draw_window()
-
 
636
{
-
 
637
 
605
	kos_DrawLine(x0, y0, x0, y1, DCOLOR, DINVERT);
638
	if (sel_end_move)
606
	kos_DrawLine(x0, y0, x1, y0, DCOLOR, DINVERT);
Line -... Line 607...
-
 
607
	kos_DrawLine(x1, y0, x1, y1, DCOLOR, DINVERT);
-
 
608
	kos_DrawLine(x0, y1, x1, y1, DCOLOR, DINVERT);
-
 
609
}
639
		sel_moved = 0;
610
 
Line 640... Line -...
640
 
-
 
641
	if (window_drawall==true){
611
bool draw_and_define_window()
Line -... Line 612...
-
 
612
{
-
 
613
	kos_WindowRedrawStatus(1);
-
 
614
	kos_DefineAndDrawWindow(110,40,WND_W,WND_H,0x73,0x40FFFFFF,0,0,(Dword)"Table v" TABLE_VERSION);
-
 
615
	kos_WindowRedrawStatus(2); 
642
		kos_WindowRedrawStatus(1);
616
 
Line -... Line 617...
-
 
617
	sProcessInfo info;
-
 
618
	kos_ProcessInfo(&info, 0xFFFFFFFF);
-
 
619
	cWidth = info.processInfo.width - 9;
-
 
620
	cHeight = info.processInfo.height - kos_GetSkinHeight() - 4;
-
 
621
 
-
 
622
	grid.x = 0;
643
		kos_DefineAndDrawWindow(110,40,WND_W,WND_H,0x73,0x40FFFFFF,0,0,(Dword)"Table v" TABLE_VERSION);
623
	grid.y = 0;
Line 644... Line 624...
644
		kos_WindowRedrawStatus(2); 
624
	grid.w = cWidth - SCROLL_SIZE;
645
 
625
	grid.h = cHeight - MENU_PANEL_HEIGHT - SCROLL_SIZE;
646
		sProcessInfo info;
626
 
Line 667... Line 647...
667
		kos_WriteTextToWindow(3 + 1, panel_y + 16, 0x80, 0x000000, (char*)sFilename, 0);	
647
		kos_WriteTextToWindow(3 + 1, panel_y + 16, 0x80, 0x000000, (char*)sFilename, 0);	
668
	}
648
	}
Line 669... Line 649...
669
 
649
 
Line 670... Line 650...
670
	file_box.top = panel_y + 12;
650
	file_box.top = panel_y + 12;
671
 
651
 
672
	// ñîõðàíèòü
652
	//save
Line 673... Line 653...
673
	kos_DefineButton(20 + 160, panel_y + 9, 60, 20, SAVE_BUTTON, 0xd0d0d0);
653
	kos_DefineButton(20 + 160, panel_y + 9, 60, 20, SAVE_BUTTON, 0xd0d0d0);
674
	kos_WriteTextToWindow(22 + 160 + (60 - strlen(sSave) * 6) / 2, panel_y + 16, 0x80, 0x000000, (char*)sSave, 0);
654
	kos_WriteTextToWindow(22 + 160 + (60 - strlen(sSave) * 6) / 2, panel_y + 16, 0x80, 0x000000, (char*)sSave, 0);
675
 
655
 
Line 676... Line 656...
676
	// çàãðóçèòü
656
	//load
677
	kos_DefineButton(90 + 160, panel_y + 9, 60, 20, LOAD_BUTTON, 0xd0d0d0);
657
	kos_DefineButton(90 + 160, panel_y + 9, 60, 20, LOAD_BUTTON, 0xd0d0d0);
678
	kos_WriteTextToWindow(92 + 160 + (60 - strlen(sLoad) * 6) / 2, panel_y + 16, 0x80, 0x000000, (char*)sLoad, 0);
658
	kos_WriteTextToWindow(92 + 160 + (60 - strlen(sLoad) * 6) / 2, panel_y + 16, 0x80, 0x000000, (char*)sLoad, 0);
679
 
659
 
680
	// ñîçäàòü. òîëüêî ýòó êíîïó âîòêíóòü íåêóäà î_Î
660
	//new (clean)
Line 689... Line 669...
689
			edit_box_draw((DWORD)&cell_box);
669
			edit_box_draw((DWORD)&cell_box);
690
		edit_box_draw((DWORD)&file_box);
670
		edit_box_draw((DWORD)&file_box);
691
	}
671
	}
Line 692... Line 672...
692
 
672
 
693
	draw_grid();
-
 
694
	window_drawall=false;
673
	draw_grid();
695
	sel_moved = 0;
674
	sel_moved = 0;
Line 696... Line 675...
696
}
675
}
697
 
676
 
698
void process_mouse()
677
void process_mouse()
699
{
678
{
700
	Dword mouse_btn, ckeys, shift, ctrl;
679
	Dword mouse_btn, ckeys, shift, ctrl;
Line 701... Line 680...
701
	int mouse_x, mouse_y, i, dx = 0, dy = 0;
680
	int mouse_x, mouse_y, i, dx = 0, dy = 0;
702
	int redraw = 0;
681
	bool window_is_dragged=false;
Line 703... Line 682...
703
	
682
	
Line 718... Line 697...
718
		if (scroll_y>row_count-25) scroll_y=row_count-25;
697
		if (scroll_y>row_count-25) scroll_y=row_count-25;
719
		draw_grid();
698
		draw_grid();
720
		return;
699
		return;
721
	}
700
	}
Line -... Line 701...
-
 
701
 
-
 
702
	if (!sel_moved && !size_state) //do not handle scrollbars when user selects cells
722
 
703
	{
723
	scrollbar_v_mouse((DWORD)&scroll_v);
704
		scrollbar_v_mouse((DWORD)&scroll_v);
724
	if (scroll_v.position != scroll_y-1)
705
		if (scroll_v.position != scroll_y-1)
725
	{
706
		{
726
		scroll_y = scroll_v.position + 1;
707
			scroll_y = scroll_v.position + 1;
Line 731... Line 712...
731
	if (scroll_h.position != scroll_x-1)
712
		if (scroll_h.position != scroll_x-1)
732
	{
713
		{
733
		scroll_x = scroll_h.position + 1;
714
			scroll_x = scroll_h.position + 1;
734
		draw_grid();
715
			draw_grid();
735
	}
716
		}		
-
 
717
	}
Line 736... Line 718...
736
 
718
 
737
	kos_GetMouseState(mouse_btn, mouse_x, mouse_y);
719
	kos_GetMouseState(mouse_btn, mouse_x, mouse_y);
738
	mouse_x -= 5;
720
	mouse_x -= 5;
Line 739... Line 721...
739
	mouse_y -= kos_GetSkinHeight();
721
	mouse_y -= kos_GetSkinHeight();
Line -... Line 722...
-
 
722
 
-
 
723
	mouse_btn &= 0x0001;
-
 
724
 
-
 
725
	if (mouse_btn)
-
 
726
	{
-
 
727
		if (mouse_y < 0) return; // do nothing if mouse over header
740
 
728
		if (mouse_y > grid.y + grid.h) return;
741
	mouse_btn &= 0x0001;
729
	}
Line 742... Line 730...
742
 
730
 
743
	ckeys = kos_GetSpecialKeyState();
731
	ckeys = kos_GetSpecialKeyState();
Line 786... Line 774...
786
			{
774
			{
787
				size_id = ky;
775
				size_id = ky;
788
				size_state = SIZE_Y;
776
				size_state = SIZE_Y;
789
			}
777
			}
790
		}
778
		}
791
		else		// êëèêíóòà ÿ÷åéêà
779
		else		// click on cell
792
		if (mouse_x <= col_left[nx - 1] &&  mouse_y <= row_top[ny - 1])
780
		if (mouse_x <= col_left[nx - 1] &&  mouse_y <= row_top[ny - 1])
793
		{
781
		{
794
			was_single_selection = sel_x == sel_end_x && sel_y == sel_end_y;
782
			was_single_selection = sel_x == sel_end_x && sel_y == sel_end_y;
795
			int kx = -1, i;
783
			int kx = -1, i;
796
			for (i = 0; i < col_count - 1; i++)
784
			for (i = 0; i < col_count - 1; i++)
Line 828... Line 816...
828
		}
816
		}
829
		return;
817
		return;
830
	}
818
	}
831
	else if (!mouse_btn && size_state)
819
	else if (!mouse_btn && size_state)
832
	{
820
	{
833
		sel_moved = 0;		// ÷òîáû áûëà òðó ïåðåðèñîâêà
821
		sel_moved = 0;		// for a good redraw
834
		//rtlDebugOutString("resize end");
822
		//rtlDebugOutString("resize end");
Line 835... Line 823...
835
 
823
 
836
		if (size_state == SIZE_DRAG)
824
		if (size_state == SIZE_DRAG)
837
		{
825
		{
838
			fill_cells(sel_x, sel_y, sel_end_x, sel_end_y, old_end_x, old_end_y);
826
			fill_cells(sel_x, sel_y, sel_end_x, sel_end_y, old_end_x, old_end_y);
Line 839... Line 827...
839
		}
827
		}
840
 
828
 
841
		//sel_moved = (size_state == SIZE_SELECT && sel_x == sel_end_x && sel_y == sel_end_y && was_single_selection);
829
		//sel_moved = (size_state == SIZE_SELECT && sel_x == sel_end_x && sel_y == sel_end_y && was_single_selection);
842
		size_state = 0;
830
		size_state = 0;
843
		draw_window();		// âñå ñäâèíóëîñü - íàäî îáíîâèòüñÿ
831
		draw_window();		// все сдвинулось - надо обновиться
844
		return;
832
		return;
845
	}
833
	}
846
	if (size_state == SIZE_X && mouse_x != size_mouse_x)
834
	if (size_state == SIZE_X && mouse_x != size_mouse_x)
847
	{
835
	{
848
		draw_size_grid();
836
		draw_size_grid();
849
		col_width[size_id] += mouse_x - size_mouse_x;
837
		col_width[size_id] += mouse_x - size_mouse_x;
850
		if (col_width[size_id] < 15)
838
		if (col_width[size_id] < 15)
851
			col_width[size_id] = 15;
839
			col_width[size_id] = 15;
852
		else if (col_width[size_id] > wi / 2)
840
		else if (col_width[size_id] > grid.w / 2)
853
			col_width[size_id] = wi / 2;
841
			col_width[size_id] = grid.w / 2;
854
		draw_size_grid();
842
		draw_size_grid();
855
	}
843
	}
856
	if (size_state == SIZE_Y && mouse_y != size_mouse_y)
844
	if (size_state == SIZE_Y && mouse_y != size_mouse_y)
857
	{
845
	{
858
		draw_size_grid();
846
		draw_size_grid();
859
		row_height[size_id] += mouse_y - size_mouse_y;
847
		row_height[size_id] += mouse_y - size_mouse_y;
860
		if (row_height[size_id] < 15)
848
		if (row_height[size_id] < 15)
861
			row_height[size_id] = 15;
849
			row_height[size_id] = 15;
862
		else if (row_height[size_id] > he / 2)
850
		else if (row_height[size_id] > grid.h / 2)
863
			row_height[size_id] = he / 2;
851
			row_height[size_id] = grid.h / 2;
864
		draw_size_grid();
852
		draw_size_grid();
865
	}
853
	}
866
	if ((size_state == SIZE_SELECT || size_state == SIZE_DRAG) && (mouse_x != size_mouse_x || mouse_y != size_mouse_y))
854
	if ((size_state == SIZE_SELECT || size_state == SIZE_DRAG) && (mouse_x != size_mouse_x || mouse_y != size_mouse_y))
Line 926... Line 914...
926
	edit_box_key((dword)&file_box);
914
	edit_box_key((dword)&file_box);
Line 927... Line 915...
927
 
915
 
928
 
916
 
929
	switch (keyCode)
917
	switch (keyCode)
930
	{
918
	{
931
		case 178:			// ñòðåëêè
919
		case 178:
932
			//dx = 0;
920
			//dx = 0;
933
			dy = -1;
921
			dy = -1;
934
			break;
922
			break;
Line 942... Line 930...
942
			break;
930
			break;
943
		case 177:
931
		case 177:
944
			//dx = 0;
932
			//dx = 0;
945
			dy = 1;
933
			dy = 1;
946
			break;
934
			break;
947
		/*
-
 
948
		case 183:
935
		case 183:
-
 
936
		/*
949
			if (sel_y < row_count-(ny - scroll_y))	// page down
937
			if (sel_y < row_count-(ny - scroll_y))	// page down
950
				dy = ny - scroll_y;
938
				dy = ny - scroll_y;
951
			else
939
			else
952
				dy = row_count-(ny - scroll_y) - sel_y;
940
				dy = row_count-(ny - scroll_y) - sel_y;
953
			dx = 0;
941
			dx = 0;
954
			redraw = 1;
942
			redraw = 1;
-
 
943
		*/
955
			break;
944
			break;
956
		case 184:
945
		case 184:
-
 
946
		/*
957
			if (sel_y > ny - scroll_y)		// page up
947
			if (sel_y > ny - scroll_y)		// page up
958
				dy= - (ny - scroll_y);
948
				dy= - (ny - scroll_y);
959
			else
949
			else
960
				dy = - (ny - scroll_y) + sel_y;
950
				dy = - (ny - scroll_y) + sel_y;
961
			dx = 0;
951
			dx = 0;
962
			redraw = 1;
952
			redraw = 1;
963
			break;
-
 
964
		*/
953
		*/
-
 
954
			break;
965
		case 180: //home
955
		case 180: //home
966
			dx = -sel_x + 1;
956
			dx = -sel_x + 1;
967
			dy = 0;
957
			dy = 0;
968
			draw_grid();
958
			draw_grid();
969
			break;
959
			break;
Line 1161... Line 1151...
1161
	*/
1151
	*/
1162
	if ((dx || dy))
1152
	if ((dx || dy))
1163
	{
1153
	{
1164
		if (!shift)
1154
		if (!shift)
1165
		{
1155
		{
1166
			if ((sel_end_x + dx) >= (col_count-1)) {dx=0;} //çàãëóøêà
1156
			if ((sel_end_x + dx) >= (col_count-1)) {dx=0;} //stub
1167
			else if ((sel_end_y + dy) >= (row_count-1)) {dy=0;}
1157
			else if ((sel_end_y + dy) >= (row_count-1)) {dy=0;}
1168
			else {
1158
			else {
1169
			move_selection(sel_x + dx, sel_y + dy);
1159
			move_selection(sel_x + dx, sel_y + dy);
1170
			}
1160
			}
1171
		}
1161
		}
Line 1277... Line 1267...
1277
		case EM_BUTTON_CLICK:
1267
		case EM_BUTTON_CLICK:
1278
			process_button();
1268
			process_button();
1279
			break;
1269
			break;
Line 1280... Line 1270...
1280
		
1270
		
1281
		case EM_WINDOW_REDRAW:
-
 
1282
			window_drawall=true;
1271
		case EM_WINDOW_REDRAW:
1283
			draw_window();
1272
			if (draw_and_define_window()) draw_window();
1284
			break;
1273
			break;
1285
		}
1274
		}
1286
	}
1275
	}