Subversion Repositories Kolibri OS

Rev

Rev 9003 | Rev 9266 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #define ENTRY_POINT #main
  2.  
  3. #define MEMSIZE 4096*20
  4.  
  5. #include "..\lib\strings.h"
  6. #include "..\lib\clipboard.h"
  7. #include "..\lib\gui.h"
  8. #include "..\lib\fs.h"
  9.  
  10. //===================================================//
  11. //                                                   //
  12. //                       DATA                        //
  13. //                                                   //
  14. //===================================================//
  15.  
  16. ?define T_COLUMNS_TITLE "#    Size      Type        Contents"
  17. ?define DEFAULT_SAVE_PATH "/tmp0/1/clipview.tmp"
  18. char *data_type[] = { "Text", "Image", "RAW", "Unknown" };
  19.  
  20. enum {
  21.         BT_DELETE_LAST = 10,
  22.         BT_DELETE_ALL,
  23.         BT_UNLOCK,
  24.         BT_LIST_LEFT,
  25.         BT_LIST_RIGHT
  26. };
  27.  
  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
  34.  
  35. proc_info Form;
  36.  
  37. struct LIST {
  38.         int w,h;
  39.         int count;
  40.         int first;
  41.         int visible;
  42. } list = 0;
  43.  
  44. //===================================================//
  45. //                                                   //
  46. //                       CODE                        //
  47. //                                                   //
  48. //===================================================//
  49.  
  50. void main()
  51. {  
  52.         @mem_init();
  53.         @SetEventMask(EVM_REDRAW + EVM_BUTTON);
  54.         loop() switch(@WaitEventTimeout(10))
  55.         {
  56.                 case evButton:
  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);
  82.                         }
  83.                         break;
  84.                  
  85.                 case evReDraw:
  86.                         sc.get();                      
  87.                         DefineAndDrawWindow(GetScreenWidth()-600/2,80,600,400,0x73,NULL,"Clipboard Viewer",NULL);
  88.                         GetProcessInfo(#Form, SelfInfo);
  89.                         IF (Form.status_window&ROLLED_UP) break;
  90.                         IF (Form.height < 200) { MoveSize(OLD,OLD,OLD,200); break; }
  91.                         IF (Form.width  < 570) { MoveSize(OLD,OLD,570,OLD); break; }
  92.                         DrawWindowContent();
  93.                         break;
  94.  
  95.                 default:
  96.                         if (Clipboard__GetSlotCount() > list.count) ClipViewSelectListDraw();
  97.    }
  98. }
  99.  
  100. void DrawWindowContent()
  101. {
  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.  
  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);
  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.  
  118.         WriteText(GAP+11, LIST_Y + list.h + 14, 0x90, sc.button_text, "Delete last      Delete all      Reset lock");
  119.  
  120.         WriteText(GAP+18, LIST_Y - 23, 0x90, sc.work_text, T_COLUMNS_TITLE);
  121.         ClipViewSelectListDraw();
  122.         SelectList_DrawBorder();
  123. }
  124.  
  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.  
  135. void SelectList_DrawLine(dword i)
  136. {
  137.         int yyy, slot_data_type_number;
  138.  
  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);
  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.  
  155.         WriteText(list.first+i/10^1*8+GAP+12, yyy+TEXT_Y, 0x90, 0x000000, itoa(list.first + i));
  156.         EDX = ConvertSizeToKb(cdata.size);
  157.         WriteText(GAP+44+16, yyy+TEXT_Y, 0x90, 0x000000, EDX);
  158.         slot_data_type_number = cdata.type;
  159.         WriteText(GAP+140, yyy+TEXT_Y, 0x90, 0x000000, data_type[slot_data_type_number]);
  160.         WriteTextB(GAP+list.w - 88, yyy+TEXT_Y, 0x90, 0x006597, "TEXT  HEX");
  161.         DefineButton(GAP+list.w - 98, yyy, 50, LINE_H, 100+i+BT_HIDE, NULL);
  162.         $add edx, 200
  163.         $add ebx, 52 << 16 - 10 //BT_HEX
  164.         $int 64
  165.  
  166.         ESI = list.w - 345 / 8;
  167.         if (cdata.size - cdata.content_offset < ESI) ESI = cdata.size - cdata.content_offset;
  168.         WriteText(GAP+236, yyy+TEXT_Y, 0x30, 0x000000, cdata.content);
  169. }
  170.  
  171. int SaveSlotContents() {
  172.         if (! CreateFile(cdata.size, cdata.content, DEFAULT_SAVE_PATH)) {
  173.                 return true;
  174.         } else {
  175.                 notify("'Can not create /tmp0/1/clipview.tmp' -E");
  176.                 return false;
  177.         }
  178. }
  179.  
  180. void ClipViewSelectListDraw()
  181. {
  182.         int i, list_last;
  183.  
  184.         list.count = Clipboard__GetSlotCount();
  185.         if (list.first >= list.count) list.first = list.count - list.visible;
  186.         if (list.first < 0) list.first = 0;
  187.  
  188.         if (list.count > list.visible) list_last = list.visible; else list_last = list.count;
  189.  
  190.         for (i=0; i<list_last; i++;) SelectList_DrawLine(i);
  191.  
  192.         DrawBar(GAP,i*LINE_H+LIST_Y, list.w, -i*LINE_H+ list.h, 0xFFFfff);
  193.         if (!list.count) WriteText(list.w / 2 + GAP - 60,
  194.                 list.h / 2 - 8 + LIST_Y, 0x90, 0x999999, "No data to show");
  195.  
  196.         //Show "<" and ">" buttons and a page number
  197.         //in case when there are items more than visible at once
  198.         if (list.count > list.visible) {
  199.                 param[0] = list.first / list.visible + '0';
  200.                 param[1] = '\0';
  201.                 DefineButton(Form.cwidth-84-GAP, list.h + LIST_Y + 8, 25, 25, BT_LIST_LEFT, sc.button); //BT_LEFT
  202.                 $inc edx
  203.                 $add ebx, 57 << 16 //BT_RIGHT
  204.                 $int 64
  205.                 WriteText(Form.cwidth-84-GAP+10, list.h + LIST_Y + 14, 0x90, sc.button_text, "<      >");
  206.                 $add ebx, 28 << 16
  207.                 $mov edx, #param;
  208.                 $mov edi, sc.work
  209.                 $mov ecx, 11010000b << 24
  210.                 $add ecx, sc.work_text //page number
  211.                 $int 64
  212.         }
  213. }
  214.  
  215. void SelectList_DrawBorder() {
  216.         DrawRectangle3D(GAP-2, LIST_Y-2,
  217.                 list.w+3, list.h+3,
  218.                 sc.work_dark, sc.work_light);
  219.         DrawRectangle3D(GAP-1, LIST_Y-1,
  220.                 list.w+1, list.h+1,
  221.                 sc.work_graph, sc.work_graph);
  222. }
  223.  
  224. //===================================================//
  225. //                                                   //
  226. //                     EVENTS                        //
  227. //                                                   //
  228. //===================================================//
  229.  
  230. void EventDeleteLastSlot()
  231. {
  232.         int i;
  233.         for (i=0; i<list.visible; i++;) {
  234.                 DeleteButton(list.first + i + 100);
  235.                 $add edx, 200
  236.                 $int 64
  237.         }
  238.         Clipboard__DeleteLastSlot();
  239.         DrawWindowContent();
  240. }
  241.  
  242. void EventDeleteAllSlots()
  243. {
  244.         while (Clipboard__GetSlotCount()) Clipboard__DeleteLastSlot();
  245.         DrawWindowContent();
  246. }
  247.  
  248. void EventResetBufferLock() {
  249.         Clipboard__ResetBlockingBuffer();
  250.         DrawWindowContent();
  251. }
  252.  
  253. void EventOpenAsText(int slot_id) {
  254.         slot_data = Clipboard__GetSlotData(slot_id);
  255.         cdata.size = ESDWORD[slot_data]-12;
  256.         cdata.content = slot_data+12;
  257.         if (SaveSlotContents()) RunProgram("/sys/develop/cedit", DEFAULT_SAVE_PATH);
  258. }
  259.  
  260. void EventOpenAsHex(int slot_id) {
  261.         slot_data = Clipboard__GetSlotData(slot_id);
  262.         cdata.size = ESDWORD[slot_data];
  263.         cdata.content = slot_data;
  264.         if (SaveSlotContents()) RunProgram("/sys/develop/heed", DEFAULT_SAVE_PATH);
  265. }
  266.  
  267. stop:
  268.