nautilus-view-identifier.c 6.76 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*-

   nautilus-view-identifier.c: Unique ID/Human-readable name pairs for views
 
   Copyright (C) 2000 Eazel, Inc.
  
   This program is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2 of the
   License, or (at your option) any later version.
  
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.
  
   You should have received a copy of the GNU General Public
   License along with this program; if not, write to the
   Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.
  
   Author: Maciej Stachowiak <mjs@eazel.com>
*/

#include <config.h>
#include "nautilus-view-identifier.h"

28 29 30 31
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-i18n.h>


Ramiro Estrugo's avatar
Ramiro Estrugo committed
32 33
#include <eel/eel-glib-extensions.h>
#include <eel/eel-string.h>
34 35 36
#include <glib.h>
#include <stdlib.h>

37 38 39 40 41 42 43 44
static NautilusViewIdentifier *
nautilus_view_identifier_new (const char *iid,
			      const char *name,
			      const char *view_as_label,
			      const char *label_viewer);



45
NautilusViewIdentifier *
46 47 48 49
nautilus_view_identifier_new (const char *iid, 
			      const char *name,
			      const char *view_as_label,
			      const char *viewer_label)
50 51 52 53 54 55 56 57 58
{
        NautilusViewIdentifier *new_identifier;
        
        g_return_val_if_fail (iid != NULL, NULL);
        g_return_val_if_fail (name != NULL, NULL);
        
        new_identifier = g_new0 (NautilusViewIdentifier, 1);
        new_identifier->iid = g_strdup (iid);
        new_identifier->name = g_strdup (name);
59 60 61 62 63 64

        new_identifier->view_as_label = view_as_label ? g_strdup (view_as_label) :
		g_strdup_printf (_("View as %s"), name);

        new_identifier->viewer_label = view_as_label ? g_strdup (viewer_label) :
		g_strdup_printf (_("%s Viewer"), name);
65 66 67 68
        
        return new_identifier;
}

69
NautilusViewIdentifier *
70
nautilus_view_identifier_copy (const NautilusViewIdentifier *identifier)
71
{
72 73 74 75
	if (identifier == NULL) {
		return NULL;
	}
	
76 77 78 79
	return nautilus_view_identifier_new (identifier->iid, 
					     identifier->name, 
					     identifier->view_as_label,
					     identifier->viewer_label);
80 81
}

82 83
/* Returns a list of languages, containing
   the LANG or LANGUAGE environment setting (with and without region code).
84
   The elements in the returned list must be freed */
85 86 87 88
static GSList *
get_lang_list (void)
{
        GSList *retval;
89 90
        char *lang, *lang_with_locale, *tmp, *org_pointer;
        char *equal_char;
91 92 93

        retval = NULL;

94
        tmp = g_getenv ("LANGUAGE");
95

96 97
        if (tmp == NULL) {
                tmp = g_getenv ("LANG");
98 99
        }

100 101
	lang = g_strdup (tmp);
	org_pointer = lang;
102

103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
	if (lang != NULL) {
		/* envs can be in NAME=VALUE form */
		equal_char = strchr (lang, '=');
		if (equal_char != NULL) {
			lang = equal_char + 1;
		}
		
		/* lang may be in form LANG_LOCALE */
		equal_char = strchr (lang, '_');
		if (equal_char != NULL) {
			lang_with_locale = g_strdup (lang);
			*equal_char = 0;
		} else {
			lang_with_locale = NULL;
		}
118

119 120
		/* Make sure we don't give oaf an empty
		   lang string */
Ramiro Estrugo's avatar
Ramiro Estrugo committed
121
		if (!eel_str_is_empty (lang_with_locale)) {
122
			retval = g_slist_prepend (retval, 
123
						  g_strdup (lang_with_locale));
124
		}
125
		g_free (lang_with_locale);
Ramiro Estrugo's avatar
Ramiro Estrugo committed
126
		if (!eel_str_is_empty (lang)) {
127 128
			retval = g_slist_prepend (retval, g_strdup (lang));
		}
129
        }
130
	g_free (org_pointer);
131 132 133 134 135 136 137
        
        return retval;
}

