224 lines
5.3 KiB
Plaintext
224 lines
5.3 KiB
Plaintext
note
|
|
description: "[
|
|
Root class for an application built using the "jj_vision" classes
|
|
]"
|
|
date: "19 Jul 03"
|
|
author: "Jimmy J. Johnson"
|
|
copyright: "Copyright 2012, Jimmy J. Johnson"
|
|
license: "Eiffel Forum License v2 (see forum.txt)"
|
|
date: "$Date: 2015-10-24 07:32:40 -0700 (Sat, 24 Oct 2015) $"
|
|
revision: "$Revision: 23 $"
|
|
|
|
class
|
|
JJ_APPLICATION
|
|
|
|
inherit
|
|
|
|
SHARED
|
|
export
|
|
{NONE}
|
|
all
|
|
-- {ANY}
|
|
-- persistence_manager
|
|
undefine
|
|
default_create,
|
|
copy
|
|
end
|
|
|
|
EV_APPLICATION
|
|
redefine
|
|
create_interface_objects,
|
|
destroy
|
|
end
|
|
|
|
create
|
|
make_and_launch
|
|
|
|
feature {NONE} -- Initialization
|
|
|
|
make_and_launch
|
|
-- Initialize and launch application
|
|
local
|
|
-- l_app: EV_APPLICATION
|
|
do
|
|
-- -- The use of `l_app' instead of inheritance is the style
|
|
-- -- used by the wizard in version 23.09.
|
|
-- create l_app
|
|
-- prepare
|
|
-- -- The next instruction launches GUI message processing.
|
|
-- -- It should be the last instruction of a creation procedure
|
|
-- -- that initializes GUI objects. Any other processing should
|
|
-- -- be done either by agents associated with GUI elements
|
|
-- -- or in a separate processor.
|
|
-- l_app.launch
|
|
-- -- No code should appear here,
|
|
-- -- otherwise GUI message processing will be stuck in SCOOP mode.
|
|
print ("JJ_APPLICATION.make_and_launch %N")
|
|
default_create
|
|
prepare
|
|
launch
|
|
print ("%T end JJ_APPLICATION.make_and_launch %N")
|
|
end
|
|
|
|
create_interface_objects
|
|
-- Set up the attribute
|
|
do
|
|
Precursor {EV_APPLICATION}
|
|
create target
|
|
end
|
|
|
|
prepare
|
|
-- Prepare the application by either loading it from a previous
|
|
-- execution or create a new one if an old one doesn't exist.
|
|
local
|
|
w: like first_window
|
|
do
|
|
print ("JJ_APPLICATION.prepare %N")
|
|
-- initialize_directories
|
|
-- rebuild_application
|
|
if not is_application_loaded then
|
|
print (" JJ_APPLICATION.prepare begin if statement %N")
|
|
create w.make (target)
|
|
print (" JJ_APPLICATION.prepare after create w %N")
|
|
w.show
|
|
print (" JJ_APPLICATION.prepare after w.show %N")
|
|
end
|
|
print ("%T end JJ_APPLICATION.prepare %N")
|
|
end
|
|
|
|
destroy
|
|
-- Save the state of all main_windows and end the application.
|
|
do
|
|
-- save_system_state
|
|
Precursor {EV_APPLICATION}
|
|
end
|
|
|
|
initialize_directories
|
|
-- Set up the datastores for the system info.
|
|
local
|
|
d: DIRECTORY
|
|
do
|
|
create d.make (Default_data_path.name)
|
|
if not d.exists then
|
|
d.create_dir
|
|
end
|
|
create d.make (Default_settings_path.name)
|
|
if not d.exists then
|
|
d.create_dir
|
|
end
|
|
end
|
|
|
|
feature -- Access
|
|
|
|
target: ANY
|
|
-- The top/main object handled by this application
|
|
|
|
frozen first_window: like window_anchor
|
|
-- Anchor to describe the type of the windows in the program.
|
|
require
|
|
has_at_least_one_window: has_windows
|
|
do
|
|
check attached {like window_anchor} main_windows.first as w then
|
|
Result := w
|
|
end
|
|
ensure
|
|
result_exists: Result /= Void
|
|
end
|
|
|
|
-- command_manager: COMMAND_MANAGER is
|
|
-- -- Manages the COMMAND's called by the application to allow undo/redo capabilities.
|
|
-- once
|
|
-- create Result
|
|
-- end
|
|
|
|
application_state: APPLICATION_STATE
|
|
-- The state of the application.
|
|
do
|
|
create Result
|
|
end
|
|
|
|
feature -- Status report
|
|
|
|
has_windows: BOOLEAN
|
|
-- Does at least one window exist in the application?
|
|
do
|
|
Result := not main_windows.is_empty
|
|
end
|
|
|
|
feature -- Basic operations
|
|
|
|
rebuild_application
|
|
-- Rebuild the windows as they were on the last application exit.
|
|
local
|
|
f: RAW_FILE
|
|
a: ANY
|
|
do
|
|
-- Attempt to read the `application_state' from the disk in order
|
|
-- to begin this execution where the last one left off.
|
|
create f.make (merged_file_name (Default_settings_path.name.as_string_8, "Application_State"))
|
|
if f.exists and then f.is_readable then
|
|
f.open_read
|
|
if f.is_readable then
|
|
if attached {like application_state} f.retrieved as app_state then
|
|
-- Force a call to `widget' causing the creation of new windows.
|
|
a := app_state.view
|
|
is_application_loaded := True
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
save_system_state
|
|
-- Save the state of the system for restoration on next execution.
|
|
local
|
|
dn: STRING_32
|
|
fn: STRING
|
|
d: DIRECTORY
|
|
f: RAW_FILE
|
|
do
|
|
dn := Default_settings_path.name
|
|
create d.make (dn)
|
|
if not d.exists then
|
|
d.recursive_create_dir
|
|
end
|
|
fn := merged_file_name (Default_settings_path.name.as_string_8, "Application_State")
|
|
-- fn := "Application_state"
|
|
create f.make (fn)
|
|
if f.exists then
|
|
f.wipe_out
|
|
-- else
|
|
-- f.create_read_write
|
|
end
|
|
f.create_read_write
|
|
f.general_store (application_state)
|
|
f.close
|
|
end
|
|
|
|
feature {NONE} -- Implementation
|
|
|
|
is_application_loaded: BOOLEAN
|
|
-- Was the last application state retrieved from a persistent file and
|
|
-- now ready to be used to initialize the application?
|
|
-- Set by `load_application_state'.
|
|
|
|
Default_application_state_name: STRING = "Application State"
|
|
-- To be used as file name of file containing the `state'.
|
|
|
|
feature {NONE} -- Implementation (anchors)
|
|
|
|
window_anchor: JJ_MAIN_WINDOW
|
|
-- Anchor for the type of `first_window'
|
|
-- Not to be called; just used to anchor types.
|
|
-- Declared as a feature to avoid adding an attribute.
|
|
require else
|
|
not_callable: False
|
|
do
|
|
check
|
|
do_not_call: False then
|
|
-- Because give no info; simply used as anchor.
|
|
end
|
|
end
|
|
|
|
end
|
|
|