Subversion Repositories Kolibri OS

Rev

Rev 6047 | Rev 6278 | 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.         unsigned char *but_text[]={
  10.         "Добавить диск [Ins]",
  11.         "Удалить диск [Del]",
  12.         "Добавить [Ctrl+Enter]",
  13.         0};
  14.        
  15.         ?define INTRO_TEXT_1 "Здесь будет отображаться список"
  16.         ?define INTRO_TEXT_2 "виртуальных дисков в системе."
  17.         ?define INTRO_TEXT_3 "Попробуйте добавить один..."
  18.         ?define SIZE_TEXT "Размер:"
  19.         ?define NOTIFY_TEXT_NO_DISK    "'Для начала добавьте хотя бы один диск' -W"
  20.         ?define NOTIFY_TEXT_DISK_LIMIT "'Достигнут предел количества виртуальных дисков' -W"
  21.         ?define FREE_RAM_TEXT "Размер свободной оперативной памяти: "
  22.        
  23. #else
  24.         unsigned char *but_text[]={
  25.         "Add disk [Ins]",
  26.         "Delete disk [Del]",
  27.         "Add [Ctrl+Enter]",
  28.         0};
  29.        
  30.         ?define INTRO_TEXT_1 " There will be list of mounted"
  31.         ?define INTRO_TEXT_2 " virtual disks."
  32.         ?define INTRO_TEXT_3 " Try to add one..."
  33.         ?define SIZE_TEXT "Size:"
  34.         ?define NOTIFY_TEXT_NO_DISK    "'You need to have at least one disk' -W"
  35.         ?define NOTIFY_TEXT_DISK_LIMIT "'Reached the limit of the number of virtual disks' -W"
  36.         ?define FREE_RAM_TEXT "Free RAM size: "
  37. #endif
  38.  
  39. struct path_string { unsigned char Item[10]; };
  40. path_string disk_list[10];
  41.  
  42. dword devbuf;
  43. char disk_num;
  44. char selected;
  45.  
  46. proc_info Form;
  47.  
  48. unsigned char icons[] = FROM "icons.raw";
  49. #define TOPPANELH 54
  50. #define BOTPANELH 20
  51.  
  52. int     mouse_dd;
  53. char new_disk_size[5];
  54. edit_box edit_disk_size= {50,0,7,0xffffff,0x94AECE,0xFFFfff,0xffffff,0,4,#new_disk_size,#mouse_dd, 1000000000000010b};
  55.  
  56. void Main_Window()
  57. {
  58.         word id, key;
  59.         int i, x;
  60.        
  61.         mem_Init();
  62.         load_dll(boxlib, #box_lib_init,0);
  63.         GetSizeDisk();
  64.         edit_disk_size.left = strlen(SIZE_TEXT)*9 + 10;
  65.         SetEventMask(0x27);
  66.         loop()
  67.         {
  68.                 switch(WaitEvent())
  69.                 {
  70.                 case evMouse:
  71.                         if (!CheckActiveProcess(Form.ID)) break;
  72.                         edit_box_mouse stdcall (#edit_disk_size);
  73.                         break;
  74.                        
  75.                 case evButton:
  76.                         id=GetButtonID();              
  77.                         if (id==1) return;
  78.                         if (id==10) AddDisk();
  79.                         if (id==11) DelDisk();
  80.                         if (id>=20)
  81.                         {
  82.                                 if (selected==id-20) OpenTmpDisk();
  83.                                 selected=id-20;
  84.                                 DrawTmpDisks();
  85.                         }
  86.             break;
  87.         case evKey:
  88.                         key = GetKey();
  89.                         switch(key)
  90.                         {
  91.                                 case 9:
  92.                                         if ( !asm test edit_disk_size.flags, 2) edit_disk_size.flags=1000000000000010b;
  93.                                         else edit_disk_size.flags=1000000000000000b;
  94.                                         edit_box_draw stdcall (#edit_disk_size);
  95.                                         break;
  96.                                 case 185:
  97.                                         AddDisk();
  98.                                         break;
  99.                                 case 182:
  100.                                         if (disk_num<>0) DelDisk();
  101.                                         break;
  102.                                 case 13:
  103.                                         if ( !asm test edit_disk_size.flags, 2) OpenTmpDisk();
  104.                                         else AddDisk();
  105.                                         break;
  106.                                 case 178:
  107.                                         if (selected==0) break;
  108.                                         selected--;
  109.                                         DrawTmpDisks();
  110.                                         break;
  111.                                 case 177:
  112.                                         if (selected+2>disk_num) break;
  113.                                         selected++;
  114.                                         DrawTmpDisks();
  115.                                         break;
  116.                                 case 176:
  117.                                         if (selected<3) break;
  118.                                         selected-=3;
  119.                                         DrawTmpDisks();
  120.                                         break;
  121.                                 case 179:
  122.                                         if (selected+4>disk_num) break;
  123.                                         selected+=3;
  124.                                         DrawTmpDisks();
  125.                                         break;
  126.                         }
  127.                         EAX=key<<8;
  128.                         edit_box_key stdcall(#edit_disk_size);
  129.                         break;
  130.          case evReDraw:                
  131.                         system.color.get();
  132.                         DefineAndDrawWindow(170,150,314,270,0x74,system.color.work,"Virtual Disk Manager 0.62",0);
  133.                         GetProcessInfo(#Form, SelfInfo);
  134.                         if (Form.status_window>2) break;
  135.  
  136.                         DrawBar(0,0,  Form.cwidth,TOPPANELH, system.color.work);
  137.                         DrawBar(0,TOPPANELH, Form.cwidth,1,  system.color.work_graph);
  138.                         WriteText(6, 6, 0x90, system.color.work_text, SIZE_TEXT);
  139.                         WriteText(edit_disk_size.left + edit_disk_size.width + 12, 6, 0x90, system.color.work_text, "MB.");
  140.                         edit_box_draw stdcall (#edit_disk_size);
  141.                         EditBox(#edit_disk_size);
  142.                         for (i=0, x=6; i<2; i++, x+=strlen(but_text[i])*6+37)
  143.                         {
  144.                                 DefineButton(x,29, strlen(but_text[i])*6+28,19, 10+i, system.color.work_button);
  145.                                 _PutImage(x+3,32,  14,14,   i*14*14*3+#icons);
  146.                                 WriteText(x+22,35, 0x80, system.color.work_button_text, but_text[i]);
  147.                         }              
  148.                         GetDisks();
  149.                         DrawTmpDisks();
  150.                 }
  151.         }
  152. }
  153.  
  154.  
  155. void GetSizeDisk()
  156. {
  157.         int fr;
  158.         fr = GetFreeRAM() / 5;
  159.         fr = itoa(fr / 2048);
  160.         strcpy(#new_disk_size, fr);
  161.         edit_disk_size.size = edit_disk_size.pos = strlen(#new_disk_size);
  162.         edit_box_draw stdcall (#edit_disk_size);
  163. }
  164.  
  165.  
  166. void OpenTmpDisk()
  167. {
  168.         unsigned char eol_param[10];
  169.         if (!disk_num) return;
  170.         strcpy(#eol_param, "/tmp#/1/");
  171.         eol_param[4] = disk_list[selected].Item[3];
  172.         RunProgram("/sys/File managers/Eolite", #eol_param);
  173. }
  174.  
  175.  
  176. void GetDisks()
  177. {
  178.         unsigned int j, fcount=30;
  179.         unsigned char disk_name[10];
  180.        
  181.         mem_Free(devbuf);
  182.         devbuf= mem_Alloc(32);
  183.         ReadDir(0, devbuf, "/");
  184.         fcount=ESDWORD[devbuf+8];
  185.         mem_Free(devbuf);
  186.         devbuf = mem_Alloc(fcount+1*304+32);
  187.         ReadDir(fcount, devbuf, "/");
  188.        
  189.         disk_num=0;
  190.         for (j=0; j<fcount; j++;)
  191.         {
  192.                 strcpy(#disk_name, j*304+devbuf+72);
  193.                 if (disk_name[0]!='t') continue;
  194.                 strcpy(#disk_list[disk_num].Item, #disk_name);
  195.                 disk_num++;
  196.         }
  197.         if (disk_num>12) disk_num=12;
  198. }
  199.  
  200.  
  201. unsigned int disk_pos_x[]={13,13,13,85,85,85,157,157,157,229,229,229};
  202. unsigned int disk_pos_y[]={60,95,130, 60, 95, 130, 60, 95,130, 60, 85,130};
  203.  
  204. void DrawTmpDisks()
  205. {
  206.         char free_ram_text[60];
  207.         byte i, real_id;
  208.         int FreeRAM=GetFreeRAM()/1024;
  209.  
  210.         DrawBar(0,TOPPANELH+1, Form.cwidth,Form.cheight-TOPPANELH-BOTPANELH-2, 0xFFFFFF);
  211.         DrawBar(0,Form.cheight-BOTPANELH-1, Form.cwidth,1, system.color.work_graph);
  212.         DrawBar(0,Form.cheight-BOTPANELH, Form.cwidth,BOTPANELH, system.color.work);
  213.         strcpy(#free_ram_text, FREE_RAM_TEXT);
  214.         strcat(#free_ram_text, itoa(FreeRAM));
  215.         strcat(#free_ram_text, " MB");
  216.         WriteText(10, Form.cheight-13, 0x80, system.color.work_text, #free_ram_text);
  217.         if (disk_num==0)
  218.         {
  219.                 WriteText(17,65,    0x90, 0x777777, INTRO_TEXT_1);
  220.                 WriteText(17,65+15, 0x90, 0x777777, INTRO_TEXT_2);
  221.                 WriteText(17,65+42, 0x90, 0x777777, INTRO_TEXT_3);
  222.                 return;
  223.         };
  224.         if (selected>=disk_num) selected=disk_num-1; //restore selected
  225.         for (i=0; i<10; i++) DeleteButton(20+i);
  226.         for (i=0; i<disk_num; i++)
  227.         {
  228.                 DefineButton(disk_pos_x[i], disk_pos_y[i], 65, 30, 20+i, 0xFFFfff);
  229.                 WriteText(disk_pos_x[i]+25,disk_pos_y[i]+2,  10110000b, 0, #disk_list[i].Item);
  230.                 real_id = disk_list[i].Item[3] - '0';
  231.                 WriteText(disk_pos_x[i]+25,disk_pos_y[i]+19, 0x80, 0x888888, ConvertSize(disk_sizes[real_id]));
  232.                 _PutImage(disk_pos_x[i]+5,disk_pos_y[i]+4, 14,14, 2*14*14*3+#icons);
  233.                 if (selected==i) {
  234.                         DrawWideRectangle(disk_pos_x[i], disk_pos_y[i], 65, 30, 2, 0x0080FF);
  235.                         PutPixel(disk_pos_x[i], disk_pos_y[i], 0xFFFfff);
  236.                 }
  237.         }
  238. }
  239.  
  240.  
  241. void AddDisk()
  242. {
  243.         byte i, j, err;
  244.         if (disk_num>=10)
  245.         {
  246.                 notify(NOTIFY_TEXT_DISK_LIMIT);
  247.                 return;
  248.         }
  249.        
  250.         param[0]='a';
  251.         for (i=0; i<9; i++)
  252.         {
  253.                 for (j=0; j<=disk_num; j++)
  254.                 {
  255.                         if (i+48==disk_list[j].Item[3]) continue 1;
  256.                 }
  257.                 break;
  258.         }
  259.        
  260.         param[1]=i+48;
  261.         param[2]='s';
  262.         param[3]='\0';
  263.         strcat(#param, #new_disk_size);
  264.         err = Console_Work();
  265.         if ((err!=0) && (err<7)) notify(rezult_text[err]);
  266.         pause(5);
  267.         GetDisks();
  268.         DrawTmpDisks();
  269.         GetSizeDisk();
  270. }
  271.  
  272.  
  273. void DelDisk()
  274. {
  275.         byte err;
  276.         if (disk_num==0)
  277.         {
  278.                 notify(NOTIFY_TEXT_NO_DISK);
  279.                 return;
  280.         }
  281.         param[0]='d';
  282.         param[1]=disk_list[selected].Item[3];
  283.         err = byte Console_Work();
  284.         if ((err!=0) && (err<7)) notify(rezult_text[err]);
  285.         pause(15);
  286.         GetDisks();
  287.         DrawTmpDisks();
  288. }
  289.  
  290.  
  291.  
  292.  
  293.  
  294.