/// <summary> /// Changed DB in Connection panel - MS Sql Server only /// </summary> /// <param name="sender"></param> /// <param name="s">Selected DB</param> private async void DatabaseConnectionSidebarOnMsSqlDatabaseChanged(object sender, string s) { await DiagramFacade.CloseDiagramsOnDisconnect(this); SessionProvider.Instance.Database = s; await DatabaseConnectionSidebar.LoadMsSqlData(true); }
/// <summary> /// Open saved diagram /// </summary> /// <param name="sender"></param> /// <param name="diagramModel">Diagram for opening</param> private async void DatabaseConnectionSidebarOnAddDiagram(object sender, DiagramModel diagramModel) { Mouse.OverrideCursor = Cursors.Wait; DiagramFacade.CreateNewDiagram(this, diagramModel.Name); LayoutAnchorable panel; if (TryGetSelectedPanel(out panel)) { DatabaseModelDesigner designer; if (TryGetSelectedDesigner(out designer)) { panel.IsActiveChanged -= AnchorableDesignerActiveChangedHandler; var facade = new DiagramFacade(designer.ViewModel); try { await facade.LoadDiagram(designer.ModelDesignerCanvas, XDocument.Parse(diagramModel.Xml)); } catch (Exception exception) when(exception is SqlException || exception is OracleException) { Output.WriteLine(OutputPanelListener.PrepareException(exception.Message)); } panel.IsActiveChanged += AnchorableDesignerActiveChangedHandler; } } await DatabaseConnectionSidebar.RefreshTreeData(); Mouse.OverrideCursor = null; }
/// <summary> /// Synchronize diagram after activation of panel with DB structure /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public async void AnchorableDesignerActiveChangedHandler(object sender, System.EventArgs e) { var anchorable = sender as LayoutAnchorable; DatabaseModelDesigner designer = anchorable?.Content as DatabaseModelDesigner; if (designer == null) { return; } if (!anchorable.IsActive) { _lastFocued = anchorable; return; } if (_lastFocued != null && _lastFocued.Equals(anchorable)) { return; } Mouse.OverrideCursor = Cursors.Wait; var facade = new DiagramFacade(designer.ViewModel); await facade.RefreshDiagram(designer.ModelDesignerCanvas); Mouse.OverrideCursor = null; }
/// <summary> /// Drop table from Db /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public async void DropTableHandler(object sender, TableModel e) { var dialog = await this.ShowMessageAsync("Drop table", $"Do you really want to drop {e.Title} ? Changes can't be undone!", MessageDialogStyle.AffirmativeAndNegative); if (dialog == MessageDialogResult.Affirmative) { var res = _updater.DropTable(e); if (res != null) { await this.ShowMessageAsync("Drop table", res); Output.WriteLine(OutputPanelListener.PrepareException(res)); return; } DatabaseModelDesigner designer; if (TryGetSelectedDesigner(out designer)) { var facade = new DiagramFacade(designer); facade.RemoveTable(e); } await DatabaseConnectionSidebar.RefreshTreeData(); } }
/// <summary> /// End current session /// </summary> /// <param name="sender"></param> /// <param name="eventArgs"></param> private async void DatabaseConnectionSidebarOnDisconnectClick(object sender, System.EventArgs eventArgs) { await DiagramFacade.CloseDiagramsOnDisconnect(this); SessionProvider.Instance.Disconnect(); DatabaseConnectionSidebar.HideDatabaseStackPanels(); }
/// <summary> /// Save diagram to DB and refresh treeview in panel /// </summary> /// <param name="vm"></param> private async void SaveDiagramAndRefresh(DatabaseModelDesignerViewModel vm) { var facade = new DiagramFacade(vm); var res = facade.SaveDiagram(); Output.WriteLine(DiagramFacade.DiagramSaved); await DatabaseConnectionSidebar.RefreshTreeData(); }
/// <summary> /// Create new diagram /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void NewDiagram_OnExecuted(object sender, ExecutedRoutedEventArgs e) { var result = await ShowNewDiagramDialog(); if (result == null) { return; } DiagramFacade.CreateNewDiagram(this, result); }
/// <summary> /// Add table to active diagram /// </summary> /// <param name="sender"></param> /// <param name="model">Added table</param> private async void DatabaseConnectionSidebarOnAddTable(object sender, TableModel model) { var idx = MainDocumentPane.SelectedContentIndex; if (idx < 0) { var title = await ShowNewDiagramDialog(); if (title == null) { return; } DiagramFacade.CreateNewDiagram(this, title); idx = MainDocumentPane.SelectedContentIndex; } var content = MainDocumentPane.Children[idx].Content; var diagram = content as DatabaseModelDesigner; if (diagram == null) { var title = await ShowNewDiagramDialog(); if (title == null) { return; } DiagramFacade.CreateNewDiagram(this, title); idx = MainDocumentPane.SelectedContentIndex; } content = MainDocumentPane.Children[idx].Content; diagram = content as DatabaseModelDesigner; if (diagram == null) { return; } var facade = new DiagramFacade(diagram.ViewModel); facade.AddTableCallbackAction += async tableModel => { await facade.AddRelationShipsForTable(model, diagram.ModelDesignerCanvas); }; facade.AddTable(model); }
/// <summary> /// On drop table item /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ModelDesignerCanvas_OnPreviewDrop(object sender, DragEventArgs e) { var data = e.Data.GetData("ConnectionPanelTableDragFormat") as TableModel; if (data != null) { var facade = new DiagramFacade(ViewModel); Point position = e.GetPosition(ModelDesignerCanvas); facade.AddTableCallbackAction += async model => { try { await facade.AddRelationShipsForTable(model, ModelDesignerCanvas); } catch (Exception exception) when(exception is SqlException || exception is OracleException) { Output.WriteLine(OutputPanelListener.PrepareException(exception.Message)); } }; facade.AddTable(data, (int)position.X, (int)position.Y); } }
/// <summary> /// Mouse button up /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ModelDesignerCanvas_OnMouseUp(object sender, MouseButtonEventArgs e) { if (ViewModel.MouseMode == MouseMode.Select) { if (_isDraggingSelection) { var selectionRect = new System.Drawing.Rectangle((int)System.Windows.Controls.Canvas.GetLeft(SelectionBorder), (int)System.Windows.Controls.Canvas.GetTop(SelectionBorder), (int)SelectionBorder.Width, (int)SelectionBorder.Height); var rectanglesVm = ViewModel.TableViewModels.Where(t => DiagramFacade.GetTableRectangles(new[] { t }).FirstOrDefault().IntersectsWith(selectionRect)); IEnumerable <TableContent> contents = ModelDesignerCanvas.Children.OfType <TableContent>().Where(t => rectanglesVm.Any(s => s.Equals(t.TableViewModel))); foreach (TableContent content in contents) { content.IsSelected = true; } DragSelectionCanvas.Visibility = Visibility.Hidden; } ModelDesignerCanvas.ReleaseMouseCapture(); _dragSelectionStartPoint = null; _isDraggingSelection = false; } }
/// <summary> /// Connect to Oracle /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void ConnectToOracle_OnExecuted(object sender, ExecutedRoutedEventArgs e) { await DiagramFacade.CloseDiagramsOnDisconnect(this); SessionProvider.Instance.Disconnect(); DatabaseConnectionSidebar.HideDatabaseStackPanels(); ProgressDialogController progressDialogController = null; Func <ProgressDialogController, Task> closeProgress = async t => { if (t != null) { if (t.IsOpen) { await t.CloseAsync(); } } }; try { progressDialogController = await this.ShowProgressAsync("Please wait", "Connecting to server...", false, new MetroDialogSettings() { AnimateShow = false, AnimateHide = false }); progressDialogController.SetIndeterminate(); var db = new OracleDatabase(); await db.BuildSession(OracleServerNameTextBox.Text, OraclePortTextBox.Text, OracleSidTextBox.Text, OracleUsernameTextBox.Text, OraclePasswordBox.Password); //Init work await Task.Factory.StartNew(() => { using (IOracleMapper mapper = new OracleMapper()) { TableModel model = mapper.ListTables().FirstOrDefault(); if (model != null) { mapper.ListForeignKeys(model.Title); } } }); await closeProgress(progressDialogController); await this.ShowMessageAsync("Connected", $"Successfuly connected to {SessionProvider.Instance.ServerName}"); var flyout = Flyouts.Items[2] as Flyout; if (flyout != null) { flyout.IsOpen = !flyout.IsOpen; } await DatabaseConnectionSidebar.LoadOracleData(); } catch (OracleException exception) { await closeProgress(progressDialogController); await this.ShowMessageAsync("Connection error", exception.Message); Output.WriteLine(OutputPanelListener.PrepareException(exception.Message)); SessionProvider.Instance.ConnectionType = ConnectionType.None; } }
/// <summary> /// Connect to MS SQL Server /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void ConnectToMsSql_OnExecuted(object sender, ExecutedRoutedEventArgs e) { await DiagramFacade.CloseDiagramsOnDisconnect(this); SessionProvider.Instance.Disconnect(); DatabaseConnectionSidebar.HideDatabaseStackPanels(); ProgressDialogController progressDialogController = null; Func <ProgressDialogController, Task> closeProgress = async t => { if (t != null) { if (t.IsOpen) { await t.CloseAsync(); } } }; try { progressDialogController = await this.ShowProgressAsync("Please wait", "Connecting to server...", false, new MetroDialogSettings() { AnimateShow = false, AnimateHide = false }); progressDialogController.SetIndeterminate(); MsSqlDatabase db = new MsSqlDatabase(); string name = null, pass = null; bool integratedSecurity = true; var server = MsSqlServerNameTextBox.Text; if (WinAuthSwitch.IsChecked != null) { integratedSecurity = !WinAuthSwitch.IsChecked.Value; } if (!integratedSecurity) { name = MsSqlUsernameTextBox.Text; pass = MsSqlPasswordBox.Password; } await db.BuildSession(server, integratedSecurity, name, pass); await closeProgress(progressDialogController); await this.ShowMessageAsync("Connected", $"Successfuly connected to {SessionProvider.Instance.ServerName}"); var flyout = Flyouts.Items[0] as Flyout; if (flyout != null) { flyout.IsOpen = !flyout.IsOpen; } await DatabaseConnectionSidebar.LoadMsSqlData(); } catch (SqlException exception) { await closeProgress(progressDialogController); await this.ShowMessageAsync("Connection error", exception.Message); SessionProvider.Instance.ConnectionType = ConnectionType.None; } }
private async void ConnectToOracleOwnConnString_OnExecuted(object sender, ExecutedRoutedEventArgs e) { var example = @"USER ID=c##username;PASSWORD=y0urP455woRd;DATA SOURCE=""(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.14.10)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orcl)))"""; var res = await this.ShowInputAsync("Connection string", $"Use customized connection string \n (Example: {example})"); if (res != null) { await DiagramFacade.CloseDiagramsOnDisconnect(this); SessionProvider.Instance.Disconnect(); DatabaseConnectionSidebar.HideDatabaseStackPanels(); ProgressDialogController progressDialogController = null; Func <ProgressDialogController, Task> closeProgress = async t => { if (t != null) { if (t.IsOpen) { await t.CloseAsync(); } } }; try { progressDialogController = await this.ShowProgressAsync("Please wait", "Connecting to server...", false, new MetroDialogSettings() { AnimateShow = false, AnimateHide = false }); progressDialogController.SetIndeterminate(); var db = new OracleDatabase(); OracleConnectionStringBuilder builder = new OracleConnectionStringBuilder(res); builder.ConnectionTimeout = 2; await db.TryToConnectToServer(builder.ConnectionString); SessionProvider.Instance.OwnConnectionString = res; SessionProvider.Instance.UseOwnConnectionString = true; SessionProvider.Instance.Username = builder.UserID; SessionProvider.Instance.ConnectionType = ConnectionType.Oracle; //Init work await Task.Factory.StartNew(() => { using (IOracleMapper mapper = new OracleMapper()) { TableModel model = mapper.ListTables().FirstOrDefault(); if (model != null) { mapper.ListForeignKeys(model.Title); } } }); await closeProgress(progressDialogController); await this.ShowMessageAsync("Connected", $"Successfuly connected to server"); var flyout = Flyouts.Items[2] as Flyout; if (flyout != null) { flyout.IsOpen = !flyout.IsOpen; } await DatabaseConnectionSidebar.LoadOracleData(); } catch (OracleException exception) { await closeProgress(progressDialogController); await this.ShowMessageAsync("Connection error", exception.Message); Output.WriteLine(OutputPanelListener.PrepareException(exception.Message)); SessionProvider.Instance.ConnectionType = ConnectionType.None; } catch (ArgumentException) { await closeProgress(progressDialogController); await this.ShowMessageAsync("Connection error", "Connection string is not valid"); SessionProvider.Instance.ConnectionType = ConnectionType.None; } } }
private async void ConnectToMsSqlServerOwnConnString_OnExecuted(object sender, ExecutedRoutedEventArgs e) { var example = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Init;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True"; var res = await this.ShowInputAsync("Connection string", $"Use customized connection string \n (Example: {example})"); if (res != null) { await DiagramFacade.CloseDiagramsOnDisconnect(this); SessionProvider.Instance.Disconnect(); DatabaseConnectionSidebar.HideDatabaseStackPanels(); ProgressDialogController progressDialogController = null; Func <ProgressDialogController, Task> closeProgress = async t => { if (t != null) { if (t.IsOpen) { await t.CloseAsync(); } } }; try { progressDialogController = await this.ShowProgressAsync("Please wait", "Connecting to server...", false, new MetroDialogSettings() { AnimateShow = false, AnimateHide = false }); progressDialogController.SetIndeterminate(); var db = new MsSqlDatabase(); await db.TryToConnectToServer(res); SessionProvider.Instance.OwnConnectionString = res; SessionProvider.Instance.UseOwnConnectionString = true; SessionProvider.Instance.ConnectionType = ConnectionType.SqlServer; await closeProgress(progressDialogController); await this.ShowMessageAsync("Connected", $"Successfuly connected to server"); var flyout = Flyouts.Items[0] as Flyout; if (flyout != null) { flyout.IsOpen = !flyout.IsOpen; } await DatabaseConnectionSidebar.LoadMsSqlData(); } catch (SqlException exception) { await closeProgress(progressDialogController); await this.ShowMessageAsync("Connection error", exception.Message); SessionProvider.Instance.ConnectionType = ConnectionType.None; } catch (ArgumentException) { await closeProgress(progressDialogController); await this.ShowMessageAsync("Connection error", "Connection string is not valid"); SessionProvider.Instance.ConnectionType = ConnectionType.None; } } }
/// <summary> /// Mouse clicked /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private async void ModelDesignerCanvasOnMouseDown(object sender, MouseButtonEventArgs e) { switch (ViewModel.MouseMode) { case MouseMode.Select: ModelDesignerCanvas.DeselectTables(); ModelDesignerCanvas.DeselectLabels(); _sourceModel = null; _destinationModel = null; DeselectConnections(); ModelDesignerCanvas.ResetZIndexes(); //Selection rectangle logic _dragSelectionStartPoint = e.GetPosition(ModelDesignerCanvas); ModelDesignerCanvas.CaptureMouse(); break; case MouseMode.NewTable: var origin = e.GetPosition(ModelDesignerCanvas); var table = new TableViewModel(new TableModel()); var nameDialog = new TableNameDialog { Owner = Window.GetWindow(this), Model = table.Model }; var res = nameDialog.ShowDialog(); if (res.HasValue) { if (res.Value) { MainWindow window = null; try { window = Window.GetWindow(this) as MainWindow; var facade = new DiagramFacade(ViewModel); bool addRes = facade.AddTable(table.Model.Title, (int)origin.X, (int)origin.Y); if (!addRes) { await window.ShowMessageAsync("Add new table", $"Table {table.Model.Title} already exists"); } else { OnTableCreated(); } } catch (Exception exception) when(exception is SqlException || exception is OracleException) { await window.ShowMessageAsync("Add new table", exception.Message); } } } ViewModel.MouseMode = MouseMode.Select; break; case MouseMode.NewLabel: var originLabel = e.GetPosition(ModelDesignerCanvas); ViewModel.LabelViewModels.Add(new LabelViewModel() { Left = originLabel.X, Top = originLabel.Y }); ViewModel.MouseMode = MouseMode.Select; break; } }