using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Text.RegularExpressions; using System.Xml; namespace ImageSorter { public class ImageCollection : IEnumerable { private List _images; private static Regex _imageFileNameRE = new Regex(@"\.(?:jpg|png|bmp)", RegexOptions.IgnoreCase | RegexOptions.Compiled); private TagCollection _tags; public ImageCollection(string dir) { LoadFromDirectory(dir); BuildTagCollection(); } /// /// Construct from an XML save file /// public ImageCollection(TextReader xml) { readXMLFile(xml); BuildTagCollection(); } private void readXMLFile(TextReader xml) { XmlDocument doc = new XmlDocument(); doc.Load(xml); _images = new List(); foreach (XmlNode imageNode in doc.SelectNodes("/images/image")) { string file = imageNode.Attributes.GetNamedItem("file").Value; ImageInfo image = new ImageInfo(file); foreach (XmlNode tag in imageNode.SelectNodes("*")) { image.SetTag(tag.Name, true); } _images.Add(image); } } private void LoadFromDirectory(string dir) { _images = new List(); foreach (string file in Directory.GetFiles(dir)) { if (_imageFileNameRE.Match(file).Success) { _images.Add(new ImageInfo(file)); } } } private void BuildTagCollection() { Dictionary tagSet = new Dictionary(); foreach (ImageInfo image in _images) { foreach (string tag in image.Tags) { tagSet[tag] = true; } } _tags = new TagCollection(tagSet.Keys); } public ImageInfo this[int imageNum] { get { return _images[imageNum]; } } public int Count { get { return _images.Count; } } public TagCollection Tags { get { return _tags; } } internal int UsesOfTag(string tag) { int uses = 0; foreach (ImageInfo image in _images) { if (image.HasTag(tag)) { ++uses; } } return uses; } public void WriteTo(TextWriter outstr) { using (XmlWriter wrt = XmlWriter.Create(outstr)) { wrt.WriteStartDocument(); wrt.WriteStartElement("images"); foreach (ImageInfo image in this) { WriteImageTo(image, wrt); } wrt.WriteEndElement(); } } private void WriteImageTo(ImageInfo image, XmlWriter wrt) { wrt.WriteStartElement("image"); wrt.WriteAttributeString("file", image.Filename); foreach (string tag in image.Tags) { wrt.WriteStartElement(tag); wrt.WriteEndElement(); } wrt.WriteEndElement(); } #region IEnumerable Members public IEnumerator GetEnumerator() { return _images.GetEnumerator(); } #endregion #region IEnumerable Members System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return _images.GetEnumerator(); } #endregion internal void Exclude(int image) { _images.RemoveAt(image); } internal void Insert(int index, ImageInfo image) { _images.Insert(index, image); } } }