NautilusViewIdentifier *
nautilus_view_identifier_new_from_oaf_server_info (OAF_ServerInfo *server, char *name_attribute)
{
138
        const char *view_as_name;       
139 140
        const char *view_as_label;       
        const char *viewer_label;       
141 142 143
        GSList *langs;

        langs = get_lang_list ();
144

145
        view_as_name = oaf_server_info_prop_lookup (server, name_attribute, langs);
146 147 148
	view_as_label = oaf_server_info_prop_lookup (server, "nautilus:view_as_label", langs);
	viewer_label = oaf_server_info_prop_lookup (server, "nautilus:viewer_label", langs);

149
        if (view_as_name == NULL) {
150
                view_as_name = oaf_server_info_prop_lookup (server, "name", langs);
151 152 153 154
        }
        if (view_as_name == NULL) {
                view_as_name = server->iid;
        }
155

Ramiro Estrugo's avatar
Ramiro Estrugo committed
156
	eel_g_slist_free_deep (langs);
157

158
	/* if the name is an OAFIID, clean it up for display */
Ramiro Estrugo's avatar
Ramiro Estrugo committed
159
	if (eel_str_has_prefix (view_as_name, "OAFIID:")) {
160 161 162 163 164 165 166 167 168
		char *display_name, *colon_ptr;
		NautilusViewIdentifier *new_identifier;
		
		display_name = g_strdup (view_as_name + 7);
		colon_ptr = strchr (display_name, ':');
		if (colon_ptr) {
			*colon_ptr = '\0';
		}
		
169 170
		new_identifier = nautilus_view_identifier_new (server->iid, display_name,
							       view_as_label, viewer_label);
171 172 173 174
		g_free(display_name);
		return new_identifier;					
	}
		
175 176
        return nautilus_view_identifier_new (server->iid, view_as_name,
					     view_as_label, viewer_label);
177 178 179 180 181
}

NautilusViewIdentifier *
nautilus_view_identifier_new_from_content_view (OAF_ServerInfo *server)
{
182 183
	return nautilus_view_identifier_new_from_oaf_server_info
		(server, "nautilus:view_as_name");
184 185
}

186 187 188 189 190 191 192
NautilusViewIdentifier *
nautilus_view_identifier_new_from_property_page (OAF_ServerInfo *server)
{
	return nautilus_view_identifier_new_from_oaf_server_info
		(server, "nautilus:property_page_name");
}

193 194 195
NautilusViewIdentifier *
nautilus_view_identifier_new_from_sidebar_panel (OAF_ServerInfo *server)
{
196 197
	return nautilus_view_identifier_new_from_oaf_server_info
		(server, "nautilus:sidebar_panel_name");
198 199 200 201 202 203 204 205
}

void
nautilus_view_identifier_free (NautilusViewIdentifier *identifier)
{
        if (identifier != NULL) {
                g_free (identifier->iid);
                g_free (identifier->name);
206 207
                g_free (identifier->view_as_label);
                g_free (identifier->viewer_label);
208 209 210 211
                g_free (identifier);
        }
}

212 213 214 215 216 217 218 219 220 221 222 223 224
GList *
nautilus_view_identifier_list_copy (GList *list)
{
	GList *copy, *node;

	copy = NULL;
	for (node = list; node != NULL; node = node->next) {
		copy = g_list_prepend
			(copy, nautilus_view_identifier_copy (node->data));
	}
	return g_list_reverse (copy);
}

225
static void
226
nautilus_view_identifier_free_callback (gpointer identifier, gpointer ignore)
227
{
Darin Adler's avatar
Darin Adler committed
228
	g_assert (ignore == NULL);
229 230 231 232
	nautilus_view_identifier_free (identifier);
}

void
233
nautilus_view_identifier_list_free (GList *list)
234
{
Ramiro Estrugo's avatar
Ramiro Estrugo committed
235
	eel_g_list_free_deep_custom
236
		(list, nautilus_view_identifier_free_callback, NULL);
237 238
}

239
int
240 241
nautilus_view_identifier_compare (const NautilusViewIdentifier *a,
				  const NautilusViewIdentifier *b)
242
{
243 244 245 246 247 248 249
	int result;

	result = strcmp (a->iid, b->iid);
	if (result != 0) {
		return result;
	}
	return strcmp (a->name, b->name);
250
}