Module: duim-gadgets-internals Synopsis: DUIM gadgets Author: Scott McKay, Andy Armstrong 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 /// Tab controls define open abstract class (, , , ) // Are the tabs at the top or the bottom (tab-control or workspace?) sealed constant slot tab-control-tabs-position :: = #"top", init-keyword: tabs-position:; // The single visible sheet corresponding to the selected "tab" sealed slot tab-control-current-page :: false-or() = #f, init-keyword: current-page:, setter: %current-page-setter; // All of sheets that we can select between sealed slot tab-control-pages :: = #[], init-keyword: pages:, setter: %pages-setter; sealed slot gadget-label-key :: = gadget-label, init-keyword: label-key:; sealed slot gadget-value-key :: = tab-control-default-value-key, init-keyword: value-key:; end class ; define sealed class (, ) end class ; define method initialize (pane :: , #key value) => () next-method(); unless (tab-control-current-page(pane)) unless (empty?(tab-control-pages(pane))) pane.%current-page := tab-control-pages(pane)[0] end end end method initialize; define sealed domain make (singleton()); define sealed domain initialize (); define method tab-control-current-page-setter (child :: false-or(), pane :: ) => (child :: false-or()) pane.%current-page := child; when (child) let frame = sheet-frame(pane); when (frame & page-initial-focus(child)) frame-input-focus(frame) := page-initial-focus(child) end end; child end method tab-control-current-page-setter; define method tab-control-current-page-setter (name :: , pane :: ) => (name :: ) let child = tab-control-named-child(pane, name); if (child) tab-control-current-page(pane) := child else error("No child named %s in tab control %=", name, pane) end end method tab-control-current-page-setter; define method tab-control-pages-setter (pages :: , pane :: , #key page) => (pages :: ) let old-pages = tab-control-pages(pane); let old-page = tab-control-current-page(pane); let page = select (page by instance?) => page; otherwise => find-tab-control-page(pane, page); end | old-page; // Keep old page current if none specified let new-page = if (member?(page, pages)) page else unless (empty?(pages)) pages[0] end end; case old-pages ~= pages => pane.%pages := pages; pane.%current-page := new-page; note-pages-changed(pane); old-page ~= new-page => tab-control-current-page(pane) := new-page; end; pages end method tab-control-pages-setter; define open generic note-pages-changed (pane :: ) => (); define constant $tab-control-default-label :: = "{no-label}"; define method tab-control-labels (pane :: ) => (labels :: ) let label-key = gadget-label-key(pane); map-as(, method (gadget) label-key(gadget) | $tab-control-default-label end, tab-control-pages(pane)) end method tab-control-labels; define method tab-control-named-child (pane :: , name :: ) => (child :: false-or()) let key = position(tab-control-labels(pane), name, test: \=); when (key) tab-control-pages(pane)[key]; end end method tab-control-named-child; /// Gadget value handling define method tab-control-default-value-key (page :: ) => (value) #f end method tab-control-default-value-key; define method tab-control-default-value-key (page :: ) => (value) gadget-id(page) | gadget-label(page) end method tab-control-default-value-key; define method gadget-value (pane :: ) => (value) let page = tab-control-current-page(pane); when (page) gadget-value-key(pane)(page) end end method gadget-value; define method find-tab-control-page (pane :: , value) => (page :: false-or()) let value-key = gadget-value-key(pane); block (return) for (page in tab-control-pages(pane)) when (value-key(page) = value) return(page) end end end end method find-tab-control-page; define method do-gadget-value-setter (pane :: , value) => () let page = find-tab-control-page(pane, value); tab-control-current-page(pane) := page end method do-gadget-value-setter;