Piggy 0.4.3.0 → 0.5.0.0

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.
data/CHANGES.txt CHANGED
@@ -1,3 +1,10 @@
1
+ Changes in 0.5.0-0
2
+ - Ftp: Abort upload
3
+ - Ftp: Delete directories (if empty)
4
+ - New JavaFX gallery
5
+ - A few more tags in html output
6
+ - Switched to beta status
7
+
1
8
  Changes in 0.4.3-0
2
9
  - Bugfix (Vista): LOCAL_APPDATA path
3
10
  solved with win32-dir
data/README.txt CHANGED
@@ -33,3 +33,10 @@ Uncheck this option if this metadata includes personal information
33
33
  that you do not want to publish.
34
34
  (See http://netzreport.googlepages.com/hidden_data_in_jpeg_files.html
35
35
  for more information on this topic.)
36
+
37
+ Piggy output optionally contains Javascript and Java FX Script.
38
+ Note that JavaFX is relatively new technology with several bugs.
39
+ For example Version 1.2 seems to prevent the Opera browser from shutting
40
+ down the opera process.
41
+
42
+
@@ -34,6 +34,7 @@ class AliveCheck
34
34
  begin
35
35
  yield
36
36
  ensure
37
+ @alive = false
37
38
  alive_checker.kill if alive_checker and alive_checker.alive?
38
39
  end
39
40
  end
@@ -18,8 +18,15 @@ class FtpAdapter
18
18
  end
19
19
 
20
20
  def connect(host, user, password)
21
- c_timeout { @connection = Net::FTP.open(host, user, password) }
22
- @connection.debug_mode = @options.debug
21
+ @host = host
22
+ @user = user
23
+ @password = password
24
+ reconnect
25
+ end
26
+
27
+ def reconnect
28
+ c_timeout { @connection = Net::FTP.open(@host, @user, @password) }
29
+ @connection.debug_mode = @options.debug
23
30
  end
24
31
 
25
32
  def chdir(path)
@@ -53,11 +60,15 @@ class FtpAdapter
53
60
  def delete(file)
54
61
  c_timeout { @connection.delete(file) }
55
62
  end
63
+
64
+ def rmdir(dir)
65
+ c_timeout { @connection.rmdir(dir) }
66
+ end
56
67
 
57
68
  # Upload with progress events.
58
69
  #
59
70
  # Example:
60
- # upload('C:\tmp\bla\big.zip', 'C:\tmp') {
71
+ # upload('C:\tmp', 'C:\tmp\bla\big.zip') {
61
72
  # |data|
62
73
  # ...
63
74
  # data.size
@@ -67,9 +78,11 @@ class FtpAdapter
67
78
  # and every chunk of transferred data will
68
79
  # be given to the block.
69
80
  def upload(local_path, file, &block)
81
+ puts "FtpAdapter\#upload #{file}"
70
82
  depth_offset = FilePath.split(local_path).size
71
83
  path_sections = FilePath.split(file)
72
84
  dirs = path_sections[depth_offset..-2]
85
+ pwd = c_timeout { @connection.pwd }
73
86
  unless dirs == nil
74
87
  dirs.each do
75
88
  |dir|
@@ -81,22 +94,60 @@ class FtpAdapter
81
94
  end
82
95
  end
83
96
  end
97
+ if(putbinaryfile(file, &block))
98
+ unless dirs == nil
99
+ dirs.each { |dir| chdir('..') }
100
+ end
101
+ puts "Done"
102
+ else
103
+ begin
104
+ puts "Abortion delete: #{file}"
105
+ reconnect
106
+ chdir(pwd + dirs.join("/"))
107
+ puts(@connection.pwd)
108
+ delete(File.basename(file))
109
+ puts "Abortion delete done"
110
+ rescue StandardError => ex
111
+ puts "Abortion delete failed"
112
+ puts "#{ex.class.to_s}: #{ex.message}"
113
+ ensure
114
+ # force cleanup after error or abortion
115
+ begin
116
+ c_timeout { @connection.close }
117
+ rescue StandardError => ex
118
+ puts "Abortion cleanup failed"
119
+ puts "#{ex.class.to_s}: #{ex.message}"
120
+ end
121
+ end
122
+ end
123
+ end
124
+
125
+ def putbinaryfile(file, &block)
126
+ aborted = false
84
127
  alive_checker = AliveCheck.new(@options.ftpTransferTimeout,
85
128
  "ftp transfer timeout")
