redcar 0.3.5 → 0.3.6

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.
Files changed (102) hide show
  1. data/CHANGES +28 -0
  2. data/README.md +7 -0
  3. data/ROADMAP.md +11 -1
  4. data/Rakefile +61 -2
  5. data/bin/redcar +2 -1
  6. data/lib/redcar.rb +4 -3
  7. data/lib/redcar/installer.rb +3 -1
  8. data/lib/redcar/runner.rb +1 -1
  9. data/lib/redcar/usage.rb +4 -7
  10. data/lib/redcar_quick_start.rb +39 -5
  11. data/plugins/application/features/step_definitions/tree_steps.rb +6 -0
  12. data/plugins/application/features/support/env.rb +2 -6
  13. data/plugins/application/icons/redcar_icon_beta_dev.png +0 -0
  14. data/plugins/application/lib/application/command/executor.rb +8 -0
  15. data/plugins/application/lib/application/dialog.rb +25 -2
  16. data/plugins/application/lib/application/notebook.rb +4 -0
  17. data/plugins/application/lib/application/window.rb +4 -0
  18. data/plugins/application_swt/lib/application_swt.rb +2 -0
  19. data/plugins/application_swt/lib/application_swt/dialog_adapter.rb +28 -1
  20. data/plugins/application_swt/lib/application_swt/menu.rb +4 -0
  21. data/plugins/application_swt/lib/application_swt/menu/binding_translator.rb +4 -0
  22. data/plugins/application_swt/lib/application_swt/notebook.rb +22 -1
  23. data/plugins/application_swt/lib/application_swt/notebook/tab_drag_and_drop_listener.rb +124 -0
  24. data/plugins/application_swt/lib/application_swt/notebook/tab_transfer.rb +83 -0
  25. data/plugins/application_swt/lib/application_swt/swt_wrapper.rb +14 -0
  26. data/plugins/application_swt/lib/application_swt/tab.rb +28 -6
  27. data/plugins/application_swt/lib/application_swt/window.rb +88 -43
  28. data/plugins/application_swt/spec/application_swt/menu/binding_translator_spec.rb +11 -0
  29. data/plugins/application_swt/spec/spec_helper.rb +1 -1
  30. data/plugins/auto_completer/lib/auto_completer.rb +3 -20
  31. data/plugins/auto_pairer/lib/auto_pairer/document_controller.rb +1 -1
  32. data/plugins/declarations/lib/declarations/parser.rb +2 -2
  33. data/plugins/declarations/spec/spec_helper.rb +1 -0
  34. data/plugins/edit_view/features/step_definitions/notebook_steps.rb +3 -3
  35. data/plugins/edit_view/features/step_definitions/window_steps.rb +24 -9
  36. data/plugins/edit_view/features/support/env.rb +11 -9
  37. data/plugins/edit_view/lib/edit_view.rb +106 -6
  38. data/plugins/edit_view/lib/edit_view/info_speedbar.rb +32 -3
  39. data/plugins/edit_view/lib/edit_view/select_font_dialog.rb +39 -0
  40. data/plugins/edit_view/lib/edit_view/select_theme_dialog.rb +34 -0
  41. data/plugins/edit_view/lib/edit_view/tab_settings.rb +103 -8
  42. data/plugins/edit_view_swt/lib/edit_view_swt.rb +40 -3
  43. data/plugins/edit_view_swt/lib/edit_view_swt/edit_tab.rb +1 -1
  44. data/plugins/execute_current_tab/lib/execute_current_tab.rb +15 -6
  45. data/plugins/project/features/open_directory_tree.feature +10 -0
  46. data/plugins/project/lib/project.rb +10 -8
  47. data/plugins/project/lib/project/dir_mirror.rb +6 -5
  48. data/plugins/project/lib/project/drb_service.rb +16 -0
  49. data/plugins/project/lib/project/manager.rb +31 -5
  50. data/plugins/redcar/redcar.rb +115 -19
  51. data/plugins/tree_view_swt/lib/tree_view_swt.rb +15 -0
  52. data/textmate/Bundles/Cucumber.tmbundle/Preferences/Cucumber_Plain_Text_Feature_Completions.tmPreferences +3 -3
  53. data/textmate/Bundles/Cucumber.tmbundle/Preferences/Symbol_list___Scenario.tmPreferences +1 -1
  54. data/textmate/Bundles/Cucumber.tmbundle/Syntaxes/Cucumber_Plain_Text_Feature.tmLanguage +18 -76
  55. data/textmate/Bundles/Cucumber.tmbundle/Syntaxes/Cucumber_Steps.tmLanguage +1 -1
  56. data/textmate/Bundles/Palm-WebOS-Development.tmbundle/Snippets/Animation_animateStyle.tmSnippet +23 -0
  57. data/textmate/Bundles/Palm-WebOS-Development.tmbundle/Snippets/Event_listen.tmSnippet +16 -0
  58. data/textmate/Bundles/{Cucumber.tmbundle/Snippets/When_Step_Plaintext.tmSnippet → Palm-WebOS-Development.tmbundle/Snippets/Event_stop.tmSnippet} +5 -5
  59. data/textmate/Bundles/{Cucumber.tmbundle/Snippets/Then_Step.tmSnippet → Palm-WebOS-Development.tmbundle/Snippets/Event_stopListening.tmSnippet} +5 -9
  60. data/textmate/Bundles/{Cucumber.tmbundle/Snippets/Cucumber_Multiline_Steps.tmSnippet → Palm-WebOS-Development.tmbundle/Snippets/List_Model.tmSnippet} +10 -7
  61. data/textmate/Bundles/Palm-WebOS-Development.tmbundle/Snippets/Log_addLoggingMethodsToPrototype.tmSnippet +16 -0
  62. data/textmate/Bundles/{Cucumber.tmbundle/Snippets/Then_Step_Plaintext.tmSnippet → Palm-WebOS-Development.tmbundle/Snippets/Log_info.tmSnippet} +5 -5
  63. data/textmate/Bundles/{Cucumber.tmbundle/Snippets/Scenario___heading_only__.tmSnippet → Palm-WebOS-Development.tmbundle/Snippets/Log_logProperties.tmSnippet} +5 -7
  64. data/textmate/Bundles/{Cucumber.tmbundle/Snippets/When_Step.tmSnippet → Palm-WebOS-Development.tmbundle/Snippets/Model.tmSnippet} +7 -9
  65. data/textmate/Bundles/Palm-WebOS-Development.tmbundle/Snippets/__L____.tmSnippet +16 -0
  66. data/textmate/Bundles/Palm-WebOS-Development.tmbundle/Snippets/_insert____.tmSnippet +16 -0
  67. data/textmate/Bundles/Palm-WebOS-Development.tmbundle/Snippets/_update____.tmSnippet +16 -0
  68. data/textmate/Bundles/Palm-WebOS-Development.tmbundle/Snippets/controller_get.tmSnippet +16 -0
  69. data/textmate/Bundles/Palm-WebOS-Development.tmbundle/Snippets/controller_pushScene.tmSnippet +16 -0
  70. data/textmate/Bundles/Palm-WebOS-Development.tmbundle/Snippets/controller_serviceRequest.tmSnippet +21 -0
  71. data/textmate/Bundles/{Cucumber.tmbundle/Snippets/Scenario_Outline.tmSnippet → Palm-WebOS-Development.tmbundle/Snippets/controller_setupWidget.tmSnippet} +5 -9
  72. data/textmate/Bundles/{Cucumber.tmbundle/Snippets/Given_Step.tmSnippet → Palm-WebOS-Development.tmbundle/Snippets/controller_showBanner.tmSnippet} +5 -9
  73. data/textmate/Bundles/Palm-WebOS-Development.tmbundle/Syntaxes/Mojo.tmLanguage +713 -0
  74. data/textmate/Bundles/Palm-WebOS-Development.tmbundle/info.plist +188 -0
  75. data/textmate/Bundles/Smalltalk.tmbundle/Preferences/GNU_Smalltalk.tmPreferences +32 -0
  76. data/textmate/Bundles/{asciidoc.tmbundle/Preferences/Symbol_List___Heading.tmPreferences → Smalltalk.tmbundle/Preferences/GNU___Symbol_List___Method.tmPreferences} +7 -6
  77. data/textmate/Bundles/{Cucumber.tmbundle/Preferences/next_Symbol_list___Scenario.tmPreferences → Smalltalk.tmbundle/Preferences/GNU___Symbol_List___Section.tmPreferences} +7 -4
  78. data/textmate/Bundles/{asciidoc.tmbundle/Snippets/Bold.tmSnippet → Smalltalk.tmbundle/Preferences/MIST_Smalltalk_Format.tmPreferences} +8 -7
  79. data/textmate/Bundles/Smalltalk.tmbundle/Syntaxes/GNU_Smalltalk.tmLanguage +493 -0
  80. data/textmate/Bundles/Smalltalk.tmbundle/Syntaxes/GNU_Smalltalk_2.tmLanguage +807 -0
  81. data/textmate/Bundles/Smalltalk.tmbundle/Syntaxes/MIST_Smalltalk_Format.tmLanguage +645 -0
  82. data/textmate/Bundles/Smalltalk.tmbundle/info.plist +21 -0
  83. data/textmate/Themes/Twilight.tmTheme +4 -0
  84. metadata +2604 -2586
  85. data/textmate/Bundles/Cucumber.tmbundle/Preferences/next_Cucumber_Plain_Text_Feature_Completions.tmPreferences +0 -30
  86. data/textmate/Bundles/Cucumber.tmbundle/Syntaxes/next_Cucumber_Plain_Text_Feature.tmLanguage +0 -221
  87. data/textmate/Bundles/Cucumber.tmbundle/Syntaxes/next_Cucumber_Steps.tmLanguage +0 -424
  88. data/textmate/Bundles/asciidoc.tmbundle/Preferences/Typing_Pairs___Defaults.tmPreferences +0 -54
  89. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Anchor.tmSnippet +0 -16
  90. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Comment_Block.tmSnippet +0 -19
  91. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Example_Block.tmSnippet +0 -19
  92. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Italic.tmSnippet +0 -16
  93. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Listing_Block.tmSnippet +0 -20
  94. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Literal_Block.tmSnippet +0 -19
  95. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Passthrough_Block.tmSnippet +0 -19
  96. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Quote_Block.tmSnippet +0 -19
  97. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Quoted.tmSnippet +0 -16
  98. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Sidebar_Block.tmSnippet +0 -19
  99. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Subscript.tmSnippet +0 -16
  100. data/textmate/Bundles/asciidoc.tmbundle/Snippets/Superscript.tmSnippet +0 -16
  101. data/textmate/Bundles/asciidoc.tmbundle/Syntaxes/AsciiDoc.tmLanguage +0 -428
  102. data/textmate/Bundles/asciidoc.tmbundle/info.plist +0 -91
@@ -42,6 +42,10 @@ module Redcar
42
42
  @result
43
43
  end
44
44
 
45
+ def move(x, y)
46
+ @menu_bar.setLocation(x, y)
47
+ end
48
+
45
49
  private
46
50
 
47
51
  def use_numbers?
@@ -36,6 +36,10 @@ module Redcar
36
36
  value += Swt::SWT::PAGE_UP
37
37
  elsif key_string =~ /Page Down$/
38
38
  value += Swt::SWT::PAGE_DOWN
39
+ elsif key_string =~ /Home$/
40
+ value += Swt::SWT::HOME
41
+ elsif key_string =~ /End$/
42
+ value += Swt::SWT::END
39
43
  else
40
44
  value += key_string[-1]
41
45
  end
@@ -3,7 +3,7 @@ module Redcar
3
3
  class Notebook
4
4
  include Redcar::Observable
5
5
 
6
- attr_reader :tab_folder
6
+ attr_reader :tab_folder, :model
7
7
 
8
8
  class CTabFolder2Listener
9
9
  def initialize(controller)
@@ -60,6 +60,21 @@ module Redcar
60
60
  grid_data = Swt::Layout::GridData.new(Swt::Layout::GridData::FILL_BOTH)
61
61
  @tab_folder.set_layout_data(grid_data)
