Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //dict_path > cur_dict
  2.  
  3. #include "..\lib\kolibri.h"
  4. #include "..\lib\strings.h"
  5. #include "..\lib\file_system.h"
  6. #include "..\lib\mem.h"
  7. #include "..\lib\dll.h"
  8. #include "..\lib\edit_box_lib.h"
  9.  
  10. unsigned char title[]= "Dictionary v1.0";
  11. unsigned char direction[] = "Translate direction:";
  12. unsigned char translate_caption[] = "Translate";
  13. unsigned char dict_not_found[] = "Dictionary not found";
  14. unsigned char dict_opened[] = "Dictionary loaded";
  15. unsigned char empty_word[] = "Type a word to translate";
  16. //char direction[] = "Íàïðàâëåíèå ïåðåâîäà:"w;
  17.  
  18.  
  19. int mouse_dd;
  20. edit_box edit1= {200,20,16,0xffffff,0x94AECE,0x94AECE,0x94AECE,0,248,#edword,#mouse_dd,100000000000010b};
  21.  
  22. system_colors sc;
  23. proc_info Form;
  24.  
  25. unsigned char edword[4096], translate_result[4096], search_word[4096], cur_dict[4096];
  26. #define DEFAULT_DICT_DIRECROTY "dictionaries/"
  27. #define DEFAULT_DICT "eng - rus.dict";
  28. dword files_buf;
  29. dword buff, fsize;
  30.  
  31.  
  32. void main()
  33. {  
  34.         int id;
  35.         word key;
  36.        
  37.         mem_Init();
  38.         load_dll2(boxlib, #edit_box_draw,0);
  39.        
  40.        
  41.         program_path[strrchr(#program_path, '/')] = 0; //îáðåçàåì å¸ óðë äî ïîñëåäíåãî /
  42.         strcpy(#program_path+strlen(#program_path), DEFAULT_DICT_DIRECROTY);
  43.         SetCurDir(#program_path);
  44.  
  45.         strcpy(#cur_dict, DEFAULT_DICT);
  46.         OpenDictionary(#cur_dict);
  47.        
  48.         if (param)
  49.         {
  50.                 strcpy(#edword, #param);
  51.                 edit1.size=edit1.pos=strlen(#edword);
  52.                 Translate();
  53.         }
  54.        
  55.         SetEventMask(0x27);
  56.         loop()
  57.         {
  58.                 switch(WaitEvent())
  59.                 {
  60.                 case evMouse:
  61.                         edit_box_mouse stdcall (#edit1);
  62.                         break;
  63.  
  64.                 case evButton:
  65.             id=GetButtonID();              
  66.             if (id==1) ExitProcess();
  67.                         if (id==10)
  68.                         {
  69.                                 Translate();
  70.                                 DrawTranslation();
  71.                         }
  72.  
  73.                         if (id==11)
  74.                         {
  75.                                 ShowDictList();
  76.                                 break;
  77.                         }
  78.                         if (id==12)
  79.                         {
  80.                                 Draw_Window();
  81.                                 break;
  82.                         }
  83.  
  84.                         if (id>=20)
  85.                         {
  86.                                 strcpy(#cur_dict, id-20*304+files_buf+72);
  87.                                 OpenDictionary(#cur_dict);
  88.                         }
  89.                         break;
  90.  
  91.         case evKey:
  92.                         key = GetKey();
  93.                         IF (key==013) //Enter
  94.                         {
  95.                                 Translate();
  96.                                 DrawTranslation();
  97.                         }
  98.                        
  99.                         EAX=key<<8;
  100.                         edit_box_key stdcall(#edit1);
  101.                        
  102.                         //LiveSearch();
  103.                         break;
  104.                        
  105.          case evReDraw:
  106.                         Draw_Window();
  107.                         break;
  108.       }
  109.    }
  110. }
  111.  
  112. /*void LiveSearch()
  113. {
  114.         dword bj, i;
  115.         byte IsNativeWord=1;
  116.         unsigned char native[256];
  117.         unsigned char bukovka;
  118.        
  119.         for (bj=0; bj<fsize; bj++;)
  120.         {
  121.                 bukovka=ESBYTE[buff+bj];
  122.                 if (buff+bj==0x0a)
  123.                 {
  124.                         bj++;
  125.                         if (buff+bj!='"') IsNativeWord=1;
  126.                 }
  127.                 else
  128.                 {
  129.                         for (i=0; i<strlen(#edword); i++) if (edword[i]<>native[i]) goto __NE_RAVNO;
  130.                         debug(#native);
  131.                         __NE_RAVNO:
  132.                         native = '\0';
  133.                         IsNativeWord = 0;
  134.                 }
  135.                 if (IsNativeWord==1) native[strlen(#native)] = bukovka;
  136.         }
  137. }*/
  138.  
  139.  
  140. void Translate()
  141. {
  142.         dword tj;
  143.         char w_native[100], w_translation[100], bukva[1];
  144.        
  145.         byte InfType;
  146.         #define NATIVE_WORD 0
  147.         #define TRANSLATION 1
  148.         #define IGNORE      2
  149.        
  150.         if (!fsize) return;
  151.                
  152.         translate_result = 0;
  153.         strcpy(#search_word, #edword);
  154.         strupr(#search_word);
  155.        
  156.         if (!edword)
  157.         {
  158.                 strcpy(#translate_result, #empty_word);
  159.                 return;
  160.         }
  161.  
  162.         for (tj=0; tj<fsize; tj++;)
  163.         {  
  164.                 bukva = ESBYTE[buff+tj];
  165.                 switch (bukva)
  166.                 {
  167.                         case '"':
  168.                                 if (w_translation)
  169.                                 {
  170.                                         if (!strcmp(#w_native, #search_word))
  171.                                         {
  172.                                        
  173.                                                 if (translate_result) strcat(#translate_result, ", ");
  174.                                                 strcat(#translate_result, #w_translation);
  175.                                         }
  176.                                         else
  177.                                                 if (translate_result) return;
  178.                                                                                
  179.                                         w_translation = w_native = 0;
  180.                                 }
  181.                                 InfType = TRANSLATION;
  182.                                 break;                         
  183.                         case 0x0a:
  184.                                 InfType = NATIVE_WORD;
  185.                                 break;
  186.                         default:
  187.                                 if (InfType==NATIVE_WORD)
  188.                                 {
  189.                                         strcat(#w_native, #bukva);
  190.                                         //if (w_native<>search_word) InfType = IGNORE; //åñëè ïåðâàÿ áóêâà íå ñîâïàäàåò èãíîðèì âñ¸ ñëîâî
  191.                                 }
  192.                                 if (InfType==TRANSLATION) strcat(#w_translation, #bukva);
  193.                 }
  194.         }
  195.         if (!translate_result) strcpy(#translate_result, "Word is'nt found in the dictionary");
  196. }
  197.  
  198.  
  199. void OpenDictionary(dword dict_path)
  200. {
  201.         dword j, words_count=0;
  202.        
  203.         mem_Free(buff);
  204.         buff = mem_Alloc(3500576);
  205.         ReadFile(0, 3500576, buff, dict_path);
  206.         IF (EAX<>6)
  207.         {
  208.                 fsize=0;
  209.                 strcpy(#translate_result, #dict_not_found);
  210.                 Draw_Window();
  211.                 return;
  212.         }
  213.         fsize=EBX;
  214.        
  215.         strcpy(#search_word, dict_path);
  216.         strcpy(#translate_result, #dict_opened);
  217.         Draw_Window();
  218. }
  219.  
  220.  
  221. void ShowDictList()
  222. {
  223.         int j, fcount=10;
  224.        
  225.         mem_Free(files_buf);
  226.         files_buf= mem_Alloc(32);
  227.         ReadDir(0, files_buf, #program_path);
  228.         fcount=ESDWORD[files_buf+8];
  229.         mem_Free(files_buf);
  230.         files_buf = mem_Alloc(fcount+1*304+32);
  231.        
  232.         ReadDir(fcount, files_buf, #program_path);
  233.        
  234.         fcount-=2;
  235.         mem_Move(files_buf,files_buf+608,fcount*304);
  236.                
  237.        
  238.         DefineButton(0,0, Form.width,Form.height, 12+BT_HIDE+BT_NOFRAME, sc.work_button);
  239.         for (j=0; j<fcount; j++;)
  240.         {
  241.                 DefineButton(edit1.left+130,j+1*20+35, 107,20, 20+j, sc.work_button);
  242.                 WriteText(edit1.left+130+8,j+1*20+35+7,0x80,sc.work_button_text, j*304+files_buf+72, 0);
  243.         }
  244. }
  245.  
  246.  
  247. void DrawTranslation()
  248. {
  249.         int text_break=0;
  250.         char tt[4096]='';
  251.        
  252.         int y_pos=70, skin_height=GetSkinHeight();
  253.         char draw_buf[4096];
  254.         strcpy(#draw_buf, #translate_result);
  255.        
  256.         DrawBar(0, y_pos, Form.width-9, Form.height - y_pos-skin_height-4, 0xFFFFFF);
  257.         strttl(#draw_buf);
  258.         WriteText(10+1, y_pos+8, 0x90, 0x800080, #search_word, 0);
  259.         WriteText(10  , y_pos+8, 0x90, 0x800080, #search_word, 0);
  260.         while (draw_buf)
  261.         {
  262.                 text_break= Form.width/6-6;
  263.                 if (text_break>strlen(#draw_buf))
  264.                 {
  265.                         WriteText(10, y_pos+21, 0x80, 0, #draw_buf, 0);
  266.                         return;
  267.                 }
  268.                 while (draw_buf[text_break]<>' ') && (text_break>0) text_break--;
  269.                 strcpy(#tt, #draw_buf+text_break+1);
  270.                 draw_buf[text_break]=0x0;
  271.                 WriteText(10, y_pos+21, 0x80, 0, #draw_buf, 0);
  272.                 strcpy(#draw_buf, #tt);
  273.                 y_pos+=12;
  274.                 if (y_pos+24+skin_height+12>Form.height) return; //÷òîá íå çàëåçàëî íà íèæíèé îáîäîê
  275.         }
  276. }
  277.  
  278.  
  279. void Draw_Window()
  280. {
  281.         sc.get();
  282.         DefineAndDrawWindow(215,120,400,250,0x73,sc.work,#title);
  283.         GetProcessInfo(#Form, SelfInfo);
  284.         if (Form.status_window>2) return; //åñëè ñâåðíóòî â çàãîëîâîê, íè÷åãî íå ðèñóåì
  285.         if (Form.height<140) MoveSize(OLD,OLD,OLD,140);
  286.         if (Form.width<400) MoveSize(OLD,OLD,400,OLD);
  287.  
  288.         DrawBar(0, 0, Form.width-9, 69, sc.work);
  289.         edit1.focus_border_color=sc.work_graph;
  290.         edit1.width=Form.width-edit1.left-edit1.left-9;
  291.         edit_box_draw stdcall(#edit1); //ðèñóåì ñòðîêó àäðåñà
  292.         DefineButton(edit1.left+edit1.width-80,35, 80,20, 10, sc.work_button);
  293.         WriteText(edit1.left+edit1.width-80+14,35+7,0x80,sc.work_button_text,#translate_caption, 0);
  294.         DrawBar(0, 69, Form.width-9, 1, sc.work_graph);
  295.        
  296.         WriteText(edit1.left,35+7,0x80,sc.work_text,#direction, 0);
  297.         DefineButton(edit1.left+130,35, 120,20, 11, sc.work_button);
  298.                 WriteText(edit1.left+130+112,35+7,0x80,sc.work_button_text,"\x19", 0);
  299.         DrawBar(edit1.left+130+1,36,  107,19, 0xFFFFFF);
  300.                 WriteText(edit1.left+130+8,35+7,0x80,0x000000,#cur_dict, 0);
  301.  
  302.         DrawTranslation();
  303. }
  304.  
  305.  
  306. stop:
  307.