static void gtkTabsSwitchPage(GtkNotebook* notebook, void* page, int pos, Ihandle* ih) { IFnnn cb = (IFnnn)IupGetCallback(ih, "TABCHANGE_CB"); int prev_pos = iupdrvTabsGetCurrentTab(ih); Ihandle* child = IupGetChild(ih, pos); Ihandle* prev_child = IupGetChild(ih, prev_pos); GtkWidget* tab_container = (GtkWidget*)iupAttribGet(child, "_IUPTAB_CONTAINER"); GtkWidget* prev_tab_container = (GtkWidget*)iupAttribGet(prev_child, "_IUPTAB_CONTAINER"); if (iupAttribGet(ih, "_IUPGTK_IGNORE_SWITCHPAGE")) return; if (tab_container) gtk_widget_show(tab_container); /* show new page, if any */ if (prev_tab_container) gtk_widget_hide(prev_tab_container); /* hide previous page, if any */ if (iupAttribGet(ih, "_IUPGTK_IGNORE_CHANGE")) return; if (cb) cb(ih, child, prev_child); else { IFnii cb2 = (IFnii)IupGetCallback(ih, "TABCHANGEPOS_CB"); if (cb2) cb2(ih, pos, prev_pos); } (void)notebook; (void)page; }
void iupTabsCheckCurrentTab(Ihandle* ih, int pos, int removed) { int cur_pos = iupdrvTabsGetCurrentTab(ih); if (cur_pos == pos) { int p; /* if given tab is the current tab, then the current tab must be changed to a visible tab */ Ihandle* child; /* this function is called after the child has being removed from the hierarchy, but before the system tab being removed. */ p = 0; if (removed && p == pos) p++; for (child = ih->firstchild; child; child = child->brother) { if (p != pos && iupdrvTabsIsTabVisible(child, p)) { iupdrvTabsSetCurrentTab(ih, p); return; } p++; if (removed && p == pos) p++; /* increment twice to compensate for child already removed */ } } }
static void gtkTabsChildRemovedMethod(Ihandle* ih, Ihandle* child, int pos) { if (ih->handle) { GtkWidget* tab_page = (GtkWidget*)iupAttribGet(child, "_IUPTAB_PAGE"); if (tab_page) { if (iupdrvTabsGetCurrentTab(ih) == pos) iupAttribSet(ih, "_IUPGTK_IGNORE_SWITCHPAGE", "1"); iupTabsCheckCurrentTab(ih, pos, 1); iupAttribSet(ih, "_IUPGTK_IGNORE_CHANGE", "1"); gtk_notebook_remove_page((GtkNotebook*)ih->handle, pos); iupAttribSet(ih, "_IUPGTK_IGNORE_CHANGE", NULL); iupAttribSet(child, "_IUPGTK_TABCLOSE", NULL); iupAttribSet(child, "_IUPGTK_TABIMAGE", NULL); iupAttribSet(child, "_IUPGTK_TABLABEL", NULL); iupAttribSet(child, "_IUPTAB_CONTAINER", NULL); iupAttribSet(child, "_IUPTAB_PAGE", NULL); if (iupAttribGet(ih, "_IUPGTK_IGNORE_SWITCHPAGE")) { gtkTabsSwitchManual(ih, child, pos); iupAttribSet(ih, "_IUPGTK_IGNORE_SWITCHPAGE", NULL); } } } }
static void motTabsChildRemovedMethod(Ihandle* ih, Ihandle* child) { if (ih->handle) { Widget child_manager = (Widget)iupAttribGet(child, "_IUPTAB_CONTAINER"); if (child_manager) { int cur_pos, pos; Widget tab_button = (Widget)iupAttribGet(child, "_IUPMOT_TABBUTTON"); cur_pos = iupdrvTabsGetCurrentTab(ih); pos = iupAttribGetInt(child, "_IUPMOT_TABNUMBER"); /* did not work when using XtVaGetValues(child_manager, XmNpageNumber) */ if (cur_pos == pos) { if (cur_pos == 0) cur_pos = 1; else cur_pos--; iupdrvTabsSetCurrentTab(ih, cur_pos); } XtDestroyWidget(tab_button); XtDestroyWidget(child_manager); /* compact the tab number usage */ motTabsUpdatePageNumber(ih); iupAttribSetStr(child, "_IUPTAB_CONTAINER", NULL); iupAttribSetStr(child, "_IUPMOT_TABBUTTON", NULL); iupAttribSetStr(child, "_IUPMOT_TABNUMBER", NULL); } } }
void iupdrvTabsSetCurrentTab(Ihandle* ih, int pos) { Ihandle* child = IupGetChild(ih, pos); Ihandle* prev_child = IupGetChild(ih, iupdrvTabsGetCurrentTab(ih)); IupSetAttribute(child, "VISIBLE", "YES"); IupSetAttribute(prev_child, "VISIBLE", "NO"); XtVaSetValues(ih->handle, XmNcurrentPageNumber, pos, NULL); }
static char* iTabsGetValueHandleAttrib(Ihandle* ih) { if (ih->handle) { int pos = iupdrvTabsGetCurrentTab(ih); return (char*)IupGetChild(ih, pos); } else return iupAttribGet(ih, "_IUPTABS_VALUE_HANDLE"); }
static void iTabsSetTab(Ihandle* ih, Ihandle* child, int pos) { if (ih->handle) { int cur_pos = iupdrvTabsGetCurrentTab(ih); if (cur_pos != pos && iupdrvTabsIsTabVisible(child, pos)) iupdrvTabsSetCurrentTab(ih, pos); } else iupAttribSet(ih, "_IUPTABS_VALUE_HANDLE", (char*)child); }
void iupdrvTabsSetCurrentTab(Ihandle* ih, int pos) { Ihandle* child = IupGetChild(ih, pos); Ihandle* prev_child = IupGetChild(ih, iupdrvTabsGetCurrentTab(ih)); Widget child_manager = (Widget)iupAttribGet(child, "_IUPTAB_CONTAINER"); Widget prev_child_manager = (Widget)iupAttribGet(prev_child, "_IUPTAB_CONTAINER"); XtMapWidget(child_manager); if (prev_child_manager) XtUnmapWidget(prev_child_manager); XtVaSetValues(ih->handle, XmNcurrentPageNumber, pos, NULL); }
static char* iTabsGetValuePosAttrib(Ihandle* ih) { if (ih->handle) { int pos = iupdrvTabsGetCurrentTab(ih); return iupStrReturnInt(pos); } else { Ihandle* child = (Ihandle*)iupAttribGet(ih, "_IUPTABS_VALUE_HANDLE"); int pos = IupGetChildPos(ih, child); if (pos != -1) /* found child */ return iupStrReturnInt(pos); } return NULL; }
void iupTabsCheckCurrentTab(Ihandle* ih, int pos) { int cur_pos = iupdrvTabsGetCurrentTab(ih); if (cur_pos == pos) { Ihandle* child; for (pos = 0, child = ih->firstchild; child; child = child->brother, pos++) { if (pos != cur_pos && iupdrvTabsIsTabVisible(child)) { iupdrvTabsSetCurrentTab(ih, pos); return; } } } }
static void gtkTabsSwitchManual(Ihandle* ih, Ihandle* prev_child, int prev_pos) { IFnnn cb = (IFnnn)IupGetCallback(ih, "TABCHANGE_CB"); int pos = iupdrvTabsGetCurrentTab(ih); Ihandle* child = IupGetChild(ih, pos); GtkWidget* tab_container = (GtkWidget*)iupAttribGet(child, "_IUPTAB_CONTAINER"); if (tab_container) gtk_widget_show(tab_container); /* show new page, if any */ if (cb) cb(ih, child, prev_child); else { IFnii cb2 = (IFnii)IupGetCallback(ih, "TABCHANGEPOS_CB"); if (cb2) cb2(ih, pos, prev_pos); } }
void iupTabsTestRemoveTab(Ihandle* ih, int pos) { int cur_pos = iupdrvTabsGetCurrentTab(ih); if (cur_pos == pos) { if (cur_pos == 0) { Ihandle* child = IupGetChild(ih, 1); if (!child) /* not found child, means only one child, do nothing */ return; cur_pos = 1; } else cur_pos--; iupdrvTabsSetCurrentTab(ih, cur_pos); } }
void gtkTabSwitchPage(GtkNotebook* notebook, GtkNotebookPage *page, int pos, Ihandle* ih) { IFnnn cb; Ihandle* child = IupGetChild(ih, pos); Ihandle* prev_child = IupGetChild(ih, iupdrvTabsGetCurrentTab(ih)); GtkWidget* tab_container = (GtkWidget*)iupAttribGet(child, "_IUPTAB_CONTAINER"); GtkWidget* prev_tab_container = (GtkWidget*)iupAttribGet(prev_child, "_IUPTAB_CONTAINER"); if (tab_container) gtk_widget_show(tab_container); if (prev_tab_container) gtk_widget_hide(prev_tab_container); if (iupAttribGet(ih, "_IUPGTK_IGNORE_CHANGE")) return; cb = (IFnnn)IupGetCallback(ih, "TABCHANGE_CB"); if (cb) cb(ih, child, prev_child); (void)notebook; (void)page; }
static char* iTabsGetValuePosAttrib(Ihandle* ih) { if (ih->handle) { int pos = iupdrvTabsGetCurrentTab(ih); char *str = iupStrGetMemory(50); sprintf(str, "%d", pos); return str; } else { Ihandle* child = (Ihandle*)iupAttribGet(ih, "_IUPTABS_VALUE_HANDLE"); int pos = IupGetChildPos(ih, child); if (pos != -1) /* found child */ { char *str = iupStrGetMemory(50); sprintf(str, "%d", pos); return str; } } return NULL; }
static void gtkTabsChildAddedMethod(Ihandle* ih, Ihandle* child) { if (IupGetName(child) == NULL) iupAttribSetHandleName(child); if (ih->handle) { GtkWidget *tab_page, *tab_container; GtkWidget *tab_label = NULL, *tab_image = NULL; char *tabtitle, *tabimage; int pos; unsigned char r, g, b; pos = IupGetChildPos(ih, child); tab_page = gtk_vbox_new(FALSE, 0); gtk_widget_show(tab_page); tab_container = gtk_fixed_new(); gtk_widget_show(tab_container); gtk_container_add((GtkContainer*)tab_page, tab_container); tabtitle = iupAttribGet(child, "TABTITLE"); if (!tabtitle) tabtitle = iupTabsAttribGetStrId(ih, "TABTITLE", pos); tabimage = iupAttribGet(child, "TABIMAGE"); if (!tabimage) tabimage = iupTabsAttribGetStrId(ih, "TABIMAGE", pos); if (!tabtitle && !tabimage) tabtitle = " "; if (tabtitle) { tab_label = gtk_label_new(iupgtkStrConvertToUTF8(tabtitle)); #if GTK_CHECK_VERSION(2, 6, 0) if (ih->data->orientation == ITABS_VERTICAL) gtk_label_set_angle((GtkLabel*)tab_label, 90); #endif } if (tabimage) { GdkPixbuf* pixbuf = iupImageGetImage(tabimage, ih, 0); tab_image = gtk_image_new(); if (pixbuf) gtk_image_set_from_pixbuf((GtkImage*)tab_image, pixbuf); } iupAttribSetStr(ih, "_IUPGTK_IGNORE_CHANGE", "1"); if (tabimage && tabtitle) { GtkWidget* box; if (ih->data->orientation == ITABS_VERTICAL) box = gtk_vbox_new(FALSE, 2); else box = gtk_hbox_new(FALSE, 2); gtk_widget_show(box); gtk_container_add((GtkContainer*)box, tab_image); gtk_container_add((GtkContainer*)box, tab_label); gtk_notebook_insert_page((GtkNotebook*)ih->handle, tab_page, box, pos); gtk_notebook_set_menu_label_text((GtkNotebook*)ih->handle, tab_page, gtk_label_get_text((GtkLabel*)tab_label)); } else if (tabimage) gtk_notebook_insert_page((GtkNotebook*)ih->handle, tab_page, tab_image, pos); else gtk_notebook_insert_page((GtkNotebook*)ih->handle, tab_page, tab_label, pos); gtk_widget_realize(tab_page); iupAttribSetStr(child, "_IUPGTK_TABIMAGE", (char*)tab_image); /* store it even if its NULL */ iupAttribSetStr(child, "_IUPGTK_TABLABEL", (char*)tab_label); iupAttribSetStr(child, "_IUPTAB_CONTAINER", (char*)tab_container); iupAttribSetStr(child, "_IUPTAB_PAGE", (char*)tab_page); iupStrToRGB(IupGetAttribute(ih, "BGCOLOR"), &r, &g, &b); iupgtkBaseSetBgColor(tab_container, r, g, b); if (tabtitle) { PangoFontDescription* fontdesc = (PangoFontDescription*)iupgtkGetPangoFontDescAttrib(ih); gtk_widget_modify_font(tab_label, fontdesc); iupgtkFontUpdatePangoLayout(ih, gtk_label_get_layout((GtkLabel*)tab_label)); iupgtkBaseSetBgColor(tab_label, r, g, b); iupStrToRGB(IupGetAttribute(ih, "FGCOLOR"), &r, &g, &b); iupgtkBaseSetFgColor(tab_label, r, g, b); gtk_widget_show(tab_label); gtk_widget_realize(tab_label); } if (tabimage) { gtk_widget_show(tab_image); gtk_widget_realize(tab_image); } iupAttribSetStr(ih, "_IUPGTK_IGNORE_CHANGE", NULL); if (pos != iupdrvTabsGetCurrentTab(ih)) gtk_widget_hide(tab_container); } }
static void motTabsChildAddedMethod(Ihandle* ih, Ihandle* child) { if (IupGetName(child) == NULL) iupAttribSetHandleName(child); if (ih->handle) { Widget child_manager; Widget tab_button; int num_args = 0, pos; Arg args[30]; char *tabtitle, *tabimage, *background; Pixel color; /* open space for new tab number */ motTabsUpdatePageNumber(ih); pos = IupGetChildPos(ih, child); /* Create pages */ child_manager = XtVaCreateManagedWidget( "child_manager", xmBulletinBoardWidgetClass, ih->handle, /* Core */ XmNborderWidth, 0, /* Manager */ XmNshadowThickness, 0, XmNnavigationType, XmTAB_GROUP, XmNuserData, child, /* used only in motTabsConfigureNotify */ /* BulletinBoard */ XmNmarginWidth, 0, XmNmarginHeight, 0, XmNresizePolicy, XmRESIZE_NONE, /* no automatic resize of children */ /* Notebook Constraint */ XmNnotebookChildType, XmPAGE, XmNpageNumber, pos, XmNresizable, True, NULL); XtOverrideTranslations(child_manager, XtParseTranslationTable("<Configure>: iupTabsConfigure()")); tabtitle = iupAttribGet(child, "TABTITLE"); if (!tabtitle) tabtitle = iupTabsAttribGetStrId(ih, "TABTITLE", pos); tabimage = iupAttribGet(child, "TABIMAGE"); if (!tabimage) tabimage = iupTabsAttribGetStrId(ih, "TABIMAGE", pos); if (!tabtitle && !tabimage) tabtitle = " "; /* Create tabs */ /* Label */ iupmotSetArg(args, num_args, XmNlabelType, tabtitle? XmSTRING: XmPIXMAP); iupmotSetArg(args, num_args, XmNmarginHeight, 0); iupmotSetArg(args, num_args, XmNmarginWidth, 0); /* Notebook Constraint */ iupmotSetArg(args, num_args, XmNnotebookChildType, XmMAJOR_TAB); iupmotSetArg(args, num_args, XmNpageNumber, pos); tab_button = XtCreateManagedWidget("tab_button", xmPushButtonWidgetClass, ih->handle, args, num_args); /* Disable Drag Source */ iupmotDisableDragSource(tab_button); XtAddEventHandler(tab_button, EnterWindowMask, False, (XtEventHandler)iupmotEnterLeaveWindowEvent, (XtPointer)ih); XtAddEventHandler(tab_button, LeaveWindowMask, False, (XtEventHandler)iupmotEnterLeaveWindowEvent, (XtPointer)ih); XtAddEventHandler(tab_button, FocusChangeMask, False, (XtEventHandler)iupmotFocusChangeEvent, (XtPointer)ih); XtAddEventHandler(tab_button, KeyPressMask, False, (XtEventHandler)iupmotKeyPressEvent, (XtPointer)ih); if (tabtitle) iupmotSetString(tab_button, XmNlabelString, tabtitle); else { Pixmap pixmap = (Pixmap)iupImageGetImage(tabimage, ih, 0); if (pixmap) XtVaSetValues(tab_button, XmNlabelPixmap, pixmap, NULL); } background = iupBaseNativeParentGetBgColorAttrib(ih); color = iupmotColorGetPixelStr(background); if (color != -1) iupmotSetBgColor(child_manager, color); else { Pixmap pixmap = (Pixmap)iupImageGetImage(background, ih, 0); if (pixmap) { XtVaSetValues(child_manager, XmNbackgroundPixmap, pixmap, NULL); } } background = iupAttribGetStr(ih, "BGCOLOR"); color = iupmotColorGetPixelStr(background); if (color != -1) iupmotSetBgColor(tab_button, color); color = iupmotColorGetPixelStr(IupGetAttribute(ih, "FGCOLOR")); XtVaSetValues(tab_button, XmNforeground, color, NULL); XtRealizeWidget(child_manager); XtRealizeWidget(tab_button); iupAttribSetStr(child, "_IUPTAB_CONTAINER", (char*)child_manager); iupAttribSetStr(child, "_IUPMOT_TABBUTTON", (char*)tab_button); iupAttribSetInt(child, "_IUPMOT_TABNUMBER", pos); if (pos != iupdrvTabsGetCurrentTab(ih)) XtUnmapWidget(child_manager); } }
/* ------------------------------------------------------------------------- */ static void gtkTabsChildAddedMethod(Ihandle* ih, Ihandle* child) { /* make sure it has at least one name */ if (!iupAttribGetHandleName(child)) iupAttribSetHandleName(child); if (ih->handle) { GtkWidget *evtBox, *tab_page, *tab_container, *box = NULL; GtkWidget *tab_label = NULL, *tab_image = NULL, *tab_close = NULL; char *tabtitle, *tabimage; int pos; unsigned char r, g, b; pos = IupGetChildPos(ih, child); /* Can not hide the tab_page, or the tab will be automatically hidden. So create a secondary container to hide its child instead. */ #if GTK_CHECK_VERSION(3, 0, 0) tab_page = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); #else tab_page = gtk_vbox_new(FALSE, 0); #endif gtk_widget_show(tab_page); tab_container = gtk_fixed_new(); /* can not use iupgtkNativeContainerNew in GTK3 */ gtk_widget_show(tab_container); gtk_container_add((GtkContainer*)tab_page, tab_container); tabtitle = iupAttribGet(child, "TABTITLE"); if (!tabtitle) { tabtitle = iupAttribGetId(ih, "TABTITLE", pos); if (tabtitle) iupAttribSetStr(child, "TABTITLE", tabtitle); } tabimage = iupAttribGet(child, "TABIMAGE"); if (!tabimage) { tabimage = iupAttribGetId(ih, "TABIMAGE", pos); if (tabimage) iupAttribSetStr(child, "TABIMAGE", tabimage); } if (!tabtitle && !tabimage) tabtitle = " "; if (tabtitle) { tab_label = gtk_label_new(NULL); iupgtkSetMnemonicTitle(ih, (GtkLabel*)tab_label, tabtitle); #if GTK_CHECK_VERSION(2, 6, 0) if (ih->data->orientation == ITABS_VERTICAL) gtk_label_set_angle((GtkLabel*)tab_label, 90); #endif } if (tabimage) { GdkPixbuf* pixbuf = iupImageGetImage(tabimage, ih, 0); tab_image = gtk_image_new(); if (pixbuf) gtk_image_set_from_pixbuf((GtkImage*)tab_image, pixbuf); } if(ih->data->show_close) { #if GTK_CHECK_VERSION(3, 10, 0) GtkWidget* image = gtk_image_new_from_icon_name("window-close", GTK_ICON_SIZE_MENU); #else GtkWidget* image = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); #endif tab_close = gtk_button_new(); gtk_button_set_image((GtkButton*)tab_close, image); gtk_button_set_relief((GtkButton*)tab_close, GTK_RELIEF_NONE); gtk_button_set_focus_on_click((GtkButton*)tab_close, FALSE); iupgtkSetCanFocus(tab_close, FALSE); g_signal_connect(G_OBJECT(tab_close), "clicked", G_CALLBACK(gtkTabsCloseButtonClicked), child); } iupAttribSet(ih, "_IUPGTK_IGNORE_CHANGE", "1"); if ((tabimage && tabtitle) || ih->data->show_close) { #if GTK_CHECK_VERSION(3, 0, 0) if (ih->data->orientation == ITABS_VERTICAL) box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 2); else box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2); #else if (ih->data->orientation == ITABS_VERTICAL) box = gtk_vbox_new(FALSE, 2); else box = gtk_hbox_new(FALSE, 2); #endif gtk_widget_show(box); } /* RIGHTCLICK_CB will not work without the eventbox */ evtBox = gtk_event_box_new(); gtk_widget_add_events(evtBox, GDK_BUTTON_PRESS_MASK); g_signal_connect(G_OBJECT(evtBox), "button-press-event", G_CALLBACK(gtkTabsButtonPressEvent), child); if (tabimage && tabtitle) { gtk_container_add((GtkContainer*)box, tab_image); gtk_container_add((GtkContainer*)box, tab_label); if(ih->data->show_close) gtk_container_add((GtkContainer*)box, tab_close); gtk_container_add((GtkContainer*)evtBox, box); gtk_notebook_insert_page((GtkNotebook*)ih->handle, tab_page, evtBox, pos); gtk_notebook_set_menu_label_text((GtkNotebook*)ih->handle, tab_page, gtk_label_get_text((GtkLabel*)tab_label)); } else if(tabimage && ih->data->show_close) { gtk_container_add((GtkContainer*)box, tab_image); gtk_container_add((GtkContainer*)box, tab_close); gtk_container_add((GtkContainer*)evtBox, box); gtk_notebook_insert_page((GtkNotebook*)ih->handle, tab_page, evtBox, pos); } else if(tabtitle && ih->data->show_close) { gtk_container_add((GtkContainer*)box, tab_label); gtk_container_add((GtkContainer*)box, tab_close); gtk_container_add((GtkContainer*)evtBox, box); gtk_notebook_insert_page((GtkNotebook*)ih->handle, tab_page, evtBox, pos); gtk_notebook_set_menu_label_text((GtkNotebook*)ih->handle, tab_page, gtk_label_get_text((GtkLabel*)tab_label)); } else if (tabimage) { gtk_container_add((GtkContainer*)evtBox, tab_image); gtk_notebook_insert_page((GtkNotebook*)ih->handle, tab_page, evtBox, pos); } else { gtk_container_add((GtkContainer*)evtBox, tab_label); gtk_notebook_insert_page((GtkNotebook*)ih->handle, tab_page, evtBox, pos); } gtk_widget_realize(tab_page); iupAttribSet(child, "_IUPGTK_TABCLOSE", (char*)tab_close); iupAttribSet(child, "_IUPGTK_TABIMAGE", (char*)tab_image); /* store it even if its NULL */ iupAttribSet(child, "_IUPGTK_TABLABEL", (char*)tab_label); iupAttribSet(child, "_IUPTAB_CONTAINER", (char*)tab_container); iupAttribSet(child, "_IUPTAB_PAGE", (char*)tab_page); iupStrToRGB(IupGetAttribute(ih, "BGCOLOR"), &r, &g, &b); iupgtkSetBgColor(tab_container, r, g, b); if (tabtitle) { iupgtkUpdateWidgetFont(ih, tab_label); iupgtkSetBgColor(tab_label, r, g, b); iupStrToRGB(IupGetAttribute(ih, "FGCOLOR"), &r, &g, &b); iupgtkSetFgColor(tab_label, r, g, b); gtk_widget_show(tab_label); gtk_widget_realize(tab_label); } if (tabimage) { gtk_widget_show(tab_image); gtk_widget_realize(tab_image); } if (ih->data->show_close) { gtk_widget_show(tab_close); gtk_widget_realize(tab_close); } iupAttribSet(ih, "_IUPGTK_IGNORE_CHANGE", NULL); if (pos != iupdrvTabsGetCurrentTab(ih)) gtk_widget_hide(tab_container); } }