void LoadSources()
        {
            UseWaitCursor = true;
            Application.DoEvents();
            LockUpdate(true);
            try
            {
                lvSource.Services = null;

                ServiceItemsDataCollection services = new ServiceItemsDataCollection();

                Language from = (cbFrom.SelectedItem as LanguageDataContainer).Language;
                Language to = (cbTo.SelectedItem as LanguageDataContainer).Language;
                LanguagePair languagePair = new LanguagePair(from, to);
                string subject = (cbSubject.SelectedItem as SubjectContainer).Subject;

                foreach (KeyValuePair<LanguagePair, ServiceItemsCollection> kvp in Manager.LanguagePairServiceItems)
                {
                    if(
                        (kvp.Key.From == languagePair.From || languagePair.From == Language.Any) &&
                        (kvp.Key.To == languagePair.To || languagePair.To == Language.Any)
                      )
                    {
                        foreach(ServiceItem si in kvp.Value)
                        {
                            if(subject != SubjectConstants.Any)
                            {
                                if(si.SupportedSubjects.Contains(subject))
                                {
                                    ServiceItemData sid = new ServiceItemData(si, kvp.Key, subject);
                                    if(!profile.Services.Contains(sid))
                                        services.Add(sid);
                                }
                            }
                            else
                            {
                                foreach(string siSubject in si.SupportedSubjects)
                                {
                                    ServiceItemData sid = new ServiceItemData(si, kvp.Key, siSubject);
                                    if(!profile.Services.Contains(sid))
                                        services.Add(sid);
                                }
                            }
                        }
                    }
                }
                lvSource.Services = services;
            }
            finally
            {
                UseWaitCursor = false;
                LockUpdate(false);
            }
        }
        public CustomProfileServicesForm(UserTranslateProfile profile)
        {
            InitializeComponent();

            RegisterLanguageEvent(OnLanguageChanged);

            this.profile = profile;
            ServiceItemsDataCollection services = new ServiceItemsDataCollection();
            foreach(ServiceItemData sid in profile.Services)
                services.Add(sid);
            lvCurrent.Services = services;

            cbFrom.Items.Clear();
            cbTo.Items.Clear();

            for(int i = 0; i < (int)Language.Last; i++)
            {
                LanguageDataContainer ld = new LanguageDataContainer((Language)i, LangPack.TranslateLanguage((Language)i));
                cbFrom.Items.Add(ld);
                cbTo.Items.Add(ld);
            }

            cbFrom.SelectedIndex = 0;
            cbTo.SelectedIndex = 0;

            //cbSubject
            foreach(string subject in Manager.Subjects)
            {
                SubjectContainer sc = new SubjectContainer(subject, LangPack.TranslateString(subject));
                cbSubject.Items.Add(sc);
            }

            SubjectContainer sc1 = new SubjectContainer(SubjectConstants.Any, "+" + LangPack.TranslateString(SubjectConstants.Any));
            cbSubject.Items.Add(sc1);

            cbSubject.SelectedIndex = 0;

            for(int i = 0; i < cbFrom.Items.Count; i++)
            {
                LanguageDataContainer ld = cbFrom.Items[i] as LanguageDataContainer;

                if(ld.Language == profile.TranslationDirection.From)
                    cbFrom.SelectedItem = ld;

                if(ld.Language == profile.TranslationDirection.To)
                    cbTo.SelectedItem = ld;
            }

            for(int i = 0; i < cbSubject.Items.Count; i++)
            {
                SubjectContainer sc  = cbSubject.Items[i] as SubjectContainer;
                if(profile.Subject == sc.Subject)
                {
                    cbSubject.SelectedItem = sc;
                    break;
                }
            }

            serviceStatusSource.Visible = false;
            serviceStatusCurrent.Visible = false;

            initialized = true;
            CbFromSelectedIndexChanged(null, new EventArgs());
        }
 void BOkClick(object sender, EventArgs e)
 {
     ServiceItemsDataCollection services = new ServiceItemsDataCollection();
     foreach(ServiceItemData sid in lvCurrent.Services)
         services.Add(sid);
     profile.Services = services;
 }
        void ARemoveServiceExecute(object sender, EventArgs e)
        {
            UseWaitCursor = true;
            Application.DoEvents();
            LockUpdate(true);

            try
            {
                Language from = (cbFrom.SelectedItem as LanguageDataContainer).Language;
                Language to = (cbTo.SelectedItem as LanguageDataContainer).Language;
                LanguagePair languagePair = new LanguagePair(from, to);
                string subject = (cbSubject.SelectedItem as SubjectContainer).Subject;
                LanguagePair selectedLanguagePair = lvCurrent.Selected.LanguagePair;
                if((selectedLanguagePair == languagePair ||
                    (languagePair.From == Language.Any && selectedLanguagePair.To == languagePair.To) ||
                    (languagePair.To == Language.Any && selectedLanguagePair.From == languagePair.From) ||
                    (languagePair.From == Language.Any && languagePair.To == Language.Any)
                    ) &&
                    (lvCurrent.Selected.Subject == subject || subject == SubjectConstants.Any)
                )
                {
                    ServiceItemsDataCollection services = new ServiceItemsDataCollection();
                    services.Add(lvCurrent.Selected);
                    lvSource.AddServices(services);
                }

                lvCurrent.RemoveSelected();
            }
            finally
            {
                UseWaitCursor = false;
                LockUpdate(false);
            }
        }
        void AAddSelectedExecute(object sender, EventArgs e)
        {
            UseWaitCursor = true;
            Application.DoEvents();
            LockUpdate(true);

            try
            {

                ServiceItemsDataCollection services = new ServiceItemsDataCollection();
                services.Add(lvSource.Selected);
                lvCurrent.AddServices(services);
                lvSource.RemoveSelected();
            }
            finally
            {
                UseWaitCursor = false;
                LockUpdate(false);
            }
        }
        void AAddAllExecute(object sender, EventArgs e)
        {
            UseWaitCursor = true;
            Application.DoEvents();
            LockUpdate(true);

            try
            {
                ServiceItemsDataCollection services = new ServiceItemsDataCollection();
                foreach(ServiceItemData sid in lvSource.Services)
                        services.Add(sid);
                lvCurrent.AddServices(services);
                lvSource.RemoveAll();
            }
            finally
            {
                UseWaitCursor = false;
                LockUpdate(false);
            }
        }
        public void AddServices(ServiceItemsDataCollection servicesToAdd)
        {
            SuspendLayout();
            lvMain.SuspendLayout();
            lvMain.BeginUpdate();
            try
            {
                //bool saveSorted = Sorted;
                //Sorted = false;

                foreach(ServiceItemData sd in servicesToAdd)
                {
                    services.Add(sd);
                    ServiceItemDataContainer sid = new ServiceItemDataContainer(sd);
                    ListViewItem lvi = new ListViewItem();
                    lvi.Text = sid.Name;
                    lvi.Tag = sid;
                    lvi.ImageKey = sd.ServiceItem.Service.Name;
                    lvi.SubItems.Add(sid.Type);
                    lvi.SubItems.Add(sid.LanguagePair);
                    lvi.SubItems.Add(sid.Subject);
                    lvi.ToolTipText = sid.Name;
                    lvMain.Items.Add(lvi);
                }
                //Sorted = saveSorted;
                lvMain.Focus();
                if(lvMain.Items.Count > 0)
                {
                    lvMain.Items[0].Selected = true;
                    lvMain.Items[0].Focused = true;

                    chName.Width = 200;
                    chType.Width = -1;
                    chLanguagePair.Width = 150;
                    chSubject.Width = -2;

                }
                else
                {
                    if(ServiceItemChangedEvent != null)
                        ServiceItemChangedEvent(this, new ServiceItemChangedEventArgs(null));

                    chName.Width = 200;
                    chType.Width = -2;
                    chLanguagePair.Width = 150;
                    chSubject.Width = -2;

                }
            }
            finally
            {
                lvMain.EndUpdate();
                lvMain.ResumeLayout();
                ResumeLayout();
            }
        }