private void SelectSourceButton_Click(object sender, EventArgs e)
        {
            string fileName;

            using (var op = new OpenFileDialog {
                Filter = Consts.BitmapImportFilter
            })
            {
                if (op.ShowDialog() != DialogResult.OK)
                {
                    return;
                }
                fileName = op.FileName;
            }

            try
            {
                if (m_originalBitmap != null)
                {
                    m_originalBitmap.Dispose();
                }
                m_originalBitmap = BitmapProcessor.LoadBitmapFromFile(fileName);

                if (m_originalBitmap.Width > 2048 || m_originalBitmap.Height > 2048)
                {
                    if (m_monochromeBitmap != null)
                    {
                        m_monochromeBitmap.Dispose();
                        m_monochromeBitmap = null;
                    }

                    SourceTextBox.Clear();
                    ResizeContainerPanel.Enabled     = false;
                    ConversionContainerPanel.Enabled = false;

                    m_doNotUpdateMonochrome = true;
                    NewWidthUpDown.Value    = m_width = (int)NewWidthUpDown.Minimum;
                    NewHeightUpDown.Value   = m_height = (int)NewHeightUpDown.Minimum;
                    m_doNotUpdateMonochrome = false;

                    ImagePreviewSurface.Invalidate();

                    OkButton.Enabled = false;
                    InfoBox.Show("Selected images is too big. Choose an image that has dimension lower than 2048x2048.");
                }
                else
                {
                    SourceTextBox.Text = fileName;
                    ConversionContainerPanel.Enabled = true;

                    if (m_importMode)
                    {
                        NewWidthUpDown.Value  = m_width = m_desireWidth;
                        NewHeightUpDown.Value = m_height = m_desireHeight;
                    }
                    else
                    {
                        ResizeContainerPanel.Enabled = true;

                        m_doNotUpdateMonochrome = true;
                        NewWidthUpDown.Value    = m_width = m_originalBitmap.Width;
                        NewHeightUpDown.Value   = m_height = m_originalBitmap.Height;
                        m_doNotUpdateMonochrome = false;
                    }

                    CreateMonochromeBitmap();
                    ImagePreviewSurface.Invalidate();

                    OkButton.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                InfoBox.Show("An error occured during opening image file!\n" + ex.Message);
            }
        }
        private void InitializeControls(bool importMode, int?desireWidth, int?desireHeight)
        {
            if (importMode)
            {
                if (!desireWidth.HasValue)
                {
                    throw new ArgumentNullException("desireWidth");
                }
                if (!desireHeight.HasValue)
                {
                    throw new ArgumentNullException("desireHeight");
                }

                NewWidthUpDown.Value  = m_width = m_desireWidth = desireWidth.Value;
                NewHeightUpDown.Value = m_height = m_desireHeight = desireHeight.Value;

                ResizeContainerPanel.Enabled = false;

                OkButton.Text         = @"Import";
                OkButton.DialogResult = DialogResult.OK;
            }
            else
            {
                OkButton.Click += OkButton_Click;
            }

            ConversionTypeComboBox.Items.AddRange(new object[]
            {
                new NamedItemContainer <MonochromeConversionMode>("Floyd Steinberg Dithering", MonochromeConversionMode.FloydSteinbergDithering),
                new NamedItemContainer <MonochromeConversionMode>("Threshold based", MonochromeConversionMode.ThresholdBased)
            });
            ConversionTypeComboBox.SelectedIndex = 0;

            SelectSourceButton.Click    += SelectSourceButton_Click;
            NewWidthUpDown.ValueChanged += (s, e) =>
            {
                m_width = (int)NewWidthUpDown.Value;

                Safe.Execute(() =>
                {
                    CreateMonochromeBitmap();
                    ImagePreviewSurface.Invalidate();
                });
            };
            NewHeightUpDown.ValueChanged += (s, e) =>
            {
                m_height = (int)NewHeightUpDown.Value;

                Safe.Execute(() =>
                {
                    CreateMonochromeBitmap();
                    ImagePreviewSurface.Invalidate();
                });
            };
            JoyetechSizeButton.Click += JoyetechSizeButton_Click;

            ConversionTypeComboBox.SelectedIndexChanged += (s, e) =>
            {
                var item = (NamedItemContainer <MonochromeConversionMode>)ConversionTypeComboBox.SelectedItem;
                ThresholdUpDown.Enabled = item.Data == MonochromeConversionMode.ThresholdBased;

                Safe.Execute(() =>
                {
                    CreateMonochromeBitmap();
                    ImagePreviewSurface.Invalidate();
                });
            };
            ThresholdUpDown.ValueChanged += (s, e) =>
            {
                Safe.Execute(() =>
                {
                    CreateMonochromeBitmap();
                    ImagePreviewSurface.Invalidate();
                });
            };

            ImagePreviewSurface.Paint += ImagePreviewSurface_Paint;
            Disposed += (s, e) =>
            {
                if (m_originalBitmap != null)
                {
                    m_originalBitmap.Dispose();
                }
                if (m_monochromeBitmap != null)
                {
                    m_monochromeBitmap.Dispose();
                }
            };
        }
        private void InitializeControls()
        {
            ConversionTypeComboBox.Items.AddRange(new object[]
            {
                new NamedItemContainer <MonochromeConversionMode>("Floyd Steinberg Dithering", MonochromeConversionMode.FloydSteinbergDithering),
                new NamedItemContainer <MonochromeConversionMode>("Threshold based", MonochromeConversionMode.ThresholdBased)
            });
            ConversionTypeComboBox.SelectedIndex = 0;

            SelectSourceButton.Click    += SelectSourceButton_Click;
            NewWidthUpDown.ValueChanged += (s, e) =>
            {
                m_width = (int)NewWidthUpDown.Value;

                Safe.Execute(() =>
                {
                    CreateMonochromeBitmap();
                    ImagePreviewSurface.Invalidate();
                });
            };
            NewHeightUpDown.ValueChanged += (s, e) =>
            {
                m_height = (int)NewHeightUpDown.Value;

                Safe.Execute(() =>
                {
                    CreateMonochromeBitmap();
                    ImagePreviewSurface.Invalidate();
                });
            };
            JoyetechSizeButton.Click += JoyetechSizeButton_Click;

            ConversionTypeComboBox.SelectedIndexChanged += (s, e) =>
            {
                var item = (NamedItemContainer <MonochromeConversionMode>)ConversionTypeComboBox.SelectedItem;
                ThresholdUpDown.Enabled = item.Data == MonochromeConversionMode.ThresholdBased;

                Safe.Execute(() =>
                {
                    CreateMonochromeBitmap();
                    ImagePreviewSurface.Invalidate();
                });
            };
            ThresholdUpDown.ValueChanged += (s, e) =>
            {
                Safe.Execute(() =>
                {
                    CreateMonochromeBitmap();
                    ImagePreviewSurface.Invalidate();
                });
            };

            OkButton.Click += OkButton_Click;

            ImagePreviewSurface.Paint += ImagePreviewSurface_Paint;
            Disposed += (s, e) =>
            {
                if (m_originalBitmap != null)
                {
                    m_originalBitmap.Dispose();
                }
                if (m_monochromeBitmap != null)
                {
                    m_monochromeBitmap.Dispose();
                }
            };
        }