19928/jj_vision/unfinished/jj_tree_view.e

237 lines
4.5 KiB
Plaintext
Raw Permalink Normal View History

2024-06-17 07:09:33 +00:00
note
description: "[
Hierachical screen representation of VIEWABLE_NODEs.
]"
author: "Jimmy J. Johnson"
date: "21 Apr 06"
class
JJ_TREE_VIEW
inherit
EV_TREE
redefine
initialize,
item,
selected_item,
destroy,
is_destroyed
end
VIEW
undefine
-- default_create,
copy,
is_equal
redefine
initialize,
target,
set_target,
draw,
parent_tool,
destroy,
is_destroyed
end
create
default_create
feature {NONE} -- Initialization
initialize
-- Set up the object
do
create item_list.make
Precursor {VIEW}
Precursor {EV_TREE}
-- The tree is really just a root node, therefore there is only
-- one `target' in this VIEW, and the sub-nodes are themselves VIEWs
-- containing its own object.
set_actions
end
set_actions
-- Add actions to the widgets.
do
drop_actions.extend (agent on_drop_target)
end
feature -- Access
target: NODE
-- The object this view will display.
selected_item: JJ_NODE_ITEM
-- Currently selected item at any level within tree hierarchy.
do
Result ?= Precursor {EV_TREE}
end
selected_target: like target
-- The object (data) in the `selected_item'
require
target_exists: target /= Void
do
if selected_item /= Void then
Result := selected_item.target
else
Result := target
end
ensure
result_exists: Result /= Void
no_item_selected_result: selected_item = Void implies Result = target
end
item: JJ_NODE_ITEM
-- Current item (node) in the tree.
do
Result ?= Precursor {EV_TREE}
end
parent_tool: JJ_TREE_TOOL
-- The JJ_TREE_TOOL which contains this view.
-- Can not be Void.
do
Result ?= Precursor {VIEW}
ensure then
result_exists: Result /= Void
end
feature -- Element change
set_target (a_target: like target)
-- Change the value of `target'.
do
Precursor {VIEW} (a_target)
draw
end
feature -- Status report
is_viewing_ancestors: BOOLEAN
-- Are the clusters in the tree sorted by anscestors?
is_destroyed: BOOLEAN
-- Is `Current' no longer usable?
do
Result := Precursor {VIEW} and Precursor {EV_TREE}
end
feature -- Status setting
set_view_descendants
-- Change to an descendants view
do
is_viewing_ancestors := False
if not is_draw_disabled then
draw
end
end
set_view_ancestors
-- Change to an anscestors view
do
is_viewing_ancestors := True
if not is_draw_disabled then
draw
end
end
feature -- Basic operations
destroy
-- Destroy underlying native toolkit object.
-- Render `Current' unusable.
do
Precursor {VIEW}
Precursor {EV_TREE}
end
draw
-- Build the view
local
t: like target
tn: EV_TREE_NODE
n_list: BILINEAR [NODE]
do
-- Get the selected object
t := selected_target
-- Clean out the tree
from start
until exhausted
loop
remove
end
-- Rebuild the tree recursively
if target /= Void then
if is_viewing_ancestors then
n_list := target.parents
else
n_list := target.children
end
from n_list.start
until n_list.exhausted
loop
-- Pass the type to `next_tree_item' to get the correct
-- type of tree_item.
root_item := new_tree_item (n_list.item)
extend (root_item)
-- But must also call `set_target' on that tree_item
-- to force a draw (recursively).
root_item.set_target (n_list.item)
-- expand_clusters
if root_item.is_expandable then
root_item.expand
end
n_list.forth
end
end
if t /= Void then
tn := retrieve_item_recursively_by_data (t, False)
if tn /= Void then
tn.enable_select
end
end
end
feature {NONE} -- Implementation (actions)
on_drop_target (a_target: like target)
-- React to a drop of `a_target'.
require
target_exists: a_target /= Void
do
parent_tool.set_target (a_target)
end
feature {NONE} -- Implementation
root_item: JJ_NODE_ITEM
-- Top-most item in the tree.
-- Reminder: this is a EV_WIDGET which holds the data; not the data.
item_list: LINKED_LIST [JJ_NODE_ITEM]
-- List of items which are in the view
-- Reminder: these items are EV_WIDGETs which holds the data; not the data.
feature {JJ_NODE_ITEM} -- Implementation
new_tree_item (a_node: NODE): JJ_NODE_ITEM
-- Create a new JJ_NODE_ITEM.
-- `target' to `a_node'.
require
node_exists: a_node /= Void
do
if a_node.can_adopt then
Result := create {JJ_NODE_ITEM}
else
Result := create {JJ_LEAF_NODE_ITEM}
end
Result.set_target (a_node)
ensure
result_exists: Result /= Void
end
end