ig3tool 0.1.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.
Files changed (63) hide show
  1. data/bin/ig3tool +114 -0
  2. data/lib/glade/bib.glade +539 -0
  3. data/lib/glade/bibliotheek.glade +994 -0
  4. data/lib/glade/icons/cola.png +0 -0
  5. data/lib/glade/icons/emblem-money.png +0 -0
  6. data/lib/glade/icons/emblem-package.png +0 -0
  7. data/lib/glade/icons/emblem-penning.xpm +98 -0
  8. data/lib/glade/icons/emblem-people.png +0 -0
  9. data/lib/glade/icons/emblem-sales.png +0 -0
  10. data/lib/glade/icons/gdict.png +0 -0
  11. data/lib/glade/icons/members_klein.png +0 -0
  12. data/lib/glade/icons/members_xklein.png +0 -0
  13. data/lib/glade/icons/no.xpm +34 -0
  14. data/lib/glade/icons/stock_book.svg +338 -0
  15. data/lib/glade/icons/stock_book_klein.png +0 -0
  16. data/lib/glade/icons/stock_book_xklein.png +0 -0
  17. data/lib/glade/icons/stock_bookmark.svg +327 -0
  18. data/lib/glade/icons/stock_bookmark_klein.png +0 -0
  19. data/lib/glade/icons/stock_bookmark_xklein.png +0 -0
  20. data/lib/glade/icons/stock_print.png +0 -0
  21. data/lib/glade/interne.glade +228 -0
  22. data/lib/glade/loginwindow.glade +255 -0
  23. data/lib/glade/memberinfo.svg +411 -0
  24. data/lib/glade/memberinfo_klein.png +0 -0
  25. data/lib/glade/memberinfo_xklein.png +0 -0
  26. data/lib/glade/members.glade +596 -0
  27. data/lib/glade/members.svg +559 -0
  28. data/lib/glade/members_klein.png +0 -0
  29. data/lib/glade/members_xklein.png +0 -0
  30. data/lib/glade/penningtool.glade +731 -0
  31. data/lib/glade/people.glade +947 -0
  32. data/lib/glade/printen.glade +358 -0
  33. data/lib/glade/printer.png +0 -0
  34. data/lib/glade/printer_klein.png +0 -0
  35. data/lib/glade/printer_xklein.png +0 -0
  36. data/lib/glade/printerlog_klein.png +0 -0
  37. data/lib/glade/printerlog_xklein.png +0 -0
  38. data/lib/glade/printing.glade +841 -0
  39. data/lib/glade/products.glade +404 -0
  40. data/lib/glade/sales.glade +426 -0
  41. data/lib/glade/stock_book.svg +338 -0
  42. data/lib/glade/stock_book_klein.png +0 -0
  43. data/lib/glade/stock_book_xklein.png +0 -0
  44. data/lib/glade/stock_bookmark_klein.png +0 -0
  45. data/lib/glade/stock_bookmark_xklein.png +0 -0
  46. data/lib/glade/vendingmachine.glade +207 -0
  47. data/lib/lib/errors.rb +90 -0
  48. data/lib/lib/util.rb +89 -0
  49. data/lib/ui/automaatwindow.rb +107 -0
  50. data/lib/ui/bibliotheekwindow.rb +453 -0
  51. data/lib/ui/bibwindow.rb +537 -0
  52. data/lib/ui/gladehelper.rb +110 -0
  53. data/lib/ui/internewindow.rb +126 -0
  54. data/lib/ui/loginwindow.rb +60 -0
  55. data/lib/ui/memberswindow.rb +327 -0
  56. data/lib/ui/messagebox.rb +23 -0
  57. data/lib/ui/peoplewindow.rb +333 -0
  58. data/lib/ui/printenwindow.rb +329 -0
  59. data/lib/ui/printingwindow.rb +395 -0
  60. data/lib/ui/productswindow.rb +160 -0
  61. data/lib/ui/saleswindow.rb +207 -0
  62. data/lib/ui/toolwindow.rb +97 -0
  63. metadata +128 -0
