hotcocoa 0.5.1 → 0.6.0pre
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +14 -0
- data/History.txt +21 -0
- data/README.markdown +84 -0
- data/Rakefile +47 -0
- data/bin/hotcocoa +20 -10
- data/docs/Contributors.markdown +25 -0
- data/docs/Mappings.markdown +352 -0
- data/docs/MappingsExplained.markdown +22 -0
- data/docs/Overview.markdown +58 -0
- data/docs/Resources.markdown +25 -0
- data/docs/Tutorial.markdown +3 -0
- data/lib/hotcocoa/application/builder.rb +237 -0
- data/lib/hotcocoa/application/specification.rb +373 -0
- data/lib/hotcocoa/application_builder.rb +338 -242
- data/lib/hotcocoa/attributed_string_helpers.rb +128 -0
- data/lib/hotcocoa/behaviors.rb +39 -6
- data/lib/hotcocoa/core_extensions/kernel.rb +67 -0
- data/lib/hotcocoa/core_extensions/nsarray.rb +15 -0
- data/lib/hotcocoa/core_extensions/nsmutable_attributed_string.rb +74 -0
- data/lib/hotcocoa/core_extensions/nsstring.rb +36 -0
- data/lib/hotcocoa/core_extensions/nsurl.rb +6 -0
- data/lib/hotcocoa/core_extensions/numeric.rb +9 -0
- data/lib/hotcocoa/core_extensions/object.rb +36 -0
- data/lib/hotcocoa/core_extensions/range.rb +30 -0
- data/lib/hotcocoa/core_extensions.rb +8 -0
- data/lib/hotcocoa/data_sources/combo_box_data_source.rb +38 -38
- data/lib/hotcocoa/data_sources/outline_view_data_source.rb +33 -0
- data/lib/hotcocoa/data_sources/table_data_source.rb +12 -13
- data/lib/hotcocoa/data_sources.rb +3 -0
- data/lib/hotcocoa/delegate_builder.rb +114 -79
- data/lib/hotcocoa/graphics/canvas.rb +211 -214
- data/lib/hotcocoa/graphics/color.rb +89 -91
- data/lib/hotcocoa/graphics/elements/particle.rb +16 -19
- data/lib/hotcocoa/graphics/elements/rope.rb +12 -14
- data/lib/hotcocoa/graphics/elements/sandpainter.rb +11 -13
- data/lib/hotcocoa/graphics/gradient.rb +13 -14
- data/lib/hotcocoa/graphics/image.rb +110 -83
- data/lib/hotcocoa/graphics/path.rb +44 -50
- data/lib/hotcocoa/graphics/pdf.rb +17 -19
- data/lib/hotcocoa/graphics.rb +21 -20
- data/lib/hotcocoa/kvo_accessors.rb +10 -11
- data/lib/hotcocoa/layout_view.rb +394 -379
- data/lib/hotcocoa/mapper.rb +346 -207
- data/lib/hotcocoa/mapping_methods.rb +107 -37
- data/lib/hotcocoa/mappings/appkit/alert.rb +25 -0
- data/lib/hotcocoa/mappings/appkit/application.rb +112 -0
- data/lib/hotcocoa/mappings/{array_controller.rb → appkit/array_controller.rb} +33 -35
- data/lib/hotcocoa/mappings/appkit/box.rb +37 -0
- data/lib/hotcocoa/mappings/appkit/button.rb +88 -0
- data/lib/hotcocoa/mappings/appkit/collection_view.rb +42 -0
- data/lib/hotcocoa/mappings/appkit/color.rb +40 -0
- data/lib/hotcocoa/mappings/appkit/column.rb +19 -0
- data/lib/hotcocoa/mappings/appkit/combo_box.rb +22 -0
- data/lib/hotcocoa/mappings/appkit/control.rb +31 -0
- data/lib/hotcocoa/mappings/appkit/font.rb +58 -0
- data/lib/hotcocoa/mappings/appkit/gradient.rb +19 -0
- data/lib/hotcocoa/mappings/appkit/image.rb +15 -0
- data/lib/hotcocoa/mappings/appkit/image_view.rb +41 -0
- data/lib/hotcocoa/mappings/appkit/label.rb +23 -0
- data/lib/hotcocoa/mappings/appkit/layout_view.rb +9 -0
- data/lib/hotcocoa/mappings/appkit/line.rb +16 -0
- data/lib/hotcocoa/mappings/appkit/menu.rb +78 -0
- data/lib/hotcocoa/mappings/appkit/menu_item.rb +47 -0
- data/lib/hotcocoa/mappings/appkit/outline_view.rb +62 -0
- data/lib/hotcocoa/mappings/appkit/popup.rb +106 -0
- data/lib/hotcocoa/mappings/appkit/progress_indicator.rb +61 -0
- data/lib/hotcocoa/mappings/appkit/scroll_view.rb +28 -0
- data/lib/hotcocoa/mappings/appkit/search_field.rb +9 -0
- data/lib/hotcocoa/mappings/appkit/secure_text_field.rb +15 -0
- data/lib/hotcocoa/mappings/appkit/segmented_control.rb +103 -0
- data/lib/hotcocoa/mappings/appkit/slider.rb +23 -0
- data/lib/hotcocoa/mappings/appkit/sound.rb +9 -0
- data/lib/hotcocoa/mappings/appkit/speech_synthesizer.rb +22 -0
- data/lib/hotcocoa/mappings/appkit/split_view.rb +19 -0
- data/lib/hotcocoa/mappings/appkit/status_bar.rb +7 -0
- data/lib/hotcocoa/mappings/appkit/status_item.rb +9 -0
- data/lib/hotcocoa/mappings/appkit/table_view.rb +108 -0
- data/lib/hotcocoa/mappings/appkit/text_field.rb +36 -0
- data/lib/hotcocoa/mappings/appkit/text_view.rb +13 -0
- data/lib/hotcocoa/mappings/appkit/toolbar.rb +99 -0
- data/lib/hotcocoa/mappings/appkit/toolbar_item.rb +36 -0
- data/lib/hotcocoa/mappings/appkit/tracking_area.rb +24 -0
- data/lib/hotcocoa/mappings/appkit/view.rb +65 -0
- data/lib/hotcocoa/mappings/appkit/window.rb +124 -0
- data/lib/hotcocoa/mappings/foundation/net_service.rb +65 -0
- data/lib/hotcocoa/mappings/foundation/net_service_browser.rb +27 -0
- data/lib/hotcocoa/mappings/foundation/notification.rb +24 -0
- data/lib/hotcocoa/mappings/foundation/sort_descriptor.rb +17 -0
- data/lib/hotcocoa/mappings/foundation/timer.rb +38 -0
- data/lib/hotcocoa/mappings/foundation/user_defaults.rb +43 -0
- data/lib/hotcocoa/mappings/foundation/xml_parser.rb +44 -0
- data/lib/hotcocoa/mappings/qtkit/movie.rb +15 -0
- data/lib/hotcocoa/mappings/qtkit/movie_view.rb +28 -0
- data/lib/hotcocoa/mappings/webkit/web_view.rb +20 -0
- data/lib/hotcocoa/mappings.rb +57 -111
- data/lib/hotcocoa/mvc.rb +90 -81
- data/lib/hotcocoa/notification_listener.rb +135 -58
- data/lib/hotcocoa/standard_rake_tasks.rb +17 -9
- data/lib/hotcocoa/target_action_convenience.rb +39 -0
- data/lib/hotcocoa/template.rb +90 -21
- data/lib/hotcocoa/version.rb +3 -0
- data/lib/hotcocoa.rb +12 -14
- data/template/Rakefile +31 -3
- data/template/__APPLICATION_NAME__.appspec +8 -0
- data/template/lib/application.rb +14 -17
- data/template/lib/menu.rb +11 -11
- data/test/application/test_builder.rb +28 -0
- data/test/application/test_specification.rb +280 -0
- data/test/core_extensions/test_kernel.rb +66 -0
- data/test/core_extensions/test_nsarray.rb +9 -0
- data/test/core_extensions/test_nsmutable_attributed_string.rb +86 -0
- data/test/core_extensions/test_nsstring.rb +20 -0
- data/test/core_extensions/test_nsurl.rb +9 -0
- data/test/core_extensions/test_numeric.rb +10 -0
- data/test/core_extensions/test_object.rb +37 -0
- data/test/core_extensions/test_range.rb +28 -0
- data/test/helper.rb +30 -0
- data/test/mappings/test_bonjour.rb +79 -0
- data/test/mappings/test_color.rb +16 -0
- data/test/mappings/test_font.rb +21 -0
- data/test/mappings/test_tracking_area.rb +18 -0
- data/test/test_application_builder.rb +95 -0
- data/test/test_attributed_string_helpers.rb +63 -0
- data/test/test_behaviours.rb +26 -0
- data/test/test_bin.rb +75 -0
- data/test/test_mapper.rb +100 -0
- data/test/test_mapping_methods.rb +67 -0
- data/test/test_mappings.rb +68 -0
- data/test/test_notification_listener.rb +19 -0
- data/test/test_template.rb +65 -0
- metadata +217 -90
- data/lib/hotcocoa/attributed_string.rb +0 -143
- data/lib/hotcocoa/kernel_ext.rb +0 -14
- data/lib/hotcocoa/mappings/alert.rb +0 -25
- data/lib/hotcocoa/mappings/application.rb +0 -112
- data/lib/hotcocoa/mappings/box.rb +0 -39
- data/lib/hotcocoa/mappings/button.rb +0 -92
- data/lib/hotcocoa/mappings/collection_view.rb +0 -44
- data/lib/hotcocoa/mappings/color.rb +0 -28
- data/lib/hotcocoa/mappings/column.rb +0 -21
- data/lib/hotcocoa/mappings/combo_box.rb +0 -24
- data/lib/hotcocoa/mappings/control.rb +0 -33
- data/lib/hotcocoa/mappings/font.rb +0 -44
- data/lib/hotcocoa/mappings/gradient.rb +0 -15
- data/lib/hotcocoa/mappings/image.rb +0 -15
- data/lib/hotcocoa/mappings/image_view.rb +0 -43
- data/lib/hotcocoa/mappings/label.rb +0 -25
- data/lib/hotcocoa/mappings/layout_view.rb +0 -9
- data/lib/hotcocoa/mappings/menu.rb +0 -71
- data/lib/hotcocoa/mappings/menu_item.rb +0 -47
- data/lib/hotcocoa/mappings/movie.rb +0 -13
- data/lib/hotcocoa/mappings/movie_view.rb +0 -27
- data/lib/hotcocoa/mappings/notification.rb +0 -17
- data/lib/hotcocoa/mappings/popup.rb +0 -110
- data/lib/hotcocoa/mappings/progress_indicator.rb +0 -68
- data/lib/hotcocoa/mappings/scroll_view.rb +0 -29
- data/lib/hotcocoa/mappings/search_field.rb +0 -9
- data/lib/hotcocoa/mappings/secure_text_field.rb +0 -17
- data/lib/hotcocoa/mappings/segmented_control.rb +0 -97
- data/lib/hotcocoa/mappings/slider.rb +0 -25
- data/lib/hotcocoa/mappings/sort_descriptor.rb +0 -13
- data/lib/hotcocoa/mappings/sound.rb +0 -9
- data/lib/hotcocoa/mappings/speech_synthesizer.rb +0 -25
- data/lib/hotcocoa/mappings/split_view.rb +0 -21
- data/lib/hotcocoa/mappings/status_bar.rb +0 -7
- data/lib/hotcocoa/mappings/status_item.rb +0 -9
- data/lib/hotcocoa/mappings/table_view.rb +0 -110
- data/lib/hotcocoa/mappings/text_field.rb +0 -41
- data/lib/hotcocoa/mappings/text_view.rb +0 -13
- data/lib/hotcocoa/mappings/timer.rb +0 -25
- data/lib/hotcocoa/mappings/toolbar.rb +0 -100
- data/lib/hotcocoa/mappings/toolbar_item.rb +0 -36
- data/lib/hotcocoa/mappings/view.rb +0 -67
- data/lib/hotcocoa/mappings/web_view.rb +0 -22
- data/lib/hotcocoa/mappings/window.rb +0 -118
- data/lib/hotcocoa/mappings/xml_parser.rb +0 -41
- data/lib/hotcocoa/object_ext.rb +0 -22
- data/lib/hotcocoa/plist.rb +0 -45
- data/template/config/build.yml +0 -8
- data/test/test_helper.rb +0 -3
- data/test/test_hotcocoa.rb +0 -11
@@ -0,0 +1,23 @@
|
|
1
|
+
HotCocoa::Mappings.map slider: NSSlider do
|
2
|
+
|
3
|
+
defaults frame: CGRectZero, layout: {}
|
4
|
+
|
5
|
+
def init_with_options button, options
|
6
|
+
button.initWithFrame options.delete :frame
|
7
|
+
end
|
8
|
+
|
9
|
+
custom_methods do
|
10
|
+
def min= value
|
11
|
+
setMinValue value
|
12
|
+
end
|
13
|
+
|
14
|
+
def max= value
|
15
|
+
setMaxValue value
|
16
|
+
end
|
17
|
+
|
18
|
+
def tic_marks= value
|
19
|
+
setNumberOfTickMarks value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
HotCocoa::Mappings.map speech_synthesizer: NSSpeechSynthesizer do
|
2
|
+
|
3
|
+
def init_with_options obj, options
|
4
|
+
if voice = options.delete(:voice)
|
5
|
+
obj.initWithVoice voice
|
6
|
+
else
|
7
|
+
obj.init
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
custom_methods do
|
12
|
+
def speak what, to = nil
|
13
|
+
if to
|
14
|
+
url = to.is_a? String ? NSURL.fileURLWithPath(to) : to
|
15
|
+
startSpeakingString what, toURL: url
|
16
|
+
else
|
17
|
+
startSpeakingString what
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
HotCocoa::Mappings.map split_view: NSSplitView do
|
2
|
+
|
3
|
+
defaults layout: {}
|
4
|
+
|
5
|
+
def init_with_options split_view, options
|
6
|
+
split_view.initWithFrame options.delete :frame
|
7
|
+
end
|
8
|
+
|
9
|
+
custom_methods do
|
10
|
+
def horizontal= value
|
11
|
+
setVertical !value
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_position position, of_divider_at_index: index
|
15
|
+
setPosition position, ofDividerAtIndex: index
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
HotCocoa::Mappings.map table_view: NSTableView do
|
2
|
+
|
3
|
+
defaults column_resize: :uniform, frame: CGRectZero, layout: {}
|
4
|
+
|
5
|
+
constant :column_resize, {
|
6
|
+
none: NSTableViewNoColumnAutoresizing,
|
7
|
+
uniform: NSTableViewUniformColumnAutoresizingStyle,
|
8
|
+
sequential: NSTableViewSequentialColumnAutoresizingStyle,
|
9
|
+
reverse_sequential: NSTableViewReverseSequentialColumnAutoresizingStyle,
|
10
|
+
last_column_only: NSTableViewLastColumnOnlyAutoresizingStyle,
|
11
|
+
first_column_only: NSTableViewFirstColumnOnlyAutoresizingStyle
|
12
|
+
}
|
13
|
+
|
14
|
+
constant :grid_style, {
|
15
|
+
none: NSTableViewGridNone,
|
16
|
+
vertical: NSTableViewSolidVerticalGridLineMask,
|
17
|
+
horizontal: NSTableViewSolidHorizontalGridLineMask,
|
18
|
+
both: NSTableViewSolidVerticalGridLineMask|NSTableViewSolidHorizontalGridLineMask
|
19
|
+
}
|
20
|
+
|
21
|
+
constant :selection_style, {
|
22
|
+
regular: NSTableViewSelectionHighlightStyleRegular,
|
23
|
+
source_list: NSTableViewSelectionHighlightStyleSourceList
|
24
|
+
}
|
25
|
+
|
26
|
+
def init_with_options table_view, options
|
27
|
+
table_view.initWithFrame options.delete :frame
|
28
|
+
end
|
29
|
+
|
30
|
+
custom_methods do
|
31
|
+
def data= data_source
|
32
|
+
data_source = HotCocoa::TableDataSource.new data_source if data_source.kind_of? Array
|
33
|
+
setDataSource data_source
|
34
|
+
end
|
35
|
+
|
36
|
+
def columns= columns
|
37
|
+
columns.each { |column| addTableColumn column }
|
38
|
+
end
|
39
|
+
|
40
|
+
def column= column
|
41
|
+
addTableColumn column
|
42
|
+
end
|
43
|
+
|
44
|
+
def auto_size
|
45
|
+
setAutoresizingMask(NSViewHeightSizable|NSViewWidthSizable)
|
46
|
+
end
|
47
|
+
|
48
|
+
def column_resize= style
|
49
|
+
setColumnAutoresizingStyle style
|
50
|
+
end
|
51
|
+
|
52
|
+
def reload
|
53
|
+
reloadData
|
54
|
+
end
|
55
|
+
|
56
|
+
def grid_style= value
|
57
|
+
setGridStyleMask value
|
58
|
+
end
|
59
|
+
|
60
|
+
def on_double_action= behavior
|
61
|
+
if target && (
|
62
|
+
target.instance_variable_get(:@action_behavior) ||
|
63
|
+
target.instance_variable_get(:@double_action_behavior))
|
64
|
+
@object.instance_variable_set :@double_action_behavior, behavior
|
65
|
+
@object = target
|
66
|
+
|
67
|
+
else
|
68
|
+
@object = Object.new
|
69
|
+
@object.instance_variable_set :@double_action_behavior, behavior
|
70
|
+
setTarget object
|
71
|
+
end
|
72
|
+
|
73
|
+
def @object.perform_double_action sender
|
74
|
+
@double_action_behavior.call sender
|
75
|
+
end
|
76
|
+
|
77
|
+
setDoubleAction 'perform_double_action:'
|
78
|
+
end
|
79
|
+
|
80
|
+
def on_double_action &behavior
|
81
|
+
self.on_double_action = behavior
|
82
|
+
self
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
delegating 'tableView:willDisplayCell:forTableColumn:row:', to: :will_display_cell, parameters: [:willDisplayCell, :forTableColumn, :row]
|
87
|
+
delegating 'tableView:dataCellForTableColumn:row:', to: :data_cell, parameters: [:dataCellForTableColumn, :row]
|
88
|
+
delegating 'tableView:shouldShowCellExpansionForTableColumn:row:', to: :expand_cell?, parameters: [:shouldShowCellExpansionForTableColumn, :row]
|
89
|
+
delegating 'tableView:isGroupRow:', to: :is_group_row?, parameters: [:isGroupRow]
|
90
|
+
delegating 'tableView:shouldEditTableColumn:row:', to: :edit_table_column?, parameters: [:shouldEditTableColumn, :row]
|
91
|
+
delegating 'tableView:heightOfRow:', to: :height_of_row, parameters: [:heightOfRow]
|
92
|
+
delegating 'selectionShouldChangeInTableView:', to: :change_selection?
|
93
|
+
delegating 'tableView:shouldSelectRow:', to: :select_row?, parameters: [:shouldSelectRow]
|
94
|
+
delegating 'tableView:selectionIndexesForProposedSelection:', to: :indexes_for_selection, parameters: [:selectIndexesForProposedSelection]
|
95
|
+
delegating 'tableView:shouldSelectTableColumn:', to: :select_column?, parameters: [:shouldSelectTableColumn]
|
96
|
+
delegating 'tableViewSelectionIsChanging:', to: :selection_changing, parameters: [:tableViewSelectionIsChanging]
|
97
|
+
delegating 'tableViewSelectionDidChange:', to: :selection_changed, parameters: [:tableViewSelectionDidChange]
|
98
|
+
delegating 'tableView:shouldTypeSelectForEvent:withCurrentSearchString:', to: :type_select_for_event?, parameters: [:shouldTypeSelectForEvent, :withCurrentSearchString]
|
99
|
+
delegating 'tableView:typeSelectStringForTableColumn:row:', to: :type_select_string, parameters: [:typeSelectStringForTableColumn, :row]
|
100
|
+
delegating 'tableView:nextTypeSelectMatchFromRow:toRow:forString:', to: :find_in_range, parameters: [:nextTypeSelectMatchFromRow, :toRow, :forString]
|
101
|
+
delegating 'tableView:didDragTableColumn:', to: :dragged_column, parameters: [:didDragTableColumn]
|
102
|
+
delegating 'tableViewColumnDidMove:', to: :column_moved, parameters: [:tableViewColumnDidMove]
|
103
|
+
delegating 'tableViewColumnDidResize:', to: :column_resized, parameters: [:tableViewColumnDidResize]
|
104
|
+
delegating 'tableView:didClickTableColumn:', to: :clicked_column, parameters: [:didClickTableColumn]
|
105
|
+
delegating 'tableView:mouseDownInHeaderOfTableColumn:', to: :header_clicked, parameters: [:mouseDownInHeaderOfTableColumn]
|
106
|
+
delegating 'tableView:shouldTrackCell:forTableColumn:row:', to: :track_cell?, parameters: [:shouldTrackCell, :forTableColumn, :row]
|
107
|
+
delegating 'tableView:toolTipForCell:rect:tableColumn:row:mouseLocation:', to: :tooltip_for_cell, parameters: [:toolTipForCell, :rect, :tableColumn, :row, :mouseLocation]
|
108
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
##
|
2
|
+
# @cocoa NSTextField
|
3
|
+
#
|
4
|
+
# @example
|
5
|
+
# @field = text_field(text: 'your text here', layout: {start: false}, frame: [0, 0, 300, 300])
|
6
|
+
# @field.text = 'New text'
|
7
|
+
#
|
8
|
+
# @adc http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSTextField_Class/Reference/Reference.html
|
9
|
+
#
|
10
|
+
HotCocoa::Mappings.map text_field: NSTextField do
|
11
|
+
|
12
|
+
constant :text_align, {
|
13
|
+
right: NSRightTextAlignment,
|
14
|
+
left: NSLeftTextAlignment,
|
15
|
+
center: NSCenterTextAlignment
|
16
|
+
}
|
17
|
+
|
18
|
+
defaults selectable: true, editable: true, layout: {}, frame: CGRectZero
|
19
|
+
|
20
|
+
def init_with_options text_field, options
|
21
|
+
text_field.initWithFrame options.delete :frame
|
22
|
+
end
|
23
|
+
|
24
|
+
custom_methods do
|
25
|
+
def text_align= value
|
26
|
+
setAlignment value
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
delegating 'control:textShouldBeginEditing:', to: :should_begin_editing?, parameters: [:textShouldBeginEditing]
|
31
|
+
delegating 'control:textShouldEndEditing:', to: :should_end_editing?, parameters: [:textShouldEndEditing]
|
32
|
+
delegating 'controlTextDidBeginEditing:', to: :did_begin_editing, parameters: ["controlTextDidBeginEditing.userInfo['NSFieldEditor']"]
|
33
|
+
delegating 'controlTextDidEndEditing:', to: :did_end_editing, parameters: ["controlTextDidEndEditing.userInfo['NSFieldEditor']"]
|
34
|
+
delegating 'controlTextDidChange:', to: :did_change, parameters: ["controlTextDidChange.userInfo['NSFieldEditor']"]
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
HotCocoa::Mappings.map text_view: NSTextView do
|
2
|
+
|
3
|
+
defaults layout: {}, frame: CGRectZero
|
4
|
+
|
5
|
+
def init_with_options text_view, options
|
6
|
+
if options[:container]
|
7
|
+
text_view.initWithFrame options.delete(:frame), textContainer: options.delete(:container)
|
8
|
+
else
|
9
|
+
text_view.initWithFrame options.delete :frame
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
HotCocoa::Mappings.map toolbar: NSToolbar do
|
2
|
+
|
3
|
+
constant :size, {
|
4
|
+
default: NSToolbarSizeModeDefault,
|
5
|
+
regular: NSToolbarSizeModeRegular,
|
6
|
+
small: NSToolbarSizeModeSmall
|
7
|
+
}
|
8
|
+
|
9
|
+
constant :display, {
|
10
|
+
default: NSToolbarDisplayModeDefault,
|
11
|
+
icon_and_label: NSToolbarDisplayModeIconAndLabel,
|
12
|
+
icon: NSToolbarDisplayModeIconOnly,
|
13
|
+
label: NSToolbarDisplayModeLabelOnly
|
14
|
+
}
|
15
|
+
|
16
|
+
defaults identifier: 'DefaultToolbarIdentifier',
|
17
|
+
allowed: [:separator, :space, :flexible_space, :show_colors,
|
18
|
+
:show_fonts, :customize, :print],
|
19
|
+
default: [],
|
20
|
+
allow_customization: true,
|
21
|
+
size: :default
|
22
|
+
|
23
|
+
def init_with_options toolbar, options
|
24
|
+
toolbar = toolbar.initWithIdentifier options.delete :identifier
|
25
|
+
toolbar.allowsUserCustomization = options.delete :allow_customization
|
26
|
+
toolbar
|
27
|
+
end
|
28
|
+
|
29
|
+
custom_methods do
|
30
|
+
def size= mode
|
31
|
+
setSizeMode mode
|
32
|
+
end
|
33
|
+
|
34
|
+
def display= mode
|
35
|
+
setDisplayMode mode
|
36
|
+
end
|
37
|
+
|
38
|
+
def default= list
|
39
|
+
@default = list.dup
|
40
|
+
build_custom_items
|
41
|
+
end
|
42
|
+
|
43
|
+
def allowed= list
|
44
|
+
@allowed = list.dup
|
45
|
+
build_custom_items
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def build_custom_items
|
52
|
+
if @allowed && @default
|
53
|
+
ary = @default.select { |x| x.is_a? NSToolbarItem }
|
54
|
+
|
55
|
+
@default.map! { |x| x.is_a? NSToolbarItem ? x.itemIdentifier : x }
|
56
|
+
@allowed.map! { |x| x.is_a? NSToolbarItem ? x.itemIdentifier : x }
|
57
|
+
|
58
|
+
@custom_items = {}
|
59
|
+
ary.each { |x| @custom_items[x.itemIdentifier] = x }
|
60
|
+
@allowed.concat @custom_items.keys
|
61
|
+
|
62
|
+
[@allowed, @default].each do |a|
|
63
|
+
a.map! do |i|
|
64
|
+
case i
|
65
|
+
when :separator
|
66
|
+
NSToolbarSeparatorItemIdentifier
|
67
|
+
when :space
|
68
|
+
NSToolbarSpaceItemIdentifier
|
69
|
+
when :flexible_space
|
70
|
+
NSToolbarFlexibleSpaceItemIdentifier
|
71
|
+
when :show_colors
|
72
|
+
NSToolbarShowColorsItemIdentifier
|
73
|
+
when :show_fonts
|
74
|
+
NSToolbarShowFontsItemIdentifier
|
75
|
+
when :customize
|
76
|
+
NSToolbarCustomizeToolbarItemIdentifier
|
77
|
+
when :print
|
78
|
+
NSToolbarPrintItemIdentifier
|
79
|
+
else
|
80
|
+
i
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
allowed_items { @allowed }
|
85
|
+
default_items { @default }
|
86
|
+
|
87
|
+
item_for_identifier { |identifier, will_be_inserted| @custom_items[identifier] }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
delegating 'toolbar:itemForItemIdentifier:willBeInsertedIntoToolbar:', to: :item_for_identifier, required: true, parameters: [:itemForItemIdentifier, :willBeInsertedIntoToolbar]
|
93
|
+
delegating 'toolbarAllowedItemIdentifiers:', to: :allowed_items, required: true
|
94
|
+
delegating 'toolbarDefaultItemIdentifiers:', to: :default_items, required: true
|
95
|
+
delegating 'toolbarSelectableItemIdentifiers:', to: :selectable_items
|
96
|
+
delegating 'toolbarDidRemoveItem:', to: :did_remove_item, parameters: ["toolbarDidRemoveItem.userInfo['item']"]
|
97
|
+
delegating 'toolbarWillAddItem:', to: :will_add_item, parameters: ["toolbarWillAddItem.userInfo['item']"]
|
98
|
+
|
99
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
HotCocoa::Mappings.map toolbar_item: NSToolbarItem do
|
2
|
+
|
3
|
+
defaults priority: :standard
|
4
|
+
|
5
|
+
constant :priority, {
|
6
|
+
standard: NSToolbarItemVisibilityPriorityStandard,
|
7
|
+
low: NSToolbarItemVisibilityPriorityLow,
|
8
|
+
high: NSToolbarItemVisibilityPriorityHigh,
|
9
|
+
user: NSToolbarItemVisibilityPriorityUser
|
10
|
+
}
|
11
|
+
|
12
|
+
def init_with_options toolbar_item, options
|
13
|
+
unless options.has_key?(:label) || options.has_key?(:identifier)
|
14
|
+
raise ArgumentError, ":identifier or :label required"
|
15
|
+
end
|
16
|
+
|
17
|
+
label = options[:label]
|
18
|
+
|
19
|
+
toolbar_item.initWithItemIdentifier(options.delete(:identifier) || label.tr(' ', '_'))
|
20
|
+
toolbar_item.paletteLabel = label if label
|
21
|
+
toolbar_item
|
22
|
+
end
|
23
|
+
|
24
|
+
custom_methods do
|
25
|
+
include HotCocoa::Mappings::TargetActionConvenience
|
26
|
+
|
27
|
+
def priority= value
|
28
|
+
setVisibilityPriority value
|
29
|
+
end
|
30
|
+
|
31
|
+
def priority
|
32
|
+
visibilityPriority
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
HotCocoa::Mappings.map tracking_area: NSTrackingArea do
|
2
|
+
defaults rect: CGRectZero
|
3
|
+
|
4
|
+
constant :options, {
|
5
|
+
mouse_entered_and_exited: NSTrackingMouseEnteredAndExited,
|
6
|
+
mouse_moved: NSTrackingMouseMoved,
|
7
|
+
cursor_update: NSTrackingCursorUpdate,
|
8
|
+
active_in_key_window: NSTrackingActiveInKeyWindow,
|
9
|
+
active_first_responder: NSTrackingActiveWhenFirstResponder,
|
10
|
+
active_in_active_app: NSTrackingActiveInActiveApp,
|
11
|
+
active_always: NSTrackingActiveAlways,
|
12
|
+
assume_inside: NSTrackingAssumeInside,
|
13
|
+
in_visible_rectangle: NSTrackingInVisibleRect,
|
14
|
+
enabled_during_drag: NSTrackingEnabledDuringMouseDrag
|
15
|
+
}
|
16
|
+
|
17
|
+
def init_with_options tracking_area, options
|
18
|
+
rect = options.delete(:rect)
|
19
|
+
tracking_area.initWithRect rect,
|
20
|
+
options: options.delete(:options),
|
21
|
+
owner: options.delete(:owner),
|
22
|
+
userInfo: nil
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
HotCocoa::Mappings.map view: NSView do
|
2
|
+
|
3
|
+
defaults frame: CGRectZero, layout: {}
|
4
|
+
|
5
|
+
constant :auto_resize, {
|
6
|
+
none: NSViewNotSizable,
|
7
|
+
width: NSViewWidthSizable,
|
8
|
+
height: NSViewHeightSizable,
|
9
|
+
min_x: NSViewMinXMargin,
|
10
|
+
min_y: NSViewMinYMargin,
|
11
|
+
max_x: NSViewMaxXMargin,
|
12
|
+
max_y: NSViewMaxYMargin
|
13
|
+
}
|
14
|
+
|
15
|
+
constant :border, {
|
16
|
+
none: NSNoBorder,
|
17
|
+
line: NSLineBorder,
|
18
|
+
bezel: NSBezelBorder,
|
19
|
+
groove: NSGrooveBorder
|
20
|
+
}
|
21
|
+
|
22
|
+
def init_with_options view, options
|
23
|
+
view.initWithFrame options.delete :frame
|
24
|
+
end
|
25
|
+
|
26
|
+
custom_methods do
|
27
|
+
def auto_resize= value
|
28
|
+
setAutoresizingMask value
|
29
|
+
end
|
30
|
+
|
31
|
+
# @todo We can use alias_method instead. How, you ask? With hacks
|
32
|
+
# of course. Give the module created by custom_methods an
|
33
|
+
# implementation of Module#included that iterates over a list
|
34
|
+
# of methods to alias.
|
35
|
+
def << view
|
36
|
+
addSubview view
|
37
|
+
end
|
38
|
+
|
39
|
+
def layout= options
|
40
|
+
@layout = HotCocoa::LayoutOptions.new self, options
|
41
|
+
@layout.update_layout_views!
|
42
|
+
end
|
43
|
+
|
44
|
+
attr_reader :layout
|
45
|
+
|
46
|
+
def on_notification options = {}, &block
|
47
|
+
options[:sent_by] = self
|
48
|
+
NotificationListener.new options, &block
|
49
|
+
end
|
50
|
+
|
51
|
+
def remove subview, options = {}
|
52
|
+
raise ArgumentError, "#{subview} is not a subview of #{self} and cannot be removed." unless subview.superview == self
|
53
|
+
options[:needs_display] == false ? subview.removeFromSuperviewWithoutNeedingDisplay : subview.removeFromSuperview
|
54
|
+
end
|
55
|
+
|
56
|
+
def enter_full_screen options = {}
|
57
|
+
enterFullScreenMode (options.delete(:screen) || NSScreen.mainScreen), withOptions: options
|
58
|
+
end
|
59
|
+
|
60
|
+
def leave_full_screen options = {}
|
61
|
+
exitFullScreenModeWithOptions options
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
##
|
2
|
+
# @cocoa NSWindow
|
3
|
+
#
|
4
|
+
# @example
|
5
|
+
#
|
6
|
+
# window frame: [100, 100, 604, 500], title: 'My app', style: [:titled, :closable, :miniaturizable, :resizable] do |win|
|
7
|
+
# win.contentView.margin = 0
|
8
|
+
# win.background_color = color(name: 'white')
|
9
|
+
# win.will_close { exit }
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# @adc http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference.html
|
13
|
+
#
|
14
|
+
HotCocoa::Mappings.map window: NSWindow do
|
15
|
+
|
16
|
+
defaults style: [:titled, :closable, :miniaturizable, :resizable],
|
17
|
+
backing: :buffered,
|
18
|
+
defer: true,
|
19
|
+
show: true,
|
20
|
+
view: :layout,
|
21
|
+
default_layout: {}
|
22
|
+
|
23
|
+
constant :backing, {
|
24
|
+
buffered: NSBackingStoreBuffered
|
25
|
+
}
|
26
|
+
|
27
|
+
constant :style, {
|
28
|
+
borderless: NSBorderlessWindowMask,
|
29
|
+
titled: NSTitledWindowMask,
|
30
|
+
closable: NSClosableWindowMask,
|
31
|
+
miniaturizable: NSMiniaturizableWindowMask,
|
32
|
+
resizable: NSResizableWindowMask,
|
33
|
+
textured: NSTexturedBackgroundWindowMask
|
34
|
+
}
|
35
|
+
|
36
|
+
def init_with_options window, options
|
37
|
+
unless options[:frame]
|
38
|
+
width, height = (options.delete(:size) || [400, 400])
|
39
|
+
|
40
|
+
screen_frame = NSScreen.mainScreen.visibleFrame
|
41
|
+
center = options.delete :center
|
42
|
+
|
43
|
+
x = screen_frame.origin.x + (center ? (screen_frame.size.width - width) / 2 : 30)
|
44
|
+
y = screen_frame.origin.y + (center ? (screen_frame.size.height - height) / 2 : (screen_frame.size.height - height - 30))
|
45
|
+
|
46
|
+
options[:frame] = CGRectMake(x, y, width, height)
|
47
|
+
end
|
48
|
+
|
49
|
+
window = window.initWithContentRect options.delete(:frame),
|
50
|
+
styleMask: options.delete(:style),
|
51
|
+
backing: options.delete(:backing),
|
52
|
+
defer: options.delete(:defer)
|
53
|
+
|
54
|
+
default_layout = options.delete :default_layout
|
55
|
+
if options[:view] == :layout
|
56
|
+
options.delete :view
|
57
|
+
window.setContentView(HotCocoa::LayoutView.alloc.initWithFrame([0, 0,
|
58
|
+
window.contentView.frameSize.width,
|
59
|
+
window.contentView.frameSize.height]))
|
60
|
+
window.contentView.default_layout = default_layout
|
61
|
+
elsif options[:view] == :nolayout
|
62
|
+
options.delete :view
|
63
|
+
end
|
64
|
+
|
65
|
+
window
|
66
|
+
end
|
67
|
+
|
68
|
+
custom_methods do
|
69
|
+
def << control
|
70
|
+
contentView.addSubview control
|
71
|
+
end
|
72
|
+
|
73
|
+
def view
|
74
|
+
contentView
|
75
|
+
end
|
76
|
+
|
77
|
+
def view= view
|
78
|
+
setContentView view
|
79
|
+
end
|
80
|
+
|
81
|
+
def on_notification options = {}, &block
|
82
|
+
options[:sent_by] = self
|
83
|
+
NotificationListener.new options, &block
|
84
|
+
end
|
85
|
+
|
86
|
+
def show
|
87
|
+
display
|
88
|
+
makeKeyAndOrderFront nil
|
89
|
+
orderFrontRegardless
|
90
|
+
end
|
91
|
+
|
92
|
+
def has_shadow?
|
93
|
+
hasShadow
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
delegating 'window:shouldDragDocumentWithEvent:from:withPasteboard:', to: :should_drag_document?, parameters: [:shouldDragDocumentWithEvent, :from, :withPasteboard]
|
98
|
+
delegating 'window:shouldPopUpDocumentPathMenu:', to: :should_popup_path_menu?, parameters: [:shouldPopUpDocumentPathMenu]
|
99
|
+
delegating 'window:willPositionSheet:usingRect:', to: :will_position_sheet, parameters: [:willPositionSheet, :usingRect]
|
100
|
+
delegating 'windowDidBecomeKey:', to: :did_become_key
|
101
|
+
delegating 'windowDidBecomeMain:', to: :did_become_main
|
102
|
+
delegating 'windowDidChangeScreen:', to: :did_change_screen
|
103
|
+
delegating 'windowDidChangeScreenProfile:', to: :did_change_screen_profile
|
104
|
+
delegating 'windowDidDeminiaturize:', to: :did_deminiturize
|
105
|
+
delegating 'windowDidEndSheet:', to: :did_end_sheet
|
106
|
+
delegating 'windowDidExpose:', to: :did_expose, parameters: ["windowDidExpose.userInfo['NSExposedRect']"]
|
107
|
+
delegating 'windowDidMiniaturize:', to: :did_miniaturize
|
108
|
+
delegating 'windowDidMove:', to: :did_move
|
109
|
+
delegating 'windowDidResignKey:', to: :did_resign_key
|
110
|
+
delegating 'windowDidResignMain:', to: :did_resign_main
|
111
|
+
delegating 'windowDidResize:', to: :did_resize
|
112
|
+
delegating 'windowDidUpdate:', to: :did_update
|
113
|
+
delegating 'windowShouldClose:', to: :should_close?
|
114
|
+
delegating 'windowShouldZoom:toFrame:', to: :should_zoom?, parameters: [:toFrame]
|
115
|
+
delegating 'windowWillBeginSheet:', to: :will_begin_sheet
|
116
|
+
delegating 'windowWillClose:', to: :will_close
|
117
|
+
delegating 'windowWillMiniaturize:', to: :will_miniaturize
|
118
|
+
delegating 'windowWillMove:', to: :will_move
|
119
|
+
delegating 'windowWillResize:toSize:', to: :will_resize, parameters: [:toSize]
|
120
|
+
delegating 'windowWillReturnFieldEditor:toObject:', to: :returning_field_editor, parameters: [:toObject]
|
121
|
+
delegating 'windowWillReturnUndoManager:', to: :returning_undo_manager
|
122
|
+
delegating 'windowWillUseStandardFrame:defaultFrame:', to: :will_use_standard_frame, parameters: [:defaultFrame]
|
123
|
+
|
124
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
HotCocoa::Mappings.map bonjour_service: NSNetService do
|
2
|
+
|
3
|
+
defaults domain: ''
|
4
|
+
|
5
|
+
constant :error_keys, {
|
6
|
+
code: NSNetServicesErrorCode,
|
7
|
+
domain: NSNetServicesErrorDomain
|
8
|
+
}
|
9
|
+
|
10
|
+
constant :error, {
|
11
|
+
unknown: NSNetServicesUnknownError,
|
12
|
+
collision: NSNetServicesCollisionError,
|
13
|
+
not_found: NSNetServicesNotFoundError,
|
14
|
+
activity_in_progress: NSNetServicesActivityInProgress,
|
15
|
+
bad_argument: NSNetServicesBadArgumentError,
|
16
|
+
cancelled: NSNetServicesCancelledError,
|
17
|
+
invalid: NSNetServicesInvalidError,
|
18
|
+
timeout: NSNetServicesTimeoutError
|
19
|
+
}
|
20
|
+
|
21
|
+
constant :options, {
|
22
|
+
no_auto_rename: NSNetServiceNoAutoRename
|
23
|
+
}
|
24
|
+
|
25
|
+
##
|
26
|
+
# @key [String] domain specify the domain to advertise in, defaults to
|
27
|
+
# an empty string which advertises in all domains
|
28
|
+
# @key [String] type specify the type of service to advertise, such as
|
29
|
+
# '_http._tcp.' for an HTTP service or '_ssh._tcp.'
|
30
|
+
# for SSH; can only be set at initialization
|
31
|
+
# @key [String] name specify the name for the service, this can be free
|
32
|
+
# form but should avoid non-ascii characters; can
|
33
|
+
# only be set at initialization
|
34
|
+
# @key [Fixnum] port specify the port to advertise the service on, must
|
35
|
+
# be set at initialization
|
36
|
+
def init_with_options service, opts
|
37
|
+
selector = 'initWithDomain:type:name:'
|
38
|
+
args = [ opts.delete(:domain),
|
39
|
+
opts.delete(:type),
|
40
|
+
opts.delete(:name) ]
|
41
|
+
|
42
|
+
if opts.has_key? :port
|
43
|
+
selector << 'port:'
|
44
|
+
args << opts.delete(:port)
|
45
|
+
end
|
46
|
+
|
47
|
+
service.send( selector, *args )
|
48
|
+
end
|
49
|
+
|
50
|
+
custom_methods do
|
51
|
+
def resolve timeout = 60.0
|
52
|
+
resolveWithTimeout timeout
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
delegating 'netServiceWillPublish:', to: :will_publish
|
57
|
+
delegating 'netService:didNotPublish:', to: :did_not_publish, parameters: ['didNotPublish']
|
58
|
+
delegating 'netServiceDidPublish:', to: :did_publish
|
59
|
+
delegating 'netServiceWillResolve:', to: :will_resolve
|
60
|
+
delegating 'netService:didNotResolve:', to: :did_not_resolve, parameters: ['didNotResolve']
|
61
|
+
delegating 'netServiceDidResolveAddress:', to: :did_resolve
|
62
|
+
delegating 'netService:didUpdateTXTRecordData:', to: :did_update_txt_record_data, parameters: ['didUpdateTXTRecordData']
|
63
|
+
delegating 'netServiceDidStop:', to: :did_stop
|
64
|
+
|
65
|
+
end
|