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