/*----------------------------------------------------------------------*/ /* extern */ Widget XfeMenuItemNextItem(Widget item) { int position_index; Widget parent; Cardinal num_children; Widget next = NULL; assert( _XfeIsAlive(item) ); assert( XtIsObject(item) ); parent = _XfeParent(item); assert( XmIsRowColumn(_XfeParent(item)) ); position_index = XfeMenuItemPositionIndex(item); num_children = _XfemNumChildren(parent); if (position_index < (num_children - 1)) { next = _XfeChildrenIndex(parent,position_index + 1); } return next; }
/*----------------------------------------------------------------------*/ static void DrawHighlight(Widget w,XEvent * event,Region region,XRectangle * clip_rect) { XfeComboBoxPart * cp = _XfeComboBoxPart(w); /* Make sure the highlight is needed */ if (!cp->highlight_thickness || !_XfeIsRealized(w)) { return; } if (cp->highlighted) { _XmDrawSimpleHighlight(XtDisplay(w), _XfeWindow(w), _XfemHighlightGC(w), 0,0, _XfeWidth(w),_XfeHeight(w), cp->highlight_thickness); } else { assert( XmIsManager(_XfeParent(w)) ); _XmDrawSimpleHighlight(XtDisplay(w), _XfeWindow(w), _XfemBackgroundGC(_XfeParent(w)), 0,0, _XfeWidth(w),_XfeHeight(w), cp->highlight_thickness); } }
/*----------------------------------------------------------------------*/ /* extern */ Widget XfeMenuItemPreviousItem(Widget item) { int position_index; Widget parent; Cardinal num_children; Widget previous = NULL; assert( _XfeIsAlive(item) ); assert( XtIsObject(item) ); parent = _XfeParent(item); assert( XmIsRowColumn(_XfeParent(item)) ); position_index = XfeMenuItemPositionIndex(item); num_children = _XfemNumChildren(parent); if (position_index > 0) { previous = _XfeChildrenIndex(parent,position_index - 1); } return previous; }
/*----------------------------------------------------------------------*/ static void ListManage(Widget w) { XfeComboBoxPart * cp = _XfeComboBoxPart(w); assert( _XfeIsAlive(cp->shell) ); assert( _XfeIsAlive(cp->list) ); printf("ListManage(%s)\n",XtName(w)); /* cp->remain_popped_up = True; */ /* popped up */ cp->popped_up = True; /* Manage the scrolled window */ XtManageChild(_XfeParent(cp->list)); ShellPopup(w); #if 0 XmUpdateDisplay(w); XFlush(XtDisplay(w)); #endif /* _XmPopupSpringLoaded(w); */ }
/*----------------------------------------------------------------------*/ static Widget ListCreate(Widget w) { XfeComboBoxPart * cp = _XfeComboBoxPart(w); Widget list = NULL; Arg av[10]; Cardinal ac = 0; assert( _XfeIsAlive(cp->shell) ); XtSetArg(av[ac],XmNbackground, _XfeBackgroundPixel(w)); ac++; XtSetArg(av[ac],XmNforeground, _XfemForeground(w)); ac++; XtSetArg(av[ac],XmNshadowThickness, _XfemShadowThickness(w)); ac++; list = XmCreateScrolledList(cp->shell,LIST_NAME,av,ac); XtManageChild(list); XtUnmanageChild(_XfeParent(list)); /* _XfeResizeWidget(list,400,500); */ /* _XfeResizeWidget(cp->shell,400,500); */ return list; }
/*----------------------------------------------------------------------*/ /* extern */ void XfeMenuItemEraseAccent(Widget item, unsigned char accent_type, Dimension offset_left, Dimension offset_right, Dimension shadow_thickness, Dimension accent_thickness) { Widget pw; GC gc; XGCValues values; int subwindow_mode; /* duh */ if (accent_type == XmACCENT_NONE) { return; } assert( _XfeIsAlive(item) ); assert( XmIsPushButton(item) || XmIsCascadeButton(item) ); pw = _XfeParent(item); assert( XmIsRowColumn(pw) ); gc = _XfemBackgroundGC(pw); /* Remember the old wubwindow mode values */ XGetGCValues(XtDisplay(item),gc,GCSubwindowMode,&values); subwindow_mode = values.subwindow_mode; /* Force the subwindow mode to IncludeInferiors */ XSetSubwindowMode(XtDisplay(item),gc,IncludeInferiors); switch(accent_type) { case XmACCENT_BOTTOM: AccentBottom(item,gc,None,offset_left,offset_right, shadow_thickness,accent_thickness,ACCENT_ERASE); break; case XmACCENT_ALL: AccentAll(item,gc,None,offset_left,offset_right, shadow_thickness,accent_thickness,ACCENT_ERASE); break; case XmACCENT_TOP: AccentTop(item,gc,None,offset_left,offset_right, shadow_thickness,accent_thickness,ACCENT_ERASE); break; default: break; } /* Restore the old subwindow mode */ XSetSubwindowMode(XtDisplay(item),gc,subwindow_mode); }
/*----------------------------------------------------------------------*/ static void ActionHighlight(Widget item,XEvent * event,char ** params,Cardinal * nparams) { Widget w = XfeIsComboBox(item) ? item : _XfeParent(item); XmProcessTraversal(w,XmTRAVERSE_CURRENT); }
/*----------------------------------------------------------------------*/ static void ActionPopdown(Widget item,XEvent * event,char ** params,Cardinal * nparams) { Widget w = XfeIsComboBox(item) ? item : _XfeParent(item); XfeComboBoxPart * cp = _XfeComboBoxPart(w); #if 1 printf("ActionPopdown(%s)\n",XtName(w)); #endif if (cp->delay_timer_id) { StickRemoveTimeout(w); } else { ListUnmanage(w); } XtVaSetValues(cp->arrow,XmNarmed,False,NULL); /* if (!cp->remain_popped_up) */ /* { */ /* XtPopdown(cp->shell); */ /* } */ /* cp->remain_popped_up = False; */ /* ListUnmanage(w); */ /* XUnmapWindow(XtDisplay(w),_XfeWindow(cp->shell)); */ }
/*----------------------------------------------------------------------*/ static Boolean AcceptChild(Widget child) { Widget w = _XfeParent(child); XfeFancyBoxPart * fp = _XfeFancyBoxPart(w); return (!_XfeIsAlive(fp->icon) && XfeIsButton(child)); }
/*----------------------------------------------------------------------*/ static void ActionPopup(Widget item,XEvent * event,char ** params,Cardinal * nparams) { Widget w = XfeIsComboBox(item) ? item : _XfeParent(item); XfeComboBoxPart * cp = _XfeComboBoxPart(w); int space_below = ScreenGetSpaceBelow(w); int space_above = ScreenGetSpaceAbove(w); #if 1 printf("ActionPopup(%s,above = %d,below = %d)\n", XtName(w), space_above, space_below); #endif /* Check if we are already popped up */ if (cp->popped_up) { printf("already popped up\n"); StickRemoveTimeout(w); ListUnmanage(w); XtVaSetValues(cp->arrow,XmNarmed,False,NULL); return; } space_below = 200; _XfeConfigureWidget(cp->shell, XfeRootX(w), XfeRootY(w) + _XfeHeight(w), _XfeWidth(w), space_below); /* XtVaSetValues(cp->list, */ /* XmNlistMarginWidth, 100, */ /* NULL); */ /* XtVaSetValues(cp->arrow,XmCArmed,True,NULL); */ /* XtPopup(cp->shell,XtGrabNone); */ /* XMapRaised(XtDisplay(w),_XfeWindow(cp->shell)); */ /* XMapRaised(XtDisplay(w),_XfeWindow(cp->shell)); */ cp->remain_popped_up = False; #if 1 StickAddTimeout(w); #endif XtVaSetValues(cp->arrow,XmNarmed,True,NULL); ListManage(w); }
/*----------------------------------------------------------------------*/ static Boolean DeleteChild(Widget child) { Widget w = _XfeParent(child); XfeFancyBoxPart * fp = _XfeFancyBoxPart(w); fp->icon = NULL; return True; }
/*----------------------------------------------------------------------*/ static Boolean InsertChild(Widget child) { Widget w = _XfeParent(child); XfeFancyBoxPart * fp = _XfeFancyBoxPart(w); fp->icon = child; return True; }
/*----------------------------------------------------------------------*/ /* extern */ int XfeMenuItemPositionIndex(Widget item) { XmRowColumnConstraintRec * rccp; assert( _XfeIsAlive(item) ); assert( XmIsRowColumn(_XfeParent(item)) ); assert( XtIsObject(item) ); rccp = (XmRowColumnConstraintRec *) (item -> core . constraints); return (int) rccp -> row_column . position_index; }
/*----------------------------------------------------------------------*/ static void AccentBottom(Widget w, GC top_gc, GC bottom_gc, Dimension offset_left, Dimension offset_right, Dimension shadow_thickness, Dimension accent_thickness, int code) { Widget pw = _XfeParent(w); int position_index = XfeMenuItemPositionIndex(w); Cardinal num_children = _XfemNumChildren(pw); Position x; Position y; Dimension width; Dimension height = 2 * shadow_thickness + accent_thickness; assert( code == ACCENT_DRAW || code == ACCENT_ERASE ); /* Last item */ if (position_index == (num_children - 1)) { x = _XfeX(w) + offset_left; y = _XfeY(w) + _XfeHeight(w) - height; width = _XfeWidth(w) - offset_left - offset_right; } /* Any other item */ else { x = _XfeX(w) + offset_left; y = _XfeY(w) + _XfeHeight(w) - height / 2; width = _XfeWidth(w) - offset_left - offset_right; } if (code == ACCENT_DRAW) { /* Draw accent */ _XmDrawShadows(XtDisplay(pw),_XfeWindow(pw),top_gc,bottom_gc, x,y,width,height,shadow_thickness,XmSHADOW_IN); } else { /* Erase accent */ XfeDrawRectangle(XtDisplay(pw),_XfeWindow(pw),top_gc, x,y,width,height,shadow_thickness); } }
/*----------------------------------------------------------------------*/ static void ListUnmanage(Widget w) { XfeComboBoxPart * cp = _XfeComboBoxPart(w); assert( _XfeIsAlive(cp->shell) ); assert( _XfeIsAlive(cp->list) ); /* not popped up */ cp->popped_up = False; /* Unmanage the scrolled window */ XtUnmanageChild(_XfeParent(cp->list)); ShellPopdown(w); }
/*----------------------------------------------------------------------*/ /* extern */ Widget XfeMenuItemAtPosition(Widget menu,int position) { Widget item = NULL; #if 0 XmRowColumnConstraintRec * rccp; assert( _XfeIsAlive(item) ); assert( XmIsRowColumn(_XfeParent(item)) ); rccp = (XmRowColumnConstraintRec *) (item -> core . constraints); return (int) rccp -> row_column . position_index; #endif return item; }
/*----------------------------------------------------------------------*/ static void AccentAll(Widget w, GC top_gc, GC bottom_gc, Dimension offset_left, Dimension offset_right, Dimension shadow_thickness, Dimension accent_thickness, int code) { #if 1 if (code == ACCENT_DRAW) { /* Draw accent */ _XmDrawShadows(XtDisplay(w),_XfeWindow(w), top_gc,bottom_gc, _XfeHighlightThickness(w), _XfeHighlightThickness(w), _XfeWidth(w) - 2 * _XfeHighlightThickness(w), _XfeHeight(w) - 2 * _XfeHighlightThickness(w), _XfeShadowThickness(w), XmSHADOW_OUT); } else { /* Erase accent */ XfeDrawRectangle(XtDisplay(w),_XfeWindow(w),top_gc, _XfeHighlightThickness(w), _XfeHighlightThickness(w), _XfeWidth(w) - 2 * _XfeHighlightThickness(w), _XfeHeight(w) - 2 * _XfeHighlightThickness(w), _XfeShadowThickness(w)); } #else Widget pw = _XfeParent(w); int position_index = XfeMenuItemPositionIndex(w); Cardinal num_children = _XfemNumChildren(pw); Position x; Position y; Dimension width; Dimension height; Dimension total_thickness = shadow_thickness + accent_thickness; assert( code == ACCENT_DRAW || code == ACCENT_ERASE ); /* One and only */ if (num_children == 1) { x = _XfeX(w) + offset_left; y = _XfeY(w); width = _XfeWidth(w) - offset_left - offset_right; height = _XfeHeight(w); } else { Dimension overlap = (2 * shadow_thickness + accent_thickness) / 2; /* First item */ if (position_index == 0) { x = _XfeX(w) + offset_left; y = _XfeY(w); width = _XfeWidth(w) - offset_left - offset_right; height = _XfeHeight(w) + overlap; } /* Last item */ else if (position_index == (num_children - 1)) { x = _XfeX(w) + offset_left; y = _XfeY(w) - overlap; width = _XfeWidth(w) - offset_left - offset_right; height = _XfeHeight(w) + overlap; } /* In between two others */ else { x = _XfeX(w) + offset_left; y = _XfeY(w) - overlap; width = _XfeWidth(w) - offset_left - offset_right; height = _XfeHeight(w) + 2 * total_thickness; } } if (code == ACCENT_DRAW) { /* Draw accent */ _XmDrawShadows(XtDisplay(pw),_XfeWindow(pw),top_gc,bottom_gc, x,y,width,height,shadow_thickness,XmSHADOW_IN); x += total_thickness; y += total_thickness; width -= (2 * total_thickness); height -= (2 * total_thickness); _XmDrawShadows(XtDisplay(pw),_XfeWindow(pw),top_gc,bottom_gc, x,y,width,height,shadow_thickness,XmSHADOW_OUT); } else { /* Erase accent */ XfeDrawRectangle(XtDisplay(pw),_XfeWindow(pw),top_gc, x,y,width,height,shadow_thickness); x += total_thickness; y += total_thickness; width -= (2 * total_thickness); height -= (2 * total_thickness); XfeDrawRectangle(XtDisplay(pw),_XfeWindow(pw),top_gc, x,y,width,height,shadow_thickness); } #endif }