/main_window.rb
Ruby | 456 lines | 364 code | 52 blank | 40 comment | 7 complexity | db0a6fef30a6a10bce4368857c349f00 MD5 | raw file
- # This program is free software: you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation, version 3 of the License.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
- #
- # Copyright: (C) 2004-2010 Rafal Kotusiewicz aka 'jjhop'. All rights reserved.
- #
- # http://bitbucket.org/jjhop/mycash/overview/
- # http://bitbucket.org/jjhop/mycash/wiki/Home
- #
-
- require 'rubygems'
- require "fox16"
-
- require File.join(File.dirname(__FILE__), 'suspence_dialog')
- require File.join(File.dirname(__FILE__), 'account_dialog')
- require File.join(File.dirname(__FILE__), 'database_dialog')
- require File.join(File.dirname(__FILE__), 'new_database_dialog')
- require File.join(File.dirname(__FILE__), 'about_dialog')
- require File.join(File.dirname(__FILE__), 'help_dialog')
-
- include Fox
-
- class MainWindow < FXMainWindow
-
- def initialize(app)
- # Najpierw inicjalizacja potrzebnych zmiennych...
- @selected_lang = FXDataTarget.new(1)
- @current_tab = FXDataTarget.new(1)
- @show_statusbar = FXDataTarget.new(true)
- @show_menubar = FXDataTarget.new(true)
- @show_mainbar = FXDataTarget.new(true)
- @show_searchbar = FXDataTarget.new(true)
-
- @current_database = nil
-
- # Teraz budujemy okno, kontrolki itd
- super(app, "myCash 0.1", nil, nil, DECOR_ALL, 0, 0, 800, 600)
- FXPNGIcon.new(getApp(), File.open(File.join(File.dirname(__FILE__), './ico/16/money_bag.png'),"rb").read) do |ico|
- self.icon = ico
- self.miniIcon = ico
- end
-
- FXToolTip.new(getApp())
- # Menu bar
- @dragshell1 = FXToolBarShell.new(self, 0)
- @menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP | LAYOUT_FILL_X | FRAME_RAISED)
-
- # Tool bar
- #dragshell2 = FXToolBarShell.new(self, 0)
- #toolbar = FXToolBar.new(self, dragshell2, (LAYOUT_SIDE_TOP|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT|FRAME_RAISED|LAYOUT_FILL_X))
- #FXToolBarGrip.new(toolbar, toolbar, FXToolBar::ID_TOOLBARGRIP, TOOLBARGRIP_DOUBLE)
-
- # Status bar
- @status_bar = FXStatusBar.new(self, LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|STATUSBAR_WITH_DRAGCORNER)
-
- FXHorizontalSeparator.new(self, LAYOUT_SIDE_TOP, LAYOUT_FILL_X, SEPARATOR_GROOVE)
-
- FXVerticalFrame.new(self, LAYOUT_SIDE_TOP|FRAME_NONE|LAYOUT_FILL_X|LAYOUT_FILL_Y) do |contents|
- FXSplitter.new(contents, LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y|SPLITTER_TRACKING|SPLITTER_HORIZONTAL) do |splitter|
-
- FXGroupBox.new(splitter, "Okresy", LAYOUT_FILL_Y|FRAME_GROOVE, 0, 0, 210) do |groupbox|
- FXHorizontalFrame.new(groupbox, LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,0, 0, 0, 0, 0, 0, 0, 0) do |frame|
- opts = LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_TOP|LAYOUT_RIGHT|TREELIST_SHOWS_LINES|TREELIST_SHOWS_BOXES|TREELIST_ROOT_BOXES|TREELIST_EXTENDEDSELECT;
- FXTreeList.new(frame, nil, 0, opts) do |tree|
- m1 = tree.appendItem(nil, "2007", nil, nil)
- tree.appendItem(m1, "Listopad", nil, nil)
- tree.appendItem(m1, "Grudzien", nil, nil)
- tree.expandTree(m1)
- m2 = tree.appendItem(nil, "2008", nil, nil)
- tree.appendItem(m2, "Styczen", nil, nil)
- tree.appendItem(m2, "Luty", nil, nil)
- tree.appendItem(m2, "Marzec", nil, nil)
- tree.appendItem(m2, "Kwiecien", nil, nil)
- tree.appendItem(m2, "Maj", nil, nil)
- tree.appendItem(m2, "Czerwiec", nil, nil)
- tree.appendItem(m2, "Lipiec", nil, nil)
- tree.appendItem(m2, "Sierpien", nil, nil)
- tree.appendItem(m2, "Wrzesien", nil, nil)
- tree.appendItem(m2, "Pazdziernik", nil, nil)
- tree.appendItem(m2, "Listopad", nil, nil)
- tree.appendItem(m2, "Grudzien", nil, nil)
- tree.expandTree(m2)
- m3 = tree.appendItem(nil, "2009", nil, nil)
- tree.appendItem(m3, "Styczen", nil, nil)
- tree.appendItem(m3, "Luty", nil, nil)
- tree.appendItem(m3, "Marzec", nil, nil)
- tree.appendItem(m3, "Kwiecien", nil, nil)
- tree.appendItem(m3, "Maj", nil, nil)
- tree.appendItem(m3, "Czerwiec", nil, nil)
- tree.appendItem(m3, "Lipiec", nil, nil)
- tree.appendItem(m3, "Sierpien", nil, nil)
- tree.appendItem(m3, "Wrzesien", nil, nil)
- tree.appendItem(m3, "Pazdziernik", nil, nil)
- tree.appendItem(m3, "Listopad", nil, nil)
- tree.appendItem(m3, "Grudzien", nil, nil)
- tree.expandTree(m3)
- m4 = tree.appendItem(nil, "2010", nil, nil)
- tree.appendItem(m4, "Styczen", nil, nil)
- tree.appendItem(m4, "Luty", nil, nil)
- tree.appendItem(m4, "Marzec", nil, nil).select()
- end
- end
- end
-
- @tabs = FXTabBook.new(splitter, nil, 0, LAYOUT_FILL_Y|LAYOUT_RIGHT) do |tabBook|
- FXTabItem.new(tabBook, "Wydatki [Ctrl-F1]")
- FXHorizontalFrame.new(tabBook, FRAME_THICK|FRAME_RAISED) do |page|
- FXHorizontalFrame.new(page, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL, 0,0,0,0, 0,0,0,0) do |frame|
-
- FXTable.new(frame, nil, 0, TABLE_COL_SIZABLE|TABLE_NO_COLSELECT|LAYOUT_FILL) do |t|
- # table setup
- t.setTableSize(0, 6)
- t.rowHeaderMode = LAYOUT_FIX_WIDTH
- t.rowHeaderWidth = 0
- t.editable = false
- t.setColumnText( 0, "Lp.")
- t.setColumnWidth(0, 25)
-
- t.setColumnText(1, "Data wydania")
- t.setColumnWidth(1, 100)
- t.setColumnJustify(1, FXHeaderItem::RIGHT)
-
- t.setColumnText(2, "Wartosc")
- t.setColumnWidth(2, 100)
- t.setColumnJustify(2, FXHeaderItem::RIGHT)
-
- t.setColumnText(3, "Kategoria")
- t.setColumnWidth(3, 100)
- t.setColumnJustify(3, FXHeaderItem::RIGHT)
-
- t.setColumnText(4, "Konto")
- t.setColumnWidth(4, 100)
- t.setColumnJustify(4, FXHeaderItem::RIGHT)
-
- t.setColumnText(5, "Odbiorca")
- t.setColumnWidth(5, 100)
- t.setColumnJustify(5, FXHeaderItem::RIGHT)
-
- # teraz jakieœ lipne dane
- 50.times do |idx|
- t.insertRows(t.numRows, 1, true)
- t.setItemText(idx, 0, "#{idx+1}");
- t.setItemText(idx, 1, "#{Time.new.strftime("%d-%m-%Y")}");
- t.setItemText(idx, 2, "#{format("%.2f", 130 - rand)}zl");
- t.setItemText(idx, 3, "Wydatki rozne");
- t.setItemText(idx, 4, "Portfel");
- t.setItemText(idx, 5, "Jasiek Wisniewski");
- end
- end
-
- end
- end
- FXTabItem.new(tabBook, "Zastawienia [Ctrl-F2]")
- FXHorizontalFrame.new(tabBook, FRAME_THICK|FRAME_RAISED) do |page|
- FXHorizontalFrame.new(page, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y)
- end
- FXTabItem.new(tabBook, "Przychody [Ctrl-F3]")
- FXHorizontalFrame.new(tabBook, FRAME_THICK|FRAME_RAISED) do |page|
- FXHorizontalFrame.new(page, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL, 0,0,0,0, 0,0,0,0) do |frame|
- FXTable.new(frame, nil, 0, TABLE_COL_SIZABLE|TABLE_NO_COLSELECT|LAYOUT_FILL) do |t|
- # table setup
- t.setTableSize(0, 6)
- t.rowHeaderMode = LAYOUT_FIX_WIDTH
- t.rowHeaderWidth = 0
- t.editable = false
- t.setColumnText( 0, "Lp.")
- t.setColumnWidth(0, 25)
-
- t.setColumnText(1, "Data przychodu")
- t.setColumnWidth(1, 100)
- t.setColumnJustify(1, FXHeaderItem::RIGHT)
-
- t.setColumnText(2, "Kwota")
- t.setColumnWidth(2, 100)
- t.setColumnJustify(2, FXHeaderItem::RIGHT)
-
- t.setColumnText(3, "Kategoria")
- t.setColumnWidth(3, 100)
- t.setColumnJustify(3, FXHeaderItem::RIGHT)
-
- t.setColumnText(4, "Konto")
- t.setColumnWidth(4, 100)
- t.setColumnJustify(4, FXHeaderItem::RIGHT)
-
- t.setColumnText(5, "Zrodlo przychodu")
- t.setColumnWidth(5, 100)
- t.setColumnJustify(5, FXHeaderItem::RIGHT)
-
- # teraz jakieœ lipne dane
- 10.times do |idx|
- t.insertRows(t.numRows, 1, true)
- t.setItemText(idx, 0, "#{idx+1}");
- t.setItemText(idx, 1, "#{Time.new.strftime("%d-%m-%Y")}");
- t.setItemText(idx, 2, "#{format("%.2f", 130 - rand)}zl");
- t.setItemText(idx, 3, "Wynagrodzenie");
- t.setItemText(idx, 4, "Millenium 23232312");
- t.setItemText(idx, 5, "Kowalski Sp. z o.o.");
- end
- end
- end
- end
- FXTabItem.new(tabBook, "Stan kont [Ctrl-F4]")
- FXHorizontalFrame.new(tabBook, FRAME_THICK|FRAME_RAISED) do |page|
- FXHorizontalFrame.new(page, FRAME_THICK|FRAME_SUNKEN|LAYOUT_FILL_X|LAYOUT_FILL_Y)
- end
- tabBook.setCurrent(0)
- end
- end
- end
-
- filemenu = FXMenuPane.new(self) do |menu|
- FXGIFIcon.new(getApp(), File.open(File.join(File.dirname(__FILE__), './ico/16/book_add.gif'),"rb").read) do |ico|
- FXMenuCommand.new(menu, "Nowa baza...\tAlt-Shift-N\tNowa baza...", ico) do |c|
- c.connect(SEL_COMMAND, method(:cmd_show_new_database))
- end
- end
- FXGIFIcon.new(getApp(), File.open(File.join(File.dirname(__FILE__), './ico/16/book.gif'),"rb").read) do |ico|
- FXMenuCommand.new(menu, "Otworz baze...\tAlt-Shift-O\tOtwiera baze...", ico) do |c|
- c.connect(SEL_COMMAND, method(:cmd_show_open_database))
- end
- end
- FXGIFIcon.new(getApp(), File.open(File.join(File.dirname(__FILE__), './ico/16/book_close.gif'),"rb").read) do |ico|
- @dbclose_cmd = FXMenuCommand.new(menu, "Zamknij baze\tAlt-Shift-W\tZamyka baze", ico) do |c|
- c.connect(SEL_COMMAND, method(:cmd_close_database))
- c.disable
- end
- end
-
- FXMenuSeparator.new(menu)
- @suspence_new_cmd = FXMenuCommand.new(menu, "Nowy wydatek...\tCtrl-N\tNowy wydatek", nil) do |cmd|
- cmd.connect(SEL_COMMAND, method(:cmd_show_new_suspence))
- cmd.disable
- end
- @suspence_search_cmd = FXMenuCommand.new(menu, "Szukaj wydatku...\t\tSzukaj...", nil) do |cmd|
- cmd.connect(SEL_COMMAND, method(:not_yet_implemented))
- cmd.disable
- end
- FXMenuSeparator.new(menu)
- @income_new_cmd = FXMenuCommand.new(menu, "Nowy przychod..\tCtrl-Shift-N\tNowy przychod", nil) do |cmd|
- cmd.connect(SEL_COMMAND, method(:not_yet_implemented))
- cmd.disable
- end
- @income_search_cmd = FXMenuCommand.new(menu, "Wyszukaj przychod..\t\tWyszukaj przychod", nil) do |cmd|
- cmd.connect(SEL_COMMAND, method(:not_yet_implemented))
- cmd.disable
- end
- FXMenuSeparator.new(menu)
- @account_management_cmd = FXMenuCommand.new(menu, "Zarzadzanie kontami...\t\tOtwiera okno dialogowe zarzadzania kontami", nil) do |cmd|
- cmd.connect(SEL_COMMAND, method(:cmd_show_account_controller_dialog))
- cmd.disable
- end
- FXMenuCommand.new(menu, "Kategorie wydatkow...\t\tOtwiera okno zarzadzania kategoriami wydatkow", nil) do |cmd|
- cmd.connect(SEL_COMMAND, method(:not_yet_implemented))
- cmd.disable
- end
- FXMenuCommand.new(menu, "Kategorie przychodow...\t\tOtwiera okno zarzadzania kategoriami przychodow", nil) do |cmd|
- cmd.connect(SEL_COMMAND, method(:not_yet_implemented))
- cmd.disable
- end
- FXMenuCommand.new(menu, "Zrodla przychodow...\t\tOtwiera okno zarzadzania zrodalami przychodow", nil) do |cmd|
- cmd.connect(SEL_COMMAND, method(:not_yet_implemented))
- cmd.disable
- end
- FXMenuSeparator.new(menu)
- FXMenuCommand.new(menu, "Wyjscie\tCtrl-W\t\tZamykam program", nil).connect(SEL_COMMAND, method(:cmd_quit))
- end
-
- editmenu = FXMenuPane.new(self) do |menu|
- FXMenuCommand.new(menu, "Wytnij\tCtrl-X\tCut selection to clipboard", nil, getApp())
- FXMenuCommand.new(menu, "Kopiuj\tCtl-C\tCopy selection to clipboard.", nil, getApp())
- FXMenuCommand.new(menu, "Wklej\tCtl-V\tPaste from clipboard.", nil, getApp())
- FXMenuCommand.new(menu, "Usun\tCtl-D\tDelete selection.", nil, getApp())
- FXMenuSeparator.new(menu)
- FXMenuCommand.new(menu, "Szukaj...\tCtl-F\tWyszukaj.", nil, getApp())
- FXMenuCommand.new(menu, "Nastepny\tF3\tSzukaj dalej.", nil, getApp())
- FXMenuCommand.new(menu, "Poprzedni\tShift-F3\tSzukaj wczesniej.", nil, getApp())
- FXMenuSeparator.new(menu)
- FXMenuCommand.new(menu, "Preferencje...\t\t", nil).connect(SEL_COMMAND, method(:not_yet_implemented))
- end
-
- viewmenu = FXMenuPane.new(self) do |menu|
- FXMenuRadio.new(menu, "Wydatki\tCtrl-F1", @tabs, FXTabBar::ID_OPEN_FIRST + 0)
- FXMenuRadio.new(menu, "Zestawienia\tCtrl-F2", @tabs, FXTabBar::ID_OPEN_FIRST + 1)
- FXMenuRadio.new(menu, "Przychody\tCtrl-F3", @tabs, FXTabBar::ID_OPEN_FIRST + 2)
- FXMenuRadio.new(menu, "Stan kont\tCtrl-F4", @tabs, FXTabBar::ID_OPEN_FIRST + 3)
-
- #FXMenuCommand.new(filemenu, "&Simple List", nil, @tabbook, FXTabBar::ID_OPEN_FIRST+0)
-
-
- FXMenuSeparator.new(menu)
- FXMenuCheck.new(menu, "Pasek stanu\tCtrl-Alt-Shift-S\tPokaz/ukryj pasek stanu", @show_statusbar) do |btn|
- btn.check = true
- btn.connect(SEL_COMMAND) do
- @status_bar.shown? ? @status_bar.hide() : @status_bar.show
- self.recalc
- end
- end
- FXMenuCheck.new(menu, "Menu\tF9\tPokaz/ukryj menu programu", @show_menubar)do |btn|
- btn.check = true
- btn.connect(SEL_COMMAND) do
- @menubar.shown? ? @menubar.hide : @menubar.show
- self.recalc
- end
- end
- FXMenuCheck.new(menu, "Glowny pasek narzedzi\tCtrl-Alt-Shift-T\tPokaz/ukryj glowny pasek narzedzi.", @show_mainbar, FXDataTarget::ID_VALUE) do |check|
- check.disable
- end
- FXMenuCheck.new(menu, "Pasek narzedzi wyszukiwania\tCtrl-Alt-Shift-F\tPokaz/ukryj pasek narzedzi wyszukiwania.", @show_searchbar, FXDataTarget::ID_VALUE) do |check|
- check.disable
- end
- FXMenuSeparator.new(menu)
- FXMenuCascade.new(menu, "Jezyk...") do |cascadeMenu|
- cascadeMenu.menu = FXMenuPane.new(self) do |langmenu|
- FXMenuRadio.new(langmenu, "Polski\t\t", @selected_lang, FXDataTarget::ID_OPTION + 1)
- #FXMenuRadio.new(langmenu, "Angielski\t\t", @selected_lang, FXDataTarget::ID_OPTION + 2)
- @selected_lang.connect(SEL_COMMAND) do
- #puts "Hello #{@selected_lang.value}"
- end
- end
- end
- end
-
- optionsmenu = FXMenuPane.new(self) do |menu|
- FXMenuCommand.new(menu, "Zaimportuj z bazy w sieci\t\t", nil).connect(SEL_COMMAND, method(:not_yet_implemented))
- FXMenuSeparator.new(menu)
- FXMenuCommand.new(menu, "Eksportuj jako XML\t\t", nil).connect(SEL_COMMAND, method(:not_yet_implemented))
- FXMenuCommand.new(menu, "Eksportuj jako TXT\t\t", nil).connect(SEL_COMMAND, method(:not_yet_implemented))
- FXMenuCommand.new(menu, "Eksportuj jako XLS\t\t", nil).connect(SEL_COMMAND, method(:not_yet_implemented))
- end
-
- helpmenu = FXMenuPane.new(self) do |menu|
- FXMenuCommand.new(menu, "Pomoc\tF1\tShowing help.", nil).connect(SEL_COMMAND, method(:cmd_help))
- FXMenuCommand.new(menu, "O programie\tShift-F1\tOtwiera okno z informacjami o programie.", nil).connect(SEL_COMMAND, method(:cmd_about))
- if RUBY_PLATFORM == 'i386-mswin32'
- FXMenuSeparator.new(menu)
- FXMenuCommand.new(menu, "Strona domowa\tCtrl-Shift-F1\tOtwiera w przegladarce Internet Explorer strone domowa programu.", nil) do |cmd|
- cmd.connect(SEL_COMMAND) do
- begin
- Thread.new do
- require 'win32ole'
- ie = WIN32OLE.new('InternetExplorer.Application')
- ie.visible = true
- ie.navigate('http://bitbucket.org/jjhop/mycash/')
- end
- rescue; end
- end
- end
- end
- end
-
- FXMenuTitle.new(@menubar, "&Plik", nil, filemenu)
- FXMenuTitle.new(@menubar, "&Edycja", nil, editmenu)
- FXMenuTitle.new(@menubar, "&Widok", nil, viewmenu)
- #FXMenuTitle.new(@menubar, "&Narzedzia", nil, optionsmenu)
- FXMenuTitle.new(@menubar, "Pomoc", nil, helpmenu, LAYOUT_RIGHT)
- end
-
- def cmd_quit(sender, sel, ptr)
- if MBOX_CLICKED_YES == FXMessageBox.question(self, MBOX_YES_NO, "Potwierdzenie zamkniecia", "Czy jestes pewien, ze chcesz zamknac program?")
- getApp().exit(0)
- end
- end
-
- def cmd_show_new_suspence(sender, sel, ptr)
- NewSuspenceDialog.new(self).execute()
- return 1
- end
-
- def cmd_show_new_database(sender, sel, ptr)
- db_dialog = NewDatabaseDialog.new(self)
- db_dialog.execute()
- return 1
- end
-
- # wyswietla dialog proszacy o wybor bazy danych,
- # jesli baza zostanie wybrana tworzy instancje
- # fabryki dao przekazujac jej plik bazy danych
- # po czym uaktualnie GUI
- def cmd_show_open_database(sender, sel, ptr)
- db_dialog = OpenDatabaseDialog.new(self)
- db_dialog.execute()
- new_db_name = db_dialog.current_selection
-
- unless db_dialog.current_selection.nil? and @current_database.nil?
- factory = MyCashDAO::Factory.instance
- dbfile = File.join(File.dirname(__FILE__), '.db', new_db_name)
- factory.init_with_dbfile(dbfile)
-
- self.set_db_state_on_gui(true)
- self.set_title new_db_name
- end
- return 1
- end
-
- def cmd_close_database(sender, sel, ptr)
- if MBOX_CLICKED_YES == FXMessageBox.question(self, MBOX_YES_NO, "Potwierdzenie zamkniecia bazy", "Czy jestes pewien, ze chcesz zamknac te baze?")
- MyCashDAO::Factory.instance.disconnet_from_database
- self.set_db_state_on_gui(false)
- self.set_title ''
- end
- end
-
- # state -> true; baza jest pod?šczona
- # state -> falsel baza jest od?aczona
- def set_db_state_on_gui(state)
- controls =
- [ @dbclose_cmd,
- @suspence_new_cmd, @suspence_search_cmd,
- @income_new_cmd, @income_search_cmd,
- @account_management_cmd
- ]
- if state
- controls.each { |ctrl| ctrl.enable }
- else
- controls.each { |ctrl| ctrl.disable }
- end
- end
-
- def cmd_show_account_controller_dialog(sender, sel, ptr)
- AccountControllerDialog.new(self).execute()
- return 1
- end
-
- def not_yet_implemented(sender, sel, ptr)
- end
-
- def cmd_help(sender, sel, ptr)
- HelpDialog.new(self).execute()
- end
-
- def cmd_about(sender, sel, ptr)
- #FXMessageBox.information(self, MBOX_OK, "Informacje","Rafal Kotusiewicz\n\nwww: http://jjhop.info\n")
- AboutDialog.new(self).execute()
- end
-
- def create
- super()
- show(PLACEMENT_SCREEN)
- end
-
- def set_title(title)
- full_title = "myCash 0.1"
- unless title.empty?
- full_title<< " - " << title
- end
- self.title = full_title
- end
- end