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