redcar-dev 0.12.27dev → 0.13.0dev
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +10 -1
- data/lib/redcar.rb +2 -2
- data/plugins/application/lib/application.rb +2 -2
- data/plugins/application/lib/application/dialog.rb +1 -1
- data/plugins/application/lib/application/dialogs/filter_list_dialog.rb +13 -5
- data/plugins/application/lib/application/global_state.rb +21 -0
- data/plugins/application/lib/application/menu/item.rb +16 -7
- data/plugins/application/lib/application/updates.rb +20 -3
- data/plugins/application/spec/application/updates_spec.rb +53 -0
- data/plugins/application_swt/lib/application_swt.rb +1 -1
- data/plugins/application_swt/lib/application_swt/dialogs/filter_list_dialog_controller.rb +35 -10
- data/plugins/application_swt/lib/application_swt/menu.rb +31 -5
- data/plugins/declarations/lib/declarations.rb +31 -65
- data/plugins/declarations/lib/declarations/commands.rb +147 -0
- data/plugins/declarations/lib/declarations/file.rb +1 -1
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/javascript.js +0 -0
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/nothing_to_see.rb +0 -0
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/one_lonely_class.rb +0 -0
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/similar_names.rb +0 -0
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/something_fancy.rb +0 -0
- data/plugins/{outline_view → declarations}/spec/fixtures/some_project/trailing_space.rb +0 -0
- data/plugins/edit_view/lib/edit_view.rb +35 -2
- data/plugins/edit_view/lib/edit_view/commands/change_language_command.rb +31 -0
- data/plugins/edit_view/lib/edit_view/commands/language_settings_commands.rb +45 -0
- data/plugins/edit_view/lib/edit_view/document/command.rb +1 -1
- data/plugins/project/lib/project/find_file_dialog.rb +20 -18
- data/plugins/project/lib/project/manager.rb +5 -3
- data/plugins/redcar/plugin.rb +1 -2
- data/plugins/redcar/redcar.rb +34 -42
- data/plugins/scm/lib/scm.rb +1 -1
- data/plugins/strip_trailing_spaces/lib/strip_trailing_spaces.rb +2 -2
- data/plugins/syntax_check/lib/syntax_check.rb +2 -2
- metadata +946 -956
- data/plugins/edit_view/lib/edit_view/info_speedbar.rb +0 -98
- data/plugins/outline_view/features/outline_view.feature +0 -79
- data/plugins/outline_view/features/project_outline.feature +0 -23
- data/plugins/outline_view/features/step_definitions/outline_steps.rb +0 -61
- data/plugins/outline_view/lib/outline_view.rb +0 -97
- data/plugins/outline_view/lib/outline_view/commands.rb +0 -19
- data/plugins/outline_view/plugin.rb +0 -10
- data/plugins/outline_view_swt/lib/outline_view_swt.rb +0 -79
- data/plugins/outline_view_swt/plugin.rb +0 -7
    
        data/CHANGES
    CHANGED
    
    | @@ -1,6 +1,13 @@ | |
| 1 | 
            -
            Version 0. | 
| 1 | 
            +
            Version 0.13 (TBA)
         | 
| 2 2 | 
             
            ==================
         | 
| 3 3 |  | 
| 4 | 
            +
             * Move all language settings options into the Edit menu, for easier discoverability.(Dan Lucraft)
         | 
| 5 | 
            +
             * Move the change tab language command into the Edit menu, and make it a filter list. (Dan Lucraft)
         | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 8 | 
            +
            Version 0.12 (7th January 2012)
         | 
| 9 | 
            +
            ===============================
         | 
| 10 | 
            +
             | 
| 4 11 | 
             
             * Features run all the way through again, and use Swtbot in places to 
         | 
| 5 12 | 
             
               allow us to simulate events more accurately (Helpful for macros) (Dan Lucraft)
         | 
| 6 13 | 
             
             * Added --no-splash option (Dan Lucraft)
         | 
| @@ -21,9 +28,11 @@ Version 0.12 (TBA) | |
| 21 28 | 
             
             * Added option to color tree background color via ApplicationSWT preferences (Delisa Mason)
         | 