62
62
  @tab_folder.pack
63
+ register_tab_dnd(@tab_folder)
64
+ end
65
+
66
+ def register_tab_dnd(tab_folder)
67
+ dnd_listener = TabDragAndDropListener.new(self)
68
+ operations = (Swt::DND::DND::DROP_COPY | Swt::DND::DND::DROP_DEFAULT | Swt::DND::DND::DROP_MOVE)
69
+ transfer_types = [TabTransfer.get_instance].to_java(:"org.eclipse.swt.dnd.ByteArrayTransfer")
70
+
71
+ drag_source = Swt::DND::DragSource.new(tab_folder, operations)
72
+ drag_source.set_transfer(transfer_types)
73
+ drag_source.add_drag_listener(dnd_listener)
74
+
75
+ drop_target = Swt::DND::DropTarget.new(tab_folder, operations)
76
+ drop_target.set_transfer(transfer_types)
77
+ drop_target.add_drop_listener(dnd_listener)
63
78
  end
64
79
 
65
80
  def style_tab_folder
@@ -101,6 +116,12 @@ module Redcar
101
116
  tab_model.deserialize(data)
102
117
  end
103
118
 
119
+ def recalculate_tab_order
120
+ @model.sort_tabs! do |a,b|
121
+ tab_folder.index_of(a.controller.item) <=> tab_folder.index_of(b.controller.item)
122
+ end
123
+ end
124
+
104
125
  def dispose
105
126
  @tab_folder.dispose
106
127
  end
@@ -0,0 +1,124 @@
1
+ module Redcar
2
+ class ApplicationSWT
3
+ class Notebook
4
+ class TabDragAndDropListener
5
+ include org.eclipse.swt.dnd.DragSourceListener
6
+ include org.eclipse.swt.dnd.DropTargetListener
7
+
8
+ # A TabPaintListener allows clients to draw
9
+ # indicators next to a tab in the tab folder
10
+ class TabPaintListener
11
+ include org.eclipse.swt.events.PaintListener
12
+ attr_writer :item, :indicate_front
13
+
14
+ def paintControl(event)
15
+ event.gc.background = ApplicationSWT.display.system_color Swt::SWT::COLOR_DARK_GRAY
16
+ if @item && @item.bounds
17
+ bounds = @item.bounds
18
+ side_length = bounds.height / 3
19
+ offset = (bounds.width unless @indicate_front) || 0
20
+ triangle = [bounds.x + offset, bounds.y + side_length,
21
+ bounds.x + offset + side_length, bounds.y,
22
+ bounds.x + offset - side_length, bounds.y]
23
+ else
24
+ triangle = [0, 0, 10, 10, 0, 20]
25
+ end
26
+ event.gc.fill_polygon(triangle.to_java(:int))
27
+ end
28
+ end
29
+
30
+ def initialize(notebook)
31
+ @notebook = notebook
32
+ @paint_listener = TabPaintListener.new
33
+ end
34
+
35
+ def tab_folder
36
+ @notebook.tab_folder
37
+ end
38
+
39
+ # DragSourceListener interface implementation
40
+ # When a drag starts, the dragged tab is marked
41
+ def dragStart(event)
42
+ if tab_folder.item_count > 0
43
+ @dragged_tab_controller = @notebook.tab_widget_to_tab_model(tab_folder.selection).controller
44
+ @dragged_tab_controller.dragging = true
45
+ else
46
+ event.doit = false
47
+ end
48
+ end
49
+
50
+ # DragSourceListener interface implementation
51
+ # When a drag finishes, the dragged tab is unmarked and released
52
+ def dragFinished(event)
53
+ @dragged_tab_controller.dragging = false
54
+ @dragged_tab_controller = @paint_listener.item = nil
55
+ tab_folder.redraw
56
+ end
57
+
58
+ # DropTargetListener interface implementation
59
+ # A @link{TabPaintListener} is added to the tab folder when dragging into it
60
+ # to indicate where the drop would happen
61
+ def dragEnter(event)
62
+ tab_folder.add_paint_listener(@paint_listener)
63
+ end
64
+
65
+ # DropTargetListener interface implementation
66
+ # If a drag leaves the tab folder, remove the @link{TabPaintListener}
67
+ def dragLeave(event)
68
+ tab_folder.remove_paint_listener(@paint_listener)
69
+ tab_folder.redraw
70
+ end
71
+
72
+ # DropTargetListener interface implementation
73
+ # While dragging, update the @link{TabPaintListener} to show drop indicators
74
+ def dragOver(event)
75
+ widget = event_to_tab_widget(event)
76
+ @paint_listener.item = widget
77
+ @paint_listener.indicate_front = move_to_front?(widget, event)
78
+ tab_folder.redraw
79
+ end
80
+
81
+ # DropTargetListener interface implementation
82
+ # Drop the dragged tab on the notebook at the target position
83
+ def drop(event)
84
+ target_tab_widget = event_to_tab_widget(event)
85
+ unless @dragged_tab_controller && target_tab_widget == @dragged_tab_controller.item
86
+ dragged_tab_model = @dragged_tab_controller.model if @dragged_tab_controller
87
+ dragged_tab_model ||= Redcar.app.all_tabs.detect {|t| t.controller.dragging?}
88
+ @notebook.model.grab_tab_from(dragged_tab_model.notebook, dragged_tab_model)
89
+ move_tab(dragged_tab_model.controller, target_tab_widget, event)
90
+ end
91
+ end
92
+
93
+ # Move the tab controlled by the given controller behind or before the indicated tab
94
+ # @param [Redcar::ApplicationSWT::Tab] the dragged tab's controller
95
+ # @param [SWT::Custom::CTabItem] the item to drop behind
96
+ def move_tab(tab_controller, tab_widget, event)
97
+ position = (tab_folder.index_of(tab_widget) if tab_widget) || 0
98
+ position -= 1 if move_to_front?(tab_widget, event)
99
+ position += 1 if tab_folder.index_of(tab_controller.item) > position
100
+ tab_controller.move_tab_widget_to_position(position)
101
+ end
102
+
103
+ # Find the CTabItem targeted by a given event
104
+ def event_to_tab_widget(event)
105
+ if tab_folder.item_count > 0
106
+ tab_folder.item(tab_folder.to_control(event.x, event.y)) or
107
+ tab_folder.items[tab_folder.item_count - 1]
108
+ end
109
+ end
110
+
111
+ def move_to_front?(widget, event)
112
+ widget && (widget.bounds.width / 2 >
113
+ (tab_folder.to_control(event.x, event.y).x - widget.bounds.x))
114
+ end
115
+
116
+ # Unimplemented interface methods
117
+ def dragSetData(event); end
118
+ def dragOperationChanged(event); end
119
+ def dropAccept(event); end
120
+ end
121
+ end
122
+ end
123
+ end
124
+
@@ -0,0 +1,83 @@
1
+ module Redcar
2
+ class ApplicationSWT
3
+ class Notebook
4
+ class TabTransfer < Swt::DND::ByteArrayTransfer
5
+
6
+ class TabType
7
+ # Empty class for now, until we figure out which
8
+ # information we want to attach to the transfer.
9
+ # This _will_ be needed to DnD tabs between windows
10
+ end
11
+
12
+ TAB_TYPE = "TabType"
13
+ TAB_TYPE_ID = register_type(TAB_TYPE)
14
+ @@instance = nil
15
+
16
+ def self.get_instance
17
+ @@instance || TabTransfer.new
18
+ end
19
+
20
+ def javaToNative(types, transfer_data)
21
+ return if (types.nil? || types.empty? || (types.first.class != TabType))
22
+
23
+ begin
24
+ # write data to a byte array and then ask super to convert to
25
+ out = java.io.ByteArrayOutputStream.new
26
+ write_out = java.io.DataOutputStream.new(out)
27
+ types.length.times do |i|
28
+ buffer = TAB_TYPE.to_java_bytes
29
+ write_out.write_int(buffer.length)
30
+ write_out.write(buffer)
31
+ end
32
+ buffer = out.to_byte_array
33
+ write_out.close
34
+ super(buffer, transfer_data)
35
+ rescue java.io.IOException => e
36
+ end
37
+ end
38
+
39
+ def nativeToJava(transfer_data)
40
+ if (is_supported_type(transfer_data))
41
+ buffer = super
42
+ return nil unless buffer
43
+
44
+ data = []
45
+ begin
46
+ input = java.io.ByteArrayInputStream.new(buffer)
47
+ read_in = java.io.DataInputStream.new(input)
48
+ while (read_in.available > 20) do
49
+ datum = TabType.new
50
+ int size = read_in.read_int
51
+ name = Java::byte[size].new
52
+ read_in.read(name)
53
+ tab_type_name = String.from_java_bytes(name);
54
+ data << datum
55
+ end
56
+ read_in.close
57
+ rescue java.io.IOException => e
58
+ return null;
59
+ end
60
+ return data.to_java
61
+ end
62
+ return nil
63
+ end
64
+
65
+ def get_type_names
66
+ [TAB_TYPE].to_java(:string)
67
+ end
68
+
69
+ def get_type_ids
70
+ [TAB_TYPE_ID].to_java(:int)
71
+ end
72
+
73
+ def getTypeIds
74
+ get_type_ids
75
+ end
76
+
77
+ def getTypeNames
78
+ get_type_names
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -45,6 +45,7 @@ module Swt
45
45
  import org.eclipse.swt.widgets.Menu
