using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace PaintDotNet
{
///
/// Represents a collection of FileType instances.
///
[Serializable]
public class FileTypeCollection
{
private FileType[] fileTypes;
public FileType[] FileTypes
{
get
{
return (FileType[])fileTypes.Clone();
}
}
public int Length
{
get
{
return fileTypes.Length;
}
}
public FileType this[int index]
{
get
{
return fileTypes[index];
}
}
public string[] AllExtensions
{
get
{
List exts = new List();
foreach (FileType fileType in this.fileTypes)
{
foreach (string ext in fileType.Extensions)
{
exts.Add(ext);
}
}
return exts.ToArray();
}
}
internal FileTypeCollection(FileType[] fileTypes)
{
this.fileTypes = fileTypes;
}
public FileTypeCollection(ICollection fileTypes)
{
this.fileTypes = new FileType[fileTypes.Count];
int dstIndex = 0;
foreach (FileType ft in fileTypes)
{
this.fileTypes[dstIndex] = ft;
++dstIndex;
}
}
public static FileType[] FilterFileTypeList(FileType[] input, bool excludeCantSave, bool excludeCantLoad)
{
List filtered = new List();
foreach (FileType fileType in input)
{
if (excludeCantSave && !fileType.SupportsSaving)
{
continue;
}
if (excludeCantLoad && !fileType.SupportsLoading)
{
continue;
}
filtered.Add(fileType);
}
return filtered.ToArray();
}
public string ToString(bool excludeCantSave, bool excludeCantLoad)
{
FileType[] filtered = FilterFileTypeList(this.fileTypes, excludeCantSave, excludeCantLoad);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < filtered.Length; ++i)
{
FileType fileType = filtered[i];
sb.Append(fileType.ToString());
if (i != filtered.Length - 1)
{
sb.Append("|");
}
}
return sb.ToString();
}
///
/// Allows you to include an "All" type at the top that includes all the filetypes
/// "All images (*.bmp, *.gif, ...)" for instance.
///
/// Whether or not to include the 'all' file type at the top
/// The name of the 'all' type (example: "All images"). If this is null
/// but includeAll is true, then this defaults to the string "All image types"
public string ToString(bool includeAll, string allName, bool excludeCantSave, bool excludeCantLoad)
{
if (allName == null)
{
allName = PdnResources.GetString("FileTypeCollection.AllImageTypes");
}
if (includeAll)
{
StringBuilder description = new StringBuilder(allName);
StringBuilder formats = new StringBuilder();
bool didFirst = false;
FileType[] filtered = FilterFileTypeList(this.fileTypes, excludeCantSave, excludeCantLoad);
for (int i = 0; i < filtered.Length; ++i)
{
if (!didFirst)
{
didFirst = true;
description.Append(" (");
}
string[] extensions = (filtered[i]).Extensions;
for (int j = 0; j < extensions.Length; ++j)
{
description.Append("*");
description.Append(extensions[j]);
formats.Append("*");
formats.Append(extensions[j]);
// if this is NOT the last extension in the whole list ...
if (!(j == extensions.Length - 1 && i == filtered.Length - 1))
{
description.Append(", ");
formats.Append(";");
}
}
}
if (didFirst)
{
description.Append(")");
}
string ret = description.ToString() + "|" + formats.ToString();
if (filtered.Length != 0)
{
ret += "|" + ToString(excludeCantSave, excludeCantLoad);
}
return ret;
}
else
{
return ToString(excludeCantSave, excludeCantLoad);
}
}
public int IndexOfFileType(FileType fileType)
{
if (fileType == null)
{
return -1;
}
for (int i = 0; i < fileTypes.Length; ++i)
{
if (fileTypes[i].Name == fileType.Name)
{
return i;
}
}
return -1;
}
public int IndexOfExtension(string findMeExt)
{
if (findMeExt == null)
{
return -1;
}
for (int i = 0; i < fileTypes.Length; ++i)
{
foreach (string ext in fileTypes[i].Extensions)
{
if (ext.ToLower() == findMeExt.ToLower())
{
return i;
}
}
}
return -1;
}
public int IndexOfName(string name)
{
for (int i = 0; i < fileTypes.Length; ++i)
{
if (fileTypes[i].Name == name)
{
return i;
}
}
return -1;
}
}
}