Subversion Repositories Kolibri OS

Rev

Rev 9267 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
8933 leency 1
#define ENTRY_POINT #main
6567 leency 2
 
6653 leency 3
#define MEMSIZE 4096*20
8933 leency 4
 
6567 leency 5
#include "..\lib\strings.h"
6
#include "..\lib\clipboard.h"
7
#include "..\lib\gui.h"
8933 leency 8
#include "..\lib\fs.h"
6567 leency 9
 
10
//===================================================//
11
//                                                   //
12
//                       DATA                        //
13
//                                                   //
14
//===================================================//
15
 
9003 leency 16
?define T_COLUMNS_TITLE "#    Size      Type        Contents"
6567 leency 17
?define DEFAULT_SAVE_PATH "/tmp0/1/clipview.tmp"
18
char *data_type[] = { "Text", "Image", "RAW", "Unknown" };
19
 
20
enum {
8933 leency 21
	BT_DELETE_LAST = 10,
22
	BT_DELETE_ALL,
23
	BT_UNLOCK,
24
	BT_LIST_LEFT,
25
	BT_LIST_RIGHT
6567 leency 26
};
27
 
8933 leency 28
#define PANEL_BOTTOM_H 35
29
#define GAP 5
30
#define LIST_Y 32
31
#define PANEL_TOP_H LIST_Y-2
32
#define LINE_H 20
33
#define TEXT_Y LINE_H - 14 / 2
6567 leency 34
 
35
proc_info Form;
36
 
8933 leency 37
struct LIST {
38
	int w,h;
39
	int count;
40
	int first;
41
	int visible;
42
} list = 0;
43
 
6567 leency 44
//===================================================//
45
//                                                   //
46
//                       CODE                        //
47
//                                                   //
48
//===================================================//
49
 
50
void main()
51
{
8936 leency 52
	@mem_init();
8933 leency 53
	@SetEventMask(EVM_REDRAW + EVM_BUTTON);
7984 leency 54
	loop() switch(@WaitEventTimeout(10))
6567 leency 55
	{
56
		case evButton:
8933 leency 57
			@GetButtonID();
58
			switch(EAX) {
59
				case 1:
60
					ExitProcess();
61
				case BT_DELETE_LAST:
62
					EventDeleteLastSlot();
63
					break;
64
				case BT_DELETE_ALL:
65
					EventDeleteAllSlots();
66
					break;
67
				case BT_UNLOCK:
68
					EventResetBufferLock();
69
					break;
70
				case BT_LIST_LEFT:
71
					list.first -= list.visible;
72
					if (list.first <= 0) list.first = 0;
73
					ClipViewSelectListDraw();
74
					break;
75
				case BT_LIST_RIGHT:
76
					if (list.first + list.visible < list.count) list.first += list.visible;
77
					ClipViewSelectListDraw();
78
					break;
79
				default:
80
					if (EAX>=300) EventOpenAsHex(EAX-300);
81
					else EventOpenAsText(EAX-100);
7984 leency 82
			}
6567 leency 83
			break;
84
 
85
		case evReDraw:
7806 leency 86
			sc.get();
8933 leency 87
			DefineAndDrawWindow(GetScreenWidth()-600/2,80,600,400,0x73,NULL,"Clipboard Viewer",NULL);
6567 leency 88
			GetProcessInfo(#Form, SelfInfo);
8946 leency 89
			IF (Form.status_window&ROLLED_UP) break;
7984 leency 90
			IF (Form.height < 200) { MoveSize(OLD,OLD,OLD,200); break; }
91
			IF (Form.width  < 570) { MoveSize(OLD,OLD,570,OLD); break; }
6567 leency 92
		 	DrawWindowContent();
93
		 	break;
94
 
95
		default:
8933 leency 96
			if (Clipboard__GetSlotCount() > list.count) ClipViewSelectListDraw();
6567 leency 97
   }
98
}
99
 
100
void DrawWindowContent()
101
{
8933 leency 102
	list.w = Form.cwidth-GAP-GAP;
103
	list.h = Form.cheight-PANEL_BOTTOM_H-LIST_Y-GAP;
104
	list.visible = list.h / LINE_H;
105
 
7806 leency 106
	DrawBar(0,0, Form.cwidth, PANEL_TOP_H, sc.work);
107
	DrawBar(0,Form.cheight-PANEL_BOTTOM_H, Form.cwidth, PANEL_BOTTOM_H, sc.work);
8933 leency 108
	DrawWideRectangle(GAP-GAP, LIST_Y-GAP, GAP*2+list.w, GAP*2+list.h, GAP-2, sc.work);
109
 
110
	DefineButton(GAP, list.h + LIST_Y + 8, 110, 25, BT_DELETE_LAST, sc.button);
111
	$inc edx
112
	$add ebx, 130 << 16    //BT_DELETE_ALL
113
	$int 64
114
	$inc edx
115
	$add ebx, 130 << 16    //BT_UNLOCK
116
	$int 64
117
 
8943 leency 118
	WriteText(GAP+11, LIST_Y + list.h + 14, 0x90, sc.button_text, "Delete last      Delete all      Reset lock");
8933 leency 119
 
9003 leency 120
	WriteText(GAP+18, LIST_Y - 23, 0x90, sc.work_text, T_COLUMNS_TITLE);
6662 leency 121
 	ClipViewSelectListDraw();
122
 	SelectList_DrawBorder();
6567 leency 123
}
124
 
7037 leency 125
dword slot_data;
126
struct clipboard_data
127
{
128
	dword	size;
129
	dword	type;
130
	dword	encoding;
131
	dword	content;
132
	dword	content_offset;
133
} cdata;
134
 
6653 leency 135
void SelectList_DrawLine(dword i)
6567 leency 136
{
8933 leency 137
	int yyy, slot_data_type_number;
6567 leency 138
 
8933 leency 139
	yyy = i*LINE_H+LIST_Y;
140
	DrawBar(GAP, yyy, list.w, LINE_H, -i%2 * 0x0E0E0E + 0xF1F1f1);
141
 
142
	if (list.first + i >= list.count) {
143
		return;
144
	}
145
 
146
	slot_data = Clipboard__GetSlotData(list.first + i);
7037 leency 147
	cdata.size = ESDWORD[slot_data];
148
	cdata.type = ESDWORD[slot_data+4];
149
	if (cdata.type==SLOT_DATA_TYPE_TEXT) || (cdata.type==SLOT_DATA_TYPE_TEXT_BLOCK)
150
		cdata.content_offset = 12;
151
	else
152
		cdata.content_offset = 8;
153
	cdata.content = slot_data + cdata.content_offset;
154
 
9003 leency 155
	WriteText(list.first+i/10^1*8+GAP+12, yyy+TEXT_Y, 0x90, 0x000000, itoa(list.first + i));
7984 leency 156
	EDX = ConvertSizeToKb(cdata.size);
9003 leency 157
	WriteText(GAP+44+16, yyy+TEXT_Y, 0x90, 0x000000, EDX);
7037 leency 158
	slot_data_type_number = cdata.type;
9267 Doczom 159
	if (slot_data_type_number >= 4) slot_data_type_number = 3;
8933 leency 160
	WriteText(GAP+140, yyy+TEXT_Y, 0x90, 0x000000, data_type[slot_data_type_number]);
9003 leency 161
	WriteTextB(GAP+list.w - 88, yyy+TEXT_Y, 0x90, 0x006597, "TEXT  HEX");
8933 leency 162
	DefineButton(GAP+list.w - 98, yyy, 50, LINE_H, 100+i+BT_HIDE, NULL);
8936 leency 163
	$add edx, 200
164
	$add ebx, 52 << 16 - 10 //BT_HEX
165
	$int 64
6567 leency 166
 
8933 leency 167
	ESI = list.w - 345 / 8;
168
	if (cdata.size - cdata.content_offset < ESI) ESI = cdata.size - cdata.content_offset;
169
	WriteText(GAP+236, yyy+TEXT_Y, 0x30, 0x000000, cdata.content);
6567 leency 170
}
171
 
8936 leency 172
int SaveSlotContents() {
173
	if (! CreateFile(cdata.size, cdata.content, DEFAULT_SAVE_PATH))	{
6567 leency 174
		return true;
7984 leency 175
	} else {
8936 leency 176
		notify("'Can not create /tmp0/1/clipview.tmp' -E");
6567 leency 177
	 	return false;
178
	}
179
}
180
 
8933 leency 181
void ClipViewSelectListDraw()
182
{
183
	int i, list_last;
184
 
185
	list.count = Clipboard__GetSlotCount();
8936 leency 186
	if (list.first >= list.count) list.first = list.count - list.visible;
187
	if (list.first < 0) list.first = 0;
8933 leency 188
 
189
	if (list.count > list.visible) list_last = list.visible; else list_last = list.count;
190
 
191
	for (i=0; i
192
 
193
	DrawBar(GAP,i*LINE_H+LIST_Y, list.w, -i*LINE_H+ list.h, 0xFFFfff);
194
	if (!list.count) WriteText(list.w / 2 + GAP - 60,
195
		list.h / 2 - 8 + LIST_Y, 0x90, 0x999999, "No data to show");
196
 
8943 leency 197
	//Show "<" and ">" buttons and a page number
198
	//in case when there are items more than visible at once
8933 leency 199
	if (list.count > list.visible) {
200
		param[0] = list.first / list.visible + '0';
9003 leency 201
		param[1] = '\0';
8933 leency 202
		DefineButton(Form.cwidth-84-GAP, list.h + LIST_Y + 8, 25, 25, BT_LIST_LEFT, sc.button); //BT_LEFT
203
		$inc edx
204
		$add ebx, 57 << 16 //BT_RIGHT
205
		$int 64
206
		WriteText(Form.cwidth-84-GAP+10, list.h + LIST_Y + 14, 0x90, sc.button_text, "<      >");
207
		$add ebx, 28 << 16
208
		$mov edx, #param;
8936 leency 209
		$mov edi, sc.work
9003 leency 210
		$mov ecx, 11010000b << 24
8943 leency 211
		$add ecx, sc.work_text //page number
8933 leency 212
		$int 64
213
	}
6653 leency 214
}
215
 
8933 leency 216
void SelectList_DrawBorder() {
217
	DrawRectangle3D(GAP-2, LIST_Y-2,
218
		list.w+3, list.h+3,
9602 leency 219
		sc.dark, sc.light);
8933 leency 220
	DrawRectangle3D(GAP-1, LIST_Y-1,
221
		list.w+1, list.h+1,
9602 leency 222
		sc.line, sc.line);
6653 leency 223
}
224
 
6567 leency 225
//===================================================//
226
//                                                   //
227
//                     EVENTS                        //
228
//                                                   //
229
//===================================================//
230
 
231
void EventDeleteLastSlot()
232
{
6653 leency 233
	int i;
8933 leency 234
	for (i=0; i
235
		DeleteButton(list.first + i + 100);
236
		$add edx, 200
237
		$int 64
238
	}
7037 leency 239
	Clipboard__DeleteLastSlot();
8933 leency 240
	DrawWindowContent();
6567 leency 241
}
242
 
243
void EventDeleteAllSlots()
244
{
7037 leency 245
	while (Clipboard__GetSlotCount()) Clipboard__DeleteLastSlot();
8933 leency 246
	DrawWindowContent();
6567 leency 247
}
248
 
249
void EventResetBufferLock() {
7037 leency 250
	Clipboard__ResetBlockingBuffer();
8933 leency 251
	DrawWindowContent();
6567 leency 252
}
253
 
254
void EventOpenAsText(int slot_id) {
7037 leency 255
	slot_data = Clipboard__GetSlotData(slot_id);
256
	cdata.size = ESDWORD[slot_data]-12;
257
	cdata.content = slot_data+12;
8936 leency 258
	if (SaveSlotContents()) RunProgram("/sys/develop/cedit", DEFAULT_SAVE_PATH);
6567 leency 259
}
260
 
261
void EventOpenAsHex(int slot_id) {
7037 leency 262
	slot_data = Clipboard__GetSlotData(slot_id);
263
	cdata.size = ESDWORD[slot_data];
264
	cdata.content = slot_data;
8936 leency 265
	if (SaveSlotContents()) RunProgram("/sys/develop/heed", DEFAULT_SAVE_PATH);
6567 leency 266
}
267
 
268
stop: