Subversion Repositories Kolibri OS

Rev

Rev 9898 | 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.                 IF ~SU.RolledUp() THEN
  128.                         Resize;
  129.                         DOM.SetWinSize(Window.width, Window.height)
  130.                 END
  131.         ELSE
  132.                 Window.created := TRUE
  133.         END;
  134.         SU.DefineAndDrawWindow(Window.left, Window.top, Window.width, Window.height,
  135.         SU.winColor, LSL(ORD({0, 1, 2}), 4) + 4 - ORD(DOM.loaded), Window.caption);
  136.         IF ~SU.RolledUp() THEN
  137.                 SU.DrawRect(0, 0, Window.width - 2 * WINDOW_BEVEL - 1, CANVAS_TOP, SU.winColor);
  138.                 SU.DrawRect(0, Window.height - SkinHeight - WINDOW_BEVEL - STATUSBAR_HEIGHT + 1, Window.width - 2 * WINDOW_BEVEL - 1, STATUSBAR_HEIGHT, SU.winColor);
  139.                 SU.DrawRect(0, 0, CANVAS_LEFT, Window.height - SkinHeight - WINDOW_BEVEL, SU.winColor);
  140.                 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);
  141.                 IF DOM.loaded THEN
  142.                         ToolBar;
  143.                         DOM.Draw;
  144.                         DrawStatus
  145.                 END
  146.         END;
  147.         SU.WindowRedrawStatus(2)
  148. END DrawWindow;
  149.  
  150.  
  151. PROCEDURE ConvMousePos(VAR X, Y: INTEGER);
  152. BEGIN
  153.   X := X - Window.left - WINDOW_BEVEL - 1;
  154.   Y := Y - Window.top - SkinHeight
  155. END ConvMousePos;
  156.  
  157.  
  158. PROCEDURE DrawToolbar;
  159. BEGIN
  160.         ToolbarEnable;
  161.         Toolbar.drawIcons(toolbar)
  162. END DrawToolbar;
  163.  
  164.  
  165. PROCEDURE ButtonClick;
  166. BEGIN
  167.   CASE SU.GetButtonCode() OF
  168.   |0        :
  169.   |CLOSE    : SearchForm.close(FALSE);
  170.               Settings.Close;
  171.               DOM.Close
  172.   |BACK     : DOM.Back
  173.   |FORWARD  : DOM.Forward
  174.   |CONTENTS : DOM.Contents
  175.   |DESCR    : DOM.Descr
  176.   |SEARCH   : DOM.OpenSearch
  177.   |SETTINGS : Settings.Open
  178.   END;
  179.   DOM.Draw;
  180.   DrawStatus
  181. END ButtonClick;
  182.  
  183.  
  184. PROCEDURE KeyDown;
  185. VAR
  186.         key: INTEGER;
  187.         shift, ctrl: BOOLEAN;
  188. BEGIN
  189.         SU.getKBState(shift, ctrl);
  190.         key := SU.GetKey() DIV 65536;
  191.         CASE key OF
  192.         |KEY_DOWN    : DOM.Scroll(1)
  193.         |KEY_UP      : DOM.Scroll(-1)
  194.         |KEY_PG_DOWN : DOM.PageDown
  195.         |KEY_PG_UP   : DOM.PageUp
  196.         |KEY_HOME    : DOM.Home
  197.         |KEY_END     : DOM.End
  198.         |KEY_F2      : DOM.Find(0)
  199.         |KEY_F3      : DOM.Find(1)
  200.         |KEY_F4      : DOM.Find(-1)
  201.         |KEY_F10     : DOM.CloseSearch
  202.         |33          : IF ctrl THEN DOM.OpenSearch END (* ctrl-F *)
  203.         ELSE
  204.         END;
  205.         DOM.Draw;
  206.         DrawStatus
  207. END KeyDown;
  208.  
  209.  
  210. PROCEDURE CanvasIsClicked(X, Y: INTEGER): BOOLEAN;
  211.   RETURN
  212.     (CANVAS_LEFT <= X) & (X < CANVAS_LEFT + G.Buffer.Width)  &
  213.     (CANVAS_TOP  <= Y) & (Y < CANVAS_TOP  + G.Buffer.Height)
  214. END CanvasIsClicked;
  215.  
  216.  
  217. PROCEDURE MouseEvent;
  218. VAR
  219.   mouse_status : SET;
  220.   X, Y         : INTEGER;
  221.   scroll       : INTEGER;
  222. BEGIN
  223.   SU.MousePos(X, Y);
  224.   mouse_status := SU.MouseStatus();
  225.   scroll := SU.MouseVScroll();
  226.   IF SU.L_BUTTON IN mouse_status THEN
  227.     ConvMousePos(X, Y);
  228.     IF CanvasIsClicked(X, Y) THEN
  229.       X := X - CANVAS_LEFT;
  230.       Y := Y - CANVAS_TOP;
  231.       DOM.Click(X, Y, TRUE)
  232.     END
  233.   ELSIF scroll # 0 THEN
  234.     DOM.Scroll(scroll*2);
  235.     DOM.Draw
  236.   ELSE
  237.     ConvMousePos(X, Y);
  238.     IF CanvasIsClicked(X, Y) THEN
  239.       X := X - CANVAS_LEFT;
  240.       Y := Y - CANVAS_TOP;
  241.       DOM.Click(X, Y, FALSE)
  242.     END
  243.   END
  244. END MouseEvent;
  245.  
  246.  
  247. PROCEDURE Empty;
  248. END Empty;
  249.  
  250.  
  251. PROCEDURE OpenFile;
  252. BEGIN
  253.   Open := OpenDlg.Create(Empty, 0, Ini.Default, Ini.Files);
  254.   OpenDlg.Show(Open, 500, 400);
  255.   WHILE Open.status = 2 DO
  256.     SU.Pause(30)
  257.   END;
  258.   IF Open.status = 0 THEN
  259.     SU.Halt
  260.   END;
  261.   COPY(Open.FilePath, FileName);
  262.   OpenDlg.Destroy(Open)
  263. END OpenFile;
  264.  
  265.  
  266. PROCEDURE IsFB2(FileName: S.STRING): BOOLEAN;
  267. VAR temp: S.STRING;
  268. BEGIN
  269.   temp := FileName;
  270.   S.Reverse(temp);
  271.   temp[4] := 0X;
  272.   S.UCase(temp)
  273.   RETURN temp = "2BF."
  274. END IsFB2;
  275.  
  276.  
  277. PROCEDURE main(title: ARRAY OF CHAR);
  278. VAR
  279.         WinW, X1, Y1, X2, Y2, scr_pos, ignore: INTEGER;
  280.         Win2: W.tWindow; resize: BOOLEAN;
  281.         FilePath: S.STRING; defpath: BOOLEAN;
  282. BEGIN
  283.   SkinHeight := SU.SkinHeight();
  284.   sb := box_lib.kolibri_new_scrollbar(10 * 65536 + 200, 10 * 65536 + 30, 25, 15, 10, 0, 0, 0, 0, 0);
  285.   DOM.SetScrollBar(sb);
  286.   defpath := TRUE;
  287.   SU.GetParam(FileName);
  288.   IF FileName = "" THEN
  289.     OpenFile
  290.   END;
  291.  
  292.   IF FileName[0] = "!" THEN
  293.     FileName[0] := "/";
  294.     defpath := FALSE
  295.   END;
  296.  
  297.   IF defpath THEN
  298.     FilePath := FileName;
  299.     S.GetPath(FilePath);
  300.     Ini.SetDefaultPath(FilePath);
  301.     DOM.SetColors;
  302.     DOM.Set_b_pict(Ini.b_pict);
  303.     Ini.Save(DOM.Settings.Colors, DOM.Settings.b_pict)
  304.   END;
  305.  
  306.   IF ~IsFB2(FileName) THEN
  307.     SelEnc.Show(FileName)
  308.   END;
  309.  
  310.   SU.SetEventsMask({0, 1, 2, 5, 31});
  311.   SU.GetScreenArea(X1, Y1, X2, Y2);
  312.   WinW := (X2 - X1) DIV 2;
  313.   SU.MinMax(WinW, 640, 65535);
  314.   W.init(Window, (X2 - X1 - WinW) DIV 2, Y1, WinW, Y2 - Y1, title);
  315.   Settings.Default;
  316.   DOM.GetWinSize(FileName, Window.width, Window.height);
  317.  
  318.   Win2 := Window;
  319.   resize := FALSE;
  320.   IF Win2.width > X2 - X1 THEN
  321.     Win2.width := X2 - X1;
  322.     resize := TRUE
  323.   END;
  324.  
  325.   IF Win2.height > Y2 - Y1 THEN
  326.     Win2.height := Y2 - Y1;
  327.     resize := TRUE
  328.   END;
  329.  
  330.   DOM.Init(CANVAS_LEFT, CANVAS_TOP,
  331.         Window.width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH - 2,
  332.         Window.height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL - STATUSBAR_HEIGHT + 1);
  333.   DOM.SetColors;
  334.   DOM.Set_b_pict(Ini.b_pict);
  335.   Window := Win2;
  336.   G.InitSize(Window.width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH, Window.height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL + 1 - STATUSBAR_HEIGHT);
  337.   S.Append(Window.caption, " - ");
  338.   S.Append(Window.caption, FileName);
  339.  
  340.         Toolbar.create(toolbar, TOOLBAR_LEFT, TOOLBAR_TOP);
  341.         Toolbar.add(toolbar, BACK,      30, "");
  342.         Toolbar.add(toolbar, FORWARD,   31, "");
  343.         Toolbar.delimiter(toolbar);
  344.         Toolbar.add(toolbar, CONTENTS,   3, "");
  345.         Toolbar.delimiter(toolbar);
  346.         Toolbar.add(toolbar, SEARCH,    49, "");
  347.         Toolbar.delimiter(toolbar);
  348.         Toolbar.add(toolbar, DESCR,     66, "");
  349.         Toolbar.delimiter(toolbar);
  350.         Toolbar.add(toolbar, SETTINGS,  60, "");
  351.  
  352.         DOM.Open(FileName, DrawWindow, DrawStatus, DrawToolbar);
  353.         IF resize THEN
  354.                 DOM.Resize(Window.width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH,
  355.                         Window.height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL + 1 - STATUSBAR_HEIGHT)
  356.         END;
  357.  
  358.         DrawWindow;
  359.         scr_pos := sb.position;
  360.         WHILE TRUE DO
  361.                 CASE SU.WaitForEvent() OF
  362.                 |1 : DrawWindow
  363.                 |2 :
  364.                         IF ~SU.RolledUp() THEN
  365.                                 KeyDown
  366.                         ELSE
  367.                                 ignore := SU.GetKey()
  368.                         END
  369.                 |3 : ButtonClick
  370.                 |6 :
  371.                         IF ~SU.RolledUp() THEN
  372.                                 box_lib.scrollbar_v_mouse(sb);
  373.                                 IF sb.position # scr_pos THEN
  374.                                         DOM.ScrollBar;
  375.                                         DOM.Draw;
  376.                                         scr_pos := sb.position;
  377.                                 END;
  378.                                 MouseEvent
  379.                         ELSE
  380.                                 ignore := SU.MouseVScroll()
  381.                         END
  382.                 END
  383.         END
  384. END main;
  385.  
  386.  
  387. BEGIN
  388.         main("FB2 Reader v0.97c")
  389. END FB2READ.
  390.