add single instance mode
[uwplayer.git] / application / Fsb.h
1 /*
2  * Copyright 2021 Olaf Wintermann
3  *
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:
10  * 
11  * The above copyright notice and this permission notice shall be included in 
12  * all copies or substantial portions of the Software.
13  *
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.
21  */
22
23 #ifndef FSB_H
24 #define FSB_H
25
26 #include <X11/Intrinsic.h>
27 #include <Xm/PrimitiveP.h>
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
33 extern WidgetClass xnFsbWidgetClass;
34
35 #define FILEDIALOG_OPEN 1
36 #define FILEDIALOG_SAVE 2
37     
38 #define FILEDIALOG_OK 1
39 #define FILEDIALOG_CANCEL 2
40
41 #define XnNwidgetSpacing         "fsbWidgetSpacing"
42 #define XnNwindowSpacing         "fsbWindowSpacing"
43
44 #define XnNfsbType               "fsbType"
45 #define XnCfsbType               "fsbType"
46
47 #define XnNshowHidden            "showHidden"
48 #define XnCshowHidden            "showHidden"
49 #define XnNshowHiddenButton      "showHiddenButton"
50 #define XnCshowHiddenButton      "showHiddenButton"
51
52 #define XnNshowViewMenu          "showViewMenu"
53 #define XnCshowViewMenu          "showViewMenu"
54
55 #define XnNselectedView          "fsbSelectedView"
56 #define XnCselectedView          "fsbSelectedView"
57
58 #define XnNdirectory             "directory"
59 #define XnCdirectory             "directory"
60 #define XnNselectedPath          "selectedPath"
61 #define XnCselectedPath          "selectedPath"
62 #define XnNhomePath              "homePath"
63 #define XnChomePath              "homePath"
64
65 #define XnNfilter                "filter"
66 #define XnCfilter                "filter"
67
68 #define XnNfilterFunc            "filterFunc"
69 #define XnCfilterFunc            "filterFunc"
70
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"
145
146 /*
147  * int FSBFilterFunc(const char *pattern, const char *string)
148  * 
149  * Checks checks whether the string matches the pattern
150  * 
151  * Return
152  *   zero if the string matches the pattern
153  *   non-zero if there is no match
154  */
155 typedef int(*FSBFilterFunc)(const char*, const char*);
156
157 typedef int(*updatedir_callback)(void*,char*);
158
159 typedef struct PathBar {  
160     Widget widget;
161     Widget textfield;
162     
163     Widget down;
164     Widget left;
165     Widget right;
166     Dimension lw;
167     Dimension rw;
168     
169     Widget popup;
170     Widget list;
171     
172     int shift;
173     
174     Widget *pathSegments;
175     size_t numSegments;
176     size_t segmentAlloc;
177     
178     char *path;
179     int selection;
180     Boolean input;
181     
182     Widget hs;
183     Widget vs;
184     int popupScrollEvent;
185     
186     updatedir_callback updateDir;
187     void *updateDirData;
188     
189     Boolean disableResize;
190 } PathBar;
191
192 typedef struct FileElm FileElm;
193 struct FileElm {
194     char *path;
195     int isDirectory;
196     unsigned long long size;
197     time_t lastModified;
198 };
199
200 typedef struct {
201     Widget view;
202     Widget focus;
203 } FSBViewWidgets;
204
205 enum XnFSBChild {
206     XnFSB_DIR_UP_BUTTON = 0,
207     XnFSB_HOME_BUTTON,
208     XnFSB_NEW_FOLDER_BUTTON,
209     XnFSB_DETAIL_TOGGLE_BUTTON,
210     XnFSB_VIEW_OPTION_BUTTON,
211     XnFSB_FILTER_DROPDOWN,
212     XnFSB_FILTER_BUTTON,
213     XnFSB_SHOW_HIDDEN_TOGGLE_BUTTON,
214     XnFSB_DIRECTORIES_LABEL,
215     XnFSB_FILES_LABEL,
216     XnFSB_DIRLIST,
217     XnFSB_FILELIST,
218     XnFSB_GRID,
219     XnFSB_OK_BUTTON,
220     XnFSB_CANCEL_BUTTON,
221     XnFSB_HELP_BUTTON
222 };
223
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);
229
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);
234
235 Widget XnCreateFileSelectionDialog(
236         Widget parent,
237         String name,
238         ArgList arglist,
239         Cardinal argcount);
240
241 Widget XnCreateFileSelectionBox(
242         Widget parent,
243         String name,
244         ArgList arglist,
245         Cardinal argcount);
246
247 void XnFileSelectionBoxAddView(
248         Widget fsb,
249         const char *name,
250         FSBViewCreateProc create,
251         FSBViewUpdateProc update,
252         FSBViewSelectProc select,
253         FSBViewCleanupProc cleanup,
254         FSBViewDestroyProc destroy,
255         Boolean useDirList,
256         void *userData);
257
258 void XnFileSelectionBoxSetDirList(Widget fsb, const char **dirlist, size_t nelm);
259
260 Widget XnFileSelectionBoxWorkArea(Widget fsb);
261
262 Widget XnFileSelectionBoxGetChild(Widget fsb, enum XnFSBChild child);
263
264 void XnFileSelectionBoxDeleteFilters(Widget fsb);
265
266 void XnFileSelectionBoxAddFilter(Widget fsb, const char *filter);
267
268 #ifdef __cplusplus
269 }
270 #endif
271
272 #endif /* FSB_H */