set_title("Table Data"); $this->set_position(Gtk::WIN_POS_CENTER_ALWAYS); $this->set_destroy_with_parent(TRUE); $this->win = new GTKScrolledWindow(); $this->win->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); $this->add($this->win); $this->_render($data); // Resize to a sane size $this->set_size_request(640, 480); } /** * Layout the window * * @param array $data * @return void */ protected function _render($data) { if ( ! is_array($data)) { return; } $model = new StdClass(); $cols = ( ! empty($data)) ? array_keys($data[0]) : array(); // Add columns to model $col_num = (count($cols) > 0) ? count($cols) : 1; $model_args = array_fill(0, $col_num, Gobject::TYPE_PHP_VALUE); $eval_string = '$model = new GTKTreeStore('.implode(',', $model_args).');'; // Shame, shame, but how else? eval($eval_string); $view = new Data_Grid($model); $view->set_headers_clickable(TRUE); // Set the data in the model for($i=0, $c = count($data); $i < $c; $i++) { // Add a row $row = $model->insert($i); $j = -1; $vals = array($row); foreach($data[$i] as $v) { $vals[] = ++$j; $vals[] = trim($v); } call_user_func_array(array($model, 'set'), $vals); } // Add columns to view foreach($cols as $i => $c) { $renderer = new GtkCellRendererText(); $renderer->set_property('editable', TRUE); $view->insert_column_with_data_func($i, $c, $renderer, array($view, 'add_data_col'), $i); } // Add the grid to the window $this->win->add_with_viewport($view); $this->show_all(); } }