Пример #1
0
        private void _listViewResults_PreviewMouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            var item = _listViewResults.GetObjectAtPoint <ListViewItem>(e.GetPosition(_listViewResults));

            if (item != null)
            {
                HashSet <CmdInfo> commands = new HashSet <CmdInfo>();

                foreach (ValidationErrorView error in _listViewResults.SelectedItems)
                {
                    error.GetCommands(commands);
                }

                ContextMenu menu = new ContextMenu();

                foreach (var cmd in commands)
                {
                    var lcmd = cmd;

                    MenuItem mitem = new MenuItem {
                        Header = cmd.DisplayName, Icon = new Image {
                            Source = ApplicationManager.GetResourceImage(cmd.Icon)
                        }
                    };
                    mitem.Click += delegate {
                        var items = _listViewResults.SelectedItems.Cast <ValidationErrorView>().ToList();

                        _asyncOperation.SetAndRunOperation(new GrfThread(delegate {
                            List <object> dbs = new List <object>();

                            foreach (var serverDb in ServerDbs.ListDbs)
                            {
                                var db = _sdb.TryGetDb(serverDb);

                                if (db != null)
                                {
                                    if (db.AttributeList.PrimaryAttribute.DataType == typeof(int))
                                    {
                                        var adb = (AbstractDb <int>)db;
                                        dbs.Add(adb);
                                    }
                                    else if (db.AttributeList.PrimaryAttribute.DataType == typeof(string))
                                    {
                                        var adb = (AbstractDb <string>)db;
                                        dbs.Add(adb);
                                    }
                                }
                            }

                            foreach (var db in dbs)
                            {
                                _to <int>(db, _onBegin);
                                _to <string>(db, _onBegin);
                            }

                            try {
                                AProgress.Init(_validation);

                                _validation.Grf.Close();
                                _validation.Grf.Open(GrfPath.Combine(SdeAppConfiguration.ProgramDataPath, "missing_resources.grf"), GrfLoadOptions.OpenOrNew);

                                for (int i = 0; i < items.Count; i++)
                                {
                                    AProgress.IsCancelling(_validation);
                                    if (!lcmd.Execute(items[i], items))
                                    {
                                        return;
                                    }
                                    _validation.Progress = (float)i / items.Count * 100f;
                                }

                                if (_validation.Grf.IsModified)
                                {
                                    _validation.Progress = -1;
                                    _validation.Grf.QuickSave();
                                    _validation.Grf.Reload();
                                    _validation.Grf.Compact();
                                }
                            }
                            catch (OperationCanceledException) {
                            }
                            catch (Exception err) {
                                ErrorHandler.HandleException(err);
                            }
                            finally {
                                foreach (var db in dbs)
                                {
                                    _to <int>(db, _onEnd);
                                    _to <string>(db, _onEnd);
                                }

                                _validation.Grf.Close();
                                AProgress.Finalize(_validation);
                            }
                        }, _validation, 200, null, true, true));
                    };

                    menu.Items.Add(mitem);
                }

                item.ContextMenu        = menu;
                item.ContextMenu.IsOpen = true;
            }
            else
            {
                e.Handled = true;
            }
        }