Module: environment-tools
Synopsis: Environment tools
Author: Andy Armstrong, Chris Page, Jason Trenouth
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
/// General protocols for environment frames
define open generic environment-frame-class-name
(frame :: ) => (name :: false-or());
define method environment-frame-class-name
(frame :: ) => (name :: false-or())
#f
end method environment-frame-class-name;
/// Environment frame
define open abstract class ()
sealed constant each-subclass slot environment-frame-class-name :: false-or() = #f,
init-keyword: frame-class-name:;
sealed slot frame-qualify-names? :: = environment-qualify-names?(),
setter: %qualify-names?-setter,
init-keyword: qualify-names?:;
sealed slot frame-popup-menu-cache :: = make();
slot frame-command-target :: false-or() = #f,
setter: %command-target-setter;
end class ;
define open abstract class
(,
)
end class ;
define open abstract class
(,
)
end class ;
define method initialize
(frame :: , #key) => ()
next-method();
frame.frame-title := generate-frame-title(frame);
// Update command enabling
command-enabled?(undo-minimize-all-frames, frame)
:= ~empty?(*minimized-frames*);
end method initialize;
define method frame-qualify-names?-setter
(qualify? :: , frame :: )
=> (qualify? :: )
frame.%qualify-names? := qualify?;
refresh-frame(frame);
qualify?
end method frame-qualify-names?-setter;
define method frame-primary-object-name
(frame :: , object :: )
=> (name :: )
frame-default-object-name(frame, object)
end method frame-primary-object-name;
/// Environment frame protocols
define open generic generate-frame-title
(frame :: ) => (title :: );
define open generic frame-current-project
(frame :: )
=> (project :: false-or());
define method generate-frame-title
(frame :: ) => (title :: )
release-product-name()
end method generate-frame-title;
define method frame-current-project
(frame :: )
=> (project :: singleton(#f))
#f;
end method frame-current-project;
define function ensure-frame-project
(frame :: )
=> (project :: )
let project = frame.frame-current-project;
assert(project, "Frame '%s' has no project", frame-title(frame));
project
end function ensure-frame-project;
define method frame-command-target-setter
(target :: false-or(), frame :: )
=> (target :: false-or())
frame.%command-target := target;
note-frame-command-target-updated(frame);
target
end method frame-command-target-setter;
define method note-frame-command-target-updated
(frame :: ) => ()
#f
end method note-frame-command-target-updated;
/// Notification protocols
define open generic frame-note-application-state-changed
(frame :: , state :: false-or())
=> ();
define open generic frame-note-application-starting
(frame :: )
=> ();
// Note: This function is called when we've finished trying to start the
// application; that is, either the application is about to "really" start
// (all initialization, breakpoint setup etc. is done) or we failed to
// start it at all. It started if
// frame.frame-project.project-application.application-closed?
// is false.
define open generic frame-note-application-starting-done
(frame :: )
=> ();
define open generic frame-note-application-threads-changed
(frame :: ) => ();
define method frame-note-application-state-changed
(frame :: , state :: false-or())
=> ()
enable-application-command-table(frame, state);
end method frame-note-application-state-changed;
define method frame-note-application-starting
(frame :: ) => ()
//---*** This doesn't deal well with multiple background operations
frame-cursor-override(frame) := #"starting"
end method frame-note-application-starting;
define method frame-note-application-starting-done
(frame :: ) => ()
//---*** This doesn't deal well with multiple background operations
frame-cursor-override(frame) := #f
end method frame-note-application-starting-done;
define method frame-note-application-threads-changed
(frame :: ) => ()
// I don't think we need to do anything in the general case.
end method frame-note-application-threads-changed;
define open generic frame-note-breakpoint-state-changed
(frame :: , breakpoint :: ,
state :: )
=> ();
define method frame-note-breakpoint-state-changed
(frame :: , breakpoint :: ,
state :: )
=> ()
#f
end method frame-note-breakpoint-state-changed;
define open generic frame-note-interaction-returned
(frame :: , thread :: , id ::