19928/jj_vision/unfinished/jj_node_item.e
Jocelyn Fiat 6dde6425c2 init
2024-06-17 09:09:33 +02:00

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