clevic 0.13.0.b9 → 0.13.0.b10

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 (85) hide show
  1. data/History.txt +3 -0
  2. data/lib/clevic/action_builder.rb +16 -16
  3. data/lib/clevic/ar_methods.rb +22 -22
  4. data/lib/clevic/attribute_list.rb +5 -5
  5. data/lib/clevic/cache_table.rb +18 -18
  6. data/lib/clevic/dataset_roller.rb +3 -3
  7. data/lib/clevic/default_view.rb +4 -4
  8. data/lib/clevic/delegate.rb +8 -8
  9. data/lib/clevic/delegates/combo_delegate.rb +22 -22
  10. data/lib/clevic/delegates/distinct_delegate.rb +5 -5
  11. data/lib/clevic/delegates/relational_delegate.rb +6 -6
  12. data/lib/clevic/delegates/set_delegate.rb +3 -3
  13. data/lib/clevic/dirty.rb +1 -1
  14. data/lib/clevic/emitter.rb +3 -3
  15. data/lib/clevic/extensions.rb +4 -4
  16. data/lib/clevic/field.rb +68 -68
  17. data/lib/clevic/field_valuer.rb +26 -26
  18. data/lib/clevic/filter_command.rb +6 -6
  19. data/lib/clevic/framework.rb +3 -3
  20. data/lib/clevic/generic_format.rb +2 -2
  21. data/lib/clevic/many_field.rb +3 -3
  22. data/lib/clevic/model_builder.rb +88 -84
  23. data/lib/clevic/model_column.rb +13 -13
  24. data/lib/clevic/ordered_dataset.rb +7 -7
  25. data/lib/clevic/qt/action_builder.rb +3 -3
  26. data/lib/clevic/qt/browser.rb +28 -28
  27. data/lib/clevic/qt/clipboard.rb +5 -5
  28. data/lib/clevic/qt/combo_delegate.rb +12 -12
  29. data/lib/clevic/qt/distinct_delegate.rb +1 -1
  30. data/lib/clevic/qt/extensions.rb +4 -4
  31. data/lib/clevic/qt/qt_combo_box.rb +7 -7
  32. data/lib/clevic/qt/relational_delegate.rb +5 -5
  33. data/lib/clevic/qt/search_dialog.rb +15 -15
  34. data/lib/clevic/qt/simplest_delegate.rb +2 -2
  35. data/lib/clevic/qt/table_model.rb +46 -46
  36. data/lib/clevic/qt/table_view.rb +48 -48
  37. data/lib/clevic/qt/text_delegate.rb +9 -9
  38. data/lib/clevic/rails_models_loaders.rb +3 -3
  39. data/lib/clevic/record.rb +8 -8
  40. data/lib/clevic/sampler.rb +6 -6
  41. data/lib/clevic/sequel_ar_adapter.rb +22 -22
  42. data/lib/clevic/sequel_clevic.rb +10 -10
  43. data/lib/clevic/sequel_meta.rb +5 -5
  44. data/lib/clevic/sequel_naked.rb +4 -4
  45. data/lib/clevic/swing/action.rb +20 -20
  46. data/lib/clevic/swing/action_builder.rb +2 -2
  47. data/lib/clevic/swing/boolean_delegate.rb +3 -3
  48. data/lib/clevic/swing/browser.rb +37 -37
  49. data/lib/clevic/swing/cell_editor.rb +13 -13
  50. data/lib/clevic/swing/cell_renderer.rb +7 -7
  51. data/lib/clevic/swing/clipboard.rb +19 -19
  52. data/lib/clevic/swing/combo_delegate.rb +26 -26
  53. data/lib/clevic/swing/confirm_dialog.rb +7 -7
  54. data/lib/clevic/swing/delegate.rb +4 -4
  55. data/lib/clevic/swing/extensions.rb +24 -24
  56. data/lib/clevic/swing/field.rb +1 -1
  57. data/lib/clevic/swing/relational_delegate.rb +2 -2
  58. data/lib/clevic/swing/row_header.rb +32 -32
  59. data/lib/clevic/swing/search_dialog.rb +31 -31
  60. data/lib/clevic/swing/selection_model.rb +12 -12
  61. data/lib/clevic/swing/swing_table_index.rb +6 -6
  62. data/lib/clevic/swing/table_model.rb +30 -30
  63. data/lib/clevic/swing/table_view.rb +54 -54
  64. data/lib/clevic/swing/table_view_focus.rb +4 -4
  65. data/lib/clevic/swing/tag_delegate.rb +14 -14
  66. data/lib/clevic/swing/tag_editor.rb +4 -4
  67. data/lib/clevic/swing/text_area_delegate.rb +6 -6
  68. data/lib/clevic/swing/text_delegate.rb +4 -4
  69. data/lib/clevic/table_index.rb +14 -14
  70. data/lib/clevic/table_model.rb +30 -30
  71. data/lib/clevic/table_searcher.rb +19 -19
  72. data/lib/clevic/table_view.rb +92 -92
  73. data/lib/clevic/table_view_paste.rb +19 -19
  74. data/lib/clevic/version.rb +1 -1
  75. data/lib/clevic/view.rb +22 -22
  76. data/models/accounts_models.rb +10 -10
  77. data/models/examples.rb +2 -2
  78. data/models/times_models.rb +32 -32
  79. data/models/values_models.rb +2 -2
  80. data/test/test_cache_table.rb +15 -15
  81. data/test/test_helper.rb +7 -7
  82. data/test/test_model_index_extensions.rb +6 -6
  83. data/test/test_table_model.rb +6 -6
  84. data/test/test_table_searcher.rb +25 -25
  85. metadata +33 -35
@@ -10,140 +10,140 @@ module Clevic
10
10
  else
11
11
  super()
12
12
  end
13
-
13
+
14
14
  init_controls
15
15
  init_layout
16
-
16
+
17
17
  self.default_close_operation = javax.swing.WindowConstants::HIDE_ON_CLOSE
18
18
  self.name = "SearchDialog"
19
19
  self.modal = modal
20
20
  self.title = "Search"
21
-
21
+
22
22
  # Enter triggers Ok button
23
23
  root_pane.default_button = ok_button
24
-
24
+
25
25
  # TODO finish this for Esc key to close dialog
26
26
  #~ esc = javax.swing.KeyStroke.getKeyStroke( KeyEvent.VK_ESCAPE, 0 )
27
27
  #~ root_pane.registerKeyboardAction( actionListener, stroke, javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW )
28
28
  end
29
-
29
+
30
30
  # after the dialog, this will be either accepted or rejected
31
31
  attr_reader :status
32
-
32
+
33
33
  def from_start?
34
34
  from_start.selected
35
35
  end
36
-
36
+
37
37
  def from_start=( value )
38
38
  from_start.selected = value
39
39
  end
40
-
40
+
41
41
  def regex?
42
42
  regex.selected
43
43
  end
44
-
44
+
45
45
  def whole_words?
46
46
  whole_words.selected
47
47
  end
48
-
48
+
49
49
  def forwards?
50
50
  forwards.selected
51
51
  end
52
-
52
+
53
53
  def backwards?
54
54
  backwards.selected
55
55
  end
56
-
56
+
57
57
  # return either :backwards or :forwards
58
58
  def direction
59
59
  return :forwards if forwards?
60
60
  return :backwards if backwards?
61
61
  raise "direction not known"
62
62
  end
63
-
63
+
64
64
  # show the dialog, wait for close,
65
65
  # return an object that understands rejected? and accepted?
66
66
  def exec( text = '' )
67
67
  self.search_text = text
68
68
  search_combo.request_focus
69
69
  search_combo.editor.select_all
70
-
70
+
71
71
  # modal dialog, so this will wait
72
72
  show
73
-
73
+
74
74
  # remember previous searches
75
75
  unless search_combo.include?( search_text )
76
76
  search_combo << search_text
77
77
  end
78
-
78
+
79
79
  self
80
80
  end
81
-
81
+
82
82
  def search_text=( value )
83
83
  search_combo.editor.item = value.to_s
84
84
  end
85
-
85
+
86
86
  def search_text
87
87
  search_combo.editor.item
88
88
  end
89
-
89
+
90
90
  def accepted?
91
91
  status == :accept
92
92
  end
93
-
93
+
94
94
  def accept!
95
95
  @status = :accept
96
96
  end
97
-
97
+
98
98
  def rejected?
99
99
  status == :reject
100
100
  end
101
-
101
+
102
102
  def reject!
103
103
  @status = :reject
104
104
  end
105
-
105
+
106
106
  attr_reader :search_label, :search_combo
107
107
  attr_reader :from_start, :whole_words, :regex
108
108
  attr_reader :forwards, :backwards
109
109
  attr_reader :ok_button, :cancel_button
110
-
110
+
111
111
  def init_controls
112
112
  @search_label = javax.swing.JLabel.new( "Search" ).tap do |search_label|
113
113
  search_label.text = "Search"
114
114
  search_label.name = "search_label"
115
115
  end
116
-
116
+
117
117
  @search_combo = javax.swing.JComboBox.new.tap do |search_combo|
118
118
  search_combo.editable = true
119
119
  search_combo.name = "search_combo"
120
120
  end
121
-
121
+
122
122
  @from_start = javax.swing.JCheckBox.new.tap do |from_start|
123
123
  from_start.mnemonic = 'S'
124
124
  from_start.text = "From Start"
125
125
  from_start.name = "from_start"
126
126
  end
127
-
127
+
128
128
  @regex = javax.swing.JCheckBox.new.tap do |regex|
129
129
  regex.mnemonic = 'R'
130
130
  regex.text = "Regular Expression"
131
131
  regex.name = "regex"
132
132
  end
133
-
133
+
134
134
  @whole_words = javax.swing.JCheckBox.new.tap do |whole_words|
135
135
  whole_words.mnemonic = 'W'
136
136
  whole_words.text = "Whole words"
137
137
  whole_words.name = "whole_words"
138
138
  end
139
-
139
+
140
140
  @forwards = javax.swing.JRadioButton.new.tap do |forwards|
141
141
  forwards.mnemonic = 'F'
142
142
  forwards.text = "Forwards"
143
143
  forwards.name = "forwards"
144
144
  forwards.selected = true
145
145
  end
146
-
146
+
147
147
  @backwards = javax.swing.JRadioButton.new.tap do |backwards|
148
148
  backwards.mnemonic = 'B'
149
149
  backwards.text = "Backwards"
@@ -170,7 +170,7 @@ module Clevic
170
170
  end
171
171
  end
172
172
  end
173
-
173
+
174
174
  # this was originally Java from NetBeans, so it's really ugly.
175
175
  # Note that for 1.5 compatibility, we have to use org.jdesktop.layout.GroupLayout
176
176
  # and include swing-layout-1.0.3.jar
@@ -14,19 +14,19 @@ class SelectionRange
14
14
  @row_range = row_range
15
15
  @column_range = column_range
16
16
  end
17
-
17
+
18
18
  def height
19
19
  @row_range.distance
20
20
  end
21
-
21
+
22
22
  def width
23
23
  @column_range.distance
24
24
  end
25
-
25
+
26
26
  def top_left
27
27
  SwingTableIndex.new( nil, @row_range.first, @column_range.first )
28
28
  end
29
-
29
+
30
30
  def bottom_right
31
31
  SwingTableIndex.new( nil, @row_range.last, @column_range.last )
32
32
  end
@@ -36,13 +36,13 @@ class SelectionModel
36
36
  def initialize( table_view )
37
37
  @table_view = table_view
38
38
  end
39
-
39
+
40
40
  attr_reader :table_view
41
-
41
+
42
42
  def jtable
43
43
  @table_view.jtable
44
44
  end
45
-
45
+
46
46
  # return a collection of selection ranges
47
47
  def ranges
48
48
  rv = []
@@ -53,27 +53,27 @@ class SelectionModel
53
53
  end
54
54
  rv
55
55
  end
56
-
56
+
57
57
  def single_cell?
