Subversion Repositories Kolibri OS

Rev

Rev 9896 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 9896 Rev 9898
Line 1... Line 1...
1
(*
1
(*
2
    Copyright 2016-2022 Anton Krotov
2
    Copyright 2016-2023 Anton Krotov
Line 3... Line 3...
3
 
3
 
Line 4... Line 4...
4
    This file is part of fb2read.
4
    This file is part of fb2read.
5
 
5
 
Line 18... Line 18...
18
*)
18
*)
Line 19... Line 19...
19
 
19
 
Line 20... Line 20...
20
MODULE DOM;
20
MODULE DOM;
21
 
21
 
22
IMPORT XML, SU := SysUtils, S := Strings, Font, Window, G := Graph, LibImg,
22
IMPORT XML, SU := SysUtils, S := Strings, Font, Window, G := Graph, LibImg,
Line 23... Line 23...
23
       RF := ReadFile, File, Write, Read, Ini, K := KOSAPI, sys := SYSTEM,
23
       RF := ReadFile, File, Ini, K := KOSAPI, sys := SYSTEM,
Line 52... Line 52...
52
    LEVEL,
52
    LEVEL,
53
    SUB,
53
    SUB,
54
    SUP,
54
    SUP,
55
    InterLin*,
55
    InterLin*,
56
    Picture*,
56
    Picture*,
-
 
57
    picture_fsize*,
57
    SpaceW: INTEGER
58
    SpaceW: INTEGER
Line 58... Line 59...
58
 
59
 
Line 59... Line 60...
59
  END;
60
  END;
Line 71... Line 72...
71
 
72
 
Line 72... Line 73...
72
VAR
73
VAR
73
 
74
 
74
  Settings* : TSettings;
75
  Settings* : TSettings;
75
  Canvas_X, Canvas_Y: INTEGER;
-
 
Line 76... Line 76...
76
  ColLeft   : Window.TRect;
76
  Canvas_X, Canvas_Y: INTEGER;
Line 77... Line 77...
77
  ColRight  : Window.TRect;
77
  ColLeft, ColRight: Window.tRect;
Line 426... Line 426...
426
    tables.table(t, W, FALSE)
426
    tables.table(t, W, FALSE)
427
  END
427
  END
428
END table;
428
END table;
Line 429... Line -...
429
 
-
 
430
 
-
 
431
PROCEDURE layout(body: XML.ELEMENT);
-
 
432
VAR
-
 
433
  cur       : XML.ELEMENT;
-
 
434
  tag       : XML.TAG;
-
 
435
  word      : XML.WORD;
-
 
436
  text      : XML.TEXT;
-
 
437
  tag_value : INTEGER;
-
 
438
  _align    : INTEGER;
-
 
439
  title     : XML.ELEMENT;
-
 
440
  width     : INTEGER;
-
 
441
  height1   : INTEGER;
-
 
442
  height2   : INTEGER;
-
 
443
 
429
 
444
 
430
 
445
  PROCEDURE Image (VAR tag: XML.TAG);
431
PROCEDURE Image (VAR tag: XML.TAG; destroy: BOOLEAN);
446
  VAR
432
VAR
447
    note  : BOOLEAN;
433
	note  : BOOLEAN;
448
    img   : XML.TAG;
434
	img   : XML.TAG;
449
    URL   : INTEGER;
435
	URL   : INTEGER;
450
    chars : S.CHARS;
436
	chars : S.CHARS;
451
    sizeY : INTEGER;
437
	sizeY : INTEGER;
452
    FName : S.STRING;
438
	FName : S.STRING;
453
    path  : S.STRING;
-
 
454
  BEGIN
439
	path  : S.STRING;
455
    IF tag.img # 0 THEN
-
 
456
      LibImg.img_destroy(tag.img)
440
BEGIN
457
    END;
441
	LibImg.Destroy(tag.img);
458
    img := XML.GetRef(tag, note, URL);
442
	img := XML.GetRef(tag, note, URL);
459
    IF img # NIL THEN
443
	IF img # NIL THEN
460
      IF img.child.first IS XML.WORD THEN
444
		IF img.child.first IS XML.WORD THEN
461
        chars := img.child.first(XML.WORD).value;
-
 
462
        tag.img := LibImg.GetImg(chars.first, chars.last - chars.first + 1, W, sizeY);
-
 
463
        IF tag.img # 0 THEN
-
 
464
          INC(Y, (sizeY DIV LineH) * LineH);
-
 
465
          NewLine;
-
 
466
          tag.Ymax := Y - Y MOD LineH
445
			chars := img.child.first(XML.WORD).value;
467
        END
446
			tag.img := LibImg.GetImg(chars.first, chars.last - chars.first + 1, W, sizeY)
468
      END
447
		END
469
    ELSIF URL # 0 THEN
448
	ELSIF URL # 0 THEN
470
      S.PtrToString(URL, FName);
449
		S.PtrToString(URL, FName);
471
      tag.img := LibImg.LoadFromFile(FName, W, sizeY);
450
		tag.img := LibImg.LoadFromFile(FName, W, sizeY);
472
      IF tag.img = 0 THEN
451
		IF tag.img = 0 THEN
473
        path := FilePath;
452
			path := FilePath;
474
        IF FName[0] # "/" THEN
453
			IF FName[0] # "/" THEN
475
          S.Append(path, "/")
454
				S.Append(path, "/")
476
        END;
455
			END;
-
 
456
			S.Append(path, FName);
477
        S.Append(path, FName);
457
			tag.img := LibImg.LoadFromFile(path, W, sizeY)
478
        tag.img := LibImg.LoadFromFile(path, W, sizeY);
458
		END
479
      END;
459
	END;
480
      IF tag.img # 0 THEN
