f-spot r3640 - in trunk: . SmugMugNet extensions extensions/DefaultExporters extensions/FlickrExport extensions/FlickrExport/FlickrNet extensions/SmugMugExport extensions/SmugMugExport/SmugMugNet src



Author: sdelcroix
Date: Fri Feb  8 14:42:33 2008
New Revision: 3640
URL: http://svn.gnome.org/viewvc/f-spot?rev=3640&view=rev

Log:
2008-02-08  Lorenzo Milesi <maxxer yetopen it>

	* SmugMugNet/*:
	* src/SmugMugExport.cs: 
	* src/f-spot.glade:
	* configure.in:
	* Makefile.include:
	* Makefile.am: remove SmugMug export from the codebase


Added:
   trunk/extensions/SmugMugExport/
   trunk/extensions/SmugMugExport/Makefile.am
   trunk/extensions/SmugMugExport/SmugMugExport.addin.xml
   trunk/extensions/SmugMugExport/SmugMugExport.cs
   trunk/extensions/SmugMugExport/SmugMugExport.glade
   trunk/extensions/SmugMugExport/SmugMugNet/
   trunk/extensions/SmugMugExport/SmugMugNet/Makefile
   trunk/extensions/SmugMugExport/SmugMugNet/Makefile.am
   trunk/extensions/SmugMugExport/SmugMugNet/NoCheckCertificatePolicy.cs
   trunk/extensions/SmugMugExport/SmugMugNet/SmugMugApi.cs
Removed:
   trunk/SmugMugNet/
   trunk/src/SmugMugExport.cs
Modified:
   trunk/ChangeLog
   trunk/Makefile.am
   trunk/Makefile.include
   trunk/configure.in
   trunk/extensions/ChangeLog
   trunk/extensions/DefaultExporters/DefaultExporters.addin.xml
   trunk/extensions/FlickrExport/FlickrNet/Makefile.in
   trunk/extensions/FlickrExport/Makefile.in
   trunk/extensions/Makefile.am
   trunk/src/Makefile.am
   trunk/src/f-spot.glade

Modified: trunk/Makefile.am
==============================================================================
--- trunk/Makefile.am	(original)
+++ trunk/Makefile.am	Fri Feb  8 14:42:33 2008
@@ -2,7 +2,6 @@
 	$(DIR_DBUS)	\
 	$(DIR_DBUS_GLIB)\
 	docs		\
-	SmugMugNet	\
 	glitz-sharp	\
 	google-sharp	\
 	gnome-keyring-sharp \
@@ -23,7 +22,6 @@
 	dbus-sharp	\
 	dbus-sharp-glib	\
 	docs		\
-	SmugMugNet	\
 	glitz-sharp	\
 	google-sharp	\
 	gnome-keyring-sharp \

Modified: trunk/Makefile.include
==============================================================================
--- trunk/Makefile.include	(original)
+++ trunk/Makefile.include	Fri Feb  8 14:42:33 2008
@@ -17,7 +17,6 @@
 DIR_LIBEOG = $(top_builddir)/libeog
 DIR_LIBFSPOT = $(top_builddir)/libfspot
 DIR_SEMWEB = $(top_builddir)/semweb
-DIR_SMUGMUG = $(top_builddir)/SmugMugNet
 DIR_SRC = $(top_builddir)/src
 DIR_TAO_OPENGL = $(top_builddir)/Tao/Tao.OpenGl
 DIR_TAO_GLU = $(top_builddir)/Tao/Tao.OpenGl.Glu
@@ -35,7 +34,6 @@
 	-r:$(DIR_ADDINS_SETUP)/Mono.Addins.Setup.dll	\
 	-r:$(DIR_ADDINS_GUI)/Mono.Addins.Gui.dll
 LINK_SEMWEB = -r:$(DIR_SEMWEB)/SemWeb.dll
-LINK_SMUGMUG = -r:$(DIR_SMUGMUG)/SmugMugNet.dll
 LINK_TAO = 								\
 	-r:$(DIR_TAO_OPENGL)/Tao.OpenGl.dll				\
 	-r:$(DIR_TAO_GLU)/Tao.OpenGl.Glu.dll				\

Modified: trunk/configure.in
==============================================================================
--- trunk/configure.in	(original)
+++ trunk/configure.in	Fri Feb  8 14:42:33 2008
@@ -265,7 +265,6 @@
 dbus-sharp/Makefile
 dbus-sharp-glib/Makefile
 docs/Makefile
-SmugMugNet/Makefile
 google-sharp/Makefile
 gnome-keyring-sharp/Makefile
 icons/Makefile
@@ -298,6 +297,8 @@
 extensions/FlickrExport/FlickrNet/Makefile
 extensions/GalleryExport/Makefile
 extensions/FolderExport/Makefile
+extensions/SmugMugExport/SmugMugNet/Makefile
+extensions/SmugMugExport/Makefile
 f-spot.pc
 f-spot.spec
 f-spot.desktop.in

Modified: trunk/extensions/DefaultExporters/DefaultExporters.addin.xml
==============================================================================
--- trunk/extensions/DefaultExporters/DefaultExporters.addin.xml	(original)
+++ trunk/extensions/DefaultExporters/DefaultExporters.addin.xml	Fri Feb  8 14:42:33 2008
@@ -1,5 +1,5 @@
 <Addin namespace="FSpot"
-	version="1.3"
+	version="1.4"
 	name="Default Exporters"
 	description="This extension contains all the default exporters for f-spot. Most of them will be moved out of this extension in the future, and, at that time, this extension will be deprecated."
 	author="F-Spot team"
@@ -13,7 +13,6 @@
 
 	<Extension path = "/FSpot/Menus/Exports">
 		<ExportMenuItem id="PicasaWeb" _label = "_PicasaWeb..." class = "FSpot.GoogleExport" />
-		<ExportMenuItem id="SmugMug" _label = "_SmugMug..." class = "FSpot.SmugMugExport" />
 		<ExportMenuItem id="CD" _label = "_CD..." class = "FSpot.CDExport" />
 	</Extension>
 </Addin>

Modified: trunk/extensions/FlickrExport/FlickrNet/Makefile.in
==============================================================================
--- trunk/extensions/FlickrExport/FlickrNet/Makefile.in	(original)
+++ trunk/extensions/FlickrExport/FlickrNet/Makefile.in	Fri Feb  8 14:42:33 2008
@@ -274,7 +274,6 @@
 DIR_LIBEOG = $(top_builddir)/libeog
 DIR_LIBFSPOT = $(top_builddir)/libfspot
 DIR_SEMWEB = $(top_builddir)/semweb
-DIR_SMUGMUG = $(top_builddir)/SmugMugNet
 DIR_SRC = $(top_builddir)/src
 DIR_TAO_OPENGL = $(top_builddir)/Tao/Tao.OpenGl
 DIR_TAO_GLU = $(top_builddir)/Tao/Tao.OpenGl.Glu
@@ -290,7 +289,6 @@
 	-r:$(DIR_ADDINS_GUI)/Mono.Addins.Gui.dll
 
 LINK_SEMWEB = -r:$(DIR_SEMWEB)/SemWeb.dll
-LINK_SMUGMUG = -r:$(DIR_SMUGMUG)/SmugMugNet.dll
 LINK_TAO = \
 	-r:$(DIR_TAO_OPENGL)/Tao.OpenGl.dll				\
 	-r:$(DIR_TAO_GLU)/Tao.OpenGl.Glu.dll				\

Modified: trunk/extensions/FlickrExport/Makefile.in
==============================================================================
--- trunk/extensions/FlickrExport/Makefile.in	(original)
+++ trunk/extensions/FlickrExport/Makefile.in	Fri Feb  8 14:42:33 2008
@@ -286,7 +286,6 @@
 DIR_LIBEOG = $(top_builddir)/libeog
 DIR_LIBFSPOT = $(top_builddir)/libfspot
 DIR_SEMWEB = $(top_builddir)/semweb
-DIR_SMUGMUG = $(top_builddir)/SmugMugNet
 DIR_SRC = $(top_builddir)/src
 DIR_TAO_OPENGL = $(top_builddir)/Tao/Tao.OpenGl
 DIR_TAO_GLU = $(top_builddir)/Tao/Tao.OpenGl.Glu
@@ -302,7 +301,6 @@
 	-r:$(DIR_ADDINS_GUI)/Mono.Addins.Gui.dll
 
 LINK_SEMWEB = -r:$(DIR_SEMWEB)/SemWeb.dll
-LINK_SMUGMUG = -r:$(DIR_SMUGMUG)/SmugMugNet.dll
 LINK_TAO = \
 	-r:$(DIR_TAO_OPENGL)/Tao.OpenGl.dll				\
 	-r:$(DIR_TAO_GLU)/Tao.OpenGl.Glu.dll				\

Modified: trunk/extensions/Makefile.am
==============================================================================
--- trunk/extensions/Makefile.am	(original)
+++ trunk/extensions/Makefile.am	Fri Feb  8 14:42:33 2008
@@ -2,6 +2,7 @@
 	GalleryExport		\
 	FlickrExport		\
 	FolderExport		\
+ 	SmugMugExport		\
 	DefaultExporters	
 
 addinsdir = $(pkglibdir)

Added: trunk/extensions/SmugMugExport/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/extensions/SmugMugExport/Makefile.am	Fri Feb  8 14:42:33 2008
@@ -0,0 +1,57 @@
+include $(top_srcdir)/Makefile.include
+
+PLUGIN_NAME = SmugMugExport
+
+PLUGIN_MANIFEST = $(PLUGIN_NAME).addin.xml
+
+PLUGIN_ASSEMBLY = $(PLUGIN_NAME).dll
+
+PLUGIN_SOURCES =			\
+	$(srcdir)/SmugMugExport.cs
+
+REFS =					\
+	-r:../../src/f-spot.exe		\
+	-r:../../src/FSpot.Core.dll	\
+	-r:../../src/FSpot.Utils.dll	\
+	-r:../../semweb/SemWeb.dll	\
+	-r:SmugMugNet/SmugMugNet.dll	\
+	$(LINK_KEYRING)			\
+	-r:Mono.Posix
+
+PKGS =					\
+	-pkg:gtk-sharp-2.0		\
+	-pkg:glade-sharp-2.0
+
+RESOURCES =				\
+	-resource:$(srcdir)/$(PLUGIN_MANIFEST)	\
+	-resource:$(srcdir)/$(PLUGIN_NAME).glade
+
+SUBDIRS =                      \
+	SmugMugNet
+
+
+all: $(PLUGIN_ASSEMBLY)
+
+mpack: $(PLUGIN_ASSEMBLY)
+	mautil p $(PLUGIN_ASSEMBLY)
+
+$(PLUGIN_ASSEMBLY): $(PLUGIN_SOURCES) $(PLUGIN_MANIFEST)
+	$(CSC_LIB) -out:$@ $(PLUGIN_SOURCES) $(REFS) $(PKGS) $(ASSEMBLIES) $(RESOURCES)
+
+plugindir = $(pkglibdir)/extensions
+
+install-data-hook:
+	rm -f $(plugindir)/$(PLUGIN_NAME).addin.xml
+
+plugin_DATA =			\
+	$(PLUGIN_ASSEMBLY)
+
+EXTRA_DIST = 			\
+	$(PLUGIN_SOURCES)	\
+	$(PLUGIN_MANIFEST)	\
+	$(PLUGIN_NAME).glade
+
+CLEANFILES =			\
+	$(PLUGIN_ASSEMBLY)	\
+	$(PLUGIN_ASSEMBLY).mdb	\
+	*.mpack

Added: trunk/extensions/SmugMugExport/SmugMugExport.addin.xml
==============================================================================
--- (empty file)
+++ trunk/extensions/SmugMugExport/SmugMugExport.addin.xml	Fri Feb  8 14:42:33 2008
@@ -0,0 +1,17 @@
+<Addin namespace="FSpot"
+	version="1.0"
+	name="SmugMug Export"
+	description="This extension allows you to export your photos to SmugMug."
+	author="F-Spot team"
+	url="http://f-spot.org";
+	defaultEnabled="true"
+	category="Export">
+
+	<Dependencies>
+		<Addin id="Core" version="0.4.0.0"/>
+	</Dependencies>
+
+	<Extension path = "/FSpot/Menus/Exports">
+		<ExportMenuItem id="SmugMug" _label = "_SmugMug..." class = "FSpotSmugMugExport.SmugMugExport" />
+	</Extension>
+</Addin>

Added: trunk/extensions/SmugMugExport/SmugMugExport.cs
==============================================================================
--- (empty file)
+++ trunk/extensions/SmugMugExport/SmugMugExport.cs	Fri Feb  8 14:42:33 2008
@@ -0,0 +1,842 @@
+/*
+ * SmugMugExport.cs
+ *
+ * Authors:
+ *   Thomas Van Machelen <thomas vanmachelen gmail com>
+ *
+ * Based on PicasaWebExport code from Stephane Delcroix.
+ *
+ * Copyright (C) 2006 Thomas Van Machelen
+ */
+
+using System;
+using System.Net;
+using System.IO;
+using System.Text;
+using System.Threading;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Web;
+using Mono.Unix;
+using Gtk;
+
+using FSpot;
+using FSpot.Filters;
+using FSpot.Widgets;
+using FSpot.Utils;
+
+using Gnome.Keyring;
+using SmugMugNet;
+
+namespace FSpotSmugMugExport {
+	public class SmugMugAccount {
+		private string username;
+		private string password;
+		private string token;
+		private bool connected;
+		private SmugMugApi smugmug_proxy;
+
+		public SmugMugAccount (string username, string password) 
+		{
+			this.username = username;
+			this.password = password;
+		}
+
+		public SmugMugApi Connect ()
+		{
+			System.Console.WriteLine ("SmugMug.Connect() {0}", username);
+			SmugMugApi proxy = new SmugMugApi (username, password);
+			ServicePointManager.CertificatePolicy = new NoCheckCertificatePolicy ();
+			proxy.Login ();
+
+			this.smugmug_proxy = proxy;
+			return proxy;
+		}
+
+		private void MarkChanged()
+		{
+			smugmug_proxy = null;
+			connected = false;
+		}
+
+		public bool Connected {
+			get {
+				return (smugmug_proxy != null);
+			}
+		}
+
+		public string Username {
+			get {
+				return username;
+			}
+			set {
+				if (username != value) {
+					username = value;
+					MarkChanged ();
+				}
+			}
+		}
+
+		public string Password {
+			get {
+				return password;
+			}
+			set {
+				if (password != value) {
+					password = value;
+					MarkChanged ();
+				}
+			}
+		}
+
+		public SmugMugApi SmugMug {
+			get {
+				return smugmug_proxy;
+			}
+		}
+	}
+
+	
+	public class SmugMugAccountManager 
+	{
+		private static SmugMugAccountManager instance;
+		private const string keyring_item_name = "SmugMug Account";
+		ArrayList accounts;
+
+		public delegate void AccountListChangedHandler (SmugMugAccountManager manager, SmugMugAccount changed_account);
+		public event AccountListChangedHandler AccountListChanged;
+		
+		public static SmugMugAccountManager GetInstance ()
+		{
+			if (instance == null) {
+				instance = new SmugMugAccountManager ();
+			}
+
+			return instance;
+		}
+
+		private SmugMugAccountManager ()
+		{
+			accounts = new ArrayList ();
+			ReadAccounts ();
+		}	
+
+		public void MarkChanged ()
+		{
+			MarkChanged (true, null);
+		}
+
+		public void MarkChanged (bool write, SmugMugAccount changed_account)
+		{
+			if (write)
+				WriteAccounts ();
+
+			if (AccountListChanged != null)
+				AccountListChanged (this, changed_account);
+		}
+
+		public ArrayList GetAccounts ()
+		{
+			return accounts;
+		}
+
+		public void AddAccount (SmugMugAccount account)
+		{
+			AddAccount (account, true);
+		}
+
+		public void AddAccount (SmugMugAccount account, bool write)
+		{
+			accounts.Add (account);
+			MarkChanged (write, account);
+		}
+
+		public void RemoveAccount (SmugMugAccount account)
+		{
+			string keyring = Ring.GetDefaultKeyring();
+			Hashtable request_attributes = new Hashtable();
+			request_attributes["name"] = keyring_item_name;
+			request_attributes["username"] = account.Username;
+			try {
+				foreach(ItemData result in Ring.Find(ItemType.GenericSecret, request_attributes)) {
+					Ring.DeleteItem(keyring, result.ItemID);
+				}
+			} catch (Exception e) {
+				Console.WriteLine(e);
+			}
+			accounts.Remove (account);
+			MarkChanged ();
+		}
+
+		public void WriteAccounts ()
+		{
+			string keyring = Ring.GetDefaultKeyring();
+			foreach (SmugMugAccount account in accounts) {
+				Hashtable update_request_attributes = new Hashtable();
+				update_request_attributes["name"] = keyring_item_name;
+				update_request_attributes["username"] = account.Username;
+
+				Ring.CreateItem(keyring, ItemType.GenericSecret, keyring_item_name, update_request_attributes, account.Password, true);
+			}
+		}
+
+		private void ReadAccounts ()
+		{
+
+			Hashtable request_attributes = new Hashtable();
+			request_attributes["name"] = keyring_item_name;
+			try {
+				foreach(ItemData result in Ring.Find(ItemType.GenericSecret, request_attributes)) {
+					if(!result.Attributes.ContainsKey("name") || !result.Attributes.ContainsKey("username") ||
+						(result.Attributes["name"] as string) != keyring_item_name) 
+						continue;
+					
+					string username = (string)result.Attributes["username"];
+					string password = result.Secret;
+	
+					if (username == null || username == String.Empty || password == null || password == String.Empty)
+						throw new ApplicationException ("Invalid username/password in keyring");
+	
+					SmugMugAccount account = new SmugMugAccount(username, password);
+					if (account != null)
+						AddAccount (account, false);
+
+				}
+			} catch (Exception e) {
+				Console.Error.WriteLine(e);
+			}
+
+			MarkChanged ();
+		}
+	}
+	
+	public class SmugMugAccountDialog {
+		public SmugMugAccountDialog (Gtk.Window parent) : this (parent, null) { 
+			Dialog.Response += HandleAddResponse;
+			add_button.Sensitive = false;
+		}
+		
+		public SmugMugAccountDialog (Gtk.Window parent, SmugMugAccount account)
+		{
+			xml = new Glade.XML (null, "SmugMugExport.glade", dialog_name, "f-spot");
+			xml.Autoconnect (this);
+
+			Dialog.Modal = false;
+			Dialog.TransientFor = parent;
+			Dialog.DefaultResponse = Gtk.ResponseType.Ok;
+			
+			this.account = account;
+	
+			password_entry.ActivatesDefault = true;
+			username_entry.ActivatesDefault = true;
+
+			if (account != null) {
+				password_entry.Text = account.Password;
+				username_entry.Text = account.Username;
+				add_button.Label = Gtk.Stock.Ok;
+				Dialog.Response += HandleEditResponse;
+			}
+
+			if (remove_button != null)
+				remove_button.Visible = account != null;
+
+			this.Dialog.Show ();
+
+			password_entry.Changed += HandleChanged;
+			username_entry.Changed += HandleChanged;
+			HandleChanged (null, null);
+		}
+
+		private void HandleChanged (object sender, System.EventArgs args)
+		{
+			password = password_entry.Text;
+			username = username_entry.Text;
+
+			add_button.Sensitive = !(password == String.Empty || username == String.Empty);
+		}
+		
+		[GLib.ConnectBefore]
+		protected void HandleAddResponse (object sender, Gtk.ResponseArgs args)
+		{
+			if (args.ResponseId == Gtk.ResponseType.Ok) {
+				SmugMugAccount account = new SmugMugAccount (username, password);
+				SmugMugAccountManager.GetInstance ().AddAccount (account);
+			}
+			Dialog.Destroy ();
+		}
+
+		protected void HandleEditResponse (object sender, Gtk.ResponseArgs args)
+		{
+			if (args.ResponseId == Gtk.ResponseType.Ok) {
+				account.Username = username;
+				account.Password = password;
+				SmugMugAccountManager.GetInstance ().MarkChanged (true, account);
+			} else if (args.ResponseId == Gtk.ResponseType.Reject) {
+				// NOTE we are using Reject to signal the remove action.
+				SmugMugAccountManager.GetInstance ().RemoveAccount (account);
+			}
+			Dialog.Destroy ();				
+		}
+
+		private Gtk.Dialog Dialog {
+			get {
+				if (dialog == null)
+					dialog = (Gtk.Dialog) xml.GetWidget (dialog_name);
+
+				return dialog;
+			}
+		}
+
+		private SmugMugAccount account;
+		private string password;
+		private string username;
+		private string token;
+		private string dialog_name = "smugmug_add_dialog";
+		private Glade.XML xml;
+
+		// widgets 
+		[Glade.Widget] Gtk.Dialog dialog;
+		[Glade.Widget] Gtk.Entry password_entry;
+		[Glade.Widget] Gtk.Entry username_entry;
+
+		[Glade.Widget] Gtk.Button add_button;
+		[Glade.Widget] Gtk.Button remove_button;
+		[Glade.Widget] Gtk.Button cancel_button;
+
+		[Glade.Widget] Gtk.HBox status_area;
+		[Glade.Widget] Gtk.HBox locked_area;
+	}
+
+	public class SmugMugAddAlbum {
+		//[Glade.Widget] Gtk.OptionMenu album_optionmenu;
+
+		[Glade.Widget] Gtk.Dialog dialog;
+		[Glade.Widget] Gtk.Entry title_entry;
+		[Glade.Widget] Gtk.CheckButton public_check;
+		[Glade.Widget] Gtk.ComboBox category_combo;
+		
+		[Glade.Widget] Gtk.Button add_button;
+		[Glade.Widget] Gtk.Button cancel_button;
+
+		private string dialog_name = "smugmug_add_album_dialog";
+		private Glade.XML xml;
+		private SmugMugExport export;
+		private SmugMugApi smugmug;
+		private string description;
+		private string title;
+		private bool public_album;
+		private ListStore category_store;
+
+		public SmugMugAddAlbum (SmugMugExport export, SmugMugApi smugmug)
+		{
+			xml = new Glade.XML (null, "SmugMugExport.glade", dialog_name, "f-spot");
+			xml.Autoconnect (this);
+
+			this.export = export;
+			this.smugmug = smugmug;
+			
+			this.category_store = new ListStore (typeof(int), typeof(string));
+			CellRendererText display_cell = new CellRendererText();
+			category_combo.PackStart (display_cell, true);
+			category_combo.SetCellDataFunc (display_cell, new CellLayoutDataFunc (CategoryDataFunc));
+			this.category_combo.Model = category_store;
+			PopulateCategoryCombo ();
+			
+			Dialog.Response += HandleAddResponse;
+
+			title_entry.Changed += HandleChanged;
+			HandleChanged (null, null);
+		}
+		
+		private void HandleChanged (object sender, EventArgs args)
+		{
+			title = title_entry.Text;
+			public_album = public_check.Active;
+
+			if (title == String.Empty)
+				add_button.Sensitive = false;
+			else
+				add_button.Sensitive = true;
+		}
+		
+		[GLib.ConnectBefore]
+		protected void HandleAddResponse (object sender, Gtk.ResponseArgs args)
+		{
+			if (args.ResponseId == Gtk.ResponseType.Ok) {
+				smugmug.CreateAlbum (title, CurrentCategoryId, public_check.Active);
+				export.HandleAlbumAdded (title);
+			}
+			Dialog.Destroy ();
+		}
+
+		void CategoryDataFunc (CellLayout layout, CellRenderer renderer, TreeModel model, TreeIter iter) 
+		{
+			string name = (string)model.GetValue (iter, 1);
+			(renderer as CellRendererText).Text = name;
+		}
+
+		protected void PopulateCategoryCombo ()
+		{
+			SmugMugNet.Category[] categories = smugmug.GetCategories ();
+
+			foreach (SmugMugNet.Category category in categories) {				
+				category_store.AppendValues (category.CategoryID, category.Title);
+			}
+
+			category_combo.Active = 0;
+
+			category_combo.ShowAll ();
+		}
+
+		protected int CurrentCategoryId
+		{
+			get {
+				TreeIter current;
+				category_combo.GetActiveIter (out current);
+				return (int)category_combo.Model.GetValue (current, 0);
+			}
+		}
+
+		private Gtk.Dialog Dialog {
+			get {
+				if (dialog == null)
+					dialog = (Gtk.Dialog) xml.GetWidget (dialog_name);
+
+				return dialog;
+			}
+		}
+	}
+
+	
+	public class SmugMugExport : FSpot.Extensions.IExporter {
+		public SmugMugExport ()
+		{
+		}
+		public void Run (IBrowsableCollection selection)
+		{
+			xml = new Glade.XML (null, "SmugMugExport.glade", dialog_name, "f-spot");
+			xml.Autoconnect (this);
+
+			this.items = selection.Items;
+			album_button.Sensitive = false;
+			FSpot.Widgets.IconView view = new FSpot.Widgets.IconView (selection);
+			view.DisplayDates = false;
+			view.DisplayTags = false;
+
+			Dialog.Modal = false;
+			Dialog.TransientFor = null;
+			Dialog.Close += HandleCloseEvent;
+
+			thumb_scrolledwindow.Add (view);
+			view.Show ();
+			Dialog.Show ();
+
+			SmugMugAccountManager manager = SmugMugAccountManager.GetInstance ();
+			manager.AccountListChanged += PopulateSmugMugOptionMenu;
+			PopulateSmugMugOptionMenu (manager, null);
+
+			if (edit_button != null)
+				edit_button.Clicked += HandleEditGallery;
+			
+			rh = new Gtk.ResponseHandler (HandleResponse);
+			Dialog.Response += HandleResponse;
+			connect = true;
+			HandleSizeActive (null, null);
+			Connect ();
+
+			scale_check.Toggled += HandleScaleCheckToggled;
+			
+			LoadPreference (SCALE_KEY);
+			LoadPreference (SIZE_KEY);
+			LoadPreference (ROTATE_KEY);
+			LoadPreference (BROWSER_KEY);
+		}
+		
+		Gtk.ResponseHandler rh;
+		
+		private bool scale;
+		private int size;
+		private bool browser;
+		private bool rotate;
+//		private bool meta;
+		private bool connect = false;
+
+		private long approx_size = 0;
+		private long sent_bytes = 0;
+
+		IBrowsableItem [] items;
+		int photo_index;
+		FSpot.ThreadProgressDialog progress_dialog;
+		
+		ArrayList accounts;
+		private SmugMugAccount account;
+		private Album album;
+
+		private string xml_path;
+
+		private string dialog_name = "smugmug_export_dialog";
+		private Glade.XML xml;
+
+		// Dialogs
+		private SmugMugAccountDialog gallery_add;
+		private SmugMugAddAlbum album_add;
+
+		// Widgets
+		[Glade.Widget] Gtk.Dialog dialog;
+		[Glade.Widget] Gtk.OptionMenu gallery_optionmenu;
+		[Glade.Widget] Gtk.OptionMenu album_optionmenu;
+		
+		[Glade.Widget] Gtk.Entry width_entry;
+		[Glade.Widget] Gtk.Entry height_entry;
+
+		[Glade.Widget] Gtk.Label status_label;
+
+		[Glade.Widget] Gtk.CheckButton browser_check;
+		[Glade.Widget] Gtk.CheckButton scale_check;
+		[Glade.Widget] Gtk.CheckButton rotate_check;
+		
+		[Glade.Widget] Gtk.SpinButton size_spin;
+
+		[Glade.Widget] Gtk.Button album_button;
+		[Glade.Widget] Gtk.Button add_button;
+		[Glade.Widget] Gtk.Button edit_button;
+		
+		[Glade.Widget] Gtk.Button ok_button;
+		[Glade.Widget] Gtk.Button cancel_button;
+
+		[Glade.Widget] Gtk.ScrolledWindow thumb_scrolledwindow;
+
+		System.Threading.Thread command_thread;
+		
+		public const string EXPORT_SERVICE = "smugmug/";
+		public const string SCALE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "scale";
+		public const string SIZE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "size";
+		public const string ROTATE_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "rotate";
+		public const string BROWSER_KEY = Preferences.APP_FSPOT_EXPORT + EXPORT_SERVICE + "browser";
+
+		private void HandleResponse (object sender, Gtk.ResponseArgs args)
+		{
+			if (args.ResponseId != Gtk.ResponseType.Ok) {
+				Dialog.Destroy ();
+				return;
+			}
+
+			if (scale_check != null) {
+				scale = scale_check.Active;
+				size = size_spin.ValueAsInt;
+			} else
+				scale = false;
+
+			browser = browser_check.Active;
+			rotate = rotate_check.Active;
+//			meta = meta_check.Active;
+
+			if (account != null) { 
+				//System.Console.WriteLine ("history = {0}", album_optionmenu.History);
+				album = (Album) account.SmugMug.GetAlbums() [Math.Max (0, album_optionmenu.History)]; 
+				photo_index = 0;
+				
+				Dialog.Destroy ();
+
+				command_thread = new System.Threading.Thread (new System.Threading.ThreadStart (this.Upload));
+				command_thread.Name = Mono.Unix.Catalog.GetString ("Uploading Pictures");
+				
+				progress_dialog = new FSpot.ThreadProgressDialog (command_thread, items.Length);
+				progress_dialog.Start ();
+
+				// Save these settings for next time
+				Preferences.Set (SCALE_KEY, scale);
+				Preferences.Set (SIZE_KEY, size);
+				Preferences.Set (ROTATE_KEY, rotate);
+				Preferences.Set (BROWSER_KEY, browser);
+			}
+		}
+		
+		public void HandleSizeActive (object sender, EventArgs args)
+		{
+			size_spin.Sensitive = scale_check.Active;
+		}
+
+		private void Upload ()
+		{
+			sent_bytes = 0;
+			approx_size = 0;
+
+			System.Uri album_uri = null;
+
+			System.Console.WriteLine ("Starting Upload to Smugmug, album {0} - {1}", album.Title, album.AlbumID);
+
+			FilterSet filters = new FilterSet ();
+			filters.Add (new JpegFilter ());
+
+			if (scale)
+				filters.Add (new ResizeFilter ((uint)size));
+
+			if (rotate)
+				filters.Add (new OrientationFilter ());
+
+			while (photo_index < items.Length) {
+				try {
+					IBrowsableItem item = items[photo_index];
+
+					FileInfo file_info;
+					Console.WriteLine ("uploading {0}", photo_index);
+
+					progress_dialog.Message = String.Format (Catalog.GetString ("Uploading picture \"{0}\" ({1} of {2})"), 
+										 item.Name, photo_index+1, items.Length);
+					progress_dialog.ProgressText = string.Empty;
+					progress_dialog.Fraction = ((photo_index) / (double) items.Length);
+					photo_index++;
+					
+					FilterRequest request = new FilterRequest (item.DefaultVersionUri);
+
+					filters.Convert (request);
+
+					file_info = new FileInfo (request.Current.LocalPath);
+
+					if (approx_size == 0) //first image
+						approx_size = file_info.Length * items.Length;
+					else
+						approx_size = sent_bytes * items.Length / (photo_index - 1);
+
+					int image_id = account.SmugMug.Upload (request.Current.LocalPath, album.AlbumID);
+					if (Core.Database != null && item is Photo)
+						Core.Database.Exports.Create ((item as Photo).Id,
+									      (item as Photo).DefaultVersionId,
+									      ExportStore.SmugMugExportType,
+									      account.SmugMug.GetAlbumUrl (image_id).ToString ());
+
+					sent_bytes += file_info.Length;
+
+					if (album_uri == null)
+					 	album_uri = account.SmugMug.GetAlbumUrl (image_id);
+				} catch (System.Exception e) {
+					progress_dialog.Message = String.Format (Mono.Unix.Catalog.GetString ("Error Uploading To Gallery: {0}"),
+										 e.Message);
+					progress_dialog.ProgressText = Mono.Unix.Catalog.GetString ("Error");
+					System.Console.WriteLine (e);
+
+					if (progress_dialog.PerformRetrySkip ())
+					 	photo_index--;
+				}
+			}
+				
+			progress_dialog.Message = Catalog.GetString ("Done Sending Photos");
+			progress_dialog.Fraction = 1.0;
+			progress_dialog.ProgressText = Mono.Unix.Catalog.GetString ("Upload Complete");
+			progress_dialog.ButtonLabel = Gtk.Stock.Ok;
+
+			if (browser && album_uri != null) {
+				GnomeUtil.UrlShow (null, album_uri.ToString ());
+			}
+		}
+
+		private void HandleScaleCheckToggled (object o, EventArgs e)
+		{
+			rotate_check.Sensitive = !scale_check.Active;
+		}
+		
+		private void PopulateSmugMugOptionMenu (SmugMugAccountManager manager, SmugMugAccount changed_account)
+		{
+			Gtk.Menu menu = new Gtk.Menu ();
+			this.account = changed_account;
+			int pos = -1;
+
+			accounts = manager.GetAccounts ();
+			if (accounts == null || accounts.Count == 0) {
+				Gtk.MenuItem item = new Gtk.MenuItem (Mono.Unix.Catalog.GetString ("(No Gallery)"));
+				menu.Append (item);
+				gallery_optionmenu.Sensitive = false;
+				edit_button.Sensitive = false;
+			} else {
+				int i = 0;
+				foreach (SmugMugAccount account in accounts) {
+					if (account == changed_account)
+						pos = i;
+					
+					Gtk.MenuItem item = new Gtk.MenuItem (account.Username);
+					menu.Append (item);		
+					i++;
+				}
+				gallery_optionmenu.Sensitive = true;
+				edit_button.Sensitive = true;
+			}
+
+			menu.ShowAll ();
+			gallery_optionmenu.Menu = menu;
+			gallery_optionmenu.SetHistory ((uint)pos);
+		}
+
+		private void Connect ()
+		{
+			Connect (null);
+		}
+
+		private void Connect (SmugMugAccount selected)
+		{
+			Connect (selected, null);
+		}
+
+		private void Connect (SmugMugAccount selected, string text)
+		{
+			try {
+				if (accounts.Count != 0 && connect) {
+					if (selected == null)
+						account = (SmugMugAccount) accounts [gallery_optionmenu.History];
+					else
+						account = selected;
+
+					if (!account.Connected)
+						account.Connect ();
+					
+					PopulateAlbumOptionMenu (account.SmugMug);
+					album_button.Sensitive = true;
+				}
+			} catch (System.Exception) {
+				System.Console.WriteLine ("Can not connect to SmugMug. Bad username ? password ? network connection ?");
+				//System.Console.WriteLine ("{0}",ex);
+				if (selected != null)
+					account = selected;
+
+				PopulateAlbumOptionMenu (account.SmugMug);
+
+				status_label.Text = String.Empty;
+				album_button.Sensitive = false;
+				
+				new SmugMugAccountDialog (this.Dialog, account);
+			} 
+		}
+
+		private void HandleAccountSelected (object sender, System.EventArgs args)
+		{
+			Connect ();
+		}
+
+		public void HandleAlbumAdded (string title) {
+			SmugMugAccount account = (SmugMugAccount) accounts [gallery_optionmenu.History];
+			PopulateAlbumOptionMenu (account.SmugMug);
+				
+			// make the newly created album selected
+			Album[] albums = account.SmugMug.GetAlbums();
+			for (int i=0; i < albums.Length; i++) {
+				if (((Album)albums[i]).Title == title) {
+					album_optionmenu.SetHistory((uint)i);
+				}
+			}
+		}
+
+		private void PopulateAlbumOptionMenu (SmugMugApi smugmug)
+		{
+			Album[] albums = null;
+			if (smugmug != null) {
+				try {
+					albums = smugmug.GetAlbums();
+				} catch (Exception) {
+					Console.WriteLine("Can't get the albums");
+					smugmug = null;
+				}
+			}
+
+			Gtk.Menu menu = new Gtk.Menu ();
+
+			bool disconnected = smugmug == null || !account.Connected || albums == null;
+
+			if (disconnected || albums.Length == 0) {
+				string msg = disconnected ? Mono.Unix.Catalog.GetString ("(Not Connected)") 
+					: Mono.Unix.Catalog.GetString ("(No Albums)");
+
+				Gtk.MenuItem item = new Gtk.MenuItem (msg);
+				menu.Append (item);
+
+				ok_button.Sensitive = false;
+				album_optionmenu.Sensitive = false;
+				album_button.Sensitive = false;
+
+				if (disconnected) 
+					album_button.Sensitive = false;
+			} else {
+				foreach (Album album in albums) {
+					System.Text.StringBuilder label_builder = new System.Text.StringBuilder ();
+					
+					label_builder.Append (album.Title);
+
+					Gtk.MenuItem item = new Gtk.MenuItem (label_builder.ToString ());
+					((Gtk.Label)item.Child).UseUnderline = false;
+					menu.Append (item);
+				}
+
+				ok_button.Sensitive = items.Length > 0;
+				album_optionmenu.Sensitive = true;
+				album_button.Sensitive = true;
+			}
+
+			menu.ShowAll ();
+			album_optionmenu.Menu = menu;
+		}
+		
+		public void HandleAddGallery (object sender, System.EventArgs args)
+		{
+			gallery_add = new SmugMugAccountDialog (this.Dialog);
+		}
+		
+		public void HandleEditGallery (object sender, System.EventArgs args)
+		{
+			gallery_add = new SmugMugAccountDialog (this.Dialog, account);
+		}
+
+		public void HandleAddAlbum (object sender, System.EventArgs args)
+		{
+			if (account == null)
+				throw new Exception (Catalog.GetString ("No account selected"));
+				
+			album_add = new SmugMugAddAlbum (this, account.SmugMug);
+		}
+
+		void LoadPreference (string key)
+		{
+			object val = Preferences.Get (key);
+
+			if (val == null)
+				return;
+
+			//System.Console.WriteLine ("Setting {0} to {1}", key, val);
+
+			switch (key) {
+			case SCALE_KEY:
+				if (scale_check.Active != (bool) val) {
+					scale_check.Active = (bool) val;
+					rotate_check.Sensitive = !(bool) val;
+				}
+				break;
+
+			case SIZE_KEY:
+				size_spin.Value = (double) (int) val;
+				break;
+			
+			case BROWSER_KEY:
+				if (browser_check.Active != (bool) val)
+					browser_check.Active = (bool) val;
+				break;
+			
+			case ROTATE_KEY:
+				if (rotate_check.Active != (bool) val)
+					rotate_check.Active = (bool) val;
+				break;
+			}
+		}
+
+		protected void HandleCloseEvent (object sender, System.EventArgs args) 
+		{
+			account.SmugMug.Logout ();
+		}
+
+		private Gtk.Dialog Dialog {
+			get {
+				if (dialog == null)
+					dialog = (Gtk.Dialog) xml.GetWidget (dialog_name);
+
+				return dialog;
+			}
+		}
+	}
+}

