Subversion Repositories Kolibri OS

Rev

Rev 8943 | Rev 9003 | Go to most recent revision | 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
 
16
?define T_COLUMNS_TITLE "# | Data size | Data type | Contents"
7493 leency 17
?define T_COLUMN_VIEW "| View"
6567 leency 18
?define DEFAULT_SAVE_PATH "/tmp0/1/clipview.tmp"
19
char *data_type[] = { "Text", "Image", "RAW", "Unknown" };
20
 
21
enum {
8933 leency 22
	BT_DELETE_LAST = 10,
23
	BT_DELETE_ALL,
24
	BT_UNLOCK,
25
	BT_LIST_LEFT,
26
	BT_LIST_RIGHT
6567 leency 27
};
28
 
8933 leency 29
#define PANEL_BOTTOM_H 35
30
#define GAP 5
31
#define LIST_Y 32
32
#define PANEL_TOP_H LIST_Y-2
33
#define LINE_H 20
34
#define TEXT_Y LINE_H - 14 / 2
6567 leency 35
 
36
proc_info Form;
37
 
8933 leency 38
struct LIST {
39
	int w,h;
40
	int count;
41
	int first;
42
	int visible;
43
} list = 0;
44
 
6567 leency 45
//===================================================//
46
//                                                   //
47
//                       CODE                        //
48
//                                                   //
49
//===================================================//
50
 
51
void main()
52
{
8936 leency 53
	@mem_init();
8933 leency 54
	@SetEventMask(EVM_REDRAW + EVM_BUTTON);
7984 leency 55
	loop() switch(@WaitEventTimeout(10))
6567 leency 56
	{
57
		case evButton:
8933 leency 58
			@GetButtonID();
59
			switch(EAX) {
60
				case 1:
61
					ExitProcess();
62
				case BT_DELETE_LAST:
63
					EventDeleteLastSlot();
64
					break;
65
				case BT_DELETE_ALL:
66
					EventDeleteAllSlots();
67
					break;
68
				case BT_UNLOCK:
69
					EventResetBufferLock();
70
					break;
71
				case BT_LIST_LEFT:
72
					list.first -= list.visible;
73
					if (list.first <= 0) list.first = 0;
74
					ClipViewSelectListDraw();
75
					break;
76
				case BT_LIST_RIGHT:
77
					if (list.first + list.visible < list.count) list.first += list.visible;
78
					ClipViewSelectListDraw();
79
					break;
80
				default:
81
					if (EAX>=300) EventOpenAsHex(EAX-300);
82
					else EventOpenAsText(EAX-100);
7984 leency 83
			}
6567 leency 84
			break;
85
 
86
		case evReDraw:
7806 leency 87
			sc.get();
8933 leency 88
			DefineAndDrawWindow(GetScreenWidth()-600/2,80,600,400,0x73,NULL,"Clipboard Viewer",NULL);
6567 leency 89
			GetProcessInfo(#Form, SelfInfo);
8946 leency 90
			IF (Form.status_window&ROLLED_UP) break;
7984 leency 91
			IF (Form.height < 200) { MoveSize(OLD,OLD,OLD,200); break; }
92
			IF (Form.width  < 570) { MoveSize(OLD,OLD,570,OLD); break; }
6567 leency 93
		 	DrawWindowContent();
94
		 	break;
95
 
96
		default:
8933 leency 97
			if (Clipboard__GetSlotCount() > list.count) ClipViewSelectListDraw();
6567 leency 98
   }
99
}
100
 
101
void DrawWindowContent()
102
{
8933 leency 103
	list.w = Form.cwidth-GAP-GAP;
104
	list.h = Form.cheight-PANEL_BOTTOM_H-LIST_Y-GAP;
105
	list.visible = list.h / LINE_H;
106
 
7806 leency 107
	DrawBar(0,0, Form.cwidth, PANEL_TOP_H, sc.work);
108
	DrawBar(0,Form.cheight-PANEL_BOTTOM_H, Form.cwidth, PANEL_BOTTOM_H, sc.work);
8933 leency 109
	DrawWideRectangle(GAP-GAP, LIST_Y-GAP, GAP*2+list.w, GAP*2+list.h, GAP-2, sc.work);
110
 
111
	DefineButton(GAP, list.h + LIST_Y + 8, 110, 25, BT_DELETE_LAST, sc.button);
112
	$inc edx
113
	$add ebx, 130 << 16    //BT_DELETE_ALL
114
	$int 64
115
	$inc edx
116
	$add ebx, 130 << 16    //BT_UNLOCK
117
	$int 64
118
 
8943 leency 119
	WriteText(GAP+11, LIST_Y + list.h + 14, 0x90, sc.button_text, "Delete last      Delete all      Reset lock");
8933 leency 120
 
121
	WriteText(GAP+12, LIST_Y - 23, 0x90, sc.work_text, T_COLUMNS_TITLE);
122
	WriteText(GAP+list.w - 88-14, LIST_Y - 23, 0x90, sc.work_text, T_COLUMN_VIEW);
6662 leency 123
 	ClipViewSelectListDraw();
124
 	SelectList_DrawBorder();
6567 leency 125
}
126
 
7037 leency 127
dword slot_data;
128
struct clipboard_data
129
{
130
	dword	size;
131
	dword	type;
132
	dword	encoding;
133
	dword	content;
134
	dword	content_offset;
135
} cdata;
136
 
6653 leency 137
void SelectList_DrawLine(dword i)
6567 leency 138
{
8933 leency 139
	int yyy, slot_data_type_number;
6567 leency 140
 
8933 leency 141
	yyy = i*LINE_H+LIST_Y;
142
	DrawBar(GAP, yyy, list.w, LINE_H, -i%2 * 0x0E0E0E + 0xF1F1f1);
143
 
144
	if (list.first + i >= list.count) {
145
		return;
146
	}
147
 
148
	slot_data = Clipboard__GetSlotData(list.first + i);
7037 leency 149
	cdata.size = ESDWORD[slot_data];
150
	cdata.type = ESDWORD[slot_data+4];
151
	if (cdata.type==SLOT_DATA_TYPE_TEXT) || (cdata.type==SLOT_DATA_TYPE_TEXT_BLOCK)
152
		cdata.content_offset = 12;
153
	else
154
		cdata.content_offset = 8;
155
	cdata.content = slot_data + cdata.content_offset;
156
 
8933 leency 157
	WriteText(GAP+12, yyy+TEXT_Y, 0x90, 0x000000, itoa(list.first + i));
7984 leency 158
	EDX = ConvertSizeToKb(cdata.size);
8933 leency 159
	WriteText(GAP+44, yyy+TEXT_Y, 0x90, 0x000000, EDX);
7037 leency 160
	slot_data_type_number = cdata.type;
8933 leency 161
	WriteText(GAP+140, yyy+TEXT_Y, 0x90, 0x000000, data_type[slot_data_type_number]);
162
	WriteText(GAP+list.w - 88, yyy+TEXT_Y, 0x90, 0x006597, "TEXT  HEX");
163
	DefineButton(GAP+list.w - 98, yyy, 50, LINE_H, 100+i+BT_HIDE, NULL);
8936 leency 164
	$add edx, 200
165
	$add ebx, 52 << 16 - 10 //BT_HEX
166
	$int 64
6567 leency 167
 
8933 leency 168
	ESI = list.w - 345 / 8;
169
	if (cdata.size - cdata.content_offset < ESI) ESI = cdata.size - cdata.content_offset;
170
	WriteText(GAP+236, yyy+TEXT_Y, 0x30, 0x000000, cdata.content);
6567 leency 171
}
172
 
8936 leency 173
int SaveSlotContents() {
174
	if (! CreateFile(cdata.size, cdata.content, DEFAULT_SAVE_PATH))	{
6567 leency 175
		return true;
7984 leency 176
	} else {
8936 leency 177
		notify("'Can not create /tmp0/1/clipview.tmp' -E");
6567 leency 178
	 	return false;
179
	}
180
}
181
 
8933 leency 182
void ClipViewSelectListDraw()
183
{
184
	int i, list_last;
185
 
186
	list.count = Clipboard__GetSlotCount();
8936 leency 187
	if (list.first >= list.count) list.first = list.count - list.visible;
188
	if (list.first < 0) list.first = 0;
8933 leency 189
 
190
	if (list.count > list.visible) list_last = list.visible; else list_last = list.count;
191
 
192
	for (i=0; i
193
 
194
	DrawBar(GAP,i*LINE_H+LIST_Y, list.w, -i*LINE_H+ list.h, 0xFFFfff);
195
	if (!list.count) WriteText(list.w / 2 + GAP - 60,
196
		list.h / 2 - 8 + LIST_Y, 0x90, 0x999999, "No data to show");
197
 
8943 leency 198
	//Show "<" and ">" buttons and a page number
199
	//in case when there are items more than visible at once
8933 leency 200
	if (list.count > list.visible) {
201
		param[0] = list.first / list.visible + '0';
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
8933 leency 210
		$add ecx, 0x40 << 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,
219
		sc.work_dark, sc.work_light);
220
	DrawRectangle3D(GAP-1, LIST_Y-1,
221
		list.w+1, list.h+1,
222
		sc.work_graph, sc.work_graph);
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: