Преглед на файлове

Cancel of window closing

Arthur Yefimov преди 3 години
родител
ревизия
e10bf592d6
променени са 2 файла, в които са добавени 35 реда и са изтрити 16 реда
  1. 8 1
      src/Editor.Mod
  2. 27 15
      src/OV.Mod

+ 8 - 1
src/Editor.Mod

@@ -968,6 +968,12 @@ BEGIN
   END
   END
 END EditorTextInput;
 END EditorTextInput;
 
 
+PROCEDURE EditorClose*(c: OV.Control; VAR cancel: BOOLEAN);
+VAR E: Editor;
+BEGIN E := c(Editor);
+  (*IF E.text.changed THEN cancel := TRUE END*) (*!TODO Ask*)
+END EditorClose;
+
 PROCEDURE EditorKeyDown*(c: OV.Control; key: G.Key);
 PROCEDURE EditorKeyDown*(c: OV.Control; key: G.Key);
 BEGIN OV.WindowKeyDown(c, key);
 BEGIN OV.WindowKeyDown(c, key);
   CASE key.code OF
   CASE key.code OF
@@ -1013,7 +1019,8 @@ BEGIN OV.InitWindowMethod(m);
   m.mouseUp := EditorMouseUp;
   m.mouseUp := EditorMouseUp;
   m.mouseMove := EditorMouseMove;
   m.mouseMove := EditorMouseMove;
   m.keyDown := EditorKeyDown;
   m.keyDown := EditorKeyDown;
-  m.textInput := EditorTextInput
+  m.textInput := EditorTextInput;
+  m.close := EditorClose
 END InitEditorMethod;
 END InitEditorMethod;
 
 
 BEGIN
 BEGIN

+ 27 - 15
src/OV.Mod

@@ -607,7 +607,8 @@ TYPE
     lostFocus*: PROCEDURE (c: Control);
     lostFocus*: PROCEDURE (c: Control);
     mouseMove*: PROCEDURE (c: Control; x, y: INTEGER; buttons: SET);
     mouseMove*: PROCEDURE (c: Control; x, y: INTEGER; buttons: SET);
     mouseDown*: PROCEDURE (c: Control; x, y, button: INTEGER);
     mouseDown*: PROCEDURE (c: Control; x, y, button: INTEGER);
-    mouseUp*: PROCEDURE (c: Control; x, y, button: INTEGER)
+    mouseUp*: PROCEDURE (c: Control; x, y, button: INTEGER);
+    close*: PROCEDURE (c: Control; VAR cancel: BOOLEAN)
   END;
   END;
 
 
   Menu* = POINTER TO MenuDesc;
   Menu* = POINTER TO MenuDesc;
@@ -1050,7 +1051,8 @@ BEGIN
   m.lostFocus := ControlLostFocus;
   m.lostFocus := ControlLostFocus;
   m.mouseMove := ControlMouseMove;
   m.mouseMove := ControlMouseMove;
   m.mouseDown := ControlMouseDown;
   m.mouseDown := ControlMouseDown;
-  m.mouseUp := ControlMouseUp
+  m.mouseUp := ControlMouseUp;
+  m.close := NIL
 END InitControlMethod;
 END InitControlMethod;
 
 
 (* Menu *)
 (* Menu *)
@@ -2028,23 +2030,33 @@ BEGIN w := c.app.windows(Window);
   END
   END
 END ZoomCurWindow;
 END ZoomCurWindow;
 
 
-PROCEDURE CloseCurWindow*(c: Control);
-BEGIN
-  IF c.app.windows # NIL THEN
-    IF c.app.windows.next = c.app.windows THEN c.app.windows := NIL
-    ELSE
-      c.app.windows.prev.next := c.app.windows.next;
-      c.app.windows.next.prev := c.app.windows.prev;
-      c.app.windows := c.app.windows.prev(Window)
-    END;
-    SetAppFocus(c.app, c.app.windows);
-    NeedRedraw(c.app)
+PROCEDURE CloseCurWindowEx*(c: Control; VAR cancel: BOOLEAN);
+VAR w: Window;
+BEGIN w := c.app.windows; cancel := FALSE;
+  IF w # NIL THEN
+    IF w.do.close # NIL THEN w.do.close(w, cancel) END;
+    IF ~cancel THEN
+      IF w.next = w THEN c.app.windows := NIL
+      ELSE
+        w.prev.next := w.next;
+        w.next.prev := w.prev;
+        c.app.windows := w.prev(Window)
+      END;
+      SetAppFocus(c.app, c.app.windows);
+      NeedRedraw(c.app)
+    END
   END
   END
+END CloseCurWindowEx;
+
+PROCEDURE CloseCurWindow*(c: Control);
+VAR cancel: BOOLEAN;
+BEGIN CloseCurWindowEx(c, cancel)
 END CloseCurWindow;
 END CloseCurWindow;
 
 
 PROCEDURE CloseAllWindows*(c: Control);
 PROCEDURE CloseAllWindows*(c: Control);
-BEGIN
-  WHILE c.app.windows # NIL DO CloseCurWindow(c) END
+VAR cancel: BOOLEAN;
+BEGIN cancel := FALSE;
+  WHILE ~cancel & (c.app.windows # NIL) DO CloseCurWindowEx(c, cancel) END
 END CloseAllWindows;
 END CloseAllWindows;
 
 
 PROCEDURE RefreshDisplay*(c: Control);
 PROCEDURE RefreshDisplay*(c: Control);