Module: duim-sheets-internals Synopsis: DUIM sheets 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 /// Clipboard define constant = type-union(, ); define protocol <> () function open-clipboard (port :: , sheet :: ) => (clipboard :: false-or()); function close-clipboard (port :: , clipboard :: ) => (); getter clipboard-sheet (clipboard :: ) => (sheet :: ); getter clipboard-owner (clipboard :: ) => (owner :: false-or()); function add-clipboard-data (clipboard :: , data) => (success? :: ); function add-clipboard-data-as (type :: , clipboard :: , data) => (success? :: ); function clear-clipboard (clipboard :: ) => (); function maybe-clear-clipboard (clipboard :: ) => (); function clipboard-data-available? (type :: , clipboard :: ) => (available? :: ); function get-clipboard-data-as (type :: , clipboard :: ) => (data); end protocol <>; // Note that the variable clipboard will be #f if we fail to get the clipboard define macro with-clipboard { with-clipboard (?clipboard:name = ?sheet:expression) ?:body end } => { begin let ?clipboard = open-clipboard(port(?sheet), ?sheet); block () ?body cleanup when (?clipboard) close-clipboard(port(?sheet), ?clipboard) end end end } end macro with-clipboard; /// Default clipboard support define function clipboard-format-error (type :: ) error("Unrecognized clipboard format %=", type) end function clipboard-format-error; define method add-clipboard-data-as (type :: , clipboard :: , object) => (success? :: ) clipboard-format-error(type) end method add-clipboard-data-as; define method clipboard-data-available? (type :: , clipboard :: ) => (available? :: ) clipboard-format-error(type) end method clipboard-data-available?; define method get-clipboard-data-as (type :: , clipboard :: ) => (data) clipboard-format-error(type) end method get-clipboard-data-as; /// Clipboard support for strings // Note: backends do most of the work here define method add-clipboard-data (clipboard :: , string :: ) => (success? :: ) add-clipboard-data-as(, clipboard, string) end method add-clipboard-data; /// Clipboard support for Dylan objects define variable *dylan-clipboard-owner* :: false-or() = #f; define variable *dylan-clipboard-value* :: = #f; define method add-clipboard-data (clipboard :: , object :: ) => (success? :: ) add-clipboard-data-as(, clipboard, object) end method add-clipboard-data; define method add-clipboard-data-as (type == , clipboard :: , object :: ) => (success? :: ) maybe-clear-clipboard(clipboard); *dylan-clipboard-owner* := clipboard-sheet(clipboard); *dylan-clipboard-value* := object; #t end method add-clipboard-data-as; define method clipboard-data-available? (type == , clipboard :: ) => (available? :: ) clipboard-owner(clipboard) == *dylan-clipboard-owner* end method clipboard-data-available?; define method get-clipboard-data-as (type == , clipboard :: ) => (object :: ) clipboard-data-available?(type, clipboard) & *dylan-clipboard-value* end method get-clipboard-data-as; define method clear-clipboard (clipboard :: ) => () *dylan-clipboard-owner* := #f; *dylan-clipboard-value* := #f; end method clear-clipboard;