Event-Based Architectures
by Ted Faison

Listing One

public static void Build()
{
  formMain = new FormMain();
  formMenuToolBar = new FormMenuToolBar();
  statusBar = new StatusBar();
  directoryTree = new DirectoryTree();
  directoryContent = new DirectoryContent();

  // populate the left and right panes of FormMain
  formMain.LeftPane = directoryTree;
  formMain.RightPane = directoryContent;

  // move the menu, toolbar and statusbar into FormMain
  formMain.Menu = formMenuToolBar.mainMenu;
  formMain.Toolbar = formMenuToolBar.panelToolBar;
  formMain.Statusbar = statusBar;
}


Listing Two

public static void Bind()
{
  formMenuToolBar.OnAddressChanged += 
    new FormMenuToolBar.AddressChangedHandler(directoryTree.SelectFolder);

  directoryTree.OnFolderChanged += 
    new DirectoryTree.FolderChangedHandler(directoryContent.Populate);
  directoryTree.OnFolderChanged += 
    new DirectoryTree.FolderChangedHandler(formMenuToolBar.ShowAddress);

  directoryContent.OnFolderDoubleClicked += 
    new DirectoryContent.FolderDoubleClickedHandler
                        (formMenuToolBar.ShowAddress);
    }

Listing Three

public class EntryPoint
{
  static void Main()
  {
    BuilderBinder.Build();
    BuilderBinder.Bind();

    BuilderBinder.directoryTree.Populate(@"c:\");
    Application.Run(BuilderBinder.formMain);
  }
}


Listing Four
 
public class FormMenuToolBar : System.Windows.Forms.Form
{
  //...

  public void ShowAddress(string theAddress)
  {
    textBoxAddress.Text = theAddress;
    FireAddressChanged(theAddress);
  }

  private void menuItemViewIcons_Click(object sender, System.EventArgs e)
  {
    menuItemViewIcons.Checked = true;
    menuItemViewDetails.Checked = false;
    FireViewIcons();
  }

  private void menuItemViewDetails_Click(object sender, System.EventArgs e)
  {
    menuItemViewIcons.Checked = false;
    menuItemViewDetails.Checked = true;
    FireViewDetails();
  }

  private void buttonUp_Click(object sender, EventArgs e)
  {
    string currentDirectory = textBoxAddress.Text;
    DirectoryInfo parentDirectory = Directory.GetParent(currentDirectory);
    if (parentDirectory == null) return;
    ShowAddress(parentDirectory.FullName);
  }

  private void buttonGo_Click(object sender, System.EventArgs e)
  {
    FireAddressChanged(textBoxAddress.Text);
  }

  public delegate void UniversalHandler();

  public event UniversalHandler OnViewIcons;
  void FireViewIcons()
  {
    if (OnViewIcons != null)
      OnViewIcons();
  }

  public event UniversalHandler OnViewDetails;
  void FireViewDetails()
  {
    if (OnViewDetails != null)
      OnViewDetails();
  }

  public delegate void AddressChangedHandler(string theNewAddress);
  public event AddressChangedHandler OnAddressChanged;
  void FireAddressChanged(string theNewAddress)
  {
    if (OnAddressChanged != null)
      OnAddressChanged(theNewAddress);
  }
}

Listing Five

public class DirectoryTree : System.Windows.Forms.UserControl
{
  //...

  public void Populate(string theFolder)
  {
    // populate the tree...

    SelectFolder(theFolder);
  }
  
  public void SelectFolder(string thePath)
  {
    //...
    //find the node for thePath...
    treeViewFolders.SelectedNode = node;
    string oldFolderSelected = folderSelected;
    folderSelected = node.Tag as string;
    if (folderSelected == oldFolderSelected) return;
    FireFolderChanged(folderSelected);
    UpdateStatusBar();
  }

  //...

  void UpdateStatusBar()
  {
    FireMessage(folderSelected);
  }

  private void treeViewFolders_AfterSelect(object sender, 
                                           TreeViewEventArgs e)
   {
     string folderSelected = e.Node.Tag as string;
     SelectFolder(folderSelected);
   }

   public delegate void FolderChangedHandler(string theFolderPath);
   public event FolderChangedHandler OnFolderChanged;
   void FireFolderChanged(string theFolderPath)
   {
     if (OnFolderChanged != null)
       OnFolderChanged(theFolderPath);
   }

   public delegate void MessageHandler(string theMessage);
   public event MessageHandler OnMessage;
   void FireMessage(string theMessage)
   {
     if (OnMessage != null)
       OnMessage(theMessage);
   }
 }



Listing Six

public class DirectoryContent : System.Windows.Forms.UserControl
{
  //...

  // show a list of all the folders and files in a folder
  public void Populate(string theFolder) 
  {
    //...
  }

  // organize file list showing only names
  public void ShowIcons()
  {
    listViewFiles.View = View.SmallIcon;
  }

  // organize file list showing details
  public void ShowDetails()
  {
    listViewFiles.View = View.Details;
  }

  // show info about a file to the user
  void IndicateFileInfo()
  {
    string filePath = listViewFiles.FocusedItem.Tag as string;
    if (!File.Exists(filePath)) return;
    FileInfo fileInfo = new FileInfo(filePath);
    long length = fileInfo.Length / 1024;
    if (length < 1)
      length = 1;
    string size = string.Format("File size: {0:#,##0} KB   {1}", 
                                length, filePath);
    FireMessage(size);  // show a new status bar message
  }

  private void listViewFiles_Enter(object sender, System.EventArgs e)
  {
    IndicateFileInfo();
  }

  private void listViewFiles_SelectedIndexChanged(object sender,
                                                  System.EventArgs e)
  {
    IndicateFileInfo();
  }

  private void listViewFiles_DoubleClick(object sender, System.EventArgs e)
  {
    if (listViewFiles.SelectedItems.Count == 0) return;
    string  filePath = listViewFiles.SelectedItems[0].Tag as string;
    FireFolderDoubleClicked(filePath);
  }

  public delegate void FolderDoubleClickedHandler(string thePath);
  public event FolderDoubleClickedHandler OnFolderDoubleClicked;
  void FireFolderDoubleClicked(string thePath)
  {
    if (OnFolderDoubleClicked != null)
      OnFolderDoubleClicked(thePath);
  }

  public delegate void MessageHandler(string theMessage);
  public event MessageHandler OnMessage;
  void FireMessage(string theMessage)
  {
    if (OnMessage != null)
      OnMessage(theMessage);
  }
}

Listing 6 - The main code of DirectoryContent
3


