note description: "[ A {TOOL} used to hold views for editting an {EDITABLE} ]" date: "23 Feb 04" author: "Jimmy J. Johnson" copyright: "Copyright 2012, Jimmy J. Johnson" license: "Eiffel Forum License v2 (see forum.txt)" URL: "$URL: file:///F:/eiffel_repositories/jj_vision/trunk/interface/tools/edit_tool.e $" date: "$Date: 2013-04-25 18:11:22 -0400 (Thu, 25 Apr 2013) $" revision: "$Revision: 14 $" class EDIT_TOOL inherit TOOL redefine create_interface_objects, initialize, add_actions, target_imp, set_target -- history_dropdown, -- new_history_item end create default_create feature {NONE} -- Initialization create_interface_objects -- Create objects to be used by `Current' in `initialize' -- Implemented by descendants to create attached objects -- in order to adhere to void-safety due to the implementation bridge pattern. do Precursor {TOOL} create list_editor_view create dialog_editor_view create field_editor_view -- Create the new buttons before Precursor {TOOL} so `initialize' -- can call `set_actions' without a Void reference. create edit_schema_toggle_button create schema_label create new_field_button create delete_field_button create align_fields_button edit_schema_toggle_button.set_pixmap (create {EV_PIXMAP}.make_with_pixel_buffer (Icon_shell_color_buffer)) edit_schema_toggle_button.set_tooltip ("EDIT_TOOL.edit_schema_toggle_button") new_field_button.set_pixmap (create {EV_PIXMAP}.make_with_pixel_buffer (Icon_shell_color_buffer)) new_field_button.set_tooltip ("EDIT_TOOL.new_field_button") delete_field_button.set_pixmap (create {EV_PIXMAP}.make_with_pixel_buffer (Icon_shell_color_buffer)) delete_field_button.set_tooltip ("EDIT_TOOL.delete_field_button") align_fields_button.set_pixmap (create {EV_PIXMAP}.make_with_pixel_buffer (Icon_shell_color_buffer)) align_fields_button.set_tooltip ("EDIT_TOOL.align_fields_button") -- Align_fields menu create align_fields_menu create align_on_edit_box_check_item create align_fields_left_item create align_fields_right_item create align_fields_top_item create align_fields_bottom_item create align_fields_horizontal_center_item create align_fields_vertical_center_item -- New field menu create new_field_menu create new_string_field_item create new_integer_field_item create new_date_field_item -- Use default schema at first create schema end initialize -- Set up the window -- Create the views in the window using agents. local vs: EV_VERTICAL_SEPARATOR do build_align_fields_menu build_new_field_menu -- Create the tool and its views Precursor {TOOL} -- Add `schema_label' to the `title_bar'. check title_bar_has_target_label: title_bar.has (target_label) -- because Precursor {TOOL} should have put it there. end title_bar.start title_bar.search (tool_name_label) create vs title_bar.put_right (schema_label) title_bar.disable_item_expand (schema_label) title_bar.put_right (vs) title_bar.disable_item_expand (vs) -- Add the buttons to the `tool_bar' (from TOOL) tool_bar.extend (edit_schema_toggle_button) -- Create the views split_manager.set_horizontal split_manager.extend_siblings (field_editor_view, dialog_editor_view) split_manager.set_vertical split_manager.extend_siblings (split_manager.last_view, list_editor_view) -- Set up the views in this tool. split_manager.enable_mode_changes split_manager.set_split_mode split_manager.disable_view (field_editor_view) end -- initialize_interface -- -- Add interface items for this class to the `interface_table'. -- do -- Precursor {TOOL} -- interface_table.add_item_with_tuple (<<"{EDIT_TOOL}", "EDIT_TOOL", "This is an EDIT_TOOL.", "This tool is used to create schemas.", "icon_tool_color.ico">>) -- interface_table.add_item_with_tuple (<<"{EDIT_TOOL}.edit_schema_toggle_button", "Toggles schema build mode", "Click this button to tobble between schema building and normal view", "This tool is used to create schemas.", "icon_tool_color.ico">>) -- interface_table.add_item_with_tuple (<<"{EDIT_TOOL}.new_field_button", "Create a new field", "Open a drop-down menu for adding fields.", "This button opens a drop-down menu for creating new fields.", "icon_exe_up_to_date.ico">>) -- interface_table.add_item_with_tuple (<<"{EDIT_TOOL}.delete_field_button", "Delete field", "Delete the selected fields", "This button deletes the selected fields from the schema.", "icon_exec_quit_color.ico">>) -- interface_table.add_item_with_tuple (<<"{EDIT_TOOL}.align_fields_button", "Align fields", "Align the selected fields.", "This button pulls down a menu for aligning fields in various methods.", "icon_format_clickable_color.ico">>) -- interface_table.add_item_with_tuple (<<"{EDIT_TOOL} - new_string_field", "Create a STRING field", "Create a STRING field", "Creates a new field of type STRING.", "icon_display_labels_color.ico">>) -- interface_table.add_item_with_tuple (<<"{EDIT_TOOL} - new_integer_field", "Create an INTEGER field", "Create an INTEGER field", "Creates a new field of type INTEGER.", "icon_once_symbol.ico">>) -- interface_table.add_item_with_tuple (<<"{EDIT_TOOL} - new_date_field", "Create a DATE field", "Create a DATE field", "Creates a new field of type DATE.", "icon_new_editor_color.ico">>) -- end build_align_fields_menu -- Build the `align_fields_menu'. do -- put items into the menu align_fields_menu.extend (align_on_edit_box_check_item) align_fields_menu.extend (align_fields_left_item) align_fields_menu.extend (align_fields_right_item) align_fields_menu.extend (align_fields_top_item) align_fields_menu.extend (align_fields_bottom_item) align_fields_menu.extend (align_fields_horizontal_center_item) align_fields_menu.extend (align_fields_vertical_center_item) end build_new_field_menu -- Build the `new_field_menu' do -- Put the items into the menu new_field_menu.extend (new_string_field_item) new_field_menu.extend (new_integer_field_item) new_field_menu.extend (new_date_field_item) end add_actions -- Add actions to the widgets do Precursor {TOOL} -- Set actions for buttons and menus edit_schema_toggle_button.select_actions.extend (agent on_edit_schema_toggle_button_pressed) new_field_button.select_actions.extend (agent on_new_field_button_pressed) new_string_field_item.select_actions.extend (agent on_create_new_string_field) new_date_field_item.select_actions.extend (agent on_create_new_date_field) new_integer_field_item.select_actions.extend (agent on_create_new_integer_field) delete_field_button.select_actions.extend (agent on_delete_field) -- Set actions for views dialog_editor_view.control_select_actions.extend (agent on_control_selected) -- Reminder: Though the `target_label' is part of TOOL, the ability to -- change the "field" displayed in the label is only changable from -- a system using this [EDIT_TOOL] class. tool_name_label.drop_actions.extend (agent on_set_target_label_field) end feature -- Access selected_control: detachable CONTROL -- The control last selected by the user in "schema-edit" mode. list_editor_view: LIST_EDITOR_VIEW -- View in list format for editting the schema. dialog_editor_view: DIALOG_EDITOR_VIEW -- View for editting a record. field_editor_view: FIELD_EDITOR_VIEW -- View for editting specific fields from the record's schema. feature -- Element change set_target (a_target: like target) -- Change `target' and pass it on to the views. do -- Must handle a FIELD differently. if attached {FIELD} a_target as f then if is_edit_schema_mode then field_editor_view.set_record (f) end else Precursor {TOOL} (a_target) list_editor_view.set_record (a_target) dialog_editor_view.set_record (a_target) dialog_editor_view.set_schema (get_schema) draw end end feature -- Status report is_edit_schema_mode: BOOLEAN -- Is the tool in a mode to allow changes to the schema? feature {NONE} -- Implementation (actions) on_edit_schema_toggle_button_pressed -- React to a press of the edit_schema_toggle_button' by -- toggling between "schema-edit" mode and "normal" mode. do if edit_schema_toggle_button.is_selected then -- Add the `field_editor_view'. split_manager.enable_view (field_editor_view) split_manager.set_split_mode split_manager.disable_mode_changes dialog_editor_view.control_select_actions.resume -- Add the buttons tool_bar.extend (new_field_button) tool_bar.extend (delete_field_button) tool_bar.extend (align_fields_button) is_edit_schema_mode := True else -- Remove the `field_editor_view'. split_manager.enable_mode_changes split_manager.disable_view (field_editor_view) dialog_editor_view.control_select_actions.block -- Remove the buttons tool_bar.start tool_bar.prune (new_field_button) tool_bar.start tool_bar.prune (delete_field_button) tool_bar.start tool_bar.prune (align_fields_button) is_edit_schema_mode := False end end on_control_selected (a_control: CONTROL) -- A control has been selected in "schema-edit" mode. -- Added as agent to `dialog_editor_view.control_selected_actions' in -- feature `on_edit_schema_toggle_button_pressed'. require control_exists: a_control /= Void do selected_control := a_control field_editor_view.set_record (a_control.field) field_editor_view.set_schema (a_control.field.schema) syncronize_buttons ensure control_was_selected: selected_control = a_control field_was_set: field_editor_view.record = a_control.field end on_new_field_button_pressed -- React to a press of the `new_field_button'. do new_field_menu.show end on_create_new_string_field -- React to a menu item or button used to create a new string field. local f: STRING_FIELD c: CHANGE_FIELDS_COMMAND do create f create c.make (schema, f) command_manager.add_command (c) end on_create_new_date_field -- React to a menu item or button used to create a new date field. local f: YMD_TIME_FIELD c: CHANGE_FIELDS_COMMAND do create f create c.make (schema, f) command_manager.add_command (c) end on_create_new_integer_field -- React to a menu item or button used to create a new integer field. local f: INTEGER_FIELD c: CHANGE_FIELDS_COMMAND do create f create c.make (schema, f) command_manager.add_command (c) end on_delete_field -- Remove the selected field from the schema. require is_deletable: not target.schema.has_mandatory (field_editor_view.record) local f: FIELD c: CHANGE_FIELDS_COMMAND do if not field_editor_view.is_view_empty then f := field_editor_view.record create c.make (schema, f) c.set_delete_action command_manager.add_command (c) end end on_set_target_label_field (a_field: STRING_FIELD) -- Change the "global" field to be used to determine what part of -- an EDITABLE (based on `a_field') to display in the drop-downs -- and lists, etc. (See `set_target_label_field' from EDITABLE.) require field_exists: a_field /= Void local e: EDITABLE do -- Because `target_label_field' is a once feature just need to -- make sure it is called; to do that I need an EDITABLE. create e e.set_target_label_field (a_field) end feature {FIELD_EDITOR_VIEW} -- Implementation get_schema: SCHEMA -- Obtain a schema from the `record' require target_exists: target /= Void do if target.schema /= schema then Result := target.schema schema := Result else Result := schema end ensure result_exists: result /= Void end feature {NONE} -- Implementation target_imp: detachable EDITABLE -- Detachable implementation of `target' for void-safety schema: SCHEMA -- The last schema used and passed to the views. syncronize_buttons -- Make sure the buttons are in the correct state. local f: FIELD do f := field_editor_view.record if schema.has_mandatory (f) then delete_field_button.disable_sensitive else delete_field_button.enable_sensitive end end feature {NONE} -- Implementation (buttons) edit_schema_toggle_button: EV_TOGGLE_BUTTON --EV_TOOL_BAR_TOGGLE_BUTTON -- Toggles between normal mode and a mode allowing -- editting of the `schema' from `record'. schema_label: EV_LABEL -- Shows the `id' or name of the schema currently in use. align_fields_button: EV_BUTTON --EV_TOOL_BAR_BUTTON -- Aligns a group of fields delete_field_button: EV_BUTTON --EV_TOOL_BAR_BUTTON -- Deletes the selected field(s) from the `schema' of `record' new_field_button: EV_BUTTON --EV_TOOL_BAR_BUTTON -- Pulls down a menu for creating a new field new_field_menu: EV_MENU -- Pull down menu for selecting the type of field -- activated by the `new_field_button'. new_string_field_item: EV_MENU_ITEM -- Used to create a new STRING_FIELD new_integer_field_item: EV_MENU_ITEM -- Used to create a new INTEGER_FIELD new_date_field_item: EV_MENU_ITEM -- Used to create a new YMD_TIME_FIELD align_fields_menu: EV_MENU -- Pull down menu for selecting the field alignment method, -- activated by the `align_field_button'. align_on_edit_box_check_item: EV_CHECK_MENU_ITEM -- Select to make allignments key off the edit boxes of the -- selected controls as opposed to the labels. align_fields_left_item: EV_MENU_ITEM -- Align the left sides of the selected controls align_fields_right_item: EV_MENU_ITEM -- Align the right sides of the selected controls align_fields_top_item: EV_MENU_ITEM -- Align the tops of the selected controls align_fields_bottom_item: EV_MENU_ITEM -- Align the bottoms of the selected controls align_fields_horizontal_center_item: EV_MENU_ITEM -- Align the horizontal centers of the selected controls align_fields_vertical_center_item: EV_MENU_ITEM -- Align the vertical centers of the selected controls invariant has_schema_if_has_record: target_imp /= Void implies schema /= Void has_correct_schema: target_imp /= Void implies target.has_schema (schema) end