[easytag/wip/musicbrainz-support-merge: 4/33] Created new Widget MusicBrainzDialog



commit 77092ad80c0ef55d3d4de94418623b2dcd154657
Author: Abhinav <abhijangda hotmail com>
Date:   Sat Jul 26 15:26:44 2014 +0530

    Created new Widget MusicBrainzDialog

 data/musicbrainz_dialog.ui |  720 +++++++++++++++++++++-----------------------
 src/musicbrainz_dialog.c   |  355 +++++++++++++++-------
 src/musicbrainz_dialog.h   |   47 +++
 3 files changed, 625 insertions(+), 497 deletions(-)
---
diff --git a/data/musicbrainz_dialog.ui b/data/musicbrainz_dialog.ui
index 90223be..01152df 100755
--- a/data/musicbrainz_dialog.ui
+++ b/data/musicbrainz_dialog.ui
@@ -1,439 +1,367 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkImage" id="findimage">
+  <object class="GtkImage" id="img_red_lines">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="stock">gtk-find</property>
+    <property name="stock">easytag-red-lines</property>
   </object>
-  <object class="GtkImage" id="img_invert_selection">
+  <object class="GtkImage" id="img_unselect_all">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="stock">easytag-invert-selection</property>
+    <property name="stock">easytag-unselect-all</property>
   </object>
-  <object class="GtkImage" id="img_red_lines">
+  <object class="GtkImage" id="findimage">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="stock">easytag-red-lines</property>
+    <property name="stock">gtk-find</property>
   </object>
-  <object class="GtkImage" id="img_unselect_all">
+  <object class="GtkImage" id="img_invert_selection">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="stock">easytag-unselect-all</property>
+    <property name="stock">easytag-invert-selection</property>
   </object>
-  <object class="GtkDialog" id="mbDialog">
+  <object class="GtkBox" id="mb_box">
+    <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="border_width">5</property>
-    <property name="title" translatable="yes">Music Brainz Search</property>
-    <property name="type_hint">dialog</property>
-    <child internal-child="vbox">
-      <object class="GtkBox" id="dialog-vbox1">
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkHBox" id="hbox3">
+        <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="orientation">vertical</property>
+        <property name="spacing">5</property>
         <child>
-          <object class="GtkBox" id="box1">
+          <object class="GtkLabel" id="label7">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="orientation">vertical</property>
-            <property name="spacing">1</property>
+            <property name="label" translatable="yes">Search:</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkComboBoxText" id="cbManualSearch">
+            <property name="width_request">190</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="has_entry">True</property>
+            <property name="entry_text_column">0</property>
+            <property name="id_column">1</property>
+            <child internal-child="entry">
+              <object class="GtkEntry" id="comboboxtext-entry">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="has_focus">True</property>
+                <property name="is_focus">True</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="padding">4</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="label14">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">Through:</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkComboBoxText" id="cbManualSearchIn">
+            <property name="width_request">110</property>
+            <property name="height_request">26</property>
+            <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="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButton" id="btnManualFind">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</property>
+            <property name="has_tooltip">True</property>
+            <property name="tooltip_markup" translatable="yes">Start Manual Search </property>
+            <property name="tooltip_text" translatable="yes">Start Manual Search </property>
+            <property name="image">findimage</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">4</property>
+          </packing>
+        </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">4</property>
+        <child>
+          <object class="GtkButton" id="btnSelectedFind">
+            <property name="label" translatable="yes">Search Selected File</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</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="btnAutomaticSearch">
+            <property name="label" translatable="yes">Automatic Search</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButton" id="btnDiscFind">
+            <property name="label" translatable="yes">DiscID Search</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">True</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkFrame" id="frame2">
+        <property name="width_request">555</property>
+        <property name="height_request">216</property>
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="label_xalign">0</property>
+        <property name="shadow_type">in</property>
+        <child>
+          <object class="GtkAlignment" id="alignment2">
+            <property name="width_request">551</property>
+            <property name="height_request">193</property>
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="left_padding">12</property>
             <child>
-              <object class="GtkBox" id="box7">
+              <object class="GtkVBox" id="centralBox">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="orientation">vertical</property>
-                <property name="spacing">2</property>
+                <property name="spacing">3</property>
                 <child>
-                  <object class="GtkHBox" id="hbox3">
+                  <object class="GtkToolbar" id="toolbar1">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="spacing">5</property>
                     <child>
-                      <object class="GtkLabel" id="label7">
+                      <object class="GtkToolItem" id="toolbutton1">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="label" translatable="yes">Search:</property>
+                        <child>
+                          <object class="GtkLabel" id="label3">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="label" translatable="yes">Search:</property>
+                          </object>
+                        </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">0</property>
+                        <property name="homogeneous">True</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkComboBoxText" id="cbManualSearch">
-                        <property name="width_request">190</property>
+                      <object class="GtkToolItem" id="toolbutton2">
                         <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="has_entry">True</property>
-                        <property name="entry_text_column">0</property>
-                        <property name="id_column">1</property>
-                        <child internal-child="entry">
-                          <object class="GtkEntry" id="comboboxtext-entry">
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkEntry" id="entryTreeViewSearch">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <property name="invisible_char">●</property>
+                            <property name="invisible_char_set">True</property>
                           </object>
                         </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="padding">4</property>