Added: trunk/extensions/SmugMugExport/SmugMugExport.glade
==============================================================================
--- (empty file)
+++ trunk/extensions/SmugMugExport/SmugMugExport.glade	Fri Feb  8 14:42:33 2008
@@ -0,0 +1,663 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd">
+<!--*- mode: xml -*-->
+<glade-interface>
+  <requires lib="canvas"/>
+  <requires lib="gnome"/>
+  <widget class="GtkDialog" id="smugmug_export_dialog">
+    <property name="title" translatable="yes">Export</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <widget class="GtkVBox" id="vbox88">
+        <property name="visible">True</property>
+        <child>
+          <widget class="GtkHBox" id="hbox91">
+            <property name="visible">True</property>
+            <property name="border_width">6</property>
+            <child>
+              <widget class="GtkFrame" id="frame50">
+                <property name="visible">True</property>
+                <property name="label_xalign">0</property>
+                <property name="shadow_type">GTK_SHADOW_NONE</property>
+                <child>
+                  <widget class="GtkAlignment" id="alignment67">
+                    <property name="visible">True</property>
+                    <property name="left_padding">12</property>
+                    <child>
+                      <widget class="GtkScrolledWindow" id="thumb_scrolledwindow">
+                        <property name="width_request">180</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                        <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                        <property name="shadow_type">GTK_SHADOW_IN</property>
+                        <child>
+                          <placeholder/>
+                        </child>
+                      </widget>
+                    </child>
+                  </widget>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="label220">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Photos&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </widget>
+                  <packing>
+                    <property name="type">label_item</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkVBox" id="vbox89">
+                <property name="visible">True</property>
+                <property name="spacing">6</property>
+                <child>
+                  <widget class="GtkFrame" id="frame51">
+                    <property name="visible">True</property>
+                    <property name="label_xalign">0</property>
+                    <property name="shadow_type">GTK_SHADOW_NONE</property>
+                    <child>
+                      <widget class="GtkAlignment" id="alignment68">
+                        <property name="visible">True</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <widget class="GtkVBox" id="vbox90">
+                            <property name="visible">True</property>
+                            <property name="spacing">6</property>
+                            <child>
+                              <widget class="GtkHBox" id="hbox92">
+                                <property name="visible">True</property>
+                                <property name="spacing">6</property>
+                                <child>
+                                  <widget class="GtkLabel" id="gallery_label">
+                                    <property name="visible">True</property>
+                                    <property name="label" translatable="yes">_Account:</property>
+                                    <property name="use_underline">True</property>
+                                    <property name="mnemonic_widget">gallery_optionmenu</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkOptionMenu" id="gallery_optionmenu">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="response_id">0</property>
+                                    <signal name="changed" handler="HandleAccountSelected"/>
+                                  </widget>
+                                  <packing>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkButton" id="gallery_button">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="label">gtk-add</property>
+                                    <property name="use_stock">True</property>
+                                    <property name="response_id">0</property>
+                                    <signal name="clicked" handler="HandleAddGallery"/>
+                                  </widget>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">2</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkButton" id="edit_button">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="label">gtk-edit</property>
+                                    <property name="use_stock">True</property>
+                                    <property name="response_id">0</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">3</property>
+                                  </packing>
+                                </child>
+                              </widget>
+                            </child>
+                            <child>
+                              <widget class="GtkLabel" id="label222">
+                                <property name="visible">True</property>
+                                <property name="xalign">0</property>
+                                <property name="use_markup">True</property>
+                              </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </widget>
+                        </child>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkLabel" id="label223">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">&lt;b&gt;SmugMug Export&lt;/b&gt;</property>
+                        <property name="use_markup">True</property>
+                      </widget>
+                      <packing>
+                        <property name="type">label_item</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkFrame" id="frame52">
+                    <property name="visible">True</property>
+                    <property name="label_xalign">0</property>
+                    <property name="shadow_type">GTK_SHADOW_NONE</property>
+                    <child>
+                      <widget class="GtkAlignment" id="alignment69">
+                        <property name="visible">True</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <widget class="GtkVBox" id="vbox91">
+                            <property name="visible">True</property>
+                            <property name="spacing">6</property>
+                            <child>
+                              <widget class="GtkHBox" id="hbox93">
+                                <property name="visible">True</property>
+                                <property name="spacing">6</property>
+                                <child>
+                                  <widget class="GtkLabel" id="album_label">
+                                    <property name="visible">True</property>
+                                    <property name="label" translatable="yes">_Export to Album:</property>
+                                    <property name="use_underline">True</property>
+                                    <property name="mnemonic_widget">album_optionmenu</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkOptionMenu" id="album_optionmenu">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="response_id">0</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkButton" id="album_button">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="label">gtk-add</property>
+                                    <property name="use_stock">True</property>
+                                    <property name="response_id">0</property>
+                                    <signal name="clicked" handler="HandleAddAlbum"/>
+                                  </widget>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">2</property>
+                                  </packing>
+                                </child>
+                              </widget>
+                            </child>
+                            <child>
+                              <widget class="GtkCheckButton" id="browser_check">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="label" translatable="yes">Open _album in browser when done uploading</property>
+                                <property name="use_underline">True</property>
+                                <property name="response_id">0</property>
+                                <property name="active">True</property>
+                                <property name="draw_indicator">True</property>
+                              </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </widget>
+                        </child>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkLabel" id="label225">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">&lt;b&gt;Album&lt;/b&gt;</property>
+                        <property name="use_markup">True</property>
+                      </widget>
+                      <packing>
+                        <property name="type">label_item</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkFrame" id="frame53">
+                    <property name="visible">True</property>
+                    <property name="label_xalign">0</property>
+                    <property name="shadow_type">GTK_SHADOW_NONE</property>
+                    <child>
+                      <widget class="GtkAlignment" id="alignment70">
+                        <property name="visible">True</property>
+                        <property name="left_padding">12</property>
+                        <child>
+                          <widget class="GtkVBox" id="vbox92">
+                            <property name="visible">True</property>
+                            <property name="spacing">6</property>
+                            <child>
+                              <widget class="GtkHBox" id="hbox94">
+                                <property name="visible">True</property>
+                                <child>
+                                  <widget class="GtkCheckButton" id="scale_check">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="label" translatable="yes">_Resize to: </property>
+                                    <property name="use_underline">True</property>
+                                    <property name="response_id">0</property>
+                                    <property name="draw_indicator">True</property>
+                                    <signal name="toggled" handler="HandleSizeActive"/>
+                                  </widget>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkSpinButton" id="size_spin">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">True</property>
+                                    <property name="adjustment">400 0 10000 1 10 10</property>
+                                    <property name="climb_rate">1</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">1</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkLabel" id="label226">
+                                    <property name="visible">True</property>
+                                    <property name="label" translatable="yes">pixels</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="expand">False</property>
+                                    <property name="fill">False</property>
+                                    <property name="position">2</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <placeholder/>
+                                </child>
+                              </widget>
+                            </child>
+                            <child>
+                              <widget class="GtkCheckButton" id="rotate_check">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="label" translatable="yes">Autorotate</property>
+                                <property name="use_underline">True</property>
+                                <property name="response_id">0</property>
+                                <property name="draw_indicator">True</property>
+                              </widget>
+                              <packing>
+                                <property name="expand">False</property>
+                                <property name="fill">False</property>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                          </widget>
+                        </child>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkLabel" id="label227">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">&lt;b&gt;Style&lt;/b&gt;</property>
+                        <property name="use_markup">True</property>
+                      </widget>
+                      <packing>
+                        <property name="type">label_item</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <widget class="GtkHButtonBox" id="hbuttonbox14">
+            <property name="visible">True</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <widget class="GtkButton" id="cancel_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="label">gtk-cancel</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">-6</property>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkButton" id="export_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="label">_Export</property>
+                <property name="use_underline">True</property>
+                <property name="response_id">-5</property>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="GtkDialog" id="smugmug_add_album_dialog">
+    <property name="visible">True</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <widget class="GtkVBox" id="vbox93">
+        <property name="visible">True</property>
+        <child>
+          <widget class="GtkTable" id="table26">
+            <property name="visible">True</property>
+            <property name="border_width">12</property>
+            <property name="n_rows">3</property>
+            <property name="n_columns">2</property>
+            <property name="column_spacing">7</property>
+            <property name="row_spacing">6</property>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="category_label">
+                <property name="visible">True</property>
+                <property name="xalign">1</property>
+                <property name="label" translatable="yes">_Description:</property>
+                <property name="use_underline">True</property>
+              </widget>
+              <packing>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+                <property name="x_options">GTK_FILL</property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="name_label">
+                <property name="visible">True</property>
+                <property name="xalign">1</property>
+                <property name="label" translatable="yes">_Album Title:</property>
+                <property name="use_underline">True</property>
+                <property name="mnemonic_widget">title_entry</property>
+              </widget>
+              <packing>
+                <property name="x_options">GTK_FILL</property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkEntry" id="title_entry">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="invisible_char">*</property>
+              </widget>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkCheckButton" id="public_check">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="label" translatable="yes">Public Album</property>
+                <property name="use_underline">True</property>
+                <property name="response_id">0</property>
+                <property name="draw_indicator">True</property>
+              </widget>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">2</property>
+                <property name="bottom_attach">3</property>
+                <property name="x_options">GTK_FILL</property>
+                <property name="y_options"></property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkComboBox" id="category_combo">
+                <property name="visible">True</property>
+              </widget>
+              <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+                <property name="x_options">GTK_FILL</property>
+                <property name="y_options">GTK_FILL</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <widget class="GtkHButtonBox" id="hbuttonbox15">
+            <property name="visible">True</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <widget class="GtkButton" id="cancele_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="label">gtk-cancel</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">-6</property>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkButton" id="add_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="label">gtk-add</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">-5</property>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="GtkDialog" id="smugmug_add_dialog">
+    <property name="visible">True</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <widget class="GtkVBox" id="vbox97">
+        <property name="visible">True</property>
+        <child>
+          <widget class="GtkVBox" id="vbox98">
+            <property name="visible">True</property>
+            <child>
+              <widget class="GtkTable" id="table28">
+                <property name="visible">True</property>
+                <property name="border_width">12</property>
+                <property name="n_rows">2</property>
+                <property name="n_columns">2</property>
+                <property name="column_spacing">7</property>
+                <property name="row_spacing">6</property>
+                <child>
+                  <widget class="GtkLabel" id="password_label">
+                    <property name="visible">True</property>
+                    <property name="xalign">1</property>
+                    <property name="label" translatable="yes">_Password:</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">password_entry</property>
+                  </widget>
+                  <packing>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options"></property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkEntry" id="password_entry">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="visibility">False</property>
+                    <property name="invisible_char">*</property>
+                  </widget>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
+                    <property name="y_options"></property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkLabel" id="username_label">
+                    <property name="visible">True</property>
+                    <property name="xalign">1</property>
+                    <property name="label" translatable="yes">_Username:</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">username_entry</property>
+                  </widget>
+                  <packing>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options"></property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="GtkEntry" id="username_entry">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">*</property>
+                  </widget>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="y_options"></property>
+                  </packing>
+                </child>
+              </widget>
+              <packing>
+                <property name="fill">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <widget class="GtkHButtonBox" id="hbuttonbox16">
+            <property name="visible">True</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
+            <child>
+              <widget class="GtkButton" id="cancel_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="label">gtk-cancel</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">-6</property>
+              </widget>
+            </child>
+            <child>
+              <widget class="GtkButton" id="remove_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="label">gtk-remove</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">-2</property>
+              </widget>
+              <packing>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkButton" id="add_button">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="label">gtk-add</property>
+                <property name="use_stock">True</property>
+                <property name="response_id">-5</property>
+              </widget>
+              <packing>
+                <property name="position">2</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
+</glade-interface>

