1 #ifndef oxygencomboboxengine_h
2 #define oxygencomboboxengine_h
3 /*
4 * this file is part of the oxygen gtk engine
5 * Copyright (c) 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
6 *
7 * This  library is free  software; you can  redistribute it and/or
8 * modify it  under  the terms  of the  GNU Lesser  General  Public
9 * License  as published  by the Free  Software  Foundation; either
10 * version 2 of the License, or(at your option ) any later version.
11 *
12 * This library is distributed  in the hope that it will be useful,
13 * but  WITHOUT ANY WARRANTY; without even  the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License  along  with  this library;  if not,  write to  the Free
19 * Software Foundation, Inc., 51  Franklin St, Fifth Floor, Boston,
20 * MA 02110-1301, USA.
21 */
22 
23 
24 #include "oxygengenericengine.h"
25 #include "oxygendatamap.h"
26 #include "oxygencomboboxdata.h"
27 
28 #include <gtk/gtk.h>
29 
30 namespace Oxygen
31 {
32     //! forward declaration
33     class Animations;
34 
35     //! stores data associated to editable comboboxes
36     /*!
37     ensures that the text  and the button of editable comboboxes
38     gets hovered and focus flags at the same time
39     */
40     class ComboBoxEngine: public GenericEngine<ComboBoxData>
41     {
42 
43         public:
44 
45         //! constructor
ComboBoxEngine(Animations * widget)46         ComboBoxEngine( Animations* widget ):
47             GenericEngine<ComboBoxData>( widget )
48             {}
49 
50         //! destructor
~ComboBoxEngine(void)51         virtual ~ComboBoxEngine( void )
52         {}
53 
54         //!@name modifiers
55         //@{
56 
57         //! assign button to data matching widget
setButton(GtkWidget * widget,GtkWidget * value)58         void setButton( GtkWidget* widget, GtkWidget* value )
59         { data().value( widget ).setButton( value ); }
60 
61         //! button focus
setButtonFocus(GtkWidget * widget,bool value)62         void setButtonFocus( GtkWidget* widget, bool value )
63         { data().value( widget ).setButtonFocus( value ); }
64 
65         //! register child
registerChild(GtkWidget * widget,GtkWidget * child)66         void registerChild( GtkWidget* widget, GtkWidget* child )
67         { data().value( widget ).registerChild( child ); }
68 
69         //@}
70 
71         //!@name accessors
72         //@{
73 
74         //! find combobox matching widget
75         /*! the widget can be any of those in a visible list */
76         inline GtkWidget* find( GtkWidget* );
77 
78         //! true if either button or is pressed
pressed(GtkWidget * widget)79         bool pressed( GtkWidget* widget )
80         { return data().value( widget ).pressed(); }
81 
82         //! true if either button or entry has focus
hasFocus(GtkWidget * widget)83         bool hasFocus( GtkWidget* widget )
84         { return data().value( widget ).hasFocus(); }
85 
86         //! true if comboBox is hovered
hovered(GtkWidget * widget)87         bool hovered( GtkWidget* widget )
88         { return data().value( widget ).hovered(); }
89 
90         //@}
91 
92     };
93 
94     //_________________________________________________
find(GtkWidget * value)95     GtkWidget* ComboBoxEngine::find( GtkWidget* value )
96     {
97         GtkWidget* topLevel( gtk_widget_get_toplevel( value ) );
98         DataMap<ComboBoxData>::Map& dataMap( data().map() );
99         for( DataMap<ComboBoxData>::Map::iterator iter = dataMap.begin(); iter != dataMap.end(); iter++ )
100         {
101             if( iter->second.pressed() )
102             {
103                 iter->second.setList( topLevel );
104                 return iter->first;
105             }
106         }
107 
108         for( DataMap<ComboBoxData>::Map::iterator iter = dataMap.begin(); iter != dataMap.end(); iter++ )
109         { if( iter->second.list() == topLevel ) return iter->first; }
110 
111         return 0L;
112 
113     }
114 
115 }
116 
117 #endif
118