context 0.0.16

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 (113) hide show
  1. data/Rakefile.rb +107 -0
  2. data/coverage/-usr-local-lib-site_ruby-1_8-atk_rb.html +612 -0
  3. data/coverage/-usr-local-lib-site_ruby-1_8-gdk_pixbuf2_rb.html +637 -0
  4. data/coverage/-usr-local-lib-site_ruby-1_8-glib2_rb.html +829 -0
  5. data/coverage/-usr-local-lib-site_ruby-1_8-gtk2-base_rb.html +709 -0
  6. data/coverage/-usr-local-lib-site_ruby-1_8-gtk2_rb.html +623 -0
  7. data/coverage/-usr-local-lib-site_ruby-1_8-pango_rb.html +665 -0
  8. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-color_rb.html +865 -0
  9. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-colors_rb.html +1266 -0
  10. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-constants_rb.html +632 -0
  11. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-context-blur_rb.html +655 -0
  12. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-context-circle_rb.html +619 -0
  13. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-context-color_rb.html +621 -0
  14. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-context-path_rb.html +726 -0
  15. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-context-rectangle_rb.html +643 -0
  16. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-context-triangle_rb.html +622 -0
  17. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-context_rb.html +639 -0
  18. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-paper_rb.html +793 -0
  19. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-papers_rb.html +651 -0
  20. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-path_rb.html +625 -0
  21. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo-point_rb.html +617 -0
  22. data/coverage/-var-lib-gems-1_8-gems-cairo-1_7_0-src-lib-cairo_rb.html +756 -0
  23. data/coverage/index.html +1170 -0
  24. data/coverage/lib-Context-Bridge_rb.html +673 -0
  25. data/coverage/lib-Context-Context_rb.html +756 -0
  26. data/coverage/lib-Context-EnumeratedType_rb.html +661 -0
  27. data/coverage/lib-Context-ExecutionProxy_rb.html +671 -0
  28. data/coverage/lib-Context-Gtk-App_rb.html +638 -0
  29. data/coverage/lib-Context-Gtk-Key_rb.html +664 -0
  30. data/coverage/lib-Context-Gtk-Widget_rb.html +667 -0
  31. data/coverage/lib-Context-KeyAssignment_rb.html +641 -0
  32. data/coverage/lib-Context-KeyMap_rb.html +653 -0
  33. data/coverage/lib-Context-Key_rb.html +667 -0
  34. data/coverage/lib-Context-View_rb.html +659 -0
  35. data/coverage/lib-Context-Views-Gtk-PageView_rb.html +660 -0
  36. data/coverage/lib-Context-Views-PageView_rb.html +627 -0
  37. data/coverage/lib-Context-Widget_rb.html +650 -0
  38. data/coverage/lib-Context-require_all_rb.html +623 -0
  39. data/doc/classes/Context.html +174 -0
  40. data/doc/classes/Context/Bridge.html +296 -0
  41. data/doc/classes/Context/Context.html +564 -0
  42. data/doc/classes/Context/EnumeratedType.html +283 -0
  43. data/doc/classes/Context/ExecutionProxy.html +228 -0
  44. data/doc/classes/Context/Gtk.html +126 -0
  45. data/doc/classes/Context/Gtk/App.html +217 -0
  46. data/doc/classes/Context/Gtk/Key.html +292 -0
  47. data/doc/classes/Context/Gtk/PageView.html +245 -0
  48. data/doc/classes/Context/Gtk/PageView/MainWindow.html +200 -0
  49. data/doc/classes/Context/Gtk/Widget.html +311 -0
  50. data/doc/classes/Context/Key.html +305 -0
  51. data/doc/classes/Context/Key/Modifier.html +117 -0
  52. data/doc/classes/Context/KeyAssignment.html +234 -0
  53. data/doc/classes/Context/KeyMap.html +273 -0
  54. data/doc/classes/Context/PageView.html +180 -0
  55. data/doc/classes/Context/View.html +334 -0
  56. data/doc/classes/Context/Widget.html +298 -0
  57. data/doc/classes/Kernel.html +148 -0
  58. data/doc/classes/Object.html +196 -0
  59. data/doc/created.rid +1 -0
  60. data/doc/files/lib/Context/Bridge_rb.html +108 -0
  61. data/doc/files/lib/Context/Context_rb.html +109 -0
  62. data/doc/files/lib/Context/EnumeratedType_rb.html +101 -0
  63. data/doc/files/lib/Context/ExecutionProxy_rb.html +101 -0
  64. data/doc/files/lib/Context/Gtk/App_rb.html +110 -0
  65. data/doc/files/lib/Context/Gtk/Key_rb.html +109 -0
  66. data/doc/files/lib/Context/Gtk/Widget_rb.html +109 -0
  67. data/doc/files/lib/Context/KeyAssignment_rb.html +108 -0
  68. data/doc/files/lib/Context/KeyMap_rb.html +109 -0
  69. data/doc/files/lib/Context/Key_rb.html +108 -0
  70. data/doc/files/lib/Context/Version_rb.html +101 -0
  71. data/doc/files/lib/Context/View_rb.html +101 -0
  72. data/doc/files/lib/Context/Views/Gtk/PageView_rb.html +111 -0
  73. data/doc/files/lib/Context/Views/PageView_rb.html +108 -0
  74. data/doc/files/lib/Context/Widget_rb.html +101 -0
  75. data/doc/files/lib/Context/require_all_rb.html +101 -0
  76. data/doc/fr_class_index.html +46 -0
  77. data/doc/fr_file_index.html +42 -0
  78. data/doc/fr_method_index.html +103 -0
  79. data/doc/index.html +24 -0
  80. data/doc/rdoc-style.css +208 -0
  81. data/lib/Context/Bridge.rb +63 -0
  82. data/lib/Context/Context.rb +146 -0
  83. data/lib/Context/EnumeratedType.rb +51 -0
  84. data/lib/Context/ExecutionProxy.rb +61 -0
  85. data/lib/Context/Gtk/App.rb +28 -0
  86. data/lib/Context/Gtk/Key.rb +54 -0
  87. data/lib/Context/Gtk/Widget.rb +57 -0
  88. data/lib/Context/Key.rb +57 -0
  89. data/lib/Context/KeyAssignment.rb +31 -0
  90. data/lib/Context/KeyMap.rb +43 -0
  91. data/lib/Context/Version.rb +5 -0
  92. data/lib/Context/View.rb +49 -0
  93. data/lib/Context/Views/Gtk/PageView.rb +50 -0
  94. data/lib/Context/Views/PageView.rb +17 -0
  95. data/lib/Context/Widget.rb +40 -0
  96. data/lib/Context/require_all.rb +13 -0
  97. data/spec/Context/Bridge_spec.rb +40 -0
  98. data/spec/Context/Context_spec.rb +102 -0
  99. data/spec/Context/EnumeratedType_spec.rb +51 -0
  100. data/spec/Context/ExecutionProxy_spec.rb +28 -0
  101. data/spec/Context/Gtk/App_spec.rb +24 -0
  102. data/spec/Context/Gtk/Key_spec.rb +45 -0
  103. data/spec/Context/Gtk/Widget_spec.rb +44 -0
  104. data/spec/Context/KeyAssignment_spec.rb +26 -0
  105. data/spec/Context/KeyMap_spec.rb +64 -0
  106. data/spec/Context/Key_spec.rb +22 -0
  107. data/spec/Context/View_spec.rb +62 -0
  108. data/spec/Context/Views/Gtk/PageView_spec.rb +44 -0
  109. data/spec/Context/Views/PageView_spec.rb +20 -0
  110. data/spec/Context/Widget_spec.rb +15 -0
  111. data/spec/Context/require_all_spec.rb +13 -0
  112. data/test_results.html +343 -0
  113. metadata +179 -0
