#!/usr/bin/env ruby begin require 'rubygems' rescue LoadError end require 'wx' include Wx # problems # boolean editor and even renderer (in the version 1.9.8) # after changing a cell: when entering ENTER, ..... class Person attr_accessor :name, :age, :invalid, :created_at def initialize name, age, invalid, created_at @name = name # string @age = age # integer @invalid = invalid # boolean @created_at = Time.now end end class MyGridTable < Wx::GridTableBase attr_reader :rowObjClass, :rowObjs, :colInfos def initialize(rowObjClass) super() @rowObjClass = rowObjClass @rowObjs = Array.new @colInfos = ["name", "age", "invalid", "created_at"] invalids = [false, true, false, true, false] 15.times {|ii| @rowObjs.push(Person.new("franz"+ii.to_s, 3*ii, invalids[ii - 1], Time.now)) } end def get_number_rows return rowObjs.size end def get_number_cols return 4 end def get_value(row, col) p "begin get_value: #{rowObjs[row].send(colInfos[col])}" # ??? must here always be returned a string ? return rowObjs[row].send(colInfos[col]).to_s end def get_attr(row, col, attr_kind) attr = Wx::GridCellAttr.new if col == 2 # invalid columns attr.set_editor(Wx::GridCellBoolEditor.new) attr.set_renderer(Wx::GridCellBoolRenderer.new) end attr end def is_empty_cell(row, col) false end def get_col_label_value(col) colInfos[col] end def set_value(row, col, val) rowObjs[row].send(colInfos[col]+"=", val) end end class GridFrame < Wx::Frame def initialize(ctrl) super(nil, :title => 'GridTableBase demo') @ctrl = ctrl # panel = Panel.new self main_sizer = Wx::BoxSizer.new(Wx::VERTICAL) @grid = Wx::Grid.new(self) @grid.set_table ctrl.gridTable main_sizer.add(@grid, 1, Wx::EXPAND|Wx::ALL, 5) butt_sizer = Wx::BoxSizer.new(Wx::HORIZONTAL) butt_1 = Wx::Button.new(self, :label => "close") butt_sizer.add(butt_1) evt_button(butt_1){|evt| close } ############## main_sizer.add(butt_sizer, 0, Wx::EXPAND|Wx::ALL, 5) self.sizer = main_sizer p "parent war: #{parent}" evt_close{|evt| ctrl.callerCtrl.goHome; evt.skip } end end class GridCtrl attr_reader :callerCtrl, :gridTable, :ctrlWin def initialize callerCtrl @callerCtrl = callerCtrl end def start @gridTable = MyGridTable.new Person gridFrame = GridFrame.new self ### , DEFALULT_POSITION, Size.new(400, 600) @ctrlWin = gridFrame gridFrame.show end end class AppFrame < Wx::Frame attr_reader :ctrl def initialize(ctrl) super(nil, :title => 'GridTableBase demo') @ctrl = ctrl main_sizer = Wx::BoxSizer.new(Wx::VERTICAL) main_sizer.add(@grid, 1, Wx::EXPAND|Wx::ALL, 5) # Add some buttons that can change the contents butt_sizer = Wx::BoxSizer.new(Wx::HORIZONTAL) butt_1 = Wx::Button.new(self, :label => "next window") butt_sizer.add(butt_1) evt_button(butt_1){|evt| ctrl.startNextWindow } ############### main_sizer.add(butt_sizer, 0, Wx::EXPAND|Wx::ALL, 5) self.sizer = main_sizer end end class AppCtrl attr_reader :ctrlWin def goHome @ctrlWin ||= AppFrame.new(self) @ctrlWin.show end def startNextWindow p "begin openNextWindow" @gridCtrl ||= GridCtrl.new self @gridCtrl.start ctrlWin.show false end end class MyApp < App def on_init ac = AppCtrl.new ac.goHome end end app = MyApp.new app.main_loop #EOF