using System; using System.Collections.Generic; using System.Text; using System.Drawing; using DevExpress.XtraEditors; using DevExpress.XtraBars.Ribbon; using System.Collections; using System.Windows.Forms; using System.IO; namespace Hydro.WinfrmUI.Viewer { public class MRUArrayList : ArrayList { public static string MRUFileName = "RibbonMRUFiles.ini"; public static string MRUFolderName = "RibbonMRUFolders.ini"; Control container; int maxRecentFiles = 9; Image imgChecked, imgUncheked, glyph; public event EventHandler LabelClicked; bool indexedList; bool showDescription; public MRUArrayList(Control cont, Image iChecked, Image iUnchecked, Image glyph, bool indexedList, bool showDescription) : this(cont, iChecked, iUnchecked, glyph) { this.indexedList = indexedList; this.showDescription = showDescription; } public MRUArrayList(Control cont, Image iChecked, Image iUnchecked, Image glyph) : this(cont, iChecked, iUnchecked) { this.glyph = glyph; } public MRUArrayList(Control cont, Image iChecked, Image iUnchecked) : base() { this.indexedList = true; this.imgChecked = iChecked; this.imgUncheked = iUnchecked; this.container = cont; } int GetLastAppMenuFileLabelIndex() { for(int i = container.Controls.Count - 1; i >= 0; i--) { if(container.Controls[i] is AppMenuFileLabel) return i + 1; } return 0; } public void InsertElement(object value) { string[] names = value.ToString().Split(','); string _name = names[0]; bool checkedLabel = false; if(names.Length > 1) checkedLabel = names[1].ToLower().Equals("true"); foreach(Control c in container.Controls) { AppMenuFileLabel ml = c as AppMenuFileLabel; if(ml == null) continue; if(ml.Tag.Equals(_name)) { checkedLabel = ml.Checked; base.Remove(_name); ml.LabelClick -= new EventHandler(OnLabelClick); ml.Dispose(); break; } } bool access = true; if(base.Count >= maxRecentFiles) access = RemoveLastElement(); if(access) { base.Insert(0, _name); AppMenuFileLabel ml = new AppMenuFileLabel(); int index = GetLastAppMenuFileLabelIndex(); container.Controls.Add(ml); container.Controls.SetChildIndex(ml, index); ml.Tag = _name; if(showDescription) { ml.Text = GetFileName(_name); ml.Description = _name; } else ml.Text = GetFileName(_name); ml.Glyph = glyph; ml.Checked = checkedLabel; ml.AutoHeight = true; ml.Dock = DockStyle.Top; ml.Image = imgUncheked; ml.SelectedImage = imgChecked; ml.LabelClick += new EventHandler(OnLabelClick); if(indexedList) SetElementsRange(); } } void OnLabelClick(object sender, EventArgs e) { if(LabelClicked != null) LabelClicked(((AppMenuFileLabel)sender).Tag.ToString(), e); } public bool RemoveLastElement() { for(int i = 0; i < container.Controls.Count; i++) { AppMenuFileLabel ml = container.Controls[i] as AppMenuFileLabel; if(ml != null && !ml.Checked) { base.Remove(ml.Tag); ml.LabelClick -= new EventHandler(OnLabelClick); ml.Dispose(); return true; } } return false; } string GetFileName(object obj) { FileInfo fi = new FileInfo(obj.ToString()); return fi.Name; } void SetElementsRange() { int i = 0; foreach(Control c in container.Controls) { AppMenuFileLabel ml = c as AppMenuFileLabel; if(ml == null) continue; ml.Caption = string.Format("&{0}", container.Controls.Count - i); i++; } } public bool GetLabelChecked(string name) { foreach(Control c in container.Controls) { AppMenuFileLabel ml = c as AppMenuFileLabel; if(ml == null) continue; if(ml.Tag.Equals(name)) return ml.Checked; } return false; } public void Init(string fileName, string defaultItem) { if(!System.IO.File.Exists(fileName)) { InsertElement(defaultItem); return; } System.IO.StreamReader sr = System.IO.File.OpenText(fileName); container.SuspendLayout(); List list = new List(); for(string s = sr.ReadLine(); s != null; s = sr.ReadLine()) list.Add(s); for(int i = list.Count - 1; i >= 0; i--) { InsertElement(list[i]); } sr.Close(); container.ResumeLayout(); } } }