private void LoadEditStep(EditableOperationBatchStep step)
        {
            currentStep = step;
            imageSource1.CurrentImage = batch.Images[step.Source1];
            imageOpResult.CurrentImage = batch.Images[step.OperationResult];
            LoadImageOperationControl(step.ImageOperation);
            //LoadControlList();

            Invalidate(true);
        }
        private void InitializeEditor(EditableOperationBatch batch)
        {
            buttonEditStep.Text = "Choose Step";
            buttonEditStep.Enabled = true;
            LoadChooseStep();
            imageFixedResult.CurrentImage = batch.ImageResult;
            imageFixedResult.CurrentImage.FinishWriting();
            imageSource1.CurrentImage = null;
            imageSource2.CurrentImage = null;
            imageOpResult.CurrentImage = null;
            currentStep = null;

            Invalidate(true);
        }
        internal static EditableOperationBatchStep FromSerialization(string serialization)
        {
            EditableOperationBatchStep step = new EditableOperationBatchStep(EditableOperationBatch.currentBatch);
            string[] parts = serialization.Split(':');
            string resultKey = parts[0];
            string src1 = parts[1];
            string src2 = parts[2];
            string op = parts[3];

            step.source1 = src1;
            if (src2 != " ")
                step.source2 = src2;
            step.imageOperation = ImageOperation.LoadFromSerializationBase(op);
            step.ImageOperation.ImageOperator.Source = step.batch.Images[src1];
            if (step.source2 != null)
                ((DualImageOperator)step.imageOperation.ImageOperator).Source2 = step.batch.Images[src2];
            DataImage resultImage = step.imageOperation.ProcessImage();
            step.operationResult = resultKey;
            step.batch.Images.Add(resultKey, resultImage);
            return step;
        }
        private void buttonReset_Click(object sender, EventArgs e)
        {
            ShowList(true);

            if (buttonReset.Text == "Reset")
            {
                buttonEditStep.Enabled = false;
                imageFixedResult.CurrentImage = null;
                imageSource1.CurrentImage = null;
                imageSource2.CurrentImage = null;
                imageOpResult.CurrentImage = null;
                panelControl.Controls.Clear();
                list.Items.Clear();
                batch = null;
                currentStep = null;
                foreach (KeyValuePair<string, DataImage> pair in NuzzoliloImageFiddler.Instance.OpenImages)
                {
                    list.Items.Add(pair.Key);
                }
                buttonReset.Text = "Choose Image";
                Invalidate(true);
            }
            else if (buttonReset.Text == "Choose Image")
            {
                if (list.SelectedItem != null)
                {
                    DataImage currentImage = NuzzoliloImageFiddler.Instance.OpenImages[list.SelectedItem.ToString()];
                    InitializeEditor(currentImage);
                    buttonReset.Text = "Reset";
                    buttonEditStep.Enabled = true;
                }
            }
            Invalidate(true);
        }
        //Recursive
        EditableOperationBatchStep AddBatchStep(DataImage image)
        {
            EditableOperationBatchStep step = new EditableOperationBatchStep(this, image);
            if (steps.Contains(step))
                return null; //already added

            if (image.ResultOf == null)
            {
                imageSource = image;
                return null; //do not add step for first image since there is no step for first image
            }

            EditableOperationBatchStep stepTemp = AddBatchStep(image.ResultOf.Source);
            if (stepTemp != null)
                steps.Add(stepTemp);

            //if (typeof(DualImageOperator).IsAssignableFrom(image.ResultOf.GetType()))
            //{
                try
                {
                    DualImageOperator d = (DualImageOperator)image.ResultOf;
                    stepTemp = AddBatchStep(((DualImageOperator)image.ResultOf).Source2);
                    if (stepTemp != null)
                        steps.Add(stepTemp);
                }
                catch (Exception)
                {
                }
               // }

            return step;
        }