86
129
  alive_checker.check do
87
130
  @connection.putbinaryfile(file) { |data|
88
131
  alive_checker.alive!
89
- block.call(data)
132
+ if block.call(data)
133
+ print "."
134
+ else
135
+ # @connection.abort would cause Errno::EINVAL later on
136
+ aborted = true
137
+ break
138
+ end
90
139
  }
91
140
  end
92
- unless dirs == nil
93
- dirs.each { |dir| chdir('..') }
94
- end
141
+ return !aborted
95
142
  end
96
-
143
+
97
144
  def close
98
145
  @connection.close unless @connection.nil?
99
146
  end
147
+
148
+ def closed?
149
+ @connection.nil? or @connection.closed?
150
+ end
100
151
 
101
152
  private
102
153
 
@@ -39,27 +39,33 @@ class HtmlGenerator
39
39
 
40
40
  # Start a RSS 2.0 feed
41
41
  def new_rss(title_string, desc_string, &block)
42
+ new_xml do
43
+ @page += '<rss version="2.0">'
44
+ cr
45
+ channel {
46
+ title { add_html(title_string) }
47
+ description { add_html(desc_string) }
48
+ language
49
+ block.call
50
+ }
51
+ cr
52
+ @page += '</rss>'
53
+ cr
54
+ end
55
+ end
56
+
57
+ def new_xml(encoding="utf-8", &block)
42
58
  reset
43
- @page = '<?xml version="1.0" encoding="utf-8"?>'
44
- cr
45
- @page += '<rss version="2.0">'
46
- cr
47
- channel {
48
- title { add_html(escape_html(title_string)) }
49
- description { add_html(escape_html(desc_string)) }
50
- language
51
- block.call
52
- }
53
- cr
54
- @page += '</rss>'
59
+ @page = "<?xml version=\"1.0\" encoding=\"#{encoding}\"?>"
55
60
  cr
61
+ block.call
56
62
  end
57
63
 
58
64
  def add_item(title_string, link_string, desc_string)
59
65
  tag('item', {}) {
60
- title { add_html(escape_html(title_string)) }
61
- tag('link', {}) { add_html(escape_html(link_string)) }
62
- description { add_html(escape_html(desc_string)) }
66
+ title { add_html(title_string) }
67
+ tag('link', {}) { add_html(link_string) }
68
+ description { add_html(desc_string) }
63
69
  }
64
70
  end
65
71
 
@@ -153,7 +159,7 @@ class HtmlGenerator
153
159
  end
154
160
 
155
161
  def language(value = 'de')
156
- tag('language', {}) { add_html value }
162
+ tag('language', {}) { add value }
157
163
  end
158
164
 
159
165
  def center(&block)
@@ -184,6 +190,10 @@ class HtmlGenerator
184
190
  tag 'div', params, &block
185
191
  end
186
192
 
193
+ def span(params = {}, &block)
194
+ tag 'span', params, &block
195
+ end
196
+
187
197
  def img(src_path, alt_name)
188
198
  begin_tag('img', { 'src'=>src_path, 'alt'=>alt_name })
189
199
  end
@@ -229,7 +239,11 @@ class HtmlGenerator
229
239
  end
230
240
 
231
241
  def add_html(html_string)
232
- @page += html_string
242
+ add(escape_html(html_string))
243
+ end
244
+
245
+ def add(string)
246
+ @page += string
233
247
  end
234
248
 
235
249
  def get_page
@@ -11,9 +11,9 @@ class PiggyOptions
11
11
  :localDestinationPath, :remoteDestinationPath,
12
12
  :ftpUser, :ftpHost, :ftpHasLocaltime,
13
13
  :ftpConnectionTimeout, :ftpTransferTimeout,
14
- :addZip, :addSlideshow,
14
+ :addZip, :addSlideshow, :addJavaFxSlideshow,
15
15
  :preselectDirectories,
16
- :slideshowDelay,
16
+ :slideshowDelay,
17
17
  :style, :stylesSample, :skipImageProcessing,
18
18
  :browser,
19
19
  :excludeFilters,
@@ -44,6 +44,7 @@ class PiggyOptions
44
44
  @ftpTransferTimeout = nil
45
45
  @addZip = nil
46
46
  @addSlideshow = nil
