/// <summary>
 /// Create new device template.
 /// </summary>
 public void NewTemplate()
 {
     try
     {
         //Ask save settings if device template is dirty.
         if (Device != null && Device.Dirty)
         {
             DialogResult ret = MessageBox.Show(ParentComponent, Gurux.DeviceSuite.Properties.Resources.SaveChangesQuestionTxt, Gurux.DeviceSuite.Properties.Resources.DeviceEditorTxt, MessageBoxButtons.YesNoCancel);
             if (ret == DialogResult.Cancel)
             {
                 return;
             }
             else if (ret == DialogResult.Yes)
             {
                 Save();
             }
         }
         GXWizardDlg dlg = new GXWizardDlg(null, Manufacturers, null);
         if (dlg.ShowDialog(ParentComponent) == DialogResult.Cancel)
         {
             return;
         }                
         Device = dlg.Target as GXDevice;
         Device.Save(Device.ProfilePath);                
         Device.Register();                
         ShowProperties(Device);                
         ParentComponent.CloseMenu.Enabled = true;
         ParentComponent.ExportMenu.Enabled = !System.Diagnostics.Debugger.IsAttached;
         ParentComponent.ImportMenu.Enabled = Device.AddIn.ImportFromDeviceEnabled;
         PropertyTree.SelectedNode = PropertyTree.Nodes[0];
         PropertyTree.Focus();                
         ValidateTasks();                
     }
     catch (Exception Ex)
     {
         GXCommon.ShowError(ParentComponent, Ex);
     }
     finally
     {
         this.Cursor = Cursors.Default;
     }
 }
 void EditObject(object target)
 {
     try
     {                                
         GXWizardDlg dlg = new GXWizardDlg(target, null, Device.AddIn);             
         if (dlg.ShowDialog(ParentComponent) == DialogResult.Cancel)
         {
             return;
         }
         this.ShowProperties(Device);
         NotifyDirty();            
     }
     catch (Exception Ex)
     {
         GXCommon.ShowError(ParentComponent, Ex);
     }
 }
 public void NewObject()
 {
     try
     {
         if (PropertyTree.SelectedNode == null ||
             PropertyTree.SelectedNode.Tag == null)
         {
             return;
         }
         GXProtocolAddIn AddIn = Device.AddIn;
         TreeNode parent = null;
         object source = PropertyTree.SelectedNode.Tag;
         //Add Category
         if (source is GXCategoryCollection)
         {
             GXCategoryCollection cats = source as GXCategoryCollection;
             GXCategory[] itemArray = AddIn.GetCategories(cats);
             if (itemArray.Length == 0)
             {
                 throw new Exception("No category types found.");
             }
             GXCategory cat = itemArray[0];
             parent = PropertyTree.SelectedNode;
             GXWizardDlg dlg = new GXWizardDlg(cat, cats.Parent, AddIn);
             if (dlg.ShowDialog(ParentComponent) == DialogResult.Cancel)
             {
                 return;
             }
             this.ShowProperties(Device);
             NotifyDirty();
         }
         //Add Table
         else if (source is GXTableCollection)
         {
             GXTableCollection tables = source as GXTableCollection;
             GXTable[] itemArray = AddIn.GetTables(tables);
             if (itemArray.Length == 0)
             {
                 throw new Exception("No table types found.");
             }
             GXTable table = itemArray[0];
             parent = PropertyTree.SelectedNode;
             GXWizardDlg dlg = new GXWizardDlg(table, tables.Parent, AddIn);
             if (dlg.ShowDialog(ParentComponent) == DialogResult.Cancel)
             {
                 return;
             }
             this.ShowProperties(Device);
             NotifyDirty();
         }
         //Add Property
         else if (source is GXProperty || source is GXCategory || source is GXTable)
         {
             GXCategory cat = null;
             GXTable table = null;
             object propertyParent = null;
             if (source is GXProperty)
             {
                 table = ((GXProperty)source).Table;
                 cat = ((GXProperty)source).Category;
                 if (table != null)
                 {
                     propertyParent = table;
                     parent = ObjectToTreeNode[table] as TreeNode;
                 }
                 else if (cat != null)
                 {
                     propertyParent = cat;
                     parent = ObjectToTreeNode[cat] as TreeNode;
                 }
             }
             else if (source is GXCategory)
             {
                 propertyParent = cat = (GXCategory)source;
                 parent = ObjectToTreeNode[cat] as TreeNode;
             }
             else if (source is GXTable)
             {
                 propertyParent = table = (GXTable)source;
                 parent = ObjectToTreeNode[table] as TreeNode;
             }
             else
             {
                 //Shouldn't get here
                 throw new Exception("Unknown error while adding property.");
             }
             GXProperty[] itemArray = AddIn.GetProperties(source);
             if (itemArray.Length == 0)
             {
                 throw new Exception("No property types found.");
             }
             GXProperty prop = itemArray[0];
             GXWizardDlg dlg = new GXWizardDlg(prop, propertyParent, AddIn);
             if (dlg.ShowDialog(ParentComponent) == DialogResult.Cancel)
             {
                 return;
             }
             this.ShowProperties(Device);
             NotifyDirty();
         }
         else
         {
             throw new Exception("Unknown type to add.");
         }
         parent.Expand();
         ValidateTasks();
     }
     catch (Exception Ex)
     {
         GXCommon.ShowError(ParentComponent, Ex);
     }
 }