Subversion Repositories Kolibri OS

Rev

Rev 9898 | 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_CODE    = 177;
  39.   KEY_UP_CODE      = 178;
  40.   KEY_PG_DOWN_CODE = 183;
  41.   KEY_PG_UP_CODE   = 184;
  42.   KEY_HOME_CODE    = 180;
  43.   KEY_END_CODE     = 181;
  44.   KEY_F2_CODE      =  51;
  45.   KEY_F3_CODE      =  52;
  46.   KEY_F4_CODE      =  53;
  47.   KEY_F10_CODE     =  49;
  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. BEGIN
  181.   CASE SU.GetKeyCode() OF
  182.   |KEY_DOWN_CODE    : DOM.Down
  183.   |KEY_UP_CODE      : DOM.Up
  184.   |KEY_PG_DOWN_CODE : DOM.PageDown
  185.   |KEY_PG_UP_CODE   : DOM.PageUp
  186.   |KEY_HOME_CODE    : DOM.Home
  187.   |KEY_END_CODE     : DOM.End
  188.   |KEY_F2_CODE      : DOM.Find(0)
  189.   |KEY_F3_CODE      : DOM.Find(1)
  190.   |KEY_F4_CODE      : DOM.Find(-1)
  191.   |KEY_F10_CODE     : DOM.CloseSearch
  192.   ELSE
  193.   END;
  194.   DOM.Draw;
  195.   DrawStatus
  196. END KeyDown;
  197.  
  198.  
  199. PROCEDURE CanvasIsClicked(X, Y: INTEGER): BOOLEAN;
  200.   RETURN
  201.     (CANVAS_LEFT <= X) & (X < CANVAS_LEFT + G.Buffer.Width)  &
  202.     (CANVAS_TOP  <= Y) & (Y < CANVAS_TOP  + G.Buffer.Height)
  203. END CanvasIsClicked;
  204.  
  205.  
  206. PROCEDURE MouseEvent;
  207.  
  208. VAR
  209.  
  210.   mouse_status : SET;
  211.   X, Y         : INTEGER;
  212.   scroll       : INTEGER;
  213.  
  214. BEGIN
  215.   SU.MousePos(X, Y);
  216.   mouse_status := SU.MouseStatus();
  217.   scroll := SU.MouseVScroll();
  218.   IF SU.L_BUTTON IN mouse_status THEN
  219.     ConvMousePos(X, Y);
  220.     IF CanvasIsClicked(X, Y) THEN
  221.       X := X - CANVAS_LEFT;
  222.       Y := Y - CANVAS_TOP;
  223.       DOM.Click(X, Y, TRUE)
  224.     END
  225.   ELSIF scroll # 0 THEN
  226.     DOM.Scroll(scroll);
  227.     DOM.Draw
  228.   ELSE
  229.     ConvMousePos(X, Y);
  230.     IF CanvasIsClicked(X, Y) THEN
  231.       X := X - CANVAS_LEFT;
  232.       Y := Y - CANVAS_TOP;
  233.       DOM.Click(X, Y, FALSE)
  234.     END
  235.   END
  236. END MouseEvent;
  237.  
  238.  
  239. PROCEDURE Empty;
  240. END Empty;
  241.  
  242.  
  243. PROCEDURE OpenFile;
  244. BEGIN
  245.   Open := OpenDlg.Create(Empty, 0, Ini.Default, Ini.Files);
  246.   OpenDlg.Show(Open, 500, 400);
  247.   WHILE Open.status = 2 DO
  248.     SU.Pause(30)
  249.   END;
  250.   IF Open.status = 0 THEN
  251.     SU.Halt
  252.   END;
  253.   COPY(Open.FilePath, FileName);
  254.   OpenDlg.Destroy(Open)
  255. END OpenFile;
  256.  
  257.  
  258. PROCEDURE IsFB2(FileName: S.STRING): BOOLEAN;
  259. VAR temp: S.STRING;
  260. BEGIN
  261.   temp := FileName;
  262.   S.Reverse(temp);
  263.   temp[4] := 0X;
  264.   S.UCase(temp)
  265.   RETURN temp = "2BF."
  266. END IsFB2;
  267.  
  268.  
  269. PROCEDURE main(title: ARRAY OF CHAR);
  270. VAR WinW, X1, Y1, X2, Y2, scr_pos: INTEGER; Win2: W.TWindow; resize: BOOLEAN; FilePath: S.STRING; defpath: BOOLEAN;
  271. BEGIN
  272.   SkinHeight := SU.SkinHeight();
  273.   sb := box_lib.kolibri_new_scrollbar(10 * 65536 + 200, 10 * 65536 + 30, 25, 15, 10, 0, 0, 0, 0, 0);
  274.   DOM.SetScrollBar(sb);
  275.   defpath := TRUE;
  276.   SU.GetParam(FileName);
  277.   IF FileName = "" THEN
  278.     OpenFile
  279.   END;
  280.  
  281.   IF FileName[0] = "!" THEN
  282.     FileName[0] := "/";
  283.     defpath := FALSE
  284.   END;
  285.  
  286.   IF defpath THEN
  287.     FilePath := FileName;
  288.     S.GetPath(FilePath);
  289.     Ini.SetDefaultPath(FilePath);
  290.     DOM.SetColors;
  291.     DOM.Set_b_pict(Ini.b_pict);
  292.     Ini.Save(DOM.Settings.Colors, DOM.Settings.b_pict)
  293.   END;
  294.  
  295.   IF ~IsFB2(FileName) THEN
  296.     SelEnc.Show(FileName)
  297.   END;
  298.  
  299.   SU.SetEventsMask({0, 1, 2, 5, 31});
  300.   SU.GetScreenArea(X1, Y1, X2, Y2);
  301.   WinW := (X2 - X1) DIV 2;
  302.   W.InitWindow(Window, WinW DIV 2, Y1, WinW, Y2 - Y1, title);
  303.   Settings.Default;
  304.   DOM.GetWinSize(FileName, Window.Width, Window.Height);
  305.  
  306.   Win2 := Window;
  307.   resize := FALSE;
  308.   IF Win2.Width > X2 - X1 THEN
  309.     Win2.Width := X2 - X1;
  310.     resize := TRUE
  311.   END;
  312.  
  313.   IF Win2.Height > Y2 - Y1 THEN
  314.     Win2.Height := Y2 - Y1;
  315.     resize := TRUE
  316.   END;
  317.  
  318.   DOM.Init(CANVAS_LEFT, CANVAS_TOP,
  319.         Window.Width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH - 2,
  320.         Window.Height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL - STATUSBAR_HEIGHT + 1);
  321.   DOM.SetColors;
  322.   DOM.Set_b_pict(Ini.b_pict);
  323.   Window := Win2;
  324.   G.Resize2(Window.Width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH, Window.Height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL + 1 - STATUSBAR_HEIGHT);
  325.   S.Append(Window.Caption, " - ");
  326.   S.Append(Window.Caption, FileName);
  327.  
  328.         Toolbar.create(toolbar, TOOLBAR_LEFT, TOOLBAR_TOP);
  329.     Toolbar.add(toolbar, BACK,      30, "");
  330.     Toolbar.add(toolbar, FORWARD,   31, "");
  331.     Toolbar.delimiter(toolbar);
  332.     Toolbar.add(toolbar, CONTENTS,   3, "");
  333.     Toolbar.delimiter(toolbar);
  334.     Toolbar.add(toolbar, SEARCH,    49, "");
  335.     Toolbar.delimiter(toolbar);
  336.     Toolbar.add(toolbar, DESCR,     66, "");
  337.     Toolbar.delimiter(toolbar);
  338.     Toolbar.add(toolbar, SETTINGS,  60, "");
  339.  
  340.   DOM.Open(FileName, DrawWindow, DrawStatus, DrawToolbar);
  341.   IF resize THEN
  342.     DOM.Resize(Window.Width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH, Window.Height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL + 1 - STATUSBAR_HEIGHT)
  343.   END;
  344.  
  345.   DrawWindow;
  346.   scr_pos := sb.position;
  347.   WHILE TRUE DO
  348.     CASE SU.WaitForEvent() OF
  349.     |1 : DrawWindow
  350.     |2 : KeyDown
  351.     |3 : ButtonClick
  352.     |6 : box_lib.scrollbar_v_mouse(sb);
  353.          IF sb.position # scr_pos THEN
  354.            DOM.ScrollBar;
  355.            DOM.Draw;
  356.            scr_pos := sb.position;
  357.          END;
  358.          MouseEvent
  359.     END
  360.   END
  361. END main;
  362.  
  363.  
  364. BEGIN
  365.   main("FB2 Reader v0.97")
  366. END FB2READ.
  367.