58
58
  jtable.selected_row_count == 1 && jtable.selected_column_count == 1
59
59
  end
60
-
60
+
61
61
  def selected?( row, column )
62
62
  selected_indexes.first.with do |index|
63
63
  index.row == row &&
64
64
  index.column == column
65
65
  end
66
66
  end
67
-
67
+
68
68
  # return an array of integer indexes for currently selected rows
69
69
  def row_indexes
70
70
  jtable.selected_rows.to_a
71
71
  end
72
-
72
+
73
73
  def clear
74
74
  jtable.clear_selection
75
75
  end
76
-
76
+
77
77
  # return the full set of selected indexes, ordered
78
78
  # by row then column
79
79
  def selected_indexes
@@ -5,17 +5,17 @@ module Clevic
5
5
  class SwingTableIndex
6
6
  include TableIndex
7
7
  include Gather
8
-
8
+
9
9
  def initialize( model, row, column )
10
10
  @model, @row, @column = model, row.to_i, column.to_i
11
11
  end
12
12
  attr_accessor :model
13
13
  property :row, :column
14
-
14
+
15
15
  def valid?
16
16
  row != -1 && column != -1 && model != nil
17
17
  end
18
-
18
+
19
19
  def self.invalid
20
20
  new( nil, -1, -1 )
21
21
  end
@@ -23,14 +23,14 @@ module Clevic
23
23
  def choppy( *args, &block )
24
24
  return self unless self.valid?
25
25
  copied = clone.gather( *args, &block )
26
-
26
+
27
27
  # TODO this is mostly shared with Qt
28
-
28
+
29
29
  # convert a column name to a column index
30
30
  unless copied.column.is_a?( Numeric )
31
31
  copied.column = model.field_column( copied.column )
32
32
  end
33
-
33
+
34
34
  # return an invalid index if it's out of bounds,
35
35
  # or the copied index if it's OK.
36
36
  if copied.row >= model.row_count || copied.column >= model.column_count
@@ -19,45 +19,45 @@ including the Clevic::Record module in a Sequel::Model subclass.
19
19
  =end
20
20
  class TableModel < javax.swing.table.AbstractTableModel
21
21
  include Emitter
22
-
22
+
23
23
  # index, value, message
24
24
  emitter :data_error
25
-
25
+
26
26
  def initialize
27
27
  super()
28
28
  end
29
-
29
+
30
30
  def create_index( row, column )
31
31
  SwingTableIndex.new( self, row, column )
32
32
  end
33
-
33
+
34
34
  # add a new item, and set defaults from the Clevic::View
35
35
  def add_new_item_start
36
36
  # don't need to do anything
37
37
  end
38
-
38
+
39
39
  def add_new_item_end
40
40
  fireTableRowsInserted( collection.size, collection.size )
41
41
  end
42
-
42
+
43
43
  def remove_notify( rows, &block )
44
44
  # no need to do anything before removing rows
45
45
  yield
46
46
  # tell the views
47
47
  fireTableRowsDeleted( rows.first, rows.last )
48
48
  end
49
-
49
+
50
50
  # Tell the UI we had a major data change
51
51
  def reset
52
52
  # could also use fireTableStructureChanged(), but it doesn't seem necessary
53
53
  fireTableDataChanged
54
54
  end
55
-
55
+
56
56
  # override TableModel method
57
57
  def getRowCount
58
58
  collection.size
59
59
  end
60
-
60
+
61
61
  # make it ruby-nice
62
62
  alias_method :row_count, :getRowCount
63
63
 
@@ -65,15 +65,15 @@ class TableModel < javax.swing.table.AbstractTableModel
65
65
  def getColumnCount
66
66
  fields.size
67
67
  end
68
-
68
+
69
69
  # make it ruby-nice
70
70
  alias_method :column_count, :getColumnCount
71
-
71
+
72
72
  # override TableModel method
73
73
  def getColumnName( column_index )
74
74
  fields[column_index].label
75
75
  end
76
-
76
+
77
77
  # override TableModel method
78
78
  def getColumnClass( column_index )
79
79
  if fields[column_index].meta.type == :boolean || fields[column_index].delegate.is_a?( BooleanDelegate )
@@ -84,35 +84,35 @@ class TableModel < javax.swing.table.AbstractTableModel
84
84
  java.lang.Object
85
85
  end
86
86
  end
87
-
87
+
88
88
  def isCellEditable( row_index, column_index )
89
89
  index = create_index( row_index, column_index )
90
90
  !( index.field.read_only? || index.entity.andand.readonly? || read_only? )
91
91
  end
92
-
92
+
93
93
  def valuer_for( index )
94
94
  case
95
95
  # pull values from entity at index
96
96
  when index.field.entity_class == entity_class
97
97
  index
98
-
98
+
99
99
  # pull values from the Clevic::View class
100
100
  when entity_view.class.ancestors.include?( Clevic::View )
101
101
  #~ entity_view.entity = index.entity
102
102
  FieldValuer.valuer( index.field, entity_view )
103
-
103
+
104
104
  else
105
105
  raise "No valuer for #{index.inspect}"
106
106
  end
107
107
  end
108
-
108
+
109
109
  # Provide raw value to renderers
110
110
  def getValueAt( row_index, column_index )
111
111
  index = create_index( row_index, column_index )
112
-
112
+
113
113
  #~ valuer = valuer_for( index )
114
114
  valuer = index
115
-
115
+
116
116
  if index.field.delegate.native
117
117
  valuer.display_value
118
118
  else
@@ -124,16 +124,16 @@ class TableModel < javax.swing.table.AbstractTableModel
124
124
  puts $!.backtrace
125
125
  nil
126
126
  end
127
-
127
+
128
128
  def setValueAt( value, row_index, column_index )
129
129
  index = create_index( row_index, column_index )
130
130
  #~ puts "setting index: #{index.inspect} to #{value.inspect}"
131
131
  #~ valuer = valuer_for( index )
132
132
  valuer = index
133
-
133
+
134
134
  # Don't allow the primary key to be changed
135
135
  return if index.attribute == entity_class.primary_key.to_sym
136
-
136
+
137
137
  # translate the value from the ui to something that
138
138
  # the DB entity will understand
139
139
  begin
@@ -143,19 +143,19 @@ class TableModel < javax.swing.table.AbstractTableModel
143
143
  # more specific descendant first
144
144
  when java.util.Time
145
145
  Time.new( value.hour, value.min, value.sec )
146
-
146
+
147
147
  when java.util.Date
148
148
  Date.new( value.year, value.month, value.day )
149
-
149
+
150
150
  else
151
151
  raise "don't know how to convert a #{value.class.name}:#{value.inspect}"
152
152
  end
153
153
  else
154
154
  valuer.edit_value = value
155
155
  end
156
-
156
+
157
157
  valuer.entity.save
158
-
158
+
159
159
  data_changed( index )
160
160
  rescue Exception => e
161
161
  puts "#{__FILE__}:#{__LINE__}:e.message: #{e.message}"
@@ -163,7 +163,7 @@ class TableModel < javax.swing.table.AbstractTableModel
163
163
  emit_data_error( index, value, e.message )
164
164
  end
165
165
  end
166
-
166
+
167
167
  # A rubyish way of doing dataChanged
168
168
  # - if args has one element, it's either a single ModelIndex
169
169
  # or something that understands top_left and bottom_right. These
@@ -181,10 +181,10 @@ class TableModel < javax.swing.table.AbstractTableModel
181
181
  # assume it's a ModelIndex, so one cell was updated
182
182
  fireTableCellUpdated( arg.row, arg.column )
183
183
  end
184
-
184
+
185
185
  when 2
186
186
  fireTableRowsUpdated( args.first.row, args.last.row )
187
-
187
+
188
188
  else
189
189
  unless block.nil?
190
190
  change = DataChange.new
@@ -194,7 +194,7 @@ class TableModel < javax.swing.table.AbstractTableModel
194
194
  end
195
195
  end
196
196
  end
197
-
197
+
198
198
  end
199
199
 
200
200
  end #module