Subversion Repositories Kolibri OS

Rev

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

  1. (*
  2.     Copyright 2016-2023 Anton Krotov
  3.  
  4.     This file is part of fb2read.
  5.  
  6.     fb2read is free software: you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation, either version 3 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     fb2read is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with fb2read. If not, see <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE FB2READ;
  21.  
  22. IMPORT
  23.  
  24.     DOM, SU := SysUtils, S := Strings, W := Window, Settings, OpenDlg,
  25.     G := Graph, SelEnc, Ini, File, box_lib, Font, SearchForm, Toolbar;
  26.  
  27.  
  28. CONST
  29.  
  30.   CLOSE            =  1;
  31.   BACK             = 16;
  32.   FORWARD          = 17;
  33.   CONTENTS         = 18;
  34.   DESCR            = 19;
  35.   SETTINGS         = 20;
  36.   SEARCH           = 21;
  37.  
  38.   KEY_DOWN         = 80;
  39.   KEY_UP           = 72;
  40.   KEY_PG_DOWN      = 81;
  41.   KEY_PG_UP        = 73;
  42.   KEY_HOME         = 71;
  43.   KEY_END          = 79;
  44.   KEY_F2           = 60;
  45.   KEY_F3           = 61;
  46.   KEY_F4           = 62;
  47.   KEY_F10          = 68;
  48.  
  49.   TOOLBAR_LEFT     = 5;
  50.   TOOLBAR_TOP      = 6;
  51.   BUTTON_HEIGHT    = 24;
  52.  
  53.   CANVAS_LEFT      = 1;
  54.   CANVAS_TOP       = 2 * TOOLBAR_TOP + Toolbar.BtnSize;
  55.  
  56.   WINDOW_BEVEL     = 4;
  57.  
  58.   SCROLLBAR_WIDTH  = 20;
  59.   STATUSBAR_HEIGHT = 18;
  60.  
  61. VAR
  62.  
  63.   Window     : W.tWindow;
  64.   toolbar    : Toolbar.tToolbar;
  65.   SkinHeight : INTEGER;
  66.   Open       : OpenDlg.Dialog;
  67.   FileName   : S.STRING;
  68.   sb         : box_lib.scrollbar;
  69.  
  70.  
  71. PROCEDURE ToolbarEnable;
  72. BEGIN
  73.         Toolbar.enable(toolbar, BACK,     DOM.BackEnabled());
  74.         Toolbar.enable(toolbar, FORWARD,  DOM.FrwEnabled());
  75.         Toolbar.enable(toolbar, CONTENTS, DOM.ContentsEnabled());
  76.         Toolbar.enable(toolbar, DESCR,    DOM.DescrEnabled());
  77. END ToolbarEnable;
  78.  
  79.  
  80. PROCEDURE ToolBar;
  81. BEGIN
  82.         sb := box_lib.kolibri_scrollbar(sb, (G.Buffer.Width + CANVAS_LEFT) * 65536 + SCROLLBAR_WIDTH + 1,
  83.                 CANVAS_TOP * 65536 + G.Buffer.Height, SCROLLBAR_WIDTH, sb.max_area, sb.cur_area, sb.position, SU.lightColor, SU.btnColor, 0, 0);
  84.         box_lib.scrollbar_v_draw(sb);
  85.         ToolbarEnable;
  86.         Toolbar.draw(toolbar);
  87. END ToolBar;
  88.  
  89.  
  90. PROCEDURE Resize;
  91. VAR Width, Height: INTEGER;
  92. BEGIN
  93.   SU.GetWindowPos(Window.left, Window.top);
  94.   SU.GetWindowSize(Width, Height);
  95.   IF (Window.width # Width) OR (Window.height # Height) OR (SkinHeight # SU.SkinHeight()) THEN
  96.     SU.MinMax(Width,  640, 65535);
  97.     SU.MinMax(Height, 400, 65535);
  98.     Window.dWidth  := Width - Window.width;
  99.     Window.dHeight := Height - Window.height;
  100.     Window.width   := Width;
  101.     Window.height  := Height;
  102.     SU.SetWindowSize(Width, Height);
  103.     DOM.Resize(G.Buffer.Width + Window.dWidth, G.Buffer.Height + Window.dHeight + (SkinHeight - SU.SkinHeight()));
  104.     SkinHeight := SU.SkinHeight()
  105.   END
  106. END Resize;
  107.  
  108.  
  109. PROCEDURE DrawStatus;
  110. BEGIN
  111.   SU.DrawRect(0, Window.height - SkinHeight - WINDOW_BEVEL - STATUSBAR_HEIGHT + 1, Window.width - 2 * WINDOW_BEVEL - 1, STATUSBAR_HEIGHT, SU.winColor);
  112.   IF DOM.urlstr # "" THEN
  113.     SU.OutText(CANVAS_LEFT, Window.height - SkinHeight - WINDOW_BEVEL - STATUSBAR_HEIGHT + 2, DOM.urlstr,
  114.       MIN(LENGTH(DOM.urlstr), (Window.width - 2 * WINDOW_BEVEL - 1 - CANVAS_LEFT * 2) DIV 8), SU.textColor)
  115.   ELSIF DOM.found() THEN
  116.     SU.OutText(CANVAS_LEFT,  Window.height - SkinHeight - WINDOW_BEVEL - STATUSBAR_HEIGHT + 2,
  117.                 "F2 - first | F3 - next | F4 - prev. | F10 - exit", 48, SU.textColor)
  118.   END
  119. END DrawStatus;
  120.  
  121.  
  122. PROCEDURE DrawWindow;
  123. BEGIN
  124.   SU.GetSystemColors;
  125.   SU.WindowRedrawStatus(1);
  126.   IF Window.created THEN
  127.     Resize
  128.   ELSE
  129.     Window.created := TRUE
  130.   END;
  131.   SU.DefineAndDrawWindow(Window.left, Window.top, Window.width, Window.height,
  132.         SU.winColor, LSL(ORD({0, 1, 2}), 4) + 4 - ORD(DOM.loaded), Window.caption);
  133.   SU.DrawRect(0, 0, Window.width - 2 * WINDOW_BEVEL - 1, CANVAS_TOP, SU.winColor);
  134.   SU.DrawRect(0, Window.height - SkinHeight - WINDOW_BEVEL - STATUSBAR_HEIGHT + 1, Window.width - 2 * WINDOW_BEVEL - 1, STATUSBAR_HEIGHT, SU.winColor);
  135.   SU.DrawRect(0, 0, CANVAS_LEFT, Window.height - SkinHeight - WINDOW_BEVEL, SU.winColor);
  136.   SU.DrawRect(Window.width - 2 * WINDOW_BEVEL - CANVAS_LEFT - 1 - SCROLLBAR_WIDTH - 2, 0, CANVAS_LEFT + SCROLLBAR_WIDTH + 2, Window.height - SkinHeight - WINDOW_BEVEL, SU.winColor);
  137.   IF DOM.loaded THEN
  138.     ToolBar;
  139.     DOM.Draw;
  140.     DrawStatus
  141.   END;
  142.   SU.WindowRedrawStatus(2)
  143. END DrawWindow;
  144.  
  145.  
  146. PROCEDURE ConvMousePos(VAR X, Y: INTEGER);
  147. BEGIN
  148.   X := X - Window.left - WINDOW_BEVEL - 1;
  149.   Y := Y - Window.top - SkinHeight
  150. END ConvMousePos;
  151.  
  152.  
  153. PROCEDURE DrawToolbar;
  154. BEGIN
  155.         ToolbarEnable;
  156.         Toolbar.drawIcons(toolbar)
  157. END DrawToolbar;
  158.  
  159.  
  160. PROCEDURE ButtonClick;
  161. BEGIN
  162.   CASE SU.GetButtonCode() OF
  163.   |0        :
  164.   |CLOSE    : SearchForm.close(FALSE);
  165.               Settings.Close;
  166.               DOM.Close
  167.   |BACK     : DOM.Back
  168.   |FORWARD  : DOM.Forward
  169.   |CONTENTS : DOM.Contents
  170.   |DESCR    : DOM.Descr
  171.   |SEARCH   : DOM.OpenSearch
  172.   |SETTINGS : Settings.Open
  173.   END;
  174.   DOM.Draw;
  175.   DrawStatus
  176. END ButtonClick;
  177.  
  178.  
  179. PROCEDURE KeyDown;
  180. VAR
  181.         key: INTEGER;
  182.         shift, ctrl: BOOLEAN;
  183. BEGIN
  184.         SU.getKBState(shift, ctrl);
  185.         key := SU.GetKey() DIV 65536;
  186.         CASE key OF
  187.         |KEY_DOWN    : DOM.Scroll(1)
  188.         |KEY_UP      : DOM.Scroll(-1)
  189.         |KEY_PG_DOWN : DOM.PageDown
  190.         |KEY_PG_UP   : DOM.PageUp
  191.         |KEY_HOME    : DOM.Home
  192.         |KEY_END     : DOM.End
  193.         |KEY_F2      : DOM.Find(0)
  194.         |KEY_F3      : DOM.Find(1)
  195.         |KEY_F4      : DOM.Find(-1)
  196.         |KEY_F10     : DOM.CloseSearch
  197.         |33          : IF ctrl THEN DOM.OpenSearch END (* ctrl-F *)
  198.         ELSE
  199.         END;
  200.         DOM.Draw;
  201.         DrawStatus
  202. END KeyDown;
  203.  
  204.  
  205. PROCEDURE CanvasIsClicked(X, Y: INTEGER): BOOLEAN;
  206.   RETURN
  207.     (CANVAS_LEFT <= X) & (X < CANVAS_LEFT + G.Buffer.Width)  &
  208.     (CANVAS_TOP  <= Y) & (Y < CANVAS_TOP  + G.Buffer.Height)
  209. END CanvasIsClicked;
  210.  
  211.  
  212. PROCEDURE MouseEvent;
  213. VAR
  214.   mouse_status : SET;
  215.   X, Y         : INTEGER;
  216.   scroll       : INTEGER;
  217. BEGIN
  218.   SU.MousePos(X, Y);
  219.   mouse_status := SU.MouseStatus();
  220.   scroll := SU.MouseVScroll();
  221.   IF SU.L_BUTTON IN mouse_status THEN
  222.     ConvMousePos(X, Y);
  223.     IF CanvasIsClicked(X, Y) THEN
  224.       X := X - CANVAS_LEFT;
  225.       Y := Y - CANVAS_TOP;
  226.       DOM.Click(X, Y, TRUE)
  227.     END
  228.   ELSIF scroll # 0 THEN
  229.     DOM.Scroll(scroll*2);
  230.     DOM.Draw
  231.   ELSE
  232.     ConvMousePos(X, Y);
  233.     IF CanvasIsClicked(X, Y) THEN
  234.       X := X - CANVAS_LEFT;
  235.       Y := Y - CANVAS_TOP;
  236.       DOM.Click(X, Y, FALSE)
  237.     END
  238.   END
  239. END MouseEvent;
  240.  
  241.  
  242. PROCEDURE Empty;
  243. END Empty;
  244.  
  245.  
  246. PROCEDURE OpenFile;
  247. BEGIN
  248.   Open := OpenDlg.Create(Empty, 0, Ini.Default, Ini.Files);
  249.   OpenDlg.Show(Open, 500, 400);
  250.   WHILE Open.status = 2 DO
  251.     SU.Pause(30)
  252.   END;
  253.   IF Open.status = 0 THEN
  254.     SU.Halt
  255.   END;
  256.   COPY(Open.FilePath, FileName);
  257.   OpenDlg.Destroy(Open)
  258. END OpenFile;
  259.  
  260.  
  261. PROCEDURE IsFB2(FileName: S.STRING): BOOLEAN;
  262. VAR temp: S.STRING;
  263. BEGIN
  264.   temp := FileName;
  265.   S.Reverse(temp);
  266.   temp[4] := 0X;
  267.   S.UCase(temp)
  268.   RETURN temp = "2BF."
  269. END IsFB2;
  270.  
  271.  
  272. PROCEDURE main(title: ARRAY OF CHAR);
  273. VAR WinW, X1, Y1, X2, Y2, scr_pos: INTEGER; Win2: W.tWindow; resize: BOOLEAN; FilePath: S.STRING; defpath: BOOLEAN;
  274. BEGIN
  275.   SkinHeight := SU.SkinHeight();
  276.   sb := box_lib.kolibri_new_scrollbar(10 * 65536 + 200, 10 * 65536 + 30, 25, 15, 10, 0, 0, 0, 0, 0);
  277.   DOM.SetScrollBar(sb);
  278.   defpath := TRUE;
  279.   SU.GetParam(FileName);
  280.   IF FileName = "" THEN
  281.     OpenFile
  282.   END;
  283.  
  284.   IF FileName[0] = "!" THEN
  285.     FileName[0] := "/";
  286.     defpath := FALSE
  287.   END;
  288.  
  289.   IF defpath THEN
  290.     FilePath := FileName;
  291.     S.GetPath(FilePath);
  292.     Ini.SetDefaultPath(FilePath);
  293.     DOM.SetColors;
  294.     DOM.Set_b_pict(Ini.b_pict);
  295.     Ini.Save(DOM.Settings.Colors, DOM.Settings.b_pict)
  296.   END;
  297.  
  298.   IF ~IsFB2(FileName) THEN
  299.     SelEnc.Show(FileName)
  300.   END;
  301.  
  302.   SU.SetEventsMask({0, 1, 2, 5, 31});
  303.   SU.GetScreenArea(X1, Y1, X2, Y2);
  304.   WinW := (X2 - X1) DIV 2;
  305.   W.init(Window, WinW DIV 2, Y1, WinW, Y2 - Y1, title);
  306.   Settings.Default;
  307.   DOM.GetWinSize(FileName, Window.width, Window.height);
  308.  
  309.   Win2 := Window;
  310.   resize := FALSE;
  311.   IF Win2.width > X2 - X1 THEN
  312.     Win2.width := X2 - X1;
  313.     resize := TRUE
  314.   END;
  315.  
  316.   IF Win2.height > Y2 - Y1 THEN
  317.     Win2.height := Y2 - Y1;
  318.     resize := TRUE
  319.   END;
  320.  
  321.   DOM.Init(CANVAS_LEFT, CANVAS_TOP,
  322.         Window.width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH - 2,
  323.         Window.height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL - STATUSBAR_HEIGHT + 1);
  324.   DOM.SetColors;
  325.   DOM.Set_b_pict(Ini.b_pict);
  326.   Window := Win2;
  327.   G.InitSize(Window.width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH, Window.height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL + 1 - STATUSBAR_HEIGHT);
  328.   S.Append(Window.caption, " - ");
  329.   S.Append(Window.caption, FileName);
  330.  
  331.         Toolbar.create(toolbar, TOOLBAR_LEFT, TOOLBAR_TOP);
  332.     Toolbar.add(toolbar, BACK,      30, "");
  333.     Toolbar.add(toolbar, FORWARD,   31, "");
  334.     Toolbar.delimiter(toolbar);
  335.     Toolbar.add(toolbar, CONTENTS,   3, "");
  336.     Toolbar.delimiter(toolbar);
  337.     Toolbar.add(toolbar, SEARCH,    49, "");
  338.     Toolbar.delimiter(toolbar);
  339.     Toolbar.add(toolbar, DESCR,     66, "");
  340.     Toolbar.delimiter(toolbar);
  341.     Toolbar.add(toolbar, SETTINGS,  60, "");
  342.  
  343.   DOM.Open(FileName, DrawWindow, DrawStatus, DrawToolbar);
  344.   IF resize THEN
  345.     DOM.Resize(Window.width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH, Window.height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL + 1 - STATUSBAR_HEIGHT)
  346.   END;
  347.  
  348.   DrawWindow;
  349.   scr_pos := sb.position;
  350.   WHILE TRUE DO
  351.     CASE SU.WaitForEvent() OF
  352.     |1 : DrawWindow
  353.     |2 : KeyDown
  354.     |3 : ButtonClick
  355.     |6 : box_lib.scrollbar_v_mouse(sb);
  356.          IF sb.position # scr_pos THEN
  357.            DOM.ScrollBar;
  358.            DOM.Draw;
  359.            scr_pos := sb.position;
  360.          END;
  361.          MouseEvent
  362.     END
  363.   END
  364. END main;
  365.  
  366.  
  367. BEGIN
  368.   main("FB2 Reader v0.97a")
  369. END FB2READ.
  370.