protected void OnRenderToActionActivated(object sender, System.EventArgs e)
    {
        Gtk.FileChooserDialog fcd = new Gtk.FileChooserDialog("Render image to",
                                                              this,
                                                              FileChooserAction.Save,
                                                              "Cancel", ResponseType.Cancel,
                                                              "Render", ResponseType.Accept);
        // Adding image filters
        FileFilter[] ffs = new FileFilter[3];
        ffs[0] = new FileFilter();
        ffs[0].Name = "JPEG image";
        ffs[0].AddCustom(FileFilterFlags.Filename, delegate (Gtk.FileFilterInfo ffi) {
            return (System.IO.Path.GetExtension(ffi.Filename).ToLower() == ".jpg") ||
                   (System.IO.Path.GetExtension(ffi.Filename).ToLower() == ".jpeg");
        });

        ffs[1] = new FileFilter();
        ffs[1].Name = "PNG image";
        ffs[1].AddCustom(FileFilterFlags.Filename, delegate (Gtk.FileFilterInfo ffi) {
            return System.IO.Path.GetExtension(ffi.Filename).ToLower() == ".png";
        });

        ffs[2] = new FileFilter();
        ffs[2].Name = "Plain 24 bpp bitmap (BMP)";
        ffs[2].AddCustom(FileFilterFlags.Filename, delegate (Gtk.FileFilterInfo ffi) {
            return System.IO.Path.GetExtension(ffi.Filename).ToLower() == ".bmp";
        });

        fcd.AddFilter(ffs[0]);
        fcd.AddFilter(ffs[1]);
        fcd.AddFilter(ffs[2]);

        // Adding prescaling widget
        PreScaleSelectorWidget pssw = new PreScaleSelectorWidget();
        pssw.Value = mStage.Prescale;
        fcd.ExtraWidget = pssw;

        int prescale = 2;
        string dest_type = "", fn = "";
        bool accept = false;

        fcd.CurrentName = System.IO.Path.GetFileNameWithoutExtension(mStage.RawFileName);
        fcd.SetCurrentFolder(System.IO.Path.GetDirectoryName(mStage.RawFileName));

        if (fcd.Run() == (int)Gtk.ResponseType.Accept)
        {
            fn = fcd.Filename;
            prescale = pssw.Value;
            if (fcd.Filter == ffs[0])
            {
                if (System.IO.Path.GetExtension(fn).ToLower() != ".jpeg" &&
                    System.IO.Path.GetExtension(fn).ToLower() != ".jpg")
                    fn += ".jpeg";

                dest_type = "jpeg";
            }
            if (fcd.Filter == ffs[1])
            {
                if (System.IO.Path.GetExtension(fn).ToLower() != ".png")
                    fn += ".png";

                dest_type = "png";
            }
            if (fcd.Filter == ffs[2])
            {
                if (System.IO.Path.GetExtension(fn).ToLower() != ".bmp")
                    fn += ".bmp";

                dest_type = "bmp";
            }
            accept = true;
        }
        fcd.Destroy();

        if (accept)
        {
            // Sending remote command to add stage to queue
            string command = "AddToQueue_StageData";
            string[] arguments = new string[]
            {
                mStage.SaveStageToString(),
                mStage.RawFileName,
                fn,
                dest_type,
                prescale.ToString()
            };
            MainClass.RemoteControlService.SendCommand(RemoteControlService.PackCommand(command, arguments));

        }
    }
    /*
    public void LoadCEStage(string filename, bool findRawForCEStage)
    {
        try
        {
            mStage.LoadStage(filename);

            string raw_filename; int prescale = 2;
            if (mStage.Prescale != 0) prescale = mStage.Prescale;

            if (findRawForCEStage && MainClass.FindRawsForCestageAndAskToOpen(filename, out raw_filename, ref prescale))
            {
                mStage.AskLoadImage(raw_filename, prescale);
            }
        }
        catch (StageDeserializationException sdex)
        {
            Gtk.MessageDialog md = new Gtk.MessageDialog(
                this, DialogFlags.Modal,
                MessageType.Error, ButtonsType.Ok,
                false, "Can't load stage from the file \"{0}\".\n{1}", filename, sdex.Message);

            md.Title = MainClass.APP_NAME;

            md.Run();
            md.Destroy();
        }
    }
    */
    public bool ShowLoadImageDialog()
    {
        if (mStage.TheUIState == UIState.Loading)
        {
            Gtk.MessageDialog md = new Gtk.MessageDialog(this, DialogFlags.Modal,
                                                         MessageType.Error, ButtonsType.Ok,
                                                         "Loading is in progress");
            md.Title = MainClass.APP_NAME;
            md.Run();
            md.Destroy();
        }
        else
        {
            Gtk.FileChooserDialog fcd = new Gtk.FileChooserDialog("Open RAW image",
                                                                  this,
                                                                  FileChooserAction.Open,
                                                                  "Cancel", ResponseType.Cancel,
                                                                  "Open", ResponseType.Accept);

            // Filter for RAWs
            FileFilter ff = new FileFilter();

            ff.AddCustom(FileFilterFlags.Filename, delegate (Gtk.FileFilterInfo ffi) {
                return RawLoader.IsRaw(ffi.Filename);
            });
            ff.Name = "RAW image";

            fcd.AddFilter(ff);

            // Setting current folder to stage file folder or to RAW file folder
            if (mStage.StageFileName != null && mStage.StageFileName != ""
                    && !fcd.SetCurrentFolder(System.IO.Path.GetDirectoryName(mStage.StageFileName)))
                fcd.SetCurrentFolder(System.IO.Path.GetDirectoryName(mStage.RawFileName));

            // Adding preview widget

            ReceiptSelectorWidget rsw = new ReceiptSelectorWidget();
            RawPreviewWidget rpw = new RawPreviewWidget();

            // Adding options widget

            PreScaleSelectorWidget pssw = new PreScaleSelectorWidget();
            pssw.Value = 2;
            if (mStage.Prescale != 0) pssw.Value = mStage.Prescale;

            VBox preview_box = new VBox(false, 4);
            preview_box.PackStart(rpw, true, true, 0);
            preview_box.ShowAll();
            fcd.PreviewWidget = preview_box;

            HBox options_box = new HBox(false, 20);
            options_box.PackStart(rsw, true, true, 0);
            options_box.PackEnd(pssw, false, true, 0);
            fcd.ExtraWidget = options_box;
            options_box.ShowAll();

            // Adding events

            fcd.UpdatePreview += delegate {
                rpw.Filename = fcd.Filename;
            };
            fcd.SelectionChanged += delegate {
                rpw.Filename = fcd.Filename;
                rsw.RawFileName = fcd.Filename;
            };
            rpw.FileIsGoodChanged += delegate {
                options_box.Sensitive = rpw.FileIsGood;
                fcd.PreviewWidgetActive = rpw.FileIsGood;
            };

            if (mStage.RawFileName != null)
            {
                fcd.SetFilename(mStage.RawFileName);
                rpw.Filename = mStage.RawFileName;
                rsw.RawFileName = mStage.RawFileName;
                fcd.PreviewWidgetActive = rpw.FileIsGood;
                options_box.Sensitive = rpw.FileIsGood;
            }

            string filename = ""; int prescale = 2;
            bool ok = false;

            if (fcd.Run() == (int)Gtk.ResponseType.Accept)
            {
                ok = true;
                filename = fcd.Filename;
                prescale = pssw.Value;
            }

            fcd.Destroy();

            if (ok)
            {
                if (mStage.RawFileName != filename)
                {
                    mStage.AskLoadImage(filename, prescale);
                }
                mStage.LoadStage(rsw.SelectedReceiptFileName);
                return true;
            }
        }
        return false;
    }