46
46
  import org.eclipse.swt.widgets.MenuItem
47
47
  import org.eclipse.swt.widgets.MessageBox
48
+ import org.eclipse.swt.widgets.Sash
48
49
  import org.eclipse.swt.widgets.Shell
49
50
  import org.eclipse.swt.widgets.TabFolder
50
51
  import org.eclipse.swt.widgets.TabItem
@@ -71,13 +72,26 @@ module Swt
71
72
  end
72
73
 
73
74
  module DND
75
+ import org.eclipse.swt.dnd.DND
74
76
  import org.eclipse.swt.dnd.Clipboard
75
77
  import org.eclipse.swt.dnd.Transfer
76
78
  import org.eclipse.swt.dnd.TextTransfer
79
+ import org.eclipse.swt.dnd.ByteArrayTransfer
80
+
81
+ import org.eclipse.swt.dnd.DropTarget
82
+ import org.eclipse.swt.dnd.DropTargetEvent
83
+ import org.eclipse.swt.dnd.DropTargetListener
84
+
85
+ import org.eclipse.swt.dnd.DragSource
86
+ import org.eclipse.swt.dnd.DragSourceEvent
87
+ import org.eclipse.swt.dnd.DragSourceListener
77
88
  end
78
89
 
79
90
  module Layout
