Faves to XML : create an xml file from Favourites list, post on the web.

Download fave2xml.zip

Synopsis:

comparelists.cs
Explorer.cs
FavouritesDirectory.cs
Link.cs
LinkProperties.cs
LinksParser.cs
LinksReader.cs
LinksWriter.cs
MainWindow.cs
XmlLinks.cs
links.xml


comparelists.cs

Synopsis
using System;
using System.Collections;
using System.Windows.Forms;

namespace fave2xml
{
  public class CompareLists
  {
    private readonly Link cMissingEntry = new Link("<missing>");
    private ArrayList mLeftList;
    private ArrayList mRightList;
    int mLeftIndex = 0;
    int mRightIndex = 0;
    public void compare(ArrayList leftlist, ArrayList rightlist)
    {
      if (ListsAreEmpty(leftlist, rightlist)) return;

      mLeftList = leftlist;
      mRightList = rightlist;

      for(Initialize(); !IsLeftDone() || !IsRightDone(); NextItems())
        CheckForMissingItems();
    }
    private bool ListsAreEmpty(ArrayList leftlist, ArrayList rightlist)
    {
      if (leftlist == null || rightlist == null) return true;
      if (leftlist.Count == 0 || rightlist.Count == 0) return true;
      return false;
    }
    private void Initialize()
    {
      mLeftList.Sort();
      mRightList.Sort();

      Cleanup(mLeftList);
      Cleanup(mRightList);

      mLeftIndex = 0;
      mRightIndex = 0;
           
    }
    private void Cleanup(ArrayList list)
    {
      int i = 0;
      while(i < list.Count)
      {
        if (((Link) list[i]).CompareTo(cMissingEntry) == 0)
          list.RemoveAt(i);
        else
          ++i;
      }
    }
  private void NextItems()
    {
      ++mLeftIndex;
      ++mRightIndex;
    }
    private void CheckForMissingItems()
    {
      if (IsRightDone())
        AddMissingToRight();
      else if (IsLeftDone())
        AddMissingToLeft();
      else
      {
        int cmp = CompareLeftToRight();
        if (cmp < 0)
          InsertMissingIntoRight();
        else if (cmp > 0)
          InsertMissingIntoLeft();
      }
    }
    private void AddMissingToRight()
    {
      mRightList.Add(cMissingEntry);
    }
    private void AddMissingToLeft()
    {
      mLeftList.Add(cMissingEntry);
    }
    private void InsertMissingIntoRight()
    {
      mRightList.Insert(mLeftIndex, cMissingEntry);
    }
    private void InsertMissingIntoLeft()
    {
      mLeftList.Insert(mRightIndex, cMissingEntry);
    }
    private int CompareLeftToRight()
    {
      return ((Link) mLeftList[mLeftIndex]).CompareTo((Link)mRightList[mRightIndex]);
    }
    private bool IsLeftDone()
    {
      return mLeftIndex >= mLeftList.Count;
    }
    private bool IsRightDone()
    {
      return mRightIndex >= mRightList.Count;
    }
  }
}

Explorer.cs

Synopsis
using System;
using SHDocVw;
using mshtml;

namespace fave2xml
{
	/// <summary>
	/// Summary description for Explorer.
	/// </summary>
	public class Explorer
	{
    SHDocVw.InternetExplorer myIExplorer = null;
    IWebBrowserApp myWebBrowser = null;

    public Explorer()
    {
      Create();
    }
    public void ShowPage(string addr)
    {
      for(int tries = 1; tries <= 2; ++tries)
      {
        try
        {
          GotoPage(addr);
          break;
        } 
        catch (Exception )
        {
          Create();
        }
      }
    }
    private void Create()
    {
      myIExplorer = new SHDocVw.InternetExplorer();
      myWebBrowser = (IWebBrowserApp) myIExplorer;
      myWebBrowser.Visible = true;
    }
    private void GotoPage(string addr)
    {
      Object o = null;
      myWebBrowser.Navigate(addr, ref o, ref o, ref o, ref o);
    }

    public void Dispose()
    {
      try 
      {
        myWebBrowser.Quit();
      } 
      catch(Exception)
      {
        //throws an execption if the user already killed the browser.
      }
    }
	}
}

FavouritesDirectory.cs

Synopsis
using System;
using System.IO;
using System.Collections;
using System.Windows.Forms;

namespace fave2xml
{
  /// <summary>
  /// Summary description for FavouritesDirectory.
  /// </summary>
  public class FavouritesDirectory
  {
    private static readonly string cProfilesRoot = @"C:\Documents and Settings";
    private ArrayList mList;

    public static string[] GetProfiles()
    {
      string[] dirs = Directory.GetDirectories(cProfilesRoot);
      for(int i = 0; i < dirs.Length; ++i)
        dirs[i] = dirs[i].Substring(dirs[i].LastIndexOf('\\') + 1);
      return dirs;
    }

