From a6163888f3c56123b1db313743c6147ba498732c Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Fri, 8 Aug 2014 14:42:07 +0300 Subject: Add third_party libs --- third_party/windows/fltk-1.1.10/src/fl_ask.cxx | 396 +++++++++++++++++++++++++ 1 file changed, 396 insertions(+) create mode 100644 third_party/windows/fltk-1.1.10/src/fl_ask.cxx (limited to 'third_party/windows/fltk-1.1.10/src/fl_ask.cxx') diff --git a/third_party/windows/fltk-1.1.10/src/fl_ask.cxx b/third_party/windows/fltk-1.1.10/src/fl_ask.cxx new file mode 100644 index 0000000..8328566 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_ask.cxx @@ -0,0 +1,396 @@ +// +// "$Id: fl_ask.cxx 6870 2009-09-13 22:02:30Z AlbrechtS $" +// +// Standard dialog functions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Implementation of fl_message, fl_ask, fl_choice, fl_input +// The three-message fl_show_x functions are for forms compatibility +// mostly. In most cases it is easier to get a multi-line message +// by putting newlines in the message. + +#include +#include +#include "flstring.h" + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +static Fl_Window *message_form; +static Fl_Box *message; +static Fl_Box *icon; +static Fl_Button *button[3]; +static Fl_Input *input; +static const char *iconlabel = "?"; +Fl_Font fl_message_font_ = FL_HELVETICA; +uchar fl_message_size_ = 14; + +static char avoidRecursion = 0; + +static Fl_Window *makeform() { + if (message_form) { + message_form->size(410,103); + return message_form; + } + // make sure that the dialog does not become the child of some + // current group + Fl_Group *previously_current_group = Fl_Group::current(); + Fl_Group::current(0); + // create a new top level window + Fl_Window *w = message_form = new Fl_Window(410,103,""); + // w->clear_border(); + // w->box(FL_UP_BOX); + (message = new Fl_Box(60, 25, 340, 20)) + ->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_WRAP); + (input = new Fl_Input(60, 37, 340, 23))->hide(); + {Fl_Box* o = icon = new Fl_Box(10, 10, 50, 50); + o->box(FL_THIN_UP_BOX); + o->labelfont(FL_TIMES_BOLD); + o->labelsize(34); + o->color(FL_WHITE); + o->labelcolor(FL_BLUE); + } + button[0] = new Fl_Button(310, 70, 90, 23); + button[0]->shortcut(FL_Escape); + button[0]->align(FL_ALIGN_INSIDE|FL_ALIGN_WRAP); + button[1] = new Fl_Return_Button(210, 70, 90, 23); + button[1]->align(FL_ALIGN_INSIDE|FL_ALIGN_WRAP); + button[2] = new Fl_Button(110, 70, 90, 23); + button[2]->align(FL_ALIGN_INSIDE|FL_ALIGN_WRAP); + w->resizable(new Fl_Box(60,10,110-60,27)); + w->end(); + w->set_modal(); + Fl_Group::current(previously_current_group); + return w; +} + +/* + * 'resizeform()' - Resize the form and widgets so that they hold everything + * that is asked of them... + */ + +void resizeform() { + int i; + int message_w, message_h; + int text_height; + int button_w[3], button_h[3]; + int x, w, h, max_w, max_h; + const int icon_size = 50; + + fl_font(fl_message_font_, fl_message_size_); + message_w = message_h = 0; + fl_measure(message->label(), message_w, message_h); + + message_w += 10; + message_h += 10; + if (message_w < 340) + message_w = 340; + if (message_h < 30) + message_h = 30; + + fl_font(button[0]->labelfont(), button[0]->labelsize()); + + memset(button_w, 0, sizeof(button_w)); + memset(button_h, 0, sizeof(button_h)); + + for (max_h = 25, i = 0; i < 3; i ++) + if (button[i]->visible()) + { + fl_measure(button[i]->label(), button_w[i], button_h[i]); + + if (i == 1) + button_w[1] += 20; + + button_w[i] += 30; + button_h[i] += 10; + + if (button_h[i] > max_h) + max_h = button_h[i]; + } + + if (input->visible()) text_height = message_h + 25; + else text_height = message_h; + + max_w = message_w + 10 + icon_size; + w = button_w[0] + button_w[1] + button_w[2] - 10; + + if (w > max_w) + max_w = w; + + message_w = max_w - 10 - icon_size; + + w = max_w + 20; + h = max_h + 30 + text_height; + + message_form->size(w, h); + message_form->size_range(w, h, w, h); + + message->resize(20 + icon_size, 10, message_w, message_h); + icon->resize(10, 10, icon_size, icon_size); + icon->labelsize((uchar)(icon_size - 10)); + input->resize(20 + icon_size, 10 + message_h, message_w, 25); + + for (x = w, i = 0; i < 3; i ++) + if (button_w[i]) + { + x -= button_w[i]; + button[i]->resize(x, h - 10 - max_h, button_w[i] - 10, max_h); + +// printf("button %d (%s) is %dx%d+%d,%d\n", i, button[i]->label(), +// button[i]->w(), button[i]->h(), +// button[i]->x(), button[i]->y()); + } +} + +static int innards(const char* fmt, va_list ap, + const char *b0, + const char *b1, + const char *b2) +{ + Fl::pushed(0); // stop dragging (STR #2159) + + avoidRecursion = 1; + + makeform(); + char buffer[1024]; + if (!strcmp(fmt,"%s")) { + message->label(va_arg(ap, const char*)); + } else { + //: matt: MacOS provides two equally named vsnprintf's... + ::vsnprintf(buffer, 1024, fmt, ap); + message->label(buffer); + } + + message->labelfont(fl_message_font_); + message->labelsize(fl_message_size_); + if (b0) {button[0]->show(); button[0]->label(b0); button[1]->position(210,70);} + else {button[0]->hide(); button[1]->position(310,70);} + if (b1) {button[1]->show(); button[1]->label(b1);} + else button[1]->hide(); + if (b2) {button[2]->show(); button[2]->label(b2);} + else button[2]->hide(); + const char* prev_icon_label = icon->label(); + if (!prev_icon_label) icon->label(iconlabel); + + resizeform(); + + if (button[1]->visible() && !input->visible()) + button[1]->take_focus(); + message_form->hotspot(button[0]); + if (b0 && Fl_Widget::label_shortcut(b0)) + button[0]->shortcut(0); + else + button[0]->shortcut(FL_Escape); + + message_form->show(); + // deactivate Fl::grab(), because it is incompatible with Fl::readqueue() + Fl_Window* g = Fl::grab(); + if (g) Fl::grab(0); + int r = 0; + for (;;) { + Fl_Widget *o = Fl::readqueue(); + if (!o) Fl::wait(); + else if (o == button[0]) {r = 0; break;} + else if (o == button[1]) {r = 1; break;} + else if (o == button[2]) {r = 2; break;} + else if (o == message_form) {r = 0; break;} + } + if (g) // regrab the previous popup menu, if there was one + Fl::grab(g); + message_form->hide(); + icon->label(prev_icon_label); + + avoidRecursion = 0; + return r; +} + +// pointers you can use to change FLTK to a foreign language: +const char* fl_no = "No"; +const char* fl_yes= "Yes"; +const char* fl_ok = "OK"; +const char* fl_cancel= "Cancel"; +const char* fl_close= "Close"; + +// fltk functions: +void fl_beep(int type) { +#ifdef WIN32 + switch (type) { + case FL_BEEP_QUESTION : + case FL_BEEP_PASSWORD : + MessageBeep(MB_ICONQUESTION); + break; + case FL_BEEP_MESSAGE : + MessageBeep(MB_ICONASTERISK); + break; + case FL_BEEP_NOTIFICATION : + MessageBeep(MB_ICONASTERISK); + break; + case FL_BEEP_ERROR : + MessageBeep(MB_ICONERROR); + break; + default : + MessageBeep(0xFFFFFFFF); + break; + } +#elif defined(__APPLE__) + switch (type) { + case FL_BEEP_DEFAULT : + case FL_BEEP_ERROR : + SysBeep(30); + break; + default : + break; + } +#else + switch (type) { + case FL_BEEP_DEFAULT : + case FL_BEEP_ERROR : + if (!fl_display) fl_open_display(); + + XBell(fl_display, 100); + break; + default : + if (!fl_display) fl_open_display(); + + XBell(fl_display, 50); + break; + } +#endif // WIN32 +} + +void fl_message(const char *fmt, ...) { + + if (avoidRecursion) return; + + va_list ap; + + fl_beep(FL_BEEP_MESSAGE); + + va_start(ap, fmt); + iconlabel = "i"; + innards(fmt, ap, 0, fl_close, 0); + va_end(ap); + iconlabel = "?"; +} + +void fl_alert(const char *fmt, ...) { + + if (avoidRecursion) return; + + va_list ap; + + fl_beep(FL_BEEP_ERROR); + + va_start(ap, fmt); + iconlabel = "!"; + innards(fmt, ap, 0, fl_close, 0); + va_end(ap); + iconlabel = "?"; +} + +int fl_ask(const char *fmt, ...) { + + if (avoidRecursion) return 0; + + va_list ap; + + fl_beep(FL_BEEP_QUESTION); + + va_start(ap, fmt); + int r = innards(fmt, ap, fl_no, fl_yes, 0); + va_end(ap); + + return r; +} + +int fl_choice(const char*fmt,const char *b0,const char *b1,const char *b2,...){ + + if (avoidRecursion) return 0; + + va_list ap; + + fl_beep(FL_BEEP_QUESTION); + + va_start(ap, b2); + int r = innards(fmt, ap, b0, b1, b2); + va_end(ap); + return r; +} + +Fl_Widget *fl_message_icon() {makeform(); return icon;} + +static const char* input_innards(const char* fmt, va_list ap, + const char* defstr, uchar type) { + makeform(); + message->position(60,10); + input->type(type); + input->show(); + input->value(defstr); + input->take_focus(); + + int r = innards(fmt, ap, fl_cancel, fl_ok, 0); + input->hide(); + message->position(60,25); + return r ? input->value() : 0; +} + +const char* fl_input(const char *fmt, const char *defstr, ...) { + + if (avoidRecursion) return 0; + + fl_beep(FL_BEEP_QUESTION); + + va_list ap; + va_start(ap, defstr); + const char* r = input_innards(fmt, ap, defstr, FL_NORMAL_INPUT); + va_end(ap); + return r; +} + +const char *fl_password(const char *fmt, const char *defstr, ...) { + + if (avoidRecursion) return 0; + + fl_beep(FL_BEEP_PASSWORD); + + va_list ap; + va_start(ap, defstr); + const char* r = input_innards(fmt, ap, defstr, FL_SECRET_INPUT); + va_end(ap); + return r; +} + +// +// End of "$Id: fl_ask.cxx 6870 2009-09-13 22:02:30Z AlbrechtS $". +// -- cgit v1.3.1