Commit 00d9c396 authored by Pierre Wieser's avatar Pierre Wieser

Improve pre-v2 to v3 conversions

Fix bug where only one successfull conversion was executed (instead of all).
Fix bug of not displaying matchcase status in NACT.
Improve conversion from '%d/%f' to '%f'.
parent 50481473
2010-08-19 Pierre Wieser <pwieser@trychlos.org>
* src/api/na-object-item.h:
* src/core/na-object-item.c
(na_object_item_deals_with_version): New function.
* src/api/na-object-profile.h:
* src/core/na-object-profile.c
(na_object_profile_convert_v2_to_last): New function.
* src/core/na-object-action.c:
* src/core/na-object-menu.c
(ifactory_object_read_start): Removed (unused) function.
* src/io-xml/naxml-reader.c (naxml_reader_read_done): Cleanup code.
* src/nact/nact-ibasenames-tab.c (on_tab_updatable_selection_changed):
Display matchcase status for the current context.
2010-08-18 Pierre Wieser <pwieser@trychlos.org>
* src/core/na-object-profile.c (convert_pre_v3_parameters_str):
......
......@@ -92,6 +92,7 @@ void na_object_item_count_items( GList *items, gint *menus, gint *actions
void na_object_item_unref_items( GList *items );
void na_object_item_unref_items_rec( GList *items );
void na_object_item_deals_with_version ( NAObjectItem *item );
void na_object_item_rebuild_children_slist( NAObjectItem *item );
G_END_DECLS
......
......@@ -79,6 +79,8 @@ GType na_object_profile_get_type( void );
NAObjectProfile *na_object_profile_new( void );
NAObjectProfile *na_object_profile_new_with_defaults( void );
void na_object_profile_convert_v2_to_last( NAObjectProfile *profile );
G_END_DECLS
#endif /* __NAUTILUS_ACTIONS_API_NA_OBJECT_PROFILE_H__ */
......@@ -79,7 +79,6 @@ static guint ifactory_object_get_version( const NAIFactoryObject *instanc
static NADataGroup *ifactory_object_get_groups( const NAIFactoryObject *instance );
static gboolean ifactory_object_are_equal( const NAIFactoryObject *a, const NAIFactoryObject *b );
static gboolean ifactory_object_is_valid( const NAIFactoryObject *object );
static void ifactory_object_read_start( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages );
static void ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages );
static guint ifactory_object_write_start( NAIFactoryObject *instance, const NAIFactoryProvider *writer, void *writer_data, GSList **messages );
static guint ifactory_object_write_done( NAIFactoryObject *instance, const NAIFactoryProvider *writer, void *writer_data, GSList **messages );
......@@ -87,9 +86,8 @@ static guint ifactory_object_write_done( NAIFactoryObject *instance, cons
static void icontext_iface_init( NAIContextInterface *iface );
static gboolean icontext_is_candidate( NAIContext *object, guint target, GList *selection );
static void read_done_convert_v1_to_v2( NAIFactoryObject *instance );
static gboolean read_done_convert_v1_to_last( NAIFactoryObject *instance );
static void read_done_deals_with_toolbar_label( NAIFactoryObject *instance );
static void read_done_deals_with_version( NAIFactoryObject *instance );
static guint write_done_write_profiles( NAIFactoryObject *instance, const NAIFactoryProvider *writer, void *writer_data, GSList **messages );
......@@ -295,7 +293,7 @@ ifactory_object_iface_init( NAIFactoryObjectInterface *iface )
iface->copy = NULL;
iface->are_equal = ifactory_object_are_equal;
iface->is_valid = ifactory_object_is_valid;
iface->read_start = ifactory_object_read_start;
iface->read_start = NULL;
iface->read_done = ifactory_object_read_done;
iface->write_start = ifactory_object_write_start;
iface->write_done = ifactory_object_write_done;
......@@ -327,11 +325,6 @@ ifactory_object_is_valid( const NAIFactoryObject *object )
return( object_object_is_valid( NA_OBJECT_ACTION( object )));
}
static void
ifactory_object_read_start( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages )
{
}
/*
* at this time, we don't yet have readen the profiles as this will be
* done in ifactory_provider_read_done - we so just be able to deal with
......@@ -340,17 +333,24 @@ ifactory_object_read_start( NAIFactoryObject *instance, const NAIFactoryProvider
static void
ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages )
{
guint iversion;
g_debug( "na_object_action_ifactory_object_read_done: instance=%p", ( void * ) instance );
na_object_item_deals_with_version( NA_OBJECT_ITEM( instance ));
/* may attach a new profile if we detect a pre-v2 action
* the v1_to_v2 conversion must be followed by a v2_to_v3 one
*/
read_done_convert_v1_to_v2( instance );
iversion = na_object_get_iversion( instance );
if( iversion < 2 ){
read_done_convert_v1_to_last( instance );
}
/* deals with obsoleted data, i.e. data which may have been written in the past
* but are no long written by now
* but are no long written by now - not relevant for a menu
*/
read_done_deals_with_toolbar_label( instance );
read_done_deals_with_version( instance );
/* prepare the context after the reading
*/
......@@ -402,45 +402,25 @@ icontext_is_candidate( NAIContext *object, guint target, GList *selection )
/*
* do we have a pre-v2 action ?
* it is be identified by an version = "1.x"
* or by any data found in data_def_action_v1 (defined in na-object-action-factory.c)
* -> move obsoleted data to a new profile, updating the version string
* any data found in data_def_action_v1 (defined in na-object-action-factory.c)
* is obsoleted and moved to a new profile
*
* actions readen from .desktop already have iversion=3 (cf. desktop_read_start)
* and v1 actions may only come from xml or gconf
* actions readen from .desktop already have iversion=3 (cf. desktop_read_start)
* and v1 actions may only come from xml or gconf
*
* returns TRUE if this actually was a v1 action which has been converted to v2
*/
static void
read_done_convert_v1_to_v2( NAIFactoryObject *instance )
static gboolean
read_done_convert_v1_to_last( NAIFactoryObject *instance )
{
static const gchar *thisfn = "na_object_action_read_done_convert_v1_to_v2";
guint iversion;
gchar *version;
static const gchar *thisfn = "na_object_action_read_done_read_done_convert_v1_to_last";
GList *to_move;
NADataDef *def;
NADataBoxed *boxed;
GList *ibox;
NAObjectProfile *profile;
/* check for new numeric version
*/
iversion = na_object_get_iversion( instance );
if( iversion >= 2 ){
return;
}
/* check for older alpha version
* was not set in 2.30 serie
*/
version = na_object_get_version( instance );
if( version ){
iversion = atoi( version );
g_free( version );
}
if( iversion >= 2 ){
return;
}
/* we so have here a not-versioned action, in very old 1.x or in 2.30
* search for old data in the body: this is only possible before profiles
/* search for old data in the body: this is only possible before profiles
* because starting with contexts, iversion was written
*/
to_move = NULL;
......@@ -457,7 +437,7 @@ read_done_convert_v1_to_v2( NAIFactoryObject *instance )
}
if( !to_move ){
return;
return( FALSE );
}
/* now create a new profile
......@@ -475,7 +455,8 @@ read_done_convert_v1_to_v2( NAIFactoryObject *instance )
}
na_factory_object_set_defaults( NA_IFACTORY_OBJECT( profile ));
na_object_set_version( instance, "2.0" );
na_object_profile_convert_v2_to_last( profile );
return( TRUE );
}
/*
......@@ -504,36 +485,6 @@ read_done_deals_with_toolbar_label( NAIFactoryObject *instance )
g_free( toolbar_label );
}
/*
* manage the conversion from version string to version number
* -> pre-v2 actions have already been converted to a version string "2.0"
* -> if we have here no version string nor version number, then we may
* consider that this is an item written by the 2.30 N-A version
* so we just force a version number to 2
*/
static void
read_done_deals_with_version( NAIFactoryObject *instance )
{
guint version_uint;
gchar *version_str;
version_uint = na_object_get_iversion( instance );
if( !version_uint ){
version_str = na_object_get_version( instance );
if( !version_str || !strlen( version_str )){
g_free( version_str );
version_str = g_strdup( "2.0" );
}
version_uint = atoi( version_str );
na_object_set_iversion( instance, version_uint );
g_free( version_str );
}
}
/*
* write the profiles of the action
* note that subitems string list has been rebuilt on write_start
......
......@@ -32,6 +32,7 @@
#include <config.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <uuid/uuid.h>
......@@ -695,6 +696,46 @@ na_object_item_unref_items_rec( GList *items )
g_list_free( items );
}
/**
* na_object_item_deals_with_version:
* @item: this #NAObjectItem-derived object.
*
* Just after the @item has been readen from NAIFactoryProvider, setup
* the version. This is needed because some conversions may occur in
* this object.
*
* Note that there is only some 2.x versions where the version string
* was not systematically written. If @item has been readen from a
* .desktop file, then iversion is already set to (at least) 3.
*/
void
na_object_item_deals_with_version( NAObjectItem *item )
{
guint version_uint;
gchar *version_str;
g_return_if_fail( NA_IS_OBJECT_ITEM( item ));
if( !item->private->dispose_has_run ){
version_uint = na_object_get_iversion( item );
if( !version_uint ){
version_str = na_object_get_version( item );
if( !version_str || !strlen( version_str )){
g_free( version_str );
version_str = g_strdup( "2.0" );
}
version_uint = atoi( version_str );
na_object_set_iversion( item, version_uint );
g_free( version_str );
}
}
}
/**
* na_object_item_rebuild_children_slist:
* @item: this #NAObjectItem-derived object.
......
......@@ -77,7 +77,6 @@ static guint ifactory_object_get_version( const NAIFactoryObject *instanc
static NADataGroup *ifactory_object_get_groups( const NAIFactoryObject *instance );
static gboolean ifactory_object_are_equal( const NAIFactoryObject *a, const NAIFactoryObject *b );
static gboolean ifactory_object_is_valid( const NAIFactoryObject *object );
static void ifactory_object_read_start( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages );
static void ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages );
static guint ifactory_object_write_start( NAIFactoryObject *instance, const NAIFactoryProvider *writer, void *writer_data, GSList **messages );
static guint ifactory_object_write_done( NAIFactoryObject *instance, const NAIFactoryProvider *writer, void *writer_data, GSList **messages );
......@@ -286,7 +285,7 @@ ifactory_object_iface_init( NAIFactoryObjectInterface *iface )
iface->copy = NULL;
iface->are_equal = ifactory_object_are_equal;
iface->is_valid = ifactory_object_is_valid;
iface->read_start = ifactory_object_read_start;
iface->read_start = NULL;
iface->read_done = ifactory_object_read_done;
iface->write_start = ifactory_object_write_start;
iface->write_done = ifactory_object_write_done;
......@@ -318,19 +317,16 @@ ifactory_object_is_valid( const NAIFactoryObject *object )
return( menu_is_valid( NA_OBJECT_MENU( object )));
}
static void
ifactory_object_read_start( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages )
{
}
static void
ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider *reader, void *reader_data, GSList **messages )
{
na_object_item_deals_with_version( NA_OBJECT_ITEM( instance ));
/* prepare the context after the reading
*/
na_icontext_read_done( NA_ICONTEXT( instance ));
/* last, set other action defaults
/* last, set other menu defaults
*/
na_factory_object_set_defaults( instance );
}
......
......@@ -90,6 +90,7 @@ static gboolean convert_pre_v3_parameters( NAObjectProfile *profile );
static gboolean convert_pre_v3_parameters_str( gchar *str );
static gboolean convert_pre_v3_multiple( NAObjectProfile *profile );
static gboolean convert_pre_v3_isfiledir( NAObjectProfile *profile );
static void read_done_ending( NAObjectProfile *profile );
static void split_path_parameters( NAObjectProfile *profile );
static gboolean profile_is_valid( const NAObjectProfile *profile );
static gboolean is_valid_path_parameters( const NAObjectProfile *profile );
......@@ -346,27 +347,10 @@ ifactory_object_read_done( NAIFactoryObject *instance, const NAIFactoryProvider
g_debug( "%s: iversion=%d", thisfn, iversion );
if( iversion < 3 ){
if( convert_pre_v3_parameters( NA_OBJECT_PROFILE( instance )) ||
convert_pre_v3_multiple( NA_OBJECT_PROFILE( instance )) ||
convert_pre_v3_isfiledir( NA_OBJECT_PROFILE( instance ))){
na_object_set_iversion( action, 3 );
}
na_object_profile_convert_v2_to_last( NA_OBJECT_PROFILE( instance ));
}
/* split path+parameters
* not done in io-desktop because some actions may have all arguments in path
*/
split_path_parameters( NA_OBJECT_PROFILE( instance ));
/* prepare the context after the reading
*/
na_icontext_read_done( NA_ICONTEXT( instance ));
/* last, set other action defaults
*/
na_factory_object_set_defaults( instance );
read_done_ending( NA_OBJECT_PROFILE( instance ));
}
static guint
......@@ -539,6 +523,7 @@ convert_pre_v3_multiple( NAObjectProfile *profile )
accept_multiple = na_object_is_multiple( profile );
selection_count = g_strdup( accept_multiple ? ">0" : "=1" );
na_object_set_selection_count( profile, selection_count );
g_debug( "na_object_profile_convert_pre_v3_multiple: set selection_count=%s", selection_count );
g_free( selection_count );
return( TRUE );
......@@ -601,6 +586,23 @@ convert_pre_v3_isfiledir( NAObjectProfile *profile )
return( converted );
}
static void
read_done_ending( NAObjectProfile *profile )
{
/* split path+parameters
* not done in io-desktop because some actions may have all arguments in path
*/
split_path_parameters( profile );
/* prepare the context after the reading
*/
na_icontext_read_done( NA_ICONTEXT( profile ));
/* last, set other action defaults
*/
na_factory_object_set_defaults( NA_IFACTORY_OBJECT( profile ));
}
static void
split_path_parameters( NAObjectProfile *profile )
{
......@@ -728,3 +730,32 @@ na_object_profile_new_with_defaults( void )
return( profile );
}
/**
* na_object_profile_convert_v2_to_last:
*
* Converts to v3 a @profile which has just been created from a pre-v2 action.
*/
void
na_object_profile_convert_v2_to_last( NAObjectProfile *profile )
{
NAObjectAction *action;
guint iversion;
gboolean parms_converted, multiple_converted, isfiledir_converted;
g_return_if_fail( NA_IS_OBJECT_PROFILE( profile ));
action = NA_OBJECT_ACTION( na_object_get_parent( profile ));
iversion = na_object_get_iversion( action );
g_return_if_fail( iversion < 3 );
parms_converted = convert_pre_v3_parameters( profile );
multiple_converted = convert_pre_v3_multiple( profile );
isfiledir_converted = convert_pre_v3_isfiledir( profile );
if( parms_converted || multiple_converted || isfiledir_converted ){
na_object_set_iversion( action, 3 );
}
read_done_ending( profile );
}
......@@ -159,12 +159,10 @@ static RootNodeStr st_root_node_str[] = {
static void read_start_profile_attach_profile( NAXMLReader *reader, NAObjectProfile *profile );
static gboolean read_data_is_path_adhoc_for_object( NAXMLReader *reader, const NAIFactoryObject *object, xmlChar *text );
static NADataBoxed *read_data_boxed_from_node( NAXMLReader *reader, xmlChar *text, xmlNode *parent, const NADataDef *def );
static void read_done_item( NAXMLReader *reader, NAObjectItem *item );
static void read_done_item_set_localized_icon( NAXMLReader *reader, NAObjectItem *item );
static void read_done_action( NAXMLReader *reader, NAObjectAction *action );
static void read_done_action_read_profiles( NAXMLReader *reader, NAObjectAction *action );
static gchar *read_done_action_get_next_profile_id( NAXMLReader *reader );
static void read_done_action_load_profile( NAXMLReader *reader, const gchar *profile_id );
static void read_done_profile( NAXMLReader *reader, NAObjectProfile *profile );
static void read_done_profile_set_localized_label( NAXMLReader *reader, NAObjectProfile *profile );
static guint reader_parse_xmldoc( NAXMLReader *reader );
......@@ -757,26 +755,20 @@ naxml_reader_read_done( const NAIFactoryProvider *provider, void *reader_data, c
( void * ) messages );
if( NA_IS_OBJECT_ITEM( object )){
read_done_item( NAXML_READER( reader_data ), NA_OBJECT_ITEM( object ));
read_done_item_set_localized_icon( NAXML_READER( reader_data ), NA_OBJECT_ITEM( object ));
}
if( NA_IS_OBJECT_ACTION( object )){
read_done_action( NAXML_READER( reader_data ), NA_OBJECT_ACTION( object ));
read_done_action_read_profiles( NAXML_READER( reader_data ), NA_OBJECT_ACTION( object ));
}
if( NA_IS_OBJECT_PROFILE( object )){
read_done_profile( NAXML_READER( reader_data ), NA_OBJECT_PROFILE( object ));
read_done_profile_set_localized_label( NAXML_READER( reader_data ), NA_OBJECT_PROFILE( object ));
}
g_debug( "%s: quitting for %s at %p", thisfn, G_OBJECT_TYPE_NAME( object ), ( void * ) object );
}
static void
read_done_item( NAXMLReader *reader, NAObjectItem *item )
{
read_done_item_set_localized_icon( reader, item );
}
/*
* just having readen this NAObjectItem
* so deals with unlocalized/localized icon name/path
......@@ -812,7 +804,7 @@ read_done_item_set_localized_icon( NAXMLReader *reader, NAObjectItem *item )
* Also note that profiles order has been introduced in 2.29 serie
*/
static void
read_done_action( NAXMLReader *reader, NAObjectAction *action )
read_done_action_read_profiles( NAXMLReader *reader, NAObjectAction *action )
{
GSList *order, *ip;
gchar *profile_id;
......@@ -897,12 +889,6 @@ read_done_action_load_profile( NAXMLReader *reader, const gchar *profile_id )
&reader->private->parms->messages );
}
static void
read_done_profile( NAXMLReader *reader, NAObjectProfile *profile )
{
read_done_profile_set_localized_label( reader, profile );
}
/*
* just having readen this NAObjectProfile
* so deals with unlocalized/localized desc-name
......
......@@ -37,6 +37,7 @@
#include <api/na-object-api.h>
#include "nact-main-tab.h"
#include "nact-gtk-utils.h"
#include "nact-match-list.h"
#include "nact-ibasenames-tab.h"
......@@ -239,11 +240,26 @@ nact_ibasenames_tab_dispose( NactIBasenamesTab *instance )
static void
on_tab_updatable_selection_changed( BaseWindow *window, gint count_selected )
{
st_on_selection_change = TRUE;
NAIContext *context;
gboolean editable;
GtkToggleButton *matchcase_button;
gboolean matchcase;
if( st_initialized && !st_finalized ){
nact_match_list_on_selection_changed( window, ITAB_NAME, count_selected );
context = nact_main_tab_get_context( NACT_MAIN_WINDOW( window ), &editable );
st_on_selection_change = TRUE;
nact_match_list_on_selection_changed( window, ITAB_NAME, count_selected );
st_on_selection_change = FALSE;
matchcase_button = GTK_TOGGLE_BUTTON( base_window_get_widget( window, "BasenamesMatchcaseButton" ));
matchcase = context ? na_object_get_matchcase( context ) : FALSE;
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( matchcase_button ), matchcase );
nact_gtk_utils_set_editable( GTK_OBJECT( matchcase_button ), editable );
st_on_selection_change = FALSE;
}
}
static void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment