graffle 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/History.txt +2 -0
  2. data/LICENSE.txt +34 -0
  3. data/Manifest.txt +53 -0
  4. data/README.txt +19 -0
  5. data/Rakefile +32 -0
  6. data/Rakefile.hoe +23 -0
  7. data/bin/bin-skeleton +23 -0
  8. data/graffle.tmproj +335 -0
  9. data/lib/graffle.rb +43 -0
  10. data/lib/graffle/.document +4 -0
  11. data/lib/graffle/lib-skeleton +3 -0
  12. data/lib/graffle/nodoc/hacks.rb +69 -0
  13. data/lib/graffle/point.rb +42 -0
  14. data/lib/graffle/stereotypes.rb +446 -0
  15. data/lib/graffle/styled-text-reader.rb +52 -0
  16. data/lib/graffle/third-party/s4t-utils.rb +21 -0
  17. data/lib/graffle/third-party/s4t-utils/capturing-globals.rb +78 -0
  18. data/lib/graffle/third-party/s4t-utils/claims.rb +14 -0
  19. data/lib/graffle/third-party/s4t-utils/command-line.rb +15 -0
  20. data/lib/graffle/third-party/s4t-utils/error-handling.rb +20 -0
  21. data/lib/graffle/third-party/s4t-utils/friendly-format.rb +27 -0
  22. data/lib/graffle/third-party/s4t-utils/hacks.rb +32 -0
  23. data/lib/graffle/third-party/s4t-utils/load-path-auto-adjuster.rb +120 -0
  24. data/lib/graffle/third-party/s4t-utils/more-assertions.rb +29 -0
  25. data/lib/graffle/third-party/s4t-utils/os.rb +28 -0
  26. data/lib/graffle/third-party/s4t-utils/rake-task-helpers.rb +75 -0
  27. data/lib/graffle/third-party/s4t-utils/rakefile-common.rb +106 -0
  28. data/lib/graffle/third-party/s4t-utils/svn-file-movement.rb +101 -0
  29. data/lib/graffle/third-party/s4t-utils/test-util.rb +19 -0
  30. data/lib/graffle/third-party/s4t-utils/version.rb +3 -0
  31. data/lib/graffle/version.rb +8 -0
  32. data/setup.rb +1585 -0
  33. data/test/abstract-graphic-tests.rb +56 -0
  34. data/test/array-and-hash-stereotyping-tests.rb +49 -0
  35. data/test/document-tests.rb +117 -0
  36. data/test/graffle-file-types/as-a-package.graffle/data.plist +953 -0
  37. data/test/graffle-file-types/as-a-package.graffle/image1.png +0 -0
  38. data/test/graffle-file-types/as-a-package.graffle/image2.png +0 -0
  39. data/test/graffle-file-types/as-a-package.graffle/image3.png +0 -0
  40. data/test/graffle-file-types/multiple-canvases.graffle +6821 -0
  41. data/test/graffle-file-types/opening-tests.rb +45 -0
  42. data/test/graffle-file-types/two-boxes-and-a-line.graffle +347 -0
  43. data/test/group-tests.rb +109 -0
  44. data/test/hacks-tests.rb +58 -0
  45. data/test/line-graphic-tests.rb +155 -0
  46. data/test/point-tests.rb +43 -0
  47. data/test/set-standalone-test-paths.rb +5 -0
  48. data/test/shaped-graphic-tests.rb +93 -0
  49. data/test/sheet-tests.rb +124 -0
  50. data/test/styled-text-reader-tests.rb +89 -0
  51. data/test/test-skeleton +19 -0
  52. data/test/text-tests.rb +55 -0
  53. data/test/util.rb +15 -0
  54. metadata +139 -0
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Brian Marick on 2007-07-06.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+
7
+ require "set-standalone-test-paths.rb" unless $started_from_rakefile
8
+ require 'test/unit'
9
+ require 's4t-utils'
10
+ include S4tUtils
11
+
12
+ require 'graffle'
13
+
14
+ class TestAbstractGraphics < Test::Unit::TestCase
15
+ include Graffle
16
+ include Graffle::Builders
17
+
18
+ def test_creation
19
+ assert_true(abstract_graphic.behaves_like?(AbstractGraphic))
20
+ assert_equal({}, abstract_graphic)
21
+ end
22
+
23
+ def test_id
24
+ o = abstract_graphic { graffle_id_is 1 }
25
+ assert_equal(1, o.graffle_id)
26
+ assert_equal(1, o['ID'])
27
+ end
28
+
29
+ def test_ordering_of_graphics_with_bounding_boxes_depends_on_position_only
30
+ graphic = shaped_graphic { bounded_by 10, 10, 30000, 30000 }
31
+ dup = shaped_graphic { bounded_by 10, 10, 2222, 2222 }
32
+ just_above = shaped_graphic { bounded_by 10, "9.99", 11, 1 }
33
+ just_left = shaped_graphic { bounded_by "9.99", 10, 1, 2 }
34
+
35
+ assert_true(just_above.before?(graphic))
36
+ assert_true(just_left.before?(graphic))
37
+ assert_false(graphic.before?(dup))
38
+ assert_false(dup.before?(graphic))
39
+ assert_false(graphic.before?(just_above))
40
+ assert_false(graphic.before?(just_left))
41
+ end
42
+
43
+ def test_ordering_of_lines_depends_only_on_their_origin
44
+ graphic = shaped_graphic { bounded_by 10, 10, 10, 10 }
45
+ earlier_line = line_graphic {
46
+ points_at [8, 8], [1000, 1000]
47
+ }
48
+ equal_line = line_graphic {
49
+ points_at [10, 10], [50, 50]
50
+ }
51
+
52
+ assert_true (earlier_line.before?(graphic))
53
+ assert_false(equal_line.before?(graphic))
54
+ assert_false(graphic.before?(equal_line))
55
+ end
56
+ end
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Brian Marick on 2007-07-06.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+ require "set-standalone-test-paths.rb" unless $started_from_rakefile
7
+ require 'test/unit'
8
+ require 's4t-utils'
9
+ include S4tUtils
10
+
11
+ require 'graffle'
12
+ require 'test/util'
13
+
14
+ class TestArrayAndHashStereotyping < Test::Unit::TestCase
15
+ include Graffle
16
+ include Graffle::Builders
17
+ include Test::Util
18
+
19
+ def test_stereotyping_shaped_graphic
20
+ try_simple_graphic(shaped_graphic, Graffle::ShapedGraphic)
21
+ end
22
+
23
+ def test_stereotyping_line_graphic
24
+ try_simple_graphic(line_graphic, Graffle::LineGraphic)
25
+ end
26
+
27
+ def test_stereotyping_sheet
28
+ original = sheet {
29
+ with shaped_graphic
30
+ with line_graphic
31
+ }
32
+
33
+ s = round_trip(original)
34
+ assert_false(s.behaves_like?(Sheet))
35
+ assert_true(Sheet.takes_on(s))
36
+ assert_true(s.behaves_like?(Sheet))
37
+
38
+ assert_true(s.graphics[0].behaves_like?(ShapedGraphic))
39
+ assert_true(s.graphics[1].behaves_like?(LineGraphic))
40
+ end
41
+
42
+ def try_simple_graphic(object, stereotype)
43
+ g = round_trip(object)
44
+ assert_false(g.behaves_like?(stereotype))
45
+ Graffle.stereotype(g)
46
+ assert_true(g.behaves_like?(stereotype))
47
+ end
48
+
49
+ end
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Brian Marick on 2007-07-06.
4
+ # Copyright (c) 2007. All rights reserved.
5
+
6
+
7
+ require "set-standalone-test-paths.rb" unless $started_from_rakefile
8
+ require 'test/unit'
9
+ require 's4t-utils'
10
+ include S4tUtils
11
+
12
+ require 'graffle'
13
+ require 'plist'
14
+ require 'pp'
15
+
16
+ class TestCaseGraffleDocumentParsing < Test::Unit::TestCase
17
+ include Graffle
18
+ include Graffle::Builders
19
+
20
+
21
+ def test_creation
22
+ assert_true(document.behaves_like?(Document))
23
+ assert_equal('graffle.rb', document['Creator'])
24
+ assert_equal({ 'Creator' => 'graffle.rb'}, document)
25
+ end
26
+
27
+ def test_documents_can_contain_sheets
28
+ doc = document {
29
+ with sheet {
30
+ with shaped_graphic { graffle_id_is 3 }
31
+ }
32
+ }
33
+
34
+ assert_equal(1, doc.sheets.size)
35
+ assert_equal(3, doc.sheets[0].find_by_id(3).graffle_id)
36
+ end
37
+
38
+
39
+ def test_documents_stereotype_and_structure_their_contents
40
+ doc = document {
41
+ with sheet {
42
+ with shaped_graphic
43
+ }
44
+ with sheet {
45
+ with line_graphic
46
+ }
47
+ }
48
+
49
+ doc = Plist.parse_xml(doc.to_plist)
50
+ Document.takes_on(doc)
51
+
52
+ assert_true(doc.behaves_like?(Graffle::Document))
53
+
54
+ assert_true(doc.sheets[0].behaves_like?(Graffle::Sheet))
55
+ assert_true(doc.sheets[1].behaves_like?(Graffle::Sheet))
56
+
57
+ assert_true(doc.sheets[0].graphics[0].behaves_like?(Graffle::ShapedGraphic))
58
+ assert_true(doc.sheets[1].graphics[0].behaves_like?(Graffle::LineGraphic))
59
+
60
+ # Structure, too.
61
+ assert_equal(doc.sheets[0], doc.sheets[0].graphics[0].container)
62
+ assert_equal(doc.sheets[1], doc.sheets[1].graphics[0].container)
63
+ end
64
+
65
+ MultiSheetFormat =
66
+ { "Sheets" => [
67
+ { 'SheetTitle' => '1',
68
+ 'GraphicsList' => [ { "Class" => "LineGraphic" }],
69
+ },
70
+ { 'SheetTitle' => '2',
71
+ 'GraphicsList' => [],
72
+ }
73
+ ]
74
+ }.to_plist
75
+
76
+ def test_parsed_file_behaves_like_whole_graffle_doc
77
+ graffle = Graffle.parse(MultiSheetFormat)
78
+ assert_true(graffle.behaves_like?(Graffle::Document))
79
+ end
80
+
81
+
82
+ def test_can_fetch_components_from_plist
83
+ graffle = Graffle.parse(MultiSheetFormat)
84
+ assert_equal(2, graffle.sheets.length)
85
+ assert_equal('1', graffle.sheets[0]['SheetTitle']);
86
+ assert_true(graffle.sheets[0].behaves_like?(Graffle::Sheet))
87
+ assert_equal('2', graffle.sheets[1]['SheetTitle']);
88
+ assert_true(graffle.sheets[1].behaves_like?(Graffle::Sheet))
89
+
90
+ assert_true(graffle.sheets[0].graphics[0].behaves_like?(Graffle::LineGraphic))
91
+ end
92
+
93
+
94
+ ImplicitSheetFormat =
95
+ { "GraphicsList" => [
96
+ {"Class" => "ShapedGraphic"}
97
+ ]
98
+ }.to_plist
99
+
100
+ def test_some_graffle_documents_do_not_have_an_explicit_sheet
101
+ graffle = Graffle.parse(ImplicitSheetFormat)
102
+
103
+ assert_equal(1, graffle.sheets.length)
104
+ assert_true(graffle.sheets[0].behaves_like?(Graffle::Sheet))
105
+ assert_true(graffle.sheets[0].graphics[0].behaves_like?(Graffle::ShapedGraphic))
106
+ assert_equal(graffle.sheets[0], graffle.sheets[0].graphics[0].container)
107
+ end
108
+
109
+ def test_getting_first_sheet_only
110
+ graffle = Graffle.parse(ImplicitSheetFormat)
111
+ assert_true(graffle.first_sheet.behaves_like?(Graffle::Sheet))
112
+
113
+ graffle = Graffle.parse(MultiSheetFormat)
114
+ assert_true(graffle.first_sheet.behaves_like?(Graffle::Sheet))
115
+ end
116
+
117
+ end
@@ -0,0 +1,953 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>ActiveLayerIndex</key>
6
+ <integer>0</integer>
7
+ <key>AutoAdjust</key>
8
+ <true/>
9
+ <key>CanvasColor</key>
10
+ <dict>
11
+ <key>w</key>
12
+ <string>1</string>
13
+ </dict>
14
+ <key>CanvasPoint</key>
15
+ <string>{0, 0}</string>
16
+ <key>CanvasScale</key>
17
+ <real>1</real>
18
+ <key>ColumnAlign</key>
19
+ <integer>1</integer>
20
+ <key>ColumnSpacing</key>
21
+ <real>36</real>
22
+ <key>CreationDate</key>
23
+ <string>2007-06-13 12:12:09 -0500</string>
24
+ <key>Creator</key>
25
+ <string>Brian Marick</string>
26
+ <key>DisplayScale</key>
27
+ <string>1 in = 1 in</string>
28
+ <key>GraphDocumentVersion</key>
29
+ <integer>5</integer>
30
+ <key>GraphicsList</key>
31
+ <array>
32
+ <dict>
33
+ <key>Bounds</key>
34
+ <string>{{351.323, 648.9}, {149, 14}}</string>
35
+ <key>Class</key>
36
+ <string>ShapedGraphic</string>
37
+ <key>FitText</key>
38
+ <string>YES</string>
39
+ <key>Flow</key>
40
+ <string>Resize</string>
41
+ <key>FontInfo</key>
42
+ <dict>
43
+ <key>Color</key>
44
+ <dict>
45
+ <key>w</key>
46
+ <string>0</string>
47
+ </dict>
48
+ <key>Font</key>
49
+ <string>Helvetica</string>
50
+ <key>Size</key>
51
+ <real>12</real>
52
+ </dict>
53
+ <key>ID</key>
54
+ <integer>195</integer>
55
+ <key>Notes</key>
56
+ <string>{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420
57
+ {\fonttbl\f0\fswiss\fcharset77 Helvetica;}
58
+ {\colortbl;\red255\green255\blue255;}
59
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
60
+
61
+ \f0\fs24 \cf0 type: button\
62
+ name: run\
63
+ active: no}</string>
64
+ <key>Shape</key>
65
+ <string>Rectangle</string>
66
+ <key>Style</key>
67
+ <dict>
68
+ <key>fill</key>
69
+ <dict>
70
+ <key>Color</key>
71
+ <dict>
72
+ <key>b</key>
73
+ <string>0.901961</string>
74
+ <key>g</key>
75
+ <string>0.901961</string>
76
+ <key>r</key>
77
+ <string>0.901961</string>
78
+ </dict>
79
+ <key>Draws</key>
80
+ <string>NO</string>
81
+ </dict>
82
+ <key>shadow</key>
83
+ <dict>
84
+ <key>Draws</key>
85
+ <string>NO</string>
86
+ </dict>
87
+ <key>stroke</key>
88
+ <dict>
89
+ <key>Color</key>
90
+ <dict>
91
+ <key>b</key>
92
+ <string>0.592391</string>
93
+ <key>g</key>
94
+ <string>0.592391</string>
95
+ <key>r</key>
96
+ <string>0.592391</string>
97
+ </dict>
98
+ <key>Draws</key>
99
+ <string>NO</string>
100
+ </dict>
101
+ </dict>
102
+ <key>Text</key>
103
+ <dict>
104
+ <key>Text</key>
105
+ <string>{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420
106
+ {\fonttbl\f0\fswiss\fcharset77 Helvetica;}
107
+ {\colortbl;\red255\green255\blue255;}
108
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
109
+
110
+ \f0\fs24 \cf0 John is on members page}</string>
111
+ </dict>
112
+ <key>Wrap</key>
113
+ <string>NO</string>
114
+ </dict>
115
+ <dict>
116
+ <key>Bounds</key>
117
+ <string>{{195.823, 490.172}, {252, 14}}</string>
118
+ <key>Class</key>
119
+ <string>ShapedGraphic</string>
120
+ <key>FitText</key>
121
+ <string>YES</string>
122
+ <key>FontInfo</key>
123
+ <dict>
124
+ <key>Color</key>
125
+ <dict>
126
+ <key>w</key>
127
+ <string>0</string>
128
+ </dict>
129
+ <key>Font</key>
130
+ <string>Helvetica</string>
131
+ <key>Size</key>
132
+ <real>12</real>
133
+ </dict>
134
+ <key>ID</key>
135
+ <integer>194</integer>
136
+ <key>Line</key>
137
+ <dict>
138
+ <key>ID</key>
139
+ <integer>193</integer>
140
+ <key>Offset</key>
141
+ <real>-18</real>
142
+ <key>Position</key>
143
+ <real>0.54660367965698242</real>
144
+ <key>RotationType</key>
145
+ <integer>0</integer>
146
+ </dict>
147
+ <key>Shape</key>
148
+ <string>Rectangle</string>
149
+ <key>Style</key>
150
+ <dict>
151
+ <key>shadow</key>
152
+ <dict>
153
+ <key>Draws</key>
154
+ <string>NO</string>
155
+ </dict>
156
+ <key>stroke</key>
157
+ <dict>
158
+ <key>Draws</key>
159
+ <string>NO</string>
160
+ </dict>
161
+ </dict>
162
+ <key>Text</key>
163
+ <dict>
164
+ <key>Text</key>
165
+ <string>{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420
166
+ {\fonttbl\f0\fswiss\fcharset77 Helvetica;}
167
+ {\colortbl;\red255\green255\blue255;}
168
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
169
+
170
+ \f0\fs24 \cf0 John clicks on URL ending in activation code }</string>
171
+ </dict>
172
+ </dict>
173
+ <dict>
174
+ <key>Class</key>
175
+ <string>LineGraphic</string>
176
+ <key>Head</key>
177
+ <dict>
178
+ <key>ID</key>
179
+ <integer>191</integer>
180
+ <key>Info</key>
181
+ <integer>2</integer>
182
+ </dict>
183
+ <key>ID</key>
184
+ <integer>193</integer>
185
+ <key>Points</key>
186
+ <array>
187
+ <string>{181.668, 507.191}</string>
188
+ <string>{268, 509.9}</string>
189
+ <string>{383, 525.9}</string>
190
+ <string>{414.858, 556.9}</string>
191
+ </array>
192
+ <key>Style</key>
193
+ <dict>
194
+ <key>stroke</key>
195
+ <dict>
196
+ <key>HeadArrow</key>
197
+ <string>FilledArrow</string>
198
+ <key>LineType</key>
199
+ <integer>1</integer>
200
+ <key>TailArrow</key>
201
+ <string>0</string>
202
+ </dict>
203
+ </dict>
204
+ <key>Tail</key>
205
+ <dict>
206
+ <key>ID</key>
207
+ <integer>190</integer>
208
+ </dict>
209
+ </dict>
210
+ <dict>
211
+ <key>Bounds</key>
212
+ <string>{{371, 556.9}, {109.646, 87}}</string>
213
+ <key>Class</key>
214
+ <string>ShapedGraphic</string>
215
+ <key>ID</key>
216
+ <integer>191</integer>
217
+ <key>ImageID</key>
218
+ <integer>2</integer>
219
+ <key>Magnets</key>
220
+ <array>
221
+ <string>{-0.685994, -1.14332}</string>
222
+ <string>{-0.261488, -1.30744}</string>
223
+ <string>{0.261487, -1.30744}</string>
224
+ <string>{0.685993, -1.14332}</string>
225
+ <string>{1.14332, -0.685995}</string>
226
+ <string>{1.30744, -0.261489}</string>
227
+ <string>{1.30744, 0.261488}</string>
228
+ <string>{1.14332, 0.685993}</string>
229
+ <string>{0.685994, 1.14332}</string>
230
+ <string>{0.261488, 1.30744}</string>
231
+ <string>{-0.261489, 1.30744}</string>
232
+ <string>{-0.685995, 1.14332}</string>
233
+ <string>{-1.14332, 0.685993}</string>
234
+ <string>{-1.30744, 0.261488}</string>
235
+ <string>{-1.30744, -0.261489}</string>
236
+ <string>{-1.14332, -0.685994}</string>
237
+ </array>
238
+ <key>Shape</key>
239
+ <string>Rectangle</string>
240
+ <key>Style</key>
241
+ <dict>
242
+ <key>fill</key>
243
+ <dict>
244
+ <key>Draws</key>
245
+ <string>NO</string>
246
+ </dict>
247
+ <key>shadow</key>
248
+ <dict>
249
+ <key>Draws</key>
250
+ <string>NO</string>
251
+ </dict>
252
+ <key>stroke</key>
253
+ <dict>
254
+ <key>Draws</key>
255
+ <string>NO</string>
256
+ </dict>
257
+ </dict>
258
+ <key>Text</key>
259
+ <dict>
260
+ <key>Text</key>
261
+ <string>{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420
262
+ {\fonttbl\f0\fswiss\fcharset77 Helvetica;}
263
+ {\colortbl;\red255\green255\blue255;}
264
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
265
+
266
+ \f0\fs24 \cf0 MEMBERS}</string>
267
+ </dict>
268
+ <key>TextRelativeArea</key>
269
+ <string>{{0, 0.1}, {1, 1}}</string>
270
+ </dict>
271
+ <dict>
272
+ <key>Bounds</key>
273
+ <string>{{73.9315, 462}, {107.737, 87}}</string>
274
+ <key>Class</key>
275
+ <string>ShapedGraphic</string>
276
+ <key>ID</key>
277
+ <integer>190</integer>
278
+ <key>ImageID</key>
279
+ <integer>3</integer>
280
+ <key>Shape</key>
281
+ <string>Rectangle</string>
282
+ <key>Style</key>
283
+ <dict>
284
+ <key>fill</key>
285
+ <dict>
286
+ <key>Draws</key>
287
+ <string>NO</string>
288
+ </dict>
289
+ <key>shadow</key>
290
+ <dict>
291
+ <key>Draws</key>
292
+ <string>NO</string>
293
+ </dict>
294
+ <key>stroke</key>
295
+ <dict>
296
+ <key>Draws</key>
297
+ <string>NO</string>
298
+ </dict>
299
+ </dict>
300
+ </dict>
301
+ <dict>
302
+ <key>Bounds</key>
303
+ <string>{{193.865, 421.157}, {174, 14}}</string>
304
+ <key>Class</key>
305
+ <string>ShapedGraphic</string>
306
+ <key>FitText</key>
307
+ <string>YES</string>
308
+ <key>Flow</key>
309
+ <string>Resize</string>
310
+ <key>FontInfo</key>
311
+ <dict>
312
+ <key>Color</key>
313
+ <dict>
314
+ <key>w</key>
315
+ <string>0</string>
316
+ </dict>
317
+ <key>Font</key>
318
+ <string>Helvetica</string>
319
+ <key>Size</key>
320
+ <real>12</real>
321
+ </dict>
322
+ <key>ID</key>
323
+ <integer>179</integer>
324
+ <key>Notes</key>
325
+ <string>{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420
326
+ {\fonttbl\f0\fswiss\fcharset77 Helvetica;}
327
+ {\colortbl;\red255\green255\blue255;}
328
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
329
+
330
+ \f0\fs24 \cf0 type: button\
331
+ name: run\
332
+ active: no}</string>
333
+ <key>Shape</key>
334
+ <string>Rectangle</string>
335
+ <key>Style</key>
336
+ <dict>
337
+ <key>fill</key>
338
+ <dict>
339
+ <key>Color</key>
340
+ <dict>
341
+ <key>b</key>
342
+ <string>0.901961</string>
343
+ <key>g</key>
344
+ <string>0.901961</string>
345
+ <key>r</key>
346
+ <string>0.901961</string>
347
+ </dict>
348
+ <key>Draws</key>
349
+ <string>NO</string>
350
+ </dict>
351
+ <key>shadow</key>
352
+ <dict>
353
+ <key>Draws</key>
354
+ <string>NO</string>
355
+ </dict>
356
+ <key>stroke</key>
357
+ <dict>
358
+ <key>Color</key>
359
+ <dict>
360
+ <key>b</key>
361
+ <string>0.592391</string>
362
+ <key>g</key>
363
+ <string>0.592391</string>
364
+ <key>r</key>
365
+ <string>0.592391</string>
366
+ </dict>
367
+ <key>Draws</key>
368
+ <string>NO</string>
369
+ </dict>
370
+ </dict>
371
+ <key>Text</key>
372
+ <dict>
373
+ <key>Text</key>
374
+ <string>{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420
375
+ {\fonttbl\f0\fswiss\fcharset77 Helvetica;}
376
+ {\colortbl;\red255\green255\blue255;}
377
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
378
+
379
+ \f0\fs24 \cf0 John waits for activation email }</string>
380
+ </dict>
381
+ <key>Wrap</key>
382
+ <string>NO</string>
383
+ </dict>
384
+ <dict>
385
+ <key>Bounds</key>
386
+ <string>{{161.961, 274}, {387, 28}}</string>
387
+ <key>Class</key>
388
+ <string>ShapedGraphic</string>
389
+ <key>FitText</key>
390
+ <string>YES</string>
391
+ <key>Flow</key>
392
+ <string>Resize</string>
393
+ <key>FontInfo</key>
394
+ <dict>
395
+ <key>Color</key>
396
+ <dict>
397
+ <key>w</key>
398
+ <string>0</string>
399
+ </dict>
400
+ <key>Font</key>
401
+ <string>Helvetica</string>
402
+ <key>Size</key>
403
+ <real>12</real>
404
+ </dict>
405
+ <key>ID</key>
406
+ <integer>189</integer>
407
+ <key>Shape</key>
408
+ <string>Rectangle</string>
409
+ <key>Style</key>
410
+ <dict>
411
+ <key>shadow</key>
412
+ <dict>
413
+ <key>Draws</key>
414
+ <string>NO</string>
415
+ </dict>
416
+ <key>stroke</key>
417
+ <dict>
418
+ <key>Draws</key>
419
+ <string>NO</string>
420
+ </dict>
421
+ </dict>
422
+ <key>Text</key>
423
+ <dict>
424
+ <key>Text</key>
425
+ <string>{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420
426
+ {\fonttbl\f0\fswiss\fcharset77 Helvetica;}
427
+ {\colortbl;\red255\green255\blue255;}
428
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
429
+
430
+ \f0\fs24 \cf0 John signs up as "john", email "john@example.com", password "sloop"\
431
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural
432
+ John sees a welcome page}</string>
433
+ </dict>
434
+ <key>Wrap</key>
435
+ <string>NO</string>
436
+ </dict>
437
+ <dict>
438
+ <key>Class</key>
439
+ <string>LineGraphic</string>
440
+ <key>Head</key>
441
+ <dict>
442
+ <key>ID</key>
443
+ <integer>187</integer>
444
+ </dict>
445
+ <key>ID</key>
446
+ <integer>188</integer>
447
+ <key>Points</key>
448
+ <array>
449
+ <string>{371.107, 232.5}</string>
450
+ <string>{334, 262}</string>
451
+ <string>{169, 267}</string>
452
+ <string>{147.722, 315.8}</string>
453
+ </array>
454
+ <key>Style</key>
455
+ <dict>
456
+ <key>stroke</key>
457
+ <dict>
458
+ <key>HeadArrow</key>
459
+ <string>FilledArrow</string>
460
+ <key>LineType</key>
461
+ <integer>1</integer>
462
+ <key>TailArrow</key>
463
+ <string>0</string>
464
+ </dict>
465
+ </dict>
466
+ <key>Tail</key>
467
+ <dict>
468
+ <key>ID</key>
469
+ <integer>184</integer>
470
+ </dict>
471
+ </dict>
472
+ <dict>
473
+ <key>Bounds</key>
474
+ <string>{{73.9315, 315.8}, {109.646, 87}}</string>
475
+ <key>Class</key>
476
+ <string>ShapedGraphic</string>
477
+ <key>ID</key>
478
+ <integer>187</integer>
479
+ <key>ImageID</key>
480
+ <integer>2</integer>
481
+ <key>Shape</key>
482
+ <string>Rectangle</string>
483
+ <key>Style</key>
484
+ <dict>
485
+ <key>fill</key>
486
+ <dict>
487
+ <key>Draws</key>
488
+ <string>NO</string>
489
+ </dict>
490
+ <key>shadow</key>
491
+ <dict>
492
+ <key>Draws</key>
493
+ <string>NO</string>
494
+ </dict>
495
+ <key>stroke</key>
496
+ <dict>
497
+ <key>Draws</key>
498
+ <string>NO</string>
499
+ </dict>
500
+ </dict>
501
+ <key>Text</key>
502
+ <dict>
503
+ <key>Text</key>
504
+ <string>{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420
505
+ {\fonttbl\f0\fswiss\fcharset77 Helvetica;}
506
+ {\colortbl;\red255\green255\blue255;}
507
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
508
+
509
+ \f0\fs24 \cf0 WELCOME}</string>
510
+ </dict>
511
+ <key>TextRelativeArea</key>
512
+ <string>{{0, 0.1}, {1, 1}}</string>
513
+ </dict>
514
+ <dict>
515
+ <key>Bounds</key>
516
+ <string>{{206.865, 167.314}, {148, 14}}</string>
517
+ <key>Class</key>
518
+ <string>ShapedGraphic</string>
519
+ <key>FitText</key>
520
+ <string>YES</string>
521
+ <key>FontInfo</key>
522
+ <dict>
523
+ <key>Color</key>
524
+ <dict>
525
+ <key>w</key>
526
+ <string>0</string>
527
+ </dict>
528
+ <key>Font</key>
529
+ <string>Helvetica</string>
530
+ <key>Size</key>
531
+ <real>12</real>
532
+ </dict>
533
+ <key>ID</key>
534
+ <integer>186</integer>
535
+ <key>Line</key>
536
+ <dict>
537
+ <key>ID</key>
538
+ <integer>185</integer>
539
+ <key>Offset</key>
540
+ <real>-12</real>
541
+ <key>Position</key>
542
+ <real>0.49937888979911804</real>
543
+ <key>RotationType</key>
544
+ <integer>0</integer>
545
+ </dict>
546
+ <key>Shape</key>
547
+ <string>Rectangle</string>
548
+ <key>Style</key>
549
+ <dict>
550
+ <key>shadow</key>
551
+ <dict>
552
+ <key>Draws</key>
553
+ <string>NO</string>
554
+ </dict>
555
+ <key>stroke</key>
556
+ <dict>
557
+ <key>Draws</key>
558
+ <string>NO</string>
559
+ </dict>
560
+ </dict>
561
+ <key>Text</key>
562
+ <dict>
563
+ <key>Text</key>
564
+ <string>{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420
565
+ {\fonttbl\f0\fswiss\fcharset77 Helvetica;}
566
+ {\colortbl;\red255\green255\blue255;}
567
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
568
+
569
+ \f0\fs24 \cf0 John follows "sign up" link}</string>
570
+ </dict>
571
+ </dict>
572
+ <dict>
573
+ <key>Class</key>
574
+ <string>LineGraphic</string>
575
+ <key>Head</key>
576
+ <dict>
577
+ <key>ID</key>
578
+ <integer>184</integer>
579
+ </dict>
580
+ <key>ID</key>
581
+ <integer>185</integer>
582
+ <key>Points</key>
583
+ <array>
584
+ <string>{190.509, 184.643}</string>
585
+ <string>{371, 187.985}</string>
586
+ </array>
587
+ <key>Style</key>
588
+ <dict>
589
+ <key>stroke</key>
590
+ <dict>
591
+ <key>HeadArrow</key>
592
+ <string>FilledArrow</string>
593
+ <key>LineType</key>
594
+ <integer>1</integer>
595
+ <key>TailArrow</key>
596
+ <string>0</string>
597
+ </dict>
598
+ </dict>
599
+ <key>Tail</key>
600
+ <dict>
601
+ <key>ID</key>
602
+ <integer>180</integer>
603
+ </dict>
604
+ </dict>
605
+ <dict>
606
+ <key>Bounds</key>
607
+ <string>{{371, 145.5}, {109.646, 87}}</string>
608
+ <key>Class</key>
609
+ <string>ShapedGraphic</string>
610
+ <key>ID</key>
611
+ <integer>184</integer>
612
+ <key>ImageID</key>
613
+ <integer>2</integer>
614
+ <key>Shape</key>
615
+ <string>Rectangle</string>
616
+ <key>Style</key>
617
+ <dict>
618
+ <key>fill</key>
619
+ <dict>
620
+ <key>Draws</key>
621
+ <string>NO</string>
622
+ </dict>
623
+ <key>shadow</key>
624
+ <dict>
625
+ <key>Draws</key>
626
+ <string>NO</string>
627
+ </dict>
628
+ <key>stroke</key>
629
+ <dict>
630
+ <key>Draws</key>
631
+ <string>NO</string>
632
+ </dict>
633
+ </dict>
634
+ <key>Text</key>
635
+ <dict>
636
+ <key>Text</key>
637
+ <string>{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420
638
+ {\fonttbl\f0\fswiss\fcharset77 Helvetica;}
639
+ {\colortbl;\red255\green255\blue255;}
640
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
641
+
642
+ \f0\fs24 \cf0 SIGNUP}</string>
643
+ </dict>
644
+ <key>TextRelativeArea</key>
645
+ <string>{{0, 0.1}, {1, 1}}</string>
646
+ </dict>
647
+ <dict>
648
+ <key>Bounds</key>
649
+ <string>{{31.1005, 78}, {127, 14}}</string>
650
+ <key>Class</key>
651
+ <string>ShapedGraphic</string>
652
+ <key>FitText</key>
653
+ <string>YES</string>
654
+ <key>Flow</key>
655
+ <string>Resize</string>
656
+ <key>FontInfo</key>
657
+ <dict>
658
+ <key>Color</key>
659
+ <dict>
660
+ <key>w</key>
661
+ <string>0</string>
662
+ </dict>
663
+ <key>Font</key>
664
+ <string>Helvetica</string>
665
+ <key>Size</key>
666
+ <real>12</real>
667
+ </dict>
668
+ <key>ID</key>
669
+ <integer>183</integer>
670
+ <key>Shape</key>
671
+ <string>Rectangle</string>
672
+ <key>Style</key>
673
+ <dict>
674
+ <key>shadow</key>
675
+ <dict>
676
+ <key>Draws</key>
677
+ <string>NO</string>
678
+ </dict>
679
+ <key>stroke</key>
680
+ <dict>
681
+ <key>Draws</key>
682
+ <string>NO</string>
683
+ </dict>
684
+ </dict>
685
+ <key>Text</key>
686
+ <dict>
687
+ <key>Text</key>
688
+ <string>{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf420
689
+ {\fonttbl\f0\fswiss\fcharset77 Helvetica;}
690
+ {\colortbl;\red255\green255\blue255;}
691
+ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\qc\pardirnatural
692
+
693
+ \f0\fs24 \cf0 john visits home page}</string>
694
+ </dict>
695
+ <key>Wrap</key>
696
+ <string>NO</string>
697
+ </dict>
698
+ <dict>
699
+ <key>Class</key>
700
+ <string>LineGraphic</string>
701
+ <key>Head</key>
702
+ <dict>
703
+ <key>ID</key>
704
+ <integer>180</integer>
705
+ </dict>
706
+ <key>ID</key>
707
+ <integer>182</integer>
708
+ <key>Points</key>
709
+ <array>
710
+ <string>{37, 99}</string>
711
+ <string>{103, 100}</string>
712
+ <string>{122, 111}</string>
713
+ <string>{124.189, 134.5}</string>
714
+ </array>
715
+ <key>Style</key>
716
+ <dict>
717
+ <key>stroke</key>
718
+ <dict>
719
+ <key>HeadArrow</key>
720
+ <string>FilledArrow</string>
721
+ <key>LineType</key>
722
+ <integer>1</integer>
723
+ <key>TailArrow</key>
724
+ <string>0</string>
725
+ </dict>
726
+ </dict>
727
+ </dict>
728
+ <dict>
729
+ <key>Bounds</key>
730
+ <string>{{67, 134.5}, {123.509, 98}}</string>
731
+ <key>Class</key>
732
+ <string>ShapedGraphic</string>
733
+ <key>ID</key>
734
+ <integer>180</integer>
735
+ <key>ImageID</key>
736
+ <integer>1</integer>
737
+ <key>Shape</key>
738
+ <string>Rectangle</string>
739
+ <key>Style</key>
740
+ <dict>
741
+ <key>fill</key>
742
+ <dict>
743
+ <key>Draws</key>
744
+ <string>NO</string>
745
+ </dict>
746
+ <key>shadow</key>
747
+ <dict>
748
+ <key>Draws</key>
749
+ <string>NO</string>
750
+ </dict>
751
+ <key>stroke</key>
752
+ <dict>
753
+ <key>Draws</key>
754
+ <string>NO</string>
755
+ </dict>
756
+ </dict>
757
+ </dict>
758
+ </array>
759
+ <key>GridInfo</key>
760
+ <dict/>
761
+ <key>GuidesLocked</key>
762
+ <string>NO</string>
763
+ <key>GuidesVisible</key>
764
+ <string>YES</string>
765
+ <key>HPages</key>
766
+ <integer>1</integer>
767
+ <key>ImageCounter</key>
768
+ <integer>4</integer>
769
+ <key>ImageLinkBack</key>
770
+ <array>
771
+ <dict/>
772
+ <dict/>
773
+ <dict/>
774
+ </array>
775
+ <key>ImageList</key>
776
+ <array>
777
+ <string>image2.png</string>
778
+ <string>image3.png</string>
779
+ <string>image1.png</string>
780
+ </array>
781
+ <key>IsPalette</key>
782
+ <string>NO</string>
783
+ <key>KeepToScale</key>
784
+ <false/>
785
+ <key>Layers</key>
786
+ <array>
787
+ <dict>
788
+ <key>Lock</key>
789
+ <string>NO</string>
790
+ <key>Name</key>
791
+ <string>Layer 1</string>
792
+ <key>Print</key>
793
+ <string>YES</string>
794
+ <key>View</key>
795
+ <string>YES</string>
796
+ </dict>
797
+ </array>
798
+ <key>LayoutInfo</key>
799
+ <dict/>
800
+ <key>LinksVisible</key>
801
+ <string>NO</string>
802
+ <key>MagnetsVisible</key>
803
+ <string>NO</string>
804
+ <key>MasterSheet</key>
805
+ <string>Master 1</string>
806
+ <key>MasterSheets</key>
807
+ <array>
808
+ <dict>
809
+ <key>ActiveLayerIndex</key>
810
+ <integer>0</integer>
811
+ <key>AutoAdjust</key>
812
+ <true/>
813
+ <key>CanvasColor</key>
814
+ <dict>
815
+ <key>w</key>
816
+ <string>1</string>
817
+ </dict>
818
+ <key>CanvasPoint</key>
819
+ <string>{0, 0}</string>
820
+ <key>CanvasScale</key>
821
+ <real>1</real>
822
+ <key>ColumnAlign</key>
823
+ <integer>1</integer>
824
+ <key>ColumnSpacing</key>
825
+ <real>36</real>
826
+ <key>DisplayScale</key>
827
+ <string>1 in = 1 in</string>
828
+ <key>GraphicsList</key>
829
+ <array/>
830
+ <key>GridInfo</key>
831
+ <dict/>
832
+ <key>HPages</key>
833
+ <integer>1</integer>
834
+ <key>IsPalette</key>
835
+ <string>NO</string>
836
+ <key>KeepToScale</key>
837
+ <false/>
838
+ <key>Layers</key>
839
+ <array>
840
+ <dict>
841
+ <key>Lock</key>
842
+ <string>NO</string>
843
+ <key>Name</key>
844
+ <string>Layer 1</string>
845
+ <key>Print</key>
846
+ <string>YES</string>
847
+ <key>View</key>
848
+ <string>YES</string>
849
+ </dict>
850
+ </array>
851
+ <key>LayoutInfo</key>
852
+ <dict/>
853
+ <key>Orientation</key>
854
+ <integer>2</integer>
855
+ <key>OutlineStyle</key>
856
+ <string>Basic</string>
857
+ <key>RowAlign</key>
858
+ <integer>1</integer>
859
+ <key>RowSpacing</key>
860
+ <real>36</real>
861
+ <key>SheetTitle</key>
862
+ <string>Master 1</string>
863
+ <key>UniqueID</key>
864
+ <integer>1</integer>
865
+ <key>VPages</key>
866
+ <integer>1</integer>
867
+ </dict>
868
+ </array>
869
+ <key>ModificationDate</key>
870
+ <string>2007-06-13 12:38:13 -0500</string>
871
+ <key>Modifier</key>
872
+ <string>Brian Marick</string>
873
+ <key>NotesVisible</key>
874
+ <string>NO</string>
875
+ <key>Orientation</key>
876
+ <integer>2</integer>
877
+ <key>PointVisible</key>
878
+ <string>NO</string>
879
+ <key>OutlineStyle</key>
880
+ <string>Basic</string>
881
+ <key>PageBreaks</key>
882
+ <string>YES</string>
883
+ <key>PrintInfo</key>
884
+ <dict>
885
+ <key>NSBottomMargin</key>
886
+ <array>
887
+ <string>float</string>
888
+ <string>0</string>
889
+ </array>
890
+ <key>NSLeftMargin</key>
891
+ <array>
892
+ <string>float</string>
893
+ <string>0</string>
894
+ </array>
895
+ <key>NSPaperSize</key>
896
+ <array>
897
+ <string>size</string>
898
+ <string>{612, 792}</string>
899
+ </array>
900
+ <key>NSRightMargin</key>
901
+ <array>
902
+ <string>float</string>
903
+ <string>0</string>
904
+ </array>
905
+ <key>NSTopMargin</key>
906
+ <array>
907
+ <string>float</string>
908
+ <string>0</string>
909
+ </array>
910
+ </dict>
911
+ <key>ReadOnly</key>
912
+ <string>NO</string>
913
+ <key>RowAlign</key>
914
+ <integer>1</integer>
915
+ <key>RowSpacing</key>
916
+ <real>36</real>
917
+ <key>SheetTitle</key>
918
+ <string>Canvas 1</string>
919
+ <key>SmartAlignmentGuidesActive</key>
920
+ <string>YES</string>
921
+ <key>SmartDistanceGuidesActive</key>
922
+ <string>YES</string>
923
+ <key>UniqueID</key>
924
+ <integer>1</integer>
925
+ <key>UseEntirePage</key>
926
+ <true/>
927
+ <key>VPages</key>
928
+ <integer>1</integer>
929
+ <key>WindowInfo</key>
930
+ <dict>
931
+ <key>CurrentSheet</key>
932
+ <string>0</string>
933
+ <key>DrawerOpen</key>
934
+ <false/>
935
+ <key>DrawerTab</key>
936
+ <string>Outline</string>
937
+ <key>DrawerWidth</key>
938
+ <real>209</real>
939
+ <key>FitInWindow</key>
940
+ <false/>
941
+ <key>Frame</key>
942
+ <string>{{55, 0}, {594, 746}}</string>
943
+ <key>ShowRuler</key>
944
+ <false/>
945
+ <key>ShowStatusBar</key>
946
+ <true/>
947
+ <key>VisibleRegion</key>
948
+ <string>{{0, 65}, {579, 632}}</string>
949
+ <key>Zoom</key>
950
+ <string>1</string>
951
+ </dict>
952
+ </dict>
953
+ </plist>