| 22 29 | 
             
             * Project tree has colourful icons (Delisa Mason)
         | 
| 23 30 | 
             
             * Uses gems to install everything (Dan Lucraft)
         | 
| 31 | 
            +
             * Uses Bundler to manage dependencies in development (Dan Lucraft)
         | 
| 24 32 | 
             
             * Wildcards permitted in project search (Delisa Mason)
         | 
| 25 33 | 
             
             * Installation entirely through Rubygems (Dan Lucraft)
         | 
| 26 34 | 
             
             * Rad new icon (Delisa Mason)
         | 
| 35 | 
            +
             * Checks for updates and displays if there is a new version in the Help menu (Dan Lucraft)
         | 
| 27 36 |  | 
| 28 37 | 
             
            Version 0.11 (23 March 2011)
         | 
| 29 38 | 
             
            ============================
         | 
    
        data/lib/redcar.rb
    CHANGED
    
    | @@ -68,9 +68,9 @@ end | |
| 68 68 | 
             
            #
         | 
| 69 69 | 
             
            # and so on.
         | 
| 70 70 | 
             
            module Redcar
         | 
| 71 | 
            -
              VERSION         = '0. | 
| 71 | 
            +
              VERSION         = '0.13.0dev' # also change in the gemspec!
         | 
| 72 72 | 
             
              VERSION_MAJOR   = 0
         | 
| 73 | 
            -
              VERSION_MINOR   =  | 
| 73 | 
            +
              VERSION_MINOR   = 13
         | 
| 74 74 | 
             
              VERSION_RELEASE = 0
         | 
| 75 75 |  | 
| 76 76 | 
             
              ENVIRONMENTS = [:user, :debug, :test]
         | 
| @@ -12,6 +12,7 @@ require 'application/dialog' | |
| 12 12 | 
             
            require 'application/dialogs/filter_list_dialog'
         | 
| 13 13 | 
             
            require 'application/dialogs/modeless_list_dialog'
         | 
| 14 14 | 
             
            require 'application/event_spewer'
         | 
| 15 | 
            +
            require 'application/global_state'
         | 
| 15 16 | 
             
            require 'application/keymap'
         | 
| 16 17 | 
             
            require 'application/keymap/builder'
         | 
| 17 18 | 
             
            require 'application/toolbar'
         | 
| @@ -152,7 +153,6 @@ module Redcar | |
| 152 153 |  | 
| 153 154 | 
             
                # Create a new Application::Window, and the controller for it.
         | 
| 154 155 | 
             
                def new_window(show=true)
         | 
| 155 | 
            -
                  s = Time.now
         | 
| 156 156 | 
             
                  new_window = Window.new
         | 
| 157 157 | 
             
                  windows << new_window
         | 
| 158 158 | 
             
                  notify_listeners(:new_window, new_window)
         | 
| @@ -198,7 +198,7 @@ module Redcar | |
| 198 198 | 
             
                  @storage ||= begin
         | 
| 199 199 | 
             
                    storage = Plugin::Storage.new('application_plugin')
         | 
| 200 200 | 
             
                    storage.set_default('stay_resident_after_last_window_closed', false)
         | 
