File indexing completed on 2024-05-12 05:34:33

0001 /*
0002     this file is part of the oxygen gtk engine
0003     SPDX-FileCopyrightText: 2010 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "oxygendialogengine.h"
0009 #include "../oxygengtktypenames.h"
0010 #include "../oxygengtkutils.h"
0011 #include "../config.h"
0012 
0013 #include <string>
0014 
0015 namespace Oxygen
0016 {
0017     //_________________________________________________________
0018     bool DialogEngine::registerWidget( GtkWidget* widget )
0019     {
0020         if( contains( widget ) ) return false;
0021 
0022         GtkDialog* dialog(GTK_DIALOG(widget));
0023 
0024         GtkResponseType responses[]={
0025             GTK_RESPONSE_HELP,
0026             (GtkResponseType)1, // FIXME: This id is commonly used, but doesn't seem to be documented anywhere...
0027             GTK_RESPONSE_OK,
0028             GTK_RESPONSE_YES,
0029             GTK_RESPONSE_ACCEPT,
0030             GTK_RESPONSE_APPLY,
0031             GTK_RESPONSE_REJECT,
0032             GTK_RESPONSE_CLOSE,
0033             GTK_RESPONSE_NO,
0034             GTK_RESPONSE_CANCEL
0035         };
0036 
0037         const int numOfResponseIDs=sizeof(responses)/sizeof(responses[0]);
0038 
0039         #if OXYGEN_DEBUG
0040         std::cerr<<"DialogEngine::registerWidget - Initial response table: ";
0041         for(int i=0; i<numOfResponseIDs; i++)
0042         { std::cerr << Gtk::TypeNames::response( responses[i] ) << ", "; }
0043         std::cerr<<std::endl;
0044         #endif
0045 
0046         int numOfResponsesFound=0;
0047         for(int i=0; i<numOfResponseIDs; i++)
0048         {
0049             GtkWidget* button( Gtk::gtk_dialog_find_button(dialog,responses[i]) );
0050             if( !button ) continue;
0051 
0052             #if OXYGEN_DEBUG
0053             std::cerr << "responseID found: " << Gtk::TypeNames::response( responses[i] ) << "; button \"" << gtk_button_get_label(GTK_BUTTON(button)) << "\""  << std::endl;
0054             #endif
0055             // i is always >= numOfResponsesFound, so this will copy response id nearer to start, but never to end
0056             responses[numOfResponsesFound]=responses[i];
0057             numOfResponsesFound++;
0058 
0059         }
0060 
0061         #if OXYGEN_DEBUG
0062         std::cerr << "DialogEngine::registerWidget - numOfResponsesFound: " << numOfResponsesFound << std::endl;
0063         std::cerr << "List of responses found: { ";
0064 
0065         for(int i=0; i<numOfResponsesFound; i++)
0066         { std::cerr << Gtk::TypeNames::response( responses[i] ) << (i==numOfResponsesFound-1 ? " " :", "); }
0067 
0068         std::cerr << "}; remaining in the list: { ";
0069 
0070         for(int i=numOfResponsesFound; i<numOfResponseIDs; i++)
0071         { std::cerr << Gtk::TypeNames::response( responses[i] ) << (i==numOfResponseIDs-1 ? " " :", "); }
0072 
0073         std::cerr << "}\n";
0074         #endif
0075 
0076         // change order
0077         gtk_dialog_set_alternative_button_order_from_array( dialog, numOfResponsesFound, (gint*) responses );
0078 
0079         // insert in set
0080         _data.insert( widget );
0081 
0082         // call base class
0083         BaseEngine::registerWidget( widget );
0084         return true;
0085 
0086     }
0087 }