private void KernelEdit_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                Tuple<Border, int> kernel = GetSelectedKernel(_kernelContextMenu.PlacementTarget);
                if (kernel == null)
                {
                    MessageBox.Show("Couldn't identify filter", this.Title, MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                ConvolutionBase2D selected = _kernels[kernel.Item2];

                if (selected is Convolution2D)
                {
                    #region Single

                    ImageFilterPainter editor = new ImageFilterPainter();

                    editor.SaveRequested += Painter_SaveRequested;
                    editor.Closed += Child_Closed;

                    _childWindows.Add(editor);

                    editor.EditKernel((Convolution2D)selected);

                    editor.Show();

                    #endregion
                }
                else if (selected is ConvolutionSet2D)
                {
                    #region Set

                    CompositeFilter composite = new CompositeFilter((ConvolutionSet2D)selected)
                    {
                        // I don't want this one on top
                        //Owner = this,       // setting this so it stays on top of this window
                    };

                    composite.SaveRequested += Composite_SaveRequested;
                    composite.Closed += Child_Closed;

                    _childWindows.Add(composite);

                    composite.Show();

                    #endregion
                }
                else
                {
                    MessageBox.Show("Unknown type of kernel: " + _kernels[kernel.Item2].GetType().ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void EditConvolution(FeatureRecognizer_Extract extract)
        {
            ImageFilterPainter viewer = new ImageFilterPainter();

            viewer.Closed += Child_Closed;
            viewer.SaveRequested += Painter_SaveRequested;

            _childWindows.Add(viewer);

            viewer.Tag = extract;
            viewer.EditKernel((Convolution2D)extract.Extracts[0].Extract);      // give it the highest resolution one

            viewer.Show();
        }
        private void NewFilter_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                ImageFilterPainter painter = new ImageFilterPainter();

                painter.SaveRequested += Painter_SaveRequested;
                painter.Closed += Child_Closed;

                _childWindows.Add(painter);

                painter.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void ViewConvolution(Convolution2D convolution)
        {
            ImageFilterPainter viewer = new ImageFilterPainter();

            viewer.Closed += Child_Closed;

            _childWindows.Add(viewer);

            viewer.ViewKernel(convolution);

            viewer.Show();
        }