80
91
  import org.eclipse.swt.layout.FillLayout
92
+ import org.eclipse.swt.layout.FormAttachment
93
+ import org.eclipse.swt.layout.FormLayout
94
+ import org.eclipse.swt.layout.FormData
81
95
  import org.eclipse.swt.layout.GridLayout
82
96
  import org.eclipse.swt.layout.GridData
83
97
  import org.eclipse.swt.layout.RowLayout
@@ -1,22 +1,24 @@
1
1
  module Redcar
2
2
  class ApplicationSWT
3
3
  class Tab
4
+
4
5
  attr_reader :item, :model, :notebook, :widget
5
6
 
6
7
  FILE_ICON = File.join(Redcar.root, %w(plugins application lib application assets file.png))
7
8
 
8
- def initialize(model, notebook)
9
+ def initialize(model, notebook, position = nil)
9
10
  @model, @notebook = model, notebook
10
- create_item_widget
11
+ create_item_widget(position || @notebook.tab_folder.item_count)
11
12
  create_tab_widget
12
13
  attach_listeners
13
14
  end
14
15
 
15
- def create_item_widget
16
+ def create_item_widget(position = nil)
17
+ position ||= notebook.tab_folder.item_count
16
18
  if @item
17
19
  @item.dispose
18
- end
19
- @item = Swt::Custom::CTabItem.new(notebook.tab_folder, Swt::SWT::CLOSE)
20
+ end
21
+ @item = Swt::Custom::CTabItem.new(notebook.tab_folder, Swt::SWT::CLOSE, position)
20
22
  @icon = Swt::Graphics::Image.new(ApplicationSWT.display, FILE_ICON)
21
23
  @item.image = @icon
22
24
  end
@@ -27,11 +29,31 @@ module Redcar
27
29
  @item.control = @widget
28
30
  end
29
31
 
32
+ def dragging?
33
+ @dragging
34
+ end
35
+
36
+ def dragging= boolean
37
+ @dragging = boolean
38
+ end
39
+
30
40
  def move_tab_widget_to_current_notebook
31
41
  @widget.setParent(notebook.tab_folder)
32
42
  @item.control = @widget
33
43
  end
34
-
44
+
45
+ def move_tab_widget_to_position(position)
46
+ # CTabItem state
47
+ state_variables = [:font, :tool_tip_text, :text]
48
+ view_state = state_variables.collect {|var| @item.send(var)}
49
+ create_item_widget(position)
50
+ state_variables.each_with_index {|var, idx| @item.send(:"#{var}=", view_state[idx])}
51
+ @item.control = @widget
52
+ @item.image = @icon
53
+ @notebook.recalculate_tab_order
54
+ focus
55
+ end
56
+
35
57
  def set_notebook(notebook_controller)
36
58
  @notebook = notebook_controller
37
59
  end
@@ -2,9 +2,14 @@
2
2
  module Redcar
3
3
  class ApplicationSWT
4
4
  class Window