Added: trunk/extensions/SmugMugExport/SmugMugNet/Makefile
==============================================================================
--- (empty file)
+++ trunk/extensions/SmugMugExport/SmugMugNet/Makefile	Fri Feb  8 14:42:33 2008
@@ -0,0 +1,511 @@
+# Makefile.in generated by automake 1.10 from Makefile.am.
+# extensions/SmugMugExport/SmugMugNet/Makefile.  Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+
+pkgdatadir = $(datadir)/f-spot
+pkglibdir = $(libdir)/f-spot
+pkgincludedir = $(includedir)/f-spot
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = i686-suse-linux-gnu
+host_triplet = i686-suse-linux-gnu
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+	$(top_srcdir)/Makefile.include
+subdir = extensions/SmugMugExport/SmugMugNet
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+	$(top_srcdir)/configure.in
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+SOURCES =
+DIST_SOURCES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(assemblydir)"
+assemblyDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(assembly_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/sde/f-spot/f-spot/missing --run aclocal-1.10
+ALL_LINGUAS = 
+AMTAR = ${SHELL} /home/sde/f-spot/f-spot/missing --run tar
+AR = ar
+AUTOCONF = ${SHELL} /home/sde/f-spot/f-spot/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/sde/f-spot/f-spot/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/sde/f-spot/f-spot/missing --run automake-1.10
+AWK = gawk
+BEAGLE_CFLAGS = 
+BEAGLE_DEFINES = 
+BEAGLE_DIR = 
+BEAGLE_LIBS = 
+CATALOGS = 
+CATOBJEXT = .gmo
+CC = gcc
+CCDEPMODE = depmode=gcc3
+CFLAGS = -g -O2
+CPP = gcc -E
+CPPFLAGS = 
+CSC = gmcs $(CSC_FLAGS) -target:exe
+CSC_DEFINES = -d:GTK_2_10
+CXX = g++
+CXXCPP = g++ -E
+CXXDEPMODE = depmode=gcc3
+CXXFLAGS = -g -O2
+CYGPATH_W = echo
+DATADIRNAME = share
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+DIR_DBUS = 
+DIR_DBUS_GLIB = 
+DOC_USER_FORMATS = 
+ECHO = echo
+ECHO_C = 
+ECHO_N = -n
+ECHO_T = 
+EGREP = /usr/bin/grep -E
+EXEEXT = 
+EXIF_CFLAGS =  
+EXIF_LIBS = -lexif -lm  
+EXIF_SOVERSION = 12
+F77 = gfortran
+FFLAGS = -g -O2
+F_CFLAGS = -DORBIT2=1 -pthread -D_REENTRANT -I/usr/include/libgnome-2.0 -I/usr/include/orbit-2.0 -I/usr/include/gconf/2 -I/usr/include/gnome-vfs-2.0 -I/usr/lib/gnome-vfs-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/libbonobo-2.0 -I/usr/include/bonobo-activation-2.0 -I/usr/include/libgnomeui-2.0 -I/usr/include/libart-2.0 -I/usr/include/gnome-keyring-1 -I/usr/include/libbonoboui-2.0 -I/usr/include/libgnomecanvas-2.0 -I/usr/include/gtk-2.0 -I/usr/include/libxml2 -I/usr/include/pango-1.0 -I/usr/include/freetype2 -I/usr/include/gail-1.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/libpng12 -I:/usr/lib/pkgconfig/../../share/gapi-2.0/gtkhtml-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/gnome-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/pango-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/atk-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/gdk-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-
 2.0/gtk-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/art-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/gnome-vfs-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/glade-api.xml -I/usr/lib/pkgconfig/../../include/mono-1.0  
+F_LIBS = -pthread -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/gtkhtml-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/gnome-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/pango-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/atk-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/gdk-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/gtk-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/art-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/gnome-vfs-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/glib-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/glade-sharp.dll -L/usr/lib/pkgconfig/../../lib -lgnomeui-2 -lSM -lICE -lbonoboui-2 -lgnomevfs-2 -lgnomecanvas-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-activation -lart_lgpl_2 -lgconf-2 -lORBit-2 -lexif -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 
 -lmono -ldl -lpthread -lm -lgthread-2.0 -lrt -lglib-2.0  
+GCONFTOOL = /usr/bin/gconftool-2
+GCONF_SCHEMA_CONFIG_SOURCE = xml::/etc/gconf/gconf.xml.schemas
+GCONF_SCHEMA_FILE_DIR = $(sysconfdir)/gconf/schemas
+GCONF_SHARP_CFLAGS = -I:/usr/lib/pkgconfig/../../share/gapi-2.0/gnome-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/pango-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/atk-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/gdk-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/gtk-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/art-api.xml -I:/usr/lib/pkgconfig/../../share/gapi-2.0/gnome-vfs-api.xml  
+GCONF_SHARP_LIBS = -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/gconf-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/gconf-sharp-peditors.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/gnome-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/pango-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/atk-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/gdk-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/gtk-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/art-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/gnome-vfs-sharp.dll -r:/usr/lib/pkgconfig/../../lib/mono/gtk-sharp-2.0/glib-sharp.dll  
+GETTEXT_PACKAGE = f-spot
+GLIB_CFLAGS = -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include  
+GLIB_GENMARSHAL = glib-genmarshal
+GLIB_LIBS = -lglib-2.0  
+GLIB_MKENUMS = glib-mkenums
+GMOFILES = 
+GMSGFMT = /usr/bin/msgfmt
+GNOME_ICON_THEME_PREFIX = 
+GNOME_SCREENSAVER_SAVERDIR = NONE/libexec/gnome-screensaver
+GNOME_SCREENSAVER_THEMESDIR = NONE/share/applications/screensavers
+GOBJECT_QUERY = gobject-query
+GREP = /usr/bin/grep
+HELP_DIR = ${datadir}/gnome/help
+ICONS_DIRECTORY = ${datarootdir}/f-spot-0.4.2
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
+INSTOBJEXT = .mo
+INTLLIBS = 
+INTLTOOL_CAVES_RULE = %.caves:     %.caves.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_DESKTOP_RULE = %.desktop:   %.desktop.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_DIRECTORY_RULE = %.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_EXTRACT = $(top_builddir)/intltool-extract
+INTLTOOL_ICONV = /usr/bin/iconv
+INTLTOOL_KBD_RULE = %.kbd:       %.kbd.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_KEYS_RULE = %.keys:      %.keys.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_MERGE = $(top_builddir)/intltool-merge
+INTLTOOL_MSGFMT = /usr/bin/msgfmt
+INTLTOOL_MSGMERGE = /usr/bin/msgmerge
+INTLTOOL_OAF_RULE = %.oaf:       %.oaf.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< $@
+INTLTOOL_PERL = /usr/bin/perl
+INTLTOOL_PONG_RULE = %.pong:      %.pong.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_PROP_RULE = %.prop:      %.prop.in      $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_SCHEMAS_RULE = %.schemas:   %.schemas.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_SERVER_RULE = %.server:    %.server.in    $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_SERVICE_RULE = %.service: %.service.in   $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_SHEET_RULE = %.sheet:     %.sheet.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_SOUNDLIST_RULE = %.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_THEME_RULE = %.theme:     %.theme.in     $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_UI_RULE = %.ui:        %.ui.in        $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_UPDATE = $(top_builddir)/intltool-update
+INTLTOOL_XAM_RULE = %.xam:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+INTLTOOL_XGETTEXT = /usr/bin/xgettext
+INTLTOOL_XML_NOMERGE_RULE = %.xml:       %.xml.in       $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< $@
+INTLTOOL_XML_RULE = %.xml:       %.xml.in       $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
+LCMS_CFLAGS =  
+LCMS_LIBS = -llcms  
+LDFLAGS = 
+LIBEXIF_VERSION_CHECK_CFLAGS =  
+LIBEXIF_VERSION_CHECK_LIBS = -lexif -lm  
+LIBGPHOTO2_CFLAGS = -I/usr/include/gphoto2  
+LIBGPHOTO2_LIBS = -lgphoto2 -lgphoto2_port -lexif -lm -lusb  
+LIBJPEG = -ljpeg
+LIBOBJS = 
+LIBS = -ljpeg 
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LINK_BEAGLE = 
+LINK_DBUS = -pkg:ndesk-dbus-1.0 -pkg:ndesk-dbus-glib-1.0
+LN_S = ln -s
+LTLIBOBJS = 
+MAINT = 
+MAKEINFO = ${SHELL} /home/sde/f-spot/f-spot/missing --run makeinfo
+MCS = /usr/bin/gmcs
+MKDIR_P = /bin/mkdir -p
+MONO = /usr/bin/mono
+MONO_NUNIT_CFLAGS =  
+MONO_NUNIT_LIBS = -r:/usr/lib/pkgconfig/../../lib/mono/1.0/nunit.core.dll -r:/usr/lib/pkgconfig/../../lib/mono/1.0/nunit.framework.dll -r:/usr/lib/pkgconfig/../../lib/mono/1.0/nunit.util.dll  
+MSGFMT = /usr/bin/msgfmt
+MSGFMT_OPTS = -c
+NDESK_DBUS_CFLAGS =  
+NDESK_DBUS_LIBS = -r:/usr/lib/mono/ndesk-dbus-1.0/NDesk.DBus.dll -r:/usr/lib/mono/ndesk-dbus-glib-1.0/NDesk.DBus.GLib.dll  
+NUNIT22_CFLAGS = 
+NUNIT22_LIBS = 
+NUNIT_CFLAGS = 
+NUNIT_DEFINES = -d:ENABLE_NUNIT
+NUNIT_LIBS = -r:/usr/lib/pkgconfig/../../lib/mono/1.0/nunit.core.dll -r:/usr/lib/pkgconfig/../../lib/mono/1.0/nunit.framework.dll -r:/usr/lib/pkgconfig/../../lib/mono/1.0/nunit.util.dll  
+NUNIT_PKG = -pkg:mono-nunit
+OBJEXT = o
+OMF_DIR = ${datadir}/omf
+PACKAGE = f-spot
+PACKAGE_BUGREPORT = 
+PACKAGE_NAME = F-Spot
+PACKAGE_STRING = F-Spot 0.4.2
+PACKAGE_TARNAME = f-spot
+PACKAGE_VERSION = 0.4.2
+PATH_DBUS = 
+PATH_SEPARATOR = :
+PKG_CONFIG = /usr/bin/pkg-config
+POFILES = 
+POSUB = po
+PO_IN_DATADIR_FALSE = 
+PO_IN_DATADIR_TRUE = 
+RANLIB = ranlib
+SED = /usr/bin/sed
+SET_MAKE = 
+SHELL = /bin/sh
+STRIP = strip
+TURTLEDIR = 
+USE_NLS = yes
+VERSION = 0.4.2
+XGETTEXT = /usr/bin/xgettext
+abs_builddir = /home/sde/f-spot/f-spot/extensions/SmugMugExport/SmugMugNet
+abs_srcdir = /home/sde/f-spot/f-spot/extensions/SmugMugExport/SmugMugNet
+abs_top_builddir = /home/sde/f-spot/f-spot
+abs_top_srcdir = /home/sde/f-spot/f-spot
+ac_ct_CC = gcc
+ac_ct_CXX = g++
+ac_ct_F77 = gfortran
+am__include = include
+am__leading_dot = .
+am__quote = 
+am__tar = tar --format=ustar -chf - "$$tardir"
+am__untar = tar -xf -
+bindir = ${exec_prefix}/bin
+build = i686-suse-linux-gnu
+build_alias = 
+build_cpu = i686
+build_os = linux-gnu
+build_vendor = suse
+builddir = .
+datadir = ${datarootdir}
+datarootdir = ${prefix}/share
+docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
+dvidir = ${docdir}
+exec_prefix = ${prefix}
+expanded_libdir = /usr/local/lib
+host = i686-suse-linux-gnu
+host_alias = 
+host_cpu = i686
+host_os = linux-gnu
+host_vendor = suse
+htmldir = ${docdir}
+includedir = ${prefix}/include
+infodir = ${datarootdir}/info
+install_sh = $(SHELL) /home/sde/f-spot/f-spot/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${exec_prefix}/libexec
+localedir = ${datarootdir}/locale
+localstatedir = ${prefix}/var
+mandir = ${datarootdir}/man
+mkdir_p = /bin/mkdir -p
+oldincludedir = /usr/include
+pdfdir = ${docdir}
+prefix = /usr/local
+program_transform_name = s,x,x,
+psdir = ${docdir}
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+srcdir = .
+sysconfdir = ${prefix}/etc
+target_alias = 
+top_builddir = ../../..
+top_srcdir = ../../..
+DIR_ADDINS_ADDINS = $(top_builddir)/mono-addins/Mono.Addins
+DIR_ADDINS_GUI = $(top_builddir)/mono-addins/Mono.Addins.Gui
+DIR_ADDINS_SETUP = $(top_builddir)/mono-addins/Mono.Addins.Setup
+DIR_DOCS = $(top_builddir)/docs
+DIR_EXTENSIONS = $(top_builddir)/extensions
+DIR_GLITZ = $(top_builddir)/glitz-sharp/src
+DIR_GOOGLE = $(top_builddir)/google-sharp
+DIR_GPHOTO2 = $(top_builddir)/libgphoto2-sharp
+DIR_ICONS = $(top_builddir)/icons
+DIR_JPEGTRAN = $(top_builddir)/libjpegtran
+DIR_KEYRING = $(top_builddir)/gnome-keyring-sharp
+DIR_LIBEOG = $(top_builddir)/libeog
+DIR_LIBFSPOT = $(top_builddir)/libfspot
+DIR_SEMWEB = $(top_builddir)/semweb
+DIR_SRC = $(top_builddir)/src
+DIR_TAO_OPENGL = $(top_builddir)/Tao/Tao.OpenGl
+DIR_TAO_GLU = $(top_builddir)/Tao/Tao.OpenGl.Glu
+DIR_TAO_EXTENSIONLOADER = $(top_builddir)/Tao/Tao.OpenGl.ExtensionLoader
+DIR_TAO_GLPOSTPROCESS = $(top_builddir)/Tao/Tao.GlPostProcess
+LINK_KEYRING = -r:$(DIR_KEYRING)/gnome-keyring-sharp.dll
+LINK_GLITZ = -r:$(DIR_GLITZ)/NDesk.Glitz.dll 
+LINK_GOOGLE = -r:$(DIR_GOOGLE)/Mono.Google.dll
+LINK_GPHOTO2 = -r:$(DIR_GPHOTO2)/libgphoto2-sharp.dll
+LINK_MONO_ADDINS = \
+	-r:$(DIR_ADDINS_ADDINS)/Mono.Addins.dll		\
+	-r:$(DIR_ADDINS_SETUP)/Mono.Addins.Setup.dll	\
+	-r:$(DIR_ADDINS_GUI)/Mono.Addins.Gui.dll
+
+LINK_SEMWEB = -r:$(DIR_SEMWEB)/SemWeb.dll
+LINK_TAO = \
+	-r:$(DIR_TAO_OPENGL)/Tao.OpenGl.dll				\
+	-r:$(DIR_TAO_GLU)/Tao.OpenGl.Glu.dll				\
+	-r:$(DIR_TAO_EXTENSIONLOADER)/Tao.OpenGl.ExtensionLoader.dll
+
+CSC_FLAGS = -debug
+CSC_LIB = gmcs $(CSC_FLAGS) -target:library
+MONO_DEBUGFLAGS = --debug
+RUNTIME = mono $(MONO_DEBUGFLAGS)
+ASSEMBLY_NAME = SmugMugNet
+ASSEMBLY_SOURCES = \
+	$(srcdir)/SmugMugApi.cs 		\
+	$(srcdir)/NoCheckCertificatePolicy.cs 		
+
+REFS = 
+PKGS = 
+ASSEMBLY = $(ASSEMBLY_NAME).dll
+assemblydir = $(pkglibdir)
+assembly_DATA = $(ASSEMBLY)
+EXTRA_DIST = $(ASSEMBLY_SOURCES)
+CLEANFILES = \
+	$(ASSEMBLY)		\
+	$(ASSEMBLY).mdb
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(top_srcdir)/Makefile.include $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  extensions/SmugMugExport/SmugMugNet/Makefile'; \
+	cd $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu  extensions/SmugMugExport/SmugMugNet/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure:  $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-assemblyDATA: $(assembly_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(assemblydir)" || $(MKDIR_P) "$(DESTDIR)$(assemblydir)"
+	@list='$(assembly_DATA)'; for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  f=$(am__strip_dir) \
+	  echo " $(assemblyDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(assemblydir)/$$f'"; \
+	  $(assemblyDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(assemblydir)/$$f"; \
+	done
+
+uninstall-assemblyDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(assembly_DATA)'; for p in $$list; do \
+	  f=$(am__strip_dir) \
+	  echo " rm -f '$(DESTDIR)$(assemblydir)/$$f'"; \
+	  rm -f "$(DESTDIR)$(assemblydir)/$$f"; \
+	done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+	    fi; \
+	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || cp -p $$d/$$file $(distdir)/$$file \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(DATA)
+installdirs:
+	for dir in "$(DESTDIR)$(assemblydir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	  `test -z '$(STRIP)' || \
+	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool mostlyclean-am
+
+distclean: distclean-am
+	-rm -f Makefile
+distclean-am: clean-am distclean-generic
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-assemblyDATA
+
+install-dvi: install-dvi-am
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-info: install-info-am
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-ps: install-ps-am
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-assemblyDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+	distclean distclean-generic distclean-libtool distdir dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-assemblyDATA install-data install-data-am install-dvi \
+	install-dvi-am install-exec install-exec-am install-html \
+	install-html-am install-info install-info-am install-man \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	uninstall uninstall-am uninstall-assemblyDATA
+
+
+all: $(ASSEMBLY)
+
+$(ASSEMBLY): $(ASSEMBLY_SOURCES)
+	$(CSC_LIB) -out:$@ $(PKGS) $(REFS) $(ASSEMBLY_SOURCES)
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:

Added: trunk/extensions/SmugMugExport/SmugMugNet/Makefile.am
==============================================================================
--- (empty file)
+++ trunk/extensions/SmugMugExport/SmugMugNet/Makefile.am	Fri Feb  8 14:42:33 2008
@@ -0,0 +1,27 @@
+include $(top_srcdir)/Makefile.include
+
+ASSEMBLY_NAME = SmugMugNet
+
+ASSEMBLY_SOURCES =				\
+	$(srcdir)/SmugMugApi.cs 		\
+	$(srcdir)/NoCheckCertificatePolicy.cs 		
+
+REFS =
+
+PKGS =
+
+ASSEMBLY = $(ASSEMBLY_NAME).dll
+
+all: $(ASSEMBLY)
+
+$(ASSEMBLY): $(ASSEMBLY_SOURCES)
+	$(CSC_LIB) -out:$@ $(PKGS) $(REFS) $(ASSEMBLY_SOURCES)
+
+assemblydir = $(pkglibdir)
+assembly_DATA =	$(ASSEMBLY)
+
+EXTRA_DIST = $(ASSEMBLY_SOURCES)
+
+CLEANFILES =			\
+	$(ASSEMBLY)		\
+	$(ASSEMBLY).mdb

Added: trunk/extensions/SmugMugExport/SmugMugNet/NoCheckCertificatePolicy.cs
==============================================================================
--- (empty file)
+++ trunk/extensions/SmugMugExport/SmugMugNet/NoCheckCertificatePolicy.cs	Fri Feb  8 14:42:33 2008
@@ -0,0 +1,38 @@
+// Authors:
+//	Gonzalo Paniagua Javier (gonzalo ximian com)
+//
+// (C) Copyright 2006 Novell, Inc. (http://www.novell.com)
+//
+
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System.Net;
+using System.Security.Cryptography.X509Certificates;
+
+namespace SmugMugNet {
+	public class NoCheckCertificatePolicy : ICertificatePolicy {
+		public bool CheckValidationResult (ServicePoint a, X509Certificate b, WebRequest c, int d)
+		{
+			return true;
+		}
+	}
+}
+

Added: trunk/extensions/SmugMugExport/SmugMugNet/SmugMugApi.cs
==============================================================================
--- (empty file)
+++ trunk/extensions/SmugMugExport/SmugMugNet/SmugMugApi.cs	Fri Feb  8 14:42:33 2008
@@ -0,0 +1,452 @@
+/*
+ * SmugMugApi.cs
+ *
+ * Authors:
+ *   Thomas Van Machelen <thomas vanmachelen gmail com>
+ *
+ * Copyright (C) 2006 Thomas Van Machelen
+ * This is free software. See COPYING for details.
+ *
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Net;
+using System.IO;
+using System.Xml;
+using System.Collections.Specialized;
+
+namespace SmugMugNet
+{
+	public struct Credentials
+	{
+		public string session_id;
+		public int user_id;
+		public string password_hash;
+
+		public string SessionID {
+			get { return session_id; } 
+			set { session_id = value; }
+		}
+
+		public int UserID {
+			get { return user_id; } 
+		}
+
+		public string PasswordHash {
+			get { return password_hash; } 
+		}
+
+		public Credentials(string session_id, int user_id, string password_hash)
+		{
+			this.session_id = session_id;
+			this.user_id = user_id;
+			this.password_hash = password_hash;
+		}
+	}
+
+	public struct Category
+	{
+		public Category( string title, int id)
+		{
+			this.title = title;
+			this.category_id = id;
+		}
+
+		private int category_id;
+		public int CategoryID
+		{
+			get { return category_id; }
+			set { category_id = value; }
+		}
+
+		private string title;
+		public string Title
+		{
+			get { return title; }
+			set { title = value; }
+		}
+	}
+
+	public struct Album
+	{
+		public Album(string title, int id)
+		{
+			this.album_id = id;
+			this.title = title;
+		}
+
+		private int album_id;
+		public int AlbumID
+		{
+			get { return album_id; }
+			set { album_id = value; }
+		}
+
+		private string title;
+		public string Title
+		{
+			get { return title; }
+			set { title = value; }
+		}
+	}
+
+	public class SmugMugApi
+	{
+		private string username = String.Empty;
+		private string password = String.Empty;
+		private bool connected = false;
+
+		private Credentials credentials;
+		private const string VERSION = "1.1.1";
+		private Category[] categories;
+
+		public SmugMugApi (string email_address, string password)
+		{
+			this.username = email_address;
+			this.password = password;
+		}
+
+		public bool Login ()
+		{
+			if (this.username.Length == 0 | this.password.Length == 0)
+			{
+				throw new SmugMugException("There is no username or password.");
+			}
+
+			if (this.connected == false && this.credentials.UserID == 0)
+			{
+				try
+				{
+					this.credentials = SmugMugProxy.LoginWithPassword (this.username, this.password);
+					this.connected = true;
+				}
+				catch
+				{
+					return false;
+				}
+			}
+			else
+			{
+				LoginWithHash ();
+			}
+
+			return true;
+		}
+
+		private void LoginWithHash ()
+		{ 
+			try {
+				string session_id = SmugMugProxy.LoginWithHash (this.credentials.UserID, this.credentials.PasswordHash);
+				
+				if (session_id != null && session_id.Length > 0)
+				{
+					this.credentials.SessionID = session_id;
+				}
+				else
+				{
+					throw new SmugMugException ("SessionID was empty");
+				}
+			}
+			catch (Exception ex) {
+				throw new SmugMugException ("A login error occured, SessionID may be invalid.", ex.InnerException);
+			}
+		}
+
+		public void Logout () 
+		{
+			if (!connected)
+			 	return; 
+
+			if (this.credentials.SessionID == null && this.credentials.SessionID.Length == 0)
+			 	return;
+
+			SmugMugProxy.Logout (this.credentials.SessionID);
+			connected = false;
+			this.credentials = new Credentials (null, 0, null);
+		}
+
+		public Category[] GetCategories ()
+		{
+			if (this.categories == null)
+			{
+				try {
+					this.categories = SmugMugProxy.GetCategories (credentials.SessionID);
+				}
+				catch (Exception ex) {
+					throw new SmugMugException ("Could not retrieve Categories", ex.InnerException);
+				}
+			}
+			return this.categories;
+		}
+
+		public Album CreateAlbum (string title, int category_id, bool is_public)
+		{
+		 	try {
+				return SmugMugProxy.CreateAlbum (title, category_id, credentials.SessionID, is_public);
+			}
+			catch (Exception ex) {
+				throw new SmugMugException ("Could not create album", ex.InnerException);
+			}
+		}
+
+		public Album[] GetAlbums ()
+		{
+		 	try {
+				return SmugMugProxy.GetAlbums(credentials.SessionID);
+			}
+			catch (Exception ex) {
+				throw new SmugMugException ("Could not get albums", ex.InnerException);
+			}
+		}
+
+		public Uri GetAlbumUrl (int image_id)
+		{
+			try {
+				return SmugMugProxy.GetAlbumUrl (image_id, credentials.SessionID);
+			}
+			catch (Exception ex) {
+				throw new SmugMugException ("Could not get album url", ex.InnerException);
+			}
+		}
+
+		public int Upload (string path, int album_id)
+		{
+		 	try {
+				return SmugMugProxy.Upload (path, album_id, credentials.SessionID);
+			}
+			catch (Exception ex) {
+				throw new SmugMugException ("Could not upload file", ex.InnerException);
+			}
+		}
+	}
+
+	public class SmugMugProxy
+	{
+	 	// FIXME: this getting should be done over https
+		private const string GET_URL = "https://api.SmugMug.com/hack/rest/";;
+		private const string POST_URL = "https://upload.SmugMug.com/hack/rest/";;
+		// key from massis
+		private const string APIKEY = "umtr0zB2wzwTZDhF2BySidg0hY0le3K6";
+		private const string VERSION = "1.1.1";
+
+		// rest methods
+		private const string LOGIN_WITHPASS_METHOD = "smugmug.login.withPassword";
+		private const string LOGIN_WITHHASH_METHOD = "smugmug.login.withHash";
+		private const string LOGOUT_METHOD = "smugmug.logout";
+		private const string ALBUMS_CREATE_METHOD = "smugmug.albums.create";
+		private const string ALBUMS_GET_URLS_METHOD = "smugmug.images.getURLs";
+		private const string ALBUMS_GET_METHOD = "smugmug.albums.get";
+		private const string CATEGORIES_GET_METHOD = "smugmug.categories.get";
+
+		// parameter constants
+		private const string EMAIL = "EmailAddress";
+		private const string PASSWORD = "Password";
+		private const string USER_ID = "UserID";
+		private const string PASSWORD_HASH = "PasswordHash";
+		private const string SESSION_ID = "SessionID";
+		private const string CATEGORY_ID = "CategoryID";
+		private const string IMAGE_ID = "ImageID";
+		private const string TITLE = "Title";
+		private const string ID = "id";
+
+		public static Credentials LoginWithPassword (string username, string password)
+		{
+			string url = FormatGetUrl (LOGIN_WITHPASS_METHOD, new SmugMugParam (EMAIL, username), new SmugMugParam (PASSWORD, password));
+			XmlDocument doc = GetResponseXml (url);
+
+			string sessionId = doc.SelectSingleNode ("/rsp/Login/SessionID").InnerText;
+			int userId = int.Parse (doc.SelectSingleNode ("/rsp/Login/UserID").InnerText);
+			string passwordHash = doc.SelectSingleNode ("/rsp/Login/PasswordHash").InnerText;
+			
+			return new Credentials (sessionId, userId, passwordHash);
+		}
+
+		public static string LoginWithHash (int user_id, string password_hash)
+		{
+			string url = FormatGetUrl (LOGIN_WITHHASH_METHOD, new SmugMugParam (USER_ID, user_id), new SmugMugParam (PASSWORD_HASH, password_hash));
+			XmlDocument doc = GetResponseXml(url);
+
+			return doc.SelectSingleNode ("/rsp/Login/SessionID").InnerText;
+		}
+
+		public static void Logout (string session_id)
+		{
+			string url = FormatGetUrl (LOGOUT_METHOD, new SmugMugParam (SESSION_ID, session_id));
+			GetResponseXml (url); 
+		}
+
+		public static Album[] GetAlbums (string session_id)
+		{
+			string url = FormatGetUrl (ALBUMS_GET_METHOD, new SmugMugParam(SESSION_ID, session_id));
+			XmlDocument doc = GetResponseXml (url);
+			XmlNodeList albumNodes = doc.SelectNodes ("/rsp/Albums/Album");
+
+			Album[] albums = new Album[albumNodes.Count];
+
+			for (int i = 0; i < albumNodes.Count; i++)
+			{
+				XmlNode current = albumNodes[i];
+				albums[i] = new Album (current.SelectSingleNode (TITLE).InnerText, int.Parse (current.Attributes[ID].Value));
+			}
+			return albums;
+		}
+
+		public static Uri GetAlbumUrl (int image_id, string session_id)
+		{
+			string url = FormatGetUrl(ALBUMS_GET_URLS_METHOD, new SmugMugParam(IMAGE_ID, image_id), new SmugMugParam(SESSION_ID, session_id));
+			XmlDocument doc = GetResponseXml(url);
+
+			string album_url = doc.SelectSingleNode("/rsp/ImageURLs/Image/AlbumURL").InnerText;
+
+			return new Uri(album_url);
+		}
+
+		public static Category[] GetCategories (string session_id)
+		{
+			string url = FormatGetUrl(CATEGORIES_GET_METHOD, new SmugMugParam (SESSION_ID, session_id));
+			XmlDocument doc = GetResponseXml (url);
+
+			XmlNodeList categoryNodes = doc.SelectNodes ("/rsp/Categories/Category");
+			Category[] categories = new Category[categoryNodes.Count];
+
+			for (int i = 0; i < categoryNodes.Count; i++)
+			{
+				XmlNode current = categoryNodes[i];
+				categories[i] = new Category (current.SelectSingleNode (TITLE).InnerText, int.Parse (current.Attributes[ID].Value));
+			}
+			return categories;
+		}
+
+		public static Album CreateAlbum (string title, int category_id, string session_id)
+		{
+			return CreateAlbum (title, category_id, session_id, true);	 
+		}
+
+		public static Album CreateAlbum (string title, int category_id, string session_id, bool is_public)
+		{
+		 	int public_int = is_public ? 1 : 0;
+			string url = FormatGetUrl (ALBUMS_CREATE_METHOD, new SmugMugParam (TITLE, title), new SmugMugParam (CATEGORY_ID, category_id), new SmugMugParam (SESSION_ID, session_id), new SmugMugParam ("Public", public_int));
+			XmlDocument doc = GetResponseXml (url);
+
+			int id = int.Parse(doc.SelectSingleNode("/rsp/Create/Album").Attributes[ID].Value);
+
+			return new Album(title, id);
+		}
+
+		public static int Upload (string path, int album_id, string session_id)
+		{
+			FileInfo file = new FileInfo(path);
+
+			if (!file.Exists)
+				throw new ArgumentException("Image does not exist: " + file.FullName);
+
+			try
+			{
+				WebClient client = new WebClient ();
+				client.BaseAddress = "http://upload.smugmug.com";;
+				client.Headers.Add ("Cookie:SMSESS=" + session_id);
+
+				NameValueCollection queryStringCollection = new NameValueCollection ();
+				queryStringCollection.Add ("AlbumID", album_id.ToString());
+				queryStringCollection.Add ("ResponseType", "REST");
+				client.QueryString = queryStringCollection;
+
+				byte[] responseArray = client.UploadFile ("http://upload.smugmug.com/photos/xmladd.mg";, "POST", file.FullName);
+				string response = Encoding.ASCII.GetString (responseArray);
+
+				XmlDocument doc = new XmlDocument ();
+				doc.LoadXml (response);
+
+				return int.Parse (doc.SelectSingleNode ("/rsp/ImageID").InnerText);
+			}
+			catch (Exception ex)
+			{
+				throw new SmugMugUploadException ("Error uploading image: " + file.FullName, ex.InnerException);
+			}
+		}
+
+		private static string FormatGetUrl(string method_name, params SmugMugParam[] parameters)
+		{
+			StringBuilder builder = new StringBuilder (string.Format ("{0}{1}/?method={2}", GET_URL, VERSION, method_name));
+
+			foreach (SmugMugParam param in parameters)
+				builder.Append (param.ToString ());
+
+			builder.Append (new SmugMugParam ("APIKey", APIKEY));
+			return builder.ToString();
+		}
+
+		private static XmlDocument GetResponseXml (string url)
+		{
+			HttpWebRequest request = HttpWebRequest.Create (url) as HttpWebRequest;
+			request.Credentials = CredentialCache.DefaultCredentials;
+			WebResponse response = request.GetResponse ();
+
+			XmlDocument doc = new XmlDocument ();
+			doc.LoadXml (new StreamReader (response.GetResponseStream ()).ReadToEnd ());
+			CheckResponseXml (doc);
+
+			response.Close ();
+			return doc;
+		}
+
+		private static void CheckResponseXml (XmlDocument doc)
+		{
+	 		if (doc.SelectSingleNode("/rsp").Attributes["stat"].Value == "ok")
+		 		return;
+
+			string message = doc.SelectSingleNode ("/rsp/err").Attributes["msg"].Value;
+			throw new SmugMugException (message);
+		}
+
+		private class SmugMugParam
+		{
+			string name;
+			object value;
+
+			public SmugMugParam (string name, object value)
+			{
+				this.name = name;
+				this.value = value;
+			}
+
+			public string Name 
+			{
+				get {return name;}
+			}
+
+			public object Value
+			{
+				get {return value;}
+			}
+
+			public override string ToString()
+			{
+				return string.Format("&{0}={1}", Name, Value);
+			}
+		}
+	}
+
+	public class SmugMugException : ApplicationException 
+	{
+		public SmugMugException(string message) : base (message) 
+		{
+			Console.WriteLine (message);
+		}
+
+		public SmugMugException (string message, Exception innerException) : base (message, innerException) 
+		{
+			Console.WriteLine (message, innerException.ToString());
+		}
+	}
+
+	public sealed class SmugMugUploadException : ApplicationException 
+	{
+		public SmugMugUploadException (string message, Exception innerException) : base (message, innerException) 
+		{
+			Console.WriteLine (message, innerException.ToString ());
+		}
+	}
+}

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am	(original)
+++ trunk/src/Makefile.am	Fri Feb  8 14:42:33 2008
@@ -208,7 +208,6 @@
 	$(srcdir)/SlideView.cs			\
 	$(srcdir)/SingleView.cs			\
 	$(srcdir)/SimpleCalendar.cs		\
-	$(srcdir)/SmugMugExport.cs		\
 	$(srcdir)/TagCommands.cs		\
 	$(srcdir)/TagMenu.cs			\
 	$(srcdir)/TagPopup.cs			\

Modified: trunk/src/f-spot.glade
==============================================================================
--- trunk/src/f-spot.glade	(original)
+++ trunk/src/f-spot.glade	Fri Feb  8 14:42:33 2008
@@ -9150,660 +9150,4 @@
       </widget>
     </child>
   </widget>
-  <widget class="GtkDialog" id="smugmug_export_dialog">
-    <property name="title" translatable="yes">Export</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-    <property name="has_separator">False</property>
-    <child internal-child="vbox">
-      <widget class="GtkVBox" id="vbox88">
-        <property name="visible">True</property>
-        <child>
-          <widget class="GtkHBox" id="hbox91">
-            <property name="visible">True</property>
-            <property name="border_width">6</property>
-            <child>
-              <widget class="GtkFrame" id="frame50">
-                <property name="visible">True</property>
-                <property name="label_xalign">0</property>
-                <property name="shadow_type">GTK_SHADOW_NONE</property>
-                <child>
-                  <widget class="GtkAlignment" id="alignment67">
-                    <property name="visible">True</property>
-                    <property name="left_padding">12</property>
-                    <child>
-                      <widget class="GtkScrolledWindow" id="thumb_scrolledwindow">
-                        <property name="width_request">180</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                        <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                        <property name="shadow_type">GTK_SHADOW_IN</property>
-                        <child>
-                          <placeholder/>
-                        </child>
-                      </widget>
-                    </child>
-                  </widget>
-                </child>
-                <child>
-                  <widget class="GtkLabel" id="label220">
-                    <property name="visible">True</property>
-                    <property name="label" translatable="yes">&lt;b&gt;Photos&lt;/b&gt;</property>
-                    <property name="use_markup">True</property>
-                  </widget>
-                  <packing>
-                    <property name="type">label_item</property>
-                  </packing>
-                </child>
-              </widget>
-            </child>
-            <child>
-              <widget class="GtkVBox" id="vbox89">
-                <property name="visible">True</property>
-                <property name="spacing">6</property>
-                <child>
-                  <widget class="GtkFrame" id="frame51">
-                    <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">GTK_SHADOW_NONE</property>
-                    <child>
-                      <widget class="GtkAlignment" id="alignment68">
-                        <property name="visible">True</property>
-                        <property name="left_padding">12</property>
-                        <child>
-                          <widget class="GtkVBox" id="vbox90">
-                            <property name="visible">True</property>
-                            <property name="spacing">6</property>
-                            <child>
-                              <widget class="GtkHBox" id="hbox92">
-                                <property name="visible">True</property>
-                                <property name="spacing">6</property>
-                                <child>
-                                  <widget class="GtkLabel" id="gallery_label">
-                                    <property name="visible">True</property>
-                                    <property name="label" translatable="yes">_Account:</property>
-                                    <property name="use_underline">True</property>
-                                    <property name="mnemonic_widget">gallery_optionmenu</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkOptionMenu" id="gallery_optionmenu">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="response_id">0</property>
-                                    <signal name="changed" handler="HandleAccountSelected"/>
-                                  </widget>
-                                  <packing>
-                                    <property name="position">1</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkButton" id="gallery_button">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="label">gtk-add</property>
-                                    <property name="use_stock">True</property>
-                                    <property name="response_id">0</property>
-                                    <signal name="clicked" handler="HandleAddGallery"/>
-                                  </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="position">2</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkButton" id="edit_button">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="label">gtk-edit</property>
-                                    <property name="use_stock">True</property>
-                                    <property name="response_id">0</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="position">3</property>
-                                  </packing>
-                                </child>
-                              </widget>
-                            </child>
-                            <child>
-                              <widget class="GtkLabel" id="label222">
-                                <property name="visible">True</property>
-                                <property name="xalign">0</property>
-                                <property name="use_markup">True</property>
-                              </widget>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                          </widget>
-                        </child>
-                      </widget>
-                    </child>
-                    <child>
-                      <widget class="GtkLabel" id="label223">
-                        <property name="visible">True</property>
-                        <property name="label" translatable="yes">&lt;b&gt;SmugMug Export&lt;/b&gt;</property>
-                        <property name="use_markup">True</property>
-                      </widget>
-                      <packing>
-                        <property name="type">label_item</property>
-                      </packing>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkFrame" id="frame52">
-                    <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">GTK_SHADOW_NONE</property>
-                    <child>
-                      <widget class="GtkAlignment" id="alignment69">
-                        <property name="visible">True</property>
-                        <property name="left_padding">12</property>
-                        <child>
-                          <widget class="GtkVBox" id="vbox91">
-                            <property name="visible">True</property>
-                            <property name="spacing">6</property>
-                            <child>
-                              <widget class="GtkHBox" id="hbox93">
-                                <property name="visible">True</property>
-                                <property name="spacing">6</property>
-                                <child>
-                                  <widget class="GtkLabel" id="album_label">
-                                    <property name="visible">True</property>
-                                    <property name="label" translatable="yes">_Export to Album:</property>
-                                    <property name="use_underline">True</property>
-                                    <property name="mnemonic_widget">album_optionmenu</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkOptionMenu" id="album_optionmenu">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="response_id">0</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="position">1</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkButton" id="album_button">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="label">gtk-add</property>
-                                    <property name="use_stock">True</property>
-                                    <property name="response_id">0</property>
-                                    <signal name="clicked" handler="HandleAddAlbum"/>
-                                  </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="position">2</property>
-                                  </packing>
-                                </child>
-                              </widget>
-                            </child>
-                            <child>
-                              <widget class="GtkCheckButton" id="browser_check">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Open _album in browser when done uploading</property>
-                                <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
-                                <property name="active">True</property>
-                                <property name="draw_indicator">True</property>
-                              </widget>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                          </widget>
-                        </child>
-                      </widget>
-                    </child>
-                    <child>
-                      <widget class="GtkLabel" id="label225">
-                        <property name="visible">True</property>
-                        <property name="label" translatable="yes">&lt;b&gt;Album&lt;/b&gt;</property>
-                        <property name="use_markup">True</property>
-                      </widget>
-                      <packing>
-                        <property name="type">label_item</property>
-                      </packing>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkFrame" id="frame53">
-                    <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">GTK_SHADOW_NONE</property>
-                    <child>
-                      <widget class="GtkAlignment" id="alignment70">
-                        <property name="visible">True</property>
-                        <property name="left_padding">12</property>
-                        <child>
-                          <widget class="GtkVBox" id="vbox92">
-                            <property name="visible">True</property>
-                            <property name="spacing">6</property>
-                            <child>
-                              <widget class="GtkHBox" id="hbox94">
-                                <property name="visible">True</property>
-                                <child>
-                                  <widget class="GtkCheckButton" id="scale_check">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="label" translatable="yes">_Resize to: </property>
-                                    <property name="use_underline">True</property>
-                                    <property name="response_id">0</property>
-                                    <property name="draw_indicator">True</property>
-                                    <signal name="toggled" handler="HandleSizeActive"/>
-                                  </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkSpinButton" id="size_spin">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="adjustment">400 0 10000 1 10 10</property>
-                                    <property name="climb_rate">1</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="position">1</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkLabel" id="label226">
-                                    <property name="visible">True</property>
-                                    <property name="label" translatable="yes">pixels</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">False</property>
-                                    <property name="position">2</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <placeholder/>
-                                </child>
-                              </widget>
-                            </child>
-                            <child>
-                              <widget class="GtkCheckButton" id="rotate_check">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="label" translatable="yes">Autorotate</property>
-                                <property name="use_underline">True</property>
-                                <property name="response_id">0</property>
-                                <property name="draw_indicator">True</property>
-                              </widget>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="fill">False</property>
-                                <property name="position">1</property>
-                              </packing>
-                            </child>
-                          </widget>
-                        </child>
-                      </widget>
-                    </child>
-                    <child>
-                      <widget class="GtkLabel" id="label227">
-                        <property name="visible">True</property>
-                        <property name="label" translatable="yes">&lt;b&gt;Style&lt;/b&gt;</property>
-                        <property name="use_markup">True</property>
-                      </widget>
-                      <packing>
-                        <property name="type">label_item</property>
-                      </packing>
-                    </child>
-                  </widget>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </widget>
-          <packing>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child internal-child="action_area">
-          <widget class="GtkHButtonBox" id="hbuttonbox14">
-            <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
-            <child>
-              <widget class="GtkButton" id="cancel_button">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="label">gtk-cancel</property>
-                <property name="use_stock">True</property>
-                <property name="response_id">-6</property>
-              </widget>
-            </child>
-            <child>
-              <widget class="GtkButton" id="export_button">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="label">_Export</property>
-                <property name="use_underline">True</property>
-                <property name="response_id">-5</property>
-              </widget>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </widget>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
-          </packing>
-        </child>
-      </widget>
-    </child>
-  </widget>
-  <widget class="GtkDialog" id="smugmug_add_album_dialog">
-    <property name="visible">True</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-    <property name="has_separator">False</property>
-    <child internal-child="vbox">
-      <widget class="GtkVBox" id="vbox93">
-        <property name="visible">True</property>
-        <child>
-          <widget class="GtkTable" id="table26">
-            <property name="visible">True</property>
-            <property name="border_width">12</property>
-            <property name="n_rows">3</property>
-            <property name="n_columns">2</property>
-            <property name="column_spacing">7</property>
-            <property name="row_spacing">6</property>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <widget class="GtkLabel" id="category_label">
-                <property name="visible">True</property>
-                <property name="xalign">1</property>
-                <property name="label" translatable="yes">_Description:</property>
-                <property name="use_underline">True</property>
-              </widget>
-              <packing>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-                <property name="x_options">GTK_FILL</property>
-                <property name="y_options"></property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkLabel" id="name_label">
-                <property name="visible">True</property>
-                <property name="xalign">1</property>
-                <property name="label" translatable="yes">_Album Title:</property>
-                <property name="use_underline">True</property>
-                <property name="mnemonic_widget">title_entry</property>
-              </widget>
-              <packing>
-                <property name="x_options">GTK_FILL</property>
-                <property name="y_options"></property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkEntry" id="title_entry">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="invisible_char">*</property>
-              </widget>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="y_options"></property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkCheckButton" id="public_check">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="label" translatable="yes">Public Album</property>
-                <property name="use_underline">True</property>
-                <property name="response_id">0</property>
-                <property name="draw_indicator">True</property>
-              </widget>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">2</property>
-                <property name="bottom_attach">3</property>
-                <property name="x_options">GTK_FILL</property>
-                <property name="y_options"></property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkComboBox" id="category_combo">
-                <property name="visible">True</property>
-              </widget>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-                <property name="x_options">GTK_FILL</property>
-                <property name="y_options">GTK_FILL</property>
-              </packing>
-            </child>
-          </widget>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child internal-child="action_area">
-          <widget class="GtkHButtonBox" id="hbuttonbox15">
-            <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
-            <child>
-              <widget class="GtkButton" id="cancele_button">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="label">gtk-cancel</property>
-                <property name="use_stock">True</property>
-                <property name="response_id">-6</property>
-              </widget>
-            </child>
-            <child>
-              <widget class="GtkButton" id="add_button">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="has_default">True</property>
-                <property name="label">gtk-add</property>
-                <property name="use_stock">True</property>
-                <property name="response_id">-5</property>
-              </widget>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-          </widget>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
-          </packing>
-        </child>
-      </widget>
-    </child>
-  </widget>
-  <widget class="GtkDialog" id="smugmug_add_dialog">
-    <property name="visible">True</property>
-    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-    <property name="has_separator">False</property>
-    <child internal-child="vbox">
-      <widget class="GtkVBox" id="vbox97">
-        <property name="visible">True</property>
-        <child>
-          <widget class="GtkVBox" id="vbox98">
-            <property name="visible">True</property>
-            <child>
-              <widget class="GtkTable" id="table28">
-                <property name="visible">True</property>
-                <property name="border_width">12</property>
-                <property name="n_rows">2</property>
-                <property name="n_columns">2</property>
-                <property name="column_spacing">7</property>
-                <property name="row_spacing">6</property>
-                <child>
-                  <widget class="GtkLabel" id="password_label">
-                    <property name="visible">True</property>
-                    <property name="xalign">1</property>
-                    <property name="label" translatable="yes">_Password:</property>
-                    <property name="use_underline">True</property>
-                    <property name="mnemonic_widget">password_entry</property>
-                  </widget>
-                  <packing>
-                    <property name="top_attach">1</property>
-                    <property name="bottom_attach">2</property>
-                    <property name="x_options">GTK_FILL</property>
-                    <property name="y_options"></property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkEntry" id="password_entry">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="visibility">False</property>
-                    <property name="invisible_char">*</property>
-                  </widget>
-                  <packing>
-                    <property name="left_attach">1</property>
-                    <property name="right_attach">2</property>
-                    <property name="top_attach">1</property>
-                    <property name="bottom_attach">2</property>
-                    <property name="y_options"></property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkLabel" id="username_label">
-                    <property name="visible">True</property>
-                    <property name="xalign">1</property>
-                    <property name="label" translatable="yes">_Username:</property>
-                    <property name="use_underline">True</property>
-                    <property name="mnemonic_widget">username_entry</property>
-                  </widget>
-                  <packing>
-                    <property name="x_options">GTK_FILL</property>
-                    <property name="y_options"></property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkEntry" id="username_entry">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="invisible_char">*</property>
-                  </widget>
-                  <packing>
-                    <property name="left_attach">1</property>
-                    <property name="right_attach">2</property>
-                    <property name="y_options"></property>
-                  </packing>
-                </child>
-              </widget>
-              <packing>
-                <property name="fill">False</property>
-              </packing>
-            </child>
-          </widget>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
-            <property name="position">1</property>
-          </packing>
-        </child>
-        <child internal-child="action_area">
-          <widget class="GtkHButtonBox" id="hbuttonbox16">
-            <property name="visible">True</property>
-            <property name="layout_style">GTK_BUTTONBOX_END</property>
-            <child>
-              <widget class="GtkButton" id="cancel_button">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="label">gtk-cancel</property>
-                <property name="use_stock">True</property>
-                <property name="response_id">-6</property>
-              </widget>
-            </child>
-            <child>
-              <widget class="GtkButton" id="remove_button">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="label">gtk-remove</property>
-                <property name="use_stock">True</property>
-                <property name="response_id">-2</property>
-              </widget>
-              <packing>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <widget class="GtkButton" id="add_button">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="has_default">True</property>
-                <property name="label">gtk-add</property>
-                <property name="use_stock">True</property>
-                <property name="response_id">-5</property>
-              </widget>
-              <packing>
-                <property name="position">2</property>
-              </packing>
-            </child>
-          </widget>
-          <packing>
-            <property name="expand">False</property>
-            <property name="pack_type">GTK_PACK_END</property>
-          </packing>
-        </child>
-      </widget>
-    </child>
-  </widget>
 </glade-interface>



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