@@ -0,0 +1,146 @@
1
+ require 'Context/KeyMap'
2
+ require 'Context/ExecutionProxy'
3
+
4
+ module Context
5
+
6
+ # The Context is the Presenter in the Model, View, Presentor (MVP)
7
+ # model. It is an object that holds the logic for the UI
8
+ # scenario that the application is currently in. Context is
9
+ # an abstract class.
10
+ #
11
+ # A Context is made up of views, model objects and other sub-contexts.
12
+ # One of the views should be a UI widget container that contains all
13
+ # of the views for the Context. The concrete classes should define
14
+ # the logic for the Context that is either called by enter()
15
+ # or called from one of the contained views.
16
+ #
17
+ # Note that views are usually only instantiated in createViews, which
18
+ # is called on enter(), not on Context creation. However, there is
19
+ # no requirement for this.
20
+ class Context
21
+ attr_reader :parent, :mainView
22
+ attr_writer :mainView
23
+
24
+ # Create a new Context. Takes a Bridge that is used to
25
+ # create the View s in using the correct namespace.
26
+ def initialize(viewBridge)
27
+ @parent = nil
28
+ @mainView = nil
29
+ @viewBridge = viewBridge
30
+ @keyMap = KeyMap.new
31
+ @entered = false
32
+ end
33
+
34
+ # Creates the views for the context. This method is called
35
+ # automatically by enter() and probably should not be called otherwise.
36
+ # This method should be overriden by the concrete class. It
37
+ # should instantiate all the views and set @mainView
38
+ def createViews
39
+ # Nothing to do here
40
+ end
41
+
42
+ # This is intended to be private (how do I do that again?)
43
+ # Just so that it doesn't create a view if it is already created
44
+ def setupViews
45
+ if @mainView.nil?
46
+ createViews
47
+ end
48
+ end
49
+
50
+ # Creates views and returns the main View. This is intended
51
+ # to be used by test code where entering the context executes
52
+ # code and you need to know what the view will be ahead of time.
53
+ # I can think of no reason to use this in production code.
54
+ def peekAtView
55
+ setupViews
56
+ @mainView
57
+ end
58
+
59
+ # Destroys the views for the context. This method is called
60
+ # automatically by exit() and probably should not be called otherwise.
61
+ # This method should be overriden by the concrete class. It
62
+ # should destroy all the views and set @mainView to nil
63
+ def destroyViews
64
+ @mainView = nil
65
+ end
66
+
67
+ # Adds a view to the mainView
68
+ # Since the mainView is intended to be a UI container that contains
69
+ # all the views, this method is called by a sub-context's enter()
70
+ # method to allow the parent's mainView to contain the sub-context's
71
+ # views.
72
+ def addView(view)
73
+ @mainView.addView(view) unless @mainView.nil?
74
+ end
75
+
76
+ # Enters the Context. After it is called, the Context is then
77
+ # active and can be interacted with. This method automatically
78
+ # calls createViews() and adds the mainView to the parent's view.
79
+ #
80
+ # Usually this method will be overriden by the concrete class.
81
+ # However, it should be careful to call super() in the appropriate
82
+ # place.
83
+ def enter(parent)
84
+ @parent = parent
85
+ if (@parent != nil)
86
+ @entered = true
87
+ setupViews
88
+ parent.addView(@mainView) unless @mainView.nil?
89
+ end
90
+ end
91
+
92
+ # Returns true if the context has been entered, but not exited.
93
+ # Returns false if the context has never been entered, or if
94
+ # it has been entered and then exited.
95
+ def isEntered?
96
+ @entered
97
+ end
98
+
99
+ # Exits the Context. After it is called, the context is no longer
100
+ # active and can't be interacted with. This method automatically
101
+ # removes the mainView from the parent's view and calls destroyViews().
102
+ #
103
+ # Usually this method will be overriden by the concrete class.
104
+ # However, it should be careful to call super() in the appropriate
105
+ # place.
106
+ def exit()
107
+ @entered = false
108
+ if !@parent.nil? && !@parent.mainView.nil?
109
+ @parent.mainView.removeView(@mainView) unless @mainView.nil?
110
+ end
111
+ destroyViews
112
+ end
113
+
114
+ # Sets a binding for a key.
115
+ # Whenever a key is pressed, the context is notified. This
116
+ # sets up a binding between the key and the block passed in.
117
+ # After that point, the block will be called everytime the
118
+ # key is pressed.
119
+ #
120
+ # Warning: This key binding mechanism is likely to be
121
+ # depracated, or at least heavily modified soon.
122
+ def setKeyBinding(key, &binding)
123
+ a = KeyAssignment.new(key, &binding)
124
+ @keyMap.add(a)
125
+ end
126
+
127
+ # Returns the existing binding for a key.
128
+ #
129
+ # Warning: This key binding mechanism is likely to be
130
+ # depracated, or at least heavily modified soon.
131
+ def getKeyBinding(key)
132
+ a = @keyMap.findKey(key)
133
+ a.unless_nil.action
134
+ end
135
+
136
+ # Called by the view to indicated that a key has been pressed.
137
+ # Runs the binding in the keymap, or returns nil if there
138
+ # isn't one.
139
+ #
140
+ # Warning: This key binding mechanism is likely to be
141
+ # depracated, or at least heavily modified soon.
142
+ def notifyKey(view, key)
143
+ @keyMap.unless_nil do press(key) end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,51 @@
1
+ module Context
2
+
3
+ # Class that holds a series of constants that act as an
4
+ # enumerated type. The first ID added to the type is
5
+ # set to the value 0 (or at the value specified in start_at).
6
+ # each subsequent ID added to the type is automatically
7
+ # incremented
8
+ class EnumeratedType
9
+ # Use singleton class to define class methods
10
+ class << self
11
+ # Set the value that the first ID should start at.
12
+ # Note: This must called *before* add() or symbols()
13
+ def start_at(n)
14
+ @nextValue = n
15
+ end
16
+
17
+ # Add a single ID to the enumerated type
18
+ # Usually called like:
19
+ # add MY_ID
20
+ def add(id)
21
+ @nextValue ||= 0
22
+ const_set(id, @nextValue)
23
+ @nextValue += 1
24
+ end
25
+
26
+ # Add a group of IDs to the enumerated type.
27
+ # This method takes an array.
28
+ # Usually called like:
29
+ # symbols [ID1, ID2, ID3,...]
30
+ def symbols(array)
31
+ array.each do |id|
32
+ add(id)
33
+ end
34
+ end
35
+
36
+ # Returns true if the ID has been defined in the enumerated type.
37
+ def responds_to?(id)
38
+ name = id.id2name
39
+ return true if self.const_defined?(name)
40
+ end
41
+
42
+ # Retrieve the value of the ID
43
+ # If the ID is defined, return it's value.
44
+ def method_missing(id)
45
+ name = id.id2name
46
+ self.const_get(name) if self.const_defined?(name)
47
+ end
48
+ end
49
+ end
50
+ end
51
+
@@ -0,0 +1,61 @@
1
+ module Context
2
+
3
+ # A Proxy for carrying on conditional execution.
4
+ class ExecutionProxy
5
+ # Set the true object on which to execute and the condition to execute.
6
+ # NOTE: The condition is a bool. In other words it has *already*
7
+ # been evaluated before we get to this point.
8
+ def initialize(object, cond)
9
+ @object = object
10
+ @cond = cond
11
+ end
12
+
13
+ # Conditionally execute the block. If the condition is true,
14
+ # execute the block. Otherwise return the true object.
15
+ # NOTE: Crazy name is so that you don't have something with
16
+ # the same name and accidently call it with method_missing.
17
+ def execute_if_you_can(&block)
18
+ if @cond
19
+ @object.instance_eval(&block)
20
+ else
21
+ @object
22
+ end
23
+ end
24
+
25
+ # Conditionally evaluate the symbol. If the condition is true,
26
+ # evaluate the symbol. Otherwise return the true object.
27
+ def method_missing(symbol)
28
+ if @cond
29
+ @object.instance_eval(symbol.to_s)
30
+ else
31
+ @object
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ class Object
38
+
39
+ # Execute the block if the condition is *true*. Or if there is no
40
+ # block, then return the proxy object. Usually this is so you
41
+ # can say something like:
42
+ # * object.execute_if(condition).property
43
+ # If the condition is *false*, execution of the block, or evaluation
44
+ # of the property will return the original object.
45
+ def execute_if(cond, &block)
46
+ proxy = Context::ExecutionProxy.new(self, cond)
47
+ # Note: Wouldn't it be nice if the following could be replaced by
48
+ # proxy.execute_if(!block.nil) do execute_if_you_can(&block) end
49
+ proxy_if_block_exists = Context::ExecutionProxy.new(proxy, !block.nil?)
50
+ proxy_if_block_exists.execute_if_you_can() do
51
+ execute_if_you_can(&block)
52
+ end
53
+ end
54
+
55
+ # If the object is not nil, execute the block (or evaluate
56
+ # the property). Otherwise return nil.
57
+ def unless_nil(&block)
58
+ execute_if(!nil?, &block)
59
+ end
60
+ end
61
+
@@ -0,0 +1,28 @@
1
+ require 'Context/Bridge'
2
+ require 'Context/Context'
3
+ require 'gtk2'
4
+
5
+ module Context::Gtk
6
+ class App < Context::Context
7
+
8
+ attr_reader :mainContext
9
+
10
+ def initialize(namespace, context)
11
+ viewBridge = Context::Bridge.new(namespace)
12
+ super(viewBridge)
13
+ Gtk.init
14
+ @mainContext = context.new(viewBridge)
15
+ end
16
+
17
+ def enter
18
+ super(nil)
19
+ @mainContext.enter(self)
20
+ Gtk.main
21
+ end
22
+
23
+ def exit
24
+ super()
25
+ Gtk.main_quit
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,54 @@
1
+ require 'Context/Key'
2
+ require 'gtk2'
3
+
4
+ module Context::Gtk
5
+
6
+ class Key < Context::Key
7
+
8
+ def Key::getModifierFromEvent(event)
9
+ case event.state
10
+ when 0
11
+ Context::Key::Modifier::NONE
12
+ when Gdk::Window::CONTROL_MASK
13
+ Context::Key::Modifier::CONTROL
14
+ else
15
+ Context::Key::Modifier::ERROR
16
+ end
17
+ end
18
+
19
+ def getGtkState
20
+ case @modifier
21
+ when Context::Key::Modifier::CONTROL
22
+ Gdk::Window::CONTROL_MASK
23
+ else
24
+ 0
25
+ end
26
+ end
27
+
28
+ def Key::getCharacterFromEvent(event)
29
+ Gdk::Keyval::to_name(event.keyval)
30
+ end
31
+
32
+ def getGtkKeyval
33
+ Gdk::Keyval::from_name(@character)
34
+ end
35
+
36
+ def Key::createFromGtkEvent(event)
37
+ modifier = getModifierFromEvent(event)
38
+ character = getCharacterFromEvent(event)
39
+ if((modifier != Context::Key::Modifier::ERROR) &&
40
+ (!character.nil?))
41
+ Key.new(modifier, character)
42
+ else
43
+ Key.null
44
+ end
45
+ end
46
+
47
+ def createGtkEvent
48
+ event = Gdk::EventKey.new(Gdk::Event::KEY_PRESS)
49
+ event.set_state(getGtkState)
50
+ event.set_keyval(getGtkKeyval)
51
+ event
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,57 @@
1
+ require 'Context/Widget'
2
+ require 'gtk2'
3
+
4
+ module Context::Gtk
5
+
6
+ class Widget < Context::Widget
7
+ attr_reader :mainWindow, :expandHeight, :expandWidth
8
+ attr_writer :mainWindow, :expandHeight, :expandWidth
9
+
10
+ class << self
11
+ # Redefine this in tests so that the widgets don't get displayed
12
+ # on the screen.
13
+ def inTests
14
+ false
15
+ end
16
+ end
17
+
18
+ def initialize(delegate)
19
+ super(delegate)
20
+ @mainWindow = nil
21
+ # Packing hints for the container
22
+ @expandHeight = false
23
+ @expandWidth = false
24
+ end
25
+
26
+ def isAMainWindow
27
+ @mainWindow = @delegate
28
+ end
29
+
30
+ def add(widget)
31
+ if !widget.delegate.class.ancestors.include?(Gtk::Window)
32
+ widget.mainWindow = @mainWindow
33
+ @delegate.add(widget.delegate)
34
+ if !Widget.inTests
35
+ @delegate.show_all
36
+ end
37
+ else
38
+ widget.isAMainWindow
39
+ widget.delegate.set_transient_for(@mainWindow)
40
+ if !Widget.inTests
41
+ widget.delegate.show_all
42
+ end
43
+ end
44
+ end
45
+
46
+ def remove(widget)
47
+ widget.mainWindow = nil
48
+ if !widget.delegate.class.ancestors.include?(Gtk::Window)
49
+ @delegate.remove(widget.delegate)
50
+ if !Widget.inTests
51
+ @delegate.show_all
52
+ end
53
+ end
54
+ @delegate.grab_focus
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,57 @@
1
+ require 'Context/EnumeratedType'
2
+
3
+ module Context
4
+
5
+ # Represents a keypress. Each key is represented
6
+ # by a character and a modifier (e.g., the control
7
+ # key)
8
+ #
9
+ # One could argue that this doesn't deserve to be
10
+ # here at all. It is possible that some UI types
11
+ # won't have a keyboard at all. However given that
12
+ # most will operate the same way indicates that
13
+ # it should have some level of abstraction. I have
14
+ # a feeling that this is YAGNI, though. And as such
15
+ # it might disappear at any point.
16
+ class Key
17
+ # Types of key modifiers. Currently only
18
+ # control or none is supported.
19
+ class Modifier < EnumeratedType
20
+ start_at 0
21
+ symbols [:ERROR, :NONE, :CONTROL]
22
+ end
23
+
24
+ attr_reader :modifier, :character
25
+
26
+ def initialize(modifier, character)
27
+ @modifier = modifier
28
+ @character = character
29
+ end
30
+
31
+ # A non key that can be used as an error condition.
32
+ # Note: Perhaps this should be a constant??? Currently
33
+ # key.eql?(Key.null) will work, but key == Key.null
34
+ # won't. FIXME
35
+ def Key.null
36
+ Key.new(Modifier.NONE, '\0')
37
+ end
38
+
39
+ # Returns true if the two keys have the same character and modifier.
40
+ def eql?(key)
41
+ (@modifier == key.modifier) && (@character == key.character)
42
+ end
43
+
44
+ # Creates a hash for the key. This is needed for the KeyMap
45
+ # which is implemented as a hash.
46
+ def hash
47
+ hashValue = @modifier.to_s
48
+ hashValue += @character
49
+ hashValue.hash
50
+ end
51
+
52
+ # Returns true if the key is equal to Key.null.
53
+ def null?
54
+ eql?(Key.null)
55
+ end
56
+ end
57
+ end