Subversion Repositories Kolibri OS

Rev

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

  1.   /////////////////////////////////////////////////////////////////////////////////////////
  2.  /////////////////////////                   GUI                      ////////////////////
  3. /////////////////////////////////////////////////////////////////////////////////////////
  4.  
  5. #include "..\lib\gui.h"
  6. #include "..\lib\obj\box_lib.h"
  7.  
  8. #ifdef LANG_RUS
  9. ?define T_ADD_DISK " „®¡ ¢¨âì ¤¨áª [Ins]"      
  10. ?define T_DELETE_DISK " “¤ «¨âì ¤¨áª [Del]"
  11. ?define INTRO_TEXT_1 "‡¤¥áì ¡ã¤¥â ®â®¡à ¦ âìáï ᯨ᮪"
  12. ?define INTRO_TEXT_2 "¢¨àâã «ì­ëå ¤¨áª®¢ ¢ á¨á⥬¥."
  13. ?define INTRO_TEXT_3 "®¯à®¡ã©â¥ ¤®¡ ¢¨âì ®¤¨­..."
  14. ?define SIZE_TEXT " §¬¥à ­®¢®£® ¤¨áª  ¢ Œ:"
  15. ?define NOTIFY_TEXT_NO_DISK    "'„«ï ­ ç «  ¤®¡ ¢ì⥠å®âï ¡ë ®¤¨­ ¤¨áª' -W"
  16. ?define NOTIFY_SYSTEM_DISK0    "'„¨áª á ­®¬¥à®¬ 0 ï¥âáï á¨á⥬­ë¬ ¨ 㤠«ïâì ¥£® ­¥ ४®¬¥­¤ã¥âáï.
  17. ‚ á«ãç ¥, ¥á«¨ ¢ë â®ç­® §­ ¥â¥, çâ® ¤¥« ¥â¥, 㤠«¨âì ¥£® ¬®¦­® á § ¦ â®© ª« ¢¨è¥© SHIFT.' -W"
  18. ?define NOTIFY_TEXT_DISK_LIMIT "'„®á⨣­ã⠯।¥« ª®«¨ç¥á⢠ ¢¨àâã «ì­ëå ¤¨áª®¢' -W"
  19. ?define FREE_RAM_TEXT " §¬¥à ᢮¡®¤­®© ®¯¥à â¨¢­®© ¯ ¬ïâ¨: %i Mb"
  20.        
  21. #else
  22. ?define T_ADD_DISK " Add disk [Ins]"
  23. ?define T_DELETE_DISK " Delete disk [Del]"
  24. ?define INTRO_TEXT_1 " There will be list of mounted"
  25. ?define INTRO_TEXT_2 " virtual disks."
  26. ?define INTRO_TEXT_3 " Try to add one..."
  27. ?define SIZE_TEXT "New Disk size in MB:"
  28. ?define NOTIFY_TEXT_NO_DISK    "'You need to have at least one disk' -W"
  29. ?define NOTIFY_SYSTEM_DISK0    "'Disc number 0 is a system disk. It is not recommended to delete it.
  30. In case when you know what you are doing you can delete it with the SHIFT key pressed.' -W"
  31. ?define NOTIFY_TEXT_DISK_LIMIT "'Reached the limit of the number of virtual disks' -W"
  32. ?define FREE_RAM_TEXT "Free RAM size: %i MB"
  33. #endif
  34.  
  35. struct path_string { unsigned char Item[10]; };
  36. path_string disk_list[10];
  37.  
  38. dword devbuf;
  39. char disk_num;
  40. char selected;
  41.  
  42. proc_info Form;
  43.  
  44. unsigned char icons_btn[] = FROM "img/btn.raw";
  45. unsigned char disk_icon[] = FROM "img/disk.raw";
  46. #define TOPPANELH 68
  47. #define BOTPANELH 26
  48.  
  49. char new_disk_size[7];
  50. edit_box edit_disk_size= {50,0,7,0xffffff,0x94AECE,0xFFFfff,0xffffff,0x10000000,
  51.         sizeof(new_disk_size)-2,#new_disk_size,0, ed_focus+ed_figure_only};
  52.  
  53. void Main_Window()
  54. {
  55.         word id;
  56.         int x;
  57.  
  58.         #define NO_DLL_INIT
  59.         load_dll(boxlib, #box_lib_init,0);
  60.         GetNewSizeDisk();
  61.         edit_disk_size.left = strlen(SIZE_TEXT)*8 + 13;
  62.         @SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER);
  63.         loop()
  64.         {
  65.                 switch(@WaitEvent())
  66.                 {
  67.                 case evMouse:
  68.                         edit_box_mouse stdcall (#edit_disk_size);
  69.                         break;
  70.                        
  71.                 case evButton:
  72.                         id = @GetButtonID();              
  73.                         if (id==1) return;
  74.                         if (id==10) AddDisk();
  75.                         if (id==11) {
  76.                                 GetKeys();
  77.                                 DelDisk();
  78.                         }
  79.                         if (id>=20)
  80.                         {
  81.                                 if (selected==id-20) OpenTmpDisk();
  82.                                 selected=id-20;
  83.                                 DrawTmpDisks();
  84.                         }
  85.             break;
  86.         case evKey:
  87.                         GetKeys();
  88.                         // PROCESS KEYS WHEN EDIT BOX INACTIVE
  89.                         if ( ! edit_disk_size.flags&ed_focus)   switch(key_scancode)
  90.                         {
  91.                                 case SCAN_CODE_TAB:
  92.                                         edit_disk_size.flags = ed_figure_only + ed_focus;
  93.                                         edit_box_draw stdcall (#edit_disk_size);
  94.                                         DrawTmpDisks();
  95.                                         break;
  96.                                 case SCAN_CODE_UP:
  97.                                         if (selected==0) break;
  98.                                         selected--;
  99.                                         DrawTmpDisks();
  100.                                         break;
  101.                                 case SCAN_CODE_DOWN:
  102.                                         if (selected+2>disk_num) break;
  103.                                         selected++;
  104.                                         DrawTmpDisks();
  105.                                         break;
  106.                                 case SCAN_CODE_LEFT:
  107.                                         if (selected<3) break;
  108.                                         selected-=3;
  109.                                         DrawTmpDisks();
  110.                                         break;
  111.                                 case SCAN_CODE_RIGHT:
  112.                                         if (selected+4>disk_num) break;
  113.                                         selected+=3;
  114.                                         DrawTmpDisks();
  115.                                         break;                                 
  116.                                 case SCAN_CODE_INS:
  117.                                         AddDisk();
  118.                                         break;
  119.                                 case SCAN_CODE_DEL:
  120.                                         DelDisk();
  121.                                         break;
  122.                                 case SCAN_CODE_ENTER:
  123.                                         OpenTmpDisk();
  124.                                         break;
  125.                         }
  126.                         // PROCESS KEYS WHEN EDIT BOX ACTIVE           
  127.                         else switch(key_scancode)
  128.                         {
  129.                                 case SCAN_CODE_TAB:
  130.                                         edit_disk_size.flags = ed_figure_only;
  131.                                         edit_box_draw stdcall (#edit_disk_size);
  132.                                         DrawTmpDisks();
  133.                                         break;
  134.                                 case SCAN_CODE_ENTER:
  135.                                 case SCAN_CODE_INS:
  136.                                         AddDisk();
  137.                                         break;
  138.                                 default:
  139.                                         EAX = key_editbox;
  140.                                         edit_box_key stdcall(#edit_disk_size);
  141.                                         break;
  142.                         }
  143.                         break;
  144.          case evReDraw:                
  145.                         sc.get();
  146.                         DefineAndDrawWindow(170,150,405,290,0x74,sc.work,"Virtual Disk Manager 0.69",0);
  147.                         GetProcessInfo(#Form, SelfInfo);
  148.                         if (Form.status_window&ROLLED_UP) break;
  149.  
  150.                         DrawBar(0,0,  Form.cwidth,TOPPANELH, sc.work);
  151.                         DrawBar(0,TOPPANELH, Form.cwidth,1,  sc.work_graph);
  152.                         WriteText(6, 9, 0x90, sc.work_text, SIZE_TEXT);
  153.                         DrawRectangle(edit_disk_size.left-1, edit_disk_size.top-1, edit_disk_size.width+2, 23,sc.work_graph);
  154.                         edit_box_draw stdcall (#edit_disk_size);
  155.                         x = 6 + DrawStandartCaptButton(6, 36, 10, T_ADD_DISK);
  156.                         DrawStandartCaptButton(x, 36, 11, T_DELETE_DISK);
  157.                         _PutImage(6+6, 42,  14,14, #icons_btn);
  158.                         _PutImage(x+6, 42,  14,14, 14*14*3+#icons_btn);        
  159.                         GetDisks();
  160.                         DrawTmpDisks();
  161.                 }
  162.         }
  163. }
  164.  
  165.  
  166. void GetNewSizeDisk()
  167. {
  168.         int fr;
  169.         fr = GetFreeRAM() / 5 * 2;
  170.         fr = itoa(fr / 2048);
  171.         strcpy(#new_disk_size, fr);
  172.         EditBox_UpdateText(#edit_disk_size, edit_disk_size.flags);
  173.         edit_box_draw stdcall (#edit_disk_size);
  174. }
  175.  
  176.  
  177. void OpenTmpDisk()
  178. {
  179.         unsigned char eol_param[10];
  180.         if (!disk_num) return;
  181.         strcpy(#eol_param, "/tmp#/1/");
  182.         eol_param[4] = disk_list[selected].Item[3];
  183.         RunProgram("/sys/File managers/Eolite", #eol_param);
  184. }
  185.  
  186.  
  187. void GetDisks()
  188. {
  189.         unsigned int j, fcount=30;
  190.         unsigned char disk_name[10];
  191.        
  192.         mem_Free(devbuf);
  193.         devbuf= mem_Alloc(32);
  194.         ReadDir(0, devbuf, "/");
  195.         fcount=ESDWORD[devbuf+8];
  196.         mem_Free(devbuf);
  197.         devbuf = mem_Alloc(fcount+1*304+32);
  198.         ReadDir(fcount, devbuf, "/");
  199.        
  200.         disk_num=0;
  201.         for (j=0; j<fcount; j++;)
  202.         {
  203.                 strcpy(#disk_name, j*304+devbuf+72);
  204.                 if (disk_name[0]!='t') continue;
  205.                 strcpy(#disk_list[disk_num].Item, #disk_name);
  206.                 disk_num++;
  207.         }
  208.         if (disk_num>12) disk_num=12;
  209. }
  210.  
  211.  
  212. dword GetDiskSize(dword disk_n)
  213. {
  214.         BDVK bdvk;
  215.         char tmp_path[8];
  216.         strcpy(#tmp_path, "/tmp#/1");
  217.         tmp_path[4] = disk_n + '0';
  218.         GetFileInfo(#tmp_path, #bdvk);         
  219.         return bdvk.sizelo;
  220. }
  221.  
  222. unsigned int disk_pos_x[]={13,13,13,102,102,102,191,191,191,279,279,279};
  223. unsigned int disk_pos_y[]={79,127,175, 79,127,175, 79,127,175, 79,127,175};
  224.  
  225. void DrawTmpDisks()
  226. {
  227.         #define SELECTION_ACTIVE 0x0080FF;
  228.         #define SELECTION_INACTIVE 0x757489;
  229.         dword selection_color;
  230.         char free_ram_text[60];
  231.         byte i;
  232.  
  233.         DrawBar(0,TOPPANELH+1, Form.cwidth,Form.cheight-TOPPANELH-BOTPANELH-2, 0xFFFFFF);
  234.         DrawBar(0,Form.cheight-BOTPANELH-1, Form.cwidth,1, sc.work_graph);
  235.         DrawBar(0,Form.cheight-BOTPANELH, Form.cwidth,BOTPANELH, sc.work);
  236.         sprintf(#free_ram_text, FREE_RAM_TEXT, GetFreeRAM()/1024);
  237.         WriteText(10, Form.cheight-20, 0x90, sc.work_text, #free_ram_text);
  238.         if (disk_num==0)
  239.         {
  240.                 WriteText(17,TOPPANELH+15,    0x90, 0x777777, INTRO_TEXT_1);
  241.                 WriteText(17,TOPPANELH+15+15, 0x90, 0x777777, INTRO_TEXT_2);
  242.                 WriteText(17,TOPPANELH+15+42, 0x90, 0x777777, INTRO_TEXT_3);
  243.                 return;
  244.         };
  245.         if (selected>=disk_num) selected=disk_num-1; //restore selected
  246.         for (i=0; i<10; i++)
  247.         {
  248.                 DeleteButton(20+i);
  249.                 if (i>=disk_num) continue;
  250.                 DefineButton(disk_pos_x[i], disk_pos_y[i], 80, 40, 20+i, 0xFFFfff);
  251.                 WriteText(disk_pos_x[i]+29,disk_pos_y[i]+6,  0x90, 0x222222, #disk_list[i].Item);
  252.                 WriteText(disk_pos_x[i]+30,disk_pos_y[i]+24, 0x80, 0x555555,
  253.                         ConvertSize(GetDiskSize(disk_list[i].Item[3] - '0')));
  254.                 _PutImage(disk_pos_x[i]+9,disk_pos_y[i]+10, 15,9, #disk_icon);
  255.                 if (selected==i) {
  256.                         if ( edit_disk_size.flags & ed_focus)
  257.                                 selection_color = SELECTION_INACTIVE;
  258.                         else
  259.                                 selection_color = SELECTION_ACTIVE;
  260.                         DrawWideRectangle(disk_pos_x[i], disk_pos_y[i], 80, 40, 2, selection_color);
  261.                         PutPixel(disk_pos_x[i], disk_pos_y[i], 0xFFFfff);
  262.                 }
  263.         }
  264. }
  265.  
  266.  
  267. void AddDisk()
  268. {
  269.         byte i, j, err;
  270.         if (disk_num>=10)
  271.         {
  272.                 notify(NOTIFY_TEXT_DISK_LIMIT);
  273.                 return;
  274.         }
  275.        
  276.         param[0]='a';
  277.         for (i=0; i<9; i++)
  278.         {
  279.                 for (j=0; j<=disk_num; j++)
  280.                 {
  281.                         if (i+48==disk_list[j].Item[3]) continue 1;
  282.                 }
  283.                 break;
  284.         }
  285.        
  286.         param[1]=i+48;
  287.         param[2]='s';
  288.         param[3]='\0';
  289.         strcat(#param, #new_disk_size);
  290.         err = Console_Work();
  291.         if ((err!=0) && (err<7)) notify(rezult_text[err]);
  292.         pause(5);
  293.         GetDisks();
  294.         DrawTmpDisks();
  295.         GetNewSizeDisk();
  296. }
  297.  
  298.  
  299. void DelDisk()
  300. {
  301.         byte err;
  302.         if (disk_num==0)
  303.         {
  304.                 notify(NOTIFY_TEXT_NO_DISK);
  305.                 return;
  306.         }
  307.         if (disk_list[selected].Item[3]=='0') && (! key_modifier & KEY_LSHIFT) && (! key_modifier & KEY_RSHIFT)
  308.         {
  309.                 notify(NOTIFY_SYSTEM_DISK0);
  310.                 return;
  311.         }
  312.         param[0]='d';
  313.         param[1]=disk_list[selected].Item[3];
  314.         err = byte Console_Work();
  315.         if ((err!=0) && (err<7)) notify(rezult_text[err]);
  316.         pause(15);
  317.         GetDisks();
  318.         DrawTmpDisks();
  319. }
  320.  
  321.  
  322.  
  323.  
  324.  
  325.