/// <summary>
 /// Constructor.
 /// </summary>
 /// <param name="group"></param>
 /// <param name="target"></param>
 public GXDeviceGroupDialog(GXDeviceGroup group, object target)
 {
     InitializeComponent();
     FindParentGroups(target);
     Target = group;
     NameTB.Text = group.Name;
     this.GeneralTab.Text = Gurux.DeviceSuite.Properties.Resources.GeneralTxt;
     this.Text = Gurux.DeviceSuite.Properties.Resources.DeviceGroupSettingsTxt;
     //Update help strings from the resource.
     this.helpProvider1.SetHelpString(this.NameTB, Gurux.DeviceSuite.Properties.Resources.DeviceGroupNameHelp);
     this.helpProvider1.SetHelpString(this.btnOK, Gurux.DeviceSuite.Properties.Resources.OKHelp);
     this.helpProvider1.SetHelpString(this.btnCancel, Gurux.DeviceSuite.Properties.Resources.CancelHelp);
     //Add disabled actions.
     m_DisActions = new DisabledAction(Target.DisabledActions);
     tabControl1.TabPages.Add(m_DisActions.DisabledActionsTB);
 }
		/// <summary>
		/// Search available devices.
		/// </summary>
		/// <returns>True if the the search was success.</returns>
		public abstract bool FindDevices(GXDeviceGroup deviceGroup);
        /// <summary>
        /// Load device template and connect to the device.
        /// </summary>
        /// <param name="path"></param>
        /// <param name="taskinfo"></param>
        public void Connect(string path, GXClaimedTask taskinfo)
        {
            ExecutedTask = taskinfo;
            //If already connected.
            if (Device != null)
            {
                UpdateParameters();
                if ((Device.Status & DeviceStates.Connected) == 0)
                {
                    Device.Connect();
                }
                return;
            }
            DeviceList = new GXDeviceList();
            DeviceList.OnError += new Gurux.Common.ErrorEventHandler(DeviceList_OnError);
            DeviceList.OnUpdated += new ItemUpdatedEventHandler(DeviceList_OnUpdated);                        
            GXDeviceGroup group = new GXDeviceGroup();
            DeviceList.DeviceGroups.Add(group);
            TargetDirectory = path;
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
            AppDomain.CurrentDomain.TypeResolve += new ResolveEventHandler(CurrentDomain_TypeResolve);
            GXDeviceList.Update(path);
            string filename = Path.Combine(path, taskinfo.Device.ProfileGuid + ".gxp");            
            Device = GXDevice.Load(filename);
            Device.ID = taskinfo.Device.Id;
            group.Devices.Add(Device);
            Device.Name = taskinfo.Device.Name;
            //taskinfo.Device.AutoConnect;
            // ForcePerPropertyRead
            Device.UpdateInterval = taskinfo.Device.UpdateInterval;
            Device.WaitTime = taskinfo.Device.WaitTime;
            Device.ResendCount = taskinfo.Device.ResendCount;
            Device.DisabledActions = taskinfo.Device.DisabledActions;

            /* TODO:
            Device.FailTryCount = taskinfo.Device.FailTryCount;
            Device.FailWaitTime = taskinfo.Device.FailWaitTime;
            Device.ConnectionTryCount = taskinfo.Device.ConnectionTryCount;
            Device.ConnectionFailWaitTime = taskinfo.Device.ConnectionFailWaitTime;
              */

            //Update parameters.
            UpdateParameters();

            //Load medias to this assembly domin.
            Gurux.Communication.GXClient.GetAvailableMedias();
            if (taskinfo.Device.TraceLevel != System.Diagnostics.TraceLevel.Off)
            {
                Device.Trace = taskinfo.Device.TraceLevel;
                Device.OnTrace += new TraceEventHandler(Device_OnTrace);
            }
            Exception lastException = null;
            int pos = -1;
            Gurux.Common.IGXMedia media = null;
            foreach (var it in taskinfo.MediaSettings)
            {
                try
                {
                    ++pos;
                    //If media is changed.
                    if (media == null || media.MediaType != taskinfo.MediaSettings[pos].Key)
                    {
                        media = Device.GXClient.SelectMedia(taskinfo.MediaSettings[pos].Key);
                        Device.GXClient.AssignMedia(media);
                    }
                    media.Settings = taskinfo.MediaSettings[pos].Value.Value;                    
                    lastException = null;                        
                    Device.Connect();
                    break;
                }
                catch (Exception ex)
                {
                    //If connection fails try next redundant connectio.
                    lastException = ex;                    
                }
            }
            if (lastException != null)
            {
                throw lastException;
            }
        }
 /// <summary>
 /// Create new Device list.
 /// </summary>
 public void NewDeviceList()
 {
     try
     {
         if (CheckAndWritePropertyValues() != DialogResult.Cancel)
         {
             //Don't clear errors on new list creation (and director opening)
             m_DeviceList.CreateEmpty("GXDeviceList1");
             //Create default device group where device are added.
             GXDeviceGroup group = new GXDeviceGroup();
             group.Name = "Devices";                    
             m_DeviceList.DeviceGroups.Add(group);
             m_DeviceList.SelectedItem = group;
             m_DeviceList.Dirty = false;
         }
     }
     catch (Exception ex)
     {
         GXCommon.ShowError(ParentComponent, ex);
     }
 }
        /// <summary>
        /// Delete selected device group.
        /// </summary>
        /// <param name="deviceGroup">The device group to be deleted.</param>
        public void DeleteDeviceGroup(GXDeviceGroup deviceGroup)
        {
            if (deviceGroup == null || deviceGroup.Parent == null)
            {
                System.Diagnostics.Debug.Assert(false);
                return;
            }
            //Show default Gurux dialog.
            if (GXCommon.ShowExclamation(ParentComponent, Gurux.DeviceSuite.Properties.Resources.GuruxDeviceSuiteTxt, Gurux.DeviceSuite.Properties.Resources.RemoveItemTxt) != DialogResult.Yes)
            {
                return;
            }

            Queue q = new Queue();
            q.Enqueue(deviceGroup);
            GXDeviceGroup grp = null;

            bool ChildDeviceConnected = false;
            while (q.Count > 0)
            {
                grp = (GXDeviceGroup)q.Dequeue();
                //Add child groups to queue
                foreach (GXDeviceGroup ChildGrp in grp.DeviceGroups)
                {
                    q.Enqueue(ChildGrp);
                }
                //Remove devices from schedules
                bool DeviceConnected = false;
                foreach (GXDevice dev in grp.Devices)
                {
                    if ((dev.Status & Gurux.Device.DeviceStates.Connected) != 0)
                    {
                        ChildDeviceConnected = DeviceConnected = true;
                    }
                }
                if (DeviceConnected)
                {
                    continue;
                }
            }
            if (!ChildDeviceConnected)
            {
                deviceGroup.Parent.Remove(deviceGroup);
            }
            else
            {
                throw new Exception("Could not remove device group, because of some connected device(s).");
            }
        }
        private TreeNode ShowAvailableDeviceGroup(GXDeviceGroup group, TreeNodeCollection nodes, bool showDevices)
        {
#if DEBUG
            m_ObjectIDs.Add(group.ID, group);
#endif //DEBUG
            TreeNode node = nodes.Add(group.Name);
            node.Tag = group;
            node.SelectedImageIndex = node.ImageIndex = (int)DeviceImageType.DeviceGroup;
            DeviceToTreeNode[group] = node;
            if (showDevices)
            {
                ShowAvailableDevices(group.Devices, node);
            }
            ShowAvailableDeviceGroups(group.DeviceGroups, node.Nodes, showDevices);
            return node;
        }