⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 osxctrls.m

📁 putty
💻 M
📖 第 1 页 / 共 4 页
字号:
		else
		    xlist = xthis+wthis-listw;

		[list setFrame: NSMakeRect(xlist, ynext-(rheight+theight)/2,
					   listw, theight)];

		/*
		 * Size the columns for the table view.
		 */
		if (c->tableview) {
		    int ncols, *percentages;
		    int hundred = 100;
		    int cpercent = 0, cpixels = 0;
		    NSArray *cols;

		    if (ctrl->listbox.ncols) {
			ncols = ctrl->listbox.ncols;
			percentages = ctrl->listbox.percentages;
		    } else {
			ncols = 1;
			percentages = &hundred;
		    }

		    cols = [c->tableview tableColumns];

		    for (j = 0; j < ncols; j++) {
			NSTableColumn *col = [cols objectAtIndex:j];
			int newcpixels;

			cpercent += percentages[j];
			newcpixels = listw * cpercent / 100;
			[col setWidth:newcpixels-cpixels];
			cpixels = newcpixels;
		    }
		}

		ch = (ythis - ynext) + theight;

		if (c->button) {
		    int b2height, centre;
		    int bx, bw;

		    /*
		     * Place the Up and Down buttons for a drag list.
		     */
		    assert(c->button2);

		    rect = [c->button frame];
		    b2height = VSPACING + 2 * rect.size.height;

		    centre = ynext - rheight/2;

		    bx = (wthis + HSPACING) * 3 / 4;
		    bw = wthis - bx;
		    bx += leftx;

		    [c->button setFrame:
		     NSMakeRect(bx, centre+b2height/2-rect.size.height,
				bw, rect.size.height)];
		    [c->button2 setFrame:
		     NSMakeRect(bx, centre-b2height/2,
				bw, rect.size.height)];
		}
	    }
	    break;
	}

	for (j = colstart; j < colend; j++)
	    cypos[j] = ythis - ch - VSPACING;
	if (ret < topy - (ythis - ch))
	    ret = topy - (ythis - ch);
    }

    if (*s->boxname) {
	NSBox *box = find_box(d, s);
	assert(box != NULL);
	[box sizeToFit];

	if (s->boxtitle) {
	    NSRect rect = [box frame];
	    rect.size.height += [[box titleFont] pointSize];
	    [box setFrame:rect];
	}

	ret += boxh;
    }

    //printf("For controlset %s/%s, returning ret=%d\n",
    //       s->pathname, s->boxname, ret);
    return ret;
}

void select_panel(void *dv, struct controlbox *b, const char *name)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    int i, j, hidden;
    struct controlset *s;
    union control *ctrl;
    struct fe_ctrl *c;
    NSBox *box;

    for (i = 0; i < b->nctrlsets; i++) {
	s = b->ctrlsets[i];

	if (*s->pathname) {
	    hidden = !strcmp(s->pathname, name) ? NO : YES;

	    if ((box = find_box(d, s)) != NULL) {
		[box setHidden:hidden];
	    } else {
		for (j = 0; j < s->ncontrols; j++) {
		    ctrl = s->ctrls[j];
		    c = fe_ctrl_byctrl(d, ctrl);

		    if (!c)
			continue;

		    if (c->label)
			[c->label setHidden:hidden];
		    if (c->button)
			[c->button setHidden:hidden];
		    if (c->button2)
			[c->button2 setHidden:hidden];
		    if (c->editbox)
			[c->editbox setHidden:hidden];
		    if (c->combobox)
			[c->combobox setHidden:hidden];
		    if (c->textview)
			[c->textview setHidden:hidden];
		    if (c->tableview)
			[c->tableview setHidden:hidden];
		    if (c->scrollview)
			[c->scrollview setHidden:hidden];
		    if (c->popupbutton)
			[c->popupbutton setHidden:hidden];
		    if (c->radiobuttons) {
			int j;
			for (j = 0; j < c->nradiobuttons; j++)
			    [c->radiobuttons[j] setHidden:hidden];
		    }
		    break;
		}
	    }
	}
    }
}

void dlg_radiobutton_set(union control *ctrl, void *dv, int whichbutton)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);
    int j;

    assert(c->radiobuttons);
    for (j = 0; j < c->nradiobuttons; j++)
	[c->radiobuttons[j] setState:
	 (j == whichbutton ? NSOnState : NSOffState)];
}

int dlg_radiobutton_get(union control *ctrl, void *dv)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);
    int j;

    assert(c->radiobuttons);
    for (j = 0; j < c->nradiobuttons; j++)
	if ([c->radiobuttons[j] state] == NSOnState)
	    return j;

    return 0;			       /* should never reach here */
}

void dlg_checkbox_set(union control *ctrl, void *dv, int checked)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);

    assert(c->button);
    [c->button setState:(checked ? NSOnState : NSOffState)];
}

int dlg_checkbox_get(union control *ctrl, void *dv)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);

    assert(c->button);
    return ([c->button state] == NSOnState);
}

void dlg_editbox_set(union control *ctrl, void *dv, char const *text)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);

    if (c->editbox) {
	[c->editbox setStringValue:[NSString stringWithCString:text]];
    } else {
	assert(c->combobox);
	[c->combobox setStringValue:[NSString stringWithCString:text]];
    }
}

void dlg_editbox_get(union control *ctrl, void *dv, char *buffer, int length)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);
    NSString *str;

    if (c->editbox) {
	str = [c->editbox stringValue];
    } else {
	assert(c->combobox);
	str = [c->combobox stringValue];
    }
    if (!str)
	str = @"";

    /* The length parameter to this method doesn't include a trailing NUL */
    [str getCString:buffer maxLength:length-1];
}

void dlg_listbox_clear(union control *ctrl, void *dv)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);

    if (c->tableview) {
	[[c->tableview dataSource] clear];
	[c->tableview reloadData];
    } else {
	[c->popupbutton removeAllItems];
    }
}

void dlg_listbox_del(union control *ctrl, void *dv, int index)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);

    if (c->tableview) {
	[[c->tableview dataSource] removestr:index];
	[c->tableview reloadData];
    } else {
	[c->popupbutton removeItemAtIndex:index];
    }
}

void dlg_listbox_addwithid(union control *ctrl, void *dv,
			   char const *text, int id)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);

    if (c->tableview) {
	[[c->tableview dataSource] add:text withId:id];
	[c->tableview reloadData];
    } else {
	[c->popupbutton addItemWithTitle:[NSString stringWithCString:text]];
	[[c->popupbutton lastItem] setTag:id];
    }
}

void dlg_listbox_add(union control *ctrl, void *dv, char const *text)
{
    dlg_listbox_addwithid(ctrl, dv, text, -1);
}

int dlg_listbox_getid(union control *ctrl, void *dv, int index)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);

    if (c->tableview) {
	return [[c->tableview dataSource] getid:index];
    } else {
	return [[c->popupbutton itemAtIndex:index] tag];
    }
}

int dlg_listbox_index(union control *ctrl, void *dv)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);

    if (c->tableview) {
	return [c->tableview selectedRow];
    } else {
	return [c->popupbutton indexOfSelectedItem];
    }
}

int dlg_listbox_issel(union control *ctrl, void *dv, int index)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);

    if (c->tableview) {
	return [c->tableview isRowSelected:index];
    } else {
	return [c->popupbutton indexOfSelectedItem] == index;
    }
}

void dlg_listbox_select(union control *ctrl, void *dv, int index)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);

    if (c->tableview) {
	[c->tableview selectRow:index byExtendingSelection:NO];
    } else {
	[c->popupbutton selectItemAtIndex:index];
    }
}

void dlg_text_set(union control *ctrl, void *dv, char const *text)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);

    assert(c->textview);
    [c->textview setString:[NSString stringWithCString:text]];
}

void dlg_label_change(union control *ctrl, void *dlg, char const *text)
{
    /*
     * This function is currently only used by the config box to
     * switch the labels on the host and port boxes between serial
     * and network modes. Since OS X does not (yet?) have a serial
     * back end, this function can safely do nothing for the
     * moment.
     */
}

void dlg_filesel_set(union control *ctrl, void *dv, Filename fn)
{
    /* FIXME */
}

void dlg_filesel_get(union control *ctrl, void *dv, Filename *fn)
{
    /* FIXME */
}

void dlg_fontsel_set(union control *ctrl, void *dv, FontSpec fn)
{
    /* FIXME */
}

void dlg_fontsel_get(union control *ctrl, void *dv, FontSpec *fn)
{
    /* FIXME */
}

void dlg_update_start(union control *ctrl, void *dv)
{
    /* FIXME */
}

void dlg_update_done(union control *ctrl, void *dv)
{
    /* FIXME */
}

void dlg_set_focus(union control *ctrl, void *dv)
{
    /* FIXME */
}

union control *dlg_last_focused(union control *ctrl, void *dv)
{
    return NULL; /* FIXME */
}

void dlg_beep(void *dv)
{
    NSBeep();
}

void dlg_error_msg(void *dv, char *msg)
{
    /* FIXME */
}

void dlg_end(void *dv, int value)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    [d->target performSelector:d->action
     withObject:[NSNumber numberWithInt:value]];
}

void dlg_coloursel_start(union control *ctrl, void *dv,
			 int r, int g, int b)
{
    /* FIXME */
}

int dlg_coloursel_results(union control *ctrl, void *dv,
			  int *r, int *g, int *b)
{
    return 0; /* FIXME */
}

void dlg_refresh(union control *ctrl, void *dv)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c;

    if (ctrl) {
	if (ctrl->generic.handler != NULL)
	    ctrl->generic.handler(ctrl, d, d->data, EVENT_REFRESH);
    } else {
	int i;

	for (i = 0; (c = index234(d->byctrl, i)) != NULL; i++) {
	    assert(c->ctrl != NULL);
	    if (c->ctrl->generic.handler != NULL)
		c->ctrl->generic.handler(c->ctrl, d,
					 d->data, EVENT_REFRESH);
	}
    }
}

void *dlg_get_privdata(union control *ctrl, void *dv)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);
    return c->privdata;
}

void dlg_set_privdata(union control *ctrl, void *dv, void *ptr)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);
    c->privdata = ptr;
    c->privdata_needs_free = FALSE;
}

void *dlg_alloc_privdata(union control *ctrl, void *dv, size_t size)
{
    struct fe_dlg *d = (struct fe_dlg *)dv;
    struct fe_ctrl *c = fe_ctrl_byctrl(d, ctrl);
    /*
     * This is an internal allocation routine, so it's allowed to
     * use smalloc directly.
     */
    c->privdata = smalloc(size);
    c->privdata_needs_free = TRUE;
    return c->privdata;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -