diff options
Diffstat (limited to 'vncviewer/ServerDialog.cxx')
-rw-r--r-- | vncviewer/ServerDialog.cxx | 169 |
1 files changed, 152 insertions, 17 deletions
diff --git a/vncviewer/ServerDialog.cxx b/vncviewer/ServerDialog.cxx index 4f21eb1c..25a010a1 100644 --- a/vncviewer/ServerDialog.cxx +++ b/vncviewer/ServerDialog.cxx @@ -1,4 +1,5 @@ /* Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB + * Copyright 2012 Samuel Mannehed <samuel@cendio.se> for Cendio AB * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,35 +26,75 @@ #include <FL/Fl_Button.H> #include <FL/Fl_Return_Button.H> #include <FL/fl_draw.H> +#include <FL/fl_ask.H> +#include <FL/Fl_Box.H> +#include <FL/Fl_File_Chooser.H> #include "ServerDialog.h" #include "OptionsDialog.h" #include "fltk_layout.h" #include "i18n.h" #include "vncviewer.h" +#include "parameters.h" +#include "rfb/Exception.h" ServerDialog::ServerDialog() - : Fl_Window(400, 112, _("VNC Viewer: Connection Details")) + : Fl_Window(450, 160, _("VNC Viewer: Connection Details")) { - int width; + int x, y; Fl_Button *button; + Fl_Box *divider; - width = gui_str_len(_("VNC server:")); - serverName = new Fl_Input(20 + width, 20, w() - 20*2 - width, 25, _("VNC server:")); + int margin = 20; + int server_label_width = gui_str_len(_("VNC server:")); - width = (w() - 20) / 4; + x = margin + server_label_width; + y = margin; + + serverName = new Fl_Input(x, y, w() - margin*2 - server_label_width, INPUT_HEIGHT, _("VNC server:")); - button = new Fl_Button(20 + width*0, 20+25+20, width - 20, 27, _("About...")); - button->callback(this->handleAbout, this); + int adjust = (w() - 20) / 4; + int button_width = adjust - margin/2; + + x = margin; + y = margin + margin/2 + INPUT_HEIGHT; + + y += margin/2; - button = new Fl_Button(20 + width*1, 20+25+20, width - 20, 27, _("Options...")); + button = new Fl_Button(x, y, button_width, BUTTON_HEIGHT, _("Options...")); button->callback(this->handleOptions, this); + + x += adjust; + + button = new Fl_Button(x, y, button_width, BUTTON_HEIGHT, _("Load...")); + button->callback(this->handleLoad, this); + + x += adjust; + + button = new Fl_Button(x, y, button_width, BUTTON_HEIGHT, _("Save As...")); + button->callback(this->handleSaveAs, this); + + x = 0; + y += margin/2 + BUTTON_HEIGHT; + + divider = new Fl_Box(x, y, w(), 2); + divider->box(FL_THIN_DOWN_FRAME); + + x += margin; + y += margin/2; + + button = new Fl_Button(x, y, button_width, BUTTON_HEIGHT, _("About...")); + button->callback(this->handleAbout, this); + + x = w() - margin - adjust - button_width - 20; - button = new Fl_Button(20 + width*2, 20+25+20, width - 20, 27, _("Cancel")); + button = new Fl_Button(x, y, button_width, BUTTON_HEIGHT, _("Cancel")); button->callback(this->handleCancel, this); - button = new Fl_Return_Button(20 + width*3, 20+25+20, width - 20, 27, _("OK")); - button->callback(this->handleOK, this); + x += adjust; + + button = new Fl_Return_Button(x, y, button_width+20, BUTTON_HEIGHT, _("Connect")); + button->callback(this->handleConnect, this); callback(this->handleCancel, this); @@ -66,11 +107,13 @@ ServerDialog::~ServerDialog() } -const char *ServerDialog::run() +const char *ServerDialog::run(const char* servername) { ServerDialog dialog; static char buffer[256]; + dialog.serverName->value(servername); + dialog.show(); while (dialog.shown()) Fl::wait(); @@ -83,16 +126,101 @@ const char *ServerDialog::run() return buffer; } +void ServerDialog::handleOptions(Fl_Widget *widget, void *data) +{ + OptionsDialog::showDialog(); +} -void ServerDialog::handleAbout(Fl_Widget *widget, void *data) + +void ServerDialog::handleLoad(Fl_Widget *widget, void *data) { - about_vncviewer(); + ServerDialog *dialog = (ServerDialog*)data; + Fl_File_Chooser* file_chooser = new Fl_File_Chooser("", "TigerVNC configuration (*.tigervnc)", + 0, "Select a TigerVNC configuration file"); + file_chooser->preview(0); + file_chooser->previewButton->hide(); + file_chooser->show(); + + // Block until user picks something. + while(file_chooser->shown()) + Fl::wait(); + + // Did the user hit cancel? + if (file_chooser->value() == NULL) { + delete(file_chooser); + return; + } + + const char* filename = strdup(file_chooser->value()); + + try { + dialog->serverName->value(loadViewerParameters(filename)); + } catch (rfb::Exception& e) { + fl_alert("%s", e.str()); + } + + delete(file_chooser); } -void ServerDialog::handleOptions(Fl_Widget *widget, void *data) +void ServerDialog::handleSaveAs(Fl_Widget *widget, void *data) +{ + ServerDialog *dialog = (ServerDialog*)data; + const char* servername = strdup(dialog->serverName->value()); + char* filename; + + Fl_File_Chooser* file_chooser = new Fl_File_Chooser("", "TigerVNC configuration (*.tigervnc)", + 2, "Save the TigerVNC configuration to file"); + + file_chooser->preview(0); + file_chooser->previewButton->hide(); + file_chooser->show(); + + while(1) { + + // Block until user picks something. + while(file_chooser->shown()) + Fl::wait(); + + // Did the user hit cancel? + if (file_chooser->value() == NULL) { + delete(file_chooser); + return; + } + + filename = strdup(file_chooser->value()); + + FILE* f = fopen(filename, "r"); + if (f) { + + // The file already exists. + fclose(f); + int overwrite_choice = fl_choice("%s already exists. Do you want to overwrite?", + "Overwrite", "No", NULL, filename); + if (overwrite_choice == 1) { + + // If the user doesn't want to overwrite: + file_chooser->show(); + continue; + } + } + + break; + } + + try { + saveViewerParameters(filename, servername); + } catch (rfb::Exception& e) { + fl_alert("%s", e.str()); + } + + delete(file_chooser); +} + + +void ServerDialog::handleAbout(Fl_Widget *widget, void *data) { - OptionsDialog::showDialog(); + about_vncviewer(); } @@ -105,9 +233,16 @@ void ServerDialog::handleCancel(Fl_Widget *widget, void *data) } -void ServerDialog::handleOK(Fl_Widget *widget, void *data) +void ServerDialog::handleConnect(Fl_Widget *widget, void *data) { ServerDialog *dialog = (ServerDialog*)data; + const char* servername = strdup(dialog->serverName->value()); dialog->hide(); + + try { + saveViewerParameters(NULL, servername); + } catch (rfb::Exception& e) { + fl_alert("%s", e.str()); + } } |