-                        <property name="position">1</property>
+                        <property name="homogeneous">True</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkLabel" id="label14">
+                      <object class="GtkToolButton" id="toolbtnUp">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="label" translatable="yes">Through:</property>
+                        <property name="has_tooltip">True</property>
+                        <property name="tooltip_markup" translatable="yes">Up</property>
+                        <property name="tooltip_text" translatable="yes">Up</property>
+                        <property name="label" translatable="yes">toolbutton3</property>
+                        <property name="use_underline">True</property>
+                        <property name="stock_id">gtk-go-up</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">2</property>
+                        <property name="homogeneous">True</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkComboBoxText" id="cbManualSearchIn">
-                        <property name="width_request">110</property>
-                        <property name="height_request">26</property>
+                      <object class="GtkToolButton" id="toolbtnDown">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="has_tooltip">True</property>
+                        <property name="tooltip_markup" translatable="yes">Down</property>
+                        <property name="tooltip_text" translatable="yes">Down</property>
+                        <property name="label" translatable="yes">toolbutton3</property>
+                        <property name="use_underline">True</property>
+                        <property name="stock_id">gtk-go-down</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="homogeneous">True</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkSeparatorToolItem" id="toolbutton4">
                         <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="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">3</property>
+                        <property name="homogeneous">True</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkButton" id="btnManualFind">
+                      <object class="GtkToolButton" id="toolbtnInvertSelection">
                         <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
+                        <property name="can_focus">False</property>
                         <property name="has_tooltip">True</property>
-                        <property name="tooltip_markup" translatable="yes">Start Manual Search </property>
-                        <property name="tooltip_text" translatable="yes">Start Manual Search </property>
-                        <property name="image">findimage</property>
+                        <property name="tooltip_markup" translatable="yes">Invert Selections</property>
+                        <property name="tooltip_text" translatable="yes">Invert Selections</property>
+                        <property name="label" translatable="yes">toolbutton5</property>
+                        <property name="use_underline">True</property>
+                        <property name="icon_widget">img_invert_selection</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">4</property>
+                        <property name="homogeneous">True</property>
                       </packing>
                     </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">4</property>
                     <child>
-                      <object class="GtkButton" id="btnSelectedFind">
-                        <property name="label" translatable="yes">Search Selected File</property>
+                      <object class="GtkToolButton" id="toolbtnSelectAll">
                         <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="has_tooltip">True</property>
+                        <property name="tooltip_markup" translatable="yes">Select All</property>
+                        <property name="tooltip_text" translatable="yes">Select All</property>
+                        <property name="label" translatable="yes">toolbutton6</property>
+                        <property name="use_underline">True</property>
+                        <property name="stock_id">gtk-select-all</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">0</property>
+                        <property name="homogeneous">True</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkButton" id="btnAutomaticSearch">
-                        <property name="label" translatable="yes">Automatic Search</property>
+                      <object class="GtkToolButton" id="toolbtnUnselectAll">
                         <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="has_tooltip">True</property>
+                        <property name="tooltip_markup" translatable="yes">Unselect All</property>
+                        <property name="tooltip_text" translatable="yes">Unselect All</property>
+                        <property name="label" translatable="yes">toolbutton7</property>
+                        <property name="use_underline">True</property>
+                        <property name="icon_widget">img_unselect_all</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">1</property>
+                        <property name="homogeneous">True</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkButton" id="btnDiscFind">
-                        <property name="label" translatable="yes">DiscID Search</property>
+                      <object class="GtkToggleToolButton" id="toolbtnToggleRedLines">
                         <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="has_tooltip">True</property>
+                        <property name="tooltip_markup" translatable="yes">Toggle Red Lines</property>
+                        <property name="tooltip_text" translatable="yes">Toggle Red Lines</property>
+                        <property name="label" translatable="yes">toolbutton8</property>
+                        <property name="use_underline">True</property>
+                        <property name="icon_widget">img_red_lines</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">2</property>
+                        <property name="homogeneous">True</property>
                       </packing>
                     </child>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </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="width_request">555</property>
-                <property name="height_request">216</property>
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label_xalign">0</property>
-                <property name="shadow_type">in</property>
-                <child>
-                  <object class="GtkAlignment" id="alignment2">
-                    <property name="width_request">551</property>
-                    <property name="height_request">193</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="left_padding">12</property>
                     <child>
-                      <object class="GtkVBox" id="centralBox">
+                      <object class="GtkToolButton" id="toolbtnRefresh">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="spacing">3</property>
-                        <child>
-                          <object class="GtkToolbar" id="toolbar1">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <child>
-                              <object class="GtkToolItem" id="toolbutton1">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <child>
-                                  <object class="GtkLabel" id="label3">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="label" translatable="yes">Search:</property>
-                                  </object>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="homogeneous">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkToolItem" id="toolbutton2">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <child>
-                                  <object class="GtkEntry" id="entryTreeViewSearch">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="invisible_char">●</property>
-                                  </object>
-                                </child>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="homogeneous">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkToolButton" id="toolbtnUp">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="tooltip_text" translatable="yes">Up</property>
-                                <property name="label" translatable="yes">toolbutton3</property>
-                                <property name="use_underline">True</property>
-                                <property name="stock_id">gtk-go-up</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="homogeneous">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkToolButton" id="toolbtnDown">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="tooltip_text" translatable="yes">Down</property>
-                                <property name="label" translatable="yes">toolbutton3</property>
-                                <property name="use_underline">True</property>
-                                <property name="stock_id">gtk-go-down</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="homogeneous">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkSeparatorToolItem" id="toolbutton4">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="homogeneous">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkToolButton" id="toolbtnInvertSelection">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="tooltip_text" translatable="yes">Invert Selections</property>
-                                <property name="label" translatable="yes">toolbutton5</property>
-                                <property name="use_underline">True</property>
-                                <property name="icon_widget">img_invert_selection</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="homogeneous">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkToolButton" id="toolbtnSelectAll">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="tooltip_text" translatable="yes">Select All</property>
-                                <property name="label" translatable="yes">toolbutton6</property>
-                                <property name="use_underline">True</property>
-                                <property name="stock_id">gtk-select-all</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="homogeneous">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkToolButton" id="toolbtnUnselectAll">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="tooltip_text" translatable="yes">Unselect All</property>
-                                <property name="label" translatable="yes">toolbutton7</property>
-                                <property name="use_underline">True</property>
-                                <property name="icon_widget">img_unselect_all</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="homogeneous">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkToggleToolButton" id="toolbtnToggleRedLines">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="tooltip_text" translatable="yes">Toggle Red Lines</property>
-                                <property name="label" translatable="yes">toolbutton8</property>
-                                <property name="use_underline">True</property>
-                                <property name="icon_widget">img_red_lines</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="homogeneous">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkToolButton" id="toolbtnRefresh">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="tooltip_text" translatable="yes">Refresh</property>
-                                <property name="label" translatable="yes">toolbutton9</property>
-                                <property name="use_underline">True</property>
-                                <property name="stock_id">gtk-refresh</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="homogeneous">True</property>
-                              </packing>
-                            </child>
-                            <child>
-                              <object class="GtkToolButton" id="btnStop">
-                                <property name="visible">True</property>
-                                <property name="sensitive">False</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">toolbutton3</property>
-                                <property name="use_underline">True</property>
-                                <property name="stock_id">gtk-cancel</property>
-                              </object>
-                              <packing>
-                                <property name="expand">False</property>
-                                <property name="homogeneous">True</property>
-                              </packing>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="pack_type">end</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
+                        <property name="has_tooltip">True</property>
+                        <property name="tooltip_markup" translatable="yes">Refresh</property>
+                        <property name="tooltip_text" translatable="yes">Refresh</property>
+                        <property name="label" translatable="yes">toolbutton9</property>
+                        <property name="use_underline">True</property>
+                        <property name="stock_id">gtk-refresh</property>
                       </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="homogeneous">True</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkToolButton" id="btnStop">
+                        <property name="visible">True</property>
+                        <property name="sensitive">False</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">toolbutton3</property>
+                        <property name="use_underline">True</property>
+                        <property name="stock_id">gtk-cancel</property>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="homogeneous">True</property>
+                      </packing>
                     </child>
-                  </object>
-                </child>
-                <child type="label">
-                  <object class="GtkLabel" id="label8">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">&lt;b&gt;Results:&lt;/b&gt;</property>
-                    <property name="use_markup">True</property>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkBox" id="box2">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <object class="GtkCheckButton" id="chkUseDLM">
-                    <property name="label" translatable="yes">Match lines with the Levenshtein 
algorithm</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="xalign">0</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkBox" id="box10">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="spacing">4</property>
-                <child>
-                  <object class="GtkButton" id="btnClose">
-                    <property name="label" translatable="yes">Close</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
                   </object>
                   <packing>
                     <property name="expand">False</property>
@@ -442,62 +370,92 @@
                     <property name="position">0</property>
                   </packing>
                 </child>
-                <child>
-                  <object class="GtkButton" id="btnApplyChanges">
-                    <property name="label" translatable="yes">Apply Tag Changes</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="pack_type">end</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">3</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkStatusbar" id="statusbar">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="spacing">2</property>
               </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">4</property>
-              </packing>
             </child>
           </object>
+        </child>
+        <child type="label">
+          <object class="GtkLabel" id="label8">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">&lt;b&gt;Results:&lt;/b&gt;</property>
+            <property name="use_markup">True</property>
+          </object>
+        </child>
+      </object>
+      <packing>
+        <property name="expand">True</property>
+        <property name="fill">True</property>
+        <property name="position">2</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkCheckButton" id="chkUseDLM">
+        <property name="label" translatable="yes">Match lines with the Levenshtein algorithm</property>
+        <property name="visible">True</property>
+        <property name="can_focus">True</property>
+        <property name="receives_default">False</property>
+        <property name="xalign">0</property>
+        <property name="draw_indicator">True</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">3</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkBox" id="box10">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="spacing">4</property>
+        <child>
+          <object class="GtkButton" id="btnClose">
+            <property name="label" translatable="yes">Close</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</property>
+          </object>
           <packing>
-            <property name="expand">True</property>
+            <property name="expand">False</property>
             <property name="fill">True</property>
-            <property name="position">1</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
           </packing>
         </child>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area1">
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
-            <child>
-              <placeholder/>
-            </child>
+        <child>
+          <object class="GtkButton" id="btnApplyChanges">
+            <property name="label" translatable="yes">Apply Tag Changes</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="receives_default">True</property>
           </object>
           <packing>
             <property name="expand">False</property>
             <property name="fill">False</property>
             <property name="pack_type">end</property>
-            <property name="position">2</property>
+            <property name="position">1</property>
           </packing>
         </child>
       </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">4</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkStatusbar" id="statusbar">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+      </object>
+      <packing>
+        <property name="expand">False</property>
+        <property name="fill">False</property>
+        <property name="position">5</property>
+      </packing>
     </child>
   </object>
   <object class="GtkDialog" id="tag_choice_dialog">
diff --git a/src/musicbrainz_dialog.c b/src/musicbrainz_dialog.c
index e91b0f2..24cef13 100755
--- a/src/musicbrainz_dialog.c
+++ b/src/musicbrainz_dialog.c
@@ -37,6 +37,10 @@
 #include "browser.h"
 #include "dlm.h"
 
+#define ET_MUSICBRAINZ_DIALOG_GET_PRIVATE(obj) (obj->priv)
+
+G_DEFINE_TYPE (EtMusicBrainzDialog, et_musicbrainz_dialog, GTK_TYPE_DIALOG)
+
 /***************
  * Declaration *
  ***************/
@@ -154,7 +158,7 @@ typedef struct
  *
  * Private data for MusicBrainzDialog.
  */
-typedef struct
+struct _EtMusicBrainzDialogPrivate
 {
     GNode *mb_tree_root;
     GSimpleAsyncResult *async_result;
@@ -162,9 +166,8 @@ typedef struct
     GtkTreeModel *tag_choice_store;
     GtkWidget *tag_choice_dialog;
     GtkWidget *entityView;
-} MusicBrainzDialogPrivate;
+};
 
-static MusicBrainzDialogPrivate *mb_dialog_priv;
 static gboolean exit_on_complete;
 
 /*
@@ -270,18 +273,12 @@ btn_apply_changes_clicked (GtkWidget *widget, gpointer data);
 static gboolean
 et_apply_track_tag_to_et_file (Mb5Recording recording, ET_File *et_file);
 static void
-et_initialize_tag_choice_dialog (void);
+et_initialize_tag_choice_dialog (EtMusicBrainzDialogPrivate *mb_dialog_priv);
 
 /*************
  * Functions *
  *************/
 
-gboolean
-et_music_brainz_get_exit_on_complete (void)
-{
-    return exit_on_complete;
-}
-
 /*
  * et_mb_destroy_search:
  * @search: EtMbSearch
@@ -388,6 +385,9 @@ manual_search_callback (GObject *source, GAsyncResult *res,
                         gpointer user_data)
 {
     GtkComboBoxText *combo_box;
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
 
     if (!g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (res)))
     {
@@ -422,73 +422,6 @@ manual_search_callback (GObject *source, GAsyncResult *res,
 }
 
 /*
- * et_show_status_msg_in_idle_cb:
- * @obj: Source Object
- * @res: GAsyncResult
- * @user_data: User data
- *
- * Callback function for Displaying StatusBar Message.
- */
-static void
-et_show_status_msg_in_idle_cb (GObject *obj, GAsyncResult *res,
-                               gpointer user_data)
-{
-    gtk_statusbar_push (GTK_STATUSBAR (gtk_builder_get_object (builder,
-                        "statusbar")), 0, user_data);
-    g_free (user_data);
-    g_object_unref (res);
-}
-
-/*
- * et_show_status_msg_in_idle_cb:
- * @obj: Source Object
- * @res: GAsyncResult
- * @user_data: User data
- *
- * Function to Display StatusBar Messages in Main Thread.
- */
-void
-et_show_status_msg_in_idle (gchar *message)
-{
-    GSimpleAsyncResult *async_res;
-
-    async_res = g_simple_async_result_new (NULL,
-                                           et_show_status_msg_in_idle_cb,
-                                           g_strdup (message),
-                                           et_show_status_msg_in_idle);
-    g_simple_async_result_complete_in_idle (async_res);
-}
-
-/*
- * mb5_search_error_callback:
- * @obj: Source Object
- * @res: GAsyncResult
- * @user_data: User data
- *
- * Callback function for displaying errors.
- */
-void
-mb5_search_error_callback (GObject *source, GAsyncResult *res,
-                           gpointer user_data)
-{
-    GError *dest;
-    dest = NULL;
-    g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res),
-                                           &dest);
-    Log_Print (LOG_ERROR,
-               _("Error searching MusicBrainz Database '%s'"), dest->message);
-    gtk_statusbar_push (GTK_STATUSBAR (gtk_builder_get_object (builder,
-                                       "statusbar")), 0, dest->message);
-    g_error_free (dest);
-    et_music_brainz_dialog_stop_set_sensitive (FALSE);
-
-    if (exit_on_complete)
-    {
-        et_music_brainz_dialog_destroy (mbDialog);
-    }
-}
-
-/*
  * manual_search_thread_func:
  * @res: GSimpleAsyncResult
  * @obj: Source GObject
@@ -503,7 +436,9 @@ manual_search_thread_func (GSimpleAsyncResult *res, GObject *obj,
     GError *error;
     ManualSearchThreadData *thread_data;
     gchar *status_msg;
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
 
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     error = NULL;
     g_simple_async_result_set_op_res_gboolean (res, FALSE);
 
@@ -536,7 +471,8 @@ manual_search_thread_func (GSimpleAsyncResult *res, GObject *obj,
     }
 
     if (!et_musicbrainz_search (thread_data->text_to_search,
-                                thread_data->type, mb_dialog_priv->mb_tree_root, &error,
+                                thread_data->type, 
+                                mb_dialog_priv->mb_tree_root, &error,
                                 cancellable))
     {
         g_simple_async_report_gerror_in_idle (NULL,
@@ -573,7 +509,9 @@ btn_manual_find_clicked (GtkWidget *btn, gpointer user_data)
     GtkWidget *cb_manual_search_in;
     int type;
     ManualSearchThreadData *thread_data;
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
 
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     cb_manual_search_in = GTK_WIDGET (gtk_builder_get_object (builder,
                                                               "cbManualSearchIn"));
     type = gtk_combo_box_get_active (GTK_COMBO_BOX (cb_manual_search_in));
@@ -618,6 +556,9 @@ btn_manual_find_clicked (GtkWidget *btn, gpointer user_data)
 static void
 tool_btn_toggle_red_lines_clicked (GtkWidget *btn, gpointer user_data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     et_mb_entity_view_toggle_red_lines (ET_MB_ENTITY_VIEW (mb_dialog_priv->entityView));
 }
 
@@ -631,6 +572,9 @@ tool_btn_toggle_red_lines_clicked (GtkWidget *btn, gpointer user_data)
 static void
 tool_btn_up_clicked (GtkWidget *btn, gpointer user_data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     et_mb_entity_view_select_up (ET_MB_ENTITY_VIEW (mb_dialog_priv->entityView));
 }
 
@@ -644,6 +588,9 @@ tool_btn_up_clicked (GtkWidget *btn, gpointer user_data)
 static void
 tool_btn_down_clicked (GtkWidget *btn, gpointer user_data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     et_mb_entity_view_select_down (ET_MB_ENTITY_VIEW (mb_dialog_priv->entityView));
 }
 
@@ -657,6 +604,9 @@ tool_btn_down_clicked (GtkWidget *btn, gpointer user_data)
 static void
 tool_btn_invert_selection_clicked (GtkWidget *btn, gpointer user_data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     et_mb_entity_view_invert_selection (ET_MB_ENTITY_VIEW (mb_dialog_priv->entityView));
 }
 
@@ -670,6 +620,9 @@ tool_btn_invert_selection_clicked (GtkWidget *btn, gpointer user_data)
 static void
 tool_btn_select_all_clicked (GtkWidget *btn, gpointer user_data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     et_mb_entity_view_select_all (ET_MB_ENTITY_VIEW (mb_dialog_priv->entityView));
 }
 
@@ -683,6 +636,9 @@ tool_btn_select_all_clicked (GtkWidget *btn, gpointer user_data)
 static void
 tool_btn_unselect_all_clicked (GtkWidget *btn, gpointer user_data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     et_mb_entity_view_unselect_all (ET_MB_ENTITY_VIEW (mb_dialog_priv->entityView));
 }
 
@@ -696,6 +652,10 @@ tool_btn_unselect_all_clicked (GtkWidget *btn, gpointer user_data)
 static void
 tool_btn_refresh_clicked (GtkWidget *btn, gpointer user_data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
+
     if (!mb_dialog_priv->search)
     {
         return;
@@ -767,6 +727,9 @@ btn_manual_stop_clicked (GtkWidget *btn, gpointer user_data)
 static void
 entry_tree_view_search_changed (GtkEditable *editable, gpointer user_data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     et_mb_entity_view_search_in_results (ET_MB_ENTITY_VIEW (mb_dialog_priv->entityView),
                                          gtk_entry_get_text (GTK_ENTRY (gtk_builder_get_object (builder,
                                                                         "entryTreeViewSearch"))));
@@ -784,6 +747,10 @@ static void
 selected_find_callback (GObject *source, GAsyncResult *res,
                         gpointer user_data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
+
     if (!g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (res)))
     {
         g_object_unref (res);
@@ -828,7 +795,9 @@ selected_find_thread_func (GSimpleAsyncResult *res, GObject *obj,
     GList *iter;
     SelectedFindThreadData *thread_data;
     GError *error;
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
 
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     g_simple_async_result_set_op_res_gboolean (res, FALSE);
     error = NULL;
     thread_data = (SelectedFindThreadData *)g_async_result_get_user_data (G_ASYNC_RESULT (res));
@@ -883,7 +852,7 @@ get_selected_iter_list (GtkTreeView *tree_view, GList **list)
     GtkTreeSelection *selection;
     int count;
     GList *l;
-
+    
     tree_model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
     selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
     count = gtk_tree_selection_count_selected_rows (selection);
@@ -952,7 +921,9 @@ btn_selected_find_clicked (GtkWidget *button, gpointer data)
     GList *l;
     GHashTable *hash_table;
     SelectedFindThreadData *thread_data;
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
 
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     iter_list = NULL;
     l = NULL;
 
@@ -1044,6 +1015,10 @@ static void
 discid_search_callback (GObject *source, GAsyncResult *res,
                         gpointer user_data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
+
     if (!g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (res)))
     {
         g_object_unref (res);
@@ -1081,7 +1056,9 @@ discid_search_thread_func (GSimpleAsyncResult *res, GObject *obj,
     GError *error;
     DiscId *disc;
     gchar *discid;
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
 
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     error = NULL;
     disc = discid_new ();
     g_simple_async_result_set_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (res),
@@ -1139,6 +1116,9 @@ discid_search_thread_func (GSimpleAsyncResult *res, GObject *obj,
 static void
 btn_discid_search_clicked (GtkWidget *button, gpointer data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     mb5_search_cancellable = g_cancellable_new ();
     gtk_statusbar_push (GTK_STATUSBAR (gtk_builder_get_object (builder, "statusbar")),
                         0, _("Starting MusicBrainz Search"));
@@ -1177,6 +1157,10 @@ static void
 freedbid_search_callback (GObject *source, GAsyncResult *res,
                           gpointer user_data)
 {
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
+
     if (!g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (res)))
     {
         g_object_unref (res);
@@ -1215,7 +1199,9 @@ freedbid_search_thread_func (GSimpleAsyncResult *res, GObject *obj,
 {
     GError *error;
     gchar *freedbid;
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
 
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     error = NULL;
     g_simple_async_result_set_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (res),
                                                FALSE);
@@ -1266,7 +1252,9 @@ btn_automatic_search_clicked (GtkWidget *btn, gpointer data)
     guint total_frames;
     guint disc_length;
     gchar *cddb_discid;
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
 
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     total_frames = 150;
     disc_length  = 2;
     iter_list = NULL;
@@ -1384,20 +1372,6 @@ btn_automatic_search_clicked (GtkWidget *btn, gpointer data)
 }
 
 /*
- * et_music_brainz_dialog_stop_set_sensitive:
- * @sensitive: gboolean
- *
- * Set btnStop and mb_dialog_priv->entityView as sensitive according to @sensitive.
- */
-void
-et_music_brainz_dialog_stop_set_sensitive (gboolean sensitive)
-{
-    gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "btnStop")),
-                              sensitive);
-    gtk_widget_set_sensitive (mb_dialog_priv->entityView, !sensitive);
-}
-
-/*
  * et_set_file_tag:
  * @et_file: ET_File 
  * @title: Title
@@ -1441,7 +1415,9 @@ btn_apply_changes_clicked (GtkWidget *btn, gpointer data)
     GList *track_iter_list;
     GList *list_iter1;
     GList *list_iter2;
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
 
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     file_iter_list = NULL;
     track_iter_list = NULL;
 
@@ -1589,7 +1565,9 @@ et_apply_track_tag_to_et_file (Mb5Recording recording, ET_File *et_file)
     GtkTreeIter iter;
     GtkTreeSelection *selection;
     GtkWidget *tag_choice_tree_view;
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
 
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
     tag_choice_tree_view = GTK_WIDGET (gtk_builder_get_object (builder, "tag_choice_treeview"));
     release_list = mb5_recording_get_releaselist (recording);
     artist = et_mb5_recording_get_artists_names (recording);
@@ -1702,18 +1680,8 @@ et_apply_track_tag_to_et_file (Mb5Recording recording, ET_File *et_file)
 void
 et_music_brainz_dialog_destroy (GtkWidget *widget)
 {
-    et_mb_destroy_search (&mb_dialog_priv->search);
-
-    if (GTK_IS_WIDGET (mb_dialog_priv->tag_choice_dialog))
-    {
-        gtk_widget_destroy (mb_dialog_priv->tag_choice_dialog);
-    }
-
     gtk_widget_destroy (widget);
     g_object_unref (G_OBJECT (builder));
-    free_mb_tree (&mb_dialog_priv->mb_tree_root);
-    g_slice_free (MusicBrainzDialogPrivate, mb_dialog_priv);
-    mb_dialog_priv = NULL;
 }
 
 /*
@@ -1722,13 +1690,13 @@ et_music_brainz_dialog_destroy (GtkWidget *widget)
  * Initialize the Tag Choice Dialog.
  */
 static void
-et_initialize_tag_choice_dialog (void)
+et_initialize_tag_choice_dialog (EtMusicBrainzDialogPrivate *mb_dialog_priv)
 {
     GtkWidget *tag_choice_list;
     GtkCellRenderer *renderer;
     GtkTreeViewColumn *column;
     GtkListStore *list_store;
-
+    
     mb_dialog_priv->tag_choice_dialog = GTK_WIDGET (gtk_builder_get_object (builder,
                                                                             "tag_choice_dialog"));
     tag_choice_list = GTK_WIDGET (gtk_builder_get_object (builder,
@@ -1791,19 +1759,149 @@ et_initialize_tag_choice_dialog (void)
                                  column);
 }
 
+gboolean
+et_music_brainz_get_exit_on_complete (void)
+{
+    return exit_on_complete;
+}
+
 /*
- * et_open_musicbrainz_dialog:
+ * et_show_status_msg_in_idle_cb:
+ * @obj: Source Object
+ * @res: GAsyncResult
+ * @user_data: User data
  *
- * This function will open the musicbrainz dialog.
+ * Callback function for Displaying StatusBar Message.
+ */
+static void
+et_show_status_msg_in_idle_cb (GObject *obj, GAsyncResult *res,
+                               gpointer user_data)
+{
+    gtk_statusbar_push (GTK_STATUSBAR (gtk_builder_get_object (builder,
+                        "statusbar")), 0, user_data);
+    g_free (user_data);
+    g_object_unref (res);
+}
+
+/*
+ * et_show_status_msg_in_idle_cb:
+ * @obj: Source Object
+ * @res: GAsyncResult
+ * @user_data: User data
+ *
+ * Function to Display StatusBar Messages in Main Thread.
  */
 void
-et_open_musicbrainz_dialog ()
+et_show_status_msg_in_idle (gchar *message)
 {
+    GSimpleAsyncResult *async_res;
+
+    async_res = g_simple_async_result_new (NULL,
+                                           et_show_status_msg_in_idle_cb,
+                                           g_strdup (message),
+                                           et_show_status_msg_in_idle);
+    g_simple_async_result_complete_in_idle (async_res);
+}
+
+/*
+ * et_music_brainz_dialog_stop_set_sensitive:
+ * @sensitive: gboolean
+ *
+ * Set btnStop and mb_dialog_priv->entityView as sensitive according to @sensitive.
+ */
+void
+et_music_brainz_dialog_stop_set_sensitive (gboolean sensitive)
+{
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
+    gtk_widget_set_sensitive (GTK_WIDGET (gtk_builder_get_object (builder, "btnStop")),
+                              sensitive);
+    gtk_widget_set_sensitive (mb_dialog_priv->entityView, !sensitive);
+}
+
+/*
+ * mb5_search_error_callback:
+ * @obj: Source Object
+ * @res: GAsyncResult
+ * @user_data: User data
+ *
+ * Callback function for displaying errors.
+ */
+void
+mb5_search_error_callback (GObject *source, GAsyncResult *res,
+                           gpointer user_data)
+{
+    GError *dest;
+    dest = NULL;
+    g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res),
+                                           &dest);
+    Log_Print (LOG_ERROR,
+               _("Error searching MusicBrainz Database '%s'"), dest->message);
+    gtk_statusbar_push (GTK_STATUSBAR (gtk_builder_get_object (builder,
+                                       "statusbar")), 0, dest->message);
+    g_error_free (dest);
+    et_music_brainz_dialog_stop_set_sensitive (FALSE);
+
+    if (exit_on_complete)
+    {
+        et_music_brainz_dialog_destroy (mbDialog);
+    }
+}
+
+/*
+ * et_mb_entity_view_destroy:
+ * @object: EtMbEntityView
+ *
+ * Overloaded destructor for EtMbEntityView.
+ */
+static void
+et_musicbrainz_dialog_finalize (GObject *object)
+{
+    EtMusicBrainzDialogPrivate *mb_dialog_priv;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (IS_ET_MUSICBRAINZ_DIALOG(object));
+
+    mb_dialog_priv = ET_MUSICBRAINZ_DIALOG_GET_PRIVATE (ET_MUSICBRAINZ_DIALOG (mbDialog));
+    et_mb_destroy_search (&mb_dialog_priv->search);
+    gtk_widget_destroy (mb_dialog_priv->tag_choice_dialog);
+    G_OBJECT_CLASS (et_musicbrainz_dialog_parent_class)->finalize(object);
+    free_mb_tree (&mb_dialog_priv->mb_tree_root);
+}
+
+/*
+ * et_mb_entity_view_class_init:
+ * @klass: EtMbEntityViewClass to initialize.
+ *
+ * Initializes an EtMbEntityViewClass class.
+ */
+static void
+et_musicbrainz_dialog_class_init (EtMusicBrainzDialogClass *klass)
+{
+    g_type_class_add_private (klass, sizeof (EtMusicBrainzDialogPrivate));
+    G_OBJECT_CLASS (klass)->finalize = et_musicbrainz_dialog_finalize;
+}
+
+/*
+ * et_mb_entity_view_init:
+ * @entity_view: EtMbEntityView to initialize.
+ *
+ * Initializes an EtMbEntityView.
+ */
+static void
+et_musicbrainz_dialog_init (EtMusicBrainzDialog *dialog)
+{
+    EtMusicBrainzDialogPrivate *priv;
     GtkWidget *cb_manual_search_in;
     GtkWidget *cb_search;
+    GtkWidget *box;
     GError *error;
     ET_File *et_file;
 
+    priv = dialog->priv = G_TYPE_INSTANCE_GET_PRIVATE (dialog,
+                                                       et_musicbrainz_dialog_get_type (),
+                                                       EtMusicBrainzDialogPrivate);
     builder = gtk_builder_new ();
     error = NULL;
 
@@ -1819,17 +1917,19 @@ et_open_musicbrainz_dialog ()
         return;
     }
 
