private Hashtable tabs;                 // [TabLabel.Button] = UserInfo

        // ============================================
        // PUBLIC Constructors
        // ============================================
        public NotebookViewer()
        {
            // Initialize Notebook
            this.ShowTabs   = true;
            this.Scrollable = true;

            // Initialize Notebook Members
            this.pages       = Hashtable.Synchronized(new Hashtable());
            this.tabs        = Hashtable.Synchronized(new Hashtable());
            this.tabsCustom  = Hashtable.Synchronized(new Hashtable());
            this.pagesCustom = ArrayList.Synchronized(new ArrayList());

            // Initialize Network Viewer
            // =========================================================
            networkViewer = new NetworkViewer();
            networkViewer.ItemActivated += new PeerSelectedHandler(OnNetItemActivated);

            // Initialize Network Viewer Tab Label
            TabLabel tabLabel = new TabLabel("<b>Network</b>");

            tabLabel.Button.Sensitive = false;

            // Add Network Viewer (Default Fixed Page)
            AppendPage(this.networkViewer, tabLabel);
        }
        /// Append Custom Widget
        public int AppendCustom(Gtk.Widget page, string label, Gtk.Image icon)
        {
            int npage;

            if (this.pagesCustom.IndexOf(page) < 0)
            {
                // Initialize Tab Label
                TabLabel tabLabel = new TabLabel(label, icon);
                tabLabel.Button.Clicked += new EventHandler(OnCustomCloseTab);

                // Add TabLabel -> Page
                this.tabsCustom.Add(tabLabel.Button, page);

                // Add Page
                this.pagesCustom.Add(page);

                // Append Page To Notebook
                npage = AppendPage(page, tabLabel);
            }
            else
            {
                npage = PageNum(page);
                // Set New Page as Current Page
                CurrentPage = npage;
            }

            // Show All (Refresh Notebook Viewer)
            this.ShowAll();

            return(npage);
        }
        /// Remove Custom Widget
        public void RemoveCustom(Gtk.Widget page)
        {
            if (page != null)
            {
                // Remove TabLabel -> Page
                TabLabel tabLabel = (TabLabel)GetTabLabel(page);
                tabLabel.Button.Clicked -= new EventHandler(OnCustomCloseTab);
                this.tabsCustom.Remove(tabLabel.Button);

                // Remove UserInfo -> FolderViewer
                this.pagesCustom.Remove(page);

                // Remove Folder Viewer
                int npage = PageNum(page);
                RemovePage(npage);

                // Remove Tab Event
                if (TabRemoved != null)
                {
                    TabRemoved(this, page);
                }

                // Show All (Refresh Notebook Viewer)
                this.ShowAll();
            }
        }
        /// Append User Folder Viewer
        public int Append(UserInfo userInfo, string label)
        {
            FolderViewer folderViewer = LookupPage(userInfo);
            int          npage;

            // Page Already Exists
            if (folderViewer != null)
            {
                npage = PageNum(folderViewer);
                // Set New Page as Current Page
                CurrentPage = npage;
            }
            else
            {
                // Initialize Tab Label
                TabLabel tabLabel = new TabLabel(label);
                tabLabel.Button.Clicked += new EventHandler(OnCloseTab);

                // Initialize Folder Viewer
                folderViewer                 = new FolderViewer(userInfo);
                folderViewer.SaveFile       += new StringEventHandler(OnFileSave);
                folderViewer.FileSend       += new FileSendEventHandler(OnFileSend);
                folderViewer.DirChanged     += new BoolEventHandler(OnBoolEventHandler);
                folderViewer.FolderRefresh  += new StringEventHandler(OnFolderRefresh);
                folderViewer.DirectoryAdded += new ObjectEventHandler(OnStoreDirAdded);
                folderViewer.FileAdded      += new ObjectEventHandler(OnStoreFileAdded);

                // Refresh Folder Viewer
                folderViewer.Refresh();

                // Add TabLabel -> UserInfo
                this.tabs.Add(tabLabel.Button, userInfo);

                // Add UserInfo -> FolderViewer
                this.pages.Add(userInfo, folderViewer);

                // Append Page To Notebook
                npage = AppendPage(folderViewer, tabLabel);
            }

            // Show All (Refresh Notebook Viewer)
            this.ShowAll();

            return(npage);
        }
        /// Remove User Folder Viewer
        public void Remove(UserInfo userInfo)
        {
            FolderViewer folderViewer = LookupPage(userInfo);

            if (folderViewer != null)
            {
                // Remove Folder Viewer Event
                folderViewer.SaveFile       -= new StringEventHandler(OnFileSave);
                folderViewer.FileSend       -= new FileSendEventHandler(OnFileSend);
                folderViewer.DirChanged     -= new BoolEventHandler(OnBoolEventHandler);
                folderViewer.FolderRefresh  -= new StringEventHandler(OnFolderRefresh);
                folderViewer.DirectoryAdded -= new ObjectEventHandler(OnStoreDirAdded);
                folderViewer.FileAdded      -= new ObjectEventHandler(OnStoreFileAdded);

                // Remove TabLabel -> UserInfo
                TabLabel tabLabel = (TabLabel)GetTabLabel(folderViewer);
                tabLabel.Button.Clicked -= new EventHandler(OnCloseTab);
                this.tabs.Remove(tabLabel.Button);

                // Remove UserInfo -> FolderViewer
                this.pages.Remove(userInfo);

                // Remove Folder Viewer
                int npage = PageNum(folderViewer);
                RemovePage(npage);

                // Remove Tab Event
                if (TabRemoved != null)
                {
                    TabRemoved(this, folderViewer);
                }

                // Show All (Refresh Notebook Viewer)
                this.ShowAll();
            }
        }