clevic 0.13.0.b9 → 0.13.0.b10

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -80,7 +80,7 @@ class Sampler
80
80
  def string_sample
81
81
  'N' * ( entity_class.max( :length.sql_function( field_name ) ).andand.to_i || 20 )
82
82
  end
83
-
83
+
84
84
  def sample_date_time
85
85
  ds = entity_class \
86
86
  .filter( ~{ field_name => nil } ) \
@@ -90,33 +90,33 @@ class Sampler
90
90
  # isn't called unless we access the value via the entity object
91
91
  ds.first.send( field_name )
92
92
  end
93
-
93
+
94
94
  def date_time_sample
95
95
  # replace all letters with 'N'
96
96
  # and numbers with 8
97
97
  do_format( sample_date_time || Date.today ).andand.gsub( /[[:alpha:]]/, 'N' ).gsub( /\d/, '8' )
98
98
  end
99
-
99
+
100
100
  def numeric_sample
101
101
  max = entity_class.max( field_name )
102
102
  min = entity_class.min( field_name )
103
103
  max_length = [ do_format( min ).to_s, do_format( max ).to_s ].map( &:length ).max
104
104
  '9' * ( max_length || 5 )
105
105
  end
106
-
106
+
107
107
  # Hmm. The first reified exemplar of a relational nested Field
108
108
  class VirtualField
109
109
  def initialize( entity_class, display )
110
110
  @entity_class, @display = entity_class, display
111
111
  end
112
-
112
+
113
113
  def entity_class; @entity_class; end
114
114
  def attribute; @display; end
115
115
  def display; nil; end
116
116
  def meta; @entity_class.meta[attribute]; end
117
117
  def set; nil; end
118
118
  end
119
-
119
+
120
120
  def related_sample
121
121
  if display.respond_to?( :to_sym )
122
122
  Sampler.new( VirtualField.new( eval( meta.class_name ), display.to_sym ), &@format_block ).compute
@@ -10,48 +10,48 @@ module Clevic
10
10
  @entity_class = entity_class
11
11
  @entity_class.plugin :ar_methods
12
12
  end
13
-
13
+
14
14
  def quoted_false
15
15
  @entity_class.dataset.boolean_constant_sql( false )
16
16
  end
17
-
17
+
18
18
  def quoted_true
19
19
  @entity_class.dataset.boolean_constant_sql( true )
20
20
  end
21
-
21
+
22
22
  def count( *args )
23
23
  @entity_class.count_ar( *args )
24
24
  end
25
-
25
+
26
26
  def find( *args )
27
27
  @entity_class.find_ar( *args )
28
28
  end
29
-
29
+
30
30
  def attribute_list( attribute, attribute_value, by_description, by_frequency, find_options, &block )
31
31
  lister = AttributeList.new( @entity_class, attribute, attribute_value, find_options )
32
32
  ds = lister.dataset( by_description, by_frequency )
33
33
  ds.map( &block )
34
34
  end
35
35
  end
36
-
36
+
37
37
  class ActiveRecordAdaptor
38
38
  def initialize( entity_class )
39
39
  @entity_class = entity_class
40
40
  end
41
-
41
+
42
42
  def quoted_false
43
43
  @entity_class.connection.quoted_false
44
44
  end
45
-
45
+
46
46
  def quoted_true
47
47
  @entity_class.connection.quoted_true
48
48
  end
49
-
49
+
50
50
  # options is a hash
51
51
  def count( attribute = nil, options = {} )
52
52
  @entity_class.count( attribute, options )
53
53
  end
54
-
54
+
55
55
  def find( options )
56
56
  @entity_class.find( :all, options )
57
57
  end
@@ -65,7 +65,7 @@ module Clevic
65
65
  order by lower(#{attribute.to_s})
66
66
  EOF
67
67
  end
68
-
68
+
69
69
  def query_order_frequency( attribute, attribute_value, find_options )
70
70
  <<-EOF
71
71
  select distinct #{attribute.to_s}, count(#{attribute.to_s})
@@ -76,7 +76,7 @@ module Clevic
76
76
  order by count(#{attribute.to_s}) desc
77
77
  EOF
78
78
  end
79
-
79
+
80
80
  # values are passed as row objects to block
81
81
  def attribute_list( attribute, attribute_value, by_description, by_frequency, find_options, &block )
82
82
  query =
@@ -88,7 +88,7 @@ module Clevic
88
88
  else
89
89
  entity_class.adaptor.query_order_frequency( attribute, attribute_value, find_options )
90
90
  end
91
-
91
+
92
92
  entity_class.connection.execute( query ).each( &block )
93
93
  end
94
94
  end
@@ -108,11 +108,11 @@ if defined? ActiveRecord
108
108
  false
109
109
  end
110
110
  end
111
-
111
+
112
112
  def self.attribute_names
113
113
  ( column_names + reflections.keys.map {|sym| sym.to_s} ).sort
114
114
  end
115
-
115
+
116
116
  def adaptor
117
117
  @adaptor ||= Clevic::ActiveRecordAdaptor.new( self )
118
118
  end
@@ -127,12 +127,12 @@ module Sequel
127
127
  def translate_options( options )
128
128
  options[:key] = options[:foreign_key].andand.to_sym
129
129
  options.delete( :foreign_key )
130
-
130
+
131
131
  options[:class] = options[:class_name].andand.to_sym
132
132
  options.delete( :class_name )
133
133
  options
134
134
  end
135
-
135
+
136
136
  def belongs_to( name, options = nil, &block )
137
137
  # work around possible Sequel bug
138
138
  if options.nil?
@@ -141,7 +141,7 @@ module Sequel
141
141
  many_to_one( name, translate_options( options ), &block )
142
142
  end
143
143
  end
144
-
144
+
145
145
  def has_many( name, options = nil, &block )
146
146
  # work around possible Sequel bug
147
147
  if options.nil?
@@ -150,11 +150,11 @@ module Sequel
150
150
  one_to_many( name, translate_options( options ), &block )
151
151
  end
152
152
  end
153
-
153
+
154
154
  def columns_hash
155
155
  db_schema
156
156
  end
157
-
157
+
158
158
  # return a class containing various db methods. Not sure
159
159
  # if this is the right way to do it, but at least this way
160
160
  # the model class namespace doesn't get filled up with crud
@@ -162,14 +162,14 @@ module Sequel
162
162
  @adaptor ||= Clevic::SequelAdaptor.new( self )
163
163
  end
164
164
  end
165
-
165
+
166
166
  module Associations
167
167
  class ManyToOneAssociationReflection
168
168
  # return class for this side of the association
169
169
  def class_name
170
170
  self[:class_name]
171
171
  end
172
-
172
+
173
173
  # return class for the other side of the association
174
174
  def klass
175
175
  eval class_name
@@ -11,49 +11,49 @@ module Sequel
11
11
  # store model-related stuff here
12
12
  end
13
13
  end
14
-
14
+
15
15
  module ClassMethods
16
16
  # Copy the necessary class instance variables to the subclass.
17
17
  def inherited(subclass)
18
18
  super
19
19
  end
20
-
20
+
21
21
  # This doesn't really belong here, but I don't want to make
22
22
  # a whole new plugin.
23
23
  def table_exists?
24
24
  db.table_exists?( implicit_table_name )
25
25
  end
26
-
26
+
27
27
  # Hmm, maybe these need to go in a different plugin
28
28
  def column_names
29
29
  columns
30
30
  end
31
-
31
+
32
32
  # Getting heavy enough, yet?
33
33
  def reflections
34
34
  association_reflections
35
35
  end
36
-
36
+
37
37
  def attribute_names
38
38
  columns + reflections.keys
39
39
  end
40
-
40
+
41
41
  def has_attribute?( attribute )
42
42
  attribute_names.include?( attribute )
43
43
  end
44
-
44
+
45
45
  end
46
-
46
+
47
47
  module InstanceMethods
48
48
  # This should also go in another plugin
49
49
  def changed?
50
50
  modified?
51
51
  end
52
-
52
+
53
53
  def readonly?
54
54
  false
55
55
  end
56
-
56
+
57
57
  def new_record?
58
58
  new?
59
59
  end
@@ -13,7 +13,7 @@ module Sequel
13
13
  # store model-related stuff here
14
14
  end
15
15
  end
16
-
16
+
17
17
  module ClassMethods
18
18
  def meta
19
19
  if @meta.nil?
@@ -21,20 +21,20 @@ module Sequel
21
21
  db_schema.each do |key,value|
22
22
  @meta[key] = ModelColumn.new( key, value.merge( :association => false ) )
23
23
  end
24
-
24
+
25
25
  association_reflections.each do |key,value|
26
26
  @meta[key] = ModelColumn.new( key, value.merge( :association => true ) )
27
27
  end
28
28
  end
29
29
  @meta
30
30
  end
31
-
31
+
32
32
  # reload from current metadata
33
33
  def meta!
34
34
  @meta = nil
35
35
  meta
36
36
  end
37
-
37
+
38
38
  # column and relations, but not keys for defined relations
39
39
  def attributes
40
40
  meta.reject do |column,model_column|
@@ -43,7 +43,7 @@ module Sequel
43
43
  end
44
44
 
45
45
  end
46
-
46
+
47
47
  module InstanceMethods
48
48
  end
49
49
  end
@@ -12,17 +12,17 @@ module Sequel
12
12
  # store model-related stuff here
13
13
  end
14
14
  end
15
-
15
+
16
16
  module ClassMethods
17
17
  def inherited(subclass)
18
18
  super
19
19
  end
20
-
20
+
21
21
  def naked( *args )
22
-
22
+
23
23
  end
24
24
  end
25
-
25
+
26
26
  module InstanceMethods
27
27
  end
28
28
  end
@@ -6,7 +6,7 @@ class Action
6
6
  include Gather
7
7
  property :shortcut, :method, :handler, :tool_tip, :visible
8
8
  property :name, :text, :checkable, :enabled
9
-
9
+
10
10
  # Needed to enable / disable accelerators on the fly.
11
11
  def enabled=( bool )
12
12
  # test for @menu_item instead of the method to
@@ -14,24 +14,24 @@ class Action
14
14
  menu_item.enabled = bool unless @menu_item.nil?
15
15
  @enabled = bool
16
16
  end
17
-
17
+
18
18
  def initialize( parent, options = {}, &block )
19
19
  @parent = parent
20
20
  @enabled = true
21
-
21
+
22
22
  # work around the Swing Stupidity detailed in enabled=
23
23
  gather( options, &block )
24
24
  end
25
25
  attr_reader :parent, :menu_item
26
-
26
+
27
27
  def plain_text
28
28
  text.gsub( /&/, '' )
29
29
  end
30
-
30
+
31
31
  def object_name
32
32
  name.to_s
33
33
  end
34
-
34
+
35
35
  # find the java.awt.event.KeyEvent::VK constant
36
36
  # for the letter after the &. Then set it on the item's
37
37
  # mnemonic. Because JMenuItem.setMnemonic won't take a nil
@@ -47,7 +47,7 @@ class Action
47
47
  end
48
48
  @mnemonic
49
49
  end
50
-
50
+
51
51
  def menu_item
52
52
  if @menu_item.nil?
53
53
  @menu_item =
@@ -56,13 +56,13 @@ class Action
56
56
  else
57
57
  javax.swing.JMenuItem.new
58
58
  end
59
-
59
+
60
60
  # Menu item always enabled, until later.
61
61
  # Otherwise it prevents the assignment
62
62
  # of an accelerator key. So we have to
63
63
  # work around yet another Swing stupidity.
64
64
  menu_item.enabled = true
65
-
65
+
66
66
  menu_item.text = plain_text
67
67
  menu_item.mnemonic = mnemonic if mnemonic
68
68
  menu_item.accelerator = parse_shortcut( shortcut ) unless shortcut.nil?
@@ -70,14 +70,14 @@ class Action
70
70
  menu_item.add_action_listener do |event|
71
71
  handler.call( event )
72
72
  end
73
-
73
+
74
74
  # Put this at the end so it doesn't interfere with the
75
75
  # keystroke assignment Swing Stupidity.
76
76
  menu_item.enabled = enabled
77
77
  end
78
78
  @menu_item
79
79
  end
80
-
80
+
81
81
  # parse a Qt-style Ctrl+D shortcut specification
82
82
  # and return a javax.swing.KeyStroke
83
83
  def parse_shortcut( sequence )
@@ -86,7 +86,7 @@ class Action
86
86
  # Yes, the space MUST be last in the charset, otherwise Ctrl-" fails
87
87
  modifiers = sequence.split( /[-+ ]/ )
88
88
  last = modifiers.pop
89
-
89
+
90
90
  modifier_mask = modifiers.inject(0) do |mask,value|
91
91
  mask |
92
92
  if value =~ /ctrl/i
@@ -95,27 +95,27 @@ class Action
95
95
  eval( "java.awt.event.InputEvent::#{value.upcase}_DOWN_MASK" )
96
96
  end
97
97
  end
98
-
98
+
99
99
  keystroke =
100
100
  if last.length == 1
101
101
  case last
102
102
  # these two seem to break the KeyStroke parsing algorithm
103
103
  when "'"
104
104
  javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent::VK_QUOTE, modifier_mask )
105
-
105
+
106
106
  when '"'
107
107
  javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent::VK_QUOTE, modifier_mask | java.awt.event.InputEvent::SHIFT_DOWN_MASK )
108
-
108
+
109
109
  # the conversion in else doesn't work for these
110
110
  when '['
111
111
  javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent::VK_OPEN_BRACKET, modifier_mask )
112
-
112
+
113
113
  when ']'
114
114
  javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent::VK_CLOSE_BRACKET, modifier_mask )
115
-
115
+
116
116
  when ';'
117
117
  javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent::VK_SEMICOLON, modifier_mask )
118
-
118
+
119
119
  else
120
120
  keystring = javax.swing.KeyStroke.getKeyStroke( java.lang.Character.new( last.to_char ), modifier_mask ).toString
121
121
  # have to do this conversion for Mac OS X
@@ -137,11 +137,11 @@ class Separator < Action
137
137
  def initialize
138
138
  super(nil)
139
139
  end
140
-
140
+
141
141
  def shortcut
142
142
  nil
143
143
  end
144
-
144
+
145
145
  def menu_item
146
146
  end
147
147
  end