Subversion Repositories Kolibri OS

Rev

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

  1. //Calypte 0.35 - Leency
  2. //Calypte 0.15 - Punk Joker
  3.  
  4. /*
  5. TODO
  6. - word wrap
  7. - draw by line
  8. - text selection
  9. */
  10.  
  11. #define MEMSIZE 1024*200
  12.  
  13. #ifndef AUTOBUILD
  14.         #include "lang.h--"
  15. #endif
  16.  
  17. //===================================================//
  18. //                                                   //
  19. //                       LIB                         //
  20. //                                                   //
  21. //===================================================//
  22.  
  23. #include "../lib/kolibri.h"
  24. #include "../lib/fs.h"
  25. #include "../lib/gui.h"
  26. #include "../lib/list_box.h"
  27. #include "../lib/collection.h"
  28.  
  29. #include "../lib/obj/iconv.h"
  30. #include "../lib/obj/box_lib.h"
  31. #include "../lib/obj/libio.h"
  32. #include "../lib/obj/proc_lib.h"
  33. #include "../lib/obj/librasterworks.h"
  34.  
  35. #include "../lib/patterns/simple_open_dialog.h"
  36.  
  37. //===================================================//
  38. //                                                   //
  39. //                       DATA                        //
  40. //                                                   //
  41. //===================================================//
  42.  
  43. char default_dir[] = "/rd/1";
  44. od_filter filter2 = { 8, "TXT\0\0" };
  45.  
  46. /*=========  MENU  ==========*/
  47. ?define MENU1 "File"
  48. ?define MENU2 "Encoding"
  49. ?define MENU3 "Reopen"
  50.  
  51. char menu_file_list[] =
  52. "Open|Ctrl+O
  53. Close
  54. Properties
  55. Exit";
  56.  
  57. char menu_encoding_list[] =
  58. "UTF-8
  59. KOI8-RU
  60. CP1251
  61. CP1252
  62. ISO8859-5
  63. CP866";
  64.  
  65. char menu_reopen_list[] =
  66. "Tinypad
  67. TextEdit
  68. TextRead
  69. WebView
  70. FB2Read
  71. HexView";
  72.  
  73. enum
  74. {
  75.         MENU_ID_FILE=10,
  76.         FILE_SUBMENU_ID_OPEN=10,
  77.         FILE_SUBMENU_ID_CLOSE,
  78.         FILE_SUBMENU_ID_PROPERTIES,
  79.         FILE_SUBMENU_ID_EXIT,
  80.  
  81.         MENU_ID_ENCODING=20,
  82.  
  83.         MENU_ID_REOPEN=30,
  84.         FILE_SUBMENU_ID_TINYPAD=30,
  85.         FILE_SUBMENU_ID_TEXTEDIT,
  86.         FILE_SUBMENU_ID_TEXTREAD,
  87.         FILE_SUBMENU_ID_WEBVIEW,
  88.         FILE_SUBMENU_ID_FB2READ,
  89.         FILE_SUBMENU_ID_HEXVIEW
  90. };
  91.  
  92. int menu_file_x = 6;
  93. int menu_encoding_x = NULL;
  94. int menu_reopen_x = NULL;
  95. /*======== MENU END ==========*/
  96.  
  97. #define TITLE "Calypte v0.38 dev"
  98. char win_title[4096] = TITLE;
  99.  
  100. #define TOPPANELH 23
  101. #define BOTPANELH 10
  102. #define WIN_W 750
  103. #define WIN_H 550
  104. #define SCROLL_SIZE 15
  105.  
  106. proc_info Form;
  107. llist rows;
  108.  
  109. int encoding;
  110.        
  111. dword old_width,old_height;
  112.  
  113. dword bufpointer;
  114. dword bufsize;
  115.  
  116. scroll_bar scroll_v = { SCROLL_SIZE,200,398,44,0,2,115,15,0,0xeeeeee,0xBBBbbb,0xeeeeee,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1};
  117. scroll_bar scroll_h = { SCROLL_SIZE,200,398,44,0,2,115,15,0,0xeeeeee,0xBBBbbb,0xeeeeee,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1};
  118.  
  119. collection s;
  120.  
  121. //===================================================//
  122. //                                                   //
  123. //                       CODE                        //
  124. //                                                   //
  125. //===================================================//
  126.  
  127. void main()
  128. {  
  129.         int id;
  130.  
  131.         load_dll(boxlib,    #box_lib_init,   0);
  132.         load_dll(libio,     #libio_init,     1);
  133.         //load_dll(libini,    #lib_init,       1);
  134.         load_dll(iconv_lib, #iconv_open,     0);
  135.         load_dll(Proc_lib,  #OpenDialog_init,0);
  136.         load_dll(librasterworks,  #rasterworks_drawText,0);
  137.         OpenDialog_init stdcall (#o_dialog);
  138.  
  139.         if (param)
  140.         {
  141.                 draw_window();
  142.                 OpenFile(#param);
  143.                 Prepare();
  144.                 DrawText();
  145.         }
  146.        
  147.         SetEventMask(EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER);
  148.  
  149.         loop()
  150.         {
  151.           switch(WaitEvent())
  152.           {
  153.                 case evMouse:
  154.                         mouse.get();
  155.                         rows.wheel_size = 3;
  156.                         if (rows.MouseScroll(mouse.vert))
  157.                         {
  158.                                 DrawText();
  159.                         }
  160.                         break;
  161.                
  162.                 case evButton:
  163.                         id=GetButtonID();              
  164.                         if (id==1)
  165.                         {
  166.                                 ExitProcess();
  167.                         }
  168.                         if (id==MENU_ID_FILE)
  169.                         {
  170.                                 EventShowMenu(menu_file_x, #menu_file_list, MENU_ID_FILE, NULL);
  171.                         }
  172.                         if (id==MENU_ID_ENCODING)
  173.                         {
  174.                                 EventShowMenu(menu_encoding_x, #menu_encoding_list, MENU_ID_ENCODING, encoding+1);
  175.                         }
  176.                         if (id==MENU_ID_REOPEN)
  177.                         {
  178.                                 EventShowMenu(menu_reopen_x, #menu_reopen_list, MENU_ID_REOPEN, NULL);
  179.                         }
  180.                         break;
  181.                
  182.                 case evKey:
  183.                         GetKeys();
  184.                         if (key_modifier&KEY_LCTRL) || (key_modifier&KEY_RCTRL)
  185.                         {
  186.                                 if (key_scancode == SCAN_CODE_KEY_O)
  187.                                 {
  188.                                         EventOpenFile();
  189.                                 }
  190.                                 break;
  191.                         }
  192.                         if (rows.ProcessKey(key_scancode))
  193.                         {
  194.                                 DrawText();
  195.                         }
  196.                         break;
  197.                  
  198.                  case evReDraw:
  199.                         if (CheckActiveProcess(Form.ID)) EventMenuClick();
  200.                         draw_window();
  201.                         break;
  202.           }
  203.    }
  204. }
  205.  
  206. int DrawMenuButton(dword x,y,id,text)
  207. {
  208.         int textlen = strlen(text)*8;
  209.         int padding = 12;
  210.         DefineHiddenButton(x, y, textlen+padding+padding, TOPPANELH-2, id);
  211.         WriteText(x+padding,y+4, 0x90, MixColors(sc.work, sc.work_text, 70), text);
  212.         return textlen+padding+padding;
  213. }
  214.  
  215. void draw_window()
  216. {
  217.         sc.get();
  218.         DefineAndDrawWindow(screen.width-WIN_W/2,screen.height-WIN_H/2,WIN_W,WIN_H,0x73,0xFFFFFF,#win_title,0);
  219.         GetProcessInfo(#Form, SelfInfo);
  220.         DrawBar(0, 0, Form.cwidth, TOPPANELH-1, sc.work);
  221.         DrawBar(0, TOPPANELH-1, Form.cwidth, 1, sc.work_dark);
  222.         DrawBar(0, Form.cheight-BOTPANELH, Form.cwidth, BOTPANELH, sc.work);
  223.        
  224.         menu_encoding_x = menu_file_x + DrawMenuButton(menu_file_x, 0, MENU_ID_FILE, MENU1);
  225.         menu_reopen_x = menu_encoding_x + DrawMenuButton(menu_encoding_x, 0, MENU_ID_ENCODING, MENU2);
  226.         DrawMenuButton(menu_reopen_x, 0, MENU_ID_REOPEN, MENU3);
  227.  
  228.         if (old_width!=Form.width) || (old_height!=Form.height)
  229.         {
  230.                 old_width = Form.width;
  231.                 old_height = Form.height;
  232.                
  233.                 rows.no_selection = true;
  234.                 rows.SetFont(8, 14, 0x90);
  235.                 rows.SetSizes(0, TOPPANELH, Form.cwidth - SCROLL_SIZE, Form.cheight - TOPPANELH - BOTPANELH, 20);
  236.                 rows.column_max = rows.w / rows.font_w;
  237.  
  238.                 if (bufpointer)
  239.                 {
  240.                         Prepare();
  241.                 }
  242.                 rows.CheckDoesValuesOkey();
  243.         }
  244.         DrawRectangle(rows.x+rows.w-1, rows.y, SCROLL_SIZE, rows.h-1, 0xEEEeee);
  245.         DrawText();
  246. }
  247.  
  248. void OpenFile(dword _path)
  249. {
  250.         strcpy(#param, _path);
  251.         sprintf(#win_title, "%s - %s", TITLE, #param);
  252.         rows.KeyHome();
  253.         file_size stdcall (#param);
  254.         bufsize = EBX;
  255.         if (bufsize)
  256.         {
  257.                 bufpointer = mem_Free(bufpointer);
  258.                 bufpointer = mem_Alloc(bufsize);
  259.                 if (ReadFile(0, bufsize, bufpointer, #param) != 0)
  260.                 {
  261.                         bufpointer = 0;
  262.                         notify("'Error opening file'-E");
  263.                         return;
  264.                 }
  265.         }
  266.         if (encoding!=CH_CP866)
  267.         {
  268.                 ChangeCharset(encoding, "CP866", bufpointer);
  269.         }
  270. }
  271.  
  272. enum
  273. {
  274.         PARSE_CALCULATE_ROWS_COUNT,
  275.         PARSE_DRAW_PREPARE,
  276. };
  277.  
  278. void Parse(int mode)
  279. {
  280.         int pos=0;
  281.         int sub_pos=0;
  282.         int len_str = 0;
  283.         bool do_eof = false;
  284.         word bukva[2];
  285.  
  286.         while(1)
  287.         {
  288.                 while(1)
  289.                 {
  290.                         bukva = DSBYTE[bufpointer+pos+len_str];
  291.                         if (bukva=='\0')
  292.                         {
  293.                                 do_eof = true;
  294.                                 break;
  295.                         }
  296.                         if (bukva==0x0a)
  297.                         {
  298.                                 break;
  299.                         }
  300.                         else
  301.                         {
  302.                                 len_str++;
  303.                         }
  304.                 }
  305.                 if (len_str<=rows.column_max)
  306.                 {
  307.                         if (mode==PARSE_DRAW_PREPARE)
  308.                         {
  309.                                 s.addn(bufpointer+pos, len_str);
  310.                         }
  311.                         pos += len_str+1;
  312.                 }
  313.                 else
  314.                 {
  315.                         if (mode==PARSE_DRAW_PREPARE)
  316.                         {
  317.                                 s.addn(bufpointer+pos, rows.column_max);
  318.                         }
  319.                         pos += rows.column_max;
  320.                 }
  321.                 sub_pos++;
  322.                 if (mode==PARSE_CALCULATE_ROWS_COUNT) && (do_eof)
  323.                 {
  324.                         break;
  325.                 }
  326.                 if (mode==PARSE_DRAW_PREPARE) && (pos>=bufsize-1)
  327.                 {
  328.                         break;
  329.                 }
  330.                 len_str = 0;
  331.         }
  332.         if (mode == PARSE_CALCULATE_ROWS_COUNT)
  333.         {
  334.                 rows.count = sub_pos;
  335.                 Parse(PARSE_DRAW_PREPARE);
  336.         }
  337. }
  338.  
  339. void Prepare()
  340. {
  341.         Parse(PARSE_CALCULATE_ROWS_COUNT);
  342. }
  343.  
  344. void DrawText()
  345. {
  346.         int i=0, top;
  347.  
  348.         if (rows.count<rows.visible)
  349.         {
  350.                 top = rows.count;
  351.         }
  352.         else
  353.         {
  354.                 if (rows.count-rows.first<=rows.visible)
  355.                 {
  356.                         top = rows.count-rows.first-1;
  357.                 }
  358.                 else
  359.                 {
  360.                         top = rows.visible;
  361.                 }
  362.         }
  363.  
  364.         if (bufpointer)
  365.         {
  366.                 for (i=0; i<top; i++)
  367.                 {
  368.                         DrawBar(0, i*rows.item_h+TOPPANELH, rows.w, rows.item_h, 0xFFFFFF);
  369.                         WriteText(2, i*rows.item_h+TOPPANELH, 0x90, 0x000000, s.get(i+rows.first));
  370.                 }
  371.         }
  372.         DrawBar(0, i*rows.item_h+rows.y, rows.w, -i*rows.item_h + rows.h, 0xFFFfff);
  373.         DrawVerticalScroll();
  374. }
  375.  
  376. void DrawVerticalScroll()
  377. {
  378.         scroll_v.max_area = rows.count;
  379.         scroll_v.cur_area = rows.visible;
  380.         scroll_v.position = rows.first;
  381.         scroll_v.start_y = rows.y;
  382.         scroll_v.size_y = rows.h;
  383.         scroll_v.start_x = rows.w + rows.x -1;
  384.         scroll_v.all_redraw = 0;
  385.         scrollbar_v_draw(#scroll_v);
  386. }
  387.  
  388. //===================================================//
  389. //                                                   //
  390. //                      EVENTS                       //
  391. //                                                   //
  392. //===================================================//
  393. dword menu_id;
  394. void EventMenuClick()
  395. {
  396.         dword click_id = get_menu_click();
  397.         if (click_id) switch(click_id + menu_id - 1)
  398.         {
  399.                 //File
  400.                 case FILE_SUBMENU_ID_OPEN:
  401.                         EventOpenFile();
  402.                         break;
  403.                 case FILE_SUBMENU_ID_CLOSE:
  404.                         EventCloseFile();
  405.                         break;
  406.                 case FILE_SUBMENU_ID_PROPERTIES:
  407.                         EventShowFileProperties();
  408.                         break;
  409.                 case FILE_SUBMENU_ID_EXIT:
  410.                         ExitProcess();
  411.                         break;
  412.                 //Encoding
  413.                 case MENU_ID_ENCODING...MENU_ID_ENCODING+9:
  414.                         EventChangeEncoding(click_id-1);
  415.                         break;
  416.                 //Reopen
  417.                 case FILE_SUBMENU_ID_TINYPAD:
  418.                         EventOpenFileInAnotherProgram("/sys/tinypad");
  419.                         break;
  420.                 case FILE_SUBMENU_ID_TEXTEDIT:
  421.                         EventOpenFileInAnotherProgram("/sys/develop/t_edit");
  422.                         break;
  423.                 case FILE_SUBMENU_ID_TEXTREAD:
  424.                         EventOpenFileInAnotherProgram("/sys/txtread");
  425.                         break;
  426.                 case FILE_SUBMENU_ID_WEBVIEW:
  427.                         EventOpenFileInAnotherProgram("/sys/network/webview");
  428.                         break;
  429.                 case FILE_SUBMENU_ID_FB2READ:
  430.                         EventOpenFileInAnotherProgram("/sys/fb2read");
  431.                         break;
  432.                 case FILE_SUBMENU_ID_HEXVIEW:
  433.                         EventOpenFileInAnotherProgram("/sys/develop/heed");
  434.                         break;
  435.         }
  436. }
  437.  
  438. void EventShowMenu(dword _menu_item_x, _menu_list, _id, _selected)
  439. {
  440.         open_lmenu(Form.left+5 + _menu_item_x, Form.top+skin_height + TOPPANELH,
  441.                 MENU_ALIGN_TOP_LEFT, _selected, _menu_list);
  442.         menu_id = _id;
  443. }
  444.  
  445. void EventOpenFile()
  446. {
  447.         OpenDialog_start stdcall (#o_dialog);
  448.         if (o_dialog.status)
  449.         {
  450.                 OpenFile(#openfile_path);
  451.                 Prepare();
  452.                 draw_window();
  453.         }
  454. }
  455.  
  456. void EventCloseFile()
  457. {
  458.         if (bufpointer)
  459.         {
  460.                 s.drop();
  461.                 bufpointer = mem_Free(bufpointer);
  462.                 strcpy(#win_title, TITLE);
  463.                 draw_window();
  464.         }
  465. }
  466.  
  467. void EventShowFileProperties()
  468. {
  469.         char ss_param[4096];
  470.         if (bufpointer)
  471.         {
  472.                 sprintf(#ss_param, "-p %s", #param);
  473.                 RunProgram("/sys/File managers/Eolite", #ss_param);
  474.         }
  475. }
  476.  
  477. void EventChangeEncoding(dword id)
  478. {
  479.         encoding = id;
  480.         OpenFile(#openfile_path);
  481.         Prepare();
  482.         draw_window();
  483. }
  484.  
  485. void EventOpenFileInAnotherProgram(dword _app)
  486. {
  487.         RunProgram(_app, #param);
  488. }
  489.  
  490.  
  491.  
  492. stop:
  493.