public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { var editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); if (editorService != null) { IDisposable subscription = null; var source = GetDataSource(context, provider); var chart = new ChartPanel(source, provider); chart.ClientSize = new System.Drawing.Size(320, 180); var matVisualizer = new MatVisualizer(); matVisualizer.OverlayChannels = false; matVisualizer.SelectedChannels = (int[])value; matVisualizer.Load(chart); var visualizerObservable = matVisualizer.Visualize(source.Output, chart); chart.HandleCreated += delegate { subscription = visualizerObservable.Subscribe(); }; chart.Leave += delegate { editorService.CloseDropDown(); subscription.Dispose(); }; try { editorService.DropDownControl(chart); } finally { chart.Dispose(); matVisualizer.Unload(); } return(matVisualizer.SelectedChannels); } return(base.EditValue(context, provider, value)); }
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) { var editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); if (editorService != null) { var subscription = default(IDisposable); var propertyDescriptor = context.PropertyDescriptor; var source = GetDataSource(context, provider); var chart = new ChartPanel(source, provider); chart.Dock = DockStyle.Fill; var autoSetButton = new Button { Text = AutoStart }; autoSetButton.Dock = DockStyle.Fill; var autoSetButtonClicked = Observable.FromEventPattern <EventHandler, EventArgs>( handler => autoSetButton.Click += handler, handler => autoSetButton.Click -= handler); var autoSetDeviationLabel = new Label(); autoSetDeviationLabel.Dock = DockStyle.Fill; autoSetDeviationLabel.Text = DeviationLabel; autoSetDeviationLabel.TextAlign = ContentAlignment.MiddleCenter; var autoSetDeviationUpDown = new NumericUpDown(); var upDownMargin = autoSetDeviationUpDown.Margin; autoSetDeviationUpDown.Margin = new Padding(upDownMargin.Left, upDownMargin.Top + 1, upDownMargin.Right, upDownMargin.Bottom); autoSetDeviationUpDown.Anchor = AnchorStyles.None; var autoSetPanel = new TableLayoutPanel(); autoSetPanel.Dock = DockStyle.Top; autoSetPanel.Height = autoSetButton.Height + autoSetPanel.Margin.Top; autoSetPanel.GrowStyle = TableLayoutPanelGrowStyle.AddColumns; autoSetPanel.Controls.Add(autoSetDeviationLabel, 0, 0); autoSetPanel.Controls.Add(autoSetDeviationUpDown, 1, 0); autoSetPanel.Controls.Add(autoSetButton, 2, 0); autoSetPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, autoSetDeviationLabel.PreferredWidth + autoSetPanel.Margin.Left + autoSetPanel.Margin.Right)); autoSetPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, autoSetDeviationUpDown.PreferredSize.Width)); autoSetPanel.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); autoSetDeviationUpDown.Maximum = 99; autoSetDeviationUpDown.Minimum = -99; var editorPanel = new TableLayoutPanel(); editorPanel.ClientSize = new System.Drawing.Size(320, 320); editorPanel.RowCount = 2; editorPanel.ColumnCount = 1; editorPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 99)); editorPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize)); editorPanel.Controls.Add(chart); editorPanel.Controls.Add(autoSetPanel); var activeVisualizer = provider.GetService(typeof(DialogTypeVisualizer)) as SpikeWaveformCollectionVisualizer; var spikeVisualizer = new MatVisualizer <WaveformThresholdPicker>(); if (activeVisualizer != null) { spikeVisualizer.AutoScaleX = activeVisualizer.AutoScaleX; spikeVisualizer.AutoScaleY = activeVisualizer.AutoScaleY; spikeVisualizer.ChannelOffset = activeVisualizer.ChannelOffset; spikeVisualizer.ChannelsPerPage = activeVisualizer.ChannelsPerPage; spikeVisualizer.HistoryLength = activeVisualizer.HistoryLength; spikeVisualizer.OverlayChannels = activeVisualizer.OverlayChannels; spikeVisualizer.SelectedChannels = activeVisualizer.SelectedChannels; spikeVisualizer.SelectedPage = activeVisualizer.SelectedPage; spikeVisualizer.WaveformBufferLength = activeVisualizer.WaveformBufferLength; spikeVisualizer.XMax = activeVisualizer.XMax; spikeVisualizer.XMin = activeVisualizer.XMin; spikeVisualizer.YMax = activeVisualizer.YMax; spikeVisualizer.YMin = activeVisualizer.YMin; } else { spikeVisualizer.OverlayChannels = false; spikeVisualizer.WaveformBufferLength = 10; } spikeVisualizer.Load(chart); var thresholdPicker = spikeVisualizer.Graph; thresholdPicker.Threshold = (double[])value; thresholdPicker.ThresholdChanged += (sender, e) => propertyDescriptor.SetValue(context.Instance, value = thresholdPicker.Threshold); var visualizerObservable = spikeVisualizer.Visualize(source.Output, chart); var autoSetObservable = AutoThreshold(source.Output, autoSetButtonClicked, () => (double)autoSetDeviationUpDown.Value) .Do(ts => propertyDescriptor.SetValue(context.Instance, value = thresholdPicker.Threshold = ts)); chart.HandleCreated += delegate { subscription = new CompositeDisposable(visualizerObservable.Subscribe(), autoSetObservable.Subscribe()); }; editorPanel.Leave += delegate { editorService.CloseDropDown(); subscription.Dispose(); }; autoSetButton.Click += delegate { autoSetButton.Text = autoSetButton.Text == AutoStart ? AutoStop : AutoStart; }; try { editorService.DropDownControl(editorPanel); } finally { chart.Dispose(); autoSetButton.Dispose(); editorPanel.Dispose(); spikeVisualizer.Unload(); } return(value); } return(base.EditValue(context, provider, value)); }