public bool Close()
        {
            if (this.IsDirty)
            {
                DialogResult result = MessageBox.Show("Do you want to save the changes?", StringTable.GetString("ApplicationName"), MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
                switch (result)
                {
                case DialogResult.Yes:
                    if (!this.Save())
                    {
                        return(false);
                    }
                    break;

                case DialogResult.Cancel:
                    return(false);

                case DialogResult.No:
                    return(true);
                }
            }

            return(true);
        }
        protected override void OnAfterLabelEdit(LabelEditEventArgs e)
        {
            base.OnAfterLabelEdit(e);

            ResourceItem item = (ResourceItem)this.Items[e.Item];

            bool hasChanged = true;

            if ((e.Label != null) && (this.ContainsName(e.Label)))
            {
                MessageBox.Show(this, "Resource \'" + e.Label + "\' already exists.", StringTable.GetString("ApplicationName"));
                item.BeginEdit();
                hasChanged = false;
            }

            if ((e.Label == null) && (this.ContainsName(item)))
            {
                MessageBox.Show(this, "Resource \'" + item.ResourceName + "\' already exists.", StringTable.GetString("ApplicationName"));
                item.BeginEdit();
                hasChanged = false;
            }

            if (hasChanged)
            {
                this.IsDirty = true;
            }
        }
        public bool Save(string fileName)
        {
            this.FileName = fileName;

            string fileExtension = Path.GetExtension(fileName).ToLower();

            switch (fileExtension)
            {
            case ".xml":
            case ".resx":
                try
                {
                    using (ResXResourceWriter writer = new ResXResourceWriter(fileName))
                    {
                        foreach (ResourceItem item in this.Items)
                        {
                            writer.AddResource(item.ResourceName, item.ResourceValue);
                        }
                        writer.Generate();
                    }
                }
                catch (Exception exception)
                {
                    MessageBox.Show(this, exception.Message, StringTable.GetString("ApplicationName"));
                    return(false);
                }
                break;

            case ".resources":
                try
                {
                    using (ResourceWriter writer = new ResourceWriter(fileName))
                    {
                        foreach (ResourceItem item in this.Items)
                        {
                            writer.AddResource(item.ResourceName, item.ResourceValue);
                        }
                        writer.Generate();
                    }
                }
                catch (Exception exception)
                {
                    MessageBox.Show(this, exception.Message, StringTable.GetString("ApplicationName"));
                    return(false);
                }
                break;

            case ".txt":
                try
                {
                    using (StreamWriter writer = new StreamWriter(fileName))
                    {
                        foreach (ResourceItem item in this.Items)
                        {
                            if ((item.ResourceValue != null) && (item.ResourceValue is String))
                            {
                                writer.Write(item.ResourceName);
                                writer.Write("=");
                                writer.Write(item.ResourceValue);
                                writer.WriteLine();
                            }
                            else
                            {
                                MessageBox.Show(this, "Resource \'" + item.ResourceName + "\' cannot be saved as a text resource.", StringTable.GetString("ApplicationName"));
                            }
                        }
                    }
                }
                catch (Exception exception)
                {
                    MessageBox.Show(this, exception.Message, StringTable.GetString("ApplicationName"));
                    return(false);
                }
                break;

            default:
                MessageBox.Show(this, "Unknown resource file format.", StringTable.GetString("ApplicationName"));
                return(false);
            }

            this.IsDirty = false;
            return(true);
        }
        public void Paste()
        {
            IDataObject dataObject = Clipboard.GetDataObject();

            if (dataObject.GetDataPresent(typeof(Hashtable).FullName))
            {
                Hashtable dictionary = (Hashtable)dataObject.GetData(typeof(Hashtable));

                foreach (DictionaryEntry n in dictionary)
                {
                    if (!this.ContainsName((string)n.Key))
                    {
                        ICloneable   cloneable = (ICloneable)n.Value;
                        object       value     = cloneable.Clone();
                        ResourceItem item      = this.AddResource((string)n.Key, value);
                        item.Selected = true;
                    }
                    else
                    {
                        MessageBox.Show(this, "Resource \'" + n.Key + "\' already exists.", StringTable.GetString("ApplicationName"));
                    }
                }
            }
        }
        public void Load(string fileName)
        {
            this.New();

            this.FileName = fileName;
            string fileExtension = Path.GetExtension(fileName).ToLower();

            try
            {
                switch (fileExtension)
                {
                case ".xml":
                case ".resx":
                    using (ResXResourceReader reader = new ResXResourceReader(fileName))
                    {
                        this.BeginUpdate();

                        Hashtable             resources  = new Hashtable();
                        IDictionaryEnumerator enumerator = reader.GetEnumerator();
                        while (enumerator.MoveNext())
                        {
                            string name  = (string)enumerator.Key;
                            object value = enumerator.Value;
                            if (!resources.Contains(name))
                            {
                                this.AddResource(name, value);
                                resources.Add(name, value);
                            }
                        }

                        this.EndUpdate();
                    }
                    break;

                case ".resources":
                    using (FileStream stream = File.OpenRead(fileName))
                    {
                        this.BeginUpdate();

                        using (ResourceReader reader = new ResourceReader(stream))
                        {
                            Hashtable             resources  = new Hashtable();
                            IDictionaryEnumerator enumerator = reader.GetEnumerator();

                            while (enumerator.MoveNext())
                            {
                                string name  = (string)enumerator.Key;
                                object value = enumerator.Value;

                                if (!resources.Contains(name))
                                {
                                    this.AddResource(name, value);
                                    resources.Add(name, value);
                                }
                            }
                        }

                        this.EndUpdate();
                    }
                    break;

                case ".txt":
                    using (StreamReader reader = File.OpenText(fileName))
                    {
                        this.BeginUpdate();

                        Hashtable resources = new Hashtable();
                        while (reader.Peek() != -1)
                        {
                            string line = reader.ReadLine();
                            line = line.TrimStart();
                            if (!line.StartsWith(";"))
                            {
                                int index = line.IndexOf("=");
                                if (index != -1)
                                {
                                    string name  = line.Substring(0, index);
                                    string value = line.Substring(index + 1);
                                    name = name.Trim();
                                    if (!resources.Contains(name))
                                    {
                                        this.AddResource(name, value);
                                        resources.Add(name, value);
                                    }
                                }
                            }
                        }

                        this.EndUpdate();
                    }
                    break;


                default:
                    MessageBox.Show(this, "Unknown resource file format.", StringTable.GetString("ApplicationName"));
                    break;
                }
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }


            this.IsDirty = false;
        }