| 201 | 
            -
                    storage.set_default('show_toolbar',  | 
| 201 | 
            +
                    storage.set_default('show_toolbar', Redcar.platform != :osx)
         | 
| 202 202 | 
             
                    storage.set_default('instance_id', java.util.UUID.randomUUID.to_s)
         | 
| 203 203 | 
             
                    storage.set_default('should_check_for_updates', true)
         | 
| 204 204 | 
             
                    storage
         | 
| @@ -84,7 +84,7 @@ module Redcar | |
| 84 84 | 
             
                  #
         | 
| 85 85 | 
             
                  # The return value is a hash containing :button and :value.
         | 
| 86 86 | 
             
                  def self.input(title, message, initial_value="", &validator)
         | 
| 87 | 
            -
                    in_dialog { Redcar.gui.dialog_adapter.input(title, message, initial_value, &validator) }
         | 
| 87 | 
            +
                    in_dialog { Redcar.gui.dialog_adapter.input(title.to_s, message.to_s, initial_value.to_s, &validator) }
         | 
| 88 88 | 
             
                  end
         | 
| 89 89 |  | 
| 90 90 | 
             
                  # Show a dialog containing a password entry box to the user, and blocks
         | 
| @@ -20,10 +20,18 @@ module Redcar | |
| 20 20 | 
             
                  notify_listeners(:close)
         | 
| 21 21 | 
             
                end
         | 
| 22 22 |  | 
| 23 | 
            -
                # Called by the controller when the user changes the filter.
         | 
| 23 | 
            +
                # Called by the controller when the user changes the filter. 
         | 
| 24 | 
            +
                #
         | 
| 25 | 
            +
                # Should return either a list of strings, or a list of hashes, which must have at least
         | 
| 26 | 
            +
                # the key :name set, and may also have the key :image.
         | 
| 27 | 
            +
                #
         | 
| 28 | 
            +
                # E.g. it returns ["feed.rb", "application_controller.rb"]
         | 
| 29 | 
            +
                # or it returns [{:name => "feed.rb"}, {:name => "application_controller.rb"}]
         | 
| 30 | 
            +
                #
         | 
| 31 | 
            +
                # The methods selected and moved_to will be called with items from this list.
         | 
| 24 32 | 
             
                #
         | 
| 25 33 | 
             
                # @param [String] the filter entered by the user
         | 
| 26 | 
            -
                # @return [Array<String>] the new list to display
         | 
| 34 | 
            +
                # @return [Array<String> or Array<Hash>] the new list to display
         | 
| 27 35 | 
             
                def update_list(filter)
         | 
| 28 36 | 
             
                  if filter == ""
         | 
| 29 37 | 
             
                    %w(foo bar baz qux quux corge)
         | 
| @@ -36,9 +44,9 @@ module Redcar | |
| 36 44 |  | 
| 37 45 | 
             
                # Called by the controller when the user selects a row in the list.
         | 
| 38 46 | 
             
                #
         | 
| 39 | 
            -
                # @param [String] the  | 
| 47 | 
            +
                # @param [String or Hash] the item selected by the user
         | 
| 40 48 | 
             
                # @param [Integer] the index of the row in the list selected by the user
         | 
| 41 | 
            -
                def selected( | 
| 49 | 
            +
                def selected(item, ix)
         | 
| 42 50 | 
             
                  puts "Hooray! You selected #{text} at index #{ix}"
         | 
| 43 51 | 
             
                end
         | 
| 44 52 |  | 
| @@ -46,7 +54,7 @@ module Redcar | |
| 46 54 | 
             
                #
         | 
| 47 55 | 
             
                # @param [String] the list row text that is now highlighted
         | 
| 48 56 | 
             
                # @param [Integer] the index of the row that is now highlighted
         | 
| 49 | 
            -
                def moved_to( | 
| 57 | 
            +
                def moved_to(item, ix)
         | 
| 50 58 | 
             
                  # Override with the code you wish you had
         | 
| 51 59 | 
             
                end
         | 
| 52 60 |  | 
| @@ -0,0 +1,21 @@ | |
| 1 | 
            +
            module Redcar
         | 
| 2 | 
            +
              class Application
         | 
| 3 | 
            +
                class GlobalState
         | 
| 4 | 
            +
                  def app
         | 
| 5 | 
            +
                    Redcar.app
         | 
| 6 | 
            +
                  end
         | 
| 7 | 
            +
                  
         | 
| 8 | 
            +
                  def win
         | 
| 9 | 
            +
                    app and app.focussed_window
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
                  
         | 
| 12 | 
            +
                  def project
         | 
| 13 | 
            +
                    win and Project.in_window(win)
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def tab
         | 
| 17 | 
            +
                    win and win.focussed_notebook_tab
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
            end
         | 
| @@ -12,7 +12,7 @@ module Redcar | |
| 12 12 | 
             
                    end
         | 
| 13 13 | 
             
                  end
         | 
| 14 14 |  | 
| 15 | 
            -
                  attr_reader :command, :priority, :value, :type | 
| 15 | 
            +
                  attr_reader :command, :priority, :value, :type
         | 
| 16 16 |  | 
| 17 17 | 
             
                  # Create a new Item, with the given text to display in the menu, and
         | 
| 18 18 | 
             
                  # either:
         | 
| @@ -26,10 +26,9 @@ module Redcar | |
| 26 26 | 
             
                      @priority = options[:priority]
         | 
| 27 27 | 
             
                      @value = options[:value]
         | 
| 28 28 | 
             
                      @type = options[:type]
         | 
| 29 | 
            -
                       | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
                    # FIXME: Should this be removed at some point?
         | 
| 29 | 
            +
                      if [:check, :radio].include?(@type)
         | 
| 30 | 
            +
                        @checked = options[:checked]
         | 
| 31 | 
            +
                      end
         | 
| 33 32 | 
             
                    else
         | 
| 34 33 | 
             
                      @command = options || block
         | 
| 35 34 | 
             
                    end
         | 
| @@ -55,11 +54,13 @@ module Redcar | |
| 55 54 | 
             
                  end
         | 
| 56 55 |  | 
| 57 56 | 
             
                  def text
         | 
| 58 | 
            -
                    @text. | 
| 57 | 
            +
                    @text.respond_to?(:call) ? 
         | 
| 58 | 
            +
                      Redcar::Application::GlobalState.new.instance_eval(&@text) :
         | 
| 59 | 
            +
                      @text
         | 
| 59 60 | 
             
                  end
         | 
| 60 61 |  | 
| 61 62 | 
             
                  def lazy_text?
         | 
| 62 | 
            -
                    @text. | 
| 63 | 
            +
                    @text.respond_to?(:call)
         | 
| 63 64 | 
             
                  end
         | 
| 64 65 |  | 
| 65 66 | 
             
                  def merge(other)
         | 
| @@ -74,6 +75,14 @@ module Redcar | |
| 74 75 | 
             
                  def is_unique?
         | 
| 75 76 | 
             
                    false
         | 
| 76 77 | 
             
                  end
         | 
| 78 | 
            +
                  
         | 
| 79 | 
            +
                  def checked?
         | 
| 80 | 
            +
                    @checked and (
         | 
| 81 | 
            +
                      @checked.respond_to?(:call) ?
         | 
| 82 | 
            +
                        Redcar::Application::GlobalState.new.instance_eval(&@checked) :
         | 
| 83 | 
            +
                        @checked
         | 
| 84 | 
            +
                    )
         | 
| 85 | 
            +
                  end
         | 
| 77 86 | 
             
                end
         | 
| 78 87 | 
             
              end
         | 
| 79 88 | 
             
            end
         | 
| @@ -31,12 +31,29 @@ module Redcar | |
| 31 31 | 
             
                  end
         | 
| 32 32 |  | 
| 33 33 | 
             
                  def self.latest_version
         | 
| 34 | 
            -
                    @latest_version ||= Net::HTTP.get(URI.parse( | 
| 34 | 
            +
                    @latest_version ||= Net::HTTP.get(URI.parse(latest_version_url)).strip
         | 
| 35 | 
            +
                  end
         | 
| 36 | 
            +
                  
         | 
| 37 | 
            +
                  def self.latest_version_url
         | 
| 38 | 
            +
                    "http://s3.amazonaws.com/redcar2/current_version.txt?instance_id=#{Application.instance_id}&version=#{Redcar::VERSION}"
         | 
| 35 39 | 
             
                  end
         | 
| 36 40 |  | 
| 37 41 | 
             
                  def self.newer_version?
         | 
| 38 | 
            -
                    latest_version_bits = latest_version.split(".").map(&:to_i)
         | 
| 39 | 
            -
                     | 
| 42 | 
            +
                    latest_version_bits = latest_version.chomp.split(".").map(&:to_i)
         | 
| 43 | 
            +
                    newer_than?(latest_version_bits, [Redcar::VERSION_MAJOR, Redcar::VERSION_MINOR, Redcar::VERSION_RELEASE])
         | 
| 44 | 
            +
                  end
         | 
| 45 | 
            +
                  
         | 
| 46 | 
            +
                  def self.newer_than?(new_bits, old_bits)
         | 
| 47 | 
            +
                    # if they are not the same length, pad with 0's to make comparison
         | 
| 48 | 
            +
                    # valid. E.g. 0.10.0 == 0.10
         | 
| 49 | 
            +
                    if new_bits.length > old_bits.length
         | 
| 50 | 
            +
                      old_bits += [0]*(new_bits.length - old_bits.length)
         | 
| 51 | 
            +
                    elsif old_bits.length > new_bits.length
         | 
| 52 | 
            +
                      new_bits += [0]*(old_bits.length - new_bits.length)
         | 
| 53 | 
            +
                    end
         | 
| 54 | 
            +
                    
         | 
| 55 | 
            +
                    return false if new_bits == old_bits
         | 
| 56 | 
            +
                    [new_bits, old_bits].sort.last == new_bits
         | 
| 40 57 | 
             
                  end
         | 
| 41 58 |  | 
| 42 59 | 
             
                end
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            require "spec_helper"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe Redcar::Application::Updates do
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              describe "comparing versions logic" do
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                it "0.10 = 0.10" do
         | 
| 9 | 
            +
                  Redcar::Application::Updates.newer_than?([0, 10], [0, 10]).should be_false
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
                
         | 
| 12 | 
            +
                it "0.10.0 = 0.10" do
         | 
| 13 | 
            +
                  Redcar::Application::Updates.newer_than?([0, 10, 0], [0, 10]).should be_false
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                it "0.10 = 0.10.0" do
         | 
| 17 | 
            +
                  Redcar::Application::Updates.newer_than?([0, 10], [0, 10, 0]).should be_false
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
                
         | 
| 20 | 
            +
                it "0.10.1 > 0.10" do
         | 
| 21 | 
            +
                  Redcar::Application::Updates.newer_than?([0, 10, 1], [0, 10]).should be_true
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
                
         | 
| 24 | 
            +
                it "0.11 > 0.10" do
         | 
| 25 | 
            +
                  Redcar::Application::Updates.newer_than?([0, 11], [0, 10]).should be_true
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                it "0.11.1 > 0.10" do
         | 
| 29 | 
            +
                  Redcar::Application::Updates.newer_than?([0, 11, 1], [0, 10]).should be_true
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                it "0.11 > 0.10.1" do
         | 
| 33 | 
            +
                  Redcar::Application::Updates.newer_than?([0, 11], [0, 10, 1]).should be_true
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
                
         | 
| 36 | 
            +
                it "0.11.1 > 0.10.1" do
         | 
| 37 | 
            +
                  Redcar::Application::Updates.newer_than?([0, 11, 1], [0, 10, 1]).should be_true
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                it "0.9 < 0.10" do
         | 
| 41 | 
            +
                  Redcar::Application::Updates.newer_than?([0, 9], [0, 10]).should be_false
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                it "0.9.1 < 0.10" do
         | 
| 45 | 
            +
                  Redcar::Application::Updates.newer_than?([0, 9, 1], [0, 10]).should be_false
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                it "0.9 < 0.10.1" do
         | 
| 49 | 
            +
                  Redcar::Application::Updates.newer_than?([0, 9], [0, 10, 1]).should be_false
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end
         | 
| @@ -13,8 +13,8 @@ require "application_swt/dialogs/modeless_dialog" | |
| 13 13 | 
             
            require "application_swt/dialogs/modeless_html_dialog"
         | 
| 14 14 | 
             
            require "application_swt/dialogs/modeless_list_dialog_controller"
         | 
| 15 15 | 
             
            require "application_swt/gradient"
         | 
| 16 | 
            -
            require "application_swt/html_tab"
         | 
| 17 16 | 
             
            require "application_swt/icon"
         | 
| 17 | 
            +
            require "application_swt/html_tab"
         | 
| 18 18 | 
             
            require "application_swt/listener_helpers"
         | 
| 19 19 | 
             
            require "application_swt/menu"
         | 
| 20 20 | 
             
            require "application_swt/menu/binding_translator"
         | 
| @@ -14,20 +14,33 @@ module Redcar | |
| 14 14 | 
             
                    attr_accessor :controller
         | 
| 15 15 |  | 
| 16 16 | 
             
                    def createDialogArea(parent)
         | 
| 17 | 
            +
                      # composite = Swt::Widgets::Composite.new(parent, Swt::SWT::NONE)
         | 
| 18 | 
            +
                      # layout = Swt::Layout::RowLayout.new(Swt::SWT::VERTICAL)
         | 
| 19 | 
            +
                      # composite.setLayout(layout)
         | 
| 20 | 
            +
                      # 
         | 
| 21 | 
            +
                      # @text = Swt::Widgets::Text.new(composite, Swt::SWT::SINGLE | Swt::SWT::LEFT | Swt::SWT::ICON_CANCEL | Swt::SWT::SEARCH)
         | 
| 22 | 
            +
                      # @text.set_layout_data(Swt::Layout::RowData.new(400, 20))
         | 
| 23 | 
            +
                      # @list = Swt::Widgets::List.new(composite, Swt::SWT::V_SCROLL | Swt::SWT::H_SCROLL | Swt::SWT::SINGLE)
         | 
| 24 | 
            +
                      # @list.set_layout_data(Swt::Layout::RowData.new(400, 200))
         | 
| 25 | 
            +
                      # controller.attach_listeners
         | 
| 26 | 
            +
                      # controller.update_list_sync
         | 
| 27 | 
            +
                      # get_shell.add_shell_listener(ShellListener.new(controller))
         | 
| 28 | 
            +
                      # ApplicationSWT.register_shell(get_shell)
         | 
| 29 | 
            +
                      # ApplicationSWT.register_dialog(get_shell, self)
         | 
| 30 | 
            +
                      # 
         | 
| 31 | 
            +
                      # @list.set_selection(0)
         | 
| 17 32 | 
             
                      composite = Swt::Widgets::Composite.new(parent, Swt::SWT::NONE)
         | 
| 18 33 | 
             
                      layout = Swt::Layout::RowLayout.new(Swt::SWT::VERTICAL)
         | 
| 19 34 | 
             
                      composite.setLayout(layout)
         | 
| 20 | 
            -
             | 
| 21 35 | 
             
                      @text = Swt::Widgets::Text.new(composite, Swt::SWT::SINGLE | Swt::SWT::LEFT | Swt::SWT::ICON_CANCEL | Swt::SWT::SEARCH)
         | 
| 22 36 | 
             
                      @text.set_layout_data(Swt::Layout::RowData.new(400, 20))
         | 
| 23 | 
            -
                      @list = Swt::Widgets:: | 
| 37 | 
            +
                      @list = Swt::Widgets::Table.new(composite, Swt::SWT::V_SCROLL | Swt::SWT::H_SCROLL | Swt::SWT::MULTI)
         | 
| 24 38 | 
             
                      @list.set_layout_data(Swt::Layout::RowData.new(400, 200))
         | 
| 25 39 | 
             
                      controller.attach_listeners
         | 
| 26 40 | 
             
                      controller.update_list_sync
         | 
| 27 41 | 
             
                      get_shell.add_shell_listener(ShellListener.new(controller))
         | 
| 28 | 
            -
                      ApplicationSWT.register_shell(get_shell)
         | 
| 29 | 
            -
                      ApplicationSWT.register_dialog(get_shell, self)
         | 
| 30 | 
            -
             | 
| 42 | 
            +
                      Redcar::ApplicationSWT.register_shell(get_shell)
         | 
| 43 | 
            +
                      Redcar::ApplicationSWT.register_dialog(get_shell, self)
         | 
| 31 44 | 
             
                      @list.set_selection(0)
         | 
| 32 45 | 
             
                    end
         | 
| 33 46 | 
             
                  end
         | 
| @@ -167,7 +180,8 @@ module Redcar | |
| 167 180 |  | 
| 168 181 | 
             
                  def widget_selected
         | 
| 169 182 | 
             
                    if @model.step?
         | 
| 170 | 
            -
                       | 
| 183 | 
            +
                      ix = @dialog.list.get_selection_index
         | 
| 184 | 
            +
                      @model.moved_to(@list[ix], ix)
         | 
| 171 185 | 
             
                    end
         | 
| 172 186 | 
             
                  end
         | 
| 173 187 |  | 
| @@ -185,7 +199,8 @@ module Redcar | |
| 185 199 |  | 
| 186 200 | 
             
                  def selected
         | 
| 187 201 | 
             
                    wait_for_search if select_closest_match?
         | 
| 188 | 
            -
                     | 
| 202 | 
            +
                    ix = @dialog.list.get_selection_index
         | 
| 203 | 
            +
                    @model.selected(@list[ix], ix)
         | 
| 189 204 | 
             
                  end
         | 
| 190 205 |  | 
| 191 206 | 
             
                  def key_pressed(key_event)
         | 
| @@ -221,10 +236,20 @@ module Redcar | |
| 221 236 | 
             
                  end
         | 
| 222 237 |  | 
| 223 238 | 
             
                  def populate_list(contents)
         | 
| 239 | 
            +
                    @list = contents
         | 
| 224 240 | 
             
                    if @dialog
         | 
| 225 | 
            -
                      @dialog.list. | 
| 226 | 
            -
                      contents.each do | | 
| 227 | 
            -
                         | 
| 241 | 
            +
                      @dialog.list.remove_all
         | 
| 242 | 
            +
                      contents.each do |props|
         | 
| 243 | 
            +
                        if props.is_a?(String)
         | 
| 244 | 
            +
                          props = {:name => props}
         | 
| 245 | 
            +
                        end
         | 
| 246 | 
            +
                        props = {:name => ""}.merge(props)
         | 
| 247 | 
            +
                        item = Swt::Widgets::TableItem.new(@dialog.list, Swt::SWT::NONE)
         | 
| 248 | 
            +
                        item.text = props[:name]
         | 
| 249 | 
            +
                        image = ApplicationSWT::Icon.swt_image(props[:icon]) if props[:icon]
         | 
| 250 | 
            +
                        if image
         | 
| 251 | 
            +
                          item.image = image
         | 
| 252 | 
            +
                        end
         | 
| 228 253 | 
             
                      end
         | 
| 229 254 | 
             
                    end
         | 
| 230 255 | 
             
                  end
         | 
| @@ -31,11 +31,13 @@ module Redcar | |
| 31 31 | 
             
                    @keymap = keymap
         | 
| 32 32 | 
             
                    @menu_bar = Swt::Widgets::Menu.new(window.shell, type)
         | 
| 33 33 | 
             
                    @menu_bar.set_visible(false)
         | 
| 34 | 
            +
                    
         | 
| 34 35 | 
             
                    return unless menu_model
         | 
| 35 36 | 
             
                    @handlers = []
         | 
| 36 37 | 
             
                    @use_numbers = options[:numbers]
         | 
| 37 38 | 
             
                    @number = 1
         | 
| 38 | 
            -
                     | 
| 39 | 
            +
                    
         | 
| 40 | 
            +
                    add_entries_to_menu(@menu_bar, nil, menu_model)
         | 
| 39 41 | 
             
                    #puts "ApplicationSWT::Menu initialize took #{Time.now - s}s"
         | 
| 40 42 | 
             
                  end
         | 
| 41 43 |  | 
| @@ -59,7 +61,26 @@ module Redcar | |
| 59 61 | 
             
                    @use_numbers
         | 
| 60 62 | 
             
                  end
         | 
| 61 63 |  | 
| 62 | 
            -
                   | 
| 64 | 
            +
                  class MenuListener
         | 
| 65 | 
            +
                    attr_reader :items
         | 
| 66 | 
            +
                    
         | 
| 67 | 
            +
                    def initialize
         | 
| 68 | 
            +
                      @items = []
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
                    
         | 
| 71 | 
            +
                    def menu_shown(e)
         | 
| 72 | 
            +
                      items.each do |item, entry|
         | 
| 73 | 
            +
                        if entry.type == :check
         | 
| 74 | 
            +
                          item.setSelection(entry.checked?)
         | 
| 75 | 
            +
                        end
         | 
| 76 | 
            +
                      end
         | 
| 77 | 
            +
                    end
         | 
| 78 | 
            +
                    
         | 
| 79 | 
            +
                    def menu_hidden(e)
         | 
| 80 | 
            +
                    end
         | 
| 81 | 
            +
                  end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                  def add_entries_to_menu(menu, menu_listener, menu_model)
         | 
| 63 84 | 
             
                    menu_model.each do |entry|
         | 
| 64 85 | 
             
                      if entry.is_a?(Redcar::Menu::LazyMenu)
         | 
| 65 86 | 
             
                        menu_header = Swt::Widgets::MenuItem.new(menu, Swt::SWT::CASCADE)
         | 
| @@ -68,7 +89,7 @@ module Redcar | |
| 68 89 | 
             
                        menu_header.menu = new_menu
         | 
| 69 90 | 
             
                        menu_header.add_arm_listener do
         | 
| 70 91 | 
             
                          new_menu.get_items.each {|i| i.dispose }
         | 
| 71 | 
            -
                          add_entries_to_menu(new_menu, entry)
         | 
| 92 | 
            +
                          add_entries_to_menu(new_menu, nil, entry)
         | 
| 72 93 | 
             
                        end
         | 
| 73 94 | 
             
                      elsif entry.is_a?(Redcar::Menu)
         | 
| 74 95 | 
             
                        menu_header = Swt::Widgets::MenuItem.new(menu, Swt::SWT::CASCADE)
         | 
| @@ -76,7 +97,9 @@ module Redcar | |
| 76 97 | 
             
                        new_menu = Swt::Widgets::Menu.new(menu)
         | 
| 77 98 | 
             
                        menu_header.menu = new_menu
         | 
| 78 99 | 
             
                        menu_header.enabled = (entry.length > 0)
         | 
| 79 | 
            -
                         | 
| 100 | 
            +
                        new_menu_listener = MenuListener.new
         | 
| 101 | 
            +
                        add_entries_to_menu(new_menu, new_menu_listener, entry)
         | 
| 102 | 
            +
                        new_menu.add_menu_listener(new_menu_listener)
         | 
| 80 103 | 
             
                        menu_header.add_arm_listener do
         | 
| 81 104 | 
             
                          entry.entries.zip(new_menu.get_items) do |sub_entry, swt_item|
         | 
| 82 105 | 
             
                            if sub_entry.lazy_text?
         | 
| @@ -88,12 +111,15 @@ module Redcar | |
| 88 111 | 
             
                        item = Swt::Widgets::MenuItem.new(menu, Swt::SWT::SEPARATOR)
         | 
| 89 112 | 
             
                      elsif entry.is_a?(Redcar::Menu::Item)
         | 
| 90 113 | 
             
                        item = Swt::Widgets::MenuItem.new(menu, Menu.types[entry.type] || Swt::SWT::PUSH)
         | 
| 91 | 
            -
                        item.setSelection(entry.active)
         | 
| 92 114 | 
             
                        if entry.command.is_a?(Proc)
         | 
| 93 115 | 
             
                          connect_proc_to_item(item, entry)
         | 
| 94 116 | 
             
                        else
         | 
| 95 117 | 
             
                          connect_command_to_item(item, entry)
         | 
| 96 118 | 
             
                        end
         | 
| 119 | 
            +
                        if [:check, :radio].include? entry.type
         | 
| 120 | 
            +
                          menu_listener.items << [item, entry] if menu_listener
         | 
| 121 | 
            +
                          item.setSelection(entry.checked?)
         | 
| 122 | 
            +
                        end
         | 
| 97 123 | 
             
                      else
         | 
| 98 124 | 
             
                        raise "unknown object of type #{entry.class} in menu"
         | 
| 99 125 | 
             
                      end
         |