5
- attr_reader :shell, :window, :shell_listener
5
+ attr_reader :shell, :window
6
+
7
+ SASH_WIDTH = 5
8
+ TREEBOOK_WIDTH = 200
6
9
 
7
10
  class ShellListener
11
+ include org.eclipse.swt.events.ShellListener
12
+
8
13
  def initialize(controller)
9
14
  @win = controller.window
10
15
  end
@@ -38,7 +43,7 @@ module Redcar
38
43
  create_treebook_controller
39
44
  reset_sash_widths
40
45
  @treebook_unopened = true
41
- set_icon File.join(Redcar.root, %w(plugins application icons redcar_icon_beta.png))
46
+ set_icon
42
47
  end
43
48
 
44
49
  def add_listeners
@@ -116,10 +121,23 @@ module Redcar
116
121
  old_menu_bar.dispose if old_menu_bar
117
122
  end
118
123
 
119
- def set_icon(path)
124
+ def set_icon
125
+ path = File.join(icon_dir, icon_file)
120
126
  icon = Swt::Graphics::Image.new(ApplicationSWT.display, path)
121
127
  shell.image = icon
122
128
  end
129
+
130
+ def icon_dir
131
+ File.join(Redcar.root, %w(plugins application icons))
132
+ end
133
+
134
+ def icon_file
135
+ if Redcar::VERSION =~ /dev$/
136
+ "redcar_icon_beta_dev.png"
137
+ else
138
+ "redcar_icon_beta.png"
139
+ end
140
+ end
123
141
 
124
142
  def bring_to_front
125
143
  @shell.set_minimized(false) # unminimize, just in case
@@ -189,51 +207,79 @@ module Redcar
189
207
 
190
208
  private
191
209
 
192
- SASH_WIDTH = 5
193
- TREEBOOK_WIDTH = 20
210
+ attr_reader :right_composite
194
211
 
195
212
  def create_shell
196
213
  @shell = Swt::Widgets::Shell.new(ApplicationSWT.display)
197
- @shell.layout = Swt::Layout::GridLayout.new(1, false)
198
- @shell_listener = ShellListener.new(self)
199
- @shell.add_shell_listener(@shell_listener)
214
+ @shell.layout = Swt::Layout::FormLayout.new
215
+ @shell.add_shell_listener(ShellListener.new(self))
216
+ @shell.add_listener Swt::SWT::Resize do |e|
217
+ client_area = @shell.client_area
218
+ if client_area.width < @sash.bounds.x
219
+ @sash.layout_data.left = Swt::Layout::FormAttachment.new(0, client_area.width - SASH_WIDTH)
220
+ end
221
+ end
200
222
  ApplicationSWT.register_shell(@shell)
201
223
  end
202
224
 
203
225
  def create_sashes(window_model)
204
226
  orientation = horizontal_vertical(window_model.notebook_orientation)
