Subversion Repositories Kolibri OS

Rev

Rev 9645 | 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.   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]);
  133.       res.start_path         := sys.SADR("/rd/1/File managers/opendial");
  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
  166.   Lib := KOSAPI.LoadLib("/rd/1/Lib/Proc_lib.obj");
  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.