47
+ @addJavaFxSlideshow = nil
47
48
  @preselectDirectories = nil
48
49
  @slideshowDelay = nil
49
50
  @style = nil
@@ -78,6 +79,7 @@ class PiggyOptions
78
79
  @ftpTransferTimeout = 30 if @ftpTransferTimeout.nil?
79
80
  @addZip = true if @addZip.nil?
80
81
  @addSlideshow = true if @addSlideshow.nil?
82
+ @addJavaFxSlideshow = false if @addJavaFxSlideshow.nil?
81
83
  @preselectDirectories = true if @preselectDirectories.nil?
82
84
  @slideshowDelay = 5 if @slideshowDelay.nil?
83
85
  @style = 'shadow' if @style.nil?
@@ -114,7 +116,7 @@ class PiggyOptions
114
116
  def browser?
115
117
  !@browser.nil? && !@browser.empty?
116
118
  end
117
-
119
+
118
120
  alias :usePreview? :usePreview
119
121
  alias :useLog? :useLog
120
122
  alias :generateFramePage? :generateFramePage
@@ -122,8 +124,10 @@ class PiggyOptions
122
124
  alias :ftpHasLocaltime? :ftpHasLocaltime
123
125
  alias :addZip? :addZip
124
126
  alias :addSlideshow? :addSlideshow
127
+ alias :addJavaFxSlideshow? :addJavaFxSlideshow
125
128
  alias :preselectDirectories? :preselectDirectories
126
129
  alias :debug? :debug
127
130
  alias :stylesSample? :stylesSample
131
+ alias :initializeNilsWithDefault :initialize_nils_with_default
128
132
  end
129
133
 
@@ -59,8 +59,9 @@ class ThumbnailPageGenerator < HtmlGenerator
59
59
  attr_writer(:client)
60
60
 
61
61
  HtmlExt = '.htm'
62
- DownloadName = "download.zip"
63
- SlideshowName = "slideshow"
62
+ DownloadName = 'download.zip'
63
+ SlideshowName = 'slideshow'
64
+ JavaFxName = 'animation'
64
65
 
65
66
  def initialize(options)
66
67
  @client = self
@@ -174,18 +175,24 @@ class ThumbnailPageGenerator < HtmlGenerator
174
175
  }
175
176
  body({"class"=>"image_page"}) {
176
177
  div({'class' => 'content'}){
177
- div({'class' => 'navigation'}){
178
+ div({'class' => 'navigation', 'id'=>'toprevnext'}){
178
179
  div {
179
180
  div {
180
181
  p {
181
- a({"HREF" => escape_html(pred) + HtmlExt}){
182
- add_html(escape_html(i == 0 ? 'last' : 'previous'))
182
+ span {
183
+ a({"HREF" => escape_html(pred) + HtmlExt}){
184
+ add(i == 0 ? 'last' : 'previous')
185
+ }
183
186
  }
184
- a({"HREF" => escape_html(backlink) }) {
185
- add_html(escape_html('overview'))
187
+ span {
188
+ a({"HREF" => escape_html(backlink) }) {
189
+ add('overview')
190
+ }
186
191
  }
187
- a({"HREF" => escape_html(succ) + HtmlExt}) {
188
- add_html(escape_html(i == max_ind ? 'first' : 'next'))
192
+ span {
193
+ a({"HREF" => escape_html(succ) + HtmlExt}) {
194
+ add(i == max_ind ? 'first' : 'next')
195
+ }
189
196
  }
190
197
  }
191
198
  }
@@ -203,7 +210,7 @@ class ThumbnailPageGenerator < HtmlGenerator
203
210
  div({'class' => 'comment'}){
204
211
  div {
205
212
  div {
206
- p { add_html(escape_html(comment)) }
213
+ p { add_html(comment) }
207
214
  }
208
215
  }
209
216
  }
@@ -216,6 +223,27 @@ class ThumbnailPageGenerator < HtmlGenerator
216
223
  }
217
224
  end
218
225
 
226
+ def build_javafx_config()
227
+ new_xml do
228
+ tag('root', {}) do
229
+ add("<title>#{escape_html(@title)}</title>")
230
+ cr
231
+ tag('images', {}){
232
+ cr
233
+ maxInd = @inputFilenames.size - 1
234
+ (0..maxInd).each { | i |
235
+ current = image_name(@inputFilenames[i])
236
+ add("<image src=\"#{string_as_utf8(current)}\"/>")
237
+ cr
238
+ }
239
+ }
240
+ tag('layout', {}) {
241
+ add("<imageSize width=\"#{@options.imageWidth}\" height=\"#{@options.imageHeight}\"/>")
242
+ }
243
+ end
219
244
  end
245
+ write_file(File.join(imageOutputPath, 'config.xml'), get_page)
246
+ end
247
+
220
248
  def build_slideshow_list
221
249
  File.open(File.join(imageOutputPath, 'images.js'), 'w') { | fp |
222
250
  fp.print("var images = new Array(\n")
@@ -283,15 +311,28 @@ class ThumbnailPageGenerator < HtmlGenerator
283
311
  stylesheet sub_stylesheet_url
284
312
  }
285
313
  body({'class'=>'thumbs'}){
286
- h3({}){ add_html(escape_html(@title)) }
287
- if(size_of_zipfile > 0)
288
- a({"href" => DownloadName }) { add_html(DownloadName) }
289
- add_html("(#{bytes_as_string(size_of_zipfile)})")
290
- end
291
- if(@options.addSlideshow?)
292
- a({"href" => File.join('slideshow.htm'), "target" => "_top"}) {
293
- add_html(SlideshowName)
294
- }
314
+ h3({}){ add(escape_html(@title)) }
315
+ div({'class'=>'navigation', 'id'=>'toslides' }) do
316
+ if(size_of_zipfile > 0)
317
+ span {
318
+ a({"href" => DownloadName }) { add_html(DownloadName) }
319
+ add_html("(#{bytes_as_string(size_of_zipfile)})")
320
+ }
321
+ end
322
+ if(@options.addSlideshow?)
323
+ span {
324
+ a({"href" => File.join('slideshow.htm'), "target" => "_top"}) {
325
+ add_html(SlideshowName)
326
+ }
327
+ }
328
+ end
329
+ if(@options.addJavaFxSlideshow?)
330
+ span {
331
+ a({"href" => File.join('javafx.htm'), "target" => "_top"}) {
332
+ add_html(JavaFxName)
333
+ }
334
+ }
335
+ end
295
336
  end
296
337
  image_table({'class'=>'table'}) {
297
338
  matrix.each do |m_row|
@@ -388,9 +429,9 @@ class ThumbnailPageGenerator < HtmlGenerator
388
429
  })
389
430
  noframes(){
390
431
  cr
391
- add_html('Ohne Frames siehe: ')
432
+ add('Ohne Frames siehe: ')
392
433
  a({'href'=>"navigation.htm"}){
393
- add_html('Navigationsleiste')
434
+ add('Navigationsleiste')
394
435
  }
395
436
  }
396
437
  }
@@ -436,8 +477,19 @@ class ThumbnailPageGenerator < HtmlGenerator
436
477
  if @options.addSlideshow?
437
478
  copy_templates(['slideshow.htm', 'slideshow.js'], imageOutputPath)
438
479
  link = "<link href=\"#{sub_stylesheet_url}\" rel=\"stylesheet\" type=\"text/css\">"
439
- insert_in_file(File.join(imageOutputPath, 'slideshow.htm'),
440
- /<!--STYLE-->/, link)
480
+ insert_in_file(File.join(imageOutputPath, 'slideshow.htm'), /<!--STYLE-->/, link)
481
+ end
482
+ if @options.addJavaFxSlideshow?
483
+ fx_files = ['javafx.htm', 'PiggyFX.jnlp', 'PiggyFX_browser.jnlp']
484
+ copy_templates(fx_files + ['PiggyFX.jar'], imageOutputPath)
485
+ fx_files.each { |file_name|
486
+ # magic numbers from javafx code
487
+ w = @options.imageWidth + 205
488
+ h = @options.imageHeight + 140
489
+ h = 700 if h < 700 # need this height for image bar with 5 images
490
+ replace_in_file(File.join(imageOutputPath, file_name), /@WIDTH@/, w.to_s)
491
+ replace_in_file(File.join(imageOutputPath, file_name), /@HEIGHT@/, h.to_s)
492
+ }
441
493
  end
442
494
  end
443
495
 
@@ -473,6 +525,15 @@ class ThumbnailPageGenerator < HtmlGenerator
473
525
  }
474
526
  }
475
527
  end
528
+
529
+ def replace_in_file(file, pattern, replacement)
530
+ lines = File.readlines(file)
531
+ File.open(file, 'w') { |fp|
532
+ lines.each { |line|
533
+ fp.print(line.gsub(pattern, replacement))
534
+ }
535
+ }
536
+ end
476
537
 
477
538
  def update_navigation_frame()
478
539
  reset
@@ -480,7 +541,7 @@ class ThumbnailPageGenerator < HtmlGenerator
480
541
  a({
481
542
  'href' => escape_html(subDir) + '/index.htm',
482
543
  'target' => 'Daten'}) {
483
- add_html(escape_html(@title))
544
+ add_html(@title)
484
545
  }
485
546
  br
486
547
  add_html("\n")
@@ -523,6 +584,7 @@ class ThumbnailPageGenerator < HtmlGenerator
523
584
  build_thumbnail_page(size_of_zipfile)
524
585
  copy_template_files
525
586
  build_slideshow_list if @options.addSlideshow?
587
+ build_javafx_config if @options.addJavaFxSlideshow?
526
588
  if @options.generateFramePage?
527
589
  build_frame_page
528
590
  update_navigation_frame
@@ -4,13 +4,13 @@
4
4
  # Provide release information for Piggy.
5
5
  module PiggyVersion
6
6
  def PiggyVersion.version_string
7
- '0.4.3-0'
7
+ '0.5.0-0'
8
8
  end
9
9
  def PiggyVersion.copyright_string
10
10
  'Copyright (C) 2009 Sascha D�rdelmann'
11
11
  end
12
12
  def PiggyVersion.development_status
13
- 'alpha'
13
+ 'beta'
14
14
  end
15
15
  def PiggyVersion.display_string
16
16
  "#{PiggyVersion.version_string} (#{PiggyVersion.development_status})"
@@ -243,22 +243,26 @@ class FtpBrowserWidget < DirectoryDiffWidget
243
243
  @leftFileList.clearItems
244
244
  @leftContents = DirectoryContents.new(left_path)
245
245
  begin
246
- @connectionDataVerified = false
247
- @ftpAdapter.connect(host, user, password)
248
- @connectionDataVerified = true
249
- @connect_button.setState(STATE_DOWN)
250
- @ftpAdapter.chdir(left_path)
246
+ connect
251
247
  block.call # <------ the call
252
- update_list(@ftpAdapter.nlst, @leftFileList, @leftContents) do
253
- |file, path|
254
- @ftpAdapter.info(file, path)
248
+ puts 'ftpDo: call finished'
249
+ begin
250
+ connect if @ftpAdapter.closed?
251
+ update_left_connected
252
+ rescue Errno::EINVAL => ex
253
+ puts "Recover from: #{ex.message}"
254
+ # abortion and big files
255
+ # might cause socket errors
256
+ # force reconnect
257
+ connect
258
+ update_left_connected
255
259
  end
256
260
  rescue SocketError => ex
257
- error(ex.message)
261
+ error("SocketError: #{ex.message}")
258
262
  rescue Net::FTPError => ex
259
- error(ex.message)
263
+ error("Net::FTPError: #{ex.message}")
260
264
  rescue StandardError => ex
261
- error(ex.message)
265
+ error("#{ex.class.to_s}: #{ex.message}")
262
266
  rescue Timeout::Error => ex
263
267
  error("Timeout - operation took longer than expected. \nCheck network connection and try again.")
264
268
  ensure
@@ -268,6 +272,20 @@ class FtpBrowserWidget < DirectoryDiffWidget
268
272
  getApp.endWaitCursor
269
273
  end
270
274
 
275
+ def connect
276
+ @connectionDataVerified = false
277
+ @ftpAdapter.connect(host, user, password)
278
+ @ftpAdapter.chdir(left_path)
279
+ @connectionDataVerified = true
280
+ @connect_button.setState(STATE_DOWN)
281
+ end
282
+
283
+ def update_left_connected
284
+ update_list(@ftpAdapter.nlst, @leftFileList, @leftContents) do
285
+ |file, path|
286
+ @ftpAdapter.info(file, path)
287
+ end
271
288
  end
289
+
272
290
  def update_ftp_list
273
291
  ftp_do {} # every ftp action includes an update :-)
274
292
  end
@@ -322,27 +340,48 @@ class FtpBrowserWidget < DirectoryDiffWidget
322
340
  end
323
341
  update_status_icons
324
342
  end
343
+
344
+ def ftp_remove_left(dirs)
345
+ ftp_do do
346
+ dirs.each { |dir|
347
+ @ftpAdapter.rmdir(dir)
348
+ }
349
+ end
350
+ update_status_icons
351
+ end
325
352
 
326
353
  def ftp_upload_right(hash, totalSize)
354
+ all = hash.keys.size
355
+ current = 0
327
356
  ftp_do do
328
357
  progressDialog = FXProgressDialog.new(self,
329
358
  'Transferring data',
330
- 'Transferring data')
359
+ 'Transferring data',
360
+ PROGRESSDIALOG_NORMAL | PROGRESSDIALOG_CANCEL)
331
361
  begin
332
- progressDialog.setProgress(1)
362
+ progressDialog.setProgress(0)
333
363
  progressDialog.setTotal(totalSize)
334
364
  progressDialog.create
335
365
  progressDialog.show
336
366
  progressDialog.repaint
337
367
  hash.keys.sort.each do
338
368
  |file|
369
+ current = current + 1
370
+ progressDialog.setMessage(ruby_2_fox("Transferring #{current.to_s}/#{all.to_s}: #{File.basename(file)}"))
371
+ progressDialog.repaint
339
372
  @ftpAdapter.upload(right_path, file) { |data|
340
- progressDialog.setMessage(ruby_2_fox("Transferring #{File.basename(file)}"))
341
373
  progressDialog.increment(data.size)
342
374
  progressDialog.repaint
375
+ # Workaround for
376
+ # response problem with vista
377
+ # getApp().runModalWhileEvents()
378
+ getApp().runWhileEvents()
379
+ !progressDialog.cancelled?
343
380
  }
381
+ break if progressDialog.cancelled?
344
382
  end
345
383
  ensure
384
+ puts "Upload stopped at #{current.to_s}/#{all.to_s}"
346
385
  progressDialog.hide
347
386
  end
348
387
  end
@@ -370,12 +409,17 @@ class FtpBrowserWidget < DirectoryDiffWidget
370
409
  dirs = sel.select { |file|
371
410
  @leftContents[file].directory?
372
411
  }
373
- return error("Sorry, can't remove directories, yet") unless dirs.empty?
412
+ files = sel.reject { |file|
413
+ @leftContents[file].directory?
414
+ }
374
415
  return false if sel.empty?
375
- num = sel.size
376
- answer = FXMessageBox.question(self, MBOX_YES_NO, 'Really delete?',
377
- "Delete #{num} fil#{num == 1 ? 'e' : 'es'}?")
378
- ftp_delete_left(sel) if answer == MBOX_CLICKED_YES
416
+ answer = FXMessageBox.question(self, MBOX_YES_NO,
417
+ "Really delete?",
418
+ "Selected:\n#{dirs.size.to_s} directories\n#{files.size.to_s} files\nReally delete?")
419
+ if answer == MBOX_CLICKED_YES
420
+ ftp_delete_left(files)
421
+ ftp_remove_left(dirs)
422
+ end
379
423
  end
380
424
 
381
425
  # events
@@ -53,11 +53,17 @@ class HtmlOptionsWidget < Fox::FXMatrix
53
53
  @options.addZip = ptr
54
54
  }
55
55
  add_label_to(self, ""); # TODO empty cell in matrix layout
56
- add_slideshow_check = FXCheckButton.new(self, 'Add slideshow')
56
+ add_slideshow_check = FXCheckButton.new(self, 'Add Javascript slideshow')
57
57
  add_slideshow_check.setCheck(@options.addSlideshow?)
58
58
  add_slideshow_check.connect(SEL_COMMAND) { |sender, sel, ptr|
59
59
  @options.addSlideshow = ptr
60
60
  }
61
+ add_label_to(self, ""); # TODO empty cell in matrix layout
62
+ add_slideshow_check = FXCheckButton.new(self, 'Add JavaFX slideshow')
63
+ add_slideshow_check.setCheck(@options.addJavaFxSlideshow?)
64
+ add_slideshow_check.connect(SEL_COMMAND) { |sender, sel, ptr|
65
+ @options.addJavaFxSlideshow = ptr
66
+ }
61
67
  add_label_to(self, "Style:")
62
68
  style_text_field = new_combobox(self, 32,
63
69
  10,
@@ -195,6 +195,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
195
195
  msg += "- FXRuby #{Fox.fxrubyversion}\n"
196
196
  msg += "- FOX Toolkit #{Fox.fxversion}\n"
197
197
  msg += "- Javascript slideshow no version information availiable\n"
198
+ msg += "- JavaFX animation uses JavaFX Script Version 1.2 which runs on top of Java 6\n"
198
199
  msg += "- Piggy #{PiggyVersion.display_string}\n"
199
200
  about_title = "About Piggy"
200
201
  tmp = FXMenuCommand.new(menus['help'], "&About Piggy...")
@@ -543,7 +544,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
543
544
  if @currentRotation >= 360
544
545
  @currentRotation = @currentRotation - 360
545
546
  end
546
- @orientationStatus.setText(ruby_2_fox(@currentRotation.to_s + '�'))
547
+ @orientationStatus.setText(ruby_2_fox(@currentRotation.to_s + '�'))
547
548
  current_file_info.rotation = @currentRotation
548
549
  end
549
550
 
@@ -790,6 +791,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
790
791
  get_style_list.each { |style|
791
792
  @options.style = style
792
793
  @options.skipImageProcessing = (style != 'basic')
794
+ @options.addJavaFxSlideshow = (style == 'basic')
793
795
  @options.stylesSample = (style != 'basic')
794
796
  generator.set_title(style)
795
797
  generator.set_output_directory(style)
Binary file
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <jnlp spec="1.0+" codebase="http://piggy.rubyforge.org/samples/basic/" href="PiggyFX.jnlp">
3
+ <information>
4
+ <title>PiggyFX</title>
5
+ <vendor>piggy project at rubyforge.org</vendor>
6
+ <homepage href="http://piggy.rubyforge.org"/>
7
+ <description>PiggyFX</description>
8
+ <offline-allowed/>
9
+ <shortcut>
10
+ <desktop/>
11
+ </shortcut>
12
+ </information>
13
+ <security>
14
+ <all-permissions/>
15
+ </security>
16
+ <resources>
17
+ <j2se version="1.5+"/>
18
+ <extension name="JavaFX Runtime" href="http://dl.javafx.com/1.2/javafx-rt.jnlp"/>
19
+ <jar href="PiggyFX.jar" main="true"/>
20
+ </resources>
21
+ <application-desc main-class="piggyfx.Main">
22
+ </application-desc>
23
+ </jnlp>
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <jnlp spec="1.0+" href="PiggyFX_browser.jnlp">
3
+ <update check="background"/>
4
+ <information>
5
+ <title>PiggyFX</title>
6
+ <vendor>piggy project at rubyforge.org</vendor>
7
+ <homepage href="http://piggy.rubyforge.org"/>
8
+ <description>PiggyFX</description>
9
+ <offline-allowed/>
10
+ </information>
11
+ <resources>
12
+ <j2se version="1.5+"/>
13
+ <extension name="JavaFX Runtime" href="http://dl.javafx.com/1.2/javafx-rt.jnlp"/>
14
+ <jar href="PiggyFX.jar" main="true"/>
15
+ </resources>
16
+ <applet-desc name="PiggyFX" main-class="com.sun.javafx.runtime.adapter.Applet" width="@WIDTH@" height="@HEIGHT@">
17
+ <param name="MainJavaFXScript" value="piggyfx.Main">
18
+ </applet-desc>
19
+ </jnlp>
@@ -0,0 +1,34 @@
1
+ <html>
2
+ <head>
3
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
4
+ <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
5
+ <META HTTP-EQUIV="EXPIRES" CONTENT="0">
6
+ <title>PiggyFX gallery</title>
7
+ </head>
8
+ <body id="body" style="background:black;margin:0;padding:0;" >
9
+ <center>
10
+ <script src="http://dl.javafx.com/1.2/dtfx.js"></script>
11
+ <script>
12
+ javafx(
13
+ {
14
+ archive: "PiggyFX.jar",
15
+ draggable: true,
16
+ width: @WIDTH@,
17
+ height: @HEIGHT@,
18
+ code: "piggyfx.Main",
19
+ name: "PiggyFX",
20
+ id: "app"
21
+ },
22
+ {
23
+ isApplet: "true",
24
+ configfile: "config.xml"
25
+ }
26
+ );
27
+ </script>
28
+ <noscript>
29
+ The slideshow only loads with active Javascript and Java.<br>
30
+ (Java 6 Update 13 or newer is recommended.)
31
+ </noscript>
32
+ </center>
33
+ </body>
34
+ </html>
@@ -2,6 +2,11 @@ body {
2
2
  text-align: center;
3
3
  }
4
4
 
5
+ .navigation span {
6
+ margin-left: 1.2em;
7
+ padding: 0.1em;
8
+ }
9
+
5
10
  dl, table.table {
6
11
  margin-left: auto;
7
12
  margin-right: auto;
@@ -24,6 +24,11 @@ a:active {
24
24
  text-decoration: none;
25
25
  }
26
26
 
27
+ .navigation span {
28
+ margin-left: 1.2em;
29
+ padding: 0.1em;
30
+ }
31
+
27
32
  dl, table.table {
28
33
  margin-left: auto;
29
34
  margin-right: auto;
@@ -3,6 +3,11 @@ body {
3
3
  text-align: center;
4
4
  }
5
5
 
6
+ .navigation span {
7
+ margin-left: 1.2em;
8
+ padding: 0.1em;
9
+ }
10
+
6
11
  h1,h2,h3 {
7
12
  color:#667553;
8
13
  }
@@ -2,6 +2,11 @@ body {
2
2
  text-align: center;
3
3
  }
4
4
 
5
+ .navigation span {
6
+ margin-left: 1.2em;
7
+ padding: 0.1em;
8
+ }
9
+
5
10
  div {
6
11
  margin:0;
7
12
  }
@@ -3,6 +3,11 @@ body {
3
3
  background: #D9F5F3;
4
4
  }
5
5
 
6
+ #toslides span {
7
+ margin-left: 1.2em;
8
+ padding: 0.1em;
9
+ }
10
+
6
11
  .image_page a {
7
12
  margin: 10px;
8
13
  }
@@ -12,6 +12,22 @@ a {
12
12
  margin: 10px;
13
13
  }
14
14
 
15
+ .navigation span {
16
+ margin-left: 1em;
17
+ padding: 0.1em;
18
+ background: #222222;
19
+ border-right: solid lightgray 1pt;
20
+ border-bottom: solid lightgray 1pt;
21
+ }
22
+
23
+ .navigation span a{
24
+ text-decoration: none;
25
+ }
26
+
27
+ .navigation span:hover{
28
+ background: #444444;
29
+ }
30
+
15
31
  .thumbs dl.table {
16
32
  padding-left: 84px;
17
33
  }
@@ -45,16 +45,19 @@ dd {
45
45
  margin-bottom: 8px;
46
46
  }
47
47
 
48
- .image_page .navigation a {
48
+ .navigation a {
49
49
  display: block;
50
- float: left;
51
- width: 60px;
52
50
  margin: 10px;
53
51
  text-decoration: none;
54
52
  color: Silver;
55
53
  font-weight: bold;
56
54
  }
57
55
 
56
+ .image_page .navigation a {
57
+ float: left;
58
+ width: 60px;
59
+ }
60
+
58
61
  .image_page .image {
59
62
  clear: both;
60
63
  float: left;
@@ -13,6 +13,11 @@ a {
13
13
  color:yellow;
14
14
  }
15
15
 
16
+ #toslides span {
17
+ margin-left: 1.2em;
18
+ padding: 0.1em;
19
+ }
20
+
16
21
  .image_page a {
17
22
  margin: 10px;
18
23
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Piggy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3.0
4
+ version: 0.5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Sascha D\xF6rdelmann"
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-04 00:00:00 +01:00
12
+ date: 2009-06-20 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -128,8 +128,12 @@ files:
128
128
  - lib/piggy.rb
129
129
  - lib/templates
130
130
  - lib/templates/fuss.htm
131
+ - lib/templates/javafx.htm
131
132
  - lib/templates/kopf.htm
132
133
  - lib/templates/navigation.htm
134
+ - lib/templates/PiggyFX.jar
135
+ - lib/templates/PiggyFX.jnlp
136
+ - lib/templates/PiggyFX_browser.jnlp
133
137
  - lib/templates/slideshow.htm
134
138
  - lib/templates/slideshow.js
135
139
  - lib/templates/styles