205
- @sash = Swt::Custom::SashForm.new(@shell, orientation)
206
- grid_data = Swt::Layout::GridData.new(Swt::Layout::GridData::FILL_BOTH)
207
- @sash.setLayoutData(grid_data)
208
- @sash.setSashWidth(0)
209
-
210
- @tree_composite = Swt::Widgets::Composite.new(@sash, Swt::SWT::NONE)
211
- @tree_layout = Swt::Custom::StackLayout.new
212
- @tree_composite.setLayout(@tree_layout)
213
- button = Swt::Widgets::Button.new(@tree_composite, Swt::SWT::PUSH)
214
- button.setText("Button in pane2")
215
- @tree_layout.topControl = button
216
-
217
- @right_composite = Swt::Widgets::Composite.new(@sash, Swt::SWT::NONE)
218
- @grid_layout = Swt::Layout::GridLayout.new(1, false)
219
- @grid_layout.verticalSpacing = 0
220
- @grid_layout.marginHeight = 0
221
- @grid_layout.horizontalSpacing = 0
222
- @grid_layout.marginWidth = 0
223
- @right_composite.setLayout(@grid_layout)
224
-
225
- @notebook_sash = Swt::Custom::SashForm.new(@right_composite, orientation)
226
- #grid_data = Swt::Layout::GridData.new
227
- #grid_data.grabExcessHorizontalSpace = true
228
- #grid_data.horizontalAlignment = Swt::Layout::GridData::FILL
229
- #grid_data.grabExcessVerticalSpace = true
230
- #grid_data.verticalAlignment = Swt::Layout::GridData::FILL
227
+
228
+ @tree_composite = Swt::Widgets::Composite.new(@shell, Swt::SWT::NONE)
229
+ @tree_layout = Swt::Custom::StackLayout.new
230
+ @tree_composite.setLayout(@tree_layout)
231
+
232
+ @sash = Swt::Widgets::Sash.new(@shell, Swt::SWT::VERTICAL)
233
+ @right_composite = Swt::Widgets::Composite.new(@shell, Swt::SWT::NONE)
234
+
235
+
236
+ @tree_composite.layout_data = Swt::Layout::FormData.new.tap do |l|
237
+ l.left = Swt::Layout::FormAttachment.new(0, 5)
238
+ l.right = Swt::Layout::FormAttachment.new(@sash, 0)
239
+ l.top = Swt::Layout::FormAttachment.new(0, 5)
240
+ l.bottom = Swt::Layout::FormAttachment.new(100, -5)
241
+ end
242
+
243
+ @right_composite.layout = Swt::Layout::GridLayout.new(1, false).tap do |l|
244
+ l.verticalSpacing = 0
245
+ l.marginHeight = 0
246
+ l.horizontalSpacing = 0
247
+ l.marginWidth = 0
248
+ end
249
+
250
+ @sash.layout_data = Swt::Layout::FormData.new.tap do |d|
251
+ d.left = Swt::Layout::FormAttachment.new(0, 0)
252
+ d.top = Swt::Layout::FormAttachment.new(0, 0)
253
+ d.bottom = Swt::Layout::FormAttachment.new(100, 0)
254
+ end
255
+
256
+ @sash.add_selection_listener do |e|
257
+ sash_rect = @sash.bounds
258
+ shell_rect = @shell.client_area
259
+ right = shell_rect.width - sash_rect.width - SASH_WIDTH
260
+ e.x = [[e.x, right].min, SASH_WIDTH].max
261
+ if (e.x != sash_rect.x)
262
+ if @window.treebook.trees.any?
263
+ @sash.layout_data.left = Swt::Layout::FormAttachment.new(0, e.x)
264
+ else
265
+ @sash.layout_data.left = Swt::Layout::FormAttachment.new(0, 0)
266
+ end
267
+ @shell.layout
268
+ end
269
+ end
270
+
271
+ @right_composite.layout_data = Swt::Layout::FormData.new.tap do |d|
272
+ d.left = Swt::Layout::FormAttachment.new(@sash, 0)
273
+ d.right = Swt::Layout::FormAttachment.new(100, -5)
274
+ d.top = Swt::Layout::FormAttachment.new(0, 5)
275
+ d.bottom = Swt::Layout::FormAttachment.new(100, -5)
276
+ end
277
+
278
+ @notebook_sash = Swt::Custom::SashForm.new(@right_composite, orientation)
231
279
  grid_data = Swt::Layout::GridData.new(Swt::Layout::GridData::FILL_BOTH)
232
- @notebook_sash.setLayoutData(grid_data)
233
- @notebook_sash.setSashWidth(SASH_WIDTH)
280
+ @notebook_sash.layout_data = grid_data
281
+ @notebook_sash.sash_width = SASH_WIDTH
234
282
  end
235
-
236
- attr_reader :right_composite
237
283
 
238
284
  def horizontal_vertical(symbol)
239
285
  case symbol
@@ -245,14 +291,13 @@ module Redcar
245
291
  end
246
292
 
247
293
  def reset_sash_widths
294
+ @treebook_unopened = !@window.treebook.trees.any?
248
295
  if @window.treebook.trees.any?
249
- @sash.setWeights([TREEBOOK_WIDTH, 100 - TREEBOOK_WIDTH].to_java(:int))
250
- @sash.setSashWidth(SASH_WIDTH)
296
+ @sash.layout_data.left = Swt::Layout::FormAttachment.new(0, TREEBOOK_WIDTH + SASH_WIDTH)
251
297
  else
252
- @sash.setWeights([0,100].to_java(:int))
253
- @sash.setSashWidth(0)
254
- @treebook_unopened = true
298
+ @sash.layout_data.left = Swt::Layout::FormAttachment.new(0, 0)
255
299
  end
300
+ @shell.layout
256
301
  end
257
302
 
258
303
  def reset_notebook_sash_widths