📄 osxctrls.m
字号:
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 + -