- DLG_DATA *data;
-
- data = (DLG_DATA*)qmalloc (sizeof(DLG_DATA));
- data->object = object;
- data->buffer = buf;
- data->type = type;
-
- m_pDataList = g_slist_append (m_pDataList, data);
-}
-
-void Dialog::AddModalButton( GtkWidget *widget, int ret ) {
- gtk_signal_connect( GTK_OBJECT( widget ), "clicked",
- GTK_SIGNAL_FUNC( dialog_button_callback ), GINT_TO_POINTER( ret ) );
-}
-
-void Dialog::UpdateData (bool retrieve)
- {
- DLG_DATA *data;
- GSList *lst;
- char buf[32];
-
- if (retrieve)
- {
- for (lst = m_pDataList; lst != NULL; lst = g_slist_next (lst))
- {
- data = (DLG_DATA*)lst->data;
-
- switch (data->type)
- {
- case DLG_CHECK_BOOL:
- *(bool*)data->buffer = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (data->object));
- break;
- case DLG_RADIO_INT:
- {
- GSList *radio = gtk_radio_button_group (GTK_RADIO_BUTTON (data->object));
- *(int*)data->buffer = g_slist_length (radio) - 1;
- for (; radio; radio = g_slist_next (radio))
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio->data)))
- break;
- else
- (*(int*)data->buffer)--;
- } break;
- case DLG_ENTRY_TEXT:
- {
- const char *txt;
- Str* str;
- str = (Str*)data->buffer;
- txt = gtk_entry_get_text (GTK_ENTRY (data->object));
- *str = txt;
- } break;
- case DLG_ENTRY_FLOAT:
- *(float*)data->buffer = atof (gtk_entry_get_text (GTK_ENTRY (data->object)));
- break;
- case DLG_ENTRY_INT:
- *(int*)data->buffer = atoi (gtk_entry_get_text (GTK_ENTRY (data->object)));
- break;
- case DLG_SPIN_FLOAT:
- *(float*)data->buffer = gtk_spin_button_get_value_as_float (GTK_SPIN_BUTTON (data->object));
- break;
- case DLG_SPIN_INT:
- *(int*)data->buffer = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (data->object));
- break;
- case DLG_ADJ_INT:
- *(int*)data->buffer = (int) GTK_ADJUSTMENT (data->object)->value;
- break;
- case DLG_COMBO_INT:
- {
- GList *lst = GTK_LIST (GTK_COMBO (data->object)->list)->children;
- char *label;
- const char *entry;
- int i;
-
- *(int*)data->buffer = -1;
- entry = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (data->object)->entry));
-
- for (i = 0; lst != NULL; lst = g_list_next (lst))
- {
- gtk_label_get (GTK_LABEL (GTK_BIN (lst->data)->child), &label);
-
- if (strcmp (label, entry) == 0)
- {
- *(int*)data->buffer = i;
- break;
- }
- i++;
- }
- }
- break;
- case DLG_COMBO_BOX_INT: {
- *(int*)data->buffer = gtk_combo_box_get_active( GTK_COMBO_BOX( data->object ) );
+DialogDataList& m_data;
+public:
+AddCustomData( DialogDataList& data ) : m_data( data ){
+}
+void apply(
+ typename Widget::Type& widget,
+ const Callback1<typename Widget::Other>& importViewer,
+ const Callback1<const Callback1<typename Widget::Other>&>& exportViewer
+ ) const {
+ m_data.push_back(
+ new CallbackDialogData<typename Widget::Other>(
+ typename Widget::ImportCaller( widget ),
+ typename Widget::ExportCaller( widget ),
+ importViewer,
+ exportViewer
+ )
+ );
+}
+};
+
+// =============================================================================
+// Dialog class
+
+Dialog::Dialog() : m_window( 0 ), m_parent( 0 ){
+}
+
+Dialog::~Dialog(){
+ for ( DialogDataList::iterator i = m_data.begin(); i != m_data.end(); ++i )
+ {
+ ( *i )->release();
+ }
+
+ ASSERT_MESSAGE( m_window == 0, "dialog window not destroyed" );
+}
+
+void Dialog::ShowDlg(){
+ ASSERT_MESSAGE( m_window != 0, "dialog was not constructed" );
+ importData();
+ gtk_widget_show( GTK_WIDGET( m_window ) );
+}
+
+void Dialog::HideDlg(){
+ ASSERT_MESSAGE( m_window != 0, "dialog was not constructed" );
+ exportData();
+ gtk_widget_hide( GTK_WIDGET( m_window ) );
+}
+
+static gint delete_event_callback( GtkWidget *widget, GdkEvent* event, gpointer data ){
+ reinterpret_cast<Dialog*>( data )->HideDlg();
+ reinterpret_cast<Dialog*>( data )->EndModal( eIDCANCEL );
+ return TRUE;
+}
+
+void Dialog::Create(){
+ ASSERT_MESSAGE( m_window == 0, "dialog cannot be constructed" );
+
+ m_window = BuildDialog();
+ g_signal_connect( G_OBJECT( m_window ), "delete_event", G_CALLBACK( delete_event_callback ), this );
+}
+
+void Dialog::Destroy(){
+ ASSERT_MESSAGE( m_window != 0, "dialog cannot be destroyed" );
+
+ gtk_widget_destroy( GTK_WIDGET( m_window ) );
+ m_window = 0;
+}
+
+
+void Dialog::AddBoolToggleData( GtkToggleButton& widget, const BoolImportCallback& importViewer, const BoolExportCallback& exportViewer ){
+ AddCustomData<BoolToggleImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddIntRadioData( GtkRadioButton& widget, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ AddCustomData<IntRadioImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddTextEntryData( GtkEntry& widget, const StringImportCallback& importViewer, const StringExportCallback& exportViewer ){
+ AddCustomData<TextEntryImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddIntEntryData( GtkEntry& widget, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ AddCustomData<IntEntryImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddSizeEntryData( GtkEntry& widget, const SizeImportCallback& importViewer, const SizeExportCallback& exportViewer ){
+ AddCustomData<SizeEntryImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddFloatEntryData( GtkEntry& widget, const FloatImportCallback& importViewer, const FloatExportCallback& exportViewer ){
+ AddCustomData<FloatEntryImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddFloatSpinnerData( GtkSpinButton& widget, const FloatImportCallback& importViewer, const FloatExportCallback& exportViewer ){
+ AddCustomData<FloatSpinnerImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddIntSpinnerData( GtkSpinButton& widget, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ AddCustomData<IntSpinnerImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddIntAdjustmentData( GtkAdjustment& widget, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ AddCustomData<IntAdjustmentImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+void Dialog::AddIntComboData( GtkComboBox& widget, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ AddCustomData<IntComboImportExport>( m_data ).apply( widget, importViewer, exportViewer );
+}
+
+
+void Dialog::AddDialogData( GtkToggleButton& widget, bool& data ){
+ AddData<BoolToggleImportExport, BoolImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkRadioButton& widget, int& data ){
+ AddData<IntRadioImportExport, IntImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkEntry& widget, CopiedString& data ){
+ AddData<TextEntryImportExport, StringImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkEntry& widget, int& data ){
+ AddData<IntEntryImportExport, IntImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkEntry& widget, std::size_t& data ){
+ AddData<SizeEntryImportExport, SizeImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkEntry& widget, float& data ){
+ AddData<FloatEntryImportExport, FloatImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkSpinButton& widget, float& data ){
+ AddData<FloatSpinnerImportExport, FloatImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkSpinButton& widget, int& data ){
+ AddData<IntSpinnerImportExport, IntImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkAdjustment& widget, int& data ){
+ AddData<IntAdjustmentImportExport, IntImportExport>( m_data ).apply( widget, data );
+}
+void Dialog::AddDialogData( GtkComboBox& widget, int& data ){
+ AddData<IntComboImportExport, IntImportExport>( m_data ).apply( widget, data );
+}
+
+void Dialog::exportData(){
+ for ( DialogDataList::iterator i = m_data.begin(); i != m_data.end(); ++i )
+ {
+ ( *i )->exportData();
+ }
+}
+
+void Dialog::importData(){
+ for ( DialogDataList::iterator i = m_data.begin(); i != m_data.end(); ++i )
+ {
+ ( *i )->importData();
+ }
+}
+
+void Dialog::EndModal( EMessageBoxReturn code ){
+ m_modal.loop = 0;
+ m_modal.ret = code;
+}
+
+EMessageBoxReturn Dialog::DoModal(){
+ importData();
+
+ PreModal();
+
+ EMessageBoxReturn ret = modal_dialog_show( m_window, m_modal );
+ ASSERT_NOTNULL( m_window );
+ if ( ret == eIDOK ) {
+ exportData();
+ }
+
+ gtk_widget_hide( GTK_WIDGET( m_window ) );
+
+ PostModal( m_modal.ret );
+
+ return m_modal.ret;
+}
+
+
+GtkWidget* Dialog::addCheckBox( GtkWidget* vbox, const char* name, const char* flag, const BoolImportCallback& importViewer, const BoolExportCallback& exportViewer ){
+ GtkWidget* check = gtk_check_button_new_with_label( flag );
+ gtk_widget_show( check );
+ AddBoolToggleData( *GTK_TOGGLE_BUTTON( check ), importViewer, exportViewer );
+
+ DialogVBox_packRow( GTK_VBOX( vbox ), GTK_WIDGET( DialogRow_new( name, check ) ) );
+ return check;
+}
+
+GtkWidget* Dialog::addCheckBox( GtkWidget* vbox, const char* name, const char* flag, bool& data ){
+ return addCheckBox( vbox, name, flag, BoolImportCaller( data ), BoolExportCaller( data ) );
+}
+
+void Dialog::addCombo( GtkWidget* vbox, const char* name, StringArrayRange values, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ GtkWidget* alignment = gtk_alignment_new( 0.0, 0.5, 0.0, 0.0 );
+ gtk_widget_show( alignment );
+ {
+ GtkWidget* combo = gtk_combo_box_new_text();
+
+ for ( StringArrayRange::Iterator i = values.first; i != values.last; ++i )
+ {
+ gtk_combo_box_append_text( GTK_COMBO_BOX( combo ), *i );
+ }
+
+ AddIntComboData( *GTK_COMBO_BOX( combo ), importViewer, exportViewer );
+
+ gtk_widget_show( combo );
+ gtk_container_add( GTK_CONTAINER( alignment ), combo );
+ }
+
+ GtkTable* row = DialogRow_new( name, alignment );
+ DialogVBox_packRow( GTK_VBOX( vbox ), GTK_WIDGET( row ) );
+}
+
+void Dialog::addCombo( GtkWidget* vbox, const char* name, int& data, StringArrayRange values ){
+ addCombo( vbox, name, values, IntImportCaller( data ), IntExportCaller( data ) );
+}
+
+void Dialog::addSlider( GtkWidget* vbox, const char* name, int& data, gboolean draw_value, const char* low, const char* high, double value, double lower, double upper, double step_increment, double page_increment ){
+#if 0
+ if ( draw_value == FALSE ) {
+ GtkWidget* hbox2 = gtk_hbox_new( FALSE, 0 );
+ gtk_widget_show( hbox2 );
+ gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( hbox2 ), FALSE, FALSE, 0 );
+ {
+ GtkWidget* label = gtk_label_new( low );
+ gtk_widget_show( label );
+ gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );