static void clickColor(control c, int argument) { int element = cmatch(gettext(guielement), GuiElementNames); dialogColors[element] = nametorgb(ColorName[argument]); setforeground(guisample, dialogColors[whichfg[element]]); setbackground(guisample, dialogColors[whichbg[element]]); }
radiobutton newradiobutton(char *text, rect r, actionfn fn) { radiobutton obj = newchildwin("button", text, BS_RADIOBUTTON, r, fn); if (obj) { obj->kind = RadioObject; setbackground(obj, getbackground(parentwindow(obj))); } return obj; }
checkbox newcheckbox(char *text, rect r, actionfn fn) { checkbox obj = newchildwin("button", text, BS_CHECKBOX, r, fn); if (obj) { obj->kind = CheckboxObject; setbackground(obj, getbackground(parentwindow(obj))); } return obj; }
char *askUserPass(const char *title) { static window win = NULL; dialog_data *d; window prev = current_window; if (! win) { int tw, bw, h, middle; tw = strwidth(SystemFont, G_("Cancel")) * 8; h = getheight(SystemFont); if (tw < 150) tw = 150; win = newwindow(title, rect(0, 0, tw+30, h*9+12), Titlebar | Centered | Modal); setbackground(win, dialog_bg()); add_data(win); d = data(win); d->question = newlabel(G_("User"), rect(10, h, tw+4, h*2+2), AlignLeft); bw = strwidth(SystemFont, G_("Password")); d->text = newfield("", rect(20+bw, h, tw-6-bw, h*3/2)); newlabel(_("Password"), rect(10, h*4, tw+4, h*2+2), AlignLeft); d->pass = newpassword("", rect(20+bw, h*4, tw-6-bw, h*3/2)); middle = (tw+30)/2; bw = strwidth(SystemFont, G_("Cancel")) * 3/2; d->yes = newbutton(G_("OK"), rect(middle-bw-10, h*7, bw, h+10), hit_button); setvalue(d->yes, YES); d->cancel = newbutton(G_("Cancel"), rect(middle+10, h*7, bw, h+10), hit_button); setvalue(d->cancel, CANCEL); setkeydown(win, hit_key); } else { d = data(win); settext(d->text, ""); settext(d->pass, ""); } if (TopmostDialogs & MB_TOPMOST) BringToTop(win, 1); handle_message_dialog(win); current_window = prev; { char *user, *pass; static char buf[1000]; if (d->hit < YES) /* cancelled */ return ""; if (d->text) user = new_string(GA_gettext(d->text)); else return ""; if (d->pass) pass = new_string(GA_gettext(d->pass)); else return ""; snprintf(buf, 1000, "%s:%s", user, pass); return buf; } return ""; /* -Wall */ }
/* * Create a new static text label. Now implemented using * GraphApp code instead of native MS-Windows "static" * text. This gives more flexibility, better cross-platform * support and there are no 'look and feel' issues with * labels, so no problems are introduced by doing this. */ control newlabel(char *text, rect r, int alignment) { control obj = newcontrol(text, r); if (obj) { obj->kind = LabelObject; setredraw(obj, draw_label); setvalue(obj, alignment); setbackground(obj, getbackground(parentwindow(obj))); settextfont(obj, SystemFont); show(obj); } return obj; }
label newlabel(char *text, rect r, int alignment) { label obj; unsigned long style = SS_LEFT; if ((alignment & AlignRight) == AlignRight) style = SS_RIGHT; if ((alignment & Center) == Center) style = SS_CENTER; obj = newchildwin("static", text, style, r, NULL); obj->kind = LabelObject; setbackground(obj, getbackground(parentwindow(obj))); return obj; }
/* winProgressBar(width, title, label, min, max, initial) */ SEXP winProgressBar(SEXP call, SEXP op, SEXP args, SEXP env) { SEXP tmp, ptr; int width, iv; double d; const char *title, *label; winprogressbar *pbar; Rboolean haveLabel; args = CDR(args); pbar = Calloc(1, winprogressbar); width = asInteger(CAR(args)); args = CDR(args); if(width == NA_INTEGER || width < 0) width = 200; tmp = CAR(args); args = CDR(args); if(!isString(tmp) || length(tmp) < 1 || STRING_ELT(tmp, 0) == NA_STRING) errorcall(call, "invalid '%s' argument", "title"); title = translateChar(STRING_ELT(tmp, 0)); tmp = CAR(args); args = CDR(args); if(!isString(tmp) || length(tmp) < 1 || STRING_ELT(tmp, 0) == NA_STRING) errorcall(call, "invalid '%s' argument", "Label"); label = translateChar(STRING_ELT(tmp, 0)); haveLabel = strlen(label) > 0; d = asReal(CAR(args)); args = CDR(args); if (!R_FINITE(d)) errorcall(call, "invalid '%s' argument", "min"); pbar->min = d; d = asReal(CAR(args)); args = CDR(args); if (!R_FINITE(d)) errorcall(call, "invalid '%s' argument", "max"); pbar->max = d; d = asReal(CAR(args)); args = CDR(args); if (!R_FINITE(d)) errorcall(call, "invalid '%s' argument", "initial"); pbar->val = d; pbar->width = width; pbar->wprog = newwindow(title, rect(0, 0, width+40, haveLabel ? 100: 80), Titlebar | Centered); setbackground(pbar->wprog, dialog_bg()); if(haveLabel) pbar->lab = newlabel(label, rect(10, 15, width+20, 25), AlignCenter); pbar->pb = newprogressbar(rect(20, haveLabel ? 50 : 30, width, 20), 0, width, 1, 1); iv = pbar->width * (pbar->val - pbar->min)/(pbar->max - pbar->min); setprogressbar(pbar->pb, iv); show(pbar->wprog); ptr = R_MakeExternalPtr(pbar, install("winProgressBar"), R_NilValue); R_RegisterCFinalizerEx(ptr, pbarFinalizer, TRUE); return ptr; }
checkbox newcheckbox(char *text, rect r, actionfn fn) { checkbox obj = newcontrol(text, r); if (obj) { obj->kind = CheckboxObject; setredraw(obj, draw_checkbox); setmousedown(obj, checkbox_mousedown); setmousemove(obj, checkbox_mousemove); setmousedrag(obj, checkbox_mousemove); setmouseup(obj, checkbox_mouseup); setkeydown(obj, checkbox_keydown); setaction(obj, fn); setbackground(obj, getbackground(parentwindow(obj))); settextfont(obj, SystemFont); show(obj); } return obj; }
button newbutton(char *text, rect r, actionfn fn) { button obj = newcontrol(text, r); if (obj) { obj->kind = ButtonObject; setredraw(obj, draw_button); setmousedown(obj, button_mousedown); setmousemove(obj, button_mousemove); setmousedrag(obj, button_mousemove); setmouseup(obj, button_mouseup); setkeydown(obj, button_keydown); setaction(obj, fn); setbackground(obj, LightGrey); settextfont(obj, SystemFont); show(obj); } return obj; }
radiobutton newradiobutton(char *text, rect r, actionfn fn) { radiobutton obj = newcontrol(text, r); if (obj) { obj->kind = RadioObject; setredraw(obj, draw_radio); setmousedown(obj, checkbox_mousedown); setmousemove(obj, checkbox_mousemove); setmousedrag(obj, checkbox_mousemove); setmouseup(obj, radio_mouseup); setkeydown(obj, radio_keydown); setaction(obj, fn); setbackground(obj, getbackground(parentwindow(obj))); settextfont(obj, SystemFont); show(obj); } return obj; }
static window init_askstr_dialog(const char *title, const char *question, const char *default_str) { window win; dialog_data *d; int tw, bw, h, middle; if (! question) question= ""; if (! default_str) default_str = ""; tw = strwidth(SystemFont, G_("Cancel")) * 8; h = getheight(SystemFont); if (tw < 150) tw = 150; win = newwindow(title, rect(0,0,tw+30,h*9+12), Titlebar | Centered | Modal); setbackground(win, dialog_bg()); add_data(win); d = data(win); d->question = newlabel(question, rect(10,h,tw+4,h*2+2), AlignLeft); if (title == PASSWORD_TITLE) d->text = newpassword(default_str, rect(10,h*4,tw+4,h*3/2)); else d->text = newfield(default_str, rect(10,h*4,tw+4,h*3/2)); middle = (tw+30)/2; bw = strwidth(SystemFont, G_("Cancel")) * 3/2; d->yes = newbutton(G_("OK"), rect(middle-bw-10, h*7, bw, h+10), hit_button); setvalue(d->yes, YES); d->cancel = newbutton(G_("Cancel"), rect(middle+10, h*7, bw, h+10), hit_button); setvalue(d->cancel, CANCEL); setkeydown(win, hit_key); return win; }
static void create_dialog() { setcursor(ArrowCursor); /* not `busy' cursor */ win = newwindow("t-test entry", rect(0, 0, 200, 200), Titlebar | Centered | Modal); setbackground(win, dialog_bg()); setkeydown(win, hit_key); bApply = newbutton("Apply", rect(20, 160, 50, 25), apply); bCancel = newbutton("Cancel", rect(120, 160, 50, 25), NULL); l_var1 = newlabel("x", rect(10, 10, 30, 20), AlignLeft); var1 = newfield("", rect(40, 10, 130, 20)); l_var2 = newlabel("y", rect(10, 40, 30, 20), AlignLeft); var2 = newfield("", rect(40, 40, 130, 20)); paired = newcheckbox("paired", rect(10, 70, 80, 20), NULL); varequal = newcheckbox("equal var", rect(110, 70, 80, 20), NULL); alt = newdroplist(alts , rect(30, 90, 120, 20), NULL); setlistitem(alt, 0); l_lvl = newlabel("confidence level", rect(20, 120, 90, 20), AlignLeft); lvl = newfield("0.95", rect(120, 120, 40, 20)); }
button newimagecheckbox(image img, rect r, actionfn fn) { button obj; obj = newdrawing(r, draw_image_button); if (! obj) return NULL; setmousedown(obj, checkbox_mousedown); setmousemove(obj, checkbox_mousemove); setmousedrag(obj, checkbox_mousemove); setmouseup(obj, checkbox_mouseup); setkeydown(obj, checkbox_keydown); setaction(obj, fn); setbackground(obj, LightGrey); settextfont(obj, SystemFont); setimage(obj, img); show(obj); return obj; }
button newimagebutton(image img, rect r, actionfn fn) { button obj; obj = newcontrol(NULL, r); if (! obj) return NULL; setredraw(obj, draw_image_button); setmousedown(obj, button_mousedown); setmousemove(obj, button_mousemove); setmousedrag(obj, button_mousemove); setmouseup(obj, button_mouseup); setkeydown(obj, button_keydown); setaction(obj, fn); setbackground(obj, LightGrey); settextfont(obj, SystemFont); setimage(obj, img); show(obj); return obj; }
static editor neweditor(void) { int x, y, w, h, w0, h0; editor c; menuitem m; textbox t; long flags; font editorfn = (consolefn ? consolefn : FixedFont); EditorData p = neweditordata(0, NULL); DWORD rand; w = (pagercol + 1)*fontwidth(editorfn); h = (pagerrow + 1)*fontheight(editorfn) + 1; #ifdef USE_MDI if(ismdi()) { RECT *pR = RgetMDIsize(); w0 = pR->right; h0 = pR->bottom; } else { #endif w0 = devicewidth(NULL); h0 = deviceheight(NULL); #ifdef USE_MDI } #endif x = (w0 - w) / 2; x = x > 20 ? x : 20; y = (h0 - h) / 2; y = y > 20 ? y : 20; rand = GetTickCount(); w0 = 0.4*x; h0 = 0.4*y; w0 = w0 > 20 ? w0 : 20; h0 = h0 > 20 ? h0 : 20; x += (rand % w0) - w0/2; y += ((rand/w0) % h0) - h0/2; flags = StandardWindow | Menubar; #ifdef USE_MDI if (ismdi()) flags |= Document; #endif c = (editor) newwindow("", rect(x, y, w, h), flags); t = newrichtextarea(NULL, rect(0, 0, w, h)); setdata(c, t); setdata(t, p); gsetcursor(c, ArrowCursor); setforeground(c, guiColors[editorfg]); setbackground(c, guiColors[editorbg]); setbackground(t, guiColors[editorbg]); #ifdef USE_MDI if (ismdi() && (RguiMDI & RW_TOOLBAR)) { int btsize = 24; rect r = rect(2, 2, btsize, btsize); control tb, bt; addto(c); MCHECK(tb = newtoolbar(btsize + 4)); addto(tb); MCHECK(bt = newtoolbutton(open_image, r, menueditoropen)); MCHECK(addtooltip(bt, G_("Open script"))); setdata(bt, c); r.x += (btsize + 1) ; MCHECK(bt = newtoolbutton(save_image, r, menueditorsave)); MCHECK(addtooltip(bt, G_("Save script"))); setdata(bt, c); r.x += (btsize + 6); MCHECK(bt = newtoolbutton(copy1_image, r, menueditorrun)); MCHECK(addtooltip(bt, G_("Run line or selection"))); setdata(bt, t); r.x += (btsize + 6); MCHECK(bt = newtoolbutton(console_image, r, editorconsole)); MCHECK(addtooltip(bt, G_("Return focus to Console"))); r.x += (btsize + 6); MCHECK(bt = newtoolbutton(print_image, r, editorprint)); MCHECK(addtooltip(bt, G_("Print script"))); setdata(bt, t); MCHECK(addtooltip(bt, G_("Print"))); } #endif addto(c); /* Right-click context menu */ MCHECK(m = gpopup(editormenuact, EditorPopup)); setdata(m, t); setdata(EditorPopup[0].m, t); setdata(EditorPopup[2].m, t); setdata(p->mpopcut = EditorPopup[4].m, t); setdata(p->mpopcopy = EditorPopup[5].m, t); setdata(EditorPopup[6].m, t); setdata(p->mpopdelete = EditorPopup[7].m, t); setdata(EditorPopup[9].m, t); addto(c); MCHECK(m = newmenubar(editormenuact)); setdata(m, t); MCHECK(newmenu(G_("File"))); MCHECK(m = newmenuitem(G_("New script"), 'N', menueditornew)); setdata(m, c); MCHECK(m = newmenuitem(G_("Open script..."), 'O', menueditoropen)); setdata(m, c); MCHECK(m = newmenuitem(G_("Save"), 'S', menueditorsave)); setdata(m, c); MCHECK(m = newmenuitem(G_("Save as..."), 0, menueditorsaveas)); setdata(m, c); MCHECK(m = newmenuitem("-", 0, NULL)); MCHECK(m = newmenuitem(G_("Print..."), 0, editorprint)); setdata(m, t); MCHECK(m = newmenuitem("-", 0, NULL)); MCHECK(m = newmenuitem(G_("Close script"), 0, menueditorclose)); setdata(m, c); MCHECK(newmenu(G_("Edit"))); MCHECK(m = newmenuitem(G_("Undo"), 'Z', editorundo)); setdata(m, t); MCHECK(m = newmenuitem("-", 0, NULL)); MCHECK(p->mcut = newmenuitem(G_("Cut"), 'X', editorcut)); setdata(p->mcut, t); MCHECK(p->mcopy = newmenuitem(G_("Copy"), 'C', editorcopy)); setdata(p->mcopy, t); MCHECK(m = newmenuitem(G_("Paste"), 'V', editorpaste)); setdata(m, t); MCHECK(p->mdelete = newmenuitem(G_("Delete"), 0, editordelete)); setdata(p->mdelete, t); MCHECK(m = newmenuitem(G_("Select all"), 'A', editorselectall)); setdata(m, t); MCHECK(newmenuitem(G_("Clear console"), 'L', menuclear)); MCHECK(m = newmenuitem("-", 0, NULL)); MCHECK(m = newmenuitem(G_("Run line or selection"), 'R', menueditorrun)); setdata(m, t); MCHECK(m = newmenuitem(G_("Run all"), 0, editorrunall)); setdata(m, t); MCHECK(m = newmenuitem("-", 0, NULL)); MCHECK(p->mfind = newmenuitem(G_("Find..."), 'F', editorfind)); setdata(p->mfind, t); MCHECK(p->mreplace = newmenuitem(G_("Replace..."), 'H', editorreplace)); setdata(p->mreplace, t); MCHECK(m = newmenuitem("-", 0, NULL)); MCHECK(newmenuitem(G_("GUI preferences..."), 0, menuconfig)); /* Packages menu should go here */ p->pmenu = (PkgMenuItems) malloc(sizeof(struct structPkgMenuItems)); RguiPackageMenu(p->pmenu); #ifdef USE_MDI newmdimenu(); /* Create and fill the 'Window' menu */ #endif MCHECK(m = newmenu(G_("Help"))); MCHECK(newmenuitem(G_("Editor"), 0, menueditorhelp)); MCHECK(newmenuitem("-", 0, NULL)); p->hmenu = (HelpMenuItems) malloc(sizeof(struct structHelpMenuItems)); RguiCommonHelp(m, p->hmenu); settextfont(t, editorfn); setforeground(t, guiColors[editorfg]); setresize(c, editorresize); setclose(c, editorclose); setdel(c, editordel); setdel(t, textboxdel); setonfocus(c, editorfocus); setkeyaction(t, editorcontrolkeydown); setkeydown(t, editorasciikeydown); /* Store pointer to new editor in global array */ REditors[neditors] = c; ++neditors; return c; }
static void showDialog(Gui gui) { char buf[100]; wconfig = newwindow(G_("Rgui Configuration Editor"), rect(0, 0, 550, 450), Titlebar | Centered | Modal); setbackground(wconfig, dialog_bg()); l_mdi = newlabel("Single or multiple windows", rect(10, 10, 140, 20), AlignLeft); rb_mdi = newradiobutton("MDI", rect(150, 10 , 70, 20), cMDI); rb_sdi = newradiobutton("SDI", rect(220, 10 , 70, 20), cSDI); toolbar = newcheckbox("MDI toolbar", rect(300, 10, 100, 20), NULL); if(gui->toolbar) check(toolbar); statusbar = newcheckbox("MDI statusbar", rect(420, 10, 130, 20), NULL); if(gui->statusbar) check(statusbar); if(gui->MDI) { check(rb_mdi); cMDI(rb_mdi); } else { check(rb_sdi); cSDI(rb_sdi); } l_mwin = newlabel("Pager style", rect(10, 40, 90, 20), AlignLeft); g_mwin = newradiogroup(); rb_mwin = newradiobutton("multiple windows", rect(150, 40, 150, 20), NULL); rb_swin = newradiobutton("single window", rect(150, 60 , 150, 20), NULL); if(gui->pagerMultiple) check(rb_mwin); else check(rb_swin); l_lang = newlabel("Language for menus\nand messages", rect(320, 40, 130, 40), AlignLeft); f_lang = newfield(gui->language, rect(450, 45, 60, 20)); /* Font, pointsize, style */ l_font = newlabel("Font", rect(10, 100, 40, 20), AlignLeft); f_font = newdropfield(FontsList, rect(50, 100, 120, 20), scrollFont); tt_font = newcheckbox("TrueType only", rect(180, 100, 110, 20), changeFont); if (gui->tt_font) check(tt_font); settext(f_font, gui->font); l_point = newlabel("size", rect(310, 100, 30, 20), AlignLeft); d_point = newdropfield(PointsList, rect(345, 100, 50, 20), scrollPoints); snprintf(buf, 100, "%d", gui->pointsize); settext(d_point, buf); l_style = newlabel("style", rect(410, 100, 40, 20), AlignLeft); f_style = newdroplist(StyleList, rect(450, 100, 80, 20), scrollStyle); setlistitem(f_style, cmatch(gui->style, StyleList)); /* Console size, set widthonresize */ l_crows = newlabel("Console rows", rect(10, 150, 100, 20), AlignLeft); snprintf(buf, 100, "%d", gui->crows); f_crows = newfield(buf, rect(110, 150, 30, 20)); l_ccols = newlabel("columns", rect(150, 150, 60, 20), AlignLeft); snprintf(buf, 100, "%d", gui->ccols); f_ccols = newfield(buf, rect(220, 150, 30, 20)); l_cx = newlabel("Initial left", rect(270, 150, 70, 20), AlignLeft); snprintf(buf, 100, "%d", gui->cx); f_cx = newfield(buf, rect(350, 150, 40, 20)); l_cy = newlabel("top", rect(430, 150, 30, 20), AlignLeft); snprintf(buf, 100, "%d", gui->cy); f_cy = newfield(buf, rect(480, 150, 40, 20)); c_resize = newcheckbox("set options(width) on resize?", rect(20, 175, 200, 20), NULL); if(gui->setWidthOnResize) check(c_resize); l_cbb = newlabel("buffer chars", rect(270, 175, 70, 20), AlignLeft); snprintf(buf, 100, "%d", gui->cbb); f_cbb = newfield(buf, rect(350, 175, 60, 20)); l_cbl = newlabel("lines", rect(430, 175, 50, 20), AlignLeft); snprintf(buf, 100, "%d", gui->cbl); f_cbl = newfield(buf, rect(480, 175, 40, 20)); c_buff = newcheckbox("buffer console by default?", rect(20, 190, 200, 20), NULL); if(gui->buffered) check(c_buff); /* Cursor blink */ l_blink = newlabel("Cursor blink", rect(270, 200,100, 30), AlignLeft); f_blink = newdroplist(BlinkList, rect(350, 200, 80, 20), NULL); setlistitem(f_blink, gui->cursor_blink); /* Pager size */ l_prows = newlabel("Pager rows", rect(10, 230, 100, 20), AlignLeft); snprintf(buf, 100, "%d", gui->prows); f_prows = newfield(buf, rect(110, 230, 30, 20)); l_pcols = newlabel("columns", rect(150, 230, 60, 20), AlignLeft); snprintf(buf, 100, "%d", gui->pcols); f_pcols = newfield(buf, rect(220, 230, 30, 20)); /* Graphics window */ l_grx = newlabel("Graphics windows: initial left", rect(10, 270, 190, 20), AlignLeft); snprintf(buf, 100, "%d", gui->grx); f_grx = newfield(buf, rect(200, 270, 40, 20)); l_gry = newlabel("top", rect(270, 270, 30, 20), AlignLeft); snprintf(buf, 100, "%d", gui->gry); f_gry = newfield(buf, rect(300, 270, 40, 20)); /* Font colours */ l_cols = newlabel("Console and Pager Colours", rect(10, 310, 520, 20), AlignCenter); guielement = newlistbox(GuiElementNames, rect(50, 330, 100, 80), changeElement, NULL); guicolor = newlistbox(ColorName, rect(205, 330, 100, 80), clickColor, NULL); guisample = newrichtextarea("Sample text", rect(350, 330, 150, 55)); for (int i=0; i<numGuiColors; i++) dialogColors[i] = gui->guiColors[i]; setlistitem(guielement, 0); changeElement(guielement, 0); sampleFontNum = cmatch(gettext(f_font), FontsList); samplePointsize = atoi(gettext(d_point)); scrollStyle(f_style, 0); /* the 0 is ignored */ bApply = newbutton("Apply", rect(50, 410, 70, 25), apply); bSave = newbutton("Save...", rect(130, 410, 70, 25), save); bLoad = newbutton("Load...", rect(210, 410, 70, 25), load); bOK = newbutton("OK", rect(350, 410, 70, 25), ok); bCancel = newbutton("Cancel", rect(430, 410, 70, 25), cancel); show(wconfig); }
static pager pagercreate(void) { ConsoleData p; int w, h, i, x, y, w0, h0; pager c; menuitem m; p = newconsoledata((consolefn) ? consolefn : FixedFont, pagerrow, pagercol, 0, 0, guiColors, PAGER, 0, 0); if (!p) return NULL; /* if (ismdi()) { x = y = w = h = 0; } else { w = WIDTH ; h = HEIGHT; x = (devicewidth(NULL) - w) / 2; y = (deviceheight(NULL) - h) / 2 ; } */ w = WIDTH ; h = HEIGHT; /* centre a single pager, randomly place each of multiple pagers */ #ifdef USE_MDI if(ismdi()) { RECT *pR = RgetMDIsize(); w0 = pR->right; h0 = pR->bottom; } else { #endif w0 = devicewidth(NULL); h0 = deviceheight(NULL); #ifdef USE_MDI } #endif x = (w0 - w) / 2; x = x > 20 ? x:20; y = (h0 - h) / 2; y = y > 20 ? y:20; if(pagerMultiple) { #ifdef Win32 DWORD rand = GetTickCount(); #else int rand = 0; #endif int w0 = 0.4*x, h0 = 0.4*y; w0 = w0 > 20 ? w0 : 20; h0 = h0 > 20 ? h0 : 20; x += (rand % w0) - w0/2; y += ((rand/w0) % h0) - h0/2; } c = (pager) newwindow("PAGER", rect(x, y, w, h), Document | StandardWindow | Menubar | VScrollbar | HScrollbar | TrackMouse); if (!c) { freeConsoleData(p); return NULL; } setdata(c, p); if(h == 0) HEIGHT = getheight(c); if(w == 0) WIDTH = getwidth(c); COLS = WIDTH / FW - 1; ROWS = HEIGHT / FH - 1; BORDERX = (WIDTH - COLS*FW) / 2; BORDERY = (HEIGHT - ROWS*FH) / 2; gsetcursor(c, ArrowCursor); gchangescrollbar(c, VWINSB, 0, 0, ROWS, 0); gchangescrollbar(c, HWINSB, 0, COLS-1, COLS, 1); setbackground(c, guiColors[pagerbg]); #ifdef USE_MDI if (ismdi()) { int btsize = 24; rect r = rect(2, 2, btsize, btsize); control tb, bt; addto(c); MCHECK(tb = newtoolbar(btsize + 4)); gsetcursor(tb, ArrowCursor); addto(tb); MCHECK(bt = newtoolbutton(open_image, r, menueditoropen)); MCHECK(addtooltip(bt, G_("Open script"))); gsetcursor(bt, ArrowCursor); /* wants NULL as data, not the pager */ r.x += (btsize + 6) ; MCHECK(bt = newtoolbutton(copy1_image, r, pagerpaste)); MCHECK(addtooltip(bt, G_("Paste to console"))); gsetcursor(bt, ArrowCursor); setdata(bt, (void *) c); r.x += (btsize + 6) ; MCHECK(bt = newtoolbutton(copy1_image, r, pagerpastecmds)); MCHECK(addtooltip(bt, G_("Paste commands to console"))); gsetcursor(bt, ArrowCursor); setdata(bt, (void *) c); r.x += (btsize + 6) ; MCHECK(bt = newtoolbutton(print_image, r, pagerprint)); MCHECK(addtooltip(bt, G_("Print"))); gsetcursor(bt, ArrowCursor); setdata(bt, (void *) c); r.x += (btsize + 6) ; MCHECK(bt = newtoolbutton(console_image, r, pagerconsole)); MCHECK(addtooltip(bt, G_("Return focus to Console"))); gsetcursor(bt, ArrowCursor); setdata(bt, (void *) c); } #endif addto(c); MCHECK(m = gpopup(pagermenuact, PagerPopup)); setdata(m, c); setdata(p->mpopcopy = PagerPopup[0].m, c); setdata(p->mpoppaste = PagerPopup[1].m, c); setdata(p->mpoppastecmds = PagerPopup[2].m, c); setdata(PagerPopup[3].m, c); setdata(PagerPopup[5].m, c); setdata(PagerPopup[7].m, c); MCHECK(m = newmenubar(pagermenuact)); setdata(m, c); MCHECK(newmenu(G_("File"))); MCHECK(m = newmenuitem(G_("New script"), 'N', menueditornew)); MCHECK(m = newmenuitem(G_("Open script..."), 'O', menueditoropen)); MCHECK(m = newmenuitem(G_("Print..."), 'P', pagerprint)); setdata(m, c); MCHECK(m = newmenuitem(G_("Save to File..."), 'S', pagersavefile)); setdata(m, c); MCHECK(m = newmenuitem("-", 0, NULL)); MCHECK(m = newmenuitem(G_("Close"), 0, pagerclose)); setdata(m, c); MCHECK(newmenu(G_("Edit"))); MCHECK(p->mcopy = newmenuitem(G_("Copy"), 'C', pagercopy)); setdata(p->mcopy, c); MCHECK(p->mpaste = newmenuitem(G_("Paste to console"), 'V', pagerpaste)); setdata(p->mpaste, c); MCHECK(p->mpastecmds = newmenuitem(G_("Paste commands to console"), 0, pagerpastecmds)); setdata(p->mpastecmds, c); MCHECK(m = newmenuitem(G_("Select all"), 'A', pagerselectall)); setdata(m, c); if (!pagerMultiple) { MCHECK(newmenu(G_("View"))); for (i = 0; i < PAGERMAXKEPT; i++) { snprintf(pagerTitles[i], PAGERMAXTITLE+8, "&%c. ", 'A' + i); MCHECK(pagerMenus[i] = newmenuitem(&pagerTitles[i][1], 0, pagerchangeview)); setvalue(pagerMenus[i], i); } } #ifdef USE_MDI if (ismdi()) newmdimenu(); if (ismdi() && !(RguiMDI & RW_TOOLBAR)) toolbar_hide(); #endif MCHECK(BM = newbitmap(WIDTH, HEIGHT, 2)); setdata(c, p); sethit(c, console_sbf); setresize(c, consoleresize); setredraw(c, drawconsole); setdel(c, delpager); setclose(c, pagerbclose); setkeyaction(c, console_ctrlkeyin); setkeydown(c, console_normalkeyin); setmousedrag(c, console_mousedrag); setmouserepeat(c, console_mouserep); setmousedown(c, console_mousedown); return(c); }
SEXP Win_selectlist(SEXP args) { SEXP choices, preselect, ans = R_NilValue; const char **clist; int i, j = -1, n, mw = 0, multiple, nsel = 0; int xmax, ymax, ylist, fht, h0; Rboolean haveTitle; choices = CAR(args); if(!isString(choices)) error(_("invalid '%s' argument"), "choices"); preselect = CADR(args); if(!isNull(preselect) && !isString(preselect)) error(_("invalid '%s' argument"), "preselect"); multiple = asLogical(CADDR(args)); if(multiple == NA_LOGICAL) multiple = 0; haveTitle = isString(CADDDR(args)); if(!multiple && isString(preselect) && LENGTH(preselect) != 1) error(_("invalid '%s' argument"), "preselect"); n = LENGTH(choices); clist = (const char **) R_alloc(n + 1, sizeof(char *)); for(i = 0; i < n; i++) { clist[i] = translateChar(STRING_ELT(choices, i)); mw = max(mw, gstrwidth(NULL, SystemFont, clist[i])); } clist[n] = NULL; fht = getSysFontSize().height; xmax = max(170, mw+60); /* allow for scrollbar */ if(ismdi()) { RECT *pR = RgetMDIsize(); h0 = pR->bottom; } else { h0 = deviceheight(NULL); } ymax = min(80+fht*n, h0-100); /* allow for window widgets, toolbar */ ylist = ymax - 60; wselect = newwindow(haveTitle ? translateChar(STRING_ELT(CADDDR(args), 0)): (multiple ? _("Select one or more") : _("Select one")), rect(0, 0, xmax, ymax), Titlebar | Centered | Modal | Floating); setbackground(wselect, dialog_bg()); if(multiple) f_list = newmultilist(clist, rect(10, 10, xmax-25, ylist), NULL, finish); else f_list = newlistbox(clist, rect(10, 10, xmax-25, ylist), NULL, finish); if(!isNull(preselect) && LENGTH(preselect)) { for(i = 0; i < n; i++) for(j = 0; j < LENGTH(preselect); j++) if(strcmp(clist[i], translateChar(STRING_ELT(preselect, j))) == 0) { setlistitem(f_list, i); break; } } bFinish = newbutton(G_("OK"), rect(xmax-160, ymax-40, 70, 25), finish); bCancel = newbutton(G_("Cancel"), rect(xmax-80, ymax-40, 70, 25), cancel); setkeydown(wselect, key1); show(wselect); done = 0; while(!done) { R_WaitEvent(); R_ProcessEvents(); } if(multiple) { if (done == 1) { /* Finish */ for(i = 0; i < n; i++) if(isselected(f_list, i)) nsel++; PROTECT(ans = allocVector(STRSXP, nsel)); for(i = 0, j = 0; i < n; i++) if(isselected(f_list, i)) SET_STRING_ELT(ans, j++, mkChar(clist[i])); } else { /* cancel */ PROTECT(ans = allocVector(STRSXP, 0)); } } else PROTECT(ans = mkString(selected)); cleanup(); show(RConsole); R_ProcessEvents(); UNPROTECT(1); return ans; }