1 /******************************************************************************** 2 * * 3 * F i l e L i s t W i d g e t * 4 * * 5 ********************************************************************************* 6 * Copyright (C) 1997,2006 by Jeroen van der Zijp. All Rights Reserved. * 7 ********************************************************************************* 8 * This library is free software; you can redistribute it and/or * 9 * modify it under the terms of the GNU Lesser General Public * 10 * License as published by the Free Software Foundation; either * 11 * version 2.1 of the License, or (at your option) any later version. * 12 * * 13 * This library is distributed in the hope that it will be useful, * 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 16 * Lesser General Public License for more details. * 17 * * 18 * You should have received a copy of the GNU Lesser General Public * 19 * License along with this library; if not, write to the Free Software * 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * 21 ********************************************************************************* 22 * $Id: FXFileList.h 3297 2015-12-14 20:30:04Z arthurcnorman $ * 23 ********************************************************************************/ 24 #ifndef FXFILELIST_H 25 #define FXFILELIST_H 26 27 #ifndef FXICONLIST_H 28 #include "FXIconList.h" 29 #endif 30 31 namespace FX { 32 33 struct FXFileAssoc; 34 class FXFileDict; 35 class FXFileList; 36 class FXIcon; 37 class FXIconSource; 38 class FXIconDict; 39 40 41 /// File List options 42 enum { 43 FILELIST_SHOWHIDDEN = 0x04000000, /// Show hidden files or directories 44 FILELIST_SHOWDIRS = 0x08000000, /// Show only directories 45 FILELIST_SHOWFILES = 0x10000000, /// Show only files 46 FILELIST_SHOWIMAGES = 0x20000000, /// Show preview of images 47 FILELIST_NO_OWN_ASSOC = 0x40000000, /// Do not create associations for files 48 FILELIST_NO_PARENT = 0x80000000 /// Suppress display of '.' and '..' 49 }; 50 51 52 53 /// File item 54 class FXAPI FXFileItem : public FXIconItem { 55 FXDECLARE(FXFileItem) 56 friend class FXFileList; 57 protected: 58 FXFileAssoc *assoc; // File association record 59 FXFileItem *link; // Link to next item 60 FXlong size; // File size 61 FXTime date; // File time 62 private: 63 FXFileItem(const FXFileItem&); 64 FXFileItem& operator=(const FXFileItem&); 65 protected: FXFileItem()66 FXFileItem():assoc(NULL),link(NULL),size(0),date(0){} 67 protected: 68 enum{ 69 FOLDER = 64, // Directory item 70 EXECUTABLE = 128, // Executable item 71 SYMLINK = 256, // Symbolic linked item 72 CHARDEV = 512, // Character special item 73 BLOCKDEV = 1024, // Block special item 74 FIFO = 2048, // FIFO item 75 SOCK = 4096, // Socket item 76 SHARE = 8192 // Share 77 }; 78 public: 79 /// Constructor FXIconItem(text,bi,mi,ptr)80 FXFileItem(const FXString& text,FXIcon* bi=NULL,FXIcon* mi=NULL,void* ptr=NULL):FXIconItem(text,bi,mi,ptr),assoc(NULL),link(NULL),size(0L),date(0){} 81 82 /// Return true if this is a file item isFile()83 FXbool isFile() const { return (state&(FOLDER|BLOCKDEV|CHARDEV|FIFO|SOCK|SHARE))==0; } 84 85 /// Return true if this is a directory item isDirectory()86 FXbool isDirectory() const { return (state&FOLDER)!=0; } 87 88 /// Return true if this is a share item isShare()89 FXbool isShare() const { return (state&SHARE)!=0; } 90 91 /// Return true if this is an executable item isExecutable()92 FXbool isExecutable() const { return (state&EXECUTABLE)!=0; } 93 94 /// Return true if this is a symbolic link item isSymlink()95 FXbool isSymlink() const { return (state&SYMLINK)!=0; } 96 97 /// Return true if this is a character device item isChardev()98 FXbool isChardev() const { return (state&CHARDEV)!=0; } 99 100 /// Return true if this is a block device item isBlockdev()101 FXbool isBlockdev() const { return (state&BLOCKDEV)!=0; } 102 103 /// Return true if this is an FIFO item isFifo()104 FXbool isFifo() const { return (state&FIFO)!=0; } 105 106 /// Return true if this is a socket isSocket()107 FXbool isSocket() const { return (state&SOCK)!=0; } 108 109 /// Return the file-association object for this item getAssoc()110 FXFileAssoc* getAssoc() const { return assoc; } 111 112 /// Return the file size for this item getSize()113 FXlong getSize() const { return size; } 114 115 /// Return the date for this item getDate()116 FXTime getDate() const { return date; } 117 }; 118 119 120 /** 121 * A File List widget provides an icon rich view of the file system. 122 * It automatically updates itself periodically by re-scanning the file system 123 * for any changes. As it scans the displayed directory, it automatically 124 * determines the icons to be displayed by consulting the file associations registry 125 * settings. A number of messages can be sent to the File List to control the 126 * filter pattern, sort category, sorting order, case sensitivity, and hidden file 127 * display mode. 128 * The File list widget supports drags and drops of files. 129 */ 130 class FXAPI FXFileList : public FXIconList { 131 FXDECLARE(FXFileList) 132 protected: 133 FXString directory; // Current directory 134 FXString orgdirectory; // Original directory 135 FXString dropdirectory; // Drop directory 136 FXDragAction dropaction; // Drop action 137 FXString dragfiles; // Dragged files 138 FXFileDict *associations; // Association table 139 FXFileItem *list; // File item list 140 FXString pattern; // Pattern of file names 141 FXuint matchmode; // File wildcard match mode 142 FXuint counter; // Refresh counter 143 FXint imagesize; // Image size 144 FXTime timestamp; // Time when last refreshed 145 FXIcon *big_folder; // Big folder icon 146 FXIcon *mini_folder; // Mini folder icon 147 FXIcon *big_doc; // Big document icon 148 FXIcon *mini_doc; // Mini document icon 149 FXIcon *big_app; // Big application icon 150 FXIcon *mini_app; // Mini application icon 151 protected: 152 FXFileList(); 153 virtual FXIconItem *createItem(const FXString& text,FXIcon *big,FXIcon* mini,void* ptr); 154 void listItems(FXbool force); 155 private: 156 FXFileList(const FXFileList&); 157 FXFileList &operator=(const FXFileList&); 158 public: 159 long onOpenTimer(FXObject*,FXSelector,void*); 160 long onRefreshTimer(FXObject*,FXSelector,void*); 161 long onDNDEnter(FXObject*,FXSelector,void*); 162 long onDNDLeave(FXObject*,FXSelector,void*); 163 long onDNDMotion(FXObject*,FXSelector,void*); 164 long onDNDDrop(FXObject*,FXSelector,void*); 165 long onDNDRequest(FXObject*,FXSelector,void*); 166 long onBeginDrag(FXObject*,FXSelector,void*); 167 long onEndDrag(FXObject*,FXSelector,void*); 168 long onDragged(FXObject*,FXSelector,void*); 169 long onCmdSetValue(FXObject*,FXSelector,void*); 170 long onCmdGetStringValue(FXObject*,FXSelector,void*); 171 long onCmdSetStringValue(FXObject*,FXSelector,void*); 172 long onCmdDirectoryUp(FXObject*,FXSelector,void*); 173 long onUpdDirectoryUp(FXObject*,FXSelector,void*); 174 long onCmdSortByName(FXObject*,FXSelector,void*); 175 long onUpdSortByName(FXObject*,FXSelector,void*); 176 long onCmdSortByType(FXObject*,FXSelector,void*); 177 long onUpdSortByType(FXObject*,FXSelector,void*); 178 long onCmdSortBySize(FXObject*,FXSelector,void*); 179 long onUpdSortBySize(FXObject*,FXSelector,void*); 180 long onCmdSortByTime(FXObject*,FXSelector,void*); 181 long onUpdSortByTime(FXObject*,FXSelector,void*); 182 long onCmdSortByUser(FXObject*,FXSelector,void*); 183 long onUpdSortByUser(FXObject*,FXSelector,void*); 184 long onCmdSortByGroup(FXObject*,FXSelector,void*); 185 long onUpdSortByGroup(FXObject*,FXSelector,void*); 186 long onCmdSortReverse(FXObject*,FXSelector,void*); 187 long onUpdSortReverse(FXObject*,FXSelector,void*); 188 long onCmdSortCase(FXObject*,FXSelector,void*); 189 long onUpdSortCase(FXObject*,FXSelector,void*); 190 long onCmdSetPattern(FXObject*,FXSelector,void*); 191 long onUpdSetPattern(FXObject*,FXSelector,void*); 192 long onCmdSetDirectory(FXObject*,FXSelector,void*); 193 long onUpdSetDirectory(FXObject*,FXSelector,void*); 194 long onCmdToggleHidden(FXObject*,FXSelector,void*); 195 long onUpdToggleHidden(FXObject*,FXSelector,void*); 196 long onCmdShowHidden(FXObject*,FXSelector,void*); 197 long onUpdShowHidden(FXObject*,FXSelector,void*); 198 long onCmdHideHidden(FXObject*,FXSelector,void*); 199 long onUpdHideHidden(FXObject*,FXSelector,void*); 200 long onCmdToggleImages(FXObject*,FXSelector,void*); 201 long onUpdToggleImages(FXObject*,FXSelector,void*); 202 long onCmdHeader(FXObject*,FXSelector,void*); 203 long onUpdHeader(FXObject*,FXSelector,void*); 204 long onCmdRefresh(FXObject*,FXSelector,void*); 205 public: 206 static FXint ascending(const FXIconItem* a,const FXIconItem* b); 207 static FXint descending(const FXIconItem* a,const FXIconItem* b); 208 static FXint ascendingCase(const FXIconItem* a,const FXIconItem* b); 209 static FXint descendingCase(const FXIconItem* a,const FXIconItem* b); 210 static FXint ascendingType(const FXIconItem* a,const FXIconItem* b); 211 static FXint descendingType(const FXIconItem* a,const FXIconItem* b); 212 static FXint ascendingSize(const FXIconItem* a,const FXIconItem* b); 213 static FXint descendingSize(const FXIconItem* a,const FXIconItem* b); 214 static FXint ascendingTime(const FXIconItem* a,const FXIconItem* b); 215 static FXint descendingTime(const FXIconItem* a,const FXIconItem* b); 216 static FXint ascendingUser(const FXIconItem* a,const FXIconItem* b); 217 static FXint descendingUser(const FXIconItem* a,const FXIconItem* b); 218 static FXint ascendingGroup(const FXIconItem* a,const FXIconItem* b); 219 static FXint descendingGroup(const FXIconItem* a,const FXIconItem* b); 220 public: 221 enum { 222 ID_REFRESHTIMER=FXIconList::ID_LAST, 223 ID_OPENTIMER, 224 ID_SORT_BY_NAME, /// Sort by name 225 ID_SORT_BY_TYPE, /// Sort by type 226 ID_SORT_BY_SIZE, /// Sort by size 227 ID_SORT_BY_TIME, /// Sort by access time 228 ID_SORT_BY_USER, /// Sort by owner name 229 ID_SORT_BY_GROUP, /// Sort by group name 230 ID_SORT_REVERSE, /// Reverse sort order 231 ID_SORT_CASE, /// Toggle sort case sensitivity 232 ID_DIRECTORY_UP, /// Move up one directory 233 ID_SET_PATTERN, /// Set match pattern 234 ID_SET_DIRECTORY, /// Set directory 235 ID_SHOW_HIDDEN, /// Show hidden files 236 ID_HIDE_HIDDEN, /// Hide hidden files 237 ID_TOGGLE_HIDDEN, /// Toggle display of hidden files 238 ID_TOGGLE_IMAGES, /// Toggle display of images 239 ID_REFRESH, /// Refresh immediately 240 ID_LAST 241 }; 242 public: 243 244 /// Construct a file list 245 FXFileList(FXComposite *p,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0); 246 247 /// Create server-side resources 248 virtual void create(); 249 250 /// Detach server-side resources 251 virtual void detach(); 252 253 /// Destroy server-side resources 254 virtual void destroy(); 255 256 /// Scan the current directory and update the items if needed, or if force is TRUE 257 void scan(FXbool force=TRUE); 258 259 /// Set current file 260 void setCurrentFile(const FXString& file,FXbool notify=FALSE); 261 262 /// Return current file 263 FXString getCurrentFile() const; 264 265 /// Set current directory 266 void setDirectory(const FXString& path); 267 268 /// Return current directory getDirectory()269 FXString getDirectory() const { return directory; } 270 271 /// Change wildcard matching pattern 272 void setPattern(const FXString& ptrn); 273 274 /// Return wildcard pattern getPattern()275 FXString getPattern() const { return pattern; } 276 277 /// Return TRUE if item is a directory 278 FXbool isItemDirectory(FXint index) const; 279 280 /// Return TRUE if item is a directory 281 FXbool isItemShare(FXint index) const; 282 283 /// Return TRUE if item is a file 284 FXbool isItemFile(FXint index) const; 285 286 /// Return TRUE if item is executable 287 FXbool isItemExecutable(FXint index) const; 288 289 /// Return name of item at index 290 FXString getItemFilename(FXint index) const; 291 292 /// Return full pathname of item at index 293 FXString getItemPathname(FXint index) const; 294 295 /// Return file association of item 296 FXFileAssoc* getItemAssoc(FXint index) const; 297 298 /// Return wildcard matching mode getMatchMode()299 FXuint getMatchMode() const { return matchmode; } 300 301 /// Change wildcard matching mode 302 void setMatchMode(FXuint mode); 303 304 /// Return TRUE if showing hidden files 305 FXbool showHiddenFiles() const; 306 307 /// Show or hide hidden files 308 void showHiddenFiles(FXbool showing); 309 310 /// Return TRUE if showing directories only 311 FXbool showOnlyDirectories() const; 312 313 /// Show directories only 314 void showOnlyDirectories(FXbool shown); 315 316 /// Return TRUE if showing files only 317 FXbool showOnlyFiles() const; 318 319 /// Show files only 320 void showOnlyFiles(FXbool shown); 321 322 /// Return TRUE if image preview on 323 FXbool showImages() const; 324 325 /// Show or hide preview images 326 void showImages(FXbool showing); 327 328 /// Return images preview size getImageSize()329 FXint getImageSize() const { return imagesize; } 330 331 /// Change images preview size 332 void setImageSize(FXint size); 333 334 /// Return TRUE if showing parent directories 335 FXbool showParents() const; 336 337 /// Show parent directories 338 void showParents(FXbool shown); 339 340 /// Change file associations 341 void setAssociations(FXFileDict* assoc); 342 343 /// Return file associations getAssociations()344 FXFileDict* getAssociations() const { return associations; } 345 346 /// Save to stream 347 virtual void save(FXStream& store) const; 348 349 /// Load from stream 350 virtual void load(FXStream& store); 351 352 /// Destructor 353 virtual ~FXFileList(); 354 }; 355 356 } 357 358 #endif 359