[glabels/vala] Initial vala implementation of merge property editor.



commit 9b82a1cd47224bd3e82df267b449cdde71818302
Author: Jim Evins <evins snaught com>
Date:   Sun Oct 7 23:00:42 2012 -0400

    Initial vala implementation of merge property editor.

 data/ui/Makefile.am                |    5 +-
 data/ui/merge-properties-dialog.ui |  212 --------------------------
 data/ui/merge_property_editor.ui   |  255 +++++++++++++++++++++++++++++++
 data/ui/property-bar.ui            |  237 -----------------------------
 data/ui/property_editor.ui         |   52 -------
 glabels/Makefile.am                |    2 +-
 glabels/field_button.vala          |   19 ++-
 glabels/label.vala                 |   10 +-
 glabels/merge.vala                 |    5 +
 glabels/merge_backends.vala        |   63 +++++++-
 glabels/merge_property_editor.vala |  292 ++++++++++++++++++++++++++++++++++++
 glabels/ui.vala                    |   47 +------
 glabels/window.vala                |   76 ++++++----
 13 files changed, 688 insertions(+), 587 deletions(-)
---
diff --git a/data/ui/Makefile.am b/data/ui/Makefile.am
index d83cc01..d730b20 100644
--- a/data/ui/Makefile.am
+++ b/data/ui/Makefile.am
@@ -1,11 +1,14 @@
 ## Process this file with automake to produce Makefile.in
 
+NULL = 
+
 builderdir = $(datadir)/$(GLABELS_BRANCH)/ui/
 
 builder_DATA = \
+	merge_property_editor.ui \
 	new_label_dialog.ui \
 	object_editor.ui \
-	property_editor.ui
+	$(NULL)
 
 
 EXTRA_DIST = $(builder_DATA)
diff --git a/data/ui/merge_property_editor.ui b/data/ui/merge_property_editor.ui
new file mode 100644
index 0000000..0c65d6d
--- /dev/null
+++ b/data/ui/merge_property_editor.ui
@@ -0,0 +1,255 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.0 -->
+  <object class="GtkWindow" id="window1">
+    <property name="can_focus">False</property>
+    <child>
+      <object class="GtkBox" id="merge_property_editor_box">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">9</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">12</property>
+        <child>
+          <object class="GtkFrame" id="frame1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkAlignment" id="alignment1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="left_padding">12</property>
+                <child>
+                  <object class="GtkGrid" id="grid1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="row_spacing">6</property>
+                    <property name="column_spacing">12</property>
+                    <child>
+                      <object class="GtkLabel" id="label3">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">0</property>
+                        <property name="label" translatable="yes">Format:</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">0</property>
+                        <property name="width">1</property>
+                        <property name="height">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="label4">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Location:</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">1</property>
+                        <property name="width">1</property>
+                        <property name="height">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkComboBoxText" id="type_combo">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="entry_text_column">0</property>
+                        <property name="id_column">1</property>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">0</property>
+                        <property name="width">1</property>
+                        <property name="height">1</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkBox" id="location_box">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="orientation">vertical</property>
+                        <child>
+                          <object class="GtkLabel" id="location_na_label">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="no_show_all">True</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">N/A</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkLabel" id="location_fixed_label">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="no_show_all">True</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Fixed</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkFileChooserButton" id="location_file_button">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="no_show_all">True</property>
+                            <property name="orientation">vertical</property>
+                            <property name="focus_on_click">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">2</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="left_attach">1</property>
+                        <property name="top_attach">1</property>
+                        <property name="width">1</property>
+                        <property name="height">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label1">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">&lt;b&gt;Source&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkFrame" id="frame2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="vexpand">True</property>
+            <property name="label_xalign">0</property>
+            <property name="shadow_type">none</property>
+            <child>
+              <object class="GtkAlignment" id="alignment2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="vexpand">True</property>
+                <property name="left_padding">12</property>
+                <child>
+                  <object class="GtkBox" id="box1">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="vexpand">True</property>
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">6</property>
+                    <child>
+                      <object class="GtkScrolledWindow" id="scrolledwindow1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="vexpand">True</property>
+                        <property name="shadow_type">in</property>
+                        <child>
+                          <object class="GtkTreeView" id="records_treeview">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="vexpand">True</property>
+                            <property name="rules_hint">True</property>
+                            <child internal-child="selection">
+                              <object class="GtkTreeSelection" id="treeview-selection1">
+                                <property name="mode">none</property>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkBox" id="box3">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">12</property>
+                        <child>
+                          <object class="GtkButton" id="select_all_button">
+                            <property name="label" translatable="yes">Select all</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="use_action_appearance">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <object class="GtkButton" id="unselect_all_button">
+                            <property name="label" translatable="yes">Unselect all</property>
+                            <property name="use_action_appearance">False</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="use_action_appearance">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">False</property>
+                            <property name="fill">True</property>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child type="label">
+              <object class="GtkLabel" id="label2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">&lt;b&gt;Records&lt;/b&gt;</property>
+                <property name="use_markup">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/glabels/Makefile.am b/glabels/Makefile.am
index 1d2e23c..82e4d41 100644
--- a/glabels/Makefile.am
+++ b/glabels/Makefile.am
@@ -62,6 +62,7 @@ glabels_4_SOURCES = \
 	merge_backends/merge_text.vala \
 	merge_field.vala \
 	merge_info.vala \
