Subversion Repositories Kolibri OS

Rev

Rev 8097 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2016, 2018, 2020, 2021 Anton Krotov
  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 <http://www.gnu.org/licenses/>.
  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.   TDialog = RECORD
  32.     _type*,
  33.     procinfo,
  34.     com_area_name,
  35.     com_area,
  36.     opendir_path,
  37.     dir_default_path,
  38.     start_path: INTEGER;
  39.     draw_window: DRAW_WINDOW;
  40.     status*,
  41.     openfile_path,
  42.     filename_area: INTEGER;
  43.     filter_area:
  44.       POINTER TO RECORD
  45.         size: INTEGER;
  46.         filter: ARRAY 4096 OF CHAR
  47.       END;
  48.     X, Y: INTEGER;
  49.  
  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.  
  65. PROCEDURE Show*(od: Dialog; Width, Height: INTEGER);
  66. BEGIN
  67.   IF od # NIL THEN
  68.     od.X := Width;
  69.     od.Y := Height;
  70.     Dialog_start(od)
  71.   END
  72. END Show;
  73.  
  74. PROCEDURE Create*(draw_window: DRAW_WINDOW; _type: INTEGER; def_path, filter: ARRAY OF CHAR): Dialog;
  75. VAR res: Dialog; n, i: INTEGER;
  76.  
  77.   PROCEDURE replace(VAR str: ARRAY OF CHAR; c1, c2: CHAR);
  78.   VAR i: INTEGER;
  79.   BEGIN
  80.     i := LENGTH(str) - 1;
  81.     WHILE i >= 0 DO
  82.       IF str[i] = c1 THEN
  83.         str[i] := c2
  84.       END;
  85.       DEC(i)
  86.     END
  87.   END replace;
  88.  
  89. BEGIN
  90.   NEW(res);
  91.   IF res # NIL THEN
  92.     NEW(res.filter_area);
  93.     IF res.filter_area # NIL THEN
  94.       res.s_com_area_name    := "FFFFFFFF_open_dialog";
  95.       res.com_area           := 0;
  96.       res._type              := _type;
  97.       res.draw_window        := draw_window;
  98.       COPY(def_path, res.s_dir_default_path);
  99.       COPY(filter,   res.filter_area.filter);
  100.  
  101.       n := LENGTH(res.filter_area.filter);
  102.       FOR i := 0 TO 3 DO
  103.         res.filter_area.filter[n + i] := "|"
  104.       END;
  105.       res.filter_area.filter[n + 4] := 0X;
  106.  
  107.       res.X                  := 0;
  108.       res.Y                  := 0;
  109.       res.s_opendir_path     := res.s_dir_default_path;
  110.       res.FilePath           := "";
  111.       res.FileName           := "";
  112.       res.status             := 0;
  113.       res.filter_area.size   := LENGTH(res.filter_area.filter);
  114.       res.procinfo           := sys.ADR(res.procinf[0]);
  115.       res.com_area_name      := sys.ADR(res.s_com_area_name[0]);
  116.       res.start_path         := sys.SADR("/rd/1/File managers/opendial");
  117.       res.opendir_path       := sys.ADR(res.s_opendir_path[0]);
  118.       res.dir_default_path   := sys.ADR(res.s_dir_default_path[0]);
  119.       res.openfile_path      := sys.ADR(res.FilePath[0]);
  120.       res.filename_area      := sys.ADR(res.FileName[0]);
  121.  
  122.       replace(res.filter_area.filter, "|", 0X);
  123.       Dialog_init(res)
  124.     ELSE
  125.       DISPOSE(res)
  126.     END
  127.   END
  128.   RETURN res
  129. END Create;
  130.  
  131. PROCEDURE Destroy*(VAR od: Dialog);
  132. BEGIN
  133.   IF od # NIL THEN
  134.     DISPOSE(od.filter_area);
  135.     DISPOSE(od)
  136.   END
  137. END Destroy;
  138.  
  139. PROCEDURE Load;
  140. VAR Lib: INTEGER;
  141.  
  142.   PROCEDURE GetProc(Lib, v: INTEGER; name: ARRAY OF CHAR);
  143.   VAR a: INTEGER;
  144.   BEGIN
  145.     a := KOSAPI.GetProcAdr(name, Lib);
  146.     ASSERT(a # 0);
  147.     sys.PUT(v, a)
  148.   END GetProc;
  149.  
  150. BEGIN
  151.   Lib := KOSAPI.LoadLib("/rd/1/Lib/Proc_lib.obj");
  152.   GetProc(Lib, sys.ADR(Dialog_init),  "OpenDialog_init");
  153.   GetProc(Lib, sys.ADR(Dialog_start), "OpenDialog_start");
  154. END Load;
  155.  
  156. BEGIN
  157.   Load
  158. END OpenDlg.