*/ class Application { /** * GtkWindow object array * Structure: * [string GtkWindow_Name] * array( * GtkWindow - Store GtkWindow object * ) * * @var array GtkWindow */ protected static $GtkWindows = array(); private function __construct() { } /** * Adds a GtkWindow object to Application::$GtkWindows * * @param GtkWindow $GtkWindow * @return bool */ public static function add_window(GtkWindow $GtkWindow) { $GtkWindow_Name = $GtkWindow->get_name(); if ($GtkWindow_Name !== '' && !array_key_exists($GtkWindow_Name, self::$GtkWindows)) { self::$GtkWindows[$GtkWindow_Name] = $GtkWindow; return true; } return false; } /** * Removes a GtkWindow object from Application::$GtkWindows * * @param string $GtkWindow_Name * @return GtkWindow */ public static function remove_window($GtkWindow_Name) { if ($GtkWindow_Name !== '' && array_key_exists($GtkWindow_Name, self::$GtkWindows)) { $GtkWindow = self::$GtkWindows[$GtkWindow_Name]; unset(self::$GtkWindows[$GtkWindow_Name]); return $GtkWindow; } return false; } /** * Retrives GtkWindow object from Application::$GtkWindows * * @param string $GtkWindow_Name * @return GtkWindow */ public static function window($GtkWindow_Name) { if ($GtkWindow_Name !== '' && array_key_exists($GtkWindow_Name, self::$GtkWindows)) { return self::$GtkWindows[$GtkWindow_Name]; } return false; } /** * Retrives Application::$GtkWindows infomation array * Structure: * [int window_id] * array( * name - Name of GtkWindow * class - Name of GtkWindow class * ) * * @return array */ public static function list_windows() { $Window_List = array(); foreach (self::$GtkWindows as $GtkWindow_Name => $Class) { $Class_Name = get_class($Class); $Window_List[] = array('name' => $GtkWindow_Name, 'class' => $Class_Name); } return $Window_List; } /** * Shows all windows managed by Application * */ public static function show_all_windows() { foreach (self::$GtkWindows as $GtkWindow) { $GtkWindow->show_all(); } } /** * Hides all windows managed by Application * */ public static function hide_all_windows() { foreach (self::$GtkWindows as $GtkWindow) { $GtkWindow->hide_all(); } } public static function is_window($GtkWindow_Name) { return array_key_exists($GtkWindow_Name, self::$GtkWindows); } } function window($GtkWindow_Name) { return Application::window($GtkWindow_Name); } class wnd_main extends GtkWindow { protected $_widgets = array(); public function __construct(){ parent::__construct(); parent::set_name('wnd_main'); parent::set_title('wnd_main'); parent::connect_simple('destroy',array($this,'_destroy')); $this->_widgets['vbox'] = new GtkVbox(); $this->_widgets['vbox']->set_name('vbox'); $this->_widgets['btn_add'] = new GtkButton('Add Window'); $this->_widgets['btn_add']->connect_simple('clicked',array($this,'btn_add_clicked')); $this->_widgets['btn_remove'] = new GtkButton('Remove Window'); $this->_widgets['btn_remove']->connect_simple('clicked',array($this,'btn_remove_clicked')); $this->_widgets['btn_show'] = new GtkButton('Show All Windows'); $this->_widgets['btn_show']->connect_simple('clicked',array($this,'btn_show_clicked')); $this->_widgets['btn_hide'] = new GtkButton('Hide All Windows'); $this->_widgets['btn_hide']->connect_simple('clicked',array($this,'btn_hide_clicked')); $this->_widgets['ent_name'] = new GtkEntry(); $this->_widgets['vbox']->pack_start($this->_widgets['ent_name']); $this->_widgets['vbox']->pack_start($this->_widgets['btn_add']); $this->_widgets['vbox']->pack_start($this->_widgets['btn_remove']); $this->_widgets['vbox']->pack_start($this->_widgets['btn_show']); $this->_widgets['vbox']->pack_start($this->_widgets['btn_hide']); parent::add($this->_widgets['vbox']); parent::show_all(); } public function widget($name) { return $this->_widgets[$name]; } public function btn_add_clicked() { if ('' !== $this->widget('ent_name')->get_text() && !Application::is_window($this->widget('ent_name')->get_text())) { Application::add_window(new multi($this->widget('ent_name')->get_text())); } } public function btn_remove_clicked() { if (Application::is_window($this->widget('ent_name')->get_text())) { Application::window($this->widget('ent_name')->get_text())->hide_all(); $GtkWindow = Application::remove_window($this->widget('ent_name')->get_text()); $GtkWindow->destroy(); } } public function _destroy(){ echo func_name(); Gtk::main_quit(); } public function btn_show_clicked() { Application::show_all_windows(); } public function btn_hide_clicked() { Application::hide_all_windows(); parent::show_all(); } } class multi extends GtkWindow { public function __construct($name) { parent::__construct(); parent::set_name($name); parent::set_title($name); parent::connect_simple('delete-event',array($this,'delete_event')); parent::connect_simple('destroy',array($this,'_destroy')); } public function _destroy() { echo func_name(); } public function delete_event(){ return true; } } Application::add_window(new wnd_main()); Gtk::main(); ?>