460
	IF (tag.img # 0) & destroy THEN
481
        INC(Y, (sizeY DIV LineH) * LineH);
461
		INC(Y, (sizeY DIV LineH) * LineH);
482
        NewLine;
462
		NewLine;
483
        tag.Ymax := Y - Y MOD LineH
463
		tag.Ymax := Y - Y MOD LineH;
484
      END
464
		LibImg.Destroy(tag.img)
Line -... Line 465...
-
 
465
	END
-
 
466
END Image;
-
 
467
 
-
 
468
 
-
 
469
PROCEDURE layout(body: XML.ELEMENT);
-
 
470
VAR
-
 
471
  cur       : XML.ELEMENT;
-
 
472
  tag       : XML.TAG;
-
 
473
  word      : XML.WORD;
-
 
474
  text      : XML.TEXT;
-
 
475
  tag_value : INTEGER;
-
 
476
  _align    : INTEGER;
-
 
477
  title     : XML.ELEMENT;
485
    END
478
  width     : INTEGER;
486
  END Image;
479
  height1   : INTEGER;
487
 
480
  height2   : INTEGER;
488
 
481
 
489
BEGIN
482
BEGIN
Line 608... Line 601...
608
        Sub(FALSE)
601
        Sub(FALSE)
609
      |XML.tag_code:
602
      |XML.tag_code:
610
        DEC(code);
603
        DEC(code);
611
        Font.sysfont(code > 0)
604
        Font.sysfont(code > 0)
612
      |XML.tag_image:
605
      |XML.tag_image:
613
        Image(tag)
606
        Image(tag, TRUE)
614
 
-
 
615
      |XML.tag_table:
607
      |XML.tag_table:
616
        Y := tag.Ymin + tables.get_table_height(tag.table);
608
        Y := tag.Ymin + tables.get_table_height(tag.table);
617
        tag.Ymax := Y - Y MOD LineH;
609
        tag.Ymax := Y - Y MOD LineH;
618
        NewLine;
610
        NewLine;
619
      |XML.tag_td, XML.tag_th:
611
      |XML.tag_td, XML.tag_th:
Line 678... Line 670...
678
  text  : XML.TEXT;
670
  text  : XML.TEXT;
679
  tag   : XML.TAG;
671
  tag   : XML.TAG;
680
  y, y0 : INTEGER;
672
  y, y0 : INTEGER;
681
  value : INTEGER;
673
  value : INTEGER;
Line 682... Line 674...
682
 
674
 
683
  PROCEDURE DrawText(Col: Window.TRect; min, max, y0, y: INTEGER; right: BOOLEAN; VAR text: XML.TEXT);
675
  PROCEDURE DrawText(Col: Window.tRect; min, max, y0, y: INTEGER; right: BOOLEAN; VAR text: XML.TEXT);
684
  VAR word: XML.WORD;
676
  VAR word: XML.WORD;
685
  BEGIN
677
  BEGIN
686
    IF (min <= y0) & (y0 <= max) THEN
678
    IF (min <= y0) & (y0 <= max) THEN
687
      Font.sysfont(code > 0);
679
      Font.sysfont(code > 0);
688
      IF text IS XML.WORD THEN
680
      IF text IS XML.WORD THEN
689
        word := text(XML.WORD);
681
        word := text(XML.WORD);
690
        Font.Text(Col, word.X, y - Col.Height * ORD(right), word.value.first, word.length);
682
        Font.Text(Col, word.X, y - Col.height * ORD(right), word.value.first, word.length);
691
      END;
683
      END;
692
      Font.StrikeText(Col, text.X, y - Col.Height * ORD(right), text.width)
684
      Font.StrikeText(Col, text.X, y - Col.height * ORD(right), text.width)
693
    END
685
    END
Line 694... Line 686...
694
  END DrawText;
686
  END DrawText;
695
 
687
 
696
  PROCEDURE Image(VAR tag: XML.TAG);
688
  PROCEDURE DrawImage(VAR tag: XML.TAG);
697
  VAR sizeX, sizeY, img, y: INTEGER;
689
  VAR sizeX, sizeY, img, y: INTEGER;
698
  BEGIN
690
  BEGIN
699
    IF tag.img # 0 THEN
691
    IF tag.img # 0 THEN
700
      y := Ycur;
692
      y := Ycur;
701
      LibImg.GetInf(tag.img, sizeX, sizeY, img);
693
      LibImg.GetInf(tag.img, sizeX, sizeY, img);
702
      IF (y <= tag.Ymax) & (tag.Ymin <= y + ColLeft.Height) THEN
694
      IF (y <= tag.Ymax) & (tag.Ymin <= y + ColLeft.height) THEN
703
        G.Image(ColLeft.Left + tag.X, tag.Ymin - y + ColLeft.Top, sizeX, sizeY, img, ColLeft.Top, ColLeft.Top + ColLeft.Height - 1)
695
        G.Image(ColLeft.left + tag.X, tag.Ymin - y + ColLeft.top, sizeX, sizeY, img, ColLeft.top, ColLeft.top + ColLeft.height - 1)
704
      END;
696
      END;
705
      IF Settings.TwoCol THEN
697
      IF Settings.TwoCol THEN
706
        y := Ycur + ColLeft.Height;
698
        y := Ycur + ColLeft.height;
707
        IF (y <= tag.Ymax) & (tag.Ymin <= y + ColRight.Height) THEN
699
        IF (y <= tag.Ymax) & (tag.Ymin <= y + ColRight.height) THEN
708
          G.Image(ColRight.Left + tag.X, tag.Ymin - y + ColLeft.Top, sizeX, sizeY, img, ColRight.Top, ColRight.Top + ColRight.Height - 1)
700
          G.Image(ColRight.left + tag.X, tag.Ymin - y + ColLeft.top, sizeX, sizeY, img, ColRight.top, ColRight.top + ColRight.height - 1)
709
        END
701
        END
710
      END
702
      END
Line 711... Line 703...
711
    END
703
    END
712
  END Image;
704
  END DrawImage;
713
 
705
 
714
  PROCEDURE td(VAR tag: XML.TAG);
706
  PROCEDURE td(VAR tag: XML.TAG);
715
  VAR x1, y1, x2, y2, cl: INTEGER;
707
  VAR x1, y1, x2, y2, cl: INTEGER;
716
  BEGIN
708
  BEGIN
717
    x1 := tag.X + ColLeft.Left;
709
    x1 := tag.X + ColLeft.left;
718
    y1 := tag.Ymin - Ycur + ColLeft.Top;
710
    y1 := tag.Ymin - Ycur + ColLeft.top;
719
    x2 := x1 + tag.Width;
711
    x2 := x1 + tag.Width;
720
    y2 := y1 + tables.get_height(tag.table, tag.cell);
712
    y2 := y1 + tables.get_height(tag.table, tag.cell);
721
    cl := G.GetColor();
713
    cl := G.GetColor();
722
    G.SetColor(Settings.Colors[TEXT_COLOR]);
714
    G.SetColor(Settings.Colors[TEXT_COLOR]);
723
    G.Rect(x1, y1, x2, y2);
715
    G.Rect(x1, y1, x2, y2);
724
    IF Settings.TwoCol THEN
716
    IF Settings.TwoCol THEN
725
      x1 := x1 - ColLeft.Left + ColRight.Left;
717
      x1 := x1 - ColLeft.left + ColRight.left;
726
      x2 := x2 - ColLeft.Left + ColRight.Left;
718
      x2 := x2 - ColLeft.left + ColRight.left;
727
      y1 := y1 - ColLeft.Height;
719
      y1 := y1 - ColLeft.height;
728
      y2 := y2 - ColLeft.Height;
720
      y2 := y2 - ColLeft.height;
729
      G.Rect(x1, y1, x2, y2)
721
      G.Rect(x1, y1, x2, y2)
Line 774... Line 766...
774
        Font.Strike(TRUE)
766
        Font.Strike(TRUE)
775
      |XML.tag_epigraph, XML.tag_cite, XML.tag_emphasis:
767
      |XML.tag_epigraph, XML.tag_cite, XML.tag_emphasis:
776
        INC(italic);
768
        INC(italic);
777
        Font.Italic(TRUE, refer = 0)
769
        Font.Italic(TRUE, refer = 0)
778
      |XML.tag_image:
770
      |XML.tag_image:
-
 
771
      	Image(tag, FALSE);
779
        Image(tag)
772
        DrawImage(tag);
-
 
773
        LibImg.Destroy(tag.img)
780
      |XML.tag_code:
774
      |XML.tag_code:
781
        INC(code)
775
        INC(code)
782
      ELSE
776
      ELSE
783
      END;
777
      END;
784
      layout2(tag.child.first);
778
      layout2(tag.child.first);
Line 814... Line 808...
814
      END
808
      END
815
    ELSIF cur IS XML.TEXT THEN
809
    ELSIF cur IS XML.TEXT THEN
816
      text := cur(XML.TEXT);
810
      text := cur(XML.TEXT);
817
      y  := text.Y - Ycur;
811
      y  := text.Y - Ycur;
818
      y0 := y - y MOD LineH;
812
      y0 := y - y MOD LineH;
819
      DrawText(ColLeft, 0, ColLeft.Height - LineH, y0, y, FALSE, text);
813
      DrawText(ColLeft, 0, ColLeft.height - LineH, y0, y, FALSE, text);
820
      IF Settings.TwoCol THEN
814
      IF Settings.TwoCol THEN
821
        DrawText(ColRight, ColLeft.Height, ColLeft.Height + ColRight.Height - LineH, y0, y, TRUE, text)
815
        DrawText(ColRight, ColLeft.height, ColLeft.height + ColRight.height - LineH, y0, y, TRUE, text)
822
      END
816
      END
823
    END;
817
    END;
824
    cur := cur.next
818
    cur := cur.next
825
  END
819
  END
826
END layout2;
820
END layout2;
Line 827... Line 821...
827
 
821
 
828
 
822
 
829
PROCEDURE DrawProgress(progress_color: INTEGER);
823
PROCEDURE DrawFrame (color: INTEGER);
830
VAR max_X, max_Y: INTEGER;
824
VAR max_X, max_Y: INTEGER;
831
BEGIN
825
BEGIN
832
  max_X := G.Buffer.Width - 1;
826
  max_X := G.Buffer.Width - 1;
833
  max_Y := G.Buffer.Height - 1;
827
  max_Y := G.Buffer.Height - 1;
834
  G.SetColor(0);
828
  G.SetColor(color);
835
  G.HLine(0, max_X, 0);
829
  G.HLine(0, max_X, 0);
836
  G.HLine(0, max_X, max_Y);
830
  G.HLine(0, max_X, max_Y);
837
  G.VLine(0, 0, max_Y);
831
  G.VLine(0, 0, max_Y);
838
  sb.max_area := (Ymax - Ymin) DIV LineH + 50;
832
  sb.max_area := (Ymax - Ymin) DIV LineH + 50;
839
  sb.cur_area := 50;
833
  sb.cur_area := 50;
840
  sb.position := (Ycur - Ymin) DIV LineH;
834
  sb.position := (Ycur - Ymin) DIV LineH;
Line 841... Line 835...
841
  box_lib.scrollbar_v_draw(sb)
835
  box_lib.scrollbar_v_draw(sb)
842
END DrawProgress;
836
END DrawFrame;
843
 
837
 
844
 
-
 
845
PROCEDURE Draw*;
838
 
846
VAR back, max_X, max_Y: INTEGER;
839
PROCEDURE Draw*;
847
BEGIN
840
(*VAR max_Y: INTEGER;*)
-
 
841
BEGIN
-
 
842
  (*max_Y := G.Buffer.Height - 1;*)
-
 
843
  IF Settings.b_pict & (Settings.Picture # 0) THEN
848
  back  := Settings.Colors[BACK_COLOR];
844
      G.Copy(G.BackImg, G.Buffer, 0, G.Buffer.Height, 0)
849
  max_X := G.Buffer.Width - 1;
845
  ELSE
850
  max_Y := G.Buffer.Height - 1;
846
      G.Fill(G.Buffer, Settings.Colors[BACK_COLOR])
851
  G.Copy(G.Buffer3, G.Buffer, 0, G.Buffer.Height, 0);
847
  END;
852
  Font.SetFontColor(Settings.Colors[TEXT_COLOR]);
848
  Font.SetFontColor(Settings.Colors[TEXT_COLOR]);
853
  IF ((body = description) OR (body = contents)) & Settings.TwoCol THEN
849
  IF ((body = description) OR (body = contents)) & Settings.TwoCol THEN
854
    Settings.TwoCol := FALSE;
850
    Settings.TwoCol := FALSE;
855
    layout2(body.child.first);
851
    layout2(body.child.first);
856
    Settings.TwoCol := TRUE;
852
    Settings.TwoCol := TRUE;
857
    Search.draw(body, ColLeft, ColRight, Ycur, LineH, FALSE)
853
    Search.draw(body, ColLeft, ColRight, Ycur, LineH, FALSE)
858
  ELSE
854
  ELSE
859
    layout2(body.child.first);
855
    layout2(body.child.first);
860
    Search.draw(body, ColLeft, ColRight, Ycur, LineH, Settings.TwoCol)
856
    Search.draw(body, ColLeft, ColRight, Ycur, LineH, Settings.TwoCol)
861
  END;
857
  END;
862
  G.Copy(G.Buffer3, G.Buffer, 0, ColLeft.Top + 1, 0);
858
  (*G.Copy(G.BackImg, G.Buffer, 0, ColLeft.top + 1, 0);
863
  G.Copy(G.Buffer3, G.Buffer, max_Y - ColLeft.Top, ColLeft.Top + 1, max_Y - ColLeft.Top);
859
  G.Copy(G.BackImg, G.Buffer, max_Y - ColLeft.top, ColLeft.top + 1, max_Y - ColLeft.top);*)
864
  DrawProgress(0);
860
  DrawFrame(0);
Line 930... Line 926...
930
    Ymax := body.Ymax
926
    Ymax := body.Ymax
931
  END
927
  END
932
END Descr;
928
END Descr;
Line 933... Line 929...
933
 
929
 
934
 
930
 
935
PROCEDURE Up*;
931
PROCEDURE Scroll* (n: INTEGER);
936
BEGIN
932
BEGIN
937
  DEC(Ycur, LineH);
-
 
938
  SU.MinMax(Ycur, Ymin, Ymax)
-
 
939
END Up;
-
 
940
 
-
 
941
 
-
 
942
PROCEDURE Down*;
-
 
943
BEGIN
-
 
944
  INC(Ycur, LineH);
933
	INC(Ycur, LineH*n);
Line 945... Line 934...
945
  SU.MinMax(Ycur, Ymin, Ymax)
934
	SU.MinMax(Ycur, Ymin, Ymax)
946
END Down;
-
 
947
 
935
END Scroll;
948
 
936
 
949
PROCEDURE PageUp*;
-
 
950
VAR i: INTEGER;
-
 
951
BEGIN
937
 
Line 952... Line 938...
952
  FOR i := 1 TO Lines * (ORD(Settings.TwoCol) + 1) DO
938
PROCEDURE PageUp*;
953
    Up
-
 
954
  END
939
BEGIN
955
END PageUp;
940
    Scroll(-Lines * (ORD(Settings.TwoCol) + 1))
956
 
-
 
957
 
-
 
958
PROCEDURE PageDown*;
941
END PageUp;
Line 959... Line 942...
959
VAR i: INTEGER;
942
 
960
BEGIN
943
 
Line 1044... Line 1027...
1044
    INC(i)
1027
    INC(i)
1045
  END
1028
  END
1046
END layout3;
1029
END layout3;
Line -... Line 1030...
-
 
1030
 
-
 
1031
 
-
 
1032
PROCEDURE getRefProp (VAR ref, body: XML.TAG; VAR URL: INTEGER; VAR note: BOOLEAN; VAR Y: INTEGER);
-
 
1033
BEGIN
-
 
1034
	note := FALSE;
-
 
1035
	URL := 0;
-
 
1036
	Y := 0;
-
 
1037
	IF ref.value = XML.tag_a THEN
-
 
1038
		ref := XML.GetRef(ref, note, URL)
-
 
1039
	ELSE
-
 
1040
		ref := ref.parent(XML.TAG)
-
 
1041
	END;
-
 
1042
	IF ref # NIL THEN
-
 
1043
		Y := ref.Ymin;
-
 
1044
	END;
-
 
1045
	IF note THEN
-
 
1046
	  	body := ref
-
 
1047
	ELSE
-
 
1048
	  	body := GetBody(ref)
-
 
1049
	END
-
 
1050
END getRefProp;
-
 
1051
 
-
 
1052
 
-
 
1053
PROCEDURE zstreq (s1, s2: INTEGER): BOOLEAN;
-
 
1054
VAR
-
 
1055
    c1, c2: CHAR;
-
 
1056
BEGIN
-
 
1057
    REPEAT
-
 
1058
        sys.GET(s1, c1); INC(s1);
-
 
1059
        sys.GET(s2, c2); INC(s2);
-
 
1060
    UNTIL (c1 = 0X) OR (c2 = 0X)
-
 
1061
 
-
 
1062
    RETURN c1 = c2
-
 
1063
END zstreq;
-
 
1064
 
-
 
1065
 
-
 
1066
PROCEDURE refeq (ref1, ref2: XML.TAG): BOOLEAN;
-
 
1067
VAR
-
 
1068
	body1, body2: XML.TAG;
-
 
1069
	URL1, URL2: INTEGER;
-
 
1070
	note1, note2: BOOLEAN;
-
 
1071
	Y1, Y2: INTEGER;
-
 
1072
BEGIN
-
 
1073
	getRefProp(ref1, body1, URL1, note1, Y1);
-
 
1074
	getRefProp(ref2, body2, URL2, note2, Y2);
-
 
1075
	RETURN (ref1 = ref2) & (body1 = body2) & (URL1 = 0) & (URL2 = 0) & (note1 = note2) & (Y1 = Y2) OR
-
 
1076
			(URL1 # 0) & (URL2 # 0) & zstreq(URL1, URL2)
-
 
1077
END refeq;
-
 
1078
 
-
 
1079
 
-
 
1080
PROCEDURE setVisited (ref: XML.TAG);
-
 
1081
VAR
-
 
1082
	i: INTEGER;
-
 
1083
	cur: V.ANYPTR;
-
 
1084
BEGIN
-
 
1085
	FOR i := 0 TO references.count - 1 DO
-
 
1086
		cur := V.get(references, i);
-
 
1087
		IF cur IS XML.TEXT THEN
-
 
1088
			cur := cur(XML.TEXT).parent;
-
 
1089
			IF refeq(cur(XML.TAG), ref) THEN
-
 
1090
				cur(XML.TAG).Visited := TRUE
-
 
1091
			END
-
 
1092
		END
-
 
1093
	END
-
 
1094
END setVisited;
1047
 
1095
 
1048
 
1096
 
1049
PROCEDURE MouseDown;
1097
PROCEDURE MouseDown;
1050
BEGIN
1098
BEGIN
1051
	IF ~mouseDown THEN
1099
	IF ~mouseDown THEN
-
 
1100
		mouseDown := TRUE;
1052
		mouseDown := TRUE;
1101
		clickRef := ref;
-
 
1102
		IF ref # NIL THEN
1053
		clickRef := ref;
1103
			ref.Clicked := TRUE
1054
		ref.Clicked := TRUE;
1104
		END;
1055
		Draw
1105
		Draw
Line 1086... Line 1136...
1086
			END;
1136
			END;
1087
			Ymax := body.Ymax;
1137
			Ymax := body.Ymax;
1088
			Ymin := body.Ymin;
1138
			Ymin := body.Ymin;
Line 1089... Line 1139...
1089
 
1139
 
-
 
1140
			IF ~clickRef.Visited THEN
1090
			IF ~clickRef.Visited THEN
1141
				setVisited(clickRef);
1091
				clickRef.Visited := TRUE;
1142
				clickRef.Visited := TRUE;
1092
				PushRef(clickRef)
1143
				PushRef(clickRef)
1093
			END
1144
			END
1094
		ELSIF URL # 0 THEN
1145
		ELSIF URL # 0 THEN
1095
			SU.Run(Ini.Browser, URL);
1146
			SU.Run(Ini.Browser, URL);
-
 
1147
			IF ~clickRef.Visited THEN
1096
			IF ~clickRef.Visited THEN
1148
				setVisited(clickRef);
1097
				clickRef.Visited := TRUE;
1149
				clickRef.Visited := TRUE;
1098
				PushRef(clickRef)
1150
				PushRef(clickRef)
1099
			END
1151
			END
1100
		END;
-
 
1101
 
1152
		END
1102
	END;
1153
	END;
1103
	IF clickRef # NIL THEN
1154
	IF clickRef # NIL THEN
1104
		clickRef.Clicked := FALSE;
1155
		clickRef.Clicked := FALSE;
1105
		clickRef := NIL;
1156
		clickRef := NIL;
Line 1127... Line 1178...
1127
  DEC(X, Settings.PADDING.Left);
1178
  DEC(X, Settings.PADDING.Left);
1128
  IF (0 <= Y) & (Y <= Lines * LineH) THEN
1179
  IF (0 <= Y) & (Y <= Lines * LineH) THEN
1129
    ref := NIL;
1180
    ref := NIL;
1130
    layout3(body, X, Y);
1181
    layout3(body, X, Y);
1131
    IF (ref = NIL) & Settings.TwoCol THEN
1182
    IF (ref = NIL) & Settings.TwoCol THEN
1132
      layout3(body, X - ColLeft.Width - Settings.PADDING.ColInter, Y + Lines * LineH);
1183
      layout3(body, X - ColLeft.width - Settings.PADDING.ColInter, Y + Lines * LineH);
1133
    END;
1184
    END;
1134
    hoverRef := ref;
1185
    hoverRef := ref;
1135
	IF clicked THEN
1186
	IF clicked THEN
1136
		MouseDown
1187
		MouseDown
1137
	ELSE
1188
	ELSE
Line 1163... Line 1214...
1163
      DrawStatus
1214
      DrawStatus
1164
  END
1215
  END
1165
END Click;
1216
END Click;
Line 1166... Line -...
1166
 
-
 
1167
 
-
 
1168
PROCEDURE Scroll*(value: INTEGER);
-
 
1169
BEGIN
-
 
1170
  value := 2 * value;
-
 
1171
  WHILE value > 0 DO
-
 
1172
    Down;
-
 
1173
    DEC(value)
-
 
1174
  ELSIF value < 0 DO
-
 
1175
    Up;
-
 
1176
    INC(value)
-
 
1177
  END
-
 
1178
END Scroll;
-
 
1179
 
1217
 
1180
 
1218
 
1181
PROCEDURE main(fb: XML.ELEMENT; Contents: BOOLEAN);
1219
PROCEDURE main(fb: XML.ELEMENT; Contents: BOOLEAN);
1182
VAR
1220
VAR
1183
  cur: XML.ELEMENT;
1221
  cur: XML.ELEMENT;
Line 1281... Line 1319...
1281
BEGIN
1319
BEGIN
1282
    Search.fnext(body, y, d);
1320
    Search.fnext(body, y, d);
1283
    IF y >= 0 THEN
1321
    IF y >= 0 THEN
1284
        DEC(y, y MOD LineH);
1322
        DEC(y, y MOD LineH);
1285
        min := Ycur;
1323
        min := Ycur;
-
 
1324
        max := min + ColLeft.height - LineH;
1286
        IF Settings.TwoCol THEN
1325
        IF Settings.TwoCol THEN
1287
            max := min + ColLeft.Height + ColRight.Height - LineH
-
 
1288
        ELSE
-
 
1289
            max := min + ColLeft.Height - LineH
1326
            INC(max, ColRight.height)
1290
        END;
1327
        END;
Line 1291... Line 1328...
1291
 
1328
 
1292
        IF (y < min) OR (y > max) THEN
1329
        IF (y < min) OR (y > max) THEN
1293
            Ycur := MAX(y - ColLeft.Height DIV 2, 0)
1330
            Ycur := MAX(y - ColLeft.height DIV 2, 0)
Line 1294... Line 1331...
1294
        END;
1331
        END;
1295
 
1332
 
1296
        DEC(Ycur, Ycur MOD LineH)
1333
        DEC(Ycur, Ycur MOD LineH)
Line 1328... Line 1365...
1328
  END;
1365
  END;
1329
  Settings.PADDING.Right     :=  Settings.PADDING.Left;
1366
  Settings.PADDING.Right     :=  Settings.PADDING.Left;
1330
  Settings.PADDING.ColInter  :=  G.Buffer.Width * Settings.PADDING.CInt DIV 100;
1367
  Settings.PADDING.ColInter  :=  G.Buffer.Width * Settings.PADDING.CInt DIV 100;
Line 1331... Line 1368...
1331
 
1368
 
1332
  LineH := Font.FontH() + Settings.SUP + Settings.SUB + Settings.InterLin;
1369
  LineH := Font.FontH() + Settings.SUP + Settings.SUB + Settings.InterLin;
1333
  Window.InitRect(
1370
  Window.initRect(
1334
    ColLeft, Settings.PADDING.Left, Settings.PADDING.Top,
1371
    ColLeft, Settings.PADDING.Left, Settings.PADDING.Top,
1335
    G.Buffer.Width - Settings.PADDING.Left - Settings.PADDING.Right,
1372
    G.Buffer.Width - Settings.PADDING.Left - Settings.PADDING.Right,
1336
    G.Buffer.Height - Settings.PADDING.Top - Settings.PADDING.Bottom);
1373
    G.Buffer.Height - Settings.PADDING.Top - Settings.PADDING.Bottom);
1337
  IF Settings.TwoCol THEN
1374
  IF Settings.TwoCol THEN
1338
    ColLeft.Width := (ColLeft.Width - Settings.PADDING.ColInter) DIV 2;
1375
    ColLeft.width := (ColLeft.width - Settings.PADDING.ColInter) DIV 2;
1339
    ColRight := ColLeft;
1376
    ColRight := ColLeft;
1340
    ColRight.Left := ColLeft.Left + ColLeft.Width + Settings.PADDING.ColInter
1377
    ColRight.left := ColLeft.left + ColLeft.width + Settings.PADDING.ColInter
1341
  END;
1378
  END;
1342
  W := ColLeft.Width;
1379
  W := ColLeft.width;
1343
  Lines := ColLeft.Height DIV LineH;
1380
  Lines := ColLeft.height DIV LineH;
1344
  ColLeft.Height  := Lines * LineH;
1381
  ColLeft.height  := Lines * LineH;
1345
  ColRight.Height := ColLeft.Height;
1382
  ColRight.height := ColLeft.height;
Line 1346... Line 1383...
1346
END FontSizeChange;
1383
END FontSizeChange;
1347
 
1384
 
Line 1348... Line 1385...
1348
 
1385
 
1349
PROCEDURE Resize*(Width, Height: INTEGER);
1386
PROCEDURE Resize*(Width, Height: INTEGER);
1350
VAR d: REAL; resize: BOOLEAN; sizeX, sizeY, data: INTEGER;
1387
VAR d: REAL; resize: BOOLEAN; sizeX, sizeY, data, back_picture: INTEGER;
1351
 
1388
 
Line 1372... Line 1409...
1372
  END stk2;
1409
  END stk2;
Line 1373... Line 1410...
1373
 
1410
 
1374
BEGIN
1411
BEGIN
1375
  resize := (Width # G.Buffer.Width) OR resized;
1412
  resize := (Width # G.Buffer.Width) OR resized;
1376
  G.Resize(Width, Height);
-
 
1377
  G.SetColor(Settings.Colors[BACK_COLOR]);
1413
  G.Resize(Width, Height);
-
 
1414
  IF (Settings.Picture # 0) & Settings.b_pict THEN
-
 
1415
  	back_picture := LibImg.GetImg(Settings.Picture, Settings.picture_fsize, 1000000, sizeY);
1378
  IF (Settings.Picture # 0) & Settings.b_pict THEN
1416
  	IF back_picture # 0 THEN
-
 
1417
	    LibImg.GetInf(back_picture, sizeX, sizeY, data);
1379
    LibImg.GetInf(Settings.Picture, sizeX, sizeY, data);
1418
    	G.CreateBackImg;
-
 
1419
	    G.BackImage(sizeX, sizeY, data);
-
 
1420
    	LibImg.Destroy(back_picture)
1380
    G.BackImage(sizeX, sizeY, data);
1421
    END
1381
  ELSE
1422
  ELSE
1382
    G.Clear;
1423
    G.DestroyBackImg;
-
 
1424
    G.Fill(G.Buffer, Settings.Colors[BACK_COLOR]);
1383
    G.Copy(G.Buffer, G.Buffer3, 0, G.Buffer.Height, 0)
1425
    //G.Fill(G.BackImg, Settings.Colors[BACK_COLOR])
Line 1384... Line 1426...
1384
  END;
1426
  END;
1385
 
1427
 
1386
  IF Font.FontH() # 0 THEN
1428
  IF Font.FontH() # 0 THEN
1387
    FontSizeChange(Font.FontH());
1429
    FontSizeChange(Font.FontH());
1388
  ELSE
1430
  ELSE
Line 1389... Line 1431...
1389
    FontSizeChange(Settings.FontSize);
1431
    FontSizeChange(Settings.FontSize);
1390
  END;
1432
  END;
1391
 
1433
 
1392
  ColLeft.Width  := G.Buffer.Width - Settings.PADDING.Left - Settings.PADDING.Right;
1434
  ColLeft.width  := G.Buffer.Width - Settings.PADDING.Left - Settings.PADDING.Right;
1393
  IF Settings.TwoCol THEN
1435
  IF Settings.TwoCol THEN
1394
    ColLeft.Width  := (ColLeft.Width - Settings.PADDING.ColInter) DIV 2;
1436
    ColLeft.width  := (ColLeft.width - Settings.PADDING.ColInter) DIV 2;
1395
    ColRight.Width := ColLeft.Width;
1437
    ColRight.width := ColLeft.width;
1396
    ColRight.Left  := ColLeft.Left + ColLeft.Width + Settings.PADDING.ColInter
1438
    ColRight.left  := ColLeft.left + ColLeft.width + Settings.PADDING.ColInter
1397
  END;
1439
  END;
1398
  ColLeft.Height  := G.Buffer.Height - Settings.PADDING.Top  - Settings.PADDING.Bottom;
1440
  ColLeft.height  := G.Buffer.Height - Settings.PADDING.Top  - Settings.PADDING.Bottom;
Line 1399... Line 1441...
1399
  Lines           := ColLeft.Height DIV LineH;
1441
  Lines           := ColLeft.height DIV LineH;
1400
  ColLeft.Height  := Lines * LineH;
1442
  ColLeft.height  := Lines * LineH;
1401
  ColRight.Height := ColLeft.Height;
1443
  ColRight.height := ColLeft.height;
1402
 
1444
 
1403
  IF done & resize THEN
1445
  IF done & resize THEN
1404
    resized := FALSE;
1446
    resized := FALSE;
1405
    Push(b_stk);
1447
    Push(b_stk);
1406
    stk1(b_stk);
1448
    stk1(b_stk);
1407
    stk1(f_stk);
1449
    stk1(f_stk);
1408
    IF contents # NIL THEN
1450
    IF contents # NIL THEN
1409
      d := FLT(Ycont) / FLT(contents.Ymax)
1451
      d := FLT(Ycont) / FLT(contents.Ymax)
1410
    END;
1452
    END;
1411
    W := ColLeft.Width;
1453
    W := ColLeft.width;
1412
    W2 := ColLeft.Width + ColRight.Width + Settings.PADDING.ColInter;
1454
    W2 := ColLeft.width + ColRight.width + Settings.PADDING.ColInter;
1413
    W1 := W;
1455
    W1 := W;
Line 1503... Line 1545...
1503
PROCEDURE Save;
1545
PROCEDURE Save;
1504
VAR history: File.FS; win_size_x, win_size_y, size, pos: INTEGER;
1546
VAR history: File.FS; win_size_x, win_size_y, size, pos: INTEGER;
Line 1505... Line 1547...
1505
 
1547
 
1506
  PROCEDURE WriteInt(history: File.FS; x: INTEGER);
1548
  PROCEDURE WriteInt(history: File.FS; x: INTEGER);
1507
  BEGIN
1549
  BEGIN
1508
    IF Write.Int(history, x) THEN END
1550
    IF File.WriteInt(history, x) THEN END
Line 1509... Line 1551...
1509
  END WriteInt;
1551
  END WriteInt;
1510
 
1552
 
1511
  PROCEDURE WriteStk(history: File.FS; VAR stk: XML.LIST; links: BOOLEAN);
1553
  PROCEDURE WriteStk(history: File.FS; VAR stk: XML.LIST; links: BOOLEAN);
Line 1531... Line 1573...
1531
  ELSE
1573
  ELSE
1532
    pos := File.Seek(history, 0 , 2)
1574
    pos := File.Seek(history, 0 , 2)
1533
  END;
1575
  END;
1534
  size := 1 + 18*4 + 1 + 8*(XML.ListCount(b_stk) + XML.ListCount(f_stk)) + 4*XML.ListCount(vis_ref) + 12;
1576
  size := 1 + 18*4 + 1 + 8*(XML.ListCount(b_stk) + XML.ListCount(f_stk)) + 4*XML.ListCount(vis_ref) + 12;
1535
  WriteInt(history, size);
1577
  WriteInt(history, size);
1536
  IF Write.Char(history, 0X) THEN END;
1578
  IF File.WriteChar(history, 0X) THEN END;
1537
  WriteInt(history, fsize2);
1579
  WriteInt(history, fsize2);
1538
  WriteInt(history, chksum);
1580
  WriteInt(history, chksum);
1539
  SU.GetWindowSize(win_size_x, win_size_y);
1581
  SU.GetWindowSize(win_size_x, win_size_y);
1540
  WriteInt(history, win_size_x);
1582
  WriteInt(history, win_size_x);
1541
  WriteInt(history, win_size_y);
1583
  WriteInt(history, win_size_y);
Line 1544... Line 1586...
1544
  WriteInt(history, Settings.PADDING.CInt);
1586
  WriteInt(history, Settings.PADDING.CInt);
1545
  WriteInt(history, Settings.PARAGRAPH);
1587
  WriteInt(history, Settings.PARAGRAPH);
1546
  WriteInt(history, Settings.EPIGRAPH);
1588
  WriteInt(history, Settings.EPIGRAPH);
1547
  WriteInt(history, Settings.InterLin);
1589
  WriteInt(history, Settings.InterLin);
Line 1548... Line 1590...
1548
 
1590
 
Line 1549... Line 1591...
1549
  IF Write.Boolean(history, Settings.TwoCol) THEN END;
1591
  IF File.WriteBool(history, Settings.TwoCol) THEN END;
1550
 
1592
 
1551
  WriteInt(history, Settings.FontSize);
1593
  WriteInt(history, Settings.FontSize);
1552
  WriteInt(history, body.num);
1594
  WriteInt(history, body.num);
Line 1566... Line 1608...
1566
END Save;
1608
END Save;
Line 1567... Line 1609...
1567
 
1609
 
1568
 
1610
 
1569
PROCEDURE ReadInt(VAR x: INTEGER);
1611
PROCEDURE ReadInt(VAR x: INTEGER);
1570
BEGIN
1612
BEGIN
Line 1571... Line 1613...
1571
  IF Read.Int(history, x) THEN END
1613
  IF File.ReadInt(history, x) THEN END
1572
END ReadInt;
1614
END ReadInt;
Line 1596... Line 1638...
1596
		ReadInt(n);
1638
		ReadInt(n);
1597
		WHILE n > 0 DO
1639
		WHILE n > 0 DO
1598
			ReadInt(num);
1640
			ReadInt(num);
1599
			ref := XML.GetTagByNum(num);
1641
			ref := XML.GetTagByNum(num);
1600
			IF ref # NIL THEN
1642
			IF ref # NIL THEN
1601
				PushRef(ref);
1643
				setVisited(ref);
1602
				ref.Visited := TRUE
1644
				ref.Visited := TRUE;
-
 
1645
				PushRef(ref)
1603
			END;
1646
			END;
1604
			DEC(n)
1647
			DEC(n)
1605
		END
1648
		END
1606
	END ReadRef;
1649
	END ReadRef;
Line 1610... Line 1653...
1610
  ReadInt(Settings.PADDING.Top);
1653
  ReadInt(Settings.PADDING.Top);
1611
  ReadInt(Settings.PADDING.CInt);
1654
  ReadInt(Settings.PADDING.CInt);
1612
  ReadInt(Settings.PARAGRAPH);
1655
  ReadInt(Settings.PARAGRAPH);
1613
  ReadInt(Settings.EPIGRAPH);
1656
  ReadInt(Settings.EPIGRAPH);
1614
  ReadInt(Settings.InterLin);
1657
  ReadInt(Settings.InterLin);
1615
  IF Read.Boolean(history, Settings.TwoCol) THEN END;
1658
  IF File.ReadBool(history, Settings.TwoCol) THEN END;
1616
  ReadInt(Settings.FontSize);
1659
  ReadInt(Settings.FontSize);
Line 1617... Line 1660...
1617
 
1660
 
Line 1618... Line 1661...
1618
  SetSettings(Settings);
1661
  SetSettings(Settings);
Line 1628... Line 1671...
1628
  ReadRef;
1671
  ReadRef;
Line 1629... Line 1672...
1629
 
1672
 
1630
  ReadInt(size);
1673
  ReadInt(size);
1631
  pos := File.Seek(history, -size, 1);
1674
  pos := File.Seek(history, -size, 1);
1632
  pos := File.Seek(history, 4, 1);
1675
  pos := File.Seek(history, 4, 1);
Line 1633... Line 1676...
1633
  IF Write.Char(history, 1X) THEN END;
1676
  IF File.WriteChar(history, 1X) THEN END;
1634
 
1677
 
1635
  Ycur := ycur;
1678
  Ycur := ycur;
1636
  body := XML.GetTagByNum(body_num);
1679
  body := XML.GetTagByNum(body_num);
Line 1646... Line 1689...
1646
  found := FALSE;
1689
  found := FALSE;
1647
  history := File.Open(Ini.History);
1690
  history := File.Open(Ini.History);
1648
  pos := File.Seek(history, -4, 2);
1691
  pos := File.Seek(history, -4, 2);
1649
  last := FALSE;
1692
  last := FALSE;
1650
  WHILE pos >= 0 DO
1693
  WHILE pos >= 0 DO
1651
    IF Read.Int(history, size) THEN
1694
    IF File.ReadInt(history, size) THEN
1652
      pos := File.Seek(history, -size + 4, 1);
1695
      pos := File.Seek(history, -size + 4, 1);
1653
    END;
1696
    END;
1654
    IF Read.Char(history, c) THEN END;
1697
    IF File.ReadChar(history, c) THEN END;
1655
    ReadInt(fsize);
1698
    ReadInt(fsize);
1656
    ReadInt(_chksum);
1699
    ReadInt(_chksum);
1657
    IF (c = 0X) & (fsize = fsize2) & (_chksum = chksum) THEN
1700
    IF (c = 0X) & (fsize = fsize2) & (_chksum = chksum) THEN
1658
      found := TRUE;
1701
      found := TRUE;
1659
      IF Read.Int(history, x) & Read.Int(history, y) THEN
1702
      IF File.ReadInt(history, x) & File.ReadInt(history, y) THEN
1660
        win_size_x := x;
1703
        win_size_x := x;
1661
        win_size_y := y;
1704
        win_size_y := y;
1662
      ELSE
1705
      ELSE
1663
        found := FALSE
1706
        found := FALSE
1664
      END;
1707
      END;
Line 1672... Line 1715...
1672
        ReadInt(Settings.PADDING.Top);
1715
        ReadInt(Settings.PADDING.Top);
1673
        ReadInt(Settings.PADDING.CInt);
1716
        ReadInt(Settings.PADDING.CInt);
1674
        ReadInt(Settings.PARAGRAPH);
1717
        ReadInt(Settings.PARAGRAPH);
1675
        ReadInt(Settings.EPIGRAPH);
1718
        ReadInt(Settings.EPIGRAPH);
1676
        ReadInt(Settings.InterLin);
1719
        ReadInt(Settings.InterLin);
1677
        IF Read.Boolean(history, Settings.TwoCol) THEN END;
1720
        IF File.ReadBool(history, Settings.TwoCol) THEN END;
1678
        ReadInt(Settings.FontSize);
1721
        ReadInt(Settings.FontSize);
1679
      END;
1722
      END;
1680
      pos := File.Seek(history, pos - 8, 0)
1723
      pos := File.Seek(history, pos - 8, 0)
1681
    END
1724
    END
1682
  END;
1725
  END;
Line 1697... Line 1740...
1697
  done := FALSE;
1740
  done := FALSE;
1698
  loaded := FALSE;
1741
  loaded := FALSE;
1699
  FilePath := FName;
1742
  FilePath := FName;
1700
  FileName := FName;
1743
  FileName := FName;
1701
  S.GetPath(FilePath);
1744
  S.GetPath(FilePath);
1702
  W  := ColLeft.Width;
1745
  W  := ColLeft.width;
1703
  W1 := W;
1746
  W1 := W;
1704
  W2 := ColLeft.Width + ColRight.Width + Settings.PADDING.ColInter;
1747
  W2 := ColLeft.width + ColRight.width + Settings.PADDING.ColInter;
1705
  Lines := ColLeft.Height DIV LineH;
1748
  Lines := ColLeft.height DIV LineH;
1706
  ColLeft.Height := Lines * LineH;
1749
  ColLeft.height := Lines * LineH;
1707
  PID := SU.NewThread(Start, Stack);
1750
  PID := SU.NewThread(Start, Stack);
1708
  WHILE ~SU.IsTerminated(PID) DO
1751
  WHILE ~SU.IsTerminated(PID) DO
1709
    event := SU.CheckEvent();
1752
    event := SU.CheckEvent();
1710
    IF event = 3 THEN
1753
    IF event = 3 THEN
1711
      SU.TerminateThreadId(PID);
1754
      SU.TerminateThreadId(PID);