redcar 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
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