Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
8728 leency 1
(*
9577 akron1 2
    Copyright 2016, 2018, 2020-2022 Anton Krotov
8728 leency 3
 
4
    This program is free software: you can redistribute it and/or modify
5
    it under the terms of the GNU Lesser General Public License as published by
6
    the Free Software Foundation, either version 3 of the License, or
7
    (at your option) any later version.
8
 
9
    This program is distributed in the hope that it will be useful,
10
    but WITHOUT ANY WARRANTY; without even the implied warranty of
11
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
    GNU Lesser General Public License for more details.
13
 
14
    You should have received a copy of the GNU Lesser General Public License
15
    along with this program.  If not, see .
16
*)
17
 
18
MODULE OpenDlg;
19
 
20
IMPORT sys := SYSTEM, KOSAPI;
21
 
22
CONST
23
  topen* = 0;
24
  tsave* = 1;
25
  tdir* = 2;
26
 
27
TYPE
28
 
29
  DRAW_WINDOW = PROCEDURE;
30
 
31
  tFilterArea = POINTER TO RECORD
32
      size: INTEGER;
33
      filter: ARRAY 4096 OF CHAR
34
  END;
35
 
36
  TDialog = RECORD
37
    _type*,
38
    procinfo,
39
    com_area_name,
40
    com_area,
41
    opendir_path,
42
    dir_default_path,
43
    start_path: INTEGER;
44
    draw_window: DRAW_WINDOW;
45
    status*,
46
    openfile_path,
47
    filename_area: INTEGER;
48
    filter_area: tFilterArea;
49
    X, Y: INTEGER;
50
    procinf: ARRAY 1024 OF CHAR;
51
    s_com_area_name: ARRAY 32 OF CHAR;
52
    s_opendir_path,
53
    s_dir_default_path,
54
    FilePath*,
55
    FileName*: ARRAY 4096 OF CHAR
56
  END;
57
 
58
  Dialog* = POINTER TO TDialog;
59
 
60
VAR
61
 
62
  Dialog_start, Dialog_init: PROCEDURE [stdcall] (od: Dialog);
63
 
64
  filter_area: tFilterArea;
65
 
66
 
67
PROCEDURE Show*(od: Dialog; Width, Height: INTEGER);
68
BEGIN
69
  IF od # NIL THEN
70
    od.X := Width;
71
    od.Y := Height;
72
    Dialog_start(od)
73
  END
74
END Show;
75
 
76
 
77
PROCEDURE replace (VAR str: ARRAY OF CHAR; c1, c2: CHAR);
78
VAR
79
    i: INTEGER;
80
BEGIN
81
    i := LENGTH(str) - 1;
82
    WHILE i >= 0 DO
83
        IF str[i] = c1 THEN
84
            str[i] := c2
85
        END;
86
        DEC(i)
87
    END
88
END replace;
89
 
90
 
91
PROCEDURE SetFilter* (dlg: Dialog; filter: ARRAY OF CHAR);
92
VAR
93
    n, i: INTEGER;
94
BEGIN
95
    IF filter = "" THEN
96
        dlg.filter_area := NIL
97
    ELSE
98
        dlg.filter_area := filter_area;
99
        filter_area.filter := filter;
100
        n := LENGTH(filter_area.filter);
101
        FOR i := 0 TO 3 DO
102
            filter_area.filter[n + i] := "|"
103
        END;
104
        filter_area.filter[n + 4] := 0X;
105
        filter_area.size := LENGTH(filter_area.filter);
106
        replace(filter_area.filter, "|", 0X)
107
    END
108
END SetFilter;
109
 
110
 
111
PROCEDURE Create*(draw_window: DRAW_WINDOW; _type: INTEGER; def_path, filter: ARRAY OF CHAR): Dialog;
112
VAR res: Dialog;
113
BEGIN
114
  NEW(res);
115
  IF res # NIL THEN
116
    NEW(filter_area);
117
    IF filter_area # NIL THEN
118
      res.filter_area := filter_area;
119
      res.s_com_area_name    := "FFFFFFFF_open_dialog";
120
      res.com_area           := 0;
121
      res._type              := _type;
122
      res.draw_window        := draw_window;
123
      COPY(def_path, res.s_dir_default_path);
124
      SetFilter(res, filter);
125
      res.X                  := 0;
126
      res.Y                  := 0;
127
      res.s_opendir_path     := res.s_dir_default_path;
128
      res.FilePath           := "";
129
      res.FileName           := "";
130
      res.status             := 0;
131
      res.procinfo           := sys.ADR(res.procinf[0]);
132
      res.com_area_name      := sys.ADR(res.s_com_area_name[0]);
9577 akron1 133
      res.start_path         := sys.SADR("/sys/File managers/opendial");
8728 leency 134
      res.opendir_path       := sys.ADR(res.s_opendir_path[0]);
135
      res.dir_default_path   := sys.ADR(res.s_dir_default_path[0]);
136
      res.openfile_path      := sys.ADR(res.FilePath[0]);
137
      res.filename_area      := sys.ADR(res.FileName[0]);
138
      Dialog_init(res)
139
    ELSE
140
      DISPOSE(res)
141
    END
142
  END
143
  RETURN res
144
END Create;
145
 
146
PROCEDURE Destroy*(VAR od: Dialog);
147
BEGIN
148
  IF od # NIL THEN
149
    DISPOSE(od.filter_area);
150
    DISPOSE(od)
151
  END
152
END Destroy;
153
 
154
PROCEDURE Load;
155
VAR Lib: INTEGER;
156
 
157
  PROCEDURE GetProc(Lib, v: INTEGER; name: ARRAY OF CHAR);
158
  VAR a: INTEGER;
159
  BEGIN
160
    a := KOSAPI.GetProcAdr(name, Lib);
161
    ASSERT(a # 0);
162
    sys.PUT(v, a)
163
  END GetProc;
164
 
165
BEGIN
9577 akron1 166
  Lib := KOSAPI.LoadLib("/sys/Lib/Proc_lib.obj");
8728 leency 167
  GetProc(Lib, sys.ADR(Dialog_init),  "OpenDialog_init");
168
  GetProc(Lib, sys.ADR(Dialog_start), "OpenDialog_start");
169
END Load;
170
 
171
BEGIN
172
  Load
173
END OpenDlg.