Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
9896 akron1 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 .
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
 
9898 akron1 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;
9896 akron1 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
 
9898 akron1 63
  Window     : W.tWindow;
9896 akron1 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
9898 akron1 93
  SU.GetWindowPos(Window.left, Window.top);
9896 akron1 94
  SU.GetWindowSize(Width, Height);
9898 akron1 95
  IF (Window.width # Width) OR (Window.height # Height) OR (SkinHeight # SU.SkinHeight()) THEN
9896 akron1 96
    SU.MinMax(Width,  640, 65535);
97
    SU.MinMax(Height, 400, 65535);
9898 akron1 98
    Window.dWidth  := Width - Window.width;
99
    Window.dHeight := Height - Window.height;
100
    Window.width   := Width;
101
    Window.height  := Height;
9896 akron1 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
9898 akron1 111
  SU.DrawRect(0, Window.height - SkinHeight - WINDOW_BEVEL - STATUSBAR_HEIGHT + 1, Window.width - 2 * WINDOW_BEVEL - 1, STATUSBAR_HEIGHT, SU.winColor);
9896 akron1 112
  IF DOM.urlstr # "" THEN
9898 akron1 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)
9896 akron1 115
  ELSIF DOM.found() THEN
9898 akron1 116
    SU.OutText(CANVAS_LEFT,  Window.height - SkinHeight - WINDOW_BEVEL - STATUSBAR_HEIGHT + 2,
9896 akron1 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);
9898 akron1 126
  IF Window.created THEN
9896 akron1 127
    Resize
128
  ELSE
9898 akron1 129
    Window.created := TRUE
9896 akron1 130
  END;
9898 akron1 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);
9896 akron1 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
9898 akron1 148
  X := X - Window.left - WINDOW_BEVEL - 1;
149
  Y := Y - Window.top - SkinHeight
9896 akron1 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;
9898 akron1 180
VAR
181
	key: INTEGER;
182
	shift, ctrl: BOOLEAN;
9896 akron1 183
BEGIN
9898 akron1 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
9896 akron1 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
9898 akron1 229
    DOM.Scroll(scroll*2);
9896 akron1 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);
9898 akron1 273
VAR WinW, X1, Y1, X2, Y2, scr_pos: INTEGER; Win2: W.tWindow; resize: BOOLEAN; FilePath: S.STRING; defpath: BOOLEAN;
9896 akron1 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;
9898 akron1 305
  W.init(Window, WinW DIV 2, Y1, WinW, Y2 - Y1, title);
9896 akron1 306
  Settings.Default;
9898 akron1 307
  DOM.GetWinSize(FileName, Window.width, Window.height);
9896 akron1 308
 
309
  Win2 := Window;
310
  resize := FALSE;
9898 akron1 311
  IF Win2.width > X2 - X1 THEN
312
    Win2.width := X2 - X1;
9896 akron1 313
    resize := TRUE
314
  END;
315
 
9898 akron1 316
  IF Win2.height > Y2 - Y1 THEN
317
    Win2.height := Y2 - Y1;
9896 akron1 318
    resize := TRUE
319
  END;
320
 
321
  DOM.Init(CANVAS_LEFT, CANVAS_TOP,
9898 akron1 322
        Window.width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH - 2,
323
        Window.height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL - STATUSBAR_HEIGHT + 1);
9896 akron1 324
  DOM.SetColors;
325
  DOM.Set_b_pict(Ini.b_pict);
326
  Window := Win2;
9898 akron1 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);
9896 akron1 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
9898 akron1 345
    DOM.Resize(Window.width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH, Window.height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL + 1 - STATUSBAR_HEIGHT)
9896 akron1 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
9898 akron1 368
  main("FB2 Reader v0.97a")
9896 akron1 369
END FB2READ.