[nautilus-actions] Fix wrongly modifiable controls on read-only item



commit 1ae2ea84742d43494acf2f0387b0332cedfbf82c
Author: pierre <pierre vfedora10 virtuals pwi>
Date:   Tue Aug 10 14:58:26 2010 +0200

    Fix wrongly modifiable controls on read-only item

 ChangeLog                        |   24 ++++++++++
 TODO                             |    6 +--
 src/nact/nact-gtk-utils.c        |   95 ++++++++++++++++++++++++++++++--------
 src/nact/nact-gtk-utils.h        |    3 +
 src/nact/nact-icommand-tab.c     |    6 ++-
 src/nact/nact-ienvironment-tab.c |   25 +++++-----
 src/nact/nact-iexecution-tab.c   |   16 ++++---
 src/nact/nact-iproperties-tab.c  |    1 +
 src/nact/nact-match-list.c       |   92 +++++++++++++++++++++++--------------
 9 files changed, 190 insertions(+), 78 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index 338059c..5b1d39b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,29 @@
 2010-08-09 Pierre Wieser <pwieser trychlos org>
 
+	Controls are not modifiable for a read-only item.
+
+	* src/nact/nact-gtk-utils.c:
+	* src/nact/nact-gtk-utils.h
+	(nact_gtk_utils_set_initial_state, nact_gtk_utils_reset_initial_state):
+	New functions.
+
+	* src/nact/nact-icommand-tab.c (on_tab_updatable_selection_changed):
+	Manage working directory browse button.
+
+	* src/nact/nact-ienvironment-tab.c (on_tab_updatable_selection_changed):
+	Manage try exec and show if running browse buttons.
+	Manage desktop environment radio buttons.
+
+	* src/nact/nact-iexecution-tab.c (on_tab_updatable_selection_changed):
+	Manage execution mode radio buttons.
+
+	* src/nact/nact-iproperties-tab.c (on_tab_updatable_selection_changed):
+	Manage description text view.
+
+	* src/nact/nact-match-list.c
+	(on_key_pressed_event): Only insert/delete rows if item is editable.
+	(on_must_match_toggled, on_must_not_match_toggled): Manage radio buttons.
+
 	Review notification bufferization.
 
 	* src/core/na-ipivot-consumer.c:
diff --git a/TODO b/TODO
index e7a61c1..a40ac34 100644
--- a/TODO
+++ b/TODO
@@ -6,10 +6,6 @@ N-A BUGS
 - changing conditions in IConditionsTab should trigger an update of the
   example label
 
-- should not be able to remove a line from a condition filter listbox when item is read-only
-
-- should not be able to toggle execution mode when item is read-only
-
 - when error on writing, should let the item modified
 
 TODO
@@ -29,6 +25,8 @@ TODO
   after deleting this default value in the UI, we should write basenames=[] in the I/O provider
   so that we really have an empty list
 
+- nact_gtk_utils_set_editable for radio buttons and combobox
+
 N-A ENHANCEMENTS
 ================
 - allow users to upload/download actions directly from a web repository
diff --git a/src/nact/nact-gtk-utils.c b/src/nact/nact-gtk-utils.c
index ce63cf9..996dd7f 100644
--- a/src/nact/nact-gtk-utils.c
+++ b/src/nact/nact-gtk-utils.c
@@ -57,10 +57,19 @@ void
 nact_gtk_utils_set_editable( GtkObject *widget, gboolean editable )
 {
 	GList *renderers, *irender;
-	GtkTextBuffer *buffer;
-	GtkTextTag *tag;
 
-	if( GTK_IS_ENTRY( widget )){
+	if( GTK_IS_COMBO_BOX_ENTRY( widget )){
+		/* idem as GtkEntry */
+		gtk_editable_set_editable( GTK_EDITABLE( gtk_bin_get_child( GTK_BIN( widget ))), editable );
+		g_object_set( G_OBJECT( gtk_bin_get_child( GTK_BIN( widget ))), "can-focus", editable, NULL );
+		/* disable the listbox button itself */
+		gtk_combo_box_set_button_sensitivity( GTK_COMBO_BOX( widget ), editable ? GTK_SENSITIVITY_ON : GTK_SENSITIVITY_OFF );
+
+	} else if( GTK_IS_COMBO_BOX( widget )){
+			/* disable the listbox button itself */
+			gtk_combo_box_set_button_sensitivity( GTK_COMBO_BOX( widget ), editable ? GTK_SENSITIVITY_ON : GTK_SENSITIVITY_OFF );
+
+	} else if( GTK_IS_ENTRY( widget )){
 		gtk_editable_set_editable( GTK_EDITABLE( widget ), editable );
 		/* removing the frame leads to a disturbing modification of the
 		 * height of the control */
@@ -69,12 +78,8 @@ nact_gtk_utils_set_editable( GtkObject *widget, gboolean editable )
 		g_object_set( G_OBJECT( widget ), "can-focus", editable, NULL );
 
 	} else if( GTK_IS_TEXT_VIEW( widget )){
-		buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW( widget ));
-		tag = gtk_text_buffer_create_tag( buffer,
-				"nact-tag",
-				"editable", editable,
-				"editable-set", TRUE,
-				NULL );
+		g_object_set( G_OBJECT( widget ), "can-focus", editable, NULL );
+		gtk_text_view_set_editable( GTK_TEXT_VIEW( widget ), editable );
 
 	} else if( GTK_IS_TOGGLE_BUTTON( widget )){
 		/* transforms to a quasi standard GtkButton */
@@ -83,16 +88,6 @@ nact_gtk_utils_set_editable( GtkObject *widget, gboolean editable )
 		 * (which is better than nothing) */
 		g_object_set( G_OBJECT( widget ), "can-focus", editable, NULL );
 
-	} else if( GTK_IS_BUTTON( widget )){
-		gtk_widget_set_sensitive( GTK_WIDGET( widget ), editable );
-
-	} else if( GTK_IS_COMBO_BOX_ENTRY( widget )){
-		/* idem as GtkEntry */
-		gtk_editable_set_editable( GTK_EDITABLE( gtk_bin_get_child( GTK_BIN( widget ))), editable );
-		g_object_set( G_OBJECT( gtk_bin_get_child( GTK_BIN( widget ))), "can-focus", editable, NULL );
-		/* disable the listbox button itself */
-		gtk_combo_box_set_button_sensitivity( GTK_COMBO_BOX( widget ), editable ? GTK_SENSITIVITY_ON : GTK_SENSITIVITY_OFF );
-
 	} else if( GTK_IS_TREE_VIEW_COLUMN( widget )){
 		renderers = gtk_cell_layout_get_cells( GTK_CELL_LAYOUT( GTK_TREE_VIEW_COLUMN( widget )));
 		for( irender = renderers ; irender ; irender = irender->next ){
@@ -101,6 +96,68 @@ nact_gtk_utils_set_editable( GtkObject *widget, gboolean editable )
 			}
 		}
 		g_list_free( renderers );
+
+	} else if( GTK_IS_BUTTON( widget )){
+		gtk_widget_set_sensitive( GTK_WIDGET( widget ), editable );
+	}
+}
+
+/**
+ * nact_gtk_utils_set_initial_state:
+ * @button: the #GtkToggleButton activated as initial state.
+ * @func: the corresponding on_toggled function.
+ *
+ * Record on each #GtkRadioButton of the same group the characteristics
+ * of those which is activated as the initial state. This is useful to handle
+ * read-only radio-button.
+ *
+ * As a side-effect, this initial button is set as active here.
+ */
+void
+nact_gtk_utils_set_initial_state( GtkToggleButton *button, GCallback func )
+{
+	GSList *group, *ig;
+	GtkRadioButton *other;
+
+	group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( button ));
+	for( ig = group ; ig ; ig = ig->next ){
+		other = GTK_RADIO_BUTTON( ig->data );
+		g_object_set_data( G_OBJECT( other ), "nact-initial-state-button", button );
+		g_object_set_data( G_OBJECT( other ), "nact-initial-state-func", func );
+	}
+
+	gtk_toggle_button_set_active( button, TRUE );
+}
+
+/**
+ * nact_gtk_utils_reset_initials:
+ * @button: the #GtkToggleButton being toggled.
+ * @func: the corresponding on_toggled function.
+ * @data: data associated with the @func callback.
+ * @active: wheter @button is currently being tried to get activated.
+ *
+ * When clicking on a read-only radio button, this function ensures that
+ * the radio button is not modified. This function should be called only
+ * when the control is read-only (not editable).
+ */
+void
+nact_gtk_utils_reset_initial_state( GtkToggleButton *button, GCallback func, void *data, gboolean active )
+{
+	GtkToggleButton *initial_button;
+	GCallback initial_func;
+
+	if( active ){
+		initial_button = GTK_TOGGLE_BUTTON( g_object_get_data( G_OBJECT( button ), "nact-initial-state-button" ));
+		initial_func = G_CALLBACK( g_object_get_data( G_OBJECT( button ), "nact-initial-state-func" ));
+
+		g_signal_handlers_block_by_func(( gpointer ) button, func, data );
+		g_signal_handlers_block_by_func(( gpointer ) initial_button, initial_func, data );
+
+		gtk_toggle_button_set_active( button, FALSE );
+		gtk_toggle_button_set_active( initial_button, TRUE );
+
+		g_signal_handlers_unblock_by_func(( gpointer ) initial_button, initial_func, data );
+		g_signal_handlers_unblock_by_func(( gpointer ) button, func, data );
 	}
 }
 
diff --git a/src/nact/nact-gtk-utils.h b/src/nact/nact-gtk-utils.h
index 70f9d81..3c5c995 100644
--- a/src/nact/nact-gtk-utils.h
+++ b/src/nact/nact-gtk-utils.h
@@ -45,6 +45,9 @@ G_BEGIN_DECLS
 
 void       nact_gtk_utils_set_editable( GtkObject *widget, gboolean editable );
 
+void       nact_gtk_utils_set_initial_state  ( GtkToggleButton *button, GCallback func );
+void       nact_gtk_utils_reset_initial_state( GtkToggleButton *button, GCallback func, void *data, gboolean active );
+
 /* image utilities
  */
 GdkPixbuf *nact_gtk_utils_get_pixbuf( const gchar *name, GtkWidget *widget, GtkIconSize size );
diff --git a/src/nact/nact-icommand-tab.c b/src/nact/nact-icommand-tab.c
index 0322dd2..2b0501b 100644
--- a/src/nact/nact-icommand-tab.c
+++ b/src/nact/nact-icommand-tab.c
@@ -362,7 +362,7 @@ on_tab_updatable_selection_changed( NactICommandTab *instance, gint count_select
 	gboolean enable_tab;
 	GtkWidget *label_entry, *path_entry, *parameters_entry, *wdir_entry;
 	gchar *label, *path, *parameters, *wdir;
-	GtkButton *path_button;
+	GtkButton *path_button, *wdir_button;
 	GtkButton *legend_button;
 
 	g_return_if_fail( NACT_IS_ICOMMAND_TAB( instance ));
@@ -422,6 +422,10 @@ on_tab_updatable_selection_changed( NactICommandTab *instance, gint count_select
 		gtk_widget_set_sensitive( wdir_entry, profile != NULL );
 		nact_gtk_utils_set_editable( GTK_OBJECT( wdir_entry ), editable );
 
+		wdir_button = GTK_BUTTON( base_window_get_widget( BASE_WINDOW( instance ), "CommandWorkingDirectoryButton" ));
+		gtk_widget_set_sensitive( GTK_WIDGET( wdir_button ), profile != NULL );
+		nact_gtk_utils_set_editable( GTK_OBJECT( wdir_button ), editable );
+
 		st_on_selection_change = FALSE;
 	}
 }
diff --git a/src/nact/nact-ienvironment-tab.c b/src/nact/nact-ienvironment-tab.c
index 5d25448..85c8ff9 100644
--- a/src/nact/nact-ienvironment-tab.c
+++ b/src/nact/nact-ienvironment-tab.c
@@ -404,6 +404,7 @@ on_tab_updatable_selection_changed( NactIEnvironmentTab *instance, gint count_se
 	GtkTreePath *path;
 	GtkTreeSelection *selection;
 	GtkWidget *always_button, *show_button, *notshow_button;
+	GtkWidget *browse_button;
 	GSList *desktops;
 	gchar *text;
 
@@ -453,18 +454,18 @@ on_tab_updatable_selection_changed( NactIEnvironmentTab *instance, gint count_se
 		gtk_toggle_button_set_inconsistent( GTK_TOGGLE_BUTTON( always_button ), context == NULL );
 
 		if( desktops && g_slist_length( desktops )){
-			gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( show_button ), TRUE );
+			nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( show_button ), G_CALLBACK( on_only_show_toggled ));
 			gtk_widget_set_sensitive( GTK_WIDGET( listview ), TRUE );
 
 		} else {
 			desktops = context ? na_object_get_not_show_in( context ) : NULL;
 
 			if( desktops && g_slist_length( desktops )){
-				gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( notshow_button ), TRUE );
+				nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( notshow_button ), G_CALLBACK( on_do_not_show_toggled ));
 				gtk_widget_set_sensitive( GTK_WIDGET( listview ), TRUE );
 
 			} else {
-				gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( always_button ), context != NULL );
+				nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( always_button ), G_CALLBACK( on_show_always_toggled ));
 				gtk_widget_set_sensitive( GTK_WIDGET( listview ), FALSE );
 				desktops = NULL;
 			}
@@ -481,6 +482,9 @@ on_tab_updatable_selection_changed( NactIEnvironmentTab *instance, gint count_se
 		g_free( text );
 		nact_gtk_utils_set_editable( GTK_OBJECT( entry ), editable );
 
+		browse_button = base_window_get_widget( BASE_WINDOW( instance ), "TryExecButton" );
+		nact_gtk_utils_set_editable( GTK_OBJECT( browse_button ), editable );
+
 		entry = base_window_get_widget( BASE_WINDOW( instance ), "ShowIfRegisteredEntry" );
 		text = context ? na_object_get_show_if_registered( context ) : g_strdup( "" );
 		text = text && strlen( text ) ? text : g_strdup( "" );
@@ -502,6 +506,9 @@ on_tab_updatable_selection_changed( NactIEnvironmentTab *instance, gint count_se
 		g_free( text );
 		nact_gtk_utils_set_editable( GTK_OBJECT( entry ), editable );
 
+		browse_button = base_window_get_widget( BASE_WINDOW( instance ), "ShowIfRunningButton" );
+		nact_gtk_utils_set_editable( GTK_OBJECT( browse_button ), editable );
+
 		st_on_selection_change = FALSE;
 
 		path = gtk_tree_path_new_first();
@@ -587,9 +594,7 @@ on_show_always_toggled( GtkToggleButton *toggle_button, NactIEnvironmentTab *ins
 			}
 
 		} else {
-			g_signal_handlers_block_by_func(( gpointer ) toggle_button, on_show_always_toggled, instance );
-			gtk_toggle_button_set_active( toggle_button, !active );
-			g_signal_handlers_unblock_by_func(( gpointer ) toggle_button, on_show_always_toggled, instance );
+			nact_gtk_utils_reset_initial_state( toggle_button, G_CALLBACK( on_show_always_toggled ), instance, active );
 		}
 	}
 }
@@ -627,9 +632,7 @@ on_only_show_toggled( GtkToggleButton *toggle_button, NactIEnvironmentTab *insta
 			}
 
 		} else {
-			g_signal_handlers_block_by_func(( gpointer ) toggle_button, on_only_show_toggled, instance );
-			gtk_toggle_button_set_active( toggle_button, !active );
-			g_signal_handlers_unblock_by_func(( gpointer ) toggle_button, on_only_show_toggled, instance );
+			nact_gtk_utils_reset_initial_state( toggle_button, G_CALLBACK( on_only_show_toggled ), instance, active );
 		}
 	}
 }
@@ -667,9 +670,7 @@ on_do_not_show_toggled( GtkToggleButton *toggle_button, NactIEnvironmentTab *ins
 			}
 
 		} else {
-			g_signal_handlers_block_by_func(( gpointer ) toggle_button, on_do_not_show_toggled, instance );
-			gtk_toggle_button_set_active( toggle_button, !active );
-			g_signal_handlers_unblock_by_func(( gpointer ) toggle_button, on_do_not_show_toggled, instance );
+			nact_gtk_utils_reset_initial_state( toggle_button, G_CALLBACK( on_do_not_show_toggled ), instance, active );
 		}
 	}
 }
diff --git a/src/nact/nact-iexecution-tab.c b/src/nact/nact-iexecution-tab.c
index 49bd350..bf5fd81 100644
--- a/src/nact/nact-iexecution-tab.c
+++ b/src/nact/nact-iexecution-tab.c
@@ -308,13 +308,17 @@ on_tab_updatable_selection_changed( NactIExecutionTab *instance, gint count_sele
 		gtk_toggle_button_set_inconsistent( GTK_TOGGLE_BUTTON( normal_toggle ), profile == NULL );
 
 		if( !strcmp( mode, "Normal" )){
-			gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( normal_toggle ), TRUE );
+			nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( normal_toggle ), G_CALLBACK( on_normal_mode_toggled ));
+
 		} else if( !strcmp( mode, "Terminal" )){
-			gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( terminal_toggle ), TRUE );
+			nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( terminal_toggle ), G_CALLBACK( on_terminal_mode_toggled ));
+
 		} else if( !strcmp( mode, "Embedded" )){
-			gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( embedded_toggle ), TRUE );
+			nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( embedded_toggle ), G_CALLBACK( on_embedded_mode_toggled ));
+
 		} else if( !strcmp( mode, "DisplayOutput" )){
-			gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( display_toggle ), TRUE );
+			nact_gtk_utils_set_initial_state( GTK_TOGGLE_BUTTON( display_toggle ), G_CALLBACK( on_display_mode_toggled ));
+
 		} else {
 			g_warning( "%s: unable to setup execution mode '%s'", thisfn, mode );
 		}
@@ -398,9 +402,7 @@ execution_mode_toggle( NactIExecutionTab *instance, GtkToggleButton *toggle_butt
 			}
 
 		} else {
-			g_signal_handlers_block_by_func(( gpointer ) toggle_button, cb, instance );
-			gtk_toggle_button_set_active( toggle_button, !active );
-			g_signal_handlers_unblock_by_func(( gpointer ) toggle_button, cb, instance );
+			nact_gtk_utils_reset_initial_state( toggle_button, cb, instance, active );
 		}
 	}
 }
