Subversion Repositories Kolibri OS

Rev

Rev 8860 | Rev 8936 | 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
{
8933 leency 53
	mem_init();
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);
90
			IF (Form.status_window>=2) 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
	if (list.first > list.count) list.first = list.count - list.visible;
107
 
7806 leency 108
	DrawBar(0,0, Form.cwidth, PANEL_TOP_H, sc.work);
109
	DrawBar(0,Form.cheight-PANEL_BOTTOM_H, Form.cwidth, PANEL_BOTTOM_H, sc.work);
8933 leency 110
	DrawWideRectangle(GAP-GAP, LIST_Y-GAP, GAP*2+list.w, GAP*2+list.h, GAP-2, sc.work);
111
 
112
	DefineButton(GAP, list.h + LIST_Y + 8, 110, 25, BT_DELETE_LAST, sc.button);
113
	$inc edx
114
	$add ebx, 130 << 16    //BT_DELETE_ALL
115
	$int 64
116
	$inc edx
117
	$add ebx, 130 << 16    //BT_UNLOCK
118
	$int 64
119
 
120
	WriteText(GAP+10, LIST_Y + list.h + 14, 0x90, sc.button_text, "Delete last      Delete all        Unlock");
121
 
122
	WriteText(GAP+12, LIST_Y - 23, 0x90, sc.work_text, T_COLUMNS_TITLE);
123
	WriteText(GAP+list.w - 88-14, LIST_Y - 23, 0x90, sc.work_text, T_COLUMN_VIEW);
6662 leency 124
 	ClipViewSelectListDraw();
125
 	SelectList_DrawBorder();
6567 leency 126
}
127
 
7037 leency 128
dword slot_data;
129
struct clipboard_data
130
{
131
	dword	size;
132
	dword	type;
133
	dword	encoding;
134
	dword	content;
135
	dword	content_offset;
136
} cdata;
137
 
6653 leency 138
void SelectList_DrawLine(dword i)
6567 leency 139
{
8933 leency 140
	int yyy, slot_data_type_number;
6567 leency 141
 
8933 leency 142
	yyy = i*LINE_H+LIST_Y;
143
	DrawBar(GAP, yyy, list.w, LINE_H, -i%2 * 0x0E0E0E + 0xF1F1f1);
144
 
145
	if (list.first + i >= list.count) {
146
		return;
147
	}
148
 
149
	slot_data = Clipboard__GetSlotData(list.first + i);
7037 leency 150
	cdata.size = ESDWORD[slot_data];
151
	cdata.type = ESDWORD[slot_data+4];
152
	if (cdata.type==SLOT_DATA_TYPE_TEXT) || (cdata.type==SLOT_DATA_TYPE_TEXT_BLOCK)
153
		cdata.content_offset = 12;
154
	else
155
		cdata.content_offset = 8;
156
	cdata.content = slot_data + cdata.content_offset;
157
 
8933 leency 158
	WriteText(GAP+12, yyy+TEXT_Y, 0x90, 0x000000, itoa(list.first + i));
7984 leency 159
	EDX = ConvertSizeToKb(cdata.size);
8933 leency 160
	WriteText(GAP+44, yyy+TEXT_Y, 0x90, 0x000000, EDX);
7037 leency 161
	slot_data_type_number = cdata.type;
8933 leency 162
	WriteText(GAP+140, yyy+TEXT_Y, 0x90, 0x000000, data_type[slot_data_type_number]);
163
	WriteText(GAP+list.w - 88, yyy+TEXT_Y, 0x90, 0x006597, "TEXT  HEX");
164
	DefineButton(GAP+list.w - 98, yyy, 50, LINE_H, 100+i+BT_HIDE, NULL);
165
	DefineButton(GAP+list.w - 95 + 51, yyy, 40, LINE_H, 300+i+BT_HIDE, NULL);
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
 
7037 leency 172
int SaveSlotContents(dword size, off) {
7984 leency 173
	if (! CreateFile(size, off, DEFAULT_SAVE_PATH))	{
6567 leency 174
		return true;
7984 leency 175
	} else {
6567 leency 176
		notify("'Can not create /tmp0/1/clipview.tmp\nPreview function is not available.' -E");
177
	 	return false;
178
	}
179
}
180
 
8933 leency 181
void ClipViewSelectListDraw()
182
{
183
	int i, list_last;
184
 
185
	list.count = Clipboard__GetSlotCount();
186
 
187
	if (list.count > list.visible) list_last = list.visible; else list_last = list.count;
188
 
189
	for (i=0; i
190
 
191
	DrawBar(GAP,i*LINE_H+LIST_Y, list.w, -i*LINE_H+ list.h, 0xFFFfff);
192
	if (!list.count) WriteText(list.w / 2 + GAP - 60,
193
		list.h / 2 - 8 + LIST_Y, 0x90, 0x999999, "No data to show");
194
 
195
	if (list.count > list.visible) {
196
		param[0] = list.first / list.visible + '0';
197
		DefineButton(Form.cwidth-84-GAP, list.h + LIST_Y + 8, 25, 25, BT_LIST_LEFT, sc.button); //BT_LEFT
198
		$inc edx
199
		$add ebx, 57 << 16 //BT_RIGHT
200
		$int 64
201
		WriteText(Form.cwidth-84-GAP+10, list.h + LIST_Y + 14, 0x90, sc.button_text, "<      >");
202
		$add ebx, 28 << 16
203
		$mov edx, #param;
204
		$mov edi, sc.work_text
205
		$add ecx, 0x40 << 24
206
		$int 64
207
	}
6653 leency 208
}
209
 
8933 leency 210
void SelectList_DrawBorder() {
211
	DrawRectangle3D(GAP-2, LIST_Y-2,
212
		list.w+3, list.h+3,
213
		sc.work_dark, sc.work_light);
214
	DrawRectangle3D(GAP-1, LIST_Y-1,
215
		list.w+1, list.h+1,
216
		sc.work_graph, sc.work_graph);
6653 leency 217
}
218
 
6567 leency 219
//===================================================//
220
//                                                   //
221
//                     EVENTS                        //
222
//                                                   //
223
//===================================================//
224
 
225
void EventDeleteLastSlot()
226
{
6653 leency 227
	int i;
8933 leency 228
	for (i=0; i
229
		DeleteButton(list.first + i + 100);
230
		$add edx, 200
231
		$int 64
232
	}
7037 leency 233
	Clipboard__DeleteLastSlot();
8933 leency 234
	DrawWindowContent();
6567 leency 235
}
236
 
237
void EventDeleteAllSlots()
238
{
7037 leency 239
	while (Clipboard__GetSlotCount()) Clipboard__DeleteLastSlot();
8933 leency 240
	DrawWindowContent();
6567 leency 241
}
242
 
243
void EventResetBufferLock() {
7037 leency 244
	Clipboard__ResetBlockingBuffer();
8933 leency 245
	DrawWindowContent();
6567 leency 246
}
247
 
248
void EventOpenAsText(int slot_id) {
7037 leency 249
	slot_data = Clipboard__GetSlotData(slot_id);
250
	cdata.size = ESDWORD[slot_data]-12;
251
	cdata.content = slot_data+12;
8860 leency 252
	if (SaveSlotContents(cdata.size, cdata.content)) RunProgram("/sys/develop/cedit", DEFAULT_SAVE_PATH);
6567 leency 253
}
254
 
255
void EventOpenAsHex(int slot_id) {
7037 leency 256
	slot_data = Clipboard__GetSlotData(slot_id);
257
	cdata.size = ESDWORD[slot_data];
258
	cdata.content = slot_data;
259
	if (SaveSlotContents(cdata.size, cdata.content)) RunProgram("/sys/develop/heed", DEFAULT_SAVE_PATH);
6567 leency 260
}
261
 
262
stop: