using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Collections.ObjectModel; using Microsoft.Windows.Controls; using System.Data; using System.ComponentModel; // Foo Namespace using Foo.WorkspaceMgr; using Foo.DataAccessLayer; using Foo.DataAccessLayer.DataTypes; using Foo.GUILib; namespace Foo.ClientServices.GUIWPForms { /// /// Interaction logic for WorkspaceSelector_StandardPage.xaml /// public partial class WorkspaceSelector_StandardPage : Page { // passed to us by parent private WorkspaceSelector m_WorkspaceSelectorObj = null; private bool m_bPerformanceCache = false; // WorkspaceMgr - Imp private WorkspaceMgr.WorkspaceMgr m_WorkspaceMgr = null; // private DT holds all information needed for the DataGrid public DataTable WorkspacesDT { get; private set; } /// /// Constructor /// /// public WorkspaceSelector_StandardPage(bool bPerformanceCache) { // We preload & require the WorkspaceMgr in this class m_WorkspaceMgr = new WorkspaceMgr.WorkspaceMgr(); // Preload Database call - to make sure it is fast when the user sees it String[] workspaceNames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); m_bPerformanceCache = bPerformanceCache; if (!m_bPerformanceCache) { } InitializeComponent(); } /// /// Called when we want to Update the DataGrid with new DataTable Items /// ~Responsible for reloading the WorkspacesDT /// private void UpdateWorkspaceGridItems(SortOrderForWorkspaces sortOrder) { // First Step - Clear the Grid WorkspacesDT.Rows.Clear(); // Second Step - Fill the Grid with the WorkspaceNames String[] workspaceNames = Data.Workspace.GetAllWorkspaceNames(sortOrder); int i = 0; int selectedIndex = -1; foreach (string workspaceName in workspaceNames) { var row = WorkspacesDT.NewRow(); WorkspacesDT.Rows.Add(row); row["WorkspaceName"] = workspaceName; row["ButtonResUri"] = "PageImages/Launch.png";//"PageImages/Launch.png"; row["ButtonToolTipText"] = "Launch This Workspace"; // Let's Determine which index is supposed to be selected if (!String.IsNullOrEmpty(GUIState.LastSelectedWorkspaceName) && (workspaceName == GUIState.LastSelectedWorkspaceName)) selectedIndex = i; i = i + 1; // incr. } // Third Step - Refresh The DataGrid dataGridWorkspaces.ItemsSource = WorkspacesDT.DefaultView; // Other ways to refresh * appears to not be needed here * could be useful later //dataGridWorkspaces.ItemsSource = (WorkspacesDT as IListSource).GetList(); //dataGridWorkspaces.Items.Refresh(); // Fourth Step - Reset the ColumnWidth of the WorkspaceName if no Scrollbar is visible if (workspaceNames.Length <= 13) { // scrollbar not visible DataGridLength gridbuffer = new DataGridLength(188 + 18); dataGridWorkspaces.Columns[0].Width = gridbuffer; } else { // scrollbar visible DataGridLength gridbuffer = new DataGridLength(188); dataGridWorkspaces.Columns[0].Width = gridbuffer; } // Fifth Step - Set the Selected Index of the DataGrid to the last set // Workspace Or 0 if not found if (selectedIndex >= 0) dataGridWorkspaces.SelectedIndex = selectedIndex; else dataGridWorkspaces.SelectedIndex = 0; } #region Page Events /// /// Called when the Page is loaded /// private void Page_Loaded(object sender, RoutedEventArgs e) { if (!m_bPerformanceCache) { // Make sure that the Selector Frame is big enough to hold this page m_WorkspaceSelectorObj = (WorkspaceSelector)this.Tag; m_WorkspaceSelectorObj.Height = this.Height + m_WorkspaceSelectorObj.MarginTopBottom; m_WorkspaceSelectorObj.Width = this.Width; // InitializeWorkspaceDT WorkspacesDT = new DataTable("WorkspaceData"); WorkspacesDT.Columns.Add(new DataColumn("WorkspaceName", typeof(string))); WorkspacesDT.Columns.Add(new DataColumn("ButtonResUri", typeof(string))); WorkspacesDT.Columns.Add(new DataColumn("ButtonToolTipText", typeof(string))); // Set Workspaces Label lblCurrentWorkspace.Content = "Workspaces"; // Load ComboBox Sort Orders comboBoxSortBy.Items.Add(WPFHelper.CreateAComboBoxItem("Sort By Last Accessed", SortOrderForWorkspaces.LastAccessedDescending)); comboBoxSortBy.Items.Add(WPFHelper.CreateAComboBoxItem("Sort By Most Frequently Used", SortOrderForWorkspaces.MostFrequentlyAccessedDescending)); comboBoxSortBy.Items.Add(WPFHelper.CreateAComboBoxItem("Sort By Name", SortOrderForWorkspaces.Ascending)); // Load GUI State (or Default Index) comboBoxSortBy.SelectedIndex = GUIState.LastSelectedSotOrderWorkspacesIndex; // Assign ToolTips for the Buttons btnNew.ToolTip = WPFHelper.CreateNewStringToolTip("New Workspace", 0, 120); btnEdit.ToolTip = WPFHelper.CreateNewStringToolTip("Rename Workspace", 0, 120); btnDelete.ToolTip = WPFHelper.CreateNewStringToolTip("Delete Workspace", 0, 120); btnCloseAll.ToolTip = WPFHelper.CreateNewStringToolTip("Close All Workspaces", 0, 120); } } #endregion #region ComboBox Events /// /// Combo Box - SortBy - Selection Change Event * Deal with repopulating the Workspace Datagrid /// private void comboBoxSortBy_SelectionChanged(object sender, SelectionChangedEventArgs e) { ComboBox combobox = sender as ComboBox; if (combobox != null) { ComboBoxItem item = (ComboBoxItem)combobox.SelectedItem; string Content = item.Content.ToString(); SortOrderForWorkspaces sortOrder = (SortOrderForWorkspaces)item.Tag; // Save the State Information * Last SortOrder and Last SortOrder Index * GUIState.LastSelectedSotOrderWorkspaces = sortOrder; GUIState.LastSelectedSotOrderWorkspacesIndex = combobox.SelectedIndex; // Update The Grid UpdateWorkspaceGridItems(sortOrder); } } #endregion #region DataGrid Events /// /// Upon double-click we should be launching the Workspace (unload any previously loaded ones) /// private void dataGridWorkspaces_MouseDoubleClick(object sender, MouseButtonEventArgs e) { string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); if (!String.IsNullOrEmpty(strWorkspaceName)) { } } /// /// Selection changed - Keep track of last selected workspace in GUIState /// private void dataGridWorkspaces_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); if (!String.IsNullOrEmpty(strWorkspaceName)) GUIState.LastSelectedWorkspaceName = strWorkspaceName; } /// /// Get Whatever Workspace the User currently has selected in the Grid /// /// Selected Workpsace Or Empty String if there is none private string dataGrid_GetSelectedWorkspaceIfThereIsOne() { String strWorkspaceName = String.Empty; // We only allow single selection IList cells = dataGridWorkspaces.SelectedCells; if (cells.Count > 0) { DataGridCellInfo cell = cells[0]; DataRowView row = (DataRowView)cell.Item; strWorkspaceName = row["WorkspaceName"].ToString(); } return strWorkspaceName; } /// /// Creates the DataGrid Context Menu according to the Selected Workspace State /// /// valid Context Menu or Null private ContextMenu dataGrid_CreateDataGridContextMenu() { string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); if (!String.IsNullOrEmpty(strWorkspaceName)) { // We also want to load the state of the workspace here ContextMenu menu = new ContextMenu(); menu.PlacementTarget = this; // Load all the MenuItems MenuItem m1 = new MenuItem(); m1.Header = "Launch"; m1.Click += new RoutedEventHandler(ContextMenu_Item_Click); m1.FontWeight = FontWeights.Bold; m1.Icon = WPFHelper.CreateWPFImageFromRelativeResourceUri("PageImages/Launch.png", 16, 16); menu.Items.Add(m1); MenuItem m2 = new MenuItem(); m2.Header = "Show"; m2.Click += new RoutedEventHandler(ContextMenu_Item_Click); m2.Icon = WPFHelper.CreateWPFImageFromRelativeResourceUri("PageImages/Hide.png", 16, 16); menu.Items.Add(m2); MenuItem m3 = new MenuItem(); m3.Header = "Hide"; m3.Click += new RoutedEventHandler(ContextMenu_Item_Click); m3.Icon = WPFHelper.CreateWPFImageFromRelativeResourceUri("PageImages/Hide.png", 16, 16); menu.Items.Add(m3); MenuItem m4 = new MenuItem(); m4.Header = "Close"; m4.Click += new RoutedEventHandler(ContextMenu_Item_Click); m4.Icon = WPFHelper.CreateWPFImageFromRelativeResourceUri("PageImages/Close.png", 16, 16); menu.Items.Add(m4); // Load all the Events menu.Closed += new RoutedEventHandler(ContextMenu_Closed); menu.MouseLeave += new MouseEventHandler(ContextMenu_MouseLeave); return menu; } return null; } /// /// We need to manually implement the context menu upon right click and not use wpf, /// because of the mouse leave event /// private void dataGridWorkspaces_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { ContextMenu menu = dataGrid_CreateDataGridContextMenu(); if (menu != null) { // Make sure that leave doesn't work m_WorkspaceSelectorObj.DontCloseOnMouseLeave = true; // Show the Context Menu menu.IsOpen = true; } } #endregion #region ContextMenu Events /// /// Context Menu - Closed Event /// void ContextMenu_Closed(object sender, RoutedEventArgs e) { // Make sure that navigator leave works again m_WorkspaceSelectorObj.DontCloseOnMouseLeave = false; // Close the Navigation Form *if the mouse is NOT over it* if (!WPFHelper.IsMouseCursorOverWPFormWindow(m_WorkspaceSelectorObj)) m_WorkspaceSelectorObj.Close(); } /// /// Context Menu - Mouse Leave Event /// void ContextMenu_MouseLeave(object sender, MouseEventArgs e) { // On Leave just close the Menu ContextMenu menu = (ContextMenu)sender; menu.IsOpen = false; } /// /// Context Menu - Menu Item Clicked Event /// void ContextMenu_Item_Click(object sender, RoutedEventArgs e) { MenuItem m = (MenuItem)sender; string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); if (!String.IsNullOrEmpty(strWorkspaceName)) { bool bSuccess = false; switch (m.Header.ToString()) { case "Launch": { bSuccess = m_WorkspaceMgr.LaunchWorkspace(strWorkspaceName); } break; case "Show": { bSuccess = m_WorkspaceMgr.HideShowWorkspace(strWorkspaceName, true); } break; case "Hide": { bSuccess = m_WorkspaceMgr.HideShowWorkspace(strWorkspaceName, false); } break; case "Close": { bSuccess = m_WorkspaceMgr.CloseWorkspace(strWorkspaceName); } break; } } } #endregion #region Button Click Events /// /// New Button - Event Handler /// private void btnNew_Click(object sender, RoutedEventArgs e) { m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_NewWorkspacePage); } /// /// Edit Button - Event Handler /// private void btnEdit_Click(object sender, RoutedEventArgs e) { string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); if (!String.IsNullOrEmpty(strWorkspaceName)) { GUIState.LastSelectedWorkspaceName = strWorkspaceName; m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_RenameWorkspacePage); } } /// /// Delete Button - Event Handler /// private void btnDelete_Click(object sender, RoutedEventArgs e) { string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); if (!String.IsNullOrEmpty(strWorkspaceName)) { GUIState.LastSelectedWorkspaceName = strWorkspaceName; m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_DeleteWorkspacePage); } } /// /// CloseAll Button - Event Handler /// private void btnCloseAll_Click(object sender, RoutedEventArgs e) { MessageBox.Show("Does Nothing"); } /// /// Button on the Grid is being clicked - Event Handler /// private void ButtonGrid_Click(object sender, RoutedEventArgs e) { string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); if (String.IsNullOrEmpty(strWorkspaceName)) return; } #endregion } }