From ed39c92de0ca7cdfdf49e9a29a37b0d9c4b0e8e4 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 3 Oct 2000 20:52:15 +0000 Subject: [PATCH] Code to allow multiple selection in WMBrowser --- WINGs/ChangeLog | 3 +++ WINGs/WINGs.h | 4 +++ WINGs/wbrowser.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 74 insertions(+), 7 deletions(-) diff --git a/WINGs/ChangeLog b/WINGs/ChangeLog index 628a372d..daaccfb4 100644 --- a/WINGs/ChangeLog +++ b/WINGs/ChangeLog @@ -36,6 +36,9 @@ changes since wmaker 0.62.1: counterparts, except it should scroll by page_size/3 instead of one full page - added WMSetBrowserAllowMultipleSelection(), WMSetBrowserAllowEmptySelection() WMBrowserAllowsMultipleSelection() and WMBrowserAllowsEmptySelection() +- WMBrowser now allows multiple selections. +- Added WMGetBrowserPaths() to retrieve the paths for browsers that allow + multiple selections. changes since wmaker 0.62.0: diff --git a/WINGs/WINGs.h b/WINGs/WINGs.h index ff562e23..1c9bf1df 100644 --- a/WINGs/WINGs.h +++ b/WINGs/WINGs.h @@ -1182,9 +1182,13 @@ char* WMSetBrowserPath(WMBrowser *bPtr, char *path); /* free the returned string */ char *WMGetBrowserPath(WMBrowser *bPtr); + /* free the returned string */ char *WMGetBrowserPathToColumn(WMBrowser *bPtr, int column); +/* free the returned array */ +WMArray* WMGetBrowserPaths(WMBrowser *bPtr); + void WMSetBrowserAction(WMBrowser *bPtr, WMAction *action, void *clientData); void WMSetBrowserDoubleAction(WMBrowser *bPtr, WMAction *action, diff --git a/WINGs/wbrowser.c b/WINGs/wbrowser.c index 7c0f21b9..d0c0706f 100644 --- a/WINGs/wbrowser.c +++ b/WINGs/wbrowser.c @@ -702,7 +702,6 @@ WMSetBrowserHasScroller(WMBrowser *bPtr, int hasScroller) } - char* WMSetBrowserPath(WMBrowser *bPtr, char *path) { @@ -779,7 +778,6 @@ WMGetBrowserPath(WMBrowser *bPtr) } - char* WMGetBrowserPathToColumn(WMBrowser *bPtr, int column) { @@ -819,6 +817,66 @@ WMGetBrowserPathToColumn(WMBrowser *bPtr, int column) } +WMArray* +WMGetBrowserPaths(WMBrowser *bPtr) +{ + int column, i, k, size, selNo; + char *path; + WMListItem *item, *lastItem; + WMArray *paths, *items; + + column = bPtr->usedColumnCount-1; + + if (column < 0) { + paths = WMCreateArrayWithDestructor(1, wfree); + WMAddToArray(paths, wstrdup(bPtr->pathSeparator)); + return paths; + } + + items = WMGetListSelectedItems(bPtr->columns[column]); + selNo = WMGetArrayItemCount(items); + paths = WMCreateArrayWithDestructor(selNo, wfree); + + if (selNo <= 1) { + WMAddToArray(paths, WMGetBrowserPath(bPtr)); + return paths; + } + + /* calculate size of buffer */ + size = 0; + for (i=0; icolumns[i]); + if (!item) + break; + size += strlen(item->text); + } + + size += (column+1)*strlen(bPtr->pathSeparator)+1; + + for (k=0; ktext) : 0)); + /* ignore first / */ + *path = 0; + for (i=0; i<=column; i++) { + strcat(path, bPtr->pathSeparator); + if (i == column) { + item = lastItem; + } else { + item = WMGetListSelectedItem(bPtr->columns[i]); + } + if (!item) + break; + strcat(path, item->text); + } + WMAddToArray(paths, path); + } + + return paths; +} + + Bool WMBrowserAllowsMultipleSelection(WMBrowser *bPtr) { @@ -966,12 +1024,14 @@ listCallback(void *self, void *clientData) WMBrowser *bPtr = (WMBrowser*)clientData; WMList *lPtr = (WMList*)self; WMListItem *item; + int i, selNo; static WMListItem *oldItem = NULL; - int i; + static int oldSelNo = 0; item = WMGetListSelectedItem(lPtr); + selNo = WMGetArrayItemCount(WMGetListSelectedItems(lPtr)); - if (oldItem==NULL || oldItem!=item) { + if (oldItem==NULL || oldItem!=item || oldSelNo!=selNo) { for (i=0; icolumnCount; i++) { if (lPtr == bPtr->columns[i]) break; @@ -983,7 +1043,7 @@ listCallback(void *self, void *clientData) /* columns at right must be cleared */ removeColumn(bPtr, i+1); /* open directory */ - if (item && item->isBranch) { + if (item && item->isBranch && selNo==1) { WMAddBrowserColumn(bPtr); } if (bPtr->usedColumnCount < bPtr->maxVisibleColumns) @@ -991,17 +1051,17 @@ listCallback(void *self, void *clientData) else i = bPtr->usedColumnCount-bPtr->maxVisibleColumns; scrollToColumn(bPtr, i, True); - if (item && item->isBranch) { + if (item && item->isBranch && selNo==1) { loadColumn(bPtr, bPtr->usedColumnCount-1); } } - /* call callback for click */ if (bPtr->action) (*bPtr->action)(bPtr, bPtr->clientData); oldItem = item; + oldSelNo = selNo; } -- 2.11.4.GIT