Retire winctrls.c:multiedit() in favour of a new simpler function for a
[sgt/putty] / windows / winctrls.c
index 0fb4b9f..6d0b21c 100644 (file)
@@ -148,44 +148,29 @@ void endbox(struct ctlpos *cp)
 }
 
 /*
- * Some edit boxes. Each one has a static above it. The percentages
- * of the horizontal space are provided.
+ * A static line, followed by a full-width edit box.
  */
-void multiedit(struct ctlpos *cp, int password, ...)
+void editboxfw(struct ctlpos *cp, int password, char *text,
+              int staticid, int editid)
 {
     RECT r;
-    va_list ap;
-    int percent, xpos;
-
-    percent = xpos = 0;
-    va_start(ap, password);
-    while (1) {
-       char *text;
-       int staticid, editid, pcwidth;
-       text = va_arg(ap, char *);
-       if (!text)
-           break;
-       staticid = va_arg(ap, int);
-       editid = va_arg(ap, int);
-       pcwidth = va_arg(ap, int);
 
-       r.left = xpos + GAPBETWEEN;
-       percent += pcwidth;
-       xpos = (cp->width + GAPBETWEEN) * percent / 100;
-       r.right = xpos - r.left;
+    r.left = GAPBETWEEN;
+    r.right = cp->width;
 
+    if (text) {
        r.top = cp->ypos;
        r.bottom = STATICHEIGHT;
        doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid);
-       r.top = cp->ypos + 8 + GAPWITHIN;
-       r.bottom = EDITHEIGHT;
-       doctl(cp, r, "EDIT",
-             WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL |
-             (password ? ES_PASSWORD : 0),
-             WS_EX_CLIENTEDGE, "", editid);
+       cp->ypos += STATICHEIGHT + GAPWITHIN;
     }
-    va_end(ap);
-    cp->ypos += STATICHEIGHT + GAPWITHIN + EDITHEIGHT + GAPBETWEEN;
+    r.top = cp->ypos;
+    r.bottom = EDITHEIGHT;
+    doctl(cp, r, "EDIT",
+         WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL |
+         (password ? ES_PASSWORD : 0),
+         WS_EX_CLIENTEDGE, "", editid);
+    cp->ypos += EDITHEIGHT + GAPBETWEEN;
 }
 
 /*
@@ -198,16 +183,18 @@ void combobox(struct ctlpos *cp, char *text, int staticid, int listid)
     r.left = GAPBETWEEN;
     r.right = cp->width;
 
+    if (text) {
+       r.top = cp->ypos;
+       r.bottom = STATICHEIGHT;
+       doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid);
+       cp->ypos += STATICHEIGHT + GAPWITHIN;
+    }
     r.top = cp->ypos;
-    r.bottom = STATICHEIGHT;
-    doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, text, staticid);
-    r.top = cp->ypos + 8 + GAPWITHIN;
     r.bottom = COMBOHEIGHT * 10;
     doctl(cp, r, "COMBOBOX",
          WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL |
          CBS_DROPDOWN | CBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", listid);
-
-    cp->ypos += STATICHEIGHT + GAPWITHIN + COMBOHEIGHT + GAPBETWEEN;
+    cp->ypos += COMBOHEIGHT + GAPBETWEEN;
 }
 
 struct radio { char *text; int id; };
@@ -670,7 +657,7 @@ void staticddl(struct ctlpos *cp, char *stext,
     r.right = rwid;
     r.bottom = COMBOHEIGHT*4;
     doctl(cp, r, "COMBOBOX",
-         WS_CHILD | WS_VISIBLE | WS_TABSTOP |
+         WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL |
          CBS_DROPDOWNLIST | CBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", lid);
 
     cp->ypos += height + GAPBETWEEN;
@@ -717,19 +704,21 @@ void staticddlbig(struct ctlpos *cp, char *stext,
 {
     RECT r;
 
-    r.left = GAPBETWEEN;
-    r.top = cp->ypos;
-    r.right = cp->width;
-    r.bottom = STATICHEIGHT;
-    doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid);
-    cp->ypos += STATICHEIGHT;
+    if (stext) {
+       r.left = GAPBETWEEN;
+       r.top = cp->ypos;
+       r.right = cp->width;
+       r.bottom = STATICHEIGHT;
+       doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid);
+       cp->ypos += STATICHEIGHT;
+    }
 
     r.left = GAPBETWEEN;
     r.top = cp->ypos;
     r.right = cp->width;
     r.bottom = COMBOHEIGHT*4;
     doctl(cp, r, "COMBOBOX",
-         WS_CHILD | WS_VISIBLE | WS_TABSTOP |
+         WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL |
          CBS_DROPDOWNLIST | CBS_HASSTRINGS, WS_EX_CLIENTEDGE, "", lid);
     cp->ypos += COMBOHEIGHT + GAPBETWEEN;
 }
@@ -742,12 +731,14 @@ void bigeditctrl(struct ctlpos *cp, char *stext,
 {
     RECT r;
 
-    r.left = GAPBETWEEN;
-    r.top = cp->ypos;
-    r.right = cp->width;
-    r.bottom = STATICHEIGHT;
-    cp->ypos += r.bottom + GAPWITHIN;
-    doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid);
+    if (stext) {
+       r.left = GAPBETWEEN;
+       r.top = cp->ypos;
+       r.right = cp->width;
+       r.bottom = STATICHEIGHT;
+       cp->ypos += r.bottom + GAPWITHIN;
+       doctl(cp, r, "STATIC", WS_CHILD | WS_VISIBLE, 0, stext, sid);
+    }
 
     r.left = GAPBETWEEN;
     r.top = cp->ypos;
@@ -1508,8 +1499,8 @@ void winctrl_layout(struct dlgparam *dp, struct winctrls *wc,
                    combobox(&pos, escaped,
                             base_id, base_id+1);
                else
-                   multiedit(&pos, ctrl->editbox.password, escaped,
-                             base_id, base_id+1, 100, NULL);
+                   editboxfw(&pos, ctrl->editbox.password, escaped,
+                             base_id, base_id+1);
            } else {
                if (ctrl->editbox.has_list) {
                    staticcombo(&pos, escaped, base_id, base_id+1,
@@ -1905,14 +1896,8 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg,
              HIWORD(wParam) == BN_DOUBLECLICKED))) {
            OPENFILENAME of;
            char filename[FILENAME_MAX];
-           int ret;
 
            memset(&of, 0, sizeof(of));
-#ifdef OPENFILENAME_SIZE_VERSION_400
-           of.lStructSize = OPENFILENAME_SIZE_VERSION_400;
-#else
-           of.lStructSize = sizeof(of);
-#endif
            of.hwndOwner = dp->hwnd;
            if (ctrl->fileselect.filter)
                of.lpstrFilter = ctrl->fileselect.filter;
@@ -1925,14 +1910,9 @@ int winctrl_handle_command(struct dlgparam *dp, UINT msg,
            filename[lenof(filename)-1] = '\0';
            of.nMaxFile = lenof(filename);
            of.lpstrFileTitle = NULL;
-           of.lpstrInitialDir = NULL;
            of.lpstrTitle = ctrl->fileselect.title;
            of.Flags = 0;
-           if (ctrl->fileselect.for_writing)
-               ret = GetSaveFileName(&of);
-           else
-               ret = GetOpenFileName(&of);
-           if (ret) {
+           if (request_file(NULL, &of, FALSE, ctrl->fileselect.for_writing)) {
                SetDlgItemText(dp->hwnd, c->base_id + 1, filename);
                ctrl->generic.handler(ctrl, dp, dp->data, EVENT_VALCHANGE);
            }