2 * Copyright 2021 Olaf Wintermann
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20 * DEALINGS IN THE SOFTWARE.
26 #include <X11/Intrinsic.h>
27 #include <Xm/PrimitiveP.h>
33 extern WidgetClass xnFsbWidgetClass;
35 #define FILEDIALOG_OPEN 1
36 #define FILEDIALOG_SAVE 2
38 #define FILEDIALOG_OK 1
39 #define FILEDIALOG_CANCEL 2
41 #define XnNwidgetSpacing "fsbWidgetSpacing"
42 #define XnNwindowSpacing "fsbWindowSpacing"
44 #define XnNfsbType "fsbType"
45 #define XnCfsbType "fsbType"
47 #define XnNshowHidden "showHidden"
48 #define XnCshowHidden "showHidden"
49 #define XnNshowHiddenButton "showHiddenButton"
50 #define XnCshowHiddenButton "showHiddenButton"
52 #define XnNshowViewMenu "showViewMenu"
53 #define XnCshowViewMenu "showViewMenu"
55 #define XnNselectedView "fsbSelectedView"
56 #define XnCselectedView "fsbSelectedView"
58 #define XnNdirectory "directory"
59 #define XnCdirectory "directory"
60 #define XnNselectedPath "selectedPath"
61 #define XnCselectedPath "selectedPath"
62 #define XnNhomePath "homePath"
63 #define XnChomePath "homePath"
65 #define XnNfilter "filter"
66 #define XnCfilter "filter"
68 #define XnNfilterFunc "filterFunc"
69 #define XnCfilterFunc "filterFunc"
71 #define XnNlabelListView "labelListView"
72 #define XnClabelListView "labelListView"
73 #define XnNlabelDetailView "labelDetailView"
74 #define XnClabelDetailView "labelDetailView"
75 #define XnNlabelOpenFileTitle "labelOpenFileTitle"
76 #define XnClabelOpenFileTitle "labelOpenFileTitle"
77 #define XnNlabelSaveFileTitle "labelSaveFileTitle"
78 #define XnClabelSaveFileTitle "labelSaveFileTitel"
79 #define XnNlabelDirUp "labelDirUp"
80 #define XnClabelDirUp "labelDirUp"
81 #define XnNlabelHome "labelHome"
82 #define XnClabelHome "labelHome"
83 #define XnNlabelNewFolder "labelNewFolder"
84 #define XnClabelNewFolder "labelNewFolder"
85 #define XnNlabelFilter "labelFilter"
86 #define XnClabelFilter "labelFilter"
87 #define XnNlabelFilterButton "labelFilterButton"
88 #define XnClabelFilterButton "labelFilterButton"
89 #define XnNlabelShowHiddenFiles "labelShowHiddenFiles"
90 #define XnClabelShowHiddenFiles "labelShowHiddenFiles"
91 #define XnNlabelDirectories "labelDirectories"
92 #define XnClabelDirectories "labelDirectories"
93 #define XnNlabelFiles "labelFiles"
94 #define XnClabelFiles "labelFiles"
95 #define XnNlabelRename "labelRename"
96 #define XnClabelRename "labelRename"
97 #define XnNlabelDelete "labelDelete"
98 #define XnClabelDelete "labelDelete"
99 #define XnNlabelOpen "labelOpen"
100 #define XnClabelOpen "labelOpen"
101 #define XnNlabelSave "labelSave"
102 #define XnClabelSave "labelSave"
103 #define XnNlabelOk "labelOk"
104 #define XnClabelOk "labelOk"
105 #define XnNlabelCancel "labelCancel"
106 #define XnClabelCancel "labelCancel"
107 #define XnNlabelHelp "labelHelp"
108 #define XnClabelHelp "labelHelp"
109 #define XnNlabelFileName "labelFileName"
110 #define XnClabelFileName "labelFileName"
111 #define XnNlabelDirectoryName "labelDirectoryName"
112 #define XnClabelDirectoryName "labelDirectoryName"
113 #define XnNlabelNewFileName "labelNewFileName"
114 #define XnClabelNewFileName "labelNewFileName"
115 #define XnNlabelDeleteFile "labelDeleteFile"
116 #define XnClabelDeleteFile "labelDeleteFile"
117 #define XnNdetailHeadings "detailHeadings"
118 #define XnCdetailHeadings "detailHeadings"
119 #define XnNdateFormatSameYear "dateFormatSameYear"
120 #define XnCdateFormatSameYear "dateFormatSameYear"
121 #define XnNdateFormatOtherYear "dateFormatOtherYear"
122 #define XnCdateFormatOtherYear "dateFormatOtherYear"
123 #define XnNsuffixBytes "suffixBytes"
124 #define XnCsuffixBytes "suffixBytes"
125 #define XnNsuffixKB "suffixKB"
126 #define XnCsuffixKB "suffixKB"
127 #define XnNsuffixMB "suffixMB"
128 #define XnCsuffixMB "suffixMB"
129 #define XnNsuffixGB "suffixGB"
130 #define XnCsuffixGB "suffixGB"
131 #define XnNsuffixTB "suffixTB"
132 #define XnCsuffixTB "suffixTB"
133 #define XnNerrorTitle "errorTitle"
134 #define XnCerrorTitle "errorTitle"
135 #define XnNerrorIllegalChar "errorIllegalChar"
136 #define XnCerrorIllegalChar "errorIllegalChar"
137 #define XnNerrorRename "errorRename"
138 #define XnCerrorRename "errorRename"
139 #define XnNerrorCreateFolder "errorCreateFolder"
140 #define XnCerrorCreateFolder "errorCreateFolder"
141 #define XnNerrorDelete "errorDelete"
142 #define XnCerrorDelete "errorDelete"
143 #define XnNerrorOpenDir "errorOpenDir"
144 #define XnCerrorOpenDir "errorOpenDir"
147 * int FSBFilterFunc(const char *pattern, const char *string)
149 * Checks checks whether the string matches the pattern
152 * zero if the string matches the pattern
153 * non-zero if there is no match
155 typedef int(*FSBFilterFunc)(const char*, const char*);
157 typedef int(*updatedir_callback)(void*,char*);
159 typedef struct PathBar {
174 Widget *pathSegments;
184 int popupScrollEvent;
186 updatedir_callback updateDir;
189 Boolean disableResize;
192 typedef struct FileElm FileElm;
196 unsigned long long size;
206 XnFSB_DIR_UP_BUTTON = 0,
208 XnFSB_NEW_FOLDER_BUTTON,
209 XnFSB_DETAIL_TOGGLE_BUTTON,
210 XnFSB_VIEW_OPTION_BUTTON,
211 XnFSB_FILTER_DROPDOWN,
213 XnFSB_SHOW_HIDDEN_TOGGLE_BUTTON,
214 XnFSB_DIRECTORIES_LABEL,
224 typedef FSBViewWidgets(*FSBViewCreateProc)(Widget parent, ArgList args, int n, void *userData);
225 typedef void(*FSBViewUpdateProc)(Widget fsb, Widget view, FileElm *dirs, int dircount, FileElm *files, int filecount, const char *filter, int maxnamelen, void *userData);
226 typedef void(*FSBViewSelectProc)(Widget fsb, Widget view, const char *item);
227 typedef void(*FSBViewCleanupProc)(Widget fsb, Widget view, void *userData);
228 typedef void(*FSBViewDestroyProc)(Widget fsb, Widget view, void *userData);
230 PathBar* CreatePathBar(Widget parent, ArgList args, int n);
231 void PathBarSetPath(PathBar *bar, const char *path);
232 void PathBarSetDirList(PathBar *bar, const char **dirlist, size_t nelm);
233 void PathBarDestroy(PathBar *bar);
235 Widget XnCreateFileSelectionDialog(
241 Widget XnCreateFileSelectionBox(
247 void XnFileSelectionBoxAddView(
250 FSBViewCreateProc create,
251 FSBViewUpdateProc update,
252 FSBViewSelectProc select,
253 FSBViewCleanupProc cleanup,
254 FSBViewDestroyProc destroy,
258 void XnFileSelectionBoxSetDirList(Widget fsb, const char **dirlist, size_t nelm);
260 Widget XnFileSelectionBoxWorkArea(Widget fsb);
262 Widget XnFileSelectionBoxGetChild(Widget fsb, enum XnFSBChild child);
264 void XnFileSelectionBoxDeleteFilters(Widget fsb);
266 void XnFileSelectionBoxAddFilter(Widget fsb, const char *filter);