int main(int argc, char *argv[]) { XtAppContext app_context; Widget toplevel = XtAppInitialize(&app_context, "Test-file", XtPointer(0), 0, &argc, argv, 0, XtPointer(0), 0); Widget box = XmCreateFileSelectionBox(toplevel, "open_file", 0, 0); XtManageChild(box); Widget help = XmFileSelectionBoxGetChild(box, XmDIALOG_HELP_BUTTON); XtSetSensitive(help, False); XtAddCallback(box, XmNokCallback, echoCB, 0); XtAddCallback(box, XmNcancelCallback, doneCB, 0); XtRealizeWidget(toplevel); XtAppMainLoop(app_context); return EXIT_SUCCESS; }
Widget XmCreateFileSelectionBox_TNK(Widget parent, String name, ArgList arglist,Cardinal argcount) { return XmCreateFileSelectionBox(parent, name, arglist, argcount);}
static int motFileDlgPopup(Ihandle* ih, int x, int y) { InativeHandle* parent = iupDialogGetNativeParent(ih); Widget filebox, dialog; int dialogtype, style = XmDIALOG_FULL_APPLICATION_MODAL; IFnss file_cb = NULL; Widget preview_canvas = NULL; char* value; iupAttribSetInt(ih, "_IUPDLG_X", x); /* used in iupDialogUpdatePosition */ iupAttribSetInt(ih, "_IUPDLG_Y", y); value = iupAttribGetStr(ih, "DIALOGTYPE"); if (iupStrEqualNoCase(value, "SAVE")) dialogtype = IUP_DIALOGSAVE; else if (iupStrEqualNoCase(value, "DIR")) dialogtype = IUP_DIALOGDIR; else dialogtype = IUP_DIALOGOPEN; iupAttribSetInt(ih, "_IUPDLG_DIALOGTYPE", dialogtype); if (parent) { filebox = XmCreateFileSelectionDialog(parent, "filedialog", NULL, 0); dialog = XtParent(filebox); } else { dialog = XtAppCreateShell(NULL, "filedialog", topLevelShellWidgetClass, iupmot_display, NULL, 0); filebox = XmCreateFileSelectionBox(dialog, "filebox", NULL, 0); style = XmDIALOG_MODELESS; XtVaSetValues(dialog, XmNmwmInputMode, MWM_INPUT_FULL_APPLICATION_MODAL, XmNmappedWhenManaged, False, XmNsaveUnder, True, NULL); } if (!filebox) return IUP_NOERROR; if (!iupAttribGetBoolean(ih, "SHOWHIDDEN")) XtVaSetValues(filebox, XmNfileFilterStyle, XmFILTER_HIDDEN_FILES, NULL); value = iupAttribGet(ih, "TITLE"); if (!value) { if (dialogtype == IUP_DIALOGSAVE) value = "IUP_SAVEAS"; else if (dialogtype == IUP_DIALOGOPEN) value = "IUP_OPEN"; else value = "IUP_SELECTDIR"; iupAttribSetStr(ih, "TITLE", iupStrMessageGet(value)); } iupmotSetString(filebox, XmNdialogTitle, value); XtVaSetValues(filebox, XmNdialogStyle, style, XmNautoUnmanage, False, XmNresizePolicy, XmRESIZE_GROW, NULL); if (dialogtype == IUP_DIALOGDIR) XtVaSetValues(filebox, XmNfileTypeMask, XmFILE_DIRECTORY, NULL); /* just check for the path inside FILE */ value = iupAttribGet(ih, "FILE"); if (value && value[0] == '/') { char* dir = iupStrFileGetPath(value); iupAttribStoreStr(ih, "DIRECTORY", dir); free(dir); } /* set XmNdirectory before XmNpattern and before XmNdirSpec */ value = iupAttribGet(ih, "DIRECTORY"); if (value) iupmotSetString(filebox, XmNdirectory, value); value = iupAttribGet(ih, "FILTER"); if (value) { char *filter = value; char *p = strchr(value, ';'); if (p) { /* Use only the first filter */ int size = p-value; filter = (char*)malloc(size+1); memcpy(filter, value, size); filter[size] = 0; } iupmotSetString(filebox, XmNpattern, filter); if (filter != value) free(filter); } value = iupAttribGet(ih, "FILE"); if (value) { char* file = value; if (value[0] != '/') /* if does not contains a full path, then add the directory */ { char* cur_dir = NULL; char* dir = iupAttribGet(ih, "DIRECTORY"); if (!dir) { cur_dir = iupdrvGetCurrentDirectory(); dir = cur_dir; } file = iupStrFileMakeFileName(dir, value); if (cur_dir) free(cur_dir); } /* clear value before setting. Do not know why we have to do this, but if not cleared it will fail to set the XmNdirSpec value. */ iupmotSetString(filebox, XmNdirSpec, ""); iupmotSetString(filebox, XmNdirSpec, file); if (file != value) free(file); } if (!IupGetCallback(ih, "HELP_CB")) XtUnmanageChild(XmFileSelectionBoxGetChild(filebox, XmDIALOG_HELP_BUTTON)); XtAddCallback(filebox, XmNokCallback, (XtCallbackProc)motFileDlgCallback, (XtPointer)ih); XtAddCallback(filebox, XmNcancelCallback, (XtCallbackProc)motFileDlgCallback, (XtPointer)ih); XtAddCallback(filebox, XmNhelpCallback, (XtCallbackProc)motFileDlgHelpCallback, (XtPointer)ih); if (dialogtype == IUP_DIALOGDIR) { Widget new_folder = XtVaCreateManagedWidget("new_folder", xmPushButtonWidgetClass, filebox, XmNlabelType, XmSTRING, NULL); iupmotSetString(new_folder, XmNlabelString, iupStrMessageGet("IUP_CREATEFOLDER")); XtAddCallback(new_folder, XmNactivateCallback, (XtCallbackProc)motFileDlgNewFolderCallback, (XtPointer)filebox); } else { file_cb = (IFnss)IupGetCallback(ih, "FILE_CB"); if (file_cb) { Widget list = XmFileSelectionBoxGetChild(filebox, XmDIALOG_LIST); XtAddCallback(list, XmNbrowseSelectionCallback, (XtCallbackProc)motFileDlgBrowseSelectionCallback, (XtPointer)ih); list = XmFileSelectionBoxGetChild(filebox, XmDIALOG_DIR_LIST); XtAddCallback(list, XmNbrowseSelectionCallback, (XtCallbackProc)motFileDlgBrowseSelectionCallback, (XtPointer)ih); if (iupAttribGetBoolean(ih, "SHOWPREVIEW")) { Widget frame = XtVaCreateManagedWidget("preview_canvas", xmFrameWidgetClass, filebox, XmNshadowType, XmSHADOW_ETCHED_IN, NULL); preview_canvas = XtVaCreateManagedWidget("preview_canvas", xmDrawingAreaWidgetClass, frame, XmNwidth, 180, XmNheight, 150, XmNresizePolicy, XmRESIZE_GROW, NULL); XtAddCallback(preview_canvas, XmNexposeCallback, (XtCallbackProc)motFileDlgPreviewCanvasExposeCallback, (XtPointer)ih); XtAddCallback(preview_canvas, XmNresizeCallback, (XtCallbackProc)motFileDlgPreviewCanvasResizeCallback, (XtPointer)ih); iupAttribSetStr(ih, "_IUPDLG_FILEBOX", (char*)filebox); } } if (iupAttribGetBoolean(ih, "MULTIPLEFILES")) { Widget wList = XmFileSelectionBoxGetChild(filebox, XmDIALOG_LIST); XtVaSetValues(wList, XmNselectionPolicy, XmEXTENDED_SELECT, NULL); if (file_cb) XtAddCallback(wList, XmNextendedSelectionCallback, (XtCallbackProc)motFileDlgBrowseSelectionCallback, (XtPointer)ih); } } XmAddWMProtocolCallback(dialog, iupmot_wm_deletewindow, motFileDlgCBclose, (XtPointer)ih); XtManageChild(filebox); XtRealizeWidget(dialog); ih->handle = dialog; iupDialogUpdatePosition(ih); ih->handle = NULL; /* reset handle */ if (file_cb) { if (preview_canvas) motFileDlgPreviewCanvasInit(ih, preview_canvas); file_cb(ih, NULL, "INIT"); } if (ih->userwidth && ih->userheight) { XtVaSetValues(dialog, XmNwidth, (XtArgVal)(ih->userwidth), XmNheight, (XtArgVal)(ih->userheight), NULL); } if (style == XmDIALOG_MODELESS) XtPopup(dialog, XtGrabExclusive); /* while the user hasn't provided an answer, simulate main loop. ** The answer changes as soon as the user selects one of the ** buttons and the callback routine changes its value. */ iupAttribSetStr(ih, "STATUS", NULL); while (iupAttribGet(ih, "STATUS") == NULL) XtAppProcessEvent(iupmot_appcontext, XtIMAll); if (file_cb) { if (preview_canvas) XFreeGC(iupmot_display, (GC)iupAttribGet(ih, "PREVIEWDC")); file_cb(ih, NULL, "FINISH"); } if (!iupAttribGet(ih, "_IUP_WM_DELETE")) { XtUnmanageChild(filebox); if (style == XmDIALOG_MODELESS) { XtPopdown(dialog); XtDestroyWidget(dialog); } } return IUP_NOERROR; }