/// <summary>
        /// Cleans up all the field members that implement the IDisposable interface.
        /// (This should only be called from the forms dispose method)
        /// </summary>
        /// <param name="bDispose">True to dispose of managed resources.</param>
        /// <returns></returns>
        private void CleanUpResources(bool bDispose)
        {
            if (bDispose)
            {
                // Clean up and release the print document object.
                if (m_oPrintDocument != null)
                {
                    m_oPrintDocument.Dispose();
                    m_oPrintDocument = null;
                }

                // Clean up the ImageEditManagement object.
                if ((m_oUndoRedo != null) && (!m_oUndoRedo.IsDisposed))
                {
                    m_oUndoRedo.Dispose();
                    m_oUndoRedo = null;
                }

                // Clean up the image browser object.
                if ((m_oImageBrowser != null) && (!m_oImageBrowser.IsDisposed))
                {
                    m_oImageBrowser.Dispose();
                    m_oImageBrowser = null;
                }

                // Clean up the explorer docking window object.
                if ((m_oExplorerDockWindow != null) && (!m_oExplorerDockWindow.IsDisposed))
                {
                    m_oExplorerDockWindow.Dispose();
                    m_oExplorerDockWindow = null;
                }

                // Clean up the image list docking window object.
                if ((m_oImageListDockWindow != null) && (!m_oImageListDockWindow.IsDisposed))
                {
                    m_oImageListDockWindow.Dispose();
                    m_oImageListDockWindow = null;
                }

                // Clean up the task docking window object.
                if ((m_oTaskDockWindow != null) && (!m_oTaskDockWindow.IsDisposed))
                {
                    m_oTaskDockWindow.Dispose();
                    m_oTaskDockWindow = null;
                }

                // Clean up the screen shot form.
                if ((m_oScreenShotForm != null) && (!m_oScreenShotForm.IsDisposed))
                {
                    m_oScreenShotForm.Dispose();
                    m_oScreenShotForm = null;
                }

                // Clean up the new window form.
                if ((m_oNewWindowForm != null) && (!m_oNewWindowForm.IsDisposed))
                {
                    m_oNewWindowForm.Dispose();
                    m_oNewWindowForm = null;
                }

                // Clean up the new window list.
                if ((m_oNewWindows != null) && (m_oNewWindows.Count > 0))
                {
                    m_oNewWindows.Clear();
                    m_oNewWindows = null;
                }

                // Clean up the slide show.
                if ((m_oSlideShowForm != null) && (!m_oSlideShowForm.IsDisposed))
                {
                    m_oSlideShowForm.Close();
                    m_oSlideShowForm = null;
                }

                // Clean up the red eye panel.
                if ((m_oRedEyePanel != null) && (!m_oRedEyePanel.IsDisposed))
                {
                    m_oRedEyePanel.Dispose();
                    m_oRedEyePanel = null;
                }

                // Clean up the resize panel.
                if ((m_oResizePanel != null) && (!m_oResizePanel.IsDisposed))
                {
                    m_oResizePanel.Dispose();
                    m_oResizePanel = null;
                }

                // Clean up the properties panel.
                if ((m_oPropertiesPanel != null) && (!m_oPropertiesPanel.IsDisposed))
                {
                    m_oPropertiesPanel.Dispose();
                    m_oPropertiesPanel = null;
                }
            }
        }
        /// <summary>
        /// Configures the application when the form has been initialized.
        /// </summary>
        /// <returns></returns>
        private void ConfigureApplication()
        {
            // Form designer code initialization.
            InitializeComponent();

            // Make sure certain field members get initialized.
            m_nImageBoxKeyPressed = Keys.None;
            m_nCurrentTool = Tool.None;
            m_nSelectedWindow = Window.None;
            m_nSelectedTaskWindow = IViewSettings.Default.SelectedTaskWindow;
            m_nImageScale = IViewSettings.Default.AutoScale;
            m_nImageListViewType = IViewSettings.Default.ImageListViewType;
            m_oUndoRedo = new ImageEditManagement(IViewSettings.Default.MaxUndos);
            m_oFavourites = new FavouritesCollection(IViewSettings.Default.Favourites);
            m_oNewWindows = new List<NewWindow>();

            // Initialize a new instance of the ImageBrowser class.
            m_oImageBrowser = new ImageBrowser();
            m_oImageBrowser.MaxFiles = IViewSettings.Default.MaxFiles;
            m_oImageBrowser.MaxFileLength = IViewSettings.Default.MaxFileLength;
            m_oImageBrowser.HighQualityThumbnails = IViewSettings.Default.HighQualityThumbnails;
            m_oImageBrowser.Effect = IViewSettings.Default.ThumbnailEffect;
            m_oImageBrowser.FileRenamed +=
                new EventHandler<ImageBrowserRenameEventArgs>(ImageBrowser_FileRenamed);
            m_oImageBrowser.ItemRemoved +=
                new EventHandler<ImageBrowserItemEventArgs>(ImageBrowser_ItemRemoved);

            // Initialize a new docking window for the explorer.
            Rectangle WndRect = IViewSettings.Default.ExplorerWindowRect;
            m_oExplorerDockWindow = new DockingWindow(WndRect, ExplorerSplitterPanel,
                new Control[] { etvw_Directorys, ts_etvw_Tools });
            m_oExplorerDockWindow.Name = "ExplorerDockingWindow";
            m_oExplorerDockWindow.Text = "Explorer";
            m_oExplorerDockWindow.DockChanged +=
                new EventHandler<DockChangedEventArgs>(DockingWindow_DockChanged);

            // Initialize a new docking window for the image list.
            WndRect = IViewSettings.Default.ImageListWindowRect;
            m_oImageListDockWindow = new DockingWindow(WndRect, ImageListSplitterPanel,
                new Control[] { elvw_Images, ts_elvw_Tools });
            m_oImageListDockWindow.Name = "ImageListDockingWindow";
            m_oImageListDockWindow.Text = "Image List";
            m_oImageListDockWindow.DockChanged +=
                new EventHandler<DockChangedEventArgs>(DockingWindow_DockChanged);

            // Initialize a new docking window for the task panel.
            WndRect = IViewSettings.Default.TasksWindowRect;
            m_oTaskDockWindow = new DockingWindow(WndRect, TaskSplitterPanel,
                new Control[] { pan_TasksContainer, ts_task_Tools });
            m_oTaskDockWindow.Name = "TaskDockingWindow";
            m_oTaskDockWindow.Text = "Tasks";
            m_oTaskDockWindow.DockChanged +=
                new EventHandler<DockChangedEventArgs>(DockingWindow_DockChanged);

            // Initialize the PropertiesPanel.
            m_oPropertiesPanel = new PropertiesPanel();
            m_oPropertiesPanel.Dock = DockStyle.Fill;
            m_oPropertiesPanel.HistogramAutoRefresh = IViewSettings.Default.AutoRefreshHistogram;
            m_oPropertiesPanel.HistogramVisible = IViewSettings.Default.HistogramVisible;
            m_oPropertiesPanel.PropertiesToolbarVisible = IViewSettings.Default.PropertiesToolbarVisible;
            m_oPropertiesPanel.PropertiesHelpVisible = IViewSettings.Default.PropertiesHelpVisible;
            int nDist = m_oPropertiesPanel.Height - IViewSettings.Default.HistogramHeight;
            m_oPropertiesPanel.SplitterDistance = (nDist > 0 && nDist < m_oPropertiesPanel.Height) ? nDist : 100;
            m_oPropertiesPanel.HistogramUpdateRequested += delegate(object sender, EventArgs e)
            {
                if (imgbx_MainImage.IsImageLoaded)
                    m_oPropertiesPanel.ProcessImage((Bitmap)imgbx_MainImage.ImageBoxImage);
            };

            // Initialize the ResizePanel.
            m_oResizePanel = new ResizePanel();
            m_oResizePanel.Dock = DockStyle.Fill;
            m_oResizePanel.Enabled = false;
            m_oResizePanel.ApplyButtonClicked += delegate(object sender, EventArgs e)
            {
                SubResizeImage();
            };

            // Initialize the ShearPanel.
            m_oShearPanel = new ShearPanel();
            m_oShearPanel.Dock = DockStyle.Fill;
            m_oShearPanel.Enabled = false;
            m_oShearPanel.ApplyButtonClicked += delegate(object sender, EventArgs e)
            {
                SubShearImage();
            };

            // Initialize the RedEyePanel.
            m_oRedEyePanel = new RedEyePanel();
            m_oRedEyePanel.Dock = DockStyle.Fill;
            m_oRedEyePanel.Enabled = false;
            m_oRedEyePanel.PupilSizeMinimum = 1;
            m_oRedEyePanel.PupilSizeMaximium = 64;
            m_oRedEyePanel.PupilSize = 32;
            m_oRedEyePanel.ActivateClick += delegate(object sender, EventArgs e)
            {
                m_nCurrentTool = Tool.RedEyeCorrection;
            };

            ProfessionalColorTable oColourTable = new ProfessionalColorTable();

            // Assign a custom colour table if specified.
            if (IViewSettings.Default.ColourTable == ColourTable.ArcticSilver)
                oColourTable = new ArcticSilverColourTable();
            else if (IViewSettings.Default.ColourTable == ColourTable.SkyBlue)
                oColourTable = new SkyBlueColourTable();

            // Create and assign a toolstrip renderer with the specified colour table to the toolstrip manager.
            ToolStripProfessionalRenderer oRenderer = new ToolStripProfessionalRenderer(oColourTable);
            ToolStripManager.Renderer = oRenderer;

            // Create another toolstrip renderer but remove the rounded edges.
            oRenderer = new ToolStripProfessionalRenderer(oColourTable);
            oRenderer.RoundedEdges = false;

            // Apply the toolstrip renderer without rounded edges to the smaller toolstrips.
            ts_elvw_Tools.Renderer = oRenderer;
            ts_etvw_Tools.Renderer = oRenderer;
            ts_task_Tools.Renderer = oRenderer;
            ts_imgbx_Tools.Renderer = oRenderer;

            // Set the toolstrip overflow button properties.
            ts_Toolbar.OverflowButton.AutoToolTip = true;
            ts_Toolbar.OverflowButton.DropDownDirection = ToolStripDropDownDirection.BelowRight;
            ts_Toolbar.OverflowButton.ToolTipText = "Toolbar Options";

            // Put the add or remove button on the overflow. VS will cash if implemented at design time.
            tsddb_tb_AddRemove.Overflow = ToolStripItemOverflow.Always;

            // Set the main toolbar and status bar visibility.
            ts_Toolbar.Visible = IViewSettings.Default.ToolbarVisible;
            ss_Main.Visible = IViewSettings.Default.StatusStripVisible;

            // Send the main toolstrip to the specified parent container.
            if (IViewSettings.Default.ToolBarPanel == ToolBarPanel.Top)
                ts_Toolbar.Parent = tsc_Main.TopToolStripPanel;
            else if (IViewSettings.Default.ToolBarPanel == ToolBarPanel.Bottom)
                ts_Toolbar.Parent = tsc_Main.BottomToolStripPanel;
            else if (IViewSettings.Default.ToolBarPanel == ToolBarPanel.Left)
                ts_Toolbar.Parent = tsc_Main.LeftToolStripPanel;
            else if (IViewSettings.Default.ToolBarPanel == ToolBarPanel.Right)
                ts_Toolbar.Parent = tsc_Main.RightToolStripPanel;

            // Configure the forms DesktopBounds property.
            this.DesktopBounds = IViewSettings.Default.MainWindowRect;

            // Configure the state of the main window.
            if (IViewSettings.Default.MainWindowState == MainWindowState.FullScreen)
                SubToggleFullScreenMode();
            else if (IViewSettings.Default.MainWindowState == MainWindowState.Maximized)
                this.WindowState = FormWindowState.Maximized;

            // Set the explorer splitter bar distance.
            nDist = IViewSettings.Default.ExplorerSplitterDist;
            sc_Explorer.SplitterDistance = (nDist > 0 && nDist < (sc_Explorer.Width - sc_Explorer.Panel2MinSize))
                ? nDist : sc_Explorer.Width / 2;

            // Set the image list splitter bar distance.
            nDist = sc_ImageList.Height - IViewSettings.Default.ImageListSplitterDist;
            sc_ImageList.SplitterDistance = (nDist > 0 && nDist < (sc_ImageList.Height - sc_ImageList.Panel2MinSize))
                ? nDist : sc_ImageList.Height / 2;

            // Set the tasks splitter bar distance.
            nDist = sc_Tasks.Width - IViewSettings.Default.TasksSplitterDist;
            sc_Tasks.SplitterDistance = (nDist > 0 && nDist < (sc_Tasks.Width - sc_Tasks.Panel2MinSize))
                ? nDist : sc_Tasks.Width / 2;

            // Configure the dock or collapse state of the explorer window.
            if (!IViewSettings.Default.ExplorerDocked)
                m_oExplorerDockWindow.UnDock(this);
            else
                ExplorerSplitterPanelCollapsed = IViewSettings.Default.ExplorerCollapsed;

            // Configure the dock or collapse state of the image list window.
            if (!IViewSettings.Default.ImageListDocked)
                m_oImageListDockWindow.UnDock(this);
            else
                ImageListSplitterPanelCollapsed = IViewSettings.Default.ImageListCollapsed;

            // Configure the dock or collapse state of the tasks window.
            if (!IViewSettings.Default.TasksDocked)
                m_oTaskDockWindow.UnDock(this);
            else
                TaskSplitterPanelCollapsed = IViewSettings.Default.TasksCollapsed;

            // Configure the explorerlistview, view.
            switch (IViewSettings.Default.ImageListViewType)
            {
                case ImageListViewType.LargeIcons:
                case ImageListViewType.MediumIcons:
                case ImageListViewType.SmallIcons:
                    elvw_Images.View = View.LargeIcon;
                    break;
                case ImageListViewType.List:
                    elvw_Images.View = View.List;
                    break;
                case ImageListViewType.Details:
                    elvw_Images.View = View.Details;
                    break;
            }

            // Set the width of the explorer listview column headers.
            ch_FileName.Width = IViewSettings.Default.NameColumnWidth;
            ch_Date.Width = IViewSettings.Default.DateColumnWidth;
            ch_FileType.Width = IViewSettings.Default.TypeColumnWidth;
            ch_FileSize.Width = IViewSettings.Default.SizeColumnWidth;

            // Update the imagebox back colour.
            imgbx_MainImage.BackColor = IViewSettings.Default.MainDisplayColour;

            // Add the explorer treeview parent nodes.
            etvw_Directorys.AddBaseNodes();

            // Add the favourite nodes to the treeview.
            SubLoadFavourites();

            // Show the last selected task window.
            SubShowTaskWindow(m_nSelectedTaskWindow, false);

            // Check for updates if specified.
            if (IViewSettings.Default.AutomaticUpdates)
                SubCheckForUpdates(false, false);
        }