Subversion Repositories Kolibri OS

Rev

Rev 9898 | 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
9912 akron1 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)
9896 akron1 148
END DrawWindow;
149
 
150
 
151
PROCEDURE ConvMousePos(VAR X, Y: INTEGER);
152
BEGIN
9898 akron1 153
  X := X - Window.left - WINDOW_BEVEL - 1;
154
  Y := Y - Window.top - SkinHeight
9896 akron1 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;
9898 akron1 185
VAR
186
	key: INTEGER;
187
	shift, ctrl: BOOLEAN;
9896 akron1 188
BEGIN
9898 akron1 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
9896 akron1 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
9898 akron1 234
    DOM.Scroll(scroll*2);
9896 akron1 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);
9912 akron1 278
VAR
279
	WinW, X1, Y1, X2, Y2, scr_pos, ignore: INTEGER;
280
	Win2: W.tWindow; resize: BOOLEAN;
281
	FilePath: S.STRING; defpath: BOOLEAN;
9896 akron1 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;
9912 akron1 313
  SU.MinMax(WinW, 640, 65535);
314
  W.init(Window, (X2 - X1 - WinW) DIV 2, Y1, WinW, Y2 - Y1, title);
9896 akron1 315
  Settings.Default;
9898 akron1 316
  DOM.GetWinSize(FileName, Window.width, Window.height);
9896 akron1 317
 
318
  Win2 := Window;
319
  resize := FALSE;
9898 akron1 320
  IF Win2.width > X2 - X1 THEN
321
    Win2.width := X2 - X1;
9896 akron1 322
    resize := TRUE
323
  END;
324
 
9898 akron1 325
  IF Win2.height > Y2 - Y1 THEN
326
    Win2.height := Y2 - Y1;
9896 akron1 327
    resize := TRUE
328
  END;
329
 
330
  DOM.Init(CANVAS_LEFT, CANVAS_TOP,
9898 akron1 331
        Window.width - 2 * CANVAS_LEFT - 2 * WINDOW_BEVEL - 1 - SCROLLBAR_WIDTH - 2,
332
        Window.height - SkinHeight - CANVAS_TOP - WINDOW_BEVEL - STATUSBAR_HEIGHT + 1);
9896 akron1 333
  DOM.SetColors;
334
  DOM.Set_b_pict(Ini.b_pict);
335
  Window := Win2;
9898 akron1 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);
9896 akron1 339
 
340
	Toolbar.create(toolbar, TOOLBAR_LEFT, TOOLBAR_TOP);
9912 akron1 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, "");
9896 akron1 351
 
9912 akron1 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;
9896 akron1 357
 
9912 akron1 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
9896 akron1 384
END main;
385
 
386
 
387
BEGIN
9912 akron1 388
	main("FB2 Reader v0.97c")
9896 akron1 389
END FB2READ.