+	merge_property_editor.vala \
 	merge_record.vala \
 	message_bar.vala \
 	model.vala \
@@ -77,7 +78,6 @@ glabels_4_SOURCES = \
 	prefs.vala \
 	print_op.vala \
 	print_op_dialog.vala \
-	property_editor.vala \
 	svg_cache.vala \
 	template_history.vala \
 	text_line.vala \
diff --git a/glabels/field_button.vala b/glabels/field_button.vala
index ce77bc5..6d3cd83 100644
--- a/glabels/field_button.vala
+++ b/glabels/field_button.vala
@@ -72,15 +72,22 @@ namespace glabels
 		public void set_keys( List<string> key_list )
 		{
 			menu.set_keys( key_list );
-			key = key_list.first().data;
-			if ( klabel_is_key )
+			if ( key_list.length() > 0 )
 			{
-				klabel.set_text( key );
-			}
+				key = key_list.first().data;
+				if ( klabel_is_key )
+				{
+					klabel.set_text( key );
+				}
 
-			menu.show_all();
+				menu.show_all();
 
-			set_sensitive( true );
+				set_sensitive( true );
+			}
+			else
+			{
+				set_sensitive( false );
+			}
 		}
 
 
diff --git a/glabels/label.vala b/glabels/label.vala
index 0a46a06..f6206d3 100644
--- a/glabels/label.vala
+++ b/glabels/label.vala
@@ -167,6 +167,7 @@ namespace glabels
 				if ( _merge != value )
 				{
 					_merge = value;
+					_merge.changed.connect( on_merge_changed );
 					changed();
 					merge_changed();
 					modified = true;
@@ -204,7 +205,7 @@ namespace glabels
 
 		public Label()
 		{
-			_merge = new MergeNone();
+			_merge = MergeBackends.create_merge( "None" );
 
 			template_history = new TemplateHistory( 5 );
 
@@ -318,6 +319,13 @@ namespace glabels
 		}
 
 
+		private void on_merge_changed()
+		{
+			changed();
+			merge_changed();
+		}
+
+
 		public void draw( Cairo.Context cr,
 		                  bool          in_editor,
 		                  MergeRecord?  record )
diff --git a/glabels/merge.vala b/glabels/merge.vala
index f73b6c4..b80f962 100644
--- a/glabels/merge.vala
+++ b/glabels/merge.vala
@@ -27,6 +27,9 @@ namespace glabels
 	public abstract class Merge : Object
 	{
 
+		public signal void changed();
+
+
 		public MergeInfo info { get; construct; }
 
 
@@ -62,6 +65,8 @@ namespace glabels
 						_record_list.append( record );
 					}
 					this.close();
+
+					changed();
 				}
 
 			}
diff --git a/glabels/merge_backends.vala b/glabels/merge_backends.vala
index 003d427..a15a863 100644
--- a/glabels/merge_backends.vala
+++ b/glabels/merge_backends.vala
@@ -27,6 +27,10 @@ namespace glabels
 	public class MergeBackends
 	{
 
+		private const string DEFAULT_ID   = "None";
+		private const string DEFAULT_NAME = _("None");
+
+
 		private static Gee.HashMap<string,MergeInfo> id_map;
 		private static Gee.HashMap<string,MergeInfo> name_map;
 
@@ -43,19 +47,19 @@ namespace glabels
 			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) );
+			                  MergeSrcType.FILE, typeof(MergeTextCsvKeys) );
 			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) );
+			                  MergeSrcType.FILE, typeof(MergeTextTsvKeys) );
 			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) );
+			                  MergeSrcType.FILE, typeof(MergeTextColonKeys) );
 			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) );
+			                  MergeSrcType.FILE, typeof(MergeTextSemicolonKeys) );
 
 			initialized = true;
 		}
@@ -102,10 +106,57 @@ namespace glabels
 			}
 			else
 			{
-				return new MergeNone();
+				MergeInfo merge_info = id_map.get( "None" );
+
+				return Object.new( typeof(MergeNone), info: merge_info ) as Merge;
+			}
+		}
+
+
+		public static List<string> get_name_list()
+		{
+			List<string> list = null;
+
+			foreach ( string key in name_map.keys )
+			{
+				list.insert_sorted( key, strcmp );
+			}
+
+			return list;
+		}
+
+
+		public static string id_to_name( string id )
+		{
+			string id_casefold = id.casefold();
+
+			if ( id_map.has_key( id_casefold ) )
+			{
+				MergeInfo merge_info = id_map.get( id_casefold );
+
+				return merge_info.name;
+			}
+			else
+			{
+				return DEFAULT_NAME;
+			}
+		}
+
+
+		public static string name_to_id( string name )
+		{
+			if ( name_map.has_key( name ) )
+			{
+				MergeInfo merge_info = name_map.get( name );
+
+				return merge_info.id;
+			}
+			else
+			{
+				return DEFAULT_ID;
 			}
 		}
-		
+
 
 	}
 
diff --git a/glabels/merge_property_editor.vala b/glabels/merge_property_editor.vala
new file mode 100644
index 0000000..bb35c8b
--- /dev/null
+++ b/glabels/merge_property_editor.vala
@@ -0,0 +1,292 @@
+/*  merge_property_editor.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 MergePropertyEditor : Gtk.Box
+	{
+		private const int SELECT_COLUMN       = 0;
+		private const int RECORD_FIELD_COLUMN = 1;
+		private const int VALUE_COLUMN        = 2;
+		private const int IS_RECORD_COLUMN    = 3;
+		private const int DATA_COLUMN         = 4;
+
+
+		private Model model;
+
+
+		/* Widgets */
+		private Gtk.ComboBoxText      type_combo;
+		private Gtk.Label             location_na_label;
+		private Gtk.Label             location_fixed_label;
+		private Gtk.FileChooserButton location_file_button;
+		private Gtk.TreeView          records_treeview;
+		private Gtk.Button            select_all_button;
+		private Gtk.Button            unselect_all_button;
+
+		/* Treeview Model */
+		private Gtk.TreeStore         tree_store;
+
+
+		/* Signal IDs */
+		private ulong sigid_type_combo_changed;
+		private ulong sigid_location_file_button_selection_changed;
+
+
+		public MergePropertyEditor()
+		{
+			/* Load the user interface. */
+			Gtk.Builder builder = new Gtk.Builder();
+			try
+			{
+				string file = GLib.Path.build_filename( Config.DATADIR, Config.GLABELS_BRANCH,
+				                                        "ui", "merge_property_editor.ui" );
+				string[] objects = { "merge_property_editor_box",
+				                     null };
+				builder.add_objects_from_file( file, objects );
+			}
+			catch ( Error err )
+			{
+				error( "Error: %s", err.message );
+			}
+
+			Gtk.Box merge_property_editor_box = builder.get_object( "merge_property_editor_box" ) as Gtk.Box;
+			pack_start( merge_property_editor_box );
+
+			type_combo           = builder.get_object( "type_combo" )           as Gtk.ComboBoxText;
+			location_na_label    = builder.get_object( "location_na_label" )    as Gtk.Label;
+			location_fixed_label = builder.get_object( "location_fixed_label" ) as Gtk.Label;
+			location_file_button = builder.get_object( "location_file_button" ) as Gtk.FileChooserButton;
+			records_treeview     = builder.get_object( "records_treeview" )     as Gtk.TreeView;
+			select_all_button    = builder.get_object( "select_all_button" )    as Gtk.Button;
+			unselect_all_button  = builder.get_object( "unselect_all_button" )  as Gtk.Button;
+
+			foreach ( string name in MergeBackends.get_name_list() )
+			{
+				type_combo.append_text( name );
+			}
+
+			tree_store   = new Gtk.TreeStore( 5,
+			                                  /* 0 : SELECT_COLUMN */       typeof(bool),
+			                                  /* 1 : RECORD_FIELD_COLUMN */ typeof(string),
+			                                  /* 2 : VALUE_COLUMN */        typeof(string),
+			                                  /* 3 : IS_RECORD_COLUMN */    typeof(bool),
+			                                  /* 4 : DATA_COLUMN */         typeof(void*) );
+			records_treeview.set_model( tree_store );
+
+			Gtk.CellRendererToggle record_select_renderer = new Gtk.CellRendererToggle();
+			Gtk.TreeViewColumn     record_select_column   = new Gtk.TreeViewColumn.with_attributes( _("Select"),
+				                  record_select_renderer,
+				                  "active", 0, "visible", 3, null );
+			records_treeview.append_column( record_select_column );
+
+			Gtk.CellRendererText   record_field_renderer = new Gtk.CellRendererText();
+			Gtk.TreeViewColumn     record_field_column   = new Gtk.TreeViewColumn.with_attributes( _("Record/Field"),
+				                 record_field_renderer,
+				                 "text", 1, null );
+			records_treeview.append_column( record_field_column );
+
+			Gtk.CellRendererText   field_value_renderer = new Gtk.CellRendererText();
+			Gtk.TreeViewColumn     field_value_column   = new Gtk.TreeViewColumn.with_attributes( _("Value"),
+				                field_value_renderer,
+				                "text", 2, null );
+			records_treeview.append_column( field_value_column );
+
+			record_field_renderer.yalign = 0;
+			field_value_renderer.yalign  = 0;
+
+			record_field_column.set_sizing( Gtk.TreeViewColumnSizing.AUTOSIZE );
+			field_value_column.set_sizing( Gtk.TreeViewColumnSizing.AUTOSIZE );
+
+			records_treeview.set_expander_column( record_field_column );
+
+			sigid_type_combo_changed =
+				type_combo.changed.connect( on_type_combo_changed );
+			sigid_location_file_button_selection_changed =
+				location_file_button.file_set.connect( on_location_file_button_selection_changed );
+			record_select_renderer.toggled.connect( on_record_select_toggled );
+			select_all_button.clicked.connect( on_select_all_button_clicked );
+			unselect_all_button.clicked.connect( on_unselect_all_button_clicked );
+		}
+
+
+		public void set_model( Model model )
+		{
+			this.model = model;
+
+			on_merge_changed();
+			model.label.merge_changed.connect( on_merge_changed );
+		}
+
+
+		private void on_merge_changed()
+		{
+			GLib.SignalHandler.block( (void *)type_combo, sigid_type_combo_changed );
+			ComboUtil.set_active_text( type_combo, model.label.merge.info.name );
+			GLib.SignalHandler.unblock( (void *)type_combo, sigid_type_combo_changed );
+
+			switch ( model.label.merge.info.src_type )
+			{
+			case MergeSrcType.NONE:
+				location_na_label.show();
+				location_fixed_label.hide();
+				location_file_button.hide();
+				break;
+			case MergeSrcType.FIXED:
+				location_na_label.hide();
+				location_fixed_label.show();
+				location_file_button.hide();
+				break;
+			case MergeSrcType.FILE:
+				location_na_label.hide();
+				location_fixed_label.hide();
+				location_file_button.show();
+
+				if ( model.label.merge.src != null )
+				{
+					GLib.SignalHandler.block( (void *)location_file_button, sigid_location_file_button_selection_changed );
+					location_file_button.set_filename( model.label.merge.src );
+					GLib.SignalHandler.unblock( (void *)location_file_button, sigid_location_file_button_selection_changed );
+				}
+				break;
+			default:
+				assert_not_reached();
+			}
+
+			load_tree( tree_store, model.label.merge );
+		}
+
+
+		private void load_tree( Gtk.TreeStore store, Merge merge )
+		{
+			store.clear();
+
+			string primary_key = merge.get_primary_key();
+
+			foreach ( MergeRecord record in merge.record_list )
+			{
+				string primary_value = record.eval_key( primary_key );
+
+				Gtk.TreeIter iter1;
+				store.append( out iter1, null );
+				store.set( iter1,
+				           SELECT_COLUMN,       record.selected,
+				           RECORD_FIELD_COLUMN, primary_value,
+				           IS_RECORD_COLUMN,    true,
+				           DATA_COLUMN,         record );
+
+				foreach ( MergeField field in record.field_list )
+				{
+					Gtk.TreeIter iter2;
+					store.append( out iter2, iter1 );
+					store.set( iter2,
+					           RECORD_FIELD_COLUMN, field.key,
+					           VALUE_COLUMN,        field.value,
+					           IS_RECORD_COLUMN,    false );
+				}
+			}
+
+		}
+
+
+
+		private void on_type_combo_changed()
+		{
+			string name = type_combo.get_active_text();
+			string id = MergeBackends.name_to_id( name );
+			model.label.merge = MergeBackends.create_merge( id );
+		}
+
+
+		private void on_location_file_button_selection_changed()
+		{
+			model.label.merge.src = location_file_button.get_filename();
+		}
+
+
+		private void on_record_select_toggled( string path_str )
+		{
+			/* get toggled iter */
+			Gtk.TreePath path = new Gtk.TreePath.from_string( path_str );
+			Gtk.TreeIter iter;
+			tree_store.get_iter( out iter, path );
+
+			/* get current data */
+			unowned MergeRecord record;
+			tree_store.get( iter, DATA_COLUMN, out record );
+
+			/* toggle the select flag within the record */
+			record.selected = !record.selected;
+
+			/* set new value in store */
+			tree_store.set( iter, SELECT_COLUMN, record.selected );
+		}
+
+
+		private void on_select_all_button_clicked()
+		{
+			Gtk.TreeIter iter;
+
+			for ( bool good = tree_store.get_iter_first( out iter );
+			      good;
+			      good = tree_store.iter_next( ref iter ) )
+			{
+				/* get current data */
+				unowned MergeRecord record;
+				tree_store.get( iter, DATA_COLUMN, out record );
+
+				/* set select flag within the record */
+				record.selected = true;
+
+				/* set new value in store */
+				tree_store.set( iter, SELECT_COLUMN, record.selected );
+			}
+		}
+
+
+		private void on_unselect_all_button_clicked()
+		{
+			Gtk.TreeIter iter;
+
+			for ( bool good = tree_store.get_iter_first( out iter );
+			      good;
+			      good = tree_store.iter_next( ref iter ) )
+			{
+				/* get current data */
+				unowned MergeRecord record;
+				tree_store.get( iter, DATA_COLUMN, out record );
+
+				/* clear select flag within the record */
+				record.selected = false;
+
+				/* set new value in store */
+				tree_store.set( iter, SELECT_COLUMN, record.selected );
+			}
+		}
+
+
+	}
+
+}
+
diff --git a/glabels/ui.vala b/glabels/ui.vala
index 44e34cf..15d6c88 100644
--- a/glabels/ui.vala
+++ b/glabels/ui.vala
@@ -358,13 +358,6 @@ namespace glabels
 			  N_("Center objects to vertical label center"),
 			  on_objects_center_vert },
 
-			{ "ObjectsMergeProperties",
-			  "glabels-merge",
-			  N_("Merge properties"),
-			  null,
-			  N_("Edit merge properties"),
-			  on_objects_merge_properties },
-
 
 			/* Help actions entries. */
 			{ "HelpContents",
@@ -509,8 +502,6 @@ namespace glabels
 							<menuitem action='ObjectsCenterHorizontal' always-show-image='true' />
 							<menuitem action='ObjectsCenterVertical' always-show-image='true' />
 						</menu>
-						<separator />
-						<menuitem action='ObjectsMergeProperties' />
 					</menu>
 					<menu action='HelpMenu'>
 						<menuitem action='HelpContents' />
@@ -524,10 +515,6 @@ namespace glabels
 					<toolitem action='FileSave' />
 					<separator />
 					<toolitem action='FilePrint' />
-					<separator />
-					<toolitem action='EditCut' />
-					<toolitem action='EditCopy' />
-					<toolitem action='EditPaste' />
 				</toolbar>
 			
 				<toolbar name='DrawingToolBar'>
@@ -545,7 +532,9 @@ namespace glabels
 					<toolitem action='ViewZoom1to1' />
 					<toolitem action='ViewZoomToFit' />
 					<separator />
-					<toolitem action='ObjectsMergeProperties' />
+					<toolitem action='EditCut' />
+					<toolitem action='EditCopy' />
+					<toolitem action='EditPaste' />
 				</toolbar>
 			
 				<popup action='ContextMenu'>
@@ -631,8 +620,7 @@ namespace glabels
 			"/ui/MenuBar/ObjectsMenu/ObjectsAlignMenu/ObjectsAlignVCenter",
 			"/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu",
 			"/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu/ObjectsCenterHorizontal",
-			"/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu/ObjectsCenterVertical",
-			"/ui/MenuBar/ObjectsMenu/ObjectsMergeProperties"
+			"/ui/MenuBar/ObjectsMenu/ObjectsCenterMenu/ObjectsCenterVertical"
 		};
 
 		static string[] doc_modified_verbs = {
@@ -1270,33 +1258,6 @@ namespace glabels
 		}
 
 
-		private void on_objects_merge_properties( Gtk.Action action )
-		{
-			/*
-			if (window->merge_dialog) {
-
-				gtk_window_present (GTK_WINDOW(window->merge_dialog));
-				gtk_window_set_transient_for (GTK_WINDOW (window->merge_dialog),
-				                              GTK_WINDOW (window ));
-
-			} else {
-
-				window->merge_dialog =
-					g_object_ref (
-						gl_merge_properties_dialog_new (GL_VIEW(window->view)->label,
-						                                GTK_WINDOW(window )) );
-
-				g_signal_connect (G_OBJECT(window->merge_dialog), "destroy",
-				                  G_CALLBACK (gtk_widget_destroyed),
-				                  &window->merge_dialog);
-
-				gtk_widget_show (GTK_WIDGET (window->merge_dialog));
-
-			}
-			*/
-		}
-
-
 		private void on_help_contents( Gtk.Action action )
 		{
 			Help.display_contents( window );
diff --git a/glabels/window.vala b/glabels/window.vala
index 915179f..186b487 100644
--- a/glabels/window.vala
+++ b/glabels/window.vala
@@ -36,60 +36,61 @@ namespace glabels
 
 		public static unowned List<weak Window> window_list { get; private set; }
 
+		private Gtk.Notebook   notebook;
 
-		private Gtk.Box        content_hbox;
+		public  Model?              model                 { get; private set; }
+		public  View                view                  { get; private set; }
+		public  MergePropertyEditor merge_property_editor { get; private set; }
+		public  MiniPreview         preview               { get; private set; }
 
-		public  Model?         model { get; private set; }
-		public  View?          view { get; private set; }
+		public  Gtk.Statusbar       statusbar             { get; private set; }
+		private Gtk.Label           zoom_info_label;
+		private Gtk.Label           cursor_info_label;
+		public  uint                menu_tips_context_id  { get; private set; }
 
-		public  Gtk.Statusbar  statusbar { get; private set; }
-		private Gtk.Label      zoom_info_label;
-		private Gtk.Label      cursor_info_label;
-		public  uint           menu_tips_context_id { get; private set; }
+		private Gtk.Menu            context_menu;
+		private Gtk.Menu            empty_selection_context_menu;
 
-		private Gtk.Menu       context_menu;
-		private Gtk.Menu       empty_selection_context_menu;
+		private Prefs               prefs;
+		private Ui                  ui;
 
-		private Prefs          prefs;
-		private Ui             ui;
-
-		private PropertyEditor property_editor;
-		private ObjectEditor   object_editor;
+		private ObjectEditor        object_editor;
 
 
 		public Window()
 		{
 			prefs = new Prefs();
+			ui = new Ui( this );
 
 			Gtk.Box vbox1 = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 );
 			add( vbox1 );
 
-			ui = new Ui( this );
 			vbox1.pack_start( ui.get_widget( "/MenuBar" ), false, false, 0 );
 			vbox1.pack_start( ui.get_widget( "/MainToolBar" ), false, false, 0 );
-			vbox1.pack_start( ui.get_widget( "/DrawingToolBar" ), false, false, 0 );
 
-			Gtk.Box main_hbox = new Gtk.Box( Gtk.Orientation.HORIZONTAL, 0 );
-			vbox1.pack_start( main_hbox, true, true, 0 );
+			notebook = new Gtk.Notebook();
+			notebook.set_sensitive( false );
+			vbox1.pack_start( notebook );
 
-			property_editor = new PropertyEditor();
-			property_editor.set_hexpand( false );
-			main_hbox.pack_start( property_editor, false, false, 0 );
 
-			content_hbox = new Gtk.Box( Gtk.Orientation.HORIZONTAL, 0 );
-			content_hbox.set_hexpand( true );
-			main_hbox.pack_start( content_hbox, true, true, 0 );
+			Gtk.Box editor_page = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 );
+			notebook.append_page( editor_page, new Gtk.Label( _("Editor") ) );
+
+			editor_page.pack_start( ui.get_widget( "/DrawingToolBar" ), false, false, 0 );
+			Gtk.Box hbox1 = new Gtk.Box( Gtk.Orientation.HORIZONTAL, 0 );
+			hbox1.set_hexpand( true );
+			editor_page.pack_start( hbox1, true, true, 0 );
 
 			view = new View();
-			content_hbox.pack_start( view, true, true, 0 );
+			hbox1.pack_start( view, true, true, 0 );
 			view.show_all();
 
 			object_editor = new ObjectEditor();
 			object_editor.set_hexpand( false );
-			main_hbox.pack_end( object_editor, false, false, 0 );
+			hbox1.pack_end( object_editor, false, false, 0 );
 
 			Gtk.Box status_hbox = new Gtk.Box( Gtk.Orientation.HORIZONTAL, 0 );
-			vbox1.pack_start( status_hbox, false, false, 0 );
+			editor_page.pack_start( status_hbox, false, false, 0 );
 
 			statusbar = new Gtk.Statusbar();
 			status_hbox.pack_start( statusbar, true, true, 0 );
@@ -121,6 +122,22 @@ namespace glabels
 			context_menu = (Gtk.Menu)ui.get_widget( "/ContextMenu" );
 			empty_selection_context_menu = (Gtk.Menu)ui.get_widget( "/EmptySelectionContextMenu" );
 
+
+			Gtk.Box merge_property_page = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 );
+			notebook.append_page( merge_property_page, new Gtk.Label( _("Merge") ) );
+
+			merge_property_editor = new MergePropertyEditor();
+			merge_property_page.pack_start( merge_property_editor, true, true, 0 );
+			
+
+			Gtk.Box preview_page = new Gtk.Box( Gtk.Orientation.VERTICAL, 0 );
+			notebook.append_page( preview_page, new Gtk.Label( _("Preview") ) );
+
+			preview = new MiniPreview( 280, 420 );
+			preview.show_all();
+			preview_page.pack_start( preview, true, true, 0 );
+			
+
 			window_list.append( this );
 		}
 
@@ -167,9 +184,10 @@ namespace glabels
 			label.modified = false;
 			set_window_title( label );
 
-			property_editor.set_model( model );
 			view.model = model;
 			object_editor.set_model( model );
+			merge_property_editor.set_model( model );
+			preview.set_model( model );
 
 			view.zoom_to_fit();
 
@@ -191,6 +209,8 @@ namespace glabels
 			view.pointer_exit.connect( on_pointer_exit );
 			this.set_focus.connect( on_set_focus );
 
+			notebook.set_sensitive( true );
+
 			/* TODO: clipboard changed. */
 			/* TODO: set copy/paste sensitivity. */
 		}



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