コード例 #1
0
ファイル: TreeDocView.xaml.cs プロジェクト: wurunduk/SI
        internal static void SetEffect(DragEventArgs e)
        {
            var treeViewItem = FlatDocView.FindAncestor <TreeViewItem>((DependencyObject)e.OriginalSource);

            if (treeViewItem == null)
            {
                e.Effects = DragDropEffects.None;
            }
            else
            {
                var format = FlatDocView.GetDragFormat(e);
                if ((treeViewItem.DataContext is PackageViewModel || treeViewItem.DataContext is RoundViewModel) && format == "siqround" ||
                    (treeViewItem.DataContext is RoundViewModel || treeViewItem.DataContext is ThemeViewModel) && format == "siqtheme" ||
                    (treeViewItem.DataContext is ThemeViewModel || treeViewItem.DataContext is QuestionViewModel) && format == "siqquestion")
                {
                    e.Effects = DragDropEffects.Move;
                }
                else
                {
                    e.Effects = DragDropEffects.None;
                }
            }

            e.Handled = true;
        }
コード例 #2
0
ファイル: TreeDocView.xaml.cs プロジェクト: VladimirKhil/SI
        private static ScrollViewer ScrollView(DragEventArgs e, DependencyObject source = null)
        {
            var scroller = FlatDocView.FindAncestor <ScrollViewer>(source ?? (DependencyObject)e.OriginalSource);

            if (scroller == null)
            {
                return(null);
            }

            var pos = e.GetPosition(scroller);

            double scrollOffset = 0.0;

            // See if we need to scroll down
            if (scroller.ViewportHeight - pos.Y < 40.0)
            {
                scrollOffset = 6.0;
            }
            else if (pos.Y < 40.0)
            {
                scrollOffset = -6.0;
            }

            // Scroll the tree down or up
            if (scrollOffset != 0.0)
            {
                scrollOffset += scroller.VerticalOffset;

                if (scrollOffset < 0.0)
                {
                    scrollOffset = 0.0;
                }
                else if (scrollOffset > scroller.ScrollableHeight)
                {
                    scrollOffset = scroller.ScrollableHeight;
                }

                scroller.ScrollToVerticalOffset(scrollOffset);
            }

            return(scroller);
        }
コード例 #3
0
ファイル: TreeDocView.xaml.cs プロジェクト: VladimirKhil/SI
        void MainWindow_PreviewMouseMove(object sender, MouseEventArgs e)
        {
            FrameworkElement host;

            lock (_dragLock)
            {
                if (_isDragging)
                {
                    return;
                }

                var position = e.GetPosition(null);

                if (Math.Abs(position.X - _startPoint.X) <= SystemParameters.MinimumHorizontalDragDistance &&
                    Math.Abs(position.Y - _startPoint.Y) <= SystemParameters.MinimumVerticalDragDistance)
                {
                    return;
                }

                host = AppSettings.Default.View == ViewMode.TreeFull
                    ? FlatDocView.FindAncestor <TreeViewItem>((DependencyObject)e.OriginalSource)
                    : (FrameworkElement)FlatDocView.FindAncestor <Border>((DependencyObject)e.OriginalSource);

                if (host == null || host.DataContext == null || host.DataContext is PackageViewModel || !(host.DataContext is IItemViewModel))
                {
                    return;
                }

                if (AppSettings.Default.View == ViewMode.Flat && (host.DataContext is RoundViewModel || host.DataContext is ThemeViewModel))
                {
                    return;
                }

                if (DataContext == null)
                {
                    return;
                }

                _isDragging = true;
            }

            var active = (QDocument)DataContext;

            var item = ((IItemViewModel)host.DataContext).GetModel();

            InfoOwnerData itemData = null;

            try
            {
                itemData = new InfoOwnerData(item);
                FlatDocView.DoDrag(host, active, item, itemData);
            }
            catch (OutOfMemoryException)
            {
                MessageBox.Show("Ошибка копирования данных: слишком большой объём", App.ProductName, MessageBoxButton.OK, MessageBoxImage.Exclamation);
            }
            catch (InvalidOperationException)
            {
            }
            catch (Exception exc)
            {
                MessageBox.Show(string.Format("Ошибка копирования данных: {0}", exc.Message), App.ProductName, MessageBoxButton.OK, MessageBoxImage.Exclamation);
            }
            finally
            {
                lock (_dragLock)
                {
                    _isDragging = false;
                }

                e.Handled = true;

                PreviewMouseMove         -= MainWindow_PreviewMouseMove;
                PreviewMouseLeftButtonUp -= DocumentView_PreviewMouseLeftButtonUp;

                itemData?.Dispose();
            }
        }
コード例 #4
0
ファイル: TreeDocView.xaml.cs プロジェクト: VladimirKhil/SI
        private async void Main_Drop(object sender, DragEventArgs e)
        {
            e.Handled = true;

            if (e.Data.GetDataPresent("FileName"))
            {
                var files = e.Data.GetData("FileName") as string[];
                foreach (var file in files)
                {
                    var longPath = new StringBuilder(255);
                    GetLongPathName(file, longPath, longPath.Capacity);

                    var longPathString = longPath.ToString();

                    if (Path.GetExtension(longPathString) == ".txt")
                    {
                        ((MainViewModel)Application.Current.MainWindow.DataContext).ImportTxt.Execute(longPathString);
                    }
                    else
                    {
                        ApplicationCommands.Open.Execute(longPathString, this);
                    }
                }

                e.Effects = e.AllowedEffects;
                return;
            }

            if (e.Data.GetDataPresent("FileContents"))
            {
                using (var contentStream = e.Data.GetData("FileContents") as MemoryStream)
                {
                    ((MainViewModel)Application.Current.MainWindow.DataContext).ImportTxt.Execute(contentStream);
                }

                e.Effects = e.AllowedEffects;
                return;
            }

            var treeViewItem = FlatDocView.FindAncestor <TreeViewItem>((DependencyObject)e.OriginalSource);

            if (treeViewItem == null)
            {
                e.Effects = DragDropEffects.None;
                return;
            }

            var format = FlatDocView.GetDragFormat(e);

            InfoOwnerData dragData = null;

            try
            {
                dragData = (InfoOwnerData)e.Data.GetData(typeof(InfoOwnerData));
            }
            catch (SerializationException)
            {
                return;
            }

            var dataContext = ((IItemViewModel)treeViewItem.DataContext).GetModel();

            if (dataContext == null || dataContext.GetType().ToString() == format && Equals(dataContext, dragData.ItemData))
            {
                e.Effects = DragDropEffects.None;
                return;
            }

            var document = ((QDocument)DataContext).Document;

            e.Effects = DragDropEffects.Move;
            try
            {
                if (format == "siqround")
                {
                    Round round = null;
                    if (dragData != null)
                    {
                        round = (Round)dragData.GetItem();
                    }
                    else
                    {
                        var value = e.Data.GetData(DataFormats.Serializable).ToString();
                        using (var stringReader = new StringReader(value))
                            using (var reader = XmlReader.Create(stringReader))
                            {
                                round = new Round();
                                round.ReadXml(reader);
                            }
                    }

                    if (treeViewItem.DataContext is PackageViewModel)
                    {
                        var package = treeViewItem.DataContext as PackageViewModel;
                        package.Rounds.Add(new RoundViewModel(round));
                        await dragData.ApplyData(document);
                    }
                    else if (treeViewItem.DataContext is RoundViewModel)
                    {
                        var docRound = treeViewItem.DataContext as RoundViewModel;
                        docRound.OwnerPackage.Rounds.Insert(docRound.OwnerPackage.Rounds.IndexOf(docRound), new RoundViewModel(round));
                        await dragData.ApplyData(document);
                    }
                }
                else if (format == "siqtheme")
                {
                    Theme theme = null;
                    if (dragData != null)
                    {
                        theme = (Theme)dragData.GetItem();
                    }
                    else
                    {
                        var value = e.Data.GetData(DataFormats.Serializable).ToString();
                        using (var stringReader = new StringReader(value))
                            using (var reader = XmlReader.Create(stringReader))
                            {
                                theme = new Theme();
                                theme.ReadXml(reader);
                            }
                    }

                    if (treeViewItem.DataContext is RoundViewModel)
                    {
                        var docRound = treeViewItem.DataContext as RoundViewModel;
                        docRound.Themes.Add(new ThemeViewModel(theme));
                        await dragData.ApplyData(document);
                    }
                    else if (treeViewItem.DataContext is ThemeViewModel)
                    {
                        var docTheme = treeViewItem.DataContext as ThemeViewModel;
                        docTheme.OwnerRound.Themes.Insert(docTheme.OwnerRound.Themes.IndexOf(docTheme), new ThemeViewModel(theme));
                        await dragData.ApplyData(document);
                    }
                }
                else if (format == "siqquestion")
                {
                    Question question = null;
                    if (dragData != null)
                    {
                        question = (Question)dragData.GetItem();
                    }
                    else
                    {
                        var value = e.Data.GetData(DataFormats.Serializable).ToString();
                        using (var stringReader = new StringReader(value))
                            using (var reader = XmlReader.Create(stringReader))
                            {
                                question = new Question();
                                question.ReadXml(reader);
                            }
                    }

                    if (treeViewItem.DataContext is ThemeViewModel)
                    {
                        var docTheme = treeViewItem.DataContext as ThemeViewModel;
                        if (docTheme.Questions.Any(questionViewModel => questionViewModel.Model == question))
                        {
                            question = question.Clone();
                        }

                        docTheme.Questions.Add(new QuestionViewModel(question));

                        if (AppSettings.Default.ChangePriceOnMove)
                        {
                            FlatDocView.RecountPrices(docTheme);
                        }

                        await dragData.ApplyData(document);
                    }
                    else if (treeViewItem.DataContext is QuestionViewModel)
                    {
                        var docQuestion = treeViewItem.DataContext as QuestionViewModel;
                        if (docQuestion.OwnerTheme.Questions.Any(questionViewModel => questionViewModel.Model == question))
                        {
                            question = question.Clone();
                        }

                        int pos = docQuestion.OwnerTheme.Questions.IndexOf(docQuestion);
                        docQuestion.OwnerTheme.Questions.Insert(pos, new QuestionViewModel(question));

                        if (AppSettings.Default.ChangePriceOnMove)
                        {
                            FlatDocView.RecountPrices(docQuestion.OwnerTheme);
                        }

                        await dragData.ApplyData(document);
                    }
                }
                else
                {
                    e.Effects = DragDropEffects.None;
                }
            }
            finally
            {
                if (dragData != null)
                {
                    dragData.Dispose();
                }
            }
        }