322 lines
7.1 KiB
Plaintext
322 lines
7.1 KiB
Plaintext
note
|
|
description: "[
|
|
Objects placeable into an EV_TREE, more specifically into a
|
|
JJ_TREE_VIEW (a VIEW that holds VIEWABLE_NODEs). This is the
|
|
screen representatin of a VIEWABLE_NODE.
|
|
]"
|
|
author: "Jimmy J. Johnson"
|
|
date: "21 Apr 06"
|
|
|
|
class
|
|
JJ_NODE_ITEM
|
|
|
|
inherit
|
|
|
|
-- EV_STOCK_COLORS
|
|
-- rename
|
|
-- implementation as colors_implementation
|
|
-- export
|
|
-- {NONE} all
|
|
-- undefine
|
|
-- default_create,
|
|
-- copy,
|
|
-- is_equal
|
|
-- end
|
|
|
|
EV_TREE_ITEM
|
|
redefine
|
|
initialize,
|
|
item,
|
|
parent_tree, -- to get correct type
|
|
wipe_out,
|
|
destroy,
|
|
is_destroyed
|
|
end
|
|
|
|
VIEW
|
|
rename
|
|
parent as parent_from_view_not_to_be_used
|
|
undefine
|
|
-- default_create,
|
|
is_equal,
|
|
copy
|
|
redefine
|
|
initialize,
|
|
target,
|
|
set_target,
|
|
draw,
|
|
parent_tool,
|
|
destroy,
|
|
is_destroyed
|
|
end
|
|
|
|
create
|
|
default_create
|
|
|
|
feature {NONE} -- Initialization
|
|
|
|
initialize
|
|
-- Create an instance.
|
|
do
|
|
Precursor {VIEW}
|
|
Precursor {EV_TREE_ITEM}
|
|
-- enable_pebble_positioning
|
|
-- set_pebble_position (0, 0)
|
|
set_actions
|
|
end
|
|
|
|
set_actions
|
|
-- Add actions to the widget
|
|
do
|
|
pick_actions.force_extend (agent enable_select)
|
|
drop_actions.extend (agent on_drop_node)
|
|
pointer_double_press_actions.force_extend (agent on_double_click)
|
|
end
|
|
|
|
feature -- Access
|
|
|
|
target: NODE
|
|
-- The node which is displayed by Current.
|
|
|
|
level: INTEGER
|
|
-- The indention level this node should occupy in the tree.
|
|
|
|
item: JJ_NODE_ITEM
|
|
-- Current item.
|
|
-- Redefined to change the type
|
|
do
|
|
Result ?= Precursor {EV_TREE_ITEM}
|
|
end
|
|
|
|
parent_tree: JJ_TREE_VIEW
|
|
-- Contains Current
|
|
-- Redefined to change type.
|
|
do
|
|
Result ?= Precursor {EV_TREE_ITEM}
|
|
end
|
|
|
|
parent_tool: JJ_TREE_TOOL
|
|
-- The TOOL which contains this view.
|
|
-- Can not be Void.
|
|
do
|
|
Result := parent_tree.parent_tool
|
|
ensure then
|
|
result_exists: Result /= Void
|
|
end
|
|
|
|
feature -- Element change
|
|
|
|
wipe_out
|
|
-- Clean out the view
|
|
do
|
|
recursive_do_all (agent clear_viewables)
|
|
-- remove_all_viewables
|
|
Precursor {EV_TREE_ITEM}
|
|
end
|
|
|
|
clear_viewables (a_node: EV_TREE_NODE)
|
|
--
|
|
local
|
|
ti: JJ_NODE_ITEM
|
|
do
|
|
ti ?= a_node
|
|
if ti /= Void then
|
|
ti.remove_all_targets
|
|
end
|
|
end
|
|
|
|
set_target (a_target: like target)
|
|
-- Change `target'
|
|
do
|
|
Precursor {VIEW} (a_target)
|
|
set_pebble (a_target)
|
|
set_data (a_target)
|
|
set_accept_cursor (yes_cursor (a_target))
|
|
set_deny_cursor (no_cursor (a_target))
|
|
-- if a_object.can_adopt then
|
|
-- drop_actions.append (a_object.adopt_actions)
|
|
-- end
|
|
draw
|
|
end
|
|
|
|
set_level (a_level: INTEGER)
|
|
-- Change `level'
|
|
do
|
|
level := a_level
|
|
ensure
|
|
level_was_set: level = a_level
|
|
end
|
|
|
|
feature -- Status
|
|
|
|
is_viewing_ancestors: BOOLEAN
|
|
-- Are the nodes in the tree sorted by anscestors?
|
|
|
|
is_destroyed: BOOLEAN
|
|
-- Is `Current' no longer usable?
|
|
do
|
|
Result := Precursor {VIEW} and Precursor {EV_TREE_ITEM}
|
|
end
|
|
|
|
feature -- Status setting
|
|
|
|
destroy
|
|
-- Destroy underlying native toolkit object.
|
|
-- Render `Current' unusable.
|
|
do
|
|
Precursor {VIEW}
|
|
Precursor {EV_TREE_ITEM}
|
|
end
|
|
|
|
view_ancestors
|
|
-- Make the view display ancestor nodes
|
|
do
|
|
is_viewing_ancestors := True
|
|
end
|
|
|
|
view_descendants
|
|
-- Make the view dispay descendant nodes
|
|
do
|
|
is_viewing_ancestors := False
|
|
end
|
|
|
|
feature -- Querry
|
|
|
|
has_object_item (a_target: NODE): BOOLEAN
|
|
-- Does Current contain an item with `target' equal to `a_target'?
|
|
require
|
|
target_exists: a_target /= Void
|
|
do
|
|
from start
|
|
until Result or else exhausted
|
|
loop
|
|
Result := item.target = a_target
|
|
forth
|
|
end
|
|
end
|
|
|
|
feature -- Basic operations
|
|
|
|
draw
|
|
-- Add children of `a_item.data' to the tree
|
|
local
|
|
n: NODE
|
|
n_list: LINEAR [NODE]
|
|
ti: JJ_NODE_ITEM
|
|
pix: EV_PIXMAP
|
|
p_view: JJ_TREE_VIEW
|
|
p_tool: TOOL
|
|
p_win: JJ_MAIN_WINDOW
|
|
do
|
|
if parent_tree /= Void then
|
|
p_view := parent_tree
|
|
p_tool := p_view.parent_tool
|
|
p_win ?= p_tool.parent_window
|
|
-- p_win ?= parent_window
|
|
if p_view /= Void and then p_win /= Void then --p_view.is_displayed and p_win /= Void then
|
|
-- This check seems to be needed to keep the view from being drawn
|
|
-- even when it is not shown. Evidently draw gets called even if
|
|
-- the TREE in which Current resides is not in any JJ_MAIN_WINDOW.
|
|
-- (`parent_window' relies on a recursive search for Current in
|
|
-- any descendents. If no main_window has the tree in which Current
|
|
-- resides then `parent_window' is Void
|
|
n ?= p_win.target
|
|
check
|
|
n_exists: n /= Void
|
|
-- because the parent must be a NODE_TREE_VIEW and the
|
|
-- `target' of it must be a NODE
|
|
end
|
|
if target /= Void then
|
|
if n.descendants.has (target) then
|
|
set_text (display_name (target))
|
|
else
|
|
set_text (display_name (target) + " " + interface_table.short_name ("not in system text"))
|
|
end
|
|
pix := (interface_table.pixmap (display_name (target))).twin
|
|
-- FIX ME!! Changing the pixmap in order to put a not simble over it if
|
|
-- not in system seems to be causing problems. Specificly, it violates post-
|
|
-- condition of `set_pixmap'. Work on this later, or do my own tree.
|
|
-- pix.set_background_color (Red)
|
|
-- pix.set_size (100, 300)
|
|
---- pix.fill_rectangle (pix.x_position + 5, pix.y_position, 100, 20)
|
|
---- pix.fill_rectangle (5, 0, 100, 20)
|
|
-- pix.set_line_width (3)
|
|
-- pix.draw_segment (0,0, pix.width, pix.height)
|
|
remove_pixmap
|
|
set_pixmap (pix)
|
|
---- pixmap.set_background_color (Red)
|
|
---- pixmap.set_size (100, pixmap.height)
|
|
---- pixmap.set_size (100, 100)
|
|
---- pixmap.fill_rectangle (pixmap.x_position + 5, pixmap.y_position, 100, 20)
|
|
---- pixmap.fill_rectangle (5, 0, 100, 20)
|
|
---- wipe_out
|
|
if parent_tree.is_viewing_ancestors then
|
|
n_list := target.parents
|
|
else
|
|
n_list := target.children
|
|
end
|
|
-- clean out items which should no longer be here
|
|
end
|
|
from start
|
|
until exhausted
|
|
loop
|
|
if not n_list.has (item.target) then
|
|
item.wipe_out -- to remove all the views
|
|
remove
|
|
else
|
|
forth
|
|
end
|
|
end
|
|
-- Add new items
|
|
from n_list.start
|
|
until n_list.exhausted
|
|
loop
|
|
n := n_list.item
|
|
-- n_list.forth
|
|
if not has_object_item (n) then -- prevents duplicates
|
|
ti := parent_tree.new_tree_item (n)
|
|
extend (ti)
|
|
ti.set_target (n)
|
|
end
|
|
n_list.forth
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
feature {NONE} -- Actions
|
|
|
|
on_drop_node (a_node: NODE)
|
|
-- React to a drop of `a_node' by adding `a_node' as child to
|
|
-- the `target'?
|
|
local
|
|
c: ADD_NODE_COMMAND
|
|
do
|
|
create c
|
|
c.set_parent_node (target)
|
|
c.set_child_node (a_node)
|
|
command_manager.add_command (c)
|
|
end
|
|
|
|
on_double_click
|
|
-- React to a mouse double click by opening a NAMER_VIEW.
|
|
-- local
|
|
-- nv: NAMER_VIEW
|
|
do
|
|
-- create nv
|
|
-- nv.set_target (target)
|
|
-- nv.set_position (50,50)
|
|
end
|
|
|
|
feature {NONE} -- Inaplicable
|
|
|
|
parent_from_view_not_to_be_used: EV_CONTAINER
|
|
-- Redefined to effect it (was deferred from VIEW); it
|
|
-- does no good in this class as the parent of a EV_TREE_ITEM
|
|
-- does not conform to the parent of most VIEWs which should
|
|
-- be EV_CONTAINERs.
|
|
do
|
|
end
|
|
|
|
end
|