Module: CAPI-DUIM Synopsis: CAPI back-end Author: Andy Armstrong, Scott McKay 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 /// Menu handling define sealed class () end class ; define method mirror-edges (_port :: , sheet :: , mirror) => (left :: , top :: , right :: , bottom :: ) values(0, 0, 100, 100) end method mirror-edges; define method set-mirror-edges (_port :: , sheet :: , mirror, left :: , top :: , right :: , bottom :: ) => () //--- Do nothing! #f end method set-mirror-edges; /// menu handling define sealed class (, , , ) end class ; define method repaint-within-parent (menu-bar :: , #key clear? = #t) => () ignore(clear?); #f end method repaint-within-parent; define method class-for-make-pane (framem :: , class == , #key) => (class :: , options :: false-or()) values(, #f) end method class-for-make-pane; define method do-compose-space (sheet :: , #key width, height) => (space-req :: ) ignore(width, height); let top-sheet = top-level-sheet(sheet); if (top-sheet) let interface = sheet-mirror(top-sheet); let rep = ensure-representation(interface); let width = width-menu-bar(rep); let height = height-menu-bar(rep); make(, width: width, height: height) else warn("'compose-space' called on unattached menu-bar %=", sheet); default-space-requirement(sheet) end end method do-compose-space; define sealed class (, , , ) end class ; define method do-compose-space (sheet :: , #key width, height) => (space-req :: ) ignore(width, height); warn("Trying to call 'compose-space' on a menu-pane %=", sheet); default-space-requirement(sheet) end method do-compose-space; define method class-for-make-pane (framem :: , class == , #key) => (class :: , options :: false-or()) values(, #f) end method class-for-make-pane; define method mirror-popup-menu-callback (#rest args) => () format-out("%=", args) end method mirror-popup-menu-callback; define method do-make-mirror (_port :: , sheet :: ) // Owner will be #f for a non-popup menu... let owner = menu-owner(sheet); let top-sheet = owner & top-level-sheet(owner); let interface = top-sheet & sheet-mirror(top-sheet); when (interface & ~instance?(interface, )) error("Non-interface %= as owner for popup menu %=", interface, sheet) end; let (label, mnemonic, index) = compute-mnemonic-from-label(sheet, gadget-label(sheet), remove-ampersand?: #t); ignore(mnemonic, index); make-capi-mirror(_port, sheet, , title: label | if (owner) #() else "Untitled" end, interface: interface, popup-menu-callback: mirror-popup-menu-callback, menu-interface: interface) end method do-make-mirror; define method remove-capi-mirror (sub-menu :: , menu :: ) menu-items(menu) := remove(menu-items(menu), sub-menu) end method remove-capi-mirror; define method remove-capi-mirror (menu :: , interface :: ) interface-menu-bar-items(interface) := remove(interface-menu-bar-items(interface), menu) end method remove-capi-mirror; define method destroy-mirror (_port :: , menu :: , mirror) => () remove-capi-mirror(mirror, element-parent(mirror)); sheet-direct-mirror(menu) := #f end method destroy-mirror; define method update-capi-gadget-enabled-state (gadget :: , state) let mirror = sheet-mirror(gadget); when (mirror) menu-object-enabled(mirror) := state | #() end end method update-capi-gadget-enabled-state; define open abstract class (, ) end class ; define sealed class (, ) end class ; define method capi-mirror-value (mirror :: ) lisp-true?(item-selected(mirror)) end method capi-mirror-value; define method update-capi-gadget-enabled-state (gadget :: , state) let mirror = sheet-mirror(gadget); if (mirror) menu-object-enabled(mirror) := state | #() end end method update-capi-gadget-enabled-state; define sealed class (, , ) end class ; define method sheet-primary-callback (sheet :: ) distribute-activate-callback(sheet) end method sheet-primary-callback; define method class-for-make-pane (framem :: , class == , #key) => (class :: , options :: false-or()) values(, #f) end method class-for-make-pane; define method do-make-mirror (_port :: , sheet :: ) let (text, image, mnemonic) = text-or-image-from-gadget-label(sheet); let parent = capi-mirror-parent(sheet); let mirror = make-capi-mirror(_port, sheet, , selected: gadget-value(sheet) | #(), text: text, callback-type: item:, callback: mirror-primary-callback); select (parent by instance?) => menu-items(parent) := concatenate(menu-items(parent), list(mirror)); => collection-items(parent) := concatenate(collection-items(parent), list(mirror)); end; mirror end method do-make-mirror; define method destroy-mirror (_port :: , button :: , mirror) => () let parent = capi-mirror-parent(sheet-parent(button)); select (parent by instance?) => menu-items(parent) := remove!(menu-items(parent), mirror); => collection-items(parent) := remove!(collection-items(parent), mirror); end; sheet-direct-mirror(button) := #f end method destroy-mirror; define sealed class (, , ) end class ; define method sheet-primary-callback (gadget :: ) let value = capi-new-mirror-value(sheet-direct-mirror(gadget)); distribute-value-changed-callback(gadget, value) end method sheet-primary-callback; define method class-for-make-pane (framem :: , class == , #key) => (class :: , options :: false-or()) values(, #f) end method class-for-make-pane; define sealed class (, , ) end class ; define method sheet-primary-callback (gadget :: ) let value = capi-new-mirror-value(sheet-direct-mirror(gadget)); distribute-value-changed-callback(gadget, value) end method sheet-primary-callback; define method class-for-make-pane (framem :: , class == , #key) => (class :: , options :: false-or()) values(, #f) end method class-for-make-pane; define open abstract class () end class ; define method do-compose-space (sheet :: , #key width, height) => (space-req :: ) ignore(width, height); warn("Trying to call 'compose-space' on a menu-box %=", sheet); default-space-requirement(sheet) end method do-compose-space; define sealed class (, ) end class ; define method class-for-make-pane (framem :: , class == , #key) => (class :: , options :: false-or()) values(, #f) end method class-for-make-pane; define method capi-selection-mode (gadget :: ) select (gadget-selection-mode(gadget)) #"multiple" => multiple-selection:; otherwise => next-method(); end end method capi-selection-mode; define method do-make-mirror (_port :: , sheet :: ) make-capi-mirror(_port, sheet, , interaction: capi-selection-mode(sheet)); end method do-make-mirror; // Same as define sealed class (, ) end class ; define method class-for-make-pane (framem :: , class == , #key) => (class :: , options :: false-or()) values(, #f) end method class-for-make-pane; // Same as define sealed class (, ) end class ; define method class-for-make-pane (framem :: , class == , #key) => (class :: , options :: false-or()) values(, #f) end method class-for-make-pane; /// Popup menus define method map-mirror (_port :: , menu :: , mirror) => () ignore(mirror); // That is, 'sheet-mapped?-setter' on a pop-up menu pops up the menu! when (menu-owner(menu)) popup-capi-menu-pane(menu); end end method map-mirror; define method do-choose-from-menu (framem :: , owner :: , menu :: , #key title, value, label-key, value-key, width, height, foreground, background, text-style, multiple-sets?) => (value, success? :: ) ignore(value, multiple-sets?, label-key, value-key, width, height); menu-owner(menu) := owner; unless (sheet-attached?(menu)) add-child(display(owner), menu) // ensure the menu is attached end; let selected-button = popup-capi-menu-pane(menu); values(selected-button & button-gadget-value(selected-button), selected-button & #t) end method do-choose-from-menu; define method popup-capi-menu-pane (menu :: ) let owner = menu-owner(menu); let owner = if (frame?(owner)) top-level-sheet(owner) else owner end; let mirror = sheet-mirror(menu); let item-mirror = display-popup-menu(mirror, owner: sheet-mirror(owner)); when (instance?(item-mirror, )) mirror-sheet(item-mirror) end end method popup-capi-menu-pane;