Implement refreshing the whole dialogue box with dlg_refresh, so that
[sgt/putty] / mac / macctrls.c
index 7dc37a6..450b1cd 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: macctrls.c,v 1.41 2003/05/10 20:23:23 ben Exp $ */
+/* $Id$ */
 /*
  * Copyright (c) 2003 Ben Harris
  * All rights reserved.
@@ -248,6 +248,7 @@ void macctrl_layoutbox(struct controlbox *cb, WindowPtr window,
     mcs->focus = NULL;
     mcs->defbutton = NULL;
     mcs->canbutton = NULL;
+    mcs->curpanel = 1;
     /* Count the number of panels */
     mcs->npanels = 1;
     for (i = 1; i < cb->nctrlsets; i++)
@@ -291,8 +292,8 @@ static void macctrl_layoutset(struct mac_layoutstate *curstate,
                              struct controlset *s,
                              WindowPtr window, struct macctrls *mcs)
 {
-    unsigned int i, j, ncols, colstart;
-    struct mac_layoutstate cols[MAXCOLS];
+    unsigned int i, j, ncols, colstart, colspan;
+    struct mac_layoutstate cols[MAXCOLS], pos;
 
     cols[0] = *curstate;
     ncols = 1;
@@ -301,8 +302,8 @@ static void macctrl_layoutset(struct mac_layoutstate *curstate,
        union control *ctrl = s->ctrls[i];
 
        colstart = COLUMN_START(ctrl->generic.column);
-       switch (ctrl->generic.type) {
-         case CTRL_COLUMNS:
+       colspan = COLUMN_SPAN(ctrl->generic.column);
+       if (ctrl->generic.type == CTRL_COLUMNS) {
            if (ctrl->columns.ncols != 1) {
                ncols = ctrl->columns.ncols;
                assert(ncols <= MAXCOLS);
@@ -324,28 +325,40 @@ static void macctrl_layoutset(struct mac_layoutstate *curstate,
                cols[0].width = curstate->width;
                ncols = 1;
            }
-           break;
-         case CTRL_TEXT:
-           macctrl_text(mcs, window, &cols[colstart], ctrl);
-           break;
-         case CTRL_EDITBOX:
-           macctrl_editbox(mcs, window, &cols[colstart], ctrl);
-           break;
-         case CTRL_RADIO:
-           macctrl_radio(mcs, window, &cols[colstart], ctrl);
-           break;
-         case CTRL_CHECKBOX:
-           macctrl_checkbox(mcs, window, &cols[colstart], ctrl);
-           break;
-         case CTRL_BUTTON:
-           macctrl_button(mcs, window, &cols[colstart], ctrl);
-           break;
-         case CTRL_LISTBOX:
-           if (ctrl->listbox.height == 0)
-               macctrl_popup(mcs, window, &cols[colstart], ctrl);
-           else
-               macctrl_listbox(mcs, window, &cols[colstart], ctrl);
-           break;
+       } else {
+           pos = cols[colstart];
+           pos.width = cols[colstart + colspan - 1].width +
+               (cols[colstart + colspan - 1].pos.h - cols[colstart].pos.h);
+
+           for (j = colstart; j < colstart + colspan; j++)
+               if (pos.pos.v < cols[j].pos.v)
+                   pos.pos.v = cols[j].pos.v;
+
+           switch (ctrl->generic.type) {
+             case CTRL_TEXT:
+               macctrl_text(mcs, window, &pos, ctrl);
+               break;
+             case CTRL_EDITBOX:
+               macctrl_editbox(mcs, window, &pos, ctrl);
+               break;
+             case CTRL_RADIO:
+               macctrl_radio(mcs, window, &pos, ctrl);
+               break;
+             case CTRL_CHECKBOX:
+               macctrl_checkbox(mcs, window, &pos, ctrl);
+               break;
+             case CTRL_BUTTON:
+               macctrl_button(mcs, window, &pos, ctrl);
+               break;
+             case CTRL_LISTBOX:
+               if (ctrl->listbox.height == 0)
+                   macctrl_popup(mcs, window, &pos, ctrl);
+               else
+                   macctrl_listbox(mcs, window, &pos, ctrl);
+               break;
+           }
+           for (j = colstart; j < colstart + colspan; j++)
+               cols[j].pos.v = pos.pos.v;
        }
     }
     for (j = 0; j < ncols; j++)
@@ -1396,9 +1409,18 @@ void dlg_refresh(union control *ctrl, void *dlg)
 {
     struct macctrls *mcs = dlg;
     union macctrl *mc;
+    int i;
 
-    if (ctrl == NULL)
-       return; /* FIXME */
+    if (ctrl == NULL) {
+        /* NULL means refresh every control */
+        for (i = 0 ; i < mcs->npanels; i++) {
+           for (mc = mcs->panels[i]; mc != NULL; mc = mc->generic.next) {
+               ctrlevent(mcs, mc, EVENT_REFRESH);
+           }
+        }
+        return;
+    }
+    /* Just refresh a specific control */
     mc = findbyctrl(mcs, ctrl);
     assert(mc != NULL);
     ctrlevent(mcs, mc, EVENT_REFRESH);