-    mb_dialog_priv = g_slice_new (MusicBrainzDialogPrivate);
-    mb_dialog_priv->mb_tree_root = g_node_new (NULL);
-    mb_dialog_priv->search = NULL;
+    priv->mb_tree_root = g_node_new (NULL);
+    priv->search = NULL;
     exit_on_complete = FALSE;
-    mb_dialog_priv->entityView = et_mb_entity_view_new ();
-    mbDialog = GTK_WIDGET (gtk_builder_get_object (builder, "mbDialog"));
-    gtk_widget_set_size_request (mbDialog, 660, 500);
+    priv->entityView = et_mb_entity_view_new ();
+    box = GTK_WIDGET (gtk_builder_get_object (builder, "mb_box"));
+    gtk_window_set_title (GTK_WINDOW (dialog), "MusicBrainz Search");
+    gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
+                        box, TRUE, TRUE, 2);
+    gtk_widget_set_size_request (GTK_WIDGET (dialog), 660, 500);
     gtk_box_pack_start (GTK_BOX (gtk_builder_get_object (builder, "centralBox")),
-                        mb_dialog_priv->entityView, TRUE, TRUE, 2);
+                        priv->entityView, TRUE, TRUE, 2);
 
-    et_initialize_tag_choice_dialog ();
+    et_initialize_tag_choice_dialog (priv);
     cb_search = GTK_WIDGET (gtk_builder_get_object (builder, "cbManualSearch"));
     g_signal_connect (gtk_bin_get_child (GTK_BIN (cb_search)), "activate",
                       G_CALLBACK (btn_manual_find_clicked), NULL);
@@ -1899,7 +1999,30 @@ et_open_musicbrainz_dialog ()
         gtk_entry_set_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (cb_search))),
                             ((File_Tag *)et_file->FileTag->data)->album);
     }
+}
 
+/*
+ * et_mb_entity_view_new:
+ *
+ * Creates a new EtMbEntityView.
+ *
+ * Returns: GtkWidget, a new EtMbEntityView.
+ */
+GtkWidget *
+et_musicbrainz_dialog_new ()
+{
+    return GTK_WIDGET (g_object_new (et_musicbrainz_dialog_get_type (), NULL));
+}
+
+/*
+ * et_open_musicbrainz_dialog:
+ *
+ * This function will open the musicbrainz dialog.
+ */
+void
+et_open_musicbrainz_dialog ()
+{
+    mbDialog = et_musicbrainz_dialog_new ();
     gtk_widget_show_all (mbDialog);
     gtk_dialog_run (GTK_DIALOG (mbDialog));
 
diff --git a/src/musicbrainz_dialog.h b/src/musicbrainz_dialog.h
index 51d35b7..905937e 100755
--- a/src/musicbrainz_dialog.h
+++ b/src/musicbrainz_dialog.h
@@ -25,6 +25,22 @@
 
 #ifdef ENABLE_libmusicbrainz
 
+G_BEGIN_DECLS
+
+#define ET_MUSICBRAINZ_DIALOG_TYPE (et_musicbrainz_dialog_get_type ())
+#define ET_MUSICBRAINZ_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), \
+                                                                ET_MUSICBRAINZ_DIALOG_TYPE, \
+                                                                EtMusicBrainzDialog))
+
+#define ET_MUSICBRAINZ_DIALOG_CLASS(klass) (G_TYPE_CHECK_INSTANCE_CAST ((klass), \
+                                                                        ET_MUSICBRAINZ_DIALOG_TYPE, \
+                                                                        EtMusicBrainzDialog))
+
+#define IS_ET_MUSICBRAINZ_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
+                                                                   ET_MUSICBRAINZ_DIALOG_TYPE))
+
+#define IS_ET_MUSICBRAINZ_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), \
+                                                                        ET_MUSICBRAINZ_DIALOG_TYPE))
 /****************
  * Declarations *
  ****************/
@@ -32,10 +48,40 @@
 GtkBuilder *builder;
 GtkWidget *mbDialog;
 
+typedef struct _EtMusicBrainzDialogPrivate EtMusicBrainzDialogPrivate;
+/*
+ * EtMbEntityView:
+ * @vbox: GtkBox, parent class of EtMbEntityView
+ *
+ * This widget is used to show data recieved from music brainz and helps to
+ * navigate in it using breadcrumb widget.
+ */
+typedef struct
+{
+    GtkDialog dialog;
+    EtMusicBrainzDialogPrivate *priv;
+} EtMusicBrainzDialog;
+
+/*
+ * EtMbEntityViewClass:
+ * @parent: GtkBoxClass, parent class of EtMbEntityViewClass
+ *
+ * Class of EtMbEntityView.
+ */
+typedef struct
+{
+    GtkDialogClass parent;
+} EtMusicBrainzDialogClass;
+
+
 /**************
  * Prototypes *
  **************/
 
+GType
+et_musicbrainz_dialog_get_type (void);
+GtkWidget *
+et_musicbrainz_dialog_new (void);
 void
 et_open_musicbrainz_dialog (void);
 void
@@ -49,5 +95,6 @@ void
 et_music_brainz_dialog_destroy (GtkWidget *widget);
 gboolean
 et_music_brainz_get_exit_on_complete (void);
+G_END_DECLS
 #endif /* __MUSICBRAINZ_DIALOG_H__ */
 #endif /* ENABLE_libmusicbrainz */
\ No newline at end of file


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