/// <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);
        }
Exemple #9
0
        /// <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);
            }
        }
Exemple #10
0
        /// <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;
                }
            }
        }
Exemple #15
0
        /// <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;
            }
        }