/******************************************************************************** * * * F i l e A s s o c i a t i o n s * * * ********************************************************************************* * Copyright (C) 1998,2024 by Jeroen van der Zijp. All Rights Reserved. * ********************************************************************************* * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as published by * * the Free Software Foundation; either version 3 of the License, or * * (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public License * * along with this program. If not, see * ********************************************************************************/ #ifndef FXFILEASSOCIATIONS_H #define FXFILEASSOCIATIONS_H #ifndef FXOBJECT_H #include "FXObject.h" #endif namespace FX { class FXIcon; class FXIconSource; /// Registers stuff to know about the extension struct FXFileAssoc { FXString command; /// Command to execute FXString extension; /// Full extension name FXString mimetype; /// Mime type name FXIcon *bigicon; /// Big normal icon FXIcon *bigiconopen; /// Big open icon FXIcon *miniicon; /// Mini normal icon FXIcon *miniiconopen; /// Mini open icon FXDragType dragtype; /// Registered drag type FXuint flags; /// Flags; 1=cd, 2=term }; // Dictionary of file associations typedef FXDictionaryOf FXFileAssocDictionary; /** * The FileAssociations object manages file associations between a file extension * and a FileAssoc record which contains command name, mime-type, icons, and other * information about a type of file. * Icons referenced by the FileAssoc record are managed by an icon cache, which * guarantees that each icon is loaded into memory only once, when it is encountered * for the first time. * Associations for a file or directory are determined by the information in the * FOX Registry setting under the "FILETYPES" section. * Each entry maps a (partial) pathname to an association record comprising command * name, description, large and small icons, mime-types, and flags: * * command ';' description ';' bigicon [ ':' bigiconopen ] ';' icon [ ':' iconopen ] ';' mime [ ';' flags ] * * For example, the binding for "bmp" would be: * * [FILETYPES] * bmp="eog %s &;Bitmap Image;bigimage.bmp;miniimage.bmp;image/x-ms-bmp;" * * And bindings for directories would be like: * * [FILETYPES] * /=";Root Folder;bigroot.bmp:bigroot_open.bmp;miniroot.bmp:miniroot_open.bmp;application/x-folder;" * /home/jane=";Home Folder;mansion.bmp:mansion_open.bmp;hut.bmp:hut_open.bmp;application/x-folder;" * * Three types of pathnames are distinguished: regular files, directories, and * executable files. * The association for a regular file name is determined by first looking at the entire * file name, then at the whole extension, and then at sub-extensions. * For example, "package.tar.gz", "tar.gz", and "gz" can each be given a different * file associations. * If no extension is found, then a special fallback extension "defaultfilebinding" * is consulted. Thus, you can assign fallback properties for all reguler files * by setting the "defaultfilebinding" entry under the "FILETYPES" section. * The association for a directory name is found by first checking the full pathname, * then dropping leading directory components in turn. * For example: "/usr/local/include", "/local/include", and "/include" are checked in * turn. This scheme allows convenient assignment of an association for projects with * common directory-structures but different project roots. * If a directory association is not found, a fallback association "defaultdirbinding" * is used to determine the association. * The association for an executable file is found by looking up the binding for the * "defaultexecbinding" under the "FILETYPES" section. * The flags field is used for a number of bit-flags; two flags are currently * defined: 'cd' and 'term'. The first one is intended to cause a launcher * to execute the application in the shown directory; the second one is meant * to indicate that the application is to be ran inside a new terminal. */ class FXAPI FXFileAssociations : public FXObject { FXDECLARE(FXFileAssociations) protected: FXFileAssocDictionary bindings; // File bindings dictionary FXIconCache cache; // Cache icons for rapid access FXSettings *settings; // Settings database for looking up extensions protected: FXFileAssociations(); private: FXFileAssociations(const FXFileAssociations&); FXFileAssociations &operator=(const FXFileAssociations&); public: /// Registry key used to find fallback executable icons static const FXchar defaultExecBinding[]; /// Registry key used to find fallback directory icons static const FXchar defaultDirBinding[]; /// Registry key used to find fallback document icons static const FXchar defaultFileBinding[]; public: /** * Construct a dictionary mapping file-extension to file associations, * using the application registry settings as a source for the bindings. * The pointer to the application class is passed down to the icon source * which is inside the icon dictionary. */ FXFileAssociations(FXApp* app); /** * Construct a dictionary mapping file-extension to file associations, * using the specified settings database as a source for the bindings. * The pointer to the application class is passed down to the icon source * which is inside the icon dictionary. */ FXFileAssociations(FXApp* app,FXSettings* sdb); /** * Change settings database being used to determine extension mappings. */ void setSettings(FXSettings* sdb){ settings=sdb; } /** * Return settings database. */ FXSettings* getSettings() const { return settings; } /** * Change the IconSource object used by the icon cache to load icons. */ void setIconSource(FXIconSource* src){ cache.setIconSource(src); } /** * Return the current IconSource object. */ FXIconSource* getIconSource() const { return cache.getIconSource(); } /** * Set the icon search paths for the icon cache. */ void setIconPath(const FXString& path){ cache.setIconPath(path); } /** * Return the current icon search paths from the icon cache. */ const FXString& getIconPath() const { return cache.getIconPath(); } /** * Parse string containing description of the association. */ virtual FXFileAssoc* parse(const FXString& assoc); /** * Return mapping of input string to file-association; if no mapping * exists, try to add a new association mapping by consulting the * FILETYPES section of the settings database. * You can overload this function if you need to supply custom * mappings for selected extensions. */ virtual FXFileAssoc* fetch(const FXString& ext); /** * Determine binding for the given file. * The default implementation tries the whole filename first, * then tries the extensions. * For example, for a file "source.tar.gz": * * "source.tar.gz", * "tar.gz", * "gz" * * are tried in succession. If no association is found the * key "defaultfilebinding" is tried as a fallback association. * A NULL is returned if no association of any kind is found. */ virtual FXFileAssoc* findFileBinding(const FXString& pathname); /** * Find directory binding from registry. * The default implementation tries the whole pathname first, * then tries successively smaller parts of the path. * For example, a pathname "/usr/people/jeroen": * * "/usr/people/jeroen" * "/people/jeroen" * "/jeroen" * * are tried in succession. If no bindings are found, the * key "defaultdirbinding" is tried as a fallback association. * A NULL is returned if no association of any kind is found. */ virtual FXFileAssoc* findDirBinding(const FXString& pathname); /** * Determine binding for the given executable. * The default implementation returns the fallback binding associated with * the key "defaultexecbinding". * A NULL is returned if no association of any kind is found. */ virtual FXFileAssoc* findExecBinding(const FXString& pathname); /** * Delete all file-associations, and clear all icons from the cache. */ void clear(); /** * Save object to stream. */ virtual void save(FXStream& store) const; /** * Load object from stream. */ virtual void load(FXStream& store); /** * Delete all FileAssoc's, and the IconCache. */ virtual ~FXFileAssociations(); }; } #endif