1
0
mirror of https://github.com/twiglet/cs2j.git synced 2025-01-18 13:15:17 +01:00

292 lines
8.0 KiB
C#

using System;
using System.Collections;
using System.Text;
namespace RusticiSoftware.Translator
{
// Implements a hierarchy of directories.
public class DirectoryHT : IDictionary
{
private DirectoryHT _parent = null;
private Hashtable leaves = new Hashtable();
private Hashtable children = new Hashtable();
public DirectoryHT(DirectoryHT p)
{
_parent = p;
}
public DirectoryHT()
: this(null)
{ }
public Hashtable Leaves
{
get { return leaves; }
}
// p is key to a sub directory
public DirectoryHT subDir(string p)
{
string[] components = p.Split(new char[] { '.' }, 2);
if (components.Length == 1)
{
return (DirectoryHT) children[components[0]];
}
else
{
DirectoryHT child = (DirectoryHT)children[components[0]];
return (child == null ? null : child.subDir(components[1]));
}
}
#region IDictionary Members
public void Add(object key, object value)
{
if (!(key is string))
throw new Exception("The method or operation is not implemented.");
string[] components = ((string)key).Split(new char[] { '.' }, 2);
if (components.Length == 1)
{
leaves[components[0]] = value;
}
else
{
if (children[components[0]] == null)
children[components[0]] = new DirectoryHT(this);
((DirectoryHT)children[components[0]]).Add(components[1], value);
}
}
public void Clear()
{
leaves.Clear();
children.Clear();
}
public bool Contains(object key)
{
if (!(key is string))
throw new Exception("The method or operation is not implemented.");
string[] components = ((String)key).Split(new char[] { '.' }, 2);
if (components.Length == 1)
{
return leaves.Contains(components[0]);
}
else
{
return ((DirectoryHT)children[components[0]]).Contains(components[1]);
}
}
public IDictionaryEnumerator GetEnumerator()
{
IDictionaryEnumerator[] des = new IDictionaryEnumerator[1 + children.Count];
string[] pres = new string[1 + children.Count];
int i = 1;
pres[0] = "";
des[0] = leaves.GetEnumerator();
foreach (DictionaryEntry de in children)
{
pres[i] = ((string)de.Key) + ".";
des[i] = ((DirectoryHT)de.Value).GetEnumerator();
i++;
}
return new DirectoryHTEnumerator(pres,des);
}
public bool IsFixedSize
{
get { return false; }
}
public bool IsReadOnly
{
get { return false; }
}
public ICollection Keys
{
get {
ArrayList keys = new ArrayList();
foreach (object k in leaves.Keys)
keys.Add(k);
foreach (DictionaryEntry de in children)
foreach (string k in ((DirectoryHT)de.Value).Keys)
keys.Add(de.Key + "." + k);
return keys;
}
}
public void Remove(object key)
{
if (!(key is string))
throw new Exception("The method or operation is not implemented.");
string[] components = ((string)key).Split(new char[] { '.' }, 2);
if (components.Length == 1)
{
leaves.Remove(components[0]);
}
else
{
((DirectoryHT)children[components[0]]).Remove(components[1]);
}
}
public ICollection Values
{
get {
ArrayList vals = new ArrayList();
foreach (object v in leaves.Values)
vals.Add(v);
foreach (DictionaryEntry de in children)
foreach (object v in ((DirectoryHT)de.Value).Values)
vals.Add(v);
return vals;
}
}
public object this[object key]
{
get
{
if (!(key is string))
throw new Exception("The method or operation is not implemented.");
string[] components = ((string)key).Split(new char[] { '.' }, 2);
if (components.Length == 1)
{
object val = leaves[components[0]];
return (val != null ? val : children[components[0]]);
}
else
{
DirectoryHT child = (DirectoryHT)children[components[0]];
return (child == null ? null : child[components[1]]);
}
}
set
{
Add(key, value);
}
}
#endregion
#region ICollection Members
public void CopyTo(Array array, int index)
{
throw new Exception("The method or operation is not implemented.");
}
public int Count
{
get
{
int count = leaves.Count;
foreach (DirectoryHT c in children.Values)
count += c.Count;
return count;
}
}
public bool IsSynchronized
{
get { throw new Exception("The method or operation is not implemented."); }
}
public object SyncRoot
{
get { throw new Exception("The method or operation is not implemented."); }
}
#endregion
#region IEnumerable Members
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
}
public class DirectoryHTEnumerator : IDictionaryEnumerator
{
private int _pos = 0;
private string[] _prefixes;
private IDictionaryEnumerator[] _enums;
public DirectoryHTEnumerator(string[] pres, IDictionaryEnumerator[] des)
{
_prefixes = pres;
_enums = des;
}
#region IDictionaryEnumerator Members
public DictionaryEntry Entry
{
get { return (DictionaryEntry)Current; }
}
public object Key
{
get { return Entry.Key; }
}
public object Value
{
get { return Entry.Value; }
}
#endregion
#region IEnumerator Members
public object Current
{
get { ValidateIndex();
return new DictionaryEntry(_prefixes[_pos] + (string)((DictionaryEntry)_enums[_pos].Current).Key,
((DictionaryEntry)_enums[_pos].Current).Value);
}
}
public bool MoveNext()
{
if (_pos >= _enums.Length)
return false;
while (_pos < _enums.Length && !_enums[_pos].MoveNext())
_pos++;
return _pos != _enums.Length;
}
public void Reset()
{
_pos = 0;
}
// Validate the enumeration index and throw an exception if the index is out of range.
private void ValidateIndex()
{
if (_pos < 0 || _pos >= _enums.Length)
throw new InvalidOperationException("Enumerator is before or after the collection.");
}
#endregion
}
}