    public FavouritesDirectory(ArrayList list)
    {
      mList = list;
    }
    public void Add(string profiledir)
    {
      mList.Clear();
      Stack dirs = new Stack();
      dirs.Push(cProfilesRoot + @"\" + profiledir + @"\Favorites");
      while (dirs.Count != 0)
      {
        string dir = (string) dirs.Pop();
        string[] files = Directory.GetFiles(dir);

        for (int i = 0; i < files.Length; ++i)
            AddFavourite(files[i].Replace('\\', '/'));
        
        files = Directory.GetDirectories(dir);
        for (int i = 0; i < files.Length; ++i)
          dirs.Push(files[i]);
      }
    }
    private void AddFavourite(string fname)
    {
      Link url = GetUrl(fname);
      if (url == null) return;
      mList.Add(url);
    }
    private Link GetUrl(string fname)
    {
      string url = null;
      string line;
      TextReader reader = new StreamReader(fname);
      while(reader.Peek() > -1)
      {
        line = reader.ReadLine();
        if (line.StartsWith("URL="))
        {
          url = line.Substring(4);
          if (url.StartsWith("http://"))
            url = url.Substring(7);
          if (url.StartsWith("https://"))
            url = url.Substring(8);
          break;
        }
      }
      reader.Close();
      if (url == null) return null;
      Link lk = new Link(url);
      lk.Desc = fname.Substring(fname.LastIndexOf('/') + 1);
      lk.Desc = lk.Desc.Replace(".url", "");
      return lk;
    }
  }
}

Link.cs

Synopsis
using System;
using System.Collections;
using System.Xml;


namespace fave2xml
{
  public class Link : IComparable
  {
    private string mAddr = null;
    private string mDesc = null;
    private string mCategory = null;
    public Link(string addr)
    {
      mAddr = addr;
    }
    public override int GetHashCode()
    {
      return mAddr.GetHashCode();
    }
    public override bool Equals(object s)
    {
      if (s == null && mAddr == null) return true;
      if (s == null ^ mAddr == null) return false;
      return mAddr.Equals(s.ToString());
    }
    public int CompareTo(object o)
    {
      if (mAddr == null && o == null) return 0;
      if (mAddr == null && o != null) return -1;
      if (mAddr != null && o == null) return 1;
      return mAddr.CompareTo(o.ToString());
    }
    public override string ToString()
    {
      return mAddr;
    }
    public bool IsMissing()
    {
      return mAddr.Equals("<missing>");
    }
    public string Desc
    {
      get 
      {
        if (IsMissing()) return "<missing>";
        if (mDesc == null || mDesc.Equals("")) return "--not set--";
        return mDesc;
      }
      set
      {
        mDesc = value;
      }
    }
    public string Category
    {
      get 
      {
        if (mCategory == null) return "";
        return mCategory;
      }
      set
      {
        mCategory = value;
      }
    }
    public void Save(XmlTextWriter xtw)
    {
      xtw.WriteStartElement("link");
      xtw.WriteElementString("category", mCategory);
      xtw.WriteElementString("addr", mAddr);
      xtw.WriteElementString("desc", mDesc);
      xtw.WriteEndElement();
    }
  }
}

LinkProperties.cs

Synopsis
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace fave2xml
{
  /// <summary>
  /// Summary description for LinkProperties.
  /// </summary>
  public class LinkProperties : System.Windows.Forms.Form
  {
    private Link mLink;
    private System.Windows.Forms.Label mLBAddr;
    private System.Windows.Forms.Label label1;
    private System.Windows.Forms.Label label2;
    private System.Windows.Forms.Label label3;
    private System.Windows.Forms.ComboBox mLBCategory;
    private System.Windows.Forms.TextBox mLBDesc;
    private System.Windows.Forms.Button mOK;
    private System.Windows.Forms.Button mCancel;
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.Container components = null;

    public LinkProperties(ArrayList links, Link link)
    {
      //
      // Required for Windows Form Designer support
      //
      InitializeComponent();

      this.mOK.DialogResult = DialogResult.OK;
      this.mCancel.DialogResult = DialogResult.Cancel;

      foreach (Link lk in links)
      {
        if (lk.Category.Equals("")) continue;
        if (!mLBCategory.Items.Contains(lk.Category))
          mLBCategory.Items.Add(lk.Category);
      }
      mLink = link;
      mLBAddr.Text = link.ToString();
      mLBCategory.Text = link.Category;
      mLBDesc.Text = link.Desc;
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if(components != null)
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    }

		#region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      this.mLBAddr = new System.Windows.Forms.Label();
      this.label1 = new System.Windows.Forms.Label();
      this.label2 = new System.Windows.Forms.Label();
      this.label3 = new System.Windows.Forms.Label();
      this.mLBCategory = new System.Windows.Forms.ComboBox();
      this.mLBDesc = new System.Windows.Forms.TextBox();
      this.mOK = new System.Windows.Forms.Button();
      this.mCancel = new System.Windows.Forms.Button();
      this.SuspendLayout();
      // 
      // mLBAddr
      // 
      this.mLBAddr.Location = new System.Drawing.Point(112, 16);
      this.mLBAddr.Name = "mLBAddr";
      this.mLBAddr.Size = new System.Drawing.Size(384, 20);
      this.mLBAddr.TabIndex = 0;
      this.mLBAddr.Text = "address";
      this.mLBAddr.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // label1
      // 
      this.label1.Location = new System.Drawing.Point(32, 16);
      this.label1.Name = "label1";
      this.label1.Size = new System.Drawing.Size(80, 20);
      this.label1.TabIndex = 1;
      this.label1.Text = "Address:";
      this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
      // 
      // label2
      // 
      this.label2.Location = new System.Drawing.Point(32, 48);
      this.label2.Name = "label2";
      this.label2.Size = new System.Drawing.Size(80, 24);
      this.label2.TabIndex = 2;
      this.label2.Text = "Category:";
      this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
      // 
      // label3
      // 
      this.label3.Location = new System.Drawing.Point(32, 88);
      this.label3.Name = "label3";
      this.label3.Size = new System.Drawing.Size(80, 20);
      this.label3.TabIndex = 3;
      this.label3.Text = "Description:";
      this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
      // 
      // mLBCategory
      // 
      this.mLBCategory.Location = new System.Drawing.Point(104, 48);
      this.mLBCategory.MaxDropDownItems = 20;
      this.mLBCategory.Name = "mLBCategory";
      this.mLBCategory.Size = new System.Drawing.Size(184, 21);
      this.mLBCategory.Sorted = true;
      this.mLBCategory.TabIndex = 4;
      this.mLBCategory.Text = "category";
      // 
      // mLBDesc
      // 
      this.mLBDesc.Location = new System.Drawing.Point(112, 88);
      this.mLBDesc.Name = "mLBDesc";
      this.mLBDesc.Size = new System.Drawing.Size(376, 20);
      this.mLBDesc.TabIndex = 5;
      this.mLBDesc.Text = "desc";
      // 
      // mOK
      // 
      this.mOK.Location = new System.Drawing.Point(104, 128);
      this.mOK.Name = "mOK";
      this.mOK.TabIndex = 6;
      this.mOK.Text = "OK";
      // 
      // mCancel
      // 
      this.mCancel.Location = new System.Drawing.Point(232, 128);
      this.mCancel.Name = "mCancel";
      this.mCancel.Size = new System.Drawing.Size(80, 24);
      this.mCancel.TabIndex = 7;
      this.mCancel.Text = "Cancel";
      // 
      // LinkProperties
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(506, 159);
      this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                  this.mCancel,
                                                                  this.mOK,
                                                                  this.mLBDesc,
                                                                  this.mLBCategory,
                                                                  this.label3,
                                                                  this.label2,
                                                                  this.label1,
                                                                  this.mLBAddr});
      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
      this.Name = "LinkProperties";
      this.Text = "LinkProperties";
      this.Closed += new System.EventHandler(this.LinkProperties_Closed);
      this.ResumeLayout(false);

    }
		#endregion

    private void LinkProperties_Closed(object sender, System.EventArgs e)
    {
      if (this.DialogResult == DialogResult.OK)
      {
        mLink.Category = mLBCategory.Text;
        mLink.Desc = mLBDesc.Text;
      }
    }
  }
}

LinksParser.cs

Synopsis
using System;
using System.Collections;
using System.Xml;
using System.Text.RegularExpressions;

namespace fave2xml
{
  public class LinksParser
  {
    private ArrayList mList;
    private LinksReader reader;
    private string element;
    private string mCategory;
    private string mAddr;
    private string mDesc;

    public LinksParser(ArrayList list)
    {
      mList = list;
    }
    public void parse()
    {
      mList.Clear();
      reader = new LinksReader(XmlLinks.Filename);
      while (reader.Read())
      {
        if (reader.IsIgnoredElement())
          continue;
        else if (reader.IsRootTag())
          continue;
        else if (reader.IsStartTag())
          OnStartTag();
        else if (reader.IsElementValue())
          OnElementValue();
        else if (reader.IsEndTag())
          OnEndTag();
        else
          Console.WriteLine("Unknown Nodetype='{0}' found at line {1}", reader.NodeType.ToString(), reader.LineNumber);
      }
      reader.Close();     
    }
    //-----------------------------------
    //-- private from here on
    //-----------------------------------
    private void OnStartTag()
    {
      if (reader.IsLinkStartTag())
        ResetAll();
      else
        OnOtherStartTag();
        
      if (reader.IsEmptyElement)
        OnElementValue();
    }
    private void ResetAll()
    {
      mCategory = null;
      mAddr = null;
      mDesc = null;
    }
    private void OnElementValue()
    {
      if (element == null) return;
        
      if (element.Equals("addr"))
        mAddr = reader.Value;
      else if (element.Equals("desc"))
        mDesc = reader.Value;
      else if (element.Equals("category"))
        mCategory = ToWikiStyle(reader.Value);
      else
        Console.WriteLine("Unknown tag '{0}' found at line {1}", element, reader.LineNumber);
    }
    private void OnEndTag()
    {
      if (reader.IsLinkStartTag())
        OnLinkEndTag();
    }
    private void OnLinkEndTag()
    {
      Link lk = new Link(mAddr);
      lk.Category = mCategory;
      lk.Desc = mDesc;
      mList.Add(lk);
    }
    private void OnOtherStartTag()
    {
      element = reader.LocalName.ToLower();
    }
    private string ToWikiStyle(string s)
    {
      return s;
//      if (s == null || s.Length == 0) return s;
//      return s[0].ToString().ToUpper() + s.ToLower().Trim().Substring(1);
    }
  }
}

LinksReader.cs

Synopsis
using System;
using System.Xml;

namespace fave2xml
{
  public class LinksReader : XmlTextReader
  {
    public LinksReader(string path) : base(path)
    {
    }
    public bool IsStartTag()
    {
      return this.IsStartElement();
    }
    public bool IsEndTag()
    {
      return this.NodeType == XmlNodeType.EndElement;
    }
    public bool IsElementValue()
    {
      return this.NodeType == XmlNodeType.Text;
    }
    public bool IsIgnoredElement()
    {
      return this.NodeType == XmlNodeType.None ||
        this.NodeType == XmlNodeType.XmlDeclaration ||
        this.NodeType == XmlNodeType.Whitespace ||
        this.NodeType == XmlNodeType.Comment ||
        this.NodeType == XmlNodeType.ProcessingInstruction;
    }
    public bool IsRootTag()
    {
      return this.LocalName.ToLower().Equals("links");
    }
    public bool IsLinkStartTag()
    {
      return this.LocalName.ToLower().Equals("link");
    }
  }
}

LinksWriter.cs

Synopsis
using System;
using System.Collections;
using System.Xml;
using System.Xml.Xsl;

namespace fave2xml
{
  public class LinksWriter
  {
    private ArrayList mList = null;
    public LinksWriter(ArrayList list)
    {
      mList = list;
    }
    public void Save()
    {
      SaveXml();
      SaveHtml();
    }
    private void SaveXml()
    {
      if (mList == null) return;

      XmlTextWriter xtw = new XmlTextWriter(XmlLinks.Filename, null);
      xtw.WriteStartDocument();
      xtw.Formatting = System.Xml.Formatting.Indented;
      xtw.WriteProcessingInstruction("xml-stylesheet", "type='text/xsl' href='"+ XmlLinks.XSLFilename +"'");
      xtw.WriteStartElement("links");
      foreach(Link link in mList)
      {
        link.Save(xtw);
      }
      xtw.WriteEndDocument();
      xtw.Flush();
      xtw.Close();
    }
    private void SaveHtml()
    {
      XslTransform xslt = new XslTransform();
      xslt.Load(XmlLinks.XSLFilename);
      xslt.Transform(XmlLinks.Filename, XmlLinks.Filename.Replace(".xml", ".html"));
    }
  }
}

MainWindow.cs

Synopsis
using System;
using System.IO;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using nsExternalScrollbarListBox;

namespace fave2xml
{
  /// <summary>
  /// Summary description for MainWindow.
  /// </summary>
  public class MainWindow : System.Windows.Forms.Form
  {
    private string mCurrentProfile = null;
    private ExternalScrollbarListBox mFavourites = new ExternalScrollbarListBox();
    private ExternalScrollbarListBox mLinks = new ExternalScrollbarListBox();
    private VScrollBar mScrollBar = new VScrollBar();
    private XmlLinks mXmlLinks = new XmlLinks();
    private System.Windows.Forms.MainMenu mMainMenu;
    private System.Windows.Forms.MenuItem mMenuFile;
    private System.Windows.Forms.MenuItem mMenuExit;
    private System.Windows.Forms.ListBox mChooseProfile;
    private System.Windows.Forms.MenuItem mMenuSave;
    private System.Windows.Forms.MenuItem menuItem1;
    private bool mMouseDown = false;
    private string mItemUnderMouseDown;
    private Explorer mExplorer = null;
    private System.Windows.Forms.MenuItem menuItem2;
    private System.Windows.Forms.MenuItem mViewDesc;

    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.Container components = null;

    public MainWindow()
    {
      //
      // Required for Windows Form Designer support
      //
      InitializeComponent();
      mFavourites.SetScrollBar(mScrollBar, false);
      mLinks.SetScrollBar(mScrollBar, true);
      this.Controls.AddRange(new System.Windows.Forms.Control[] { 
                                                                  mScrollBar
                                                                } );

      mChooseProfile.Items.AddRange(FavouritesDirectory.GetProfiles());
      PopulateLinks();
    }
    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if (components != null) 
        {
          components.Dispose();
        }
        if (mExplorer != null)
          mExplorer.Dispose();

      }
      base.Dispose( disposing );
    }

		#region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      this.mMainMenu = new System.Windows.Forms.MainMenu();
      this.mMenuFile = new System.Windows.Forms.MenuItem();
      this.mMenuSave = new System.Windows.Forms.MenuItem();
      this.menuItem1 = new System.Windows.Forms.MenuItem();
      this.mMenuExit = new System.Windows.Forms.MenuItem();
      this.menuItem2 = new System.Windows.Forms.MenuItem();
      this.mViewDesc = new System.Windows.Forms.MenuItem();
      this.mChooseProfile = new System.Windows.Forms.ListBox();
      this.mFavourites = new ExternalScrollbarListBox();
      this.mLinks = new ExternalScrollbarListBox();
      this.SuspendLayout();
      // 
      // mMainMenu
      // 
      this.mMainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                              this.mMenuFile,
                                                                              this.menuItem2});
      // 
      // mMenuFile
      // 
      this.mMenuFile.Index = 0;
      this.mMenuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                              this.mMenuSave,
                                                                              this.menuItem1,
                                                                              this.mMenuExit});
      this.mMenuFile.Text = "File";
      // 
      // mMenuSave
      // 
      this.mMenuSave.Index = 0;
      this.mMenuSave.Text = "Save";
      this.mMenuSave.Click += new System.EventHandler(this.mMenuSave_Click);
      // 
      // menuItem1
      // 
      this.menuItem1.Index = 1;
      this.menuItem1.Text = "-";
      // 
      // mMenuExit
      // 
      this.mMenuExit.Index = 2;
      this.mMenuExit.Text = "Exit";
      this.mMenuExit.Click += new System.EventHandler(this.mMenuExit_Click);
      // 
      // menuItem2
      // 
      this.menuItem2.Index = 1;
      this.menuItem2.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                              this.mViewDesc});
      this.menuItem2.Text = "View";
      // 
      // mViewDesc
      // 
      this.mViewDesc.Index = 0;
      this.mViewDesc.RadioCheck = true;
      this.mViewDesc.Text = "Descriptions";
      this.mViewDesc.Click += new System.EventHandler(this.mViewDesc_Click);
      // 
      // mChooseProfile
      // 
      this.mChooseProfile.Location = new System.Drawing.Point(8, 16);
      this.mChooseProfile.Name = "mChooseProfile";
      this.mChooseProfile.Size = new System.Drawing.Size(88, 303);
      this.mChooseProfile.TabIndex = 0;
      this.mChooseProfile.SelectedIndexChanged += new System.EventHandler(this.mChooseProfile_SelectedIndexChanged);
      // 
      // mFavourites
      // 
      this.mFavourites.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
      this.mFavourites.Location = new System.Drawing.Point(544, 272);
      this.mFavourites.Name = "mFavourites";
      this.mFavourites.Size = new System.Drawing.Size(48, 56);
      this.mFavourites.TabIndex = 1;
      this.mFavourites.MouseDown += new System.Windows.Forms.MouseEventHandler(this.mFavourites_MouseDown);
      this.mFavourites.MouseMove += new System.Windows.Forms.MouseEventHandler(this.mFavourites_MouseMove);
      this.mFavourites.DrawItem += new ExternalScrollbarListBox.DrawItemEventHandler(this.mFavourites_DrawItem);
      this.mFavourites.SelectedIndexChanged += new System.EventHandler(this.mFavourites_SelectedIndexChanged);
      // 
      // mLinks
      // 
      this.mLinks.AllowDrop = true;
      this.mLinks.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
      this.mLinks.Location = new System.Drawing.Point(608, 272);
      this.mLinks.Name = "mLinks";
      this.mLinks.Size = new System.Drawing.Size(48, 56);
      this.mLinks.TabIndex = 2;
      this.mLinks.DoubleClick += new System.EventHandler(this.mLinks_DoubleClick);
      this.mLinks.DragDrop += new System.Windows.Forms.DragEventHandler(this.mLinks_DragDrop);
      this.mLinks.DragEnter += new System.Windows.Forms.DragEventHandler(this.mLinks_DragEnter);
      this.mLinks.DrawItem += new ExternalScrollbarListBox.DrawItemEventHandler(this.mLinks_DrawItem);
      // 
      // MainWindow
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(688, 345);
      this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                  this.mLinks,
                                                                  this.mFavourites,
                                                                  this.mChooseProfile});
      this.Menu = this.mMainMenu;
      this.Name = "MainWindow";
      this.Text = "MainWindow";
      this.Layout += new System.Windows.Forms.LayoutEventHandler(this.mMainWindow_HandleLayout);
      this.ResumeLayout(false);

    }
		#endregion

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main() 
    {
      Application.Run(new MainWindow());
    }
    private void mMainWindow_HandleLayout(object sender, LayoutEventArgs e)
    {
      mChooseProfile.SetBounds(0,0,0,this.ClientSize.Height,BoundsSpecified.Y | BoundsSpecified.Height);
      int rightedge = mChooseProfile.Bounds.X + mChooseProfile.Bounds.Width;
      int gap = 5;
      int lbwidth = (this.ClientSize.Width - mScrollBar.Width - rightedge - gap) / 2;
      int leftedge = rightedge + gap;
      mFavourites.SetBounds(leftedge,0,lbwidth,this.ClientSize.Height);
      leftedge += lbwidth;
      mLinks.SetBounds(leftedge,0,lbwidth,this.ClientSize.Height);
      leftedge += lbwidth;
      mScrollBar.SetBounds(leftedge, 0, mScrollBar.Width, this.ClientSize.Height);
    }
    private void mMenuExit_Click(object sender, System.EventArgs e)
    {
      mXmlLinks.Save();
      this.Dispose();
    }
    private void mChooseProfile_SelectedIndexChanged(object sender, System.EventArgs e)
    {
      string str = ((string) mChooseProfile.SelectedItem).ToLower();
      if (mCurrentProfile != null && str.Equals(mCurrentProfile)) return;
      mCurrentProfile = str;
      PopulateFavourites();
      AdjustLists();
    }
    private void mLinks_DoubleClick(object sender, EventArgs e)
    {
      Link lk = (Link) mLinks.SelectedItem;
      if (lk.IsMissing()) return;
      LinkProperties dlg = new LinkProperties(mLinks.Items, lk);
      
      if (dlg.ShowDialog(this) == DialogResult.OK)
      {
        mLinks.SelectedItem = lk;
        mXmlLinks.SetChanged();
      }
      dlg.Dispose();
    }
    private void mFavourites_MouseDown(object sender, MouseEventArgs e)
    {
      int index = mFavourites.IndexFromPoint(new Point(e.X,e.Y));
      if(index < 0) return;
      mItemUnderMouseDown = index.ToString();
      mMouseDown = true;
    }
    private void mFavourites_MouseMove(object sender, MouseEventArgs e)
    {
      if (!mMouseDown || mItemUnderMouseDown == null) return;
      mFavourites.DoDragDrop(mItemUnderMouseDown, DragDropEffects.Copy);
      mMouseDown = false;
      mItemUnderMouseDown = null;
    }
    private void mLinks_DragEnter(object sender, DragEventArgs e) 
    {
      if(e.Data.GetDataPresent("Text"))
        e.Effect = DragDropEffects.Copy;
    }
    private void mLinks_DragDrop(object sender, DragEventArgs e)
    {
      int index = Int32.Parse((string) e.Data.GetData("Text"));
      Link lk = (Link) mFavourites.Items[index];
      mLinks.Add(lk);
      mXmlLinks.Add(lk);
      AdjustLists();
    }
    private void AdjustLists()
    {
      CompareLists cmp = new CompareLists();
      cmp.compare(mFavourites.Items, mLinks.Items);
      mFavourites.Invalidate();
      mLinks.Invalidate();
    }
    private void PopulateFavourites()
    {
      mFavourites.Clear();
      FavouritesDirectory dir = new FavouritesDirectory(mFavourites.Items);
      dir.Add(mCurrentProfile);
    }
    private void PopulateLinks()
    {
      mXmlLinks.Load();
      CopyToListBox();
    }
    private void CopyToListBox()
    {
      mLinks.Clear();
      mLinks.AddRange(mXmlLinks.ToArray());
    }
    private void mMenuSave_Click(object sender, System.EventArgs e)
    {
      mXmlLinks.Save();
    }
    private void mFavourites_SelectedIndexChanged(object sender, System.EventArgs e)
    {
      Link lk = (Link) mFavourites.SelectedItem;
      if (lk.ToString().Equals("<missing>")) return;
      if (mExplorer == null) mExplorer = new Explorer();
      mExplorer.ShowPage(lk.ToString());
    }
    private void mLinks_DrawItem(object sender, DrawItemEventArgs e)
    {
      Link lk = (Link) mLinks.Items[e.Index];
      e.DrawBackground();
      SolidBrush brush;
      if (lk.IsMissing())
        brush = new SolidBrush(Color.Gray);
      else if (lk.Category.Equals(""))
        brush = new SolidBrush(Color.Red);
      else if (lk.Desc.Equals("--not set--"))
        brush = new SolidBrush(Color.Goldenrod);
      else
        brush = new SolidBrush(e.ForeColor);
      
      if (mViewDesc.Checked)
        e.Graphics.DrawString(lk.Desc, e.Font, brush, e.Bounds);
      else
        e.Graphics.DrawString(lk.ToString(), e.Font, brush, e.Bounds);
    }
    private void mFavourites_DrawItem(object sender, DrawItemEventArgs e)
    {
      Link lk = (Link) mFavourites.Items[e.Index];
      e.DrawBackground();
      if (mViewDesc.Checked)
        e.Graphics.DrawString(lk.Desc, e.Font, new SolidBrush(e.ForeColor), e.Bounds);
      else
        e.Graphics.DrawString(lk.ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds);
    }
    private void mViewDesc_Click(object sender, System.EventArgs e)
    {
      mViewDesc.Checked = ! mViewDesc.Checked;
      mFavourites.Invalidate();
      mLinks.Invalidate();
    }
  }
}

