[glabels/vala] Reconciled design patterns of merge backends with barcode backends.



commit 9d2ca5e23a86aa978a0eb761e825a4266fc68e72
Author: Jim Evins <evins snaught com>
Date:   Sun Sep 30 21:22:51 2012 -0400

    Reconciled design patterns of merge backends with barcode backends.

 .gitignore                                   |    1 +
 data/ui/object-editor.ui                     | 2376 --------------------------
 glabels/Makefile.am                          |    7 +-
 glabels/glabels.vala                         |    1 +
 glabels/merge.vala                           |    9 +-
 glabels/merge_backends.vala                  |  112 ++
 glabels/{ => merge_backends}/merge_none.vala |    8 +-
 glabels/{ => merge_backends}/merge_text.vala |   98 +-
 glabels/merge_factory.vala                   |   78 -
 glabels/{merge_none.vala => merge_info.vala} |   52 +-
 glabels/xml_label.vala                       |    6 +-
 11 files changed, 224 insertions(+), 2524 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index fc5b79e..30200ec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -66,6 +66,7 @@ glabels-*.tar.gz
 /glabels/glabels-4
 /glabels/barcode_backends/*.c
 /glabels/cursors/cursor_pixdata.h
+/glabels/merge_backends/*.c
 
 /src/marshal.[ch]
 /src/stock-pixmaps/stockpixbufs.h
diff --git a/glabels/Makefile.am b/glabels/Makefile.am
index 038a3e8..1d2e23c 100644
--- a/glabels/Makefile.am
+++ b/glabels/Makefile.am
@@ -57,11 +57,12 @@ glabels_4_SOURCES = \
 	label_region.vala \
 	label_state.vala \
 	merge.vala \
-	merge_factory.vala \
+	merge_backends.vala \
+	merge_backends/merge_none.vala \
+	merge_backends/merge_text.vala \
 	merge_field.vala \
-	merge_none.vala \
+	merge_info.vala \
 	merge_record.vala \
-	merge_text.vala \
 	message_bar.vala \
 	model.vala \
 	model_clipboard.vala \
diff --git a/glabels/glabels.vala b/glabels/glabels.vala
index b92d11c..d26a4af 100644
--- a/glabels/glabels.vala
+++ b/glabels/glabels.vala
@@ -58,6 +58,7 @@ namespace glabels
 			libglabels.XmlUtil.default_units = libglabels.Units.inch();
 			glbarcode.Factory.init();
 			BarcodeBackends.init();
+			MergeBackends.init();
 
 			Gtk.IconTheme icon_theme = Gtk.IconTheme.get_default();
 			icon_theme.append_search_path( Path.build_filename( Config.DATADIR, Config.GLABELS_BRANCH, "icons", null ) );
diff --git a/glabels/merge.vala b/glabels/merge.vala
index 63d4a27..f73b6c4 100644
--- a/glabels/merge.vala
+++ b/glabels/merge.vala
@@ -24,13 +24,10 @@ using GLib;
 namespace glabels
 {
 
-	public enum MergeSrcType { NONE, FIXED, FILE }
-
 	public abstract class Merge : Object
 	{
-		public string       name        { get; construct; }
-		public string       description { get; construct; }
-		public MergeSrcType src_type    { get; protected set; }
+
+		public MergeInfo info { get; construct; }
 
 
 		public unowned List<MergeRecord> record_list
@@ -80,8 +77,6 @@ namespace glabels
 		protected abstract MergeRecord?  get_record();
 		public    abstract Merge         dup();
 
-
-		
 	}
 
 }
diff --git a/glabels/merge_backends.vala b/glabels/merge_backends.vala
new file mode 100644
index 0000000..003d427
--- /dev/null
+++ b/glabels/merge_backends.vala
@@ -0,0 +1,112 @@
+/*  merge_backends.vala
+ *
+ *  Copyright (C) 2012  Jim Evins <evins snaught com>
+ *
+ *  This file is part of gLabels.
+ *
+ *  gLabels is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  gLabels is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+using GLib;
+
+namespace glabels
+{
+
+	public class MergeBackends
+	{
+
+		private static Gee.HashMap<string,MergeInfo> id_map;
+		private static Gee.HashMap<string,MergeInfo> name_map;
+
+		private static bool initialized = false;
+
+
+		static construct
+		{
+			id_map   = new Gee.HashMap<string,MergeInfo>();
+			name_map = new Gee.HashMap<string,MergeInfo>();
+
+			register_backend( "None", _("None"), MergeSrcType.NONE, typeof(MergeNone) );
+
+			register_backend( "Text/Comma", _("Text: Comma Separated Values (CSV)"),
+			                  MergeSrcType.FILE, typeof(MergeTextCsv) );
+			register_backend( "Text/Comma/Line1Keys", _("Text: Comma Separated Values (CSV), keys on line 1"),
+			                  MergeSrcType.FILE, typeof(MergeTextCsv) );
+			register_backend( "Text/Tab", _("Text: Tab Separated Values (TSV)"),
+			                  MergeSrcType.FILE, typeof(MergeTextTsv) );
+			register_backend( "Text/Tab/Line1Keys", _("Text: Tab Separated Values (TSV), keys on line 1"),
+			                  MergeSrcType.FILE, typeof(MergeTextTsv) );
+			register_backend( "Text/Colon", _("Text: Colon Separated Values"),
+			                  MergeSrcType.FILE, typeof(MergeTextColon) );
+			register_backend( "Text/Colon/Line1Keys", _("Text: Colon Separated Values, keys on line 1"),
+			                  MergeSrcType.FILE, typeof(MergeTextColon) );
+			register_backend( "Text/Semicolon", _("Text: Semicolon Separated Values"),
+			                  MergeSrcType.FILE, typeof(MergeTextSemicolon) );
+			register_backend( "Text/Semicolon/Line1Keys", _("Text: Semicolon Separated Values, keys on line 1"),
+			                  MergeSrcType.FILE, typeof(MergeTextSemicolon) );
+
+			initialized = true;
+		}
+
+
+		public static void init()
+		{
+			if ( !initialized )
+			{
+				new MergeBackends();
+			}
+			else
+			{
+				message( "MergeBackends already initialized.\n" );
+			}
+		}
+
+
+		private static void register_backend( string id, string name, MergeSrcType src_type, Type type )
+		{
+			if ( type.is_a( typeof(Merge) ) )
+			{
+				MergeInfo merge_info = new MergeInfo( id, name, src_type, type );
+
+				id_map.set( id.casefold(), merge_info );
+				name_map.set( name, merge_info );
+			}
+			else
+			{
+				message( "MergeBackends.register_backend: invalid merge type: %s\n", type.name() );
+			}
+		}
+
+
+		public static Merge create_merge( string id )
+		{
+			string id_casefold = id.casefold();
+
+			if ( id_map.has_key( id_casefold ) )
+			{
+				MergeInfo merge_info = id_map.get( id_casefold );
+
+				return Object.new( merge_info.merge_type, info: merge_info ) as Merge;
+			}
+			else
+			{
+				return new MergeNone();
+			}
+		}
+		
+
+	}
+
+}
diff --git a/glabels/merge_none.vala b/glabels/merge_backends/merge_none.vala
similarity index 92%
copy from glabels/merge_none.vala
copy to glabels/merge_backends/merge_none.vala
index dc9ea62..05b1d0f 100644
--- a/glabels/merge_none.vala
+++ b/glabels/merge_backends/merge_none.vala
@@ -27,12 +27,6 @@ namespace glabels
 	public class MergeNone : Merge
 	{
 
-		public MergeNone()
-		{
-			src_type = MergeSrcType.NONE;
-		}
-
-
 		public override List<string> get_key_list()
 		{
 			return new List<string>();
@@ -63,7 +57,7 @@ namespace glabels
 
 		public override Merge dup()
 		{
-			MergeNone copy = new MergeNone();
+			MergeNone copy = Object.new( get_type(), info: info ) as MergeNone;
 			return copy;
 		}
 		
diff --git a/glabels/merge_text.vala b/glabels/merge_backends/merge_text.vala
similarity index 87%
rename from glabels/merge_text.vala
rename to glabels/merge_backends/merge_text.vala
index a5d18c3..597ef44 100644
--- a/glabels/merge_text.vala
+++ b/glabels/merge_backends/merge_text.vala
@@ -24,28 +24,97 @@ using GLib;
 namespace glabels
 {
 
-	public class MergeText : Merge
+	public class MergeTextCsv : MergeText
 	{
-		public int    delim          { get; construct; default=','; }
-		public bool   line1_has_keys { get; construct; default=false; }
+		static construct
+		{
+			delim          = ',';
+			line1_has_keys = false;
+		}
+	}
 
 
-		private FileStream fp;
+	public class MergeTextCsvKeys : MergeText
+	{
+		static construct
+		{
+			delim          = ',';
+			line1_has_keys = true;
+		}
+	}
+
+
+	public class MergeTextTsv : MergeText
+	{
+		static construct
+		{
+			delim          = '\t';
+			line1_has_keys = false;
+		}
+	}
 
-		private string[] keys;
-		private int      n_fields_max;
-		
 
-		public MergeText( string name           = "text/csv",
-		                  string description    = "",
-		                  int    delim          = ',',
-		                  bool   line1_has_keys = false )
+	public class MergeTextTsvKeys : MergeText
+	{
+		static construct
 		{
-			Object( name:name, description:description, delim:delim, line1_has_keys:line1_has_keys );
+			delim          = '\t';
+			line1_has_keys = true;
+		}
+	}
 
-			src_type = MergeSrcType.FILE;
+
+	public class MergeTextColon : MergeText
+	{
+		static construct
+		{
+			delim          = ':';
+			line1_has_keys = false;
 		}
+	}
+
 
+	public class MergeTextColonKeys : MergeText
+	{
+		static construct
+		{
+			delim          = ':';
+			line1_has_keys = true;
+		}
+	}
+
+
+	public class MergeTextSemicolon : MergeText
+	{
+		static construct
+		{
+			delim          = ';';
+			line1_has_keys = false;
+		}
+	}
+
+
+	public class MergeTextSemicolonKeys : MergeText
+	{
+		static construct
+		{
+			delim          = ';';
+			line1_has_keys = true;
+		}
+	}
+
+
+	public abstract class MergeText : Merge
+	{
+		protected static int    delim;
+		protected static bool   line1_has_keys;
+
+
+		private FileStream fp;
+
+		private string[] keys;
+		private int      n_fields_max;
+		
 
 		public override List<string> get_key_list()
 		{
@@ -155,7 +224,8 @@ namespace glabels
 
 		public override Merge dup()
 		{
-			MergeText copy = new MergeText();
+			MergeText copy = Object.new( get_type(), info : info ) as MergeText;
+			copy.src = src;
 			return copy;
 		}
 
diff --git a/glabels/merge_none.vala b/glabels/merge_info.vala
similarity index 56%
rename from glabels/merge_none.vala
rename to glabels/merge_info.vala
index dc9ea62..3d9a051 100644
--- a/glabels/merge_none.vala
+++ b/glabels/merge_info.vala
@@ -1,4 +1,4 @@
-/*  merge_none.vala
+/*  merge_info.vala
  *
  *  Copyright (C) 2012  Jim Evins <evins snaught com>
  *
@@ -24,49 +24,29 @@ using GLib;
 namespace glabels
 {
 
-	public class MergeNone : Merge
-	{
-
-		public MergeNone()
-		{
-			src_type = MergeSrcType.NONE;
-		}
-
+	public enum MergeSrcType { NONE, FIXED, FILE }
 
-		public override List<string> get_key_list()
-		{
-			return new List<string>();
-		}
-
-
-		public override string get_primary_key()
-		{
-			return "";
-		}
-
-
-		protected override void open()
-		{
-		}
 
+	public class MergeInfo : Object
+	{
 
-		protected override void close()
-		{
-		}
+		public string       id          { get; protected set; }
+		public string       name        { get; protected set; }
+		public MergeSrcType src_type    { get; protected set; }
+		public Type         merge_type  { get; protected set; }
 
 
-		protected override MergeRecord? get_record()
+		public MergeInfo( string       id,
+		                  string       name,
+		                  MergeSrcType src_type,
+		                  Type         merge_type )
 		{
-			return null;
+			this.id         = id;
+			this.name       = name;
+			this.src_type   = src_type;
+			this.merge_type = merge_type;
 		}
 
-
-		public override Merge dup()
-		{
-			MergeNone copy = new MergeNone();
-			return copy;
-		}
-		
 	}
 
 }
diff --git a/glabels/xml_label.vala b/glabels/xml_label.vala
index d645536..807f9cc 100644
--- a/glabels/xml_label.vala
+++ b/glabels/xml_label.vala
@@ -595,7 +595,7 @@ namespace glabels
 		private void parse_merge_node( Xml.Node  node,
 		                               Label     label )
 		{
-			Merge merge = MergeFactory.create_merge( XmlUtil.get_prop_string( node, "type", null ) );
+			Merge merge = MergeBackends.create_merge( XmlUtil.get_prop_string( node, "type", null ) );
 
 			merge.src  = XmlUtil.get_prop_string( node, "src", null );
 
@@ -1120,8 +1120,8 @@ namespace glabels
 		{
 			unowned Xml.Node *node = root.new_child( ns, "Merge" );
 
-			XmlUtil.set_prop_string( node, "type", label.merge.name );
-			XmlUtil.set_prop_string( node, "src", label.merge.src );
+			XmlUtil.set_prop_string( node, "type", label.merge.info.id );
+			XmlUtil.set_prop_string( node, "src",  label.merge.src );
 		}
 
 



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