g_error panelbar_install(struct widget *self) { /* Divtree set up almost exactly like the box widget */ g_error e; WIDGET_ALLOC_DATA(panelbardata); e = newdiv(&self->in,self); errorcheck; self->in->flags |= PG_S_BOTTOM; self->in->flags &= ~DIVNODE_SIZE_AUTOSPLIT; e = newdiv(&self->in->div,self); errorcheck; self->in->div->flags |= DIVNODE_SPLIT_BORDER; self->in->div->flags &= ~DIVNODE_SIZE_AUTOSPLIT; self->in->div->build = &build_bgfill_only; self->in->div->state = PGTH_O_PANELBAR_H; DATA->panelbar = self->in->div; self->out = &self->in->next; self->sub = &self->in->div->div; self->trigger_mask = PG_TRIGGER_ENTER | PG_TRIGGER_LEAVE | PG_TRIGGER_DOWN | PG_TRIGGER_UP | PG_TRIGGER_RELEASE | PG_TRIGGER_DRAG | PG_TRIGGER_MOVE; /* Panelbars use auto-orientation by default */ self->auto_orientation = PG_AUTO_SIDE | PG_AUTO_DIRECTION; #ifdef CONFIG_DRAGSOLID DATA->solid = get_param_int("pgserver","dragsolid",0); #endif return success; }
/* Set up divnodes */ g_error textedit_install(struct widget *self) { g_error e; WIDGET_ALLOC_DATA(texteditdata); /* main split */ e = newdiv(&self->in, self); errorcheck; self->in->flags |= PG_S_ALL; /* Visible node */ e = newdiv(&self->in->div, self); errorcheck; self->in->div->build = &textedit_build; self->in->div->state = PGTH_O_TEXTEDIT; self->in->div->flags = DIVNODE_SPLIT_EXPAND | DIVNODE_SIZE_AUTOSPLIT | DIVNODE_SIZE_RECURSIVE | DIVNODE_HOTSPOT; self->trigger_mask = PG_TRIGGER_ACTIVATE | PG_TRIGGER_DEACTIVATE | PG_TRIGGER_DRAG | PG_TRIGGER_DOWN | PG_TRIGGER_RELEASE | PG_TRIGGER_KEYUP | PG_TRIGGER_KEYDOWN | PG_TRIGGER_TIMER | PG_TRIGGER_NONTOOLBAR; self->out = &self->in->next; gropctxt_init(CTX,self->in->div); self->in->div->flags |= PG_S_RIGHT; self->in->div->flags &= ~DIVNODE_SIZE_AUTOSPLIT; DATA->fg = VID(color_pgtohwr) (TEXT_FG); DATA->bg = VID(color_pgtohwr) (TEXT_BG); DATA->highlight = VID(color_pgtohwr) (TEXT_HIGHLIGHT); DATA->bit = NULL; DATA->thumb_size = 0; DATA->thumb_top = 0; DATA->thumb_drag_start = 0; DATA->scroll_lock = 0; e = text_backend_init(DATA); errorcheck; self->in->div->flags |= PG_S_RIGHT; self->in->div->flags &= ~DIVNODE_SIZE_AUTOSPLIT; e = newdiv(&self->in->div->div,self); errorcheck; self->in->div->div->build = &textedit_build_scroll; self->in->div->div->state = PGTH_O_SCROLL; self->out = &self->in->div->next; DATA->self = self; return success; }
g_error tabpage_install(struct widget *self) { g_error e; struct widget *tab; WIDGET_INSTALL_PARENT(PG_WIDGET_BOX); WIDGET_ALLOC_DATA(tabpagedata); /* Set custom defaults */ e = widget_base_set(self, PG_WP_THOBJ, PGTH_O_TAB_PAGE); errorcheck; e = widget_base_set(self, PG_WP_SIZE, 0); errorcheck; /* Go ahead and create the tab. We will attach the tab * later when we're attached ourselves, but create it early so the * properties can be set. */ e = widget_create(&tab, &DATA->htab, PG_WIDGET_BUTTON, self->dt, self->container, self->owner); errorcheck; e = widget_set(tab, PG_WP_EXTDEVENTS, PG_EXEV_TOGGLE | PG_EXEV_EXCLUSIVE); errorcheck; e = widget_set(tab, PG_WP_THOBJ_BUTTON, PGTH_O_TAB); errorcheck; e = widget_set(tab, PG_WP_THOBJ_BUTTON_HILIGHT, PGTH_O_TAB_HILIGHT); errorcheck; e = widget_set(tab, PG_WP_THOBJ_BUTTON_ON, PGTH_O_TAB_ON); errorcheck; e = widget_set(tab, PG_WP_THOBJ_BUTTON_ON_NOHILIGHT, PGTH_O_TAB_ON_NOHILIGHT); errorcheck; tab->callback = &tabpage_tab_callback; tab->callback_owner = self; return success; }
g_error panel_install(struct widget *self) { struct widget *bar, *title; g_error e; WIDGET_ALLOC_DATA(paneldata); /* This split determines the size of the main panel area */ e = newdiv(&self->in,self); errorcheck; self->in->flags &= ~(DIVNODE_SIZE_AUTOSPLIT | DIVNODE_SIZE_RECURSIVE); self->in->flags |= PG_S_TOP; /* An optional border inside that main panel area */ e = newdiv(&self->in->div,self); errorcheck; self->in->div->flags &= ~(DIVNODE_SIZE_AUTOSPLIT | DIVNODE_SIZE_RECURSIVE); self->in->div->flags |= DIVNODE_SPLIT_BORDER; self->in->div->build = &build_panel_border; /* Create the panelbar widget */ e = widget_create(&bar,&DATA->hbar,PG_WIDGET_PANELBAR, self->dt,self->container,self->owner); errorcheck; e = widget_attach(bar,self->dt,&self->in->div->div,0); errorcheck; e = widget_set(bar,PG_WP_BIND,self->h); errorcheck; /* This draws the panel background */ e = newdiv(bar->out,self); errorcheck; DATA->bg = *bar->out; DATA->bg->flags |= DIVNODE_SPLIT_BORDER; DATA->bg->flags &= ~DIVNODE_SIZE_AUTOSPLIT; DATA->bg->build = &build_bgfill_only; DATA->bg->state = PGTH_O_PANEL; /* Set up us the container! */ self->out = &self->in->next; self->sub = &DATA->bg->div; /* Firstly, create a label widget in the panelbar to present the title */ title = NULL; e = widget_derive(&title,&DATA->hlabel,PG_WIDGET_LABEL,bar,DATA->hbar, PG_DERIVE_INSIDE,self->owner); errorcheck; widget_set(title,PG_WP_SIDE,PG_S_ALL); widget_set(title,PG_WP_THOBJ,PGTH_O_PANELBAR); /* Nextly, create the standard buttons for a panel app */ e = panel_std_button(&DATA->hzoom, self, PGTH_O_ZOOMBTN, PGTH_O_ZOOMBTN_ON, PGTH_O_ZOOMBTN_HILIGHT, PG_EXEV_TOGGLE, &panel_zoom_callback); errorcheck; e = panel_std_button(&DATA->hrotate, self, PGTH_O_ROTATEBTN, PGTH_O_ROTATEBTN_ON, PGTH_O_ROTATEBTN_HILIGHT, 0, &panel_rotate_callback); errorcheck; e = panel_std_button(&DATA->hclose, self, PGTH_O_CLOSEBTN, PGTH_O_CLOSEBTN_ON, PGTH_O_CLOSEBTN_HILIGHT, 0, &panel_close_callback); errorcheck; /* Make sure we default to our minimum rolled-up size */ widget_set(self, PG_WP_SIZE, 0); return success; }