diff --git a/src/nact/nact-iproperties-tab.c b/src/nact/nact-iproperties-tab.c
index 0a15303..cb440f7 100644
--- a/src/nact/nact-iproperties-tab.c
+++ b/src/nact/nact-iproperties-tab.c
@@ -293,6 +293,7 @@ on_tab_updatable_selection_changed( NactIPropertiesTab *instance, gint count_sel
 		label = item ? na_object_get_description( item ) : g_strdup( "" );
 		gtk_text_buffer_set_text( buffer, label, -1 );
 		g_free( label );
+		nact_gtk_utils_set_editable( GTK_OBJECT( label_widget ), editable );
 
 		shortcut_button = base_window_get_widget( BASE_WINDOW( instance ), "SuggestedShortcutButton" );
 		shortcut = item ? na_object_get_shortcut( item ) : g_strdup( "" );
diff --git a/src/nact/nact-match-list.c b/src/nact/nact-match-list.c
index 20422c6..e8659c4 100644
--- a/src/nact/nact-match-list.c
+++ b/src/nact/nact-match-list.c
@@ -545,13 +545,17 @@ on_key_pressed_event( GtkWidget *widget, GdkEventKey *event, MatchListStr *data
 	}
 
 	if( event->keyval == GDK_Insert || event->keyval == GDK_KP_Insert ){
-		insert_new_row( data );
-		stop = TRUE;
+		if( data->editable_item ){
+			insert_new_row( data );
+			stop = TRUE;
+		}
 	}
 
 	if( event->keyval == GDK_Delete || event->keyval == GDK_KP_Delete ){
-		delete_current_row( data );
-		stop = TRUE;
+		if( data->editable_item ){
+			delete_current_row( data );
+			stop = TRUE;
+		}
 	}
 
 	return( stop );
@@ -579,32 +583,41 @@ on_must_match_toggled( GtkCellRendererToggle *cell_renderer, gchar *path_str, Ma
 	NAIContext *context;
 	GSList *filters;
 	gchar *to_remove;
+	gboolean active;
 
 	/*gboolean is_active = gtk_cell_renderer_toggle_get_active( cell_renderer );
 	g_debug( "%s: is_active=%s", thisfn, is_active ? "True":"False" );*/
 
-	if( !gtk_cell_renderer_toggle_get_active( cell_renderer )){
-		context = nact_main_tab_get_context( NACT_MAIN_WINDOW( data->window ), NULL );
-		g_return_if_fail( NA_IS_ICONTEXT( context ));
+	active = gtk_cell_renderer_toggle_get_active( cell_renderer );
 
-		set_match_status( path_str, TRUE, FALSE, data );
+	if( data->editable_item ){
+		if( !active ){
+			context = nact_main_tab_get_context( NACT_MAIN_WINDOW( data->window ), NULL );
+			g_return_if_fail( NA_IS_ICONTEXT( context ));
 
-		filter = get_filter_from_path( path_str, data );
-		filters = ( *data->pget )( context );
+			set_match_status( path_str, TRUE, FALSE, data );
 
-		if( filters ){
-			to_remove = g_strdup_printf( "!%s", filter );
-			filters = na_core_utils_slist_remove_ascii( filters, to_remove );
-			g_free( to_remove );
-		}
+			filter = get_filter_from_path( path_str, data );
+			filters = ( *data->pget )( context );
 
-		filters = g_slist_prepend( filters, g_strdup( filter ));
-		( *data->pset )( context, filters );
+			if( filters ){
+				to_remove = g_strdup_printf( "!%s", filter );
+				filters = na_core_utils_slist_remove_ascii( filters, to_remove );
+				g_free( to_remove );
+			}
 
-		na_core_utils_slist_free( filters );
-		g_free( filter );
+			filters = g_slist_prepend( filters, g_strdup( filter ));
+			( *data->pset )( context, filters );
 
-		g_signal_emit_by_name( G_OBJECT( data->window ), TAB_UPDATABLE_SIGNAL_ITEM_UPDATED, context, FALSE );
+			na_core_utils_slist_free( filters );
+			g_free( filter );
+
+			g_signal_emit_by_name( G_OBJECT( data->window ), TAB_UPDATABLE_SIGNAL_ITEM_UPDATED, context, FALSE );
+		}
+	} else {
+		g_signal_handlers_block_by_func(( gpointer ) cell_renderer, on_must_match_toggled, data );
+		gtk_cell_renderer_toggle_set_active( cell_renderer, !active );
+		g_signal_handlers_unblock_by_func(( gpointer ) cell_renderer, on_must_match_toggled, data );
 	}
 }
 
@@ -622,31 +635,40 @@ on_must_not_match_toggled( GtkCellRendererToggle *cell_renderer, gchar *path_str
 	NAIContext *context;
 	GSList *filters;
 	gchar *to_add;
+	gboolean active;
 
 	/*gboolean is_active = gtk_cell_renderer_toggle_get_active( cell_renderer );
 	g_debug( "%s: is_active=%s", thisfn, is_active ? "True":"False" );*/
 
-	if( !gtk_cell_renderer_toggle_get_active( cell_renderer )){
-		context = nact_main_tab_get_context( NACT_MAIN_WINDOW( data->window ), NULL );
-		g_return_if_fail( NA_IS_ICONTEXT( context ));
+	active = gtk_cell_renderer_toggle_get_active( cell_renderer );
 
-		set_match_status( path_str, FALSE, TRUE, data );
+	if( data->editable_item ){
+		if( !active ){
+			context = nact_main_tab_get_context( NACT_MAIN_WINDOW( data->window ), NULL );
+			g_return_if_fail( NA_IS_ICONTEXT( context ));
 
-		filter = get_filter_from_path( path_str, data );
-		filters = ( *data->pget )( context );
+			set_match_status( path_str, FALSE, TRUE, data );
 
-		if( filters ){
-			filters = na_core_utils_slist_remove_ascii( filters, filter );
-		}
+			filter = get_filter_from_path( path_str, data );
+			filters = ( *data->pget )( context );
 
-		to_add = g_strdup_printf( "!%s", filter );
-		filters = g_slist_prepend( filters, to_add );
-		( *data->pset )( context, filters );
+			if( filters ){
+				filters = na_core_utils_slist_remove_ascii( filters, filter );
+			}
 
-		na_core_utils_slist_free( filters );
-		g_free( filter );
+			to_add = g_strdup_printf( "!%s", filter );
+			filters = g_slist_prepend( filters, to_add );
+			( *data->pset )( context, filters );
 
-		g_signal_emit_by_name( G_OBJECT( data->window ), TAB_UPDATABLE_SIGNAL_ITEM_UPDATED, context, FALSE );
+			na_core_utils_slist_free( filters );
+			g_free( filter );
+
+			g_signal_emit_by_name( G_OBJECT( data->window ), TAB_UPDATABLE_SIGNAL_ITEM_UPDATED, context, FALSE );
+		}
+	} else {
+		g_signal_handlers_block_by_func(( gpointer ) cell_renderer, on_must_not_match_toggled, data );
+		gtk_cell_renderer_toggle_set_active( cell_renderer, !active );
+		g_signal_handlers_unblock_by_func(( gpointer ) cell_renderer, on_must_not_match_toggled, data );
 	}
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]