XmlLinks.cs

Synopsis
using System;
using System.Collections;

namespace fave2xml
{
  public class XmlLinks
  {
    private static readonly string cXmlFile = @"d:\projects\frozen\fave2xml\links.xml";
    private static readonly string cXslFile = @"d:\projects\frozen\fave2xml\links.xsl";
  
    private bool mChanged = false;
    private ArrayList mList = new ArrayList();

    public void Load()
    {
      mChanged = false;
      LinksParser lp = new LinksParser(mList);
      lp.parse();
    }
    public void Save()
    {
      if (!mChanged) return;
      LinksWriter lw = new LinksWriter(mList);
      lw.Save();
    }
    public void Add(Link lk)
    {
      mChanged = true;
      mList.Add(lk);
    }
    public object[] ToArray()
    {
      return mList.ToArray();
    }
    public void SetChanged()
    {
      mChanged = true;
    }
    public static string Filename
    {
      get
      {
        return cXmlFile;
      }
    }
    public static string XSLFilename
    {
      get
      {
        return cXslFile;
      }
    }
  }
}

links.xml

Synopsis
<?xml version="1.0"?>
<?xml-stylesheet type='text/xsl' href='d:\projects\frozen\fave2xml\links.xsl'?>
<links>
  <link>
    <category>OOP</category>
    <addr>ootips.org/ood-principles.html</addr>
    <desc>--not set--</desc>
  </link>
  <link>
    <category>OOP</category>
    <addr>www.brent.worden.org/tips/index.html</addr>
    <desc />
  </link>
  <link>
    <category>OOP</category>
    <addr>www.objectmentor.com/publications/articlesByDate.html</addr>
    <desc />
  </link>
  <link>
    <category>Wiki</category>
    <addr>c2.com/cgi/wiki?QwikWiki</addr>
    <desc>a simple wiki wiki web (cgi)</desc>
  </link>
  <link>
    <category>Wiki</category>
    <addr>c2.com/cgi/wiki?DevWiki</addr>
    <desc>a very simple wiki wiki web, cgi based</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>www.preemptive.com/</addr>
    <desc>Dash-O(optimizer for Java)</desc>
  </link>
  <link>
    <category>Search</category>
    <addr>www.whitepages.com/</addr>
    <desc />
  </link>
  <link>
    <category>Search</category>
    <addr>www.usbluepages.gov/index.cfm</addr>
    <desc />
  </link>
  <link>
    <category>Search</category>
    <addr>www.411.com</addr>
    <desc />
  </link>
  <link>
    <category>Search</category>
    <addr>yp.yahoo.com</addr>
    <desc />
  </link>
  <link>
    <category>Search</category>
    <addr>www.yp.bellsouth.com</addr>
    <desc />
  </link>
  <link>
    <category>Search</category>
    <addr>www.anywho.com/rl.html</addr>
    <desc />
  </link>
  <link>
    <category>Search</category>
    <addr>www.yellowpages.com/</addr>
    <desc />
  </link>
  <link>
    <category>Perl</category>
    <addr>www.sysadminmag.com/tpj/</addr>
    <desc />
  </link>
  <link>
    <category>Java</category>
    <addr>www.meurrens.org/ip-Links/java/regex/</addr>
    <desc />
  </link>
  <link>
    <category>Ant</category>
    <addr>www.savarese.org</addr>
    <desc />
  </link>
  <link>
    <category>Ant</category>
    <addr>www.oroinc.com</addr>
    <desc />
  </link>
  <link>
    <category>Unknown</category>
    <addr>www.castsoftware.com</addr>
    <desc />
  </link>
  <link>
    <category>Development</category>
    <addr>www.usenix.org/events/usenix-win2000/invitedtalks/lucovsky_html/</addr>
    <desc>slide show of of NT development.</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>herrykoh.topcities.com/projects/index.html</addr>
    <desc>Replace() with regexp</desc>
  </link>
  <link>
    <category>Movers</category>
    <addr>www.ozark-auto.com</addr>
    <desc>car movers</desc>
  </link>
  <link>
    <category>Movers</category>
    <addr>www.carmoves.com</addr>
    <desc>car movers: aka aaadvantage auto transport</desc>
  </link>
  <link>
    <category>Movers</category>
    <addr>www.a2b.com</addr>
    <desc>car movers</desc>
  </link>
  <link>
    <category>CSharp</category>
    <addr>msdn.microsoft.com/msdnmag/issues/01/11/NetProf/NetProf.asp</addr>
    <desc>profiling</desc>
  </link>
  <link>
    <category>AI</category>
    <addr>www.erudit.de/erudit/CaseStudies/casest_pdf/alarm_managem.pdf</addr>
    <desc>FCM: Fuzzy cognitive maps</desc>
  </link>
  <link>
    <category>Mind maps</category>
    <addr>www.aportis.com/products/BrainForest/benefits.html</addr>
    <desc>software</desc>
  </link>
  <link>
    <category>Mind maps</category>
    <addr>www.store-mindjet.com/index.cfm?category=2</addr>
    <desc>software</desc>
  </link>
  <link>
    <category>NT</category>
    <addr>www.wdj.com/articles/2000/0005/0005c/0005c.htm?topic=articles</addr>
    <desc>Article on multithreaded memory management with C++ under NT4.0</desc>
  </link>
  <link>
    <category>Freeware</category>
    <addr>www.papaw.com/index.cgi/Computers/Software/File_Management/File_Comparison/Windows/</addr>
    <desc>File comparison</desc>
  </link>
  <link>
    <category>Utilities</category>
    <addr>www.epsilonsquared.com/</addr>
    <desc>installation monitor and replicator</desc>
  </link>
  <link>
    <category>Hardware</category>
    <addr>www.southwest.com.au/~jfuller/webcam/webcam.htm</addr>
    <desc>web cam runs under win2K</desc>
  </link>
  <link>
    <category>VB</category>
    <addr>www.mztools.com/</addr>
    <desc>VB IDE add-in</desc>
  </link>
  <link>
    <category>NT</category>
    <addr>www.firedaemon.com/</addr>
    <desc>Service wrapper</desc>
  </link>
  <link>
    <category>Freeware</category>
    <addr>www.objectmentor.com/resources/downloads/index</addr>
    <desc>FSM generator</desc>
  </link>
  <link>
    <category>Web</category>
    <addr>support.microsoft.com/default.aspx?scid=kb;EN-US;Q179230</addr>
    <desc>attaching to an IE process</desc>
  </link>
  <link>
    <category>Utilities</category>
    <addr>www.p-nand-q.com/tools/regdiff.htm</addr>
    <desc>registry difference</desc>
  </link>
  <link>
    <category>.Net</category>
    <addr>msdn.microsoft.com/msdnmag/issues/01/08/bugslayer/bugslayer0108.asp</addr>
    <desc>C++ tricks</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>www.tools4java.com/jstyle.html</addr>
    <desc>Java automatic code review</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>msdn.microsoft.com/downloads/default.asp?URL=/downloads/sample.asp?url=/msdn-files/027/001/867/msdncompositedoc.xml</addr>
    <desc>Converts Java to C# (haven't tried it!)</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>huizen.dds.nl/~w-p/download.htm</addr>
    <desc>Converts Java to VB</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>jester.sourceforge.net</addr>
    <desc>Detects Zombie and Dead code</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>www.refactorit.com/index.html?id=474</addr>
    <desc>Detects Zombie and Dead code</desc>
  </link>
  <link>
    <category>Misc</category>
    <addr>www.bwgen.com/doload.htm</addr>
    <desc>Brain wave generator</desc>
  </link>
  <link>
    <category>Neural networks</category>
    <addr>www.informatik.uni-freiburg.de/~heinz/FAQ4.html</addr>
    <desc>links to freeware and books.</desc>
  </link>
  <link>
    <category>Neural networks</category>
    <addr>www.ensmp.fr/~moutarde/FAQs/Neuron-faq/FAQ5.html#A_source</addr>
    <desc>links to source code.</desc>
  </link>
  <link>
    <category>Neural networks</category>
    <addr>www.emsl.pnl.gov:2080/proj/neuron/neural/systems/shareware.html</addr>
    <desc>links to freeware and utilities, e source code as well</desc>
  </link>
  <link>
    <category>SOM</category>
    <addr>www.canis.uiuc.edu/~dpape/dli/summary.html</addr>
    <desc>brief description of SOMs</desc>
  </link>
  <link>
    <category>SOM</category>
    <addr>www.aist.go.jp/NIBH/~b0616/Lab/B1</addr>
    <desc>Sample SOM as a Java applet</desc>
  </link>
  <link>
    <category>SOM</category>
    <addr>www.cis.hut.fi/research/javademo/demo2.html</addr>
    <desc>Sample SOM as a Java applet</desc>
  </link>
  <link>
    <category>SOM</category>
    <addr>www.willamette.edu/~gorr/classes/cs449/Unsupervised/SOM.html</addr>
    <desc>description Kohonen SOM</desc>
  </link>
  <link>
    <category>SOM</category>
    <addr>www.geocities.com/CapeCanaveral/1624/SOM.html</addr>
    <desc>description of SOM tech</desc>
  </link>
  <link>
    <category>SOM</category>
    <addr>www.cs.umd.edu/hcil/treemaps</addr>
    <desc>type of SOM called a treemap</desc>
  </link>
  <link>
    <category>SOM</category>
    <addr>www.eastgate.com/squirrel/Farms.html#MarksFarm</addr>
    <desc>type of SOM used for data mining </desc>
  </link>
  <link>
    <category>Graphics</category>
    <addr>graphics.stanford.edu/papers/h3</addr>
    <desc>lays out a graph in 3D</desc>
  </link>
  <link>
    <category>XP</category>
    <addr>c2.com/cgi/wiki?ExtremeProgrammingForOne</addr>
    <desc>XP for a solo programmer</desc>
  </link>
  <link>
    <category>Misc</category>
    <addr>babel.altavista.com/translate.dyn</addr>
    <desc>Translate languages to/from English</desc>
  </link>
  <link>
    <category>Compilers</category>
    <addr>agnes.dida.physik.uni-essen.de/~janjaap/mingw32/download.html</addr>
    <desc>GCC compiler and all remaining utilities</desc>
  </link>
  <link>
    <category>Graphics</category>
    <addr>chortle.ccsu.ctstateu.edu/vectorLessons/tutorialIndex.html</addr>
    <desc>vector arithmetic</desc>
  </link>
  <link>
    <category>Graphics</category>
    <addr>compgeom.cs.uiuc.edu/~jeffe/compgeom/code.html</addr>
    <desc>Computational Geometry</desc>
  </link>
  <link>
    <category>Web</category>
    <addr>crit.org/http://crit.org/index.html</addr>
    <desc>Web page annotations</desc>
  </link>
  <link>
    <category>Build</category>
    <addr>cruisecontrol.sourceforge.net/</addr>
    <desc>Cruise Control automates Ant Builds</desc>
  </link>
  <link>
    <category>Languages</category>
    <addr>cui.unige.ch/db-research/Enseignement/analyseinfo/BNFweb.html</addr>
    <desc>BNF for Java, Sql, Ada, etc...</desc>
  </link>
  <link>
    <category>Languages</category>
    <addr>cui.unige.ch/db-research/Enseignement/analyseinfo/JAVA/AJAVA.html</addr>
    <desc>BNF for Java</desc>
  </link>
  <link>
    <category>Ant</category>
    <addr>cvs.apache.org/viewcvs/~checkout~/jakarta-ant/docs/ant_in_anger.html?rev=1.3.2.1</addr>
    <desc>Ant build system</desc>
  </link>
  <link>
    <category>IDE</category>
    <addr>eclipse-plugins.2y.net/</addr>
    <desc>ecplise plug ins</desc>
  </link>
  <link>
    <category>Web</category>
    <addr>faq.clever.net/htaccess.htm</addr>
    <desc>HTACCESS documentation</desc>
  </link>
  <link>
    <category>NT</category>
    <addr>fox2k.net/2ktweaks/explorer_tweaks.htm</addr>
    <desc>Win2k Tweaks and Tips</desc>
  </link>
  <link>
    <category>Web</category>
    <addr>ftp://ftp.isi.edu/in-notes/iana/assignments/media-types/media-types</addr>
    <desc>media types ("text/xml", etc.)</desc>
  </link>
  <link>
    <category>VB</category>
    <addr>huizen.dds.nl/~w-p/download.htm</addr>
    <desc>software metrics for VB</desc>
  </link>
  <link>
    <category>Development</category>
    <addr>brewforums.qualcomm.com/</addr>
    <desc>emulator and SDK for wireless telephone apps</desc>
  </link>
  <link>
    <category>Web Annotation</category>
    <addr>crit.org/http://www.math.grin.edu/~rebelsky/Research/Summer1999/Papers/survey_paper.html</addr>
    <desc>A Survey of Web Annotation Systems</desc>
  </link>
  <link>
    <category>Neural networks</category>
    <addr>crl.ucsd.edu/innate/index.shtml</addr>
    <desc>Tlearn Home Page</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>file:///c:/jdk1.4.0/docs/api/index.html</addr>
    <desc>Java2 doc</desc>
  </link>
  <link>
    <category>Graphics</category>
    <addr>file:///D:/jdk1.4.0/html/index.html</addr>
    <desc>Java 3D API</desc>
  </link>
  <link>
    <category>Graphics</category>
    <addr>graphics.stanford.edu/papers/h3/</addr>
    <desc>H3 Laying Out Large Directed Graphs in 3D Hyperbolic Space</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>java.sun.com/docs/books/jls/second_edition/html/syntax.doc.html#44467</addr>
    <desc>Java2 Syntax (BNF)</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>java.sun.com/j2se/1.3/docs/guide/jvmpi/</addr>
    <desc>JVMPI</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>java.sun.com/j2se/1.4/docs/guide/jni/index.html</addr>
    <desc>JNI</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>java.sun.com/products/jdk/1.2/docs/guide/jni/jni-12.html#JNI_CreateJavaVM</addr>
    <desc>JNI Enhancements in JDK 1.2</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>java.sun.com/products/jdk/1.2/docs/guide/jvmdi/jvmdi.html</addr>
    <desc>JVMDI</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>java.sun.com/products/jdk/1.2/docs/index.html</addr>
    <desc>Java(TM) 2 SDK Documentation</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>java.sun.com/products/jdk/javadoc/faq.html</addr>
    <desc>Javadoc FAQ</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>java.sun.com/products/jdk/javadoc/index.html</addr>
    <desc>Javadoc Tool Home Page</desc>
  </link>
  <link>
    <category>CSharp</category>
    <addr>ms-help://MS.VSCC/MS.MSDNVS/cpguide/html/cpconhostingcommonlanguageruntime.htm</addr>
    <desc>Hosting the Common Language Runtime</desc>
  </link>
  <link>
    <category>Hardware</category>
    <addr>2cpu.com/Hardware/tyantiger100/tyantiger100.html</addr>
    <desc>2CPU.com - Your one stop source for everything SMP</desc>
  </link>
  <link>
    <category>Misc</category>
    <addr>flashface.flashmaster.ru/</addr>
    <desc>Ultimate Flash Face</desc>
  </link>
  <link>
    <category>Web</category>
    <addr>grc.com/default.htm</addr>
    <desc>Gibson Research Corporation Homepage</desc>
  </link>
  <link>
    <category>DSP</category>
    <addr>heliso.tripod.com/download/download.htm</addr>
    <desc>Download signal analyze software</desc>
  </link>
  <link>
    <category>History</category>
    <addr>http://www.swtpc.com/mholley/swtpc_6800.htm</addr>
    <desc>SWTPC 6800</desc>
  </link>
  <link>
    <category>Mind maps</category>
    <addr>john.redmood.com/brainstorming.html</addr>
    <desc>Overview of Windows Graphical Brainstorming Tools</desc>
  </link>
  <link>
    <category>Ant</category>
    <addr>marc.theaimsgroup.com/?l=ant-user&amp;r=1&amp;w=2</addr>
    <desc>ANT - MARC Mailing list ARChives at AIMS</desc>
  </link>
  <link>
    <category>NANT</category>
    <addr>nant.sourceforge.net/help/tasks/index.html</addr>
    <desc>Nant Task Reference</desc>
  </link>
  <link>
    <category>Graphics</category>
    <addr>ncca.bournemouth.ac.uk/CourseInfo/BAVisAn/Year1/Maths/Vectors1/vectors2.html</addr>
    <desc>Vectors 2</desc>
  </link>
  <link>
    <category>Web</category>
    <addr>people.hofstra.edu/faculty/Stefan_Waner/equation/codeindex.html</addr>
    <desc>Stef's HTML Equation Generator</desc>
  </link>
  <link>
    <category>AI</category>
    <addr>research.microsoft.com/~jplatt/svm.html</addr>
    <desc>Support Vector Machines</desc>
  </link>
  <link>
    <category>Web</category>
    <addr>software.decisionsoft.com/tools.html</addr>
    <desc>xml pretty printer &amp; diff</desc>
  </link>
  <link>
    <category>Web</category>
    <addr>sourceforge.net/projects/expat/</addr>
    <desc>SourceForge Project Info - Expat XML Parser</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>starship.python.net/crew/garyp/jProf.html</addr>
    <desc>jProf (java profiler)</desc>
  </link>
  <link>
    <category>Hardware</category>
    <addr>support.iwill.net/index_e.html</addr>
    <desc>http--support.iwill.net-index_e.html</desc>
  </link>
  <link>
    <category>Hardware</category>
    <addr>support.ati.com/drivers/win2k/win2k_radeon_513013276.html</addr>
    <desc>Windows 2000 Display Driver build 5.13.01.3276</desc>
  </link>
  <link>
    <category>AI</category>
    <addr>svmlight.joachims.org/</addr>
    <desc>SVM-Light Support Vector Machine</desc>
  </link>
  <link>
    <category>Misc</category>
    <addr>windump.polito.it/</addr>
    <desc>WinDump tcpdump for Windows</desc>
  </link>
  <link>
    <category>Graphics</category>
    <addr>www.acm.org/tog/GraphicsGems/</addr>
    <desc>Graphics Gems Repository</desc>
  </link>
  <link>
    <category>Graphics</category>
    <addr>www.airdmhor.gen.nz/blancmange/notes/maths/vectors/ops/ops.html</addr>
    <desc>Operations in Vector Algebra</desc>
  </link>
  <link>
    <category>SOM</category>
    <addr>www.aist.go.jp/NIBH/~b0616/Lab/BSOM1/</addr>
    <desc>Bayesian Self-Organizing Map Simulation using Java Applet</desc>
  </link>
  <link>
    <category>AI</category>
    <addr>www.amazon.com/exec/obidos/ASIN/0195131592/qid=1025545924/sr=8-1/ref=sr_8_1/102-9581403-2918567</addr>
    <desc>Amazon.com buying info Swarm Intelligence From Natural to Artificial Systems (Santa Fe Institute Studies on the Sciences of</desc>
  </link>
  <link>
    <category>Languages</category>
    <addr>www.antlr.org/</addr>
    <desc>ANTLR Website</desc>
  </link>
  <link>
    <category>Misc</category>
    <addr>www.asniffer.com/features.html</addr>
    <desc>ASniffer</desc>
  </link>
  <link>
    <category>DSP</category>
    <addr>www.bearcave.com/misl/misl_tech/wavelets/haar.html</addr>
    <desc>Applying the Haar Wavelet Transform to Time Series Information</desc>
  </link>
  <link>
    <category>Embedded</category>
    <addr>www.bluewind.it/gnuarm.html</addr>
    <desc>BlueWind ARM Toolchain Docs</desc>
  </link>
  <link>
    <category>SOM</category>
    <addr>www.cis.hut.fi/research/javasomdemo/demo2.html</addr>
    <desc>Demo 2 Visualizing a data set</desc>
  </link>
  <link>
    <category>Neural networks</category>
    <addr>www.cnbc.cmu.edu/PDP++/PDP++.html</addr>
    <desc>PDP++ Home Page</desc>
  </link>
  <link>
    <category>DSP</category>
    <addr>www.codeproject.com/csharp/exocortex.asp</addr>
    <desc>The Code Project - Exocortex.DSP - C# Programming</desc>
  </link>
  <link>
    <category>IDE</category>
    <addr>www.codeproject.com/tips/vc_ide_keys.asp</addr>
    <desc>The Code Project - Some Time-Saving Commands and Key Remappings for the VC IDE - Programming Tips</desc>
  </link>
  <link>
    <category>DSP</category>
    <addr>www.cs.cmu.edu/~lenzo/phonebox/</addr>
    <desc>phonebox speech synthesis</desc>
  </link>
  <link>
    <category>AI</category>
    <addr>www.cs.mcgill.ca/~jthors/251proj.html</addr>
    <desc>Barnes-Hut in C java applet</desc>
  </link>
  <link>
    <category>Graphics</category>
    <addr>www.cs.panam.edu/info_vis/spr_tr.html</addr>
    <desc>A Spring Modeling Algorithm to Position Nodes of an Undirected Graph in Three Dimensions</desc>
  </link>
  <link>
    <category>Neural networks</category>
    <addr>www.cs.stir.ac.uk/~lss/NNIntro/InvSlides.html</addr>
    <desc>An Introduction to Neural Networks</desc>
  </link>
  <link>
    <category>SOM</category>
    <addr>www.cs.umd.edu/hcil/treemaps/</addr>
    <desc>Treemaps for space-constrained visualization of hierarchies</desc>
  </link>
  <link>
    <category>DSP</category>
    <addr>www.ee.ed.ac.uk/~mjj/dspDemos/EE4/tutDFT.html</addr>
    <desc>Discrete Fourier Transform</desc>
  </link>
  <link>
    <category>DSP</category>
    <addr>www.eg3.com/WebID/dsp/</addr>
    <desc>dsp and communications</desc>
  </link>
  <link>
    <category>Graphics</category>
    <addr>www.eng.auburn.edu/department/cse/research/graph_drawing/EDU/auburn/VGJ/doc/EDU.auburn.VGJ.algorithm.shawn.Spring.html</addr>
    <desc>Class EDU.auburn.VGJ.algorithm.shawn.Spring</desc>
  </link>
  <link>
    <category>SOM</category>
    <addr>www.geocities.com/CapeCanaveral/1624/som.html</addr>
    <desc>Neural Networks at your Fingertips - The Self-Organizing Map</desc>
  </link>
  <link>
    <category>Misc</category>
    <addr>www.geocities.com/SiliconValley/Heights/5445/survey.html</addr>
    <desc>Swift - An Equation Editor in Java</desc>
  </link>
  <link>
    <category>CSharp</category>
    <addr>www.go-mono.com/faq.html</addr>
    <desc>FAQ - Mono</desc>
  </link>
  <link>
    <category>Neural networks</category>
    <addr>www.mathworks.com/products/neuralnet/</addr>
    <desc>The MathWorks - Neural Network</desc>
  </link>
  <link>
    <category>Java</category>
    <addr>www.mcmanis.com/~cmcmanis/java/dump/</addr>
    <desc>Java Dumping Class Files</desc>
  </link>
  <link>
    <category>Particle Swarm</category>
    <addr>www.particleswarm.net/</addr>
    <desc>Particle Swarm Central</desc>
  </link>
  <link>
    <category>Perl</category>
    <addr>www.pconline.com/~erc/perlmod.htm</addr>
    <desc>Perl Modules</desc>
  </link>
  <link>
    <category>Mind maps</category>
    <addr>www.peterussell.com/Mindmaps/MMSoft.html</addr>
    <desc>Mind Map Software</desc>
  </link>
  <link>
    <category>Misc</category>
    <addr>www.p-nand-q.com/pynospam.htm</addr>
    <desc>http--www.p-nand-q.com-pynospam.htm</desc>
  </link>
  <link>
    <category>AI</category>
    <addr>www.sgi.com/tech/mlc/</addr>
    <desc>SGI - MLC++ Home Page</desc>
  </link>
  <link>
    <category>Development</category>
    <addr>www.studio501.com/CloneFinderReadMe.htm</addr>
    <desc>CloneFinder version 2</desc>
  </link>
  <link>
    <category>Misc</category>
    <addr>www.topozone.com/map.asp?lat=33.81444&amp;lon=-116.67833</addr>
    <desc>TopoZone - The Web's Topographic Map</desc>
  </link>
  <link>
    <category>Development</category>
    <addr>www.ultraedit.com/</addr>
    <desc>Text Editor - HEX Editor - HTML Editor - Programmers Editor - UltraEdit</desc>
  </link>
  <link>
    <category>Web</category>
    <addr>www.w3.org/MarkUp/</addr>
    <desc>HTML Home Page</desc>
  </link>
</links>






Contact me about content on this page using john_web-at-arrizza-dot-com
For Web Master or site problems contact: webadmin-at-arrizza-dot-com
Copyright John Arrizza (c) 2001-2010