Subversion Repositories Kolibri OS

Rev

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

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