PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/main_window.rb

https://bitbucket.org/magesh/mycash
Ruby | 369 lines | 286 code | 45 blank | 38 comment | 7 complexity | bdcce2a66a241a4188c8baedffd10f53 MD5 | raw file
  1. # This program is free software: you can redistribute it and/or modify
  2. # it under the terms of the GNU General Public License as published by
  3. # the Free Software Foundation, version 3 of the License.
  4. #
  5. # This program is distributed in the hope that it will be useful,
  6. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  7. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  8. # GNU General Public License for more details.
  9. #
  10. # You should have received a copy of the GNU General Public License
  11. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  12. #
  13. # Copyright: (C) 2004-2010 Rafal Kotusiewicz aka 'jjhop'. All rights reserved.
  14. #
  15. # http://bitbucket.org/jjhop/mycash/overview/
  16. # http://bitbucket.org/jjhop/mycash/wiki/Home
  17. #
  18. require 'rubygems'
  19. require "fox16"
  20. require File.join(File.dirname(__FILE__), 'suspence_dialog')
  21. require File.join(File.dirname(__FILE__), 'account_dialog')
  22. require File.join(File.dirname(__FILE__), 'database_dialog')
  23. require File.join(File.dirname(__FILE__), 'about_dialog')
  24. require File.join(File.dirname(__FILE__), 'help_dialog')
  25. include Fox
  26. class MainWindow < FXMainWindow
  27. def initialize(app)
  28. # Najpierw inicjalizacja potrzebnych zmiennych...
  29. @selected_lang = FXDataTarget.new(1)
  30. @current_tab = FXDataTarget.new(1)
  31. @show_statusbar = FXDataTarget.new(true)
  32. @show_mainbar = FXDataTarget.new(true)
  33. @show_searchbar = FXDataTarget.new(true)
  34. @current_database = nil
  35. # Teraz budujemy okno, kontrolki itd
  36. super(app, "myCash 0.1", nil, nil, DECOR_ALL, 0, 0, 800, 600)
  37. FXPNGIcon.new(getApp(), File.open(File.join(File.dirname(__FILE__), './ico/16/money_bag.png'),"rb").read) do |ico|
  38. self.icon = ico
  39. self.miniIcon = ico
  40. end
  41. FXToolTip.new(getApp())
  42. # Menu bar
  43. dragshell1 = FXToolBarShell.new(self, 0)
  44. menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP | LAYOUT_FILL_X | FRAME_RAISED)
  45. # Tool bar
  46. #dragshell2 = FXToolBarShell.new(self, 0)
  47. #toolbar = FXToolBar.new(self, dragshell2, (LAYOUT_SIDE_TOP|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT|FRAME_RAISED|LAYOUT_FILL_X))
  48. #FXToolBarGrip.new(toolbar, toolbar, FXToolBar::ID_TOOLBARGRIP, TOOLBARGRIP_DOUBLE)
  49. # Status bar
  50. @status_bar = FXStatusBar.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER)
  51. FXHorizontalSeparator.new(self, LAYOUT_SIDE_TOP, LAYOUT_FILL_X, SEPARATOR_GROOVE)
  52. FXVerticalFrame.new(self, LAYOUT_SIDE_TOP|FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y) do |contents|
  53. FXSplitter.new(contents, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|SPLITTER_TRACKING|SPLITTER_HORIZONTAL) do |splitter|
  54. FXGroupBox.new(splitter, "Okresy", LAYOUT_FILL_Y|FRAME_GROOVE, 0, 0, 210) do |groupbox|
  55. FXHorizontalFrame.new(groupbox, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0, 0, 0, 0, 0, 0, 0, 0) do |frame|
  56. opts = LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_RIGHT|TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|TREELIST_ROOT_BOXES|TREELIST_EXTENDEDSELECT;
  57. FXTreeList.new(frame, nil, 0, opts) do |tree|
  58. m1 = tree.appendItem(nil, "2003", nil, nil)
  59. tree.appendItem(m1, "Listopad", nil, nil)
  60. tree.appendItem(m1, "Grudzien", nil, nil)
  61. tree.expandTree(m1)
  62. m2 = tree.appendItem(nil, "2004", nil, nil)
  63. tree.appendItem(m2, "Styczen", nil, nil)
  64. tree.appendItem(m2, "Luty", nil, nil)
  65. tree.appendItem(m2, "Marzec", nil, nil).select()
  66. tree.appendItem(m2, "Kwiecien", nil, nil)
  67. tree.appendItem(m2, "Maj", nil, nil)
  68. tree.appendItem(m2, "Czerwiec", nil, nil)
  69. tree.appendItem(m2, "Lipiec", nil, nil)
  70. tree.appendItem(m2, "Sierpien", nil, nil)
  71. tree.appendItem(m2, "Wrzesien", nil, nil)
  72. tree.appendItem(m2, "Pazdziernik", nil, nil)
  73. tree.appendItem(m2, "Listopad", nil, nil)
  74. tree.appendItem(m2, "Grudzien", nil, nil)
  75. tree.expandTree(m2)
  76. end
  77. end
  78. end
  79. @tabs = FXTabBook.new(splitter, nil, 0, LAYOUT_FILL_Y|LAYOUT_RIGHT) do |tabBook|
  80. FXTabItem.new(tabBook, "Wydatki [Ctrl-F1]")
  81. FXHorizontalFrame.new(tabBook, FRAME_THICK|FRAME_RAISED) do |page|
  82. FXHorizontalFrame.new(page, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL, 0,0,0,0, 0,0,0,0) do |frame|
  83. FXTable.new(frame, nil, 0, TABLE_COL_SIZABLE|TABLE_NO_COLSELECT|LAYOUT_FILL) do |t|
  84. # table setup
  85. t.setTableSize(0, 6)
  86. t.rowHeaderMode = LAYOUT_FIX_WIDTH
  87. t.rowHeaderWidth = 0
  88. t.editable = false
  89. t.setColumnText( 0, "Lp.")
  90. t.setColumnWidth(0, 25)
  91. t.setColumnText(1, "Data pomiaru")
  92. t.setColumnWidth(1, 100)
  93. t.setColumnJustify(1, FXHeaderItem::RIGHT)
  94. t.setColumnText(2, "Waga")
  95. t.setColumnWidth(2, 100)
  96. t.setColumnJustify(2, FXHeaderItem::RIGHT)
  97. t.setColumnText(3, "Tluszcz")
  98. t.setColumnWidth(3, 100)
  99. t.setColumnJustify(3, FXHeaderItem::RIGHT)
  100. t.setColumnText(4, "Woda")
  101. t.setColumnWidth(4, 100)
  102. t.setColumnJustify(4, FXHeaderItem::RIGHT)
  103. t.setColumnText(5, "Notatki")
  104. t.setColumnJustify(5, FXHeaderItem::LEFT)
  105. # teraz jakieœ lipne dane
  106. 50.times do |idx|
  107. t.insertRows(t.numRows, 1, true)
  108. t.setItemText(idx, 0, "#{idx+1}");
  109. t.setItemText(idx, 1, "#{Time.new.strftime("%d-%m-%Y %H:%M")}");
  110. t.setItemText(idx, 2, "#{format("%.2f", 130 - rand)}kg");
  111. t.setItemText(idx, 3, "17%");
  112. t.setItemText(idx, 4, "26%");
  113. t.setItemText(idx, 5, "---");
  114. end
  115. end
  116. end
  117. end
  118. FXTabItem.new(tabBook, "Zastawienia [Ctrl-F2]")
  119. FXHorizontalFrame.new(tabBook, FRAME_THICK|FRAME_RAISED) do |page|
  120. FXHorizontalFrame.new(page, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y)
  121. end
  122. FXTabItem.new(tabBook, "Przychody [Ctrl-F3]")
  123. FXHorizontalFrame.new(tabBook, FRAME_THICK|FRAME_RAISED) do |page|
  124. FXHorizontalFrame.new(page, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y)
  125. end
  126. FXTabItem.new(tabBook, "Stan kont [Ctrl-F4]")
  127. FXHorizontalFrame.new(tabBook, FRAME_THICK|FRAME_RAISED) do |page|
  128. FXHorizontalFrame.new(page, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y)
  129. end
  130. tabBook.setCurrent(0)
  131. end
  132. end
  133. end
  134. filemenu = FXMenuPane.new(self) do |menu|
  135. FXGIFIcon.new(getApp(), File.open(File.join(File.dirname(__FILE__), './ico/16/book_add.gif'),"rb").read) do |ico|
  136. FXMenuCommand.new(menu, "Nowa baza...\tAlt-Shift-N\tNowa baza...", ico) do |c|
  137. c.connect(SEL_COMMAND, method(:not_yet_implemented))
  138. end
  139. end
  140. FXGIFIcon.new(getApp(), File.open(File.join(File.dirname(__FILE__), './ico/16/book.gif'),"rb").read) do |ico|
  141. FXMenuCommand.new(menu, "Otworz baze...\tAlt-Shift-O\tOtwiera baze...", ico) do |c|
  142. c.connect(SEL_COMMAND, method(:cmd_show_open_database))
  143. end
  144. end
  145. FXGIFIcon.new(getApp(), File.open(File.join(File.dirname(__FILE__), './ico/16/book_close.gif'),"rb").read) do |ico|
  146. @dbclose_cmd = FXMenuCommand.new(menu, "Zamknij baze\tAlt-Shift-W\tZamyka baze", ico) do |c|
  147. c.connect(SEL_COMMAND, method(:cmd_close_database))
  148. c.disable
  149. end
  150. end
  151. FXMenuSeparator.new(menu)
  152. @suspence_new_cmd = FXMenuCommand.new(menu, "Nowy wydatek...\tCtrl-N\tNowy wydatek", nil) do |cmd|
  153. cmd.connect(SEL_COMMAND, method(:cmd_show_new_suspence))
  154. cmd.disable
  155. end
  156. @suspence_search_cmd = FXMenuCommand.new(menu, "Szukaj wydatku...\t\tSzukaj...", nil) do |cmd|
  157. cmd.connect(SEL_COMMAND, method(:not_yet_implemented))
  158. cmd.disable
  159. end
  160. FXMenuSeparator.new(menu)
  161. @income_new_cmd = FXMenuCommand.new(menu, "Nowy przychod..\tCtrl-Shift-N\tNowy przychod", nil) do |cmd|
  162. cmd.connect(SEL_COMMAND, method(:not_yet_implemented))
  163. cmd.disable
  164. end
  165. @income_search_cmd = FXMenuCommand.new(menu, "Wyszukaj przychod..\t\tWyszukaj przychod", nil) do |cmd|
  166. cmd.connect(SEL_COMMAND, method(:not_yet_implemented))
  167. cmd.disable
  168. end
  169. FXMenuSeparator.new(menu)
  170. @account_management_cmd = FXMenuCommand.new(menu, "Zarzadzanie kontami...\t\tOtwiera okno dialogowe zarzadzania kontami", nil) do |cmd|
  171. cmd.connect(SEL_COMMAND, method(:cmd_show_account_controller_dialog))
  172. cmd.disable
  173. end
  174. FXMenuSeparator.new(menu)
  175. FXMenuCommand.new(menu, "Wyjscie\tCtrl-W\t\tZamykam program", nil).connect(SEL_COMMAND, method(:cmd_quit))
  176. end
  177. editmenu = FXMenuPane.new(self) do |menu|
  178. FXMenuCommand.new(menu, "Wytnij\tCtrl-X\tCut selection to clipboard", nil, getApp())
  179. FXMenuCommand.new(menu, "Kopiuj\tCtl-C\tCopy selection to clipboard.", nil, getApp())
  180. FXMenuCommand.new(menu, "Wklej\tCtl-V\tPaste from clipboard.", nil, getApp())
  181. FXMenuCommand.new(menu, "Usun\tCtl-D\tDelete selection.", nil, getApp())
  182. FXMenuSeparator.new(menu)
  183. FXMenuCommand.new(menu, "Szukaj...\tCtl-F\tWyszukaj.", nil, getApp())
  184. FXMenuCommand.new(menu, "Nastepny\tF3\tSzukaj dalej.", nil, getApp())
  185. FXMenuCommand.new(menu, "Poprzedni\tShift-F3\tSzukaj wczesniej.", nil, getApp())
  186. FXMenuSeparator.new(menu)
  187. FXMenuCommand.new(menu, "Preferencje...\t\t", nil).connect(SEL_COMMAND, method(:not_yet_implemented))
  188. end
  189. viewmenu = FXMenuPane.new(self) do |menu|
  190. FXMenuRadio.new(menu, "Wydatki\tCtrl-F1", @tabs, FXTabBar::ID_OPEN_FIRST + 0)
  191. FXMenuRadio.new(menu, "Zestawienia\tCtrl-F2", @tabs, FXTabBar::ID_OPEN_FIRST + 1)
  192. FXMenuRadio.new(menu, "Przychody\tCtrl-F3", @tabs, FXTabBar::ID_OPEN_FIRST + 2)
  193. FXMenuRadio.new(menu, "Stan kont\tCtrl-F4", @tabs, FXTabBar::ID_OPEN_FIRST + 3)
  194. #FXMenuCommand.new(filemenu, "&Simple List", nil, @tabbook, FXTabBar::ID_OPEN_FIRST+0)
  195. FXMenuSeparator.new(menu)
  196. FXMenuCheck.new(menu, "Pasek stanu\tCtrl-Alt-Shift-S\tPokaz/ukryj pasek stanu", @show_statusbar) do |btn|
  197. btn.check = true
  198. btn.connect(SEL_COMMAND) do
  199. @status_bar.shown? ? @status_bar.hide() : @status_bar.show
  200. self.recalc
  201. end
  202. end
  203. FXMenuCheck.new(menu, "Glowny pasek narzedzi\tCtrl-Alt-Shift-T\tPokaz/ukryj glowny pasek narzedzi.", @show_mainbar, FXDataTarget::ID_VALUE) do |check|
  204. check.disable
  205. end
  206. FXMenuCheck.new(menu, "Pasek narzedzi wyszukiwania\tCtrl-Alt-Shift-F\tPokaz/ukryj pasek narzedzi wyszukiwania.", @show_searchbar, FXDataTarget::ID_VALUE) do |check|
  207. check.disable
  208. end
  209. FXMenuSeparator.new(menu)
  210. FXMenuCascade.new(menu, "Jezyk...") do |cascadeMenu|
  211. cascadeMenu.menu = FXMenuPane.new(self) do |langmenu|
  212. FXMenuRadio.new(langmenu, "Polski\t\t", @selected_lang, FXDataTarget::ID_OPTION + 1)
  213. #FXMenuRadio.new(langmenu, "Angielski\t\t", @selected_lang, FXDataTarget::ID_OPTION + 2)
  214. @selected_lang.connect(SEL_COMMAND) do
  215. #puts "Hello #{@selected_lang.value}"
  216. end
  217. end
  218. end
  219. end
  220. optionsmenu = FXMenuPane.new(self) do |menu|
  221. FXMenuCommand.new(menu, "Zaimportuj z bazy w sieci\t\t", nil).connect(SEL_COMMAND, method(:not_yet_implemented))
  222. FXMenuSeparator.new(menu)
  223. FXMenuCommand.new(menu, "Eksportuj jako XML\t\t", nil).connect(SEL_COMMAND, method(:not_yet_implemented))
  224. FXMenuCommand.new(menu, "Eksportuj jako TXT\t\t", nil).connect(SEL_COMMAND, method(:not_yet_implemented))
  225. FXMenuCommand.new(menu, "Eksportuj jako XLS\t\t", nil).connect(SEL_COMMAND, method(:not_yet_implemented))
  226. end
  227. helpmenu = FXMenuPane.new(self) do |menu|
  228. FXMenuCommand.new(menu, "Pomoc\tF1\tShowing help.", nil).connect(SEL_COMMAND, method(:cmd_help))
  229. FXMenuCommand.new(menu, "O programie\tShift-F1\tOtwiera okno z informacjami o programie.", nil).connect(SEL_COMMAND, method(:cmd_about))
  230. if RUBY_PLATFORM == 'i386-mswin32'
  231. FXMenuSeparator.new(menu)
  232. FXMenuCommand.new(menu, "Strona domowa\tCtrl-Shift-F1\tOtwiera w przegladarce Internet Explorer strone domowa programu.", nil) do |cmd|
  233. cmd.connect(SEL_COMMAND) do
  234. begin
  235. Thread.new do
  236. require 'win32ole'
  237. ie = WIN32OLE.new('InternetExplorer.Application')
  238. ie.visible = true
  239. ie.navigate('http://bitbucket.org/jjhop/mycash/')
  240. end
  241. rescue; end
  242. end
  243. end
  244. end
  245. end
  246. FXMenuTitle.new(menubar, "&Plik", nil, filemenu)
  247. FXMenuTitle.new(menubar, "&Edycja", nil, editmenu)
  248. FXMenuTitle.new(menubar, "&Widok", nil, viewmenu)
  249. #FXMenuTitle.new(menubar, "&Narzedzia", nil, optionsmenu)
  250. FXMenuTitle.new(menubar, "Pomoc", nil, helpmenu, LAYOUT_RIGHT)
  251. end
  252. def cmd_quit(sender, sel, ptr)
  253. if MBOX_CLICKED_YES == FXMessageBox.question(self, MBOX_YES_NO, "Potwierdzenie zamkniecia", "Czy jestes pewien, ze chcesz zamknac program?")
  254. getApp().exit(0)
  255. end
  256. end
  257. def cmd_show_new_suspence(sender, sel, ptr)
  258. NewSuspenceDialog.new(self).execute()
  259. return 1
  260. end
  261. # wyswietla dialog proszacy o wybor bazy danych,
  262. # jesli baza zostanie wybrana tworzy instancje
  263. # fabryki dao przekazujac jej plik bazy danych
  264. # po czym uaktualnie GUI
  265. def cmd_show_open_database(sender, sel, ptr)
  266. db_dialog = OpenDatabaseDialog.new(self)
  267. db_dialog.execute()
  268. new_db_name = db_dialog.current_selection
  269. unless db_dialog.current_selection.nil? and @current_database.nil?
  270. factory = MyCashDAO::Factory.instance
  271. dbfile = File.join(File.dirname(__FILE__), '.db', new_db_name)
  272. factory.init_with_dbfile(dbfile)
  273. self.set_db_state_on_gui(true)
  274. self.set_title new_db_name
  275. end
  276. return 1
  277. end
  278. def cmd_close_database(sender, sel, ptr)
  279. if MBOX_CLICKED_YES == FXMessageBox.question(self, MBOX_YES_NO, "Potwierdzenie zamkniecia bazy", "Czy jestes pewien, ze chcesz zamknac te baze?")
  280. MyCashDAO::Factory.instance.disconnet_from_database
  281. self.set_db_state_on_gui(false)
  282. self.set_title ''
  283. end
  284. end
  285. # state -> true; baza jest podłšczona
  286. # state -> falsel baza jest odłaczona
  287. def set_db_state_on_gui(state)
  288. controls =
  289. [ @dbclose_cmd,
  290. @suspence_new_cmd, @suspence_search_cmd,
  291. @income_new_cmd, @income_search_cmd,
  292. @account_management_cmd
  293. ]
  294. if state
  295. controls.each { |ctrl| ctrl.enable }
  296. else
  297. controls.each { |ctrl| ctrl.disable }
  298. end
  299. end
  300. def cmd_show_account_controller_dialog(sender, sel, ptr)
  301. AccountControllerDialog.new(self).execute()
  302. return 1
  303. end
  304. def not_yet_implemented(sender, sel, ptr)
  305. end
  306. def cmd_help(sender, sel, ptr)
  307. HelpDialog.new(self).execute()
  308. end
  309. def cmd_about(sender, sel, ptr)
  310. #FXMessageBox.information(self, MBOX_OK, "Informacje","Rafal Kotusiewicz\n\nwww: http://jjhop.info\n")
  311. AboutDialog.new(self).execute()
  312. end
  313. def create
  314. super()
  315. show(PLACEMENT_SCREEN)
  316. end
  317. def set_title(title)
  318. full_title = "myCash 0.1"
  319. unless title.empty?
  320. full_title<< " - " << title
  321. end
  322. self.title = full_title
  323. end
  324. end