1 /* 2 * this file is part of the oxygen gtk engine 3 * Copyright (c) 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr> 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or(at your option ) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free 17 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, 18 * MA 02110-1301, USA. 19 */ 20 21 #include "oxygencomboboxentrydata.h" 22 #include "../oxygengtkutils.h" 23 #include "../config.h" 24 25 #include <gtk/gtk.h> 26 #include <iostream> 27 #include <cassert> 28 29 namespace Oxygen 30 { 31 32 //________________________________________________________________________________ disconnect(GtkWidget * widget)33 void ComboBoxEntryData::disconnect( GtkWidget* widget ) 34 { 35 36 #if OXYGEN_DEBUG 37 std::cerr << "Oxygen::ComboBoxEntryData::connect - widget: " << widget << std::endl; 38 #endif 39 40 _list = 0L; 41 42 HoverData::disconnect( widget ); 43 _entry.disconnect(); 44 _button.disconnect(); 45 } 46 47 //________________________________________________________________________________ setButton(GtkWidget * widget)48 void ComboBoxEntryData::setButton( GtkWidget* widget ) 49 { 50 if( _button._widget == widget ) return; 51 assert( !_button._widget ); 52 53 _button._destroyId.connect( G_OBJECT(widget), "destroy", G_CALLBACK( childDestroyNotifyEvent ), this ); 54 _button._enterId.connect( G_OBJECT(widget), "enter-notify-event", (GCallback)enterNotifyEvent, this ); 55 _button._leaveId.connect( G_OBJECT(widget), "leave-notify-event", (GCallback)leaveNotifyEvent, this ); 56 _button._toggledId.connect( G_OBJECT(widget), "toggled", G_CALLBACK( childToggledEvent ), this ); 57 _button._widget = widget; 58 } 59 60 //________________________________________________________________________________ setEntry(GtkWidget * widget)61 void ComboBoxEntryData::setEntry( GtkWidget* widget ) 62 { 63 if( _entry._widget == widget ) return; 64 assert( !_entry._widget ); 65 66 #if OXYGEN_DEBUG 67 std::cerr << "Oxygen::ComboBoxEntryData::setEntry - " << widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")" << std::endl; 68 #endif 69 70 _entry._destroyId.connect( G_OBJECT(widget), "destroy", G_CALLBACK( childDestroyNotifyEvent ), this ); 71 _entry._enterId.connect( G_OBJECT(widget), "enter-notify-event", (GCallback)enterNotifyEvent, this ); 72 _entry._leaveId.connect( G_OBJECT(widget), "leave-notify-event", (GCallback)leaveNotifyEvent, this ); 73 _entry._widget = widget; 74 } 75 76 //________________________________________________________________________________ setPressed(GtkWidget * widget,bool value)77 void ComboBoxEntryData::setPressed( GtkWidget* widget, bool value ) 78 { 79 if( widget == _button._widget ) _button._pressed = value; 80 return; 81 } 82 83 //________________________________________________________________________________ setHovered(GtkWidget * widget,bool value)84 bool ComboBoxEntryData::setHovered( GtkWidget* widget, bool value ) 85 { 86 const bool oldHovered( hovered() ); 87 if( widget == _entry._widget ) _entry._hovered = value; 88 else if( widget == _button._widget ) _button._hovered = value; 89 else HoverData::setHovered( widget, value ); 90 91 if( oldHovered != hovered() ) 92 { 93 94 // trigger repaint 95 if( _button._widget ) gtk_widget_queue_draw( gtk_widget_get_parent( _button._widget ) ); 96 else if( _entry._widget ) gtk_widget_queue_draw( gtk_widget_get_parent( _entry._widget ) ); 97 return true; 98 99 } else return false; 100 101 } 102 103 //________________________________________________________________________________ unregisterChild(GtkWidget * widget)104 void ComboBoxEntryData::unregisterChild( GtkWidget* widget ) 105 { 106 107 #if OXYGEN_DEBUG 108 std::cerr << "Oxygen::ComboBoxEntryData::unregisterChild - " << widget << " (" << G_OBJECT_TYPE_NAME( widget ) << ")" << std::endl; 109 #endif 110 111 if( widget == _button._widget ) _button.disconnect(); 112 else if( widget == _entry._widget ) _entry.disconnect(); 113 return; 114 115 } 116 117 //________________________________________________________________________________ disconnect(void)118 void ComboBoxEntryData::Data::disconnect( void ) 119 { 120 121 #if OXYGEN_DEBUG 122 std::cerr << "Oxygen::ComboBoxEntryData::Data::disconnect - " << _widget << " (" << (_widget ? G_OBJECT_TYPE_NAME( _widget ):"null") << ")" << std::endl; 123 #endif 124 125 if( !_widget ) return; 126 _destroyId.disconnect(); 127 _enterId.disconnect(); 128 _leaveId.disconnect(); 129 _toggledId.disconnect(); 130 _hovered = false; 131 _focus = false; 132 _pressed = false; 133 _widget = 0L; 134 } 135 136 //____________________________________________________________________________________________ childDestroyNotifyEvent(GtkWidget * widget,gpointer data)137 gboolean ComboBoxEntryData::childDestroyNotifyEvent( GtkWidget* widget, gpointer data ) 138 { 139 static_cast<ComboBoxEntryData*>(data)->unregisterChild( widget ); 140 return FALSE; 141 } 142 143 //____________________________________________________________________________________________ childToggledEvent(GtkWidget * widget,gpointer data)144 void ComboBoxEntryData::childToggledEvent( GtkWidget* widget, gpointer data) 145 { 146 if( GTK_IS_TOGGLE_BUTTON( widget ) ) 147 { static_cast<ComboBoxEntryData*>(data)->setPressed( widget, gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON( widget ) ) ); } 148 return; 149 } 150 } 151