+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_TRUE( (bool) m_window );
+ if ( ret == eIDOK ) {
+ exportData();
+ }
+
+ gtk_widget_hide( GTK_WIDGET( m_window ) );
+
+ PostModal( m_modal.ret );
+
+ return m_modal.ret;
+}
+
+
+ui::CheckButton Dialog::addCheckBox( ui::Widget vbox, const char* name, const char* flag, const BoolImportCallback& importViewer, const BoolExportCallback& exportViewer ){
+ auto check = ui::CheckButton( flag );
+ check.show();
+ AddBoolToggleData( *GTK_TOGGLE_BUTTON( check ), importViewer, exportViewer );
+
+ DialogVBox_packRow( ui::VBox(GTK_VBOX( vbox )), ui::Widget(GTK_WIDGET( DialogRow_new( name, check ) ) ));
+ return check;
+}
+
+ui::CheckButton Dialog::addCheckBox( ui::Widget vbox, const char* name, const char* flag, bool& data ){
+ return addCheckBox( vbox, name, flag, BoolImportCaller( data ), BoolExportCaller( data ) );
+}
+
+void Dialog::addCombo( ui::Widget vbox, const char* name, StringArrayRange values, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ auto alignment = ui::Alignment( 0.0, 0.5, 0.0, 0.0 );
+ alignment.show();
+ {
+ auto combo = ui::ComboBoxText();
+
+ for ( StringArrayRange::Iterator i = values.first; i != values.last; ++i )
+ {
+ gtk_combo_box_text_append_text( GTK_COMBO_BOX_TEXT( combo ), *i );
+ }
+
+ AddIntComboData( *GTK_COMBO_BOX( combo ), importViewer, exportViewer );
+
+ combo.show();
+ alignment.add(combo);
+ }
+
+ auto row = DialogRow_new( name, alignment );
+ DialogVBox_packRow( ui::VBox(GTK_VBOX(vbox)), row );
+}
+
+void Dialog::addCombo( ui::Widget vbox, const char* name, int& data, StringArrayRange values ){
+ addCombo( vbox, name, values, IntImportCaller( data ), IntExportCaller( data ) );
+}
+
+void Dialog::addSlider( ui::Widget 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 ) {
+ ui::Widget hbox2 = ui::HBox( FALSE, 0 );
+ hbox2.show();
+ gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( hbox2 ), FALSE, FALSE, 0 );
+ {
+ ui::Widget label = ui::Label( low );
+ label.show();
+ gtk_box_pack_start( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );
+ }
+ {
+ ui::Widget label = ui::Label( high );
+ label.show();
+ gtk_box_pack_end( GTK_BOX( hbox2 ), label, FALSE, FALSE, 0 );
+ }
+ }
+#endif
+
+ // adjustment
+ auto adj = ui::Adjustment( value, lower, upper, step_increment, page_increment, 0 );
+ AddIntAdjustmentData( *GTK_ADJUSTMENT(adj), IntImportCaller( data ), IntExportCaller( data ) );
+
+ // scale
+ auto alignment = ui::Alignment( 0.0, 0.5, 1.0, 0.0 );
+ alignment.show();
+
+ ui::Widget scale = ui::HScale( adj );
+ gtk_scale_set_value_pos( GTK_SCALE( scale ), GTK_POS_LEFT );
+ scale.show();
+ alignment.add(scale);
+
+ gtk_scale_set_draw_value( GTK_SCALE( scale ), draw_value );
+ gtk_scale_set_digits( GTK_SCALE( scale ), 0 );
+
+ auto row = DialogRow_new( name, alignment );
+ DialogVBox_packRow( ui::VBox(GTK_VBOX( vbox )), row );
+}
+
+void Dialog::addRadio( ui::Widget vbox, const char* name, StringArrayRange names, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ auto alignment = ui::Alignment( 0.0, 0.5, 0.0, 0.0 );
+ alignment.show();;
+ {
+ RadioHBox radioBox = RadioHBox_new( names );
+ alignment.add(radioBox.m_hbox);
+ AddIntRadioData( *GTK_RADIO_BUTTON( radioBox.m_radio ), importViewer, exportViewer );
+ }
+
+ auto row = DialogRow_new( name, alignment );
+ DialogVBox_packRow( ui::VBox(GTK_VBOX( vbox )), row );
+}
+
+void Dialog::addRadio( ui::Widget vbox, const char* name, int& data, StringArrayRange names ){
+ addRadio( vbox, name, names, IntImportCaller( data ), IntExportCaller( data ) );
+}
+
+void Dialog::addRadioIcons( ui::Widget vbox, const char* name, StringArrayRange icons, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){
+ ui::Widget table = ui::Table( 2, icons.last - icons.first, FALSE );
+ table.show();;