lib/glimmer/swt/tree_proxy.rb in glimmer-dsl-swt-4.18.4.3 vs lib/glimmer/swt/tree_proxy.rb in glimmer-dsl-swt-4.18.4.4
- old
+ new
@@ -1,145 +1,145 @@
-# Copyright (c) 2007-2021 Andy Maleh
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-require 'glimmer/swt/widget_proxy'
-
-module Glimmer
- module SWT
- class TreeProxy < Glimmer::SWT::WidgetProxy
- include Glimmer
-
- attr_reader :tree_editor, :tree_editor_text_proxy
- attr_accessor :tree_properties
-
- def initialize(underscored_widget_name, parent, args)
- super
- @tree_editor = TreeEditor.new(swt_widget)
- @tree_editor.horizontalAlignment = SWTProxy[:left]
- @tree_editor.grabHorizontal = true
- @tree_editor.minimumHeight = 20
- end
-
- # Performs depth first search for tree items matching block condition
- # If no condition block is passed, returns all tree items
- # Returns a Java TreeItem array to easily set as selection on org.eclipse.swt.Tree if needed
- def depth_first_search(&condition)
- found = []
- recursive_depth_first_search(swt_widget.getItems.first, found, &condition)
- found.to_java(TreeItem)
- end
-
- # Returns all tree items including descendants
- def all_tree_items
- depth_first_search
- end
-
- def widget_property_listener_installers
- super.merge({
- Java::OrgEclipseSwtWidgets::Tree => {
- selection: lambda do |observer|
- on_widget_selected { |selection_event|
- observer.call(@swt_widget.getSelection)
- }
- end
- },
- })
- end
-
- def edit_in_progress?
- !!@edit_in_progress
- end
-
- def edit_selected_tree_item(before_write: nil, after_write: nil, after_cancel: nil)
- edit_tree_item(swt_widget.getSelection.first, before_write: before_write, after_write: after_write, after_cancel: after_cancel)
- end
-
- def edit_tree_item(tree_item, before_write: nil, after_write: nil, after_cancel: nil)
- return if tree_item.nil?
- content {
- @tree_editor_text_proxy = text {
- focus true
- text tree_item.getText
- action_taken = false
- cancel = lambda {
- @tree_editor_text_proxy.swt_widget.dispose
- @tree_editor_text_proxy = nil
- after_cancel&.call
- @edit_in_progress = false
- }
- action = lambda { |event|
- begin
- if !action_taken && !@edit_in_progress
- action_taken = true
- @edit_in_progress = true
- new_text = @tree_editor_text_proxy.swt_widget.getText
- if new_text == tree_item.getText
- cancel.call
- else
- before_write&.call
- tree_item.setText(new_text)
- model = tree_item.getData
- model.send("#{tree_properties[:text]}=", new_text) # makes tree update itself, so must search for selected tree item again
- edited_tree_item = depth_first_search { |ti| ti.getData == model }.first
- swt_widget.showItem(edited_tree_item)
- @tree_editor_text_proxy.swt_widget.dispose
- @tree_editor_text_proxy = nil
- after_write&.call(edited_tree_item)
- @edit_in_progress = false
- end
- end
- rescue => e
- Glimmer::Config.logger.error {"Error encountered while editing tree item!\n#{e.full_message}"}
- end
- }
- on_focus_lost(&action)
- on_key_pressed { |key_event|
- if key_event.keyCode == swt(:cr)
- action.call(key_event)
- elsif key_event.keyCode == swt(:esc)
- cancel.call
- end
- }
- }
- @tree_editor_text_proxy.swt_widget.selectAll
- }
- @tree_editor.setEditor(@tree_editor_text_proxy.swt_widget, tree_item)
- end
-
- private
-
- def recursive_depth_first_search(tree_item, found, &condition)
- return if tree_item.nil?
- found << tree_item if condition.nil? || condition.call(tree_item)
- tree_item.getItems.each do |child_tree_item|
- recursive_depth_first_search(child_tree_item, found, &condition)
- end
- end
-
- def property_type_converters
- super.merge({
- selection: lambda do |value|
- depth_first_search {|ti| ti.getData == value}
- end,
- })
- end
- end
- end
-end
+# Copyright (c) 2007-2021 Andy Maleh
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+require 'glimmer/swt/widget_proxy'
+
+module Glimmer
+ module SWT
+ class TreeProxy < Glimmer::SWT::WidgetProxy
+ include Glimmer
+
+ attr_reader :tree_editor, :tree_editor_text_proxy
+ attr_accessor :tree_properties
+
+ def initialize(underscored_widget_name, parent, args)
+ super
+ @tree_editor = TreeEditor.new(swt_widget)
+ @tree_editor.horizontalAlignment = SWTProxy[:left]
+ @tree_editor.grabHorizontal = true
+ @tree_editor.minimumHeight = 20
+ end
+
+ # Performs depth first search for tree items matching block condition
+ # If no condition block is passed, returns all tree items
+ # Returns a Java TreeItem array to easily set as selection on org.eclipse.swt.Tree if needed
+ def depth_first_search(&condition)
+ found = []
+ recursive_depth_first_search(swt_widget.getItems.first, found, &condition)
+ found.to_java(TreeItem)
+ end
+
+ # Returns all tree items including descendants
+ def all_tree_items
+ depth_first_search
+ end
+
+ def widget_property_listener_installers
+ super.merge({
+ Java::OrgEclipseSwtWidgets::Tree => {
+ selection: lambda do |observer|
+ on_widget_selected { |selection_event|
+ observer.call(@swt_widget.getSelection)
+ }
+ end
+ },
+ })
+ end
+
+ def edit_in_progress?
+ !!@edit_in_progress
+ end
+
+ def edit_selected_tree_item(before_write: nil, after_write: nil, after_cancel: nil)
+ edit_tree_item(swt_widget.getSelection.first, before_write: before_write, after_write: after_write, after_cancel: after_cancel)
+ end
+
+ def edit_tree_item(tree_item, before_write: nil, after_write: nil, after_cancel: nil)
+ return if tree_item.nil?
+ content {
+ @tree_editor_text_proxy = text {
+ focus true
+ text tree_item.getText
+ action_taken = false
+ cancel = lambda {
+ @tree_editor_text_proxy.swt_widget.dispose
+ @tree_editor_text_proxy = nil
+ after_cancel&.call
+ @edit_in_progress = false
+ }
+ action = lambda { |event|
+ begin
+ if !action_taken && !@edit_in_progress
+ action_taken = true
+ @edit_in_progress = true
+ new_text = @tree_editor_text_proxy.swt_widget.getText
+ if new_text == tree_item.getText
+ cancel.call
+ else
+ before_write&.call
+ tree_item.setText(new_text)
+ model = tree_item.getData
+ model.send("#{tree_properties[:text]}=", new_text) # makes tree update itself, so must search for selected tree item again
+ edited_tree_item = depth_first_search { |ti| ti.getData == model }.first
+ swt_widget.showItem(edited_tree_item)
+ @tree_editor_text_proxy.swt_widget.dispose
+ @tree_editor_text_proxy = nil
+ after_write&.call(edited_tree_item)
+ @edit_in_progress = false
+ end
+ end
+ rescue => e
+ Glimmer::Config.logger.error {"Error encountered while editing tree item!\n#{e.full_message}"}
+ end
+ }
+ on_focus_lost(&action)
+ on_key_pressed { |key_event|
+ if key_event.keyCode == swt(:cr)
+ action.call(key_event)
+ elsif key_event.keyCode == swt(:esc)
+ cancel.call
+ end
+ }
+ }
+ @tree_editor_text_proxy.swt_widget.selectAll
+ }
+ @tree_editor.setEditor(@tree_editor_text_proxy.swt_widget, tree_item)
+ end
+
+ private
+
+ def recursive_depth_first_search(tree_item, found, &condition)
+ return if tree_item.nil?
+ found << tree_item if condition.nil? || condition.call(tree_item)
+ tree_item.getItems.each do |child_tree_item|
+ recursive_depth_first_search(child_tree_item, found, &condition)
+ end
+ end
+
+ def property_type_converters
+ super.merge({
+ selection: lambda do |value|
+ depth_first_search {|ti| ti.getData == value}
+ end,
+ })
+ end
+ end
+ end
+end