Subversion Repositories Kolibri OS

Rev

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.         if (slot_data_type_number >= 4) slot_data_type_number = 3;
  160.         WriteText(GAP+140, yyy+TEXT_Y, 0x90, 0x000000, data_type[slot_data_type_number]);
  161.         WriteTextB(GAP+list.w - 88, yyy+TEXT_Y, 0x90, 0x006597, "TEXT  HEX");
  162.         DefineButton(GAP+list.w - 98, yyy, 50, LINE_H, 100+i+BT_HIDE, NULL);
  163.         $add edx, 200
  164.         $add ebx, 52 << 16 - 10 //BT_HEX
  165.         $int 64
  166.  
  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);
  170. }
  171.  
  172. int SaveSlotContents() {
  173.         if (! CreateFile(cdata.size, cdata.content, DEFAULT_SAVE_PATH)) {
  174.                 return true;
  175.         } else {
  176.                 notify("'Can not create /tmp0/1/clipview.tmp' -E");
  177.                 return false;
  178.         }
  179. }
  180.  
  181. void ClipViewSelectListDraw()
  182. {
  183.         int i, list_last;
  184.  
  185.         list.count = Clipboard__GetSlotCount();
  186.         if (list.first >= list.count) list.first = list.count - list.visible;
  187.         if (list.first < 0) list.first = 0;
  188.  
  189.         if (list.count > list.visible) list_last = list.visible; else list_last = list.count;
  190.  
  191.         for (i=0; i<list_last; i++;) SelectList_DrawLine(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.  
  197.         //Show "<" and ">" buttons and a page number
  198.         //in case when there are items more than visible at once
  199.         if (list.count > list.visible) {
  200.                 param[0] = list.first / list.visible + '0';
  201.                 param[1] = '\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;
  209.                 $mov edi, sc.work
  210.                 $mov ecx, 11010000b << 24
  211.                 $add ecx, sc.work_text //page number
  212.                 $int 64
  213.         }
  214. }
  215.  
  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);
  223. }
  224.  
  225. //===================================================//
  226. //                                                   //
  227. //                     EVENTS                        //
  228. //                                                   //
  229. //===================================================//
  230.  
  231. void EventDeleteLastSlot()
  232. {
  233.         int i;
  234.         for (i=0; i<list.visible; i++;) {
  235.                 DeleteButton(list.first + i + 100);
  236.                 $add edx, 200
  237.                 $int 64
  238.         }
  239.         Clipboard__DeleteLastSlot();
  240.         DrawWindowContent();
  241. }
  242.  
  243. void EventDeleteAllSlots()
  244. {
  245.         while (Clipboard__GetSlotCount()) Clipboard__DeleteLastSlot();
  246.         DrawWindowContent();
  247. }
  248.  
  249. void EventResetBufferLock() {
  250.         Clipboard__ResetBlockingBuffer();
  251.         DrawWindowContent();
  252. }
  253.  
  254. void EventOpenAsText(int slot_id) {
  255.         slot_data = Clipboard__GetSlotData(slot_id);
  256.         cdata.size = ESDWORD[slot_data]-12;
  257.         cdata.content = slot_data+12;
  258.         if (SaveSlotContents()) RunProgram("/sys/develop/cedit", DEFAULT_SAVE_PATH);
  259. }
  260.  
  261. void EventOpenAsHex(int slot_id) {
  262.         slot_data = Clipboard__GetSlotData(slot_id);
  263.         cdata.size = ESDWORD[slot_data];
  264.         cdata.content = slot_data;
  265.         if (SaveSlotContents()) RunProgram("/sys/develop/heed", DEFAULT_SAVE_PATH);
  266. }
  267.  
  268. stop:
  269.