Module: win32-scribble Author: Scott McKay Synopsis: Win32 version of the DUIM scribble application Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND /// Simple scribble application define class () slot scribble-segment = #f; constant slot scribble-segments = make(); constant slot scribble-popup-menu-callback = #f, init-keyword: popup-menu-callback:; end class ; define method draw-segment (medium :: , segment :: ) => () draw-polygon(medium, segment, closed?: #f, filled?: #f) end method draw-segment; // Draw the scribble as several unconnected polylines define method handle-repaint (sheet :: , medium :: , region :: ) => () ignore(region); for (segment in sheet.scribble-segments) draw-segment(medium, segment) end end method handle-repaint; define method handle-button-event (sheet :: , event :: , button == $left-button) => () sheet.scribble-segment := make(); add-scribble-segment(sheet, event.event-x, event.event-y) end method handle-button-event; define method handle-button-event (sheet :: , event :: , button == $left-button) => () add-scribble-segment(sheet, event.event-x, event.event-y) end method handle-button-event; define method handle-button-event (sheet :: , event :: , button == $left-button) => () when (add-scribble-segment(sheet, event.event-x, event.event-y)) add!(sheet.scribble-segments, sheet.scribble-segment) end; sheet.scribble-segment := #f end method handle-button-event; define method handle-button-event (sheet :: , event :: , button == $right-button) => () let popup-menu-callback = scribble-popup-menu-callback(sheet); when (popup-menu-callback) popup-menu-callback(sheet, event.event-x, event.event-y) end end method handle-button-event; define method add-scribble-segment (sheet :: , x, y) => (did-it? :: ) let segment = sheet.scribble-segment; // The app can generate drag and release events before it has ever // seen a press event, so be careful when (segment) add!(segment, x); add!(segment, y); draw-segment(sheet-medium(sheet), segment); #t end end method add-scribble-segment; define method clear-surface (sheet :: ) => () sheet.scribble-segments.size := 0; clear-box*(sheet, sheet-region(sheet)) end method clear-surface; /// A top-level frame define frame () pane surface (frame) make(, popup-menu-callback: method (sheet, x, y) let frame = sheet-frame(sheet); popup-scribble-menu(frame, x, y) end, width: 300, max-width: $fill, height: 200, max-height: $fill); pane print-menu-box (frame) make(, children: vector(make(, label: "Page Setup...", activate-callback: method (button) scribble-page-setup(frame) end), make(, label: "Print...", activate-callback: method (button) scribble-print(frame) end))); pane file-menu (frame) make(, label: "File", children: vector(make(, label: "Clear", activate-callback: method (button) clear-surface(frame.surface) end), frame.print-menu-box, make(, label: "Exit", activate-callback: method (button) exit-frame(sheet-frame(button)) end))); pane scribble-popup-menu (frame) make(, owner: frame.surface, children: vector(make(, label: "&Clear", activate-callback: method (button) ignore(button); clear-surface(frame.surface) end))); layout (frame) frame.surface; menu-bar (frame) make(, children: vector(frame.file-menu)); end frame ; define method popup-scribble-menu (frame :: , x :: , y :: ) => () let menu = frame.scribble-popup-menu; display-menu(menu, x: x, y: y) end method popup-scribble-menu;