@@ -0,0 +1,537 @@
1
+ begin
2
+ require "amazon/search"
3
+ $global['amazon_loaded'] = true
4
+ rescue Exception => e
5
+ STDERR.puts "Ruby/Amazon kon niet geladen worden: " + e.to_s
6
+ end
7
+
8
+ require "ui/messagebox"
9
+
10
+ module Ig3tool
11
+
12
+ class BibWindow < GladeHelper
13
+
14
+ ## - Constants ----
15
+ MENU_PATH = ["Bibliotheek", "Bibliotheek"]
16
+ ICON = "gdict.png"
17
+
18
+ ## - Class procedures ----
19
+ def initialize
20
+ super("bib.glade")
21
+
22
+ @isbn_entry = @glade.get_widget("isbn")
23
+ @title_entry = @glade.get_widget("title")
24
+ @author_entry = @glade.get_widget("author")
25
+ @publisher_entry = @glade.get_widget("publisher")
26
+ @date_entry = @glade.get_widget("year")
27
+ @section_entry = @glade.get_widget("section")
28
+ @copies_entry = @glade.get_widget("copies")
29
+
30
+ @entries = [@isbn_entry, @title_entry, @author_entry,
31
+ @publisher_entry, @date_entry, @section_entry, @copies_entry]
32
+
33
+ @loan_isbn_entry = @glade.get_widget("loan_isbn")
34
+ @loan_memberid_entry = @glade.get_widget("loan_memberid")
35
+ @loan_warranty_entry = @glade.get_widget("loan_warranty")
36
+
37
+ @loan_entries = [ @loan_isbn_entry, @loan_memberid_entry, @loan_warranty_entry ]
38
+
39
+ @notification_label = @glade.get_widget("notification_label")
40
+
41
+ # Creer een ListStore voor de Treeview van de Boeken
42
+ @books_view = @glade.get_widget("booklist")
43
+ # ListStore (Single selection) - Naam, Auteur, Section, ISBN, Date, Copies (ISBN is _GEEN_ integer!)
44
+ @books_store = Gtk::ListStore.new(String, String, String)
45
+ renderer = Gtk::CellRendererText.new
46
+ @books_view.append_column Gtk::TreeViewColumn.new("Sectie",renderer,:text => 0)
47
+ @books_view.append_column Gtk::TreeViewColumn.new("Auteur",renderer,:text => 1)
48
+ @books_view.append_column Gtk::TreeViewColumn.new("Isbn",renderer,:text => 2)
49
+ @books_view.model = @books_store
50
+
51
+ # Creer een ListStore voor de Treeview van de Loans
52
+ @books_loan_view = @glade.get_widget("loan_booklist")
53
+ # ListStore (Single selection) - Memberusername, Naam, Auteur, ISBN, Memberid, Loandate, Returndate, Warranty (ISBN is _GEEN_ integer!)
54
+ @books_loan_store = Gtk::ListStore.new(String, String, String, String, String, String, String, String)
55
+ renderer = Gtk::CellRendererText.new
56
+ @books_loan_view.append_column Gtk::TreeViewColumn.new("Username",renderer,:text => 0)
57
+ @books_loan_view.append_column Gtk::TreeViewColumn.new("Naam",renderer,:text => 1)
58
+ @books_loan_view.append_column Gtk::TreeViewColumn.new("Auteur",renderer,:text => 2)
59
+ @books_loan_view.append_column Gtk::TreeViewColumn.new("ISBN",renderer,:text => 3)
60
+ @books_loan_view.append_column Gtk::TreeViewColumn.new("Memberid",renderer,:text => 4)
61
+ @books_loan_view.append_column Gtk::TreeViewColumn.new("Leen",renderer,:text => 5)
62
+ @books_loan_view.append_column Gtk::TreeViewColumn.new("Terug",renderer,:text => 6)
63
+ @books_loan_view.append_column Gtk::TreeViewColumn.new("Waarborg",renderer,:text => 7)
64
+ @books_loan_view.model = @books_loan_store
65
+
66
+ _create_books_rightclick_menu # Instantieer een rightclick menu voor de book list
67
+ _create_loan_books_rightclick_menu # Instantieer een rightclick menu voor de loan book list
68
+
69
+ Thread.new do
70
+ r = @books_store.append
71
+ r[0] = "LL"
72
+ r[1] = "Loading..."
73
+ r[2] = ""
74
+
75
+ _fill_booklist # Vul de boekenlijst
76
+ _fill_loan_booklist # Toon alle uitgeleende boeken
77
+ end
78
+
79
+ @window.show_all
80
+ end
81
+
82
+ ## - Handlers (GUI) ----
83
+ def isbn_activate_cb
84
+ @isbn_entry.text = @isbn_entry.text.strip
85
+ isbn = @isbn_entry.text
86
+ @loan_isbn_entry.text = isbn
87
+ if isbn.nil? or isbn.empty?
88
+ return
89
+ elsif _isbn?(false,isbn) # Returnt nil/isbn
90
+ begin
91
+ answer = _lookup_database_isbn(isbn) # Controleer eerst in de Ig3tool DB
92
+ if answer # Indien niet nil -> Hash van het object uit de server
93
+ _fill_in_book(answer)
94
+ else
95
+ _lookup_amazon_isbn(isbn) # Lookup op amazon
96
+ end
97
+ rescue Exception => e
98
+ _print_msg "Fout: Isbn activate: #{$!}"
99
+ end
100
+ else
101
+ puts "Dit is geen geldig ISBN"
102
+ @notification_label.text = "Dit is geen geldig ISBN"
103
+ end
104
+ return
105
+ end
106
+
107
+ def entry_activate
108
+ lookup_clicked_cb
109
+
110
+ # Controleer elk veld op empty?
111
+ # Handig voor de focus van het lege veld
112
+ @entries.each do |entry|
113
+ entry.text = entry.text.strip
114
+ if entry.text.empty? and entry.name != "copies"
115
+ entry.grab_focus
116
+ return
117
+ end
118
+ end
119
+ end
120
+
121
+ def entry_changed
122
+ _clear_notifictions
123
+ end
124
+
125
+ def booklist_row_activated_cb # Boek geselecteerd in de lijst
126
+ @isbn_entry.text = @books_view.selection.selected[2]
127
+ @isbn_entry.activate
128
+ end
129
+
130
+ def booklist_button_release_event_cb(widget, event) # Indien geklikt op de lijst
131
+ if event.kind_of? Gdk::EventButton and event.button == 3 # Indien Rechtermuisknop
132
+ @books_view_menu.popup(nil, nil, event.button, event.time) if @books_view.selection.selected # Indien de selectie niet leeg is
133
+ end
134
+ end
135
+
136
+ def clear_clicked_cb
137
+ @entries.each do |entry|
138
+ entry.text = ""
139
+ end
140
+ @loan_entries.each do |entry|
141
+ entry.text = ""
142
+ end
143
+ @copies_entry.text = "1"
144
+ @loan_warranty_entry.text = "5"
145
+ _clear_notifictions
146
+ @isbn_entry.activate
147
+ end
148
+
149
+ def lookup_clicked_cb # Zoek een boek adhv de entries
150
+ attrs = _get_book
151
+ attrs.each do |k, v|
152
+ attrs.delete k if v.nil? or v.empty?
153
+ end
154
+
155
+ if attrs.empty?
156
+ _fill_booklist
157
+ else
158
+ begin
159
+ books = $global["client"].bib_lookup attrs
160
+ _set_booklist(books)
161
+ rescue Exception => e
162
+ _print_msg "Fout: Lookup Clicked: #{$!}"
163
+ end
164
+ end
165
+ end
166
+
167
+ def save_clicked_cb # Boek toevoegen
168
+ if @isbn_entry.text.empty? or @title_entry.text.empty? or @author_entry.text.empty? or @publisher_entry.text.empty? or @section_entry.text.empty?
169
+ _print_msg "Fout: Het ISBN, de titel, de auteur, de uitgever en het sectie moeten ingevuld zijn"
170
+ return
171
+ end
172
+
173
+ if !_isbn?(false,@isbn_entry.text)
174
+ _print_msg "Fout: Dit is geen geldig ISBN nummer!"
175
+ return
176
+ end
177
+
178
+ # Controleer eerst of de boek al in de database zit adhv isbn
179
+ # Indien ja, geef een messagebox: Overschrijven/Cancel
180
+ answer = _lookup_database_isbn(@isbn_entry.text)
181
+
182
+ # Indien het boek bestaat
183
+ if answer
184
+ # Indien de user op Nee geklikt heeft, return (stopt het toevoegen)
185
+ return unless Ig3tool::messagebox("Boek toevoegen","Dit isbn nummer zit al in de database, wil je de informatie overschrijven?")
186
+ end
187
+
188
+ begin
189
+ answer = $global['client'].bib_add! _get_book
190
+ rescue Exception => e
191
+ _print_msg "Fout: Toevoegen: #{$!}"
192
+ else
193
+ _print_msg "Het boek is toegevoegd.", answer
194
+ _fill_booklist
195
+ end
196
+
197
+ end
198
+
199
+ def delete_clicked_cb # Verwijder een boek
200
+ _delete_book @isbn_entry.text
201
+ end
202
+
203
+ def loan_isbn_activate_cb
204
+ @isbn_entry.text = @loan_isbn_entry.text
205
+ @isbn_entry.activate
206
+ end
207
+
208
+ # Na ingeven memberid, zoek de geleende boeken op
209
+ def loan_memberid_activate_cb
210
+ memberid = @loan_memberid_entry.text = @loan_memberid_entry.text.strip
211
+ _fill_loan_booklist(memberid)
212
+ end
213
+
214
+ # Uitlenen
215
+ def loan_clicked_cb
216
+ if @loan_isbn_entry.text.empty? or @loan_memberid_entry.text.empty? or @loan_warranty_entry.text.empty?
217
+ _print_msg "Het ISBN, de memberid en de waarborg zijn verplichte velden!"
218
+ return
219
+ end
220
+
221
+ begin
222
+ answer = $global['client'].bib_loan!({:isbn => @loan_isbn_entry.text,
223
+ :member => @loan_memberid_entry.text,
224
+ :warranty => @loan_warranty_entry.text })
225
+ rescue Exception => e
226
+ _print_msg "Fout: Uitlenen: #{$!}", "#{@loan_isbn_entry.text},#{@loan_memberid_entry.text},#{@loan_warranty_entry.text}"
227
+ else
228
+ clear_clicked_cb
229
+ _fill_loan_booklist
230
+ _print_msg "Het boek werd uitgeleend", answer
231
+ end
232
+ end
233
+
234
+ # Verlengen
235
+ def extend_clicked_cb
236
+ if @loan_isbn_entry.text.empty? or @loan_memberid_entry.text.empty?
237
+ _print_msg "Het ISBN en memberid zijn verplichte velden!"
238
+ return
239
+ end
240
+ _loan_verlengen(@loan_isbn_entry.text, @loan_memberid_entry.text)
241
+ _fill_loan_booklist
242
+ end
243
+
244
+ # Terugbrengen
245
+ def return_clicked_cb
246
+ if @loan_isbn_entry.text.empty? or @loan_memberid_entry.text.empty?
247
+ _print_msg "Het ISBN en memberid zijn verplichte velden!"
248
+ return
249
+ end
250
+ _loan_terugbrengen(@loan_isbn_entry.text, @loan_memberid_entry.text)
251
+ _fill_loan_booklist
252
+ end
253
+
254
+ # Refresh lists
255
+ def refresh_activate_cb
256
+ clear_clicked_cb
257
+ _fill_booklist
258
+ _fill_loan_booklist
259
+ end
260
+
261
+ # Book Loan list rij activated
262
+ def loan_booklist_row_activated_cb # Boek geselecteerd in de lijst
263
+ @loan_isbn_entry.text = @books_loan_view.selection.selected[3]
264
+ @loan_memberid_entry.text = @books_loan_view.selection.selected[4]
265
+ @loan_isbn_entry.activate
266
+ end
267
+
268
+ # Rightclick op de loan booklist
269
+ def loan_booklist_button_release_event_cb(widget, event) # Indien geklikt op de lijsta
270
+ if event.kind_of? Gdk::EventButton and event.button == 3 # Indien Rechtermuisknop
271
+ @books_loan_view_menu.popup(nil, nil, event.button, event.time) if @books_loan_view.selection.selected # Indien de selectie niet leeg is
272
+ end
273
+ end
274
+
275
+
276
+ # --------------
277
+ # Prive functies
278
+ private
279
+ def _isbn? (strong_check,code)
280
+ if !strong_check and code =~ /^XXX/ # Indien zelfgemaakte barcode
281
+ return code
282
+ # indien oude isbn (10 cijfers)
283
+ elsif code.length == 10
284
+ code = code.gsub(/[^0-9Xx]+/, '').tr('x', 'X')
285
+ sum = 0
286
+ 9.times {|i| sum += code[i].chr.to_i * (10 - i) }
287
+ sum += if code =~ /X$/ then 10 else code[9].chr.to_i end
288
+ if sum % 11 == 0
289
+ return code
290
+ end
291
+ # indien nieuwe isbn (13 cijfers - 2007)
292
+ elsif code.length == 13
293
+ sum = 0
294
+ multiply = 1
295
+ 0.upto(11){|i|
296
+ sum += code[i].chr.to_i * multiply
297
+ if multiply == 1 then multiply = 3 else multiply = 1 end
298
+ }
299
+ if ((10 - (sum % 10)) == code[12].chr.to_i)
300
+ return code
301
+ end
302
+ end
303
+ end
304
+
305
+ def _lookup_amazon_isbn (isbn)
306
+ return false unless $global['amazon_loaded'] # Indien de amazon gem niet geladen is, return
307
+ return false unless _isbn?(true,isbn) # Indien strenge test faalt
308
+
309
+ if isbn.length == 13 # indien in de nieuwe vorm, maak er een oude van
310
+ isbn = isbn[3..11]
311
+ sum = 0
312
+ 9.times {|i| sum += isbn[i].chr.to_i * (10 - i) }
313
+ controlecijfer = 11 - (sum % 11)
314
+ if controlecijfer != 10
315
+ isbn = isbn + controlecijfer.to_s
316
+ else
317
+ isbn = isbn + "X"
318
+ end
319
+ end
320
+
321
+ # You need a amazon-dev-token in client.rb
322
+ token = CONFIG['amazon-dev-token']
323
+ return unless $global['amazon_loaded'] and token.instance_of?(String) and not token.empty?
324
+
325
+ begin
326
+ req = Amazon::Search::Request.new(CONFIG["amazon-dev-token"],CONFIG["amazon-associates-id"])
327
+ res = req.asin_search(isbn)
328
+ prod = res.products
329
+ return if prod.length == 0
330
+ book = prod[0]
331
+
332
+ @title_entry.text = book['product_name'].to_s.strip
333
+ @author_entry.text = book['authors'].join(', ').strip if !book['authors'] and book['authors'].class == "Array" # opgelet, niets wegdoen!
334
+ @publisher_entry.text = book['manufacturer'].to_s.strip
335
+ @date_entry.text = book['release_date'].to_s.strip
336
+ rescue Exception => e
337
+ _print_msg "Fout: Lookup Amazon: #{$!}", "ISBN: #{isbn}"
338
+ end
339
+ end
340
+
341
+ def _lookup_database_isbn(isbn)
342
+ begin
343
+ answer = $global['client'].bib_books( [ isbn ] )
344
+ rescue Exception => e
345
+ _print_msg "Fout: Lookup: #{$!}", "ISBN: #{isbn}"
346
+ nil
347
+ else
348
+ answer
349
+ end
350
+ end
351
+
352
+ def _create_books_rightclick_menu
353
+ # Creeer een menu
354
+ @books_view_menu = Gtk::Menu.new
355
+ books_view_menu_edit_item = Gtk::MenuItem.new("Edit")
356
+ books_view_menu_delete_item = Gtk::MenuItem.new("Delete")
357
+ books_view_menu_edit_item.signal_connect("activate") {
358
+ # Show selected Book
359
+ # Treeview heeft default Mode Gtk::SELECTION_SINGLE
360
+ puts @books_view.selection.selected[2]
361
+ @isbn_entry.text = @books_view.selection.selected[2]
362
+ @isbn_entry.activate
363
+ }
364
+
365
+ # Delete het geselecteerde boek
366
+ books_view_menu_delete_item.signal_connect("activate") {
367
+ _books_view_delete_selected
368
+ }
369
+
370
+ @books_view_menu.append(books_view_menu_edit_item)
371
+ @books_view_menu.append(books_view_menu_delete_item)
372
+ @books_view_menu.show_all
373
+ end
374
+
375
+ def _create_loan_books_rightclick_menu
376
+ # Creeer een menu
377
+ @books_loan_view_menu = Gtk::Menu.new
378
+ books_loan_view_menu_verlengen_item = Gtk::MenuItem.new("Verlengen")
379
+ books_loan_view_menu_terugbrengen_item = Gtk::MenuItem.new("Terugbrengen")
380
+ # Verlengen
381
+ books_loan_view_menu_verlengen_item.signal_connect("activate") {
382
+ # Treeview heeft default Mode Gtk::SELECTION_SINGLE
383
+ _loan_verlengen(@books_loan_view.selection.selected[3], @books_loan_view.selection.selected[4])
384
+ }
385
+ # Terugbrengen
386
+ books_loan_view_menu_terugbrengen_item.signal_connect("activate") {
387
+ _loan_terugbrengen(@books_loan_view.selection.selected[3], @books_loan_view.selection.selected[4])
388
+ }
389
+
390
+ @books_loan_view_menu.append(books_loan_view_menu_verlengen_item)
391
+ @books_loan_view_menu.append(books_loan_view_menu_terugbrengen_item)
392
+ @books_loan_view_menu.show_all
393
+ end
394
+
395
+ def _clear_notifictions
396
+ @notification_label.text = ""
397
+ end
398
+
399
+ # Verwijder de huidig geselecteerde Persoon (Via rightclick)
400
+ def _books_view_delete_selected
401
+ # Treeview heeft default Mode Gtk::SELECTION_SINGLE
402
+ if iter = @books_view.selection.selected
403
+ _delete_book(iter[0][2])
404
+ end
405
+ end
406
+
407
+ # Vul de entries in (GUI)
408
+ def _fill_in_book (book)
409
+ return unless book
410
+ @title_entry.text = book.title
411
+ @author_entry.text = book.author
412
+ @publisher_entry.text = book.publisher
413
+ @date_entry.text = book.year
414
+ @section_entry.text = book.section
415
+ @copies_entry.text = book.copies
416
+ end
417
+
418
+ def _get_book
419
+ Hash.zipnew(@entries.collect { |x| x.name }, @entries.collect { |x| x.text.strip })
420
+ end
421
+
422
+ def _fill_booklist
423
+ # TODO - kleur de boeken in een speciaal kleur indien uitgeleend
424
+ # pas op voor het # copies tov # x uitgeleend!
425
+
426
+ # Haal de boeken op van de server
427
+ begin
428
+ answer = $global['client'].bib_books
429
+ _set_booklist(answer)
430
+ rescue Exception => e
431
+ _print_msg "Fout: Fill-Booklist: #{$!}"
432
+ end
433
+ end
434
+
435
+ def _set_booklist(books = [], clear = true)
436
+ @books_store.clear if clear
437
+
438
+ @books_view.model = nil # Performance issues
439
+ for book in books
440
+ # ListStore (Single selection) - Naam, Auteur, Section, ISBN, Date, Copies (ISBN is _GEEN_ integer!)
441
+ iter = @books_store.append
442
+ iter[0] = book.section[0..4]
443
+ iter[1] = book.title
444
+ iter[2] = book.isbn
445
+ end
446
+ @books_view.model = @books_store # Performance issues
447
+ end
448
+
449
+ def _fill_loan_booklist(memberid = nil)
450
+
451
+ # TODO kleur de mensen in het rood die te laat zijn met hun terugbrengen
452
+
453
+ @books_loan_store.clear
454
+ answer = nil
455
+ # Haal de uitgeleende boeken op van de server
456
+ begin
457
+ if memberid
458
+ answer = $global['client'].bib_loans( [ memberid ] ) # Indien een memberid geselecteerd
459
+ else
460
+ answer = $global['client'].bib_loans # Alle loans weergeven indien niet
461
+ end
462
+ rescue Exception => e
463
+ _print_msg "Fout: Fill-Loan-Booklist: #{$!}", "Memberid: #{memberid}"
464
+ else
465
+ return if answer.nil?
466
+
467
+ # Answer is een BookLoan
468
+ @books_loan_view.model = nil # Performance issues
469
+ for bookloan in answer
470
+ book = $global['client'].bib_info( [bookloan.isbn] ) # Haal de info op over het boek
471
+ person = $global['client'].person_member( [bookloan.member_id] ) # Haal de persoon op
472
+ if person.nil? or book.nil?
473
+ _print_msg "Fout: Fill-Loan-Booklist: #{$!}", "BookLoan: #{bookloan}, Book: #{book}, Person: #{person}"
474
+ return
475
+ end
476
+ # ListStore (Single selection) - Memberusername, Naam, Auteur, ISBN, Memberid, Loandate, Returndate, Warranty (ISBN is _GEEN_ integer!)
477
+ iter = @books_loan_store.append
478
+ iter[0] = person.username
479
+ iter[1] = book.title[0..30]
480
+ iter[2] = book.author[0..10]
481
+ iter[3] = book.isbn
482
+ iter[4] = bookloan.member_id
483
+ iter[5] = bookloan.loan_date
484
+ iter[6] = bookloan.return_date
485
+ iter[7] = bookloan.warranty
486
+ end
487
+ @books_loan_view.model = @books_loan_store
488
+ end
489
+
490
+ end
491
+
492
+ def _delete_book(isbn)
493
+ return unless isbn.nil?
494
+ begin
495
+ answer = $global['client'].bib_remove!( { :isbn => @isbn } )
496
+ rescue Exception => e
497
+ _print_msg "Fout: Verwijderen: #{$!}"
498
+ else
499
+ _print_msg "Het boek werd verwijderd", answer
500
+ _fill_booklist
501
+ _fill_loan_booklist
502
+ end
503
+ end
504
+
505
+ def _loan_verlengen(isbn, memberid)
506
+ begin
507
+ answer = $global['client'].bib_extend!({ :isbn => isbn,
508
+ :member => memberid })
509
+ returndate = Time.at(answer.return_date).to_s
510
+ rescue Exception => e
511
+ _print_msg "Fout: Verlengen: #{$!}", "#{isbn}, #{memberid}"
512
+ else
513
+ _print_msg "De uitleentermijn van het boek werd verlengd tot #{returndate}.", answer
514
+ end
515
+ end
516
+
517
+ def _loan_terugbrengen(isbn, memberid)
518
+ begin
519
+ answer = $global['client'].bib_return!( { :isbn => isbn,
520
+ :member => memberid })
521
+ rescue Exception => e
522
+ _print_msg "Fout: Return: #{$!}", "#{isbn},#{memberid}"
523
+ else
524
+ _print_msg "Het boek werd teruggebracht.", answer
525
+ end
526
+ end
527
+
528
+ def _print_msg (msg, extra_info = nil)
529
+ puts msg
530
+ puts " - #{extra_info}" if extra_info
531
+ @notification_label.text = msg
532
+ end
533
+ end
534
+
535
+ register_window(BibWindow)
536
+
537
+ end
@@ -0,0 +1,110 @@
1
+ require 'pathname'
2
+
3
+ module Ig3tool
4
+
5
+ class GladeHelper
6
+ GLADE_DIR = Pathname.new(__FILE__).parent.parent + "glade"
7
+
8
+ def initialize (gladefile, toplevel = "window")
9
+ filename = GLADE_DIR + gladefile
10
+ @glade = GladeXML.new(filename.to_s, toplevel) {|h| method(h) }
11
+ @window = @glade.get_widget(toplevel)
12
+ @window.title += " - Ig3tool"
13
+ @window.move(169,0) # Zet het naast het toolwindow
14
+ @window.signal_connect("delete-event") do
15
+ @window.hide
16
+ true
17
+ end
18
+ end
19
+
20
+ def show
21
+ @window.show
22
+ end
23
+
24
+ def present
25
+ @window.present
26
+ end
27
+
28
+ def _get_widget(widget)
29
+ @glade.get_widget(widget)
30
+ end
31
+
32
+ # Debugger combobox invullen
33
+ def make_debugger_combo (combo, window = nil)
34
+ debuggers = $global["client"].person_debuggers
35
+ debuggers.sort! {|a,b| a.username <=> b.username }
36
+
37
+ debugger_model = Gtk::ListStore.new(Object, String)
38
+ debuggers.each do |d|
39
+ row = debugger_model.append
40
+ row[0] = d
41
+ row[1] = d.username
42
+ end
43
+
44
+ combo.model = debugger_model
45
+ combo.active = 0
46
+ combo.clear
47
+ renderer = Gtk::CellRendererText.new
48
+ combo.pack_start(renderer, true)
49
+ combo.set_attributes(renderer, :text => 1)
50
+
51
+ # Indien het window gekleurd moet worden adhv zijn 'interne' status
52
+ add_window_colorer(combo, window) if window
53
+ end
54
+
55
+ # Status combobox invullen
56
+ def make_status_combo (combo,statussen = nil)
57
+ begin
58
+ statussen = $global["client"].person_statussen unless statussen
59
+ statussen_model = Gtk::ListStore.new(Object, String)
60
+ statussen.each do |key, value|
61
+ row = statussen_model.append
62
+ row[0] = key
63
+ row[1] = value
64
+ end
65
+ combo.model = statussen_model
66
+ combo.active = 0
67
+ combo.clear
68
+ renderer = Gtk::CellRendererText.new
69
+ combo.pack_start(renderer, true)
70
+ combo.set_attributes(renderer, :text => 1)
71
+ rescue Exception => e
72
+ puts "Fout: Make_status_combo: #{$!}"
73
+ end
74
+ end
75
+
76
+ def add_window_colorer(combo, window)
77
+ combo.signal_connect("changed") do
78
+ if combo.active_iter
79
+ debugger = combo.active_iter[1]
80
+ saldo = $global["client"].interne(debugger)
81
+ else
82
+ saldo = 0
83
+ end
84
+ if saldo < 0
85
+ shade = [65535, 0, 0]
86
+ ratio = (saldo < -7500) ? 1 : Rational(saldo,(-75 * 100)) # In cent + Need rational!
87
+ else
88
+ shade = [0, 65535, 0]
89
+ ratio = (saldo > 20000) ? 1 : Rational(saldo,(200 * 100))
90
+ end
91
+ ratio1 = 1 - ratio
92
+ base = Gtk::Widget.default_style.bg(Gtk::STATE_NORMAL)
93
+ window.modify_bg(Gtk::STATE_NORMAL,
94
+ Gdk::Color.new(
95
+ (base.red * ratio1 + shade[0] * ratio).to_i,
96
+ (base.green * ratio1 + shade[1] * ratio).to_i,
97
+ (base.blue * ratio1 + shade[2] * ratio).to_i))
98
+ end
99
+ end
100
+
101
+ def make_eval_widget(widget)
102
+ widget.signal_connect "focus-out-event" do
103
+ Ig3tool::number_eval_widget widget
104
+ false
105
+ end
106
+ end
107
+
108
+ end
109
+
110
+ end