diff options
author | Pixel <pixel@nobis-crew.org> | 2010-06-15 00:59:57 -0700 |
---|---|---|
committer | Pixel <pixel@nobis-crew.org> | 2010-06-15 00:59:57 -0700 |
commit | eed0eb6a476d54ce19aeff137984aa981d9e3976 (patch) | |
tree | 807891636efd2f87dcbd261e971216269973ae07 /iup/src/mot/iupmot_filedlg.c | |
parent | ccc8261e4d48de89da4ddfe7b55e378ae0cd6f47 (diff) |
Upgrading to iup 3.1
Diffstat (limited to 'iup/src/mot/iupmot_filedlg.c')
-rwxr-xr-x | iup/src/mot/iupmot_filedlg.c | 104 |
1 files changed, 93 insertions, 11 deletions
diff --git a/iup/src/mot/iupmot_filedlg.c b/iup/src/mot/iupmot_filedlg.c index 768dd2b..0be6319 100755 --- a/iup/src/mot/iupmot_filedlg.c +++ b/iup/src/mot/iupmot_filedlg.c @@ -17,6 +17,7 @@ #include <Xm/DrawingA.h> #include <Xm/PushB.h> #include <Xm/Frame.h> +#include <Xm/List.h> #include "iup.h" #include "iupcbs.h" @@ -28,6 +29,7 @@ #include "iup_dialog.h" #include "iup_strmessage.h" #include "iup_drvinfo.h" +#include "iup_array.h" #include "iupmot_drv.h" @@ -87,14 +89,14 @@ static int motFileDlgCheckValue(Ihandle* ih, Widget w) return 0; } } - else + else if (!iupAttribGetBoolean(ih, "MULTIPLEFILES")) { if (iupdrvIsDirectory(value)) /* selected a directory */ { iupStrMessageShowError(ih, "IUP_INVALIDDIR"); return 0; } - else if (!iupdrvIsFile(value)) /* new file */ + else if (!iupdrvIsFile(value)) /* not a file == new file */ { value = iupAttribGet(ih, "ALLOWNEW"); if (!value) @@ -132,6 +134,51 @@ static void motFileDlgCBclose(Widget w, XtPointer client_data, XtPointer call_da iupAttribSetStr(ih, "_IUP_WM_DELETE", "1"); } +static int motFileDlgGetMultipleFiles(Ihandle* ih, const char* dir, Widget wList) +{ + int *pos, sel_count, dir_len; + int i, len, cur_len; + char *filename, *all_names; + Iarray* names_array; + XmString* items; + + if (!XmListGetSelectedPos(wList, &pos, &sel_count)) + return 0; + + names_array = iupArrayCreate(1024, 1); /* just set an initial size, but count is 0 */ + XtVaGetValues(wList, XmNitems, &items, NULL); + + cur_len = strlen(dir); + + all_names = iupArrayAdd(names_array, cur_len+1); + memcpy(all_names, dir, cur_len); + all_names[cur_len] = '|'; + dir_len = cur_len; + cur_len++; /* skip separator */ + + for (i = 0; i<sel_count; i++) + { + filename = iupmotConvertString(items[pos[i]-1]); /* XmListGetSelectedPos starts at 1 */ + len = strlen(filename)-dir_len; + + cur_len = iupArrayCount(names_array); + all_names = iupArrayAdd(names_array, len+1); + memcpy(all_names+cur_len, filename+dir_len, len); + all_names[cur_len+len] = '|'; + } + + XtFree((char*)pos); + + cur_len = iupArrayCount(names_array); + all_names = iupArrayInc(names_array); + all_names[cur_len+1] = 0; + + iupAttribStoreStr(ih, "VALUE", all_names); + + iupArrayDestroy(names_array); + return 1; +} + static void motFileDlgCallback(Widget w, Ihandle* ih, XmFileSelectionBoxCallbackStruct* call_data) { (void)w; @@ -151,14 +198,38 @@ static void motFileDlgCallback(Widget w, Ihandle* ih, XmFileSelectionBoxCallback iupAttribSetStr(ih, "STATUS", "0"); iupAttribSetStr(ih, "FILEEXIST", NULL); } + else if (iupAttribGetBoolean(ih, "MULTIPLEFILES")) + { + Widget wList = XmFileSelectionBoxGetChild(w, XmDIALOG_LIST); + + /* VALUE obtained above contains exactly the DIRECTORY */ + char* dir = iupAttribGet(ih, "VALUE"); + int len = strlen(dir); + if (dir[len-1]=='/') dir[len-1] = 0; /* remove last '/' */ + iupAttribStoreStr(ih, "DIRECTORY", dir); + + if (!motFileDlgGetMultipleFiles(ih, iupAttribGet(ih, "DIRECTORY"), wList)) + { + iupStrMessageShowError(ih, "IUP_FILENOTEXIST"); + return; + } + + iupAttribSetStr(ih, "STATUS", "0"); + iupAttribSetStr(ih, "FILEEXIST", "YES"); + } else { IFnss file_cb = (IFnss)IupGetCallback(ih, "FILE_CB"); - if (file_cb && file_cb(ih, iupAttribGet(ih, "VALUE"), "OK") == IUP_IGNORE) + filename = iupAttribGet(ih, "VALUE"); + if (file_cb && file_cb(ih, filename, "OK") == IUP_IGNORE) return; - if (iupdrvIsFile(iupAttribGet(ih, "VALUE"))) /* check if file exists */ + if (iupdrvIsFile(filename)) /* check if file exists */ { + char* dir = iupStrFileGetPath(filename); + iupAttribStoreStr(ih, "DIRECTORY", dir); + free(dir); + iupAttribSetStr(ih, "FILEEXIST", "YES"); iupAttribSetStr(ih, "STATUS", "0"); } @@ -188,9 +259,8 @@ static void motFileDlgCallback(Widget w, Ihandle* ih, XmFileSelectionBoxCallback } } -static void motFileDlgHelpCallback(Widget w, XtPointer client_data, XtPointer call_data) +static void motFileDlgHelpCallback(Widget w, Ihandle *ih, XtPointer call_data) { - Ihandle *ih = (Ihandle*)client_data; Icallback cb = IupGetCallback(ih, "HELP_CB"); if (cb && cb(ih) == IUP_CLOSE) { @@ -340,14 +410,15 @@ static void motFileDlgPreviewCanvasExposeCallback(Widget w, Ihandle *ih, XtPoint static void motFileDlgBrowseSelectionCallback(Widget w, Ihandle* ih, XmListCallbackStruct* list_data) { char* filename; + IFnss cb; XmStringGetLtoR(list_data->item, XmSTRING_DEFAULT_CHARSET, &filename); + cb = (IFnss)IupGetCallback(ih, "FILE_CB"); if (iupdrvIsFile(filename)) - { - IFnss cb = (IFnss)IupGetCallback(ih, "FILE_CB"); cb(ih, filename, "SELECT"); - } + else + cb(ih, filename, "OTHER"); XtFree(filename); (void)w; @@ -417,6 +488,13 @@ static int motFileDlgPopup(Ihandle* ih, int x, int y) if (dialogtype == IUP_DIALOGDIR) XtVaSetValues(filebox, XmNfileTypeMask, XmFILE_DIRECTORY, NULL); + if (iupAttribGetBoolean(ih, "MULTIPLEFILES")) + { + Widget wList = XmFileSelectionBoxGetChild(filebox, XmDIALOG_LIST); + XtVaSetValues(wList, XmNselectionPolicy, XmEXTENDED_SELECT, NULL); + XtAddCallback(wList, XmNextendedSelectionCallback, (XtCallbackProc)motFileDlgBrowseSelectionCallback, (XtPointer)ih); + } + /* just check for the path inside FILE */ value = iupAttribGet(ih, "FILE"); if (value && value[0] == '/') @@ -501,8 +579,10 @@ static int motFileDlgPopup(Ihandle* ih, int x, int y) file_cb = (IFnss)IupGetCallback(ih, "FILE_CB"); if (file_cb) { - Widget file_list = XmFileSelectionBoxGetChild(filebox, XmDIALOG_LIST); - XtAddCallback(file_list, XmNbrowseSelectionCallback, (XtCallbackProc)motFileDlgBrowseSelectionCallback, (XtPointer)ih); + 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")) { @@ -575,4 +655,6 @@ static int motFileDlgPopup(Ihandle* ih, int x, int y) void iupdrvFileDlgInitClass(Iclass* ic) { ic->DlgPopup = motFileDlgPopup; + + iupClassRegisterAttribute(ic, "MULTIPLEFILES", NULL, NULL, NULL, NULL, IUPAF_NO_INHERIT); } |