diff options
| author | Michael R Sweet <michael.r.sweet@gmail.com> | 2001-09-29 14:38:59 +0000 |
|---|---|---|
| committer | Michael R Sweet <michael.r.sweet@gmail.com> | 2001-09-29 14:38:59 +0000 |
| commit | 6a4714ce12d546c8131389853fe5593555c73b77 (patch) | |
| tree | 158726de167a805d6aaa325f8250b89bf3a2db08 /src/Fl_FileIcon.cxx | |
| parent | de6c7f66eeaeeae52ca33221db885ae6cd7ea114 (diff) | |
Fl_FileXYZ -> Fl_File_XYZ
Fl_HelpXYZ -> Fl_Help_XYZ
Fl_File_Chooser now supports directory choosing.
Added fl_dir_chooser() function.
Now set FLTK_DOCDIR env var in test/demo.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@1612 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/Fl_FileIcon.cxx')
| -rw-r--r-- | src/Fl_FileIcon.cxx | 1225 |
1 files changed, 0 insertions, 1225 deletions
diff --git a/src/Fl_FileIcon.cxx b/src/Fl_FileIcon.cxx deleted file mode 100644 index dc0273d95..000000000 --- a/src/Fl_FileIcon.cxx +++ /dev/null @@ -1,1225 +0,0 @@ -// -// "$Id: Fl_FileIcon.cxx,v 1.10.2.1 2001/08/02 16:17:04 easysw Exp $" -// -// Fl_FileIcon routines. -// -// KDE icon code donated by Maarten De Boer. -// -// Copyright 1999-2001 by Michael Sweet. -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Library General Public -// License as published by the Free Software Foundation; either -// version 2 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 -// Library General Public License for more details. -// -// You should have received a copy of the GNU Library General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -// USA. -// -// Please report all bugs and problems to "fltk-bugs@fltk.org". -// -// Contents: -// -// Fl_FileIcon::Fl_FileIcon() - Create a new file icon. -// Fl_FileIcon::~Fl_FileIcon() - Remove a file icon. -// Fl_FileIcon::add() - Add data to an icon. -// Fl_FileIcon::find() - Find an icon based upon a given file. -// Fl_FileIcon::draw() - Draw an icon. -// Fl_FileIcon::label() - Set the widgets label to an icon. -// Fl_FileIcon::labeltype() - Draw the icon label. -// Fl_FileIcon::load() - Load an icon file... -// Fl_FileIcon::load_fti() - Load an SGI-format FTI file... -// Fl_FileIcon::load_xpm() - Load an XPM icon file... -// Fl_FileIcon::load_system_icons() - Load the standard system icons/filetypes. -// - -// -// Include necessary header files... -// - -#include <config.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#ifdef HAVE_STRINGS_H -# include <strings.h> -#endif /* HAVE_STRINGS_H */ -#include <ctype.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> -#if defined(WIN32) || defined(__EMX__) -# include <io.h> -# define F_OK 0 -# define strcasecmp stricmp -# define strncasecmp strnicmp -#else -# include <unistd.h> -#endif /* WIN32 || __EMX__ */ - -#include <FL/Fl_FileIcon.H> -#include <FL/Fl_Widget.H> -#include <FL/fl_draw.H> -#include <FL/filename.H> - - -// -// Define missing POSIX/XPG4 macros as needed... -// - -#ifndef S_ISDIR -# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) -# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) -# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) -# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) -#endif /* !S_ISDIR */ - - -// -// Icon cache... -// - -Fl_FileIcon *Fl_FileIcon::first_ = (Fl_FileIcon *)0; - - -// -// Local functions... -// - -static void load_kde_icons(const char *directory); -static void load_kde_mimelnk(const char *filename); -static char *kde_to_fltk_pattern(const char *kdepattern); -static char *get_kde_val(char *str, const char *key); - - -// -// 'Fl_FileIcon::Fl_FileIcon()' - Create a new file icon. -// - -Fl_FileIcon::Fl_FileIcon(const char *p, /* I - Filename pattern */ - int t, /* I - File type */ - int nd, /* I - Number of data values */ - short *d) /* I - Data values */ -{ - // Initialize the pattern and type... - pattern_ = p; - type_ = t; - - // Copy icon data as needed... - if (nd) - { - num_data_ = nd; - alloc_data_ = nd + 1; - data_ = (short *)calloc(sizeof(short), nd + 1); - memcpy(data_, d, nd * sizeof(short)); - } - else - { - num_data_ = 0; - alloc_data_ = 0; - } - - // And add the icon to the list of icons... - next_ = first_; - first_ = this; -} - - -// -// 'Fl_FileIcon::~Fl_FileIcon()' - Remove a file icon. -// - -Fl_FileIcon::~Fl_FileIcon() -{ - Fl_FileIcon *current, // Current icon in list - *prev; // Previous icon in list - - - // Find the icon in the list... - for (current = first_, prev = (Fl_FileIcon *)0; - current != this && current != (Fl_FileIcon *)0; - prev = current, current = current->next_); - - // Remove the icon from the list as needed... - if (current) - { - if (prev) - prev->next_ = current->next_; - else - first_ = current->next_; - } - - // Free any memory used... - if (alloc_data_) - free(data_); -} - - -// -// 'Fl_FileIcon::add()' - Add data to an icon. -// - -short * // O - Pointer to new data value -Fl_FileIcon::add(short d) // I - Data to add -{ - short *dptr; // Pointer to new data value - - - // Allocate/reallocate memory as needed - if ((num_data_ + 1) >= alloc_data_) - { - alloc_data_ += 128; - - if (alloc_data_ == 128) - dptr = (short *)malloc(sizeof(short) * alloc_data_); - else - dptr = (short *)realloc(data_, sizeof(short) * alloc_data_); - - if (dptr == NULL) - return (NULL); - - data_ = dptr; - } - - // Store the new data value and return - data_[num_data_++] = d; - data_[num_data_] = END; - - return (data_ + num_data_ - 1); -} - - -// -// 'Fl_FileIcon::find()' - Find an icon based upon a given file. -// - -Fl_FileIcon * // O - Matching file icon or NULL -Fl_FileIcon::find(const char *filename, // I - Name of file */ - int filetype) // I - Enumerated file type -{ - Fl_FileIcon *current; // Current file in list - struct stat fileinfo; // Information on file - - - // Get file information if needed... - if (filetype == ANY) - if (!stat(filename, &fileinfo)) - { - if (S_ISDIR(fileinfo.st_mode)) - filetype = DIRECTORY; -#ifdef S_IFIFO - else if (S_ISFIFO(fileinfo.st_mode)) - filetype = FIFO; -#endif // S_IFIFO -#if defined(S_ICHR) && defined(S_IBLK) - else if (S_ISCHR(fileinfo.st_mode) || S_ISBLK(fileinfo.st_mode)) - filetype = DEVICE; -#endif // S_ICHR && S_IBLK -#ifdef S_ILNK - else if (S_ISLNK(fileinfo.st_mode)) - filetype = LINK; -#endif // S_ILNK - else - filetype = PLAIN; - } - - // Loop through the available file types and return any match that - // is found... - for (current = first_; current != (Fl_FileIcon *)0; current = current->next_) - if ((current->type_ == filetype || current->type_ == ANY) && - filename_match(filename, current->pattern_)) - break; - - // Return the match (if any)... - return (current); -} - - -// -// 'Fl_FileIcon::draw()' - Draw an icon. -// - -void -Fl_FileIcon::draw(int x, // I - Upper-lefthand X - int y, // I - Upper-lefthand Y - int w, // I - Width of bounding box - int h, // I - Height of bounding box - Fl_Color ic, // I - Icon color... - int active) // I - Active or inactive? -{ - Fl_Color c; // Current color - short *d; // Pointer to data - short *prim; // Pointer to start of primitive... - double scale; // Scale of icon - - - // Don't try to draw a NULL array! - if (num_data_ == 0) - return; - - // Setup the transform matrix as needed... - scale = w < h ? w : h; - - fl_push_matrix(); - fl_translate((float)x + 0.5 * ((float)w - scale), - (float)y + 0.5 * ((float)h + scale)); - fl_scale(scale, -scale); - - // Loop through the array until we see an unmatched END... - d = data_; - prim = NULL; - c = ic; - - if (active) - fl_color(c); - else - fl_color(inactive(c)); - - while (*d != END || prim) - switch (*d) - { - case END : - switch (*prim) - { - case LINE : - fl_end_line(); - break; - - case CLOSEDLINE : - fl_end_loop(); - break; - - case POLYGON : - fl_end_polygon(); - break; - - case OUTLINEPOLYGON : - fl_end_polygon(); - - if (active) - { - if (prim[1] == 256) - fl_color(ic); - else - fl_color((Fl_Color)prim[1]); - } - else - { - if (prim[1] == 256) - fl_color(inactive(ic)); - else - fl_color(inactive((Fl_Color)prim[1])); - } - - fl_begin_loop(); - - prim += 2; - while (*prim == VERTEX) - { - fl_vertex(prim[1] * 0.0001, prim[2] * 0.0001); - prim += 3; - } - - fl_end_loop(); - fl_color(c); - break; - } - - prim = NULL; - d ++; - break; - - case COLOR : - if (d[1] == 256) - c = ic; - else - c = (Fl_Color)d[1]; - - if (!active) - c = inactive(c); - - fl_color(c); - d += 2; - break; - - case LINE : - prim = d; - d ++; - fl_begin_line(); - break; - - case CLOSEDLINE : - prim = d; - d ++; - fl_begin_loop(); - break; - - case POLYGON : - prim = d; - d ++; - fl_begin_polygon(); - break; - - case OUTLINEPOLYGON : - prim = d; - d += 2; - fl_begin_polygon(); - break; - - case VERTEX : - if (prim) - fl_vertex(d[1] * 0.0001, d[2] * 0.0001); - d += 3; - break; - } - - // If we still have an open primitive, close it... - if (prim) - switch (*prim) - { - case LINE : - fl_end_line(); - break; - - case CLOSEDLINE : - fl_end_loop(); - break; - - case POLYGON : - fl_end_polygon(); - break; - - case OUTLINEPOLYGON : - fl_end_polygon(); - - if (active) - { - if (prim[1] == 256) - fl_color(ic); - else - fl_color((Fl_Color)prim[1]); - } - else - { - if (prim[1] == 256) - fl_color(inactive(ic)); - else - fl_color(inactive((Fl_Color)prim[1])); - } - - fl_begin_loop(); - - prim += 2; - while (*prim == VERTEX) - { - fl_vertex(prim[1] * 0.0001, prim[2] * 0.0001); - prim += 3; - } - - fl_end_loop(); - fl_color(c); - break; - } - - // Restore the transform matrix - fl_pop_matrix(); -} - - -// -// 'Fl_FileIcon::label()' - Set the widget's label to an icon. -// - -void -Fl_FileIcon::label(Fl_Widget *w) // I - Widget to label -{ - Fl::set_labeltype(_FL_ICON_LABEL, labeltype, 0); - w->label(_FL_ICON_LABEL, (const char*)this); -} - - -// -// 'Fl_FileIcon::labeltype()' - Draw the icon label. -// - -void -Fl_FileIcon::labeltype(const Fl_Label *o, // I - Label data - int x, // I - X position of label - int y, // I - Y position of label - int w, // I - Width of label - int h, // I - Height of label - Fl_Align a) // I - Label alignment (not used) -{ - Fl_FileIcon *icon; // Pointer to icon data - - - (void)a; - - icon = (Fl_FileIcon *)(o->value); - - icon->draw(x, y, w, h, (Fl_Color)(o->color)); -} - - -// -// 'Fl_FileIcon::load()' - Load an icon file... -// - -void -Fl_FileIcon::load(const char *f) // I - File to read from -{ - const char *ext; // File extension - - - if ((ext = filename_ext(f)) == NULL) - { - fprintf(stderr, "Fl_FileIcon::load(): Unknown file type for \"%s\".\n", f); - return; - } - - if (strcmp(ext, ".fti") == 0) - load_fti(f); - else if (strcmp(ext, ".xpm") == 0) - load_xpm(f); -#if 0 - else if (strcmp(ext, ".png") == 0) - load_png(f); -#endif /* 0 */ - else - { - fprintf(stderr, "Fl_FileIcon::load(): Unknown file type for \"%s\".\n", f); - return; - } -} - - -// -// 'Fl_FileIcon::load_fti()' - Load an SGI-format FTI file... -// - -void -Fl_FileIcon::load_fti(const char *fti) // I - File to read from -{ - FILE *fp; // File pointer - int ch; // Current character - char command[255], // Command string ("vertex", etc.) - params[255], // Parameter string ("10.0,20.0", etc.) - *ptr; // Pointer into strings - int outline; // Outline polygon - - - // Try to open the file... - if ((fp = fopen(fti, "rb")) == NULL) - { - fprintf(stderr, "Fl_FileIcon::load_fti(): Unable to open \"%s\" - %s\n", - fti, strerror(errno)); - return; - } - - // Read the entire file, adding data as needed... - outline = 0; - - while ((ch = getc(fp)) != EOF) - { - // Skip whitespace - if (isspace(ch)) - continue; - - // Skip comments starting with "#"... - if (ch == '#') - { - while ((ch = getc(fp)) != EOF) - if (ch == '\n') - break; - - if (ch == EOF) - break; - else - continue; - } - - // OK, this character better be a letter... - if (!isalpha(ch)) - { - fprintf(stderr, "Fl_FileIcon::load_fti(): Expected a letter at file position %ld (saw '%c')\n", - ftell(fp) - 1, ch); - break; - } - - // Scan the command name... - ptr = command; - *ptr++ = ch; - - while ((ch = getc(fp)) != EOF) - { - if (ch == '(') - break; - else if (ptr < (command + sizeof(command) - 1)) - *ptr++ = ch; - } - - *ptr++ = '\0'; - - // Make sure we stopped on a parenthesis... - if (ch != '(') - { - fprintf(stderr, "Fl_FileIcon::load_fti(): Expected a ( at file position %ld (saw '%c')\n", - ftell(fp) - 1, ch); - break; - } - - // Scan the parameters... - ptr = params; - - while ((ch = getc(fp)) != EOF) - { - if (ch == ')') - break; - else if (ptr < (params + sizeof(params) - 1)) - *ptr++ = ch; - } - - *ptr++ = '\0'; - - // Make sure we stopped on a parenthesis... - if (ch != ')') - { - fprintf(stderr, "Fl_FileIcon::load_fti(): Expected a ) at file position %ld (saw '%c')\n", - ftell(fp) - 1, ch); - break; - } - - // Make sure the next character is a semicolon... - if ((ch = getc(fp)) != ';') - { - fprintf(stderr, "Fl_FileIcon::load_fti(): Expected a ; at file position %ld (saw '%c')\n", - ftell(fp) - 1, ch); - break; - } - - // Now process the command... - if (strcmp(command, "color") == 0) - { - // Set the color; for negative colors blend the two primaries to - // produce a composite color. Also, the following symbolic color - // names are understood: - // - // name FLTK color - // ------------- ---------- - // iconcolor 256; mapped to the icon color in Fl_FileIcon::draw() - // shadowcolor FL_DARK3 - // outlinecolor FL_BLACK - if (strcmp(params, "iconcolor") == 0) - add_color(256); - else if (strcmp(params, "shadowcolor") == 0) - add_color(FL_DARK3); - else if (strcmp(params, "outlinecolor") == 0) - add_color(FL_BLACK); - else - { - short c = atoi(params); // Color value - - - if (c < 0) - { - // Composite color; compute average... - c = -c; - add_color(fl_color_average((Fl_Color)(c >> 4), - (Fl_Color)(c & 15), 0.5)); - } - else - add_color(c); - } - } - else if (strcmp(command, "bgnline") == 0) - add(LINE); - else if (strcmp(command, "bgnclosedline") == 0) - add(CLOSEDLINE); - else if (strcmp(command, "bgnpolygon") == 0) - add(POLYGON); - else if (strcmp(command, "bgnoutlinepolygon") == 0) - { - add(OUTLINEPOLYGON); - outline = add(0) - data_; - } - else if (strcmp(command, "endoutlinepolygon") == 0 && outline) - { - // Set the outline color; see above for valid values... - if (strcmp(params, "iconcolor") == 0) - data_[outline] = 256; - else if (strcmp(params, "shadowcolor") == 0) - data_[outline] = FL_DARK3; - else if (strcmp(params, "outlinecolor") == 0) - data_[outline] = FL_BLACK; - else - { - short c = atoi(params); // Color value - - - if (c < 0) - { - // Composite color; compute average... - c = -c; - data_[outline] = fl_color_average((Fl_Color)(c >> 4), (Fl_Color)(c & 15), 0.5); - } - else - data_[outline] = c; - } - - outline = 0; - add(END); - } - else if (strncmp(command, "end", 3) == 0) - add(END); - else if (strcmp(command, "vertex") == 0) - { - float x, y; // Coordinates of vertex - - - if (sscanf(params, "%f,%f", &x, &y) != 2) - break; - - add_vertex((short)(x * 100.0 + 0.5), (short)(y * 100.0 + 0.5)); - } - else - { - fprintf(stderr, "Fl_FileIcon::load_fti(): Unknown command \"%s\" at file position %ld.\n", - command, ftell(fp) - 1); - break; - } - } - - // Close the file and return... - fclose(fp); - -#ifdef DEBUG - printf("Icon File \"%s\":\n", fti); - for (int i = 0; i < num_data_; i ++) - printf(" %d,\n", data_[i]); -#endif /* DEBUG */ -} - - -// -// 'Fl_FileIcon::load_xpm()' - Load an XPM icon file... -// - -void -Fl_FileIcon::load_xpm(const char *xpm) // I - File to read from -{ - FILE *fp; // File pointer - int i, j; // Looping vars - int ch; // Current character - int bg; // Background color - char line[1024], // Line from file - val[16], // Color value - *ptr; // Pointer into line - int x, y; // X & Y in image - int startx; // Starting X coord - int width, height; // Width and height of image - int ncolors; // Number of colors - short colors[256]; // Colors - int red, green, blue; // Red, green, and blue values - - - // Try to open the file... - if ((fp = fopen(xpm, "rb")) == NULL) - return; - - // Read the file header until we find the first string... - ptr = NULL; - while (fgets(line, sizeof(line), fp) != NULL) - if ((ptr = strchr(line, '\"')) != NULL) - break; - - if (ptr == NULL) - { - // Nothing to load... - fclose(fp); - return; - } - - // Get the size of the image... - sscanf(ptr + 1, "%d%d%d", &width, &height, &ncolors); - - // Now read the colormap... - memset(colors, 0, sizeof(colors)); - bg = ' '; - - for (i = 0; i < ncolors; i ++) - { - while (fgets(line, sizeof(line), fp) != NULL) - if ((ptr = strchr(line, '\"')) != NULL) - break; - - if (ptr == NULL) - { - // Nothing to load... - fclose(fp); - return; - } - - // Get the color's character - ptr ++; - ch = *ptr++; - - // Get the color value... - if ((ptr = strstr(ptr, "c ")) == NULL) - { - // No color; make this black... - colors[ch] = FL_BLACK; - } - else if (ptr[2] == '#') - { - // Read the RGB triplet... - ptr += 3; - for (j = 0; j < 12; j ++) - if (!isxdigit(ptr[j])) - break; - - switch (j) - { - case 0 : - bg = ch; - default : - red = green = blue = 0; - break; - - case 3 : - val[0] = ptr[0]; - val[1] = '\0'; - red = 255 * strtol(val, NULL, 16) / 15; - - val[0] = ptr[1]; - val[1] = '\0'; - green = 255 * strtol(val, NULL, 16) / 15; - - val[0] = ptr[2]; - val[1] = '\0'; - blue = 255 * strtol(val, NULL, 16) / 15; - break; - - case 6 : - case 9 : - case 12 : - j /= 3; - - val[0] = ptr[0]; - val[1] = ptr[1]; - val[2] = '\0'; - red = strtol(val, NULL, 16); - - val[0] = ptr[j + 0]; - val[1] = ptr[j + 1]; - val[2] = '\0'; - green = strtol(val, NULL, 16); - - val[0] = ptr[2 * j + 0]; - val[1] = ptr[2 * j + 1]; - val[2] = '\0'; - blue = strtol(val, NULL, 16); - break; - } - - if (red == green && green == blue) - colors[ch] = FL_GRAY_RAMP + (FL_NUM_GRAY - 1) * red / 255; - else - colors[ch] = fl_color_cube((FL_NUM_RED - 1) * red / 255, - (FL_NUM_GREEN - 1) * green / 255, - (FL_NUM_BLUE - 1) * blue / 255); - } - else - { - // Read a color name... - if (strncasecmp(ptr + 2, "white", 5) == 0) - colors[ch] = FL_WHITE; - else if (strncasecmp(ptr + 2, "black", 5) == 0) - colors[ch] = FL_BLACK; - else if (strncasecmp(ptr + 2, "none", 4) == 0) - { - colors[ch] = FL_BLACK; - bg = ch; - } - else - colors[ch] = FL_GRAY; - } - } - - // Read the image data... - for (y = height - 1; y >= 0; y --) - { - while (fgets(line, sizeof(line), fp) != NULL) - if ((ptr = strchr(line, '\"')) != NULL) - break; - - if (ptr == NULL) - { - // Nothing to load... - fclose(fp); - return; - } - - startx = 0; - ch = bg; - ptr ++; - - for (x = 0; x < width; x ++, ptr ++) - if (*ptr != ch) - { - if (ch != bg) - { - add_color(colors[ch]); - add(POLYGON); - add_vertex(startx * 9000 / width + 1000, y * 9000 / height + 500); - add_vertex(x * 9000 / width + 1000, y * 9000 / height + 500); - add_vertex(x * 9000 / width + 1000, (y + 1) * 9000 / height + 500); - add_vertex(startx * 9000 / width + 1000, (y + 1) * 9000 / height + 500); - add(END); - } - - ch = *ptr; - startx = x; - } - - if (ch != bg) - { - add_color(colors[ch]); - add(POLYGON); - add_vertex(startx * 9000 / width + 1000, y * 9000 / height + 500); - add_vertex(x * 9000 / width + 1000, y * 9000 / height + 500); - add_vertex(x * 9000 / width + 1000, (y + 1) * 9000 / height + 500); - add_vertex(startx * 9000 / width + 1000, (y + 1) * 9000 / height + 500); - add(END); - } - } - - // Close the file and return... - fclose(fp); - -#ifdef DEBUG - printf("Icon File \"%s\":\n", xpm); - for (i = 0; i < num_data_; i ++) - printf(" %d,\n", data_[i]); -#endif /* DEBUG */ -} - - -// -// 'Fl_FileIcon::load_system_icons()' - Load the standard system icons/filetypes. - -void -Fl_FileIcon::load_system_icons(void) -{ - Fl_FileIcon *icon; // New icons - static int init = 0; // Have the icons been initialized? - static short plain[] = // Plain file icon - { - COLOR, 256, OUTLINEPOLYGON, FL_GRAY, - VERTEX, 2000, 1000, VERTEX, 2000, 9000, - VERTEX, 6000, 9000, VERTEX, 8000, 7000, - VERTEX, 8000, 1000, END, OUTLINEPOLYGON, FL_GRAY, - VERTEX, 6000, 9000, VERTEX, 6000, 7000, - VERTEX, 8000, 7000, END, - COLOR, FL_BLACK, LINE, VERTEX, 6000, 7000, - VERTEX, 8000, 7000, VERTEX, 8000, 1000, - VERTEX, 2000, 1000, END, LINE, VERTEX, 3000, 7000, - VERTEX, 5000, 7000, END, LINE, VERTEX, 3000, 6000, - VERTEX, 5000, 6000, END, LINE, VERTEX, 3000, 5000, - VERTEX, 7000, 5000, END, LINE, VERTEX, 3000, 4000, - VERTEX, 7000, 4000, END, LINE, VERTEX, 3000, 3000, - VERTEX, 7000, 3000, END, LINE, VERTEX, 3000, 2000, - VERTEX, 7000, 2000, END, - END - }; - static short image[] = // Image file icon - { - COLOR, 256, OUTLINEPOLYGON, FL_GRAY, - VERTEX, 2000, 1000, VERTEX, 2000, 9000, - VERTEX, 6000, 9000, VERTEX, 8000, 7000, - VERTEX, 8000, 1000, END, OUTLINEPOLYGON, FL_GRAY, - VERTEX, 6000, 9000, VERTEX, 6000, 7000, - VERTEX, 8000, 7000, END, - COLOR, FL_BLACK, LINE, VERTEX, 6000, 7000, - VERTEX, 8000, 7000, VERTEX, 8000, 1000, - VERTEX, 2000, 1000, END, - COLOR, FL_RED, POLYGON, VERTEX, 3500, 2500, - VERTEX, 3000, 3000, VERTEX, 3000, 4000, - VERTEX, 3500, 4500, VERTEX, 4500, 4500, - VERTEX, 5000, 4000, VERTEX, 5000, 3000, - VERTEX, 4500, 2500, END, - COLOR, FL_GREEN, POLYGON, VERTEX, 5500, 2500, - VERTEX, 5000, 3000, VERTEX, 5000, 4000, - VERTEX, 5500, 4500, VERTEX, 6500, 4500, - VERTEX, 7000, 4000, VERTEX, 7000, 3000, - VERTEX, 6500, 2500, END, - COLOR, FL_BLUE, POLYGON, VERTEX, 4500, 3500, - VERTEX, 4000, 4000, VERTEX, 4000, 5000, - VERTEX, 4500, 5500, VERTEX, 5500, 5500, - VERTEX, 6000, 5000, VERTEX, 6000, 4000, - VERTEX, 5500, 3500, END, - END - }; - static short dir[] = // Directory icon - { - COLOR, 256, POLYGON, VERTEX, 1000, 1000, - VERTEX, 1000, 7500, VERTEX, 9000, 7500, - VERTEX, 9000, 1000, END, - POLYGON, VERTEX, 1000, 7500, VERTEX, 2500, 9000, - VERTEX, 5000, 9000, VERTEX, 6500, 7500, END, - COLOR, FL_WHITE, LINE, VERTEX, 1500, 1500, - VERTEX, 1500, 7000, VERTEX, 9000, 7000, END, - COLOR, FL_BLACK, LINE, VERTEX, 9000, 7500, - VERTEX, 9000, 1000, VERTEX, 1000, 1000, END, - COLOR, FL_GRAY, LINE, VERTEX, 1000, 1000, - VERTEX, 1000, 7500, VERTEX, 2500, 9000, - VERTEX, 5000, 9000, VERTEX, 6500, 7500, - VERTEX, 9000, 7500, END, - END - }; - - - // Add symbols if they haven't been added already... - if (!init) - { - if (!access("/usr/share/mimelnk", F_OK)) - { - // Load KDE icons... - icon = new Fl_FileIcon("*", Fl_FileIcon::PLAIN); - icon->load_xpm("/usr/share/icons/unknown.xpm"); - - load_kde_icons("/usr/share/mimelnk"); - } - else if (!access("/usr/share/icons/folder.xpm", F_OK)) - { - // Load GNOME icons... - icon = new Fl_FileIcon("*", Fl_FileIcon::PLAIN); - icon->load_xpm("/usr/share/icons/page.xpm"); - - icon = new Fl_FileIcon("*", Fl_FileIcon::DIRECTORY); - icon->load_xpm("/usr/share/icons/folder.xpm"); - } - else if (!access("/usr/dt/appconfig/icons", F_OK)) - { - // Load CDE icons... - icon = new Fl_FileIcon("*", Fl_FileIcon::PLAIN); - icon->load_xpm("/usr/dt/appconfig/icons/C/Dtdata.m.pm"); - - icon = new Fl_FileIcon("*", Fl_FileIcon::DIRECTORY); - icon->load_xpm("/usr/dt/appconfig/icons/C/DtdirB.m.pm"); - - icon = new Fl_FileIcon("core", Fl_FileIcon::PLAIN); - icon->load_xpm("/usr/dt/appconfig/icons/C/Dtcore.m.pm"); - - icon = new Fl_FileIcon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", Fl_FileIcon::PLAIN); - icon->load_xpm("/usr/dt/appconfig/icons/C/Dtimage.m.pm"); - - icon = new Fl_FileIcon("*.{eps|pdf|ps}", Fl_FileIcon::PLAIN); - icon->load_xpm("/usr/dt/appconfig/icons/C/Dtps.m.pm"); - - icon = new Fl_FileIcon("*.ppd", Fl_FileIcon::PLAIN); - icon->load_xpm("/usr/dt/appconfig/icons/C/DtPrtpr.m.pm"); - } - else if (!access("/usr/lib/filetype", F_OK)) - { - // Load SGI icons... - icon = new Fl_FileIcon("*", Fl_FileIcon::PLAIN); - icon->load_fti("/usr/lib/filetype/iconlib/generic.doc.fti"); - - icon = new Fl_FileIcon("*", Fl_FileIcon::DIRECTORY); - icon->load_fti("/usr/lib/filetype/iconlib/generic.folder.closed.fti"); - - icon = new Fl_FileIcon("core", Fl_FileIcon::PLAIN); - icon->load_fti("/usr/lib/filetype/default/iconlib/CoreFile.fti"); - - icon = new Fl_FileIcon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", Fl_FileIcon::PLAIN); - icon->load_fti("/usr/lib/filetype/system/iconlib/ImageFile.fti"); - - if (!access("/usr/lib/filetype/install/iconlib/acroread.doc.fti", F_OK)) - { - icon = new Fl_FileIcon("*.{eps|ps}", Fl_FileIcon::PLAIN); - icon->load_fti("/usr/lib/filetype/system/iconlib/PostScriptFile.closed.fti"); - - icon = new Fl_FileIcon("*.pdf", Fl_FileIcon::PLAIN); - icon->load_fti("/usr/lib/filetype/install/iconlib/acroread.doc.fti"); - } - else - { - icon = new Fl_FileIcon("*.{eps|pdf|ps}", Fl_FileIcon::PLAIN); - icon->load_fti("/usr/lib/filetype/system/iconlib/PostScriptFile.closed.fti"); - } - - if (!access("/usr/lib/filetype/install/iconlib/html.fti", F_OK)) - { - icon = new Fl_FileIcon("*.{htm|html|shtml}", Fl_FileIcon::PLAIN); - icon->load_fti("/usr/lib/filetype/iconlib/generic.doc.fti"); - icon->load_fti("/usr/lib/filetype/install/iconlib/html.fti"); - } - - if (!access("/usr/lib/filetype/install/iconlib/color.ps.idle.fti", F_OK)) - { - icon = new Fl_FileIcon("*.ppd", Fl_FileIcon::PLAIN); - icon->load_fti("/usr/lib/filetype/install/iconlib/color.ps.idle.fti"); - } - } - else - { - // Create the default icons... - new Fl_FileIcon("*", Fl_FileIcon::PLAIN, sizeof(plain) / sizeof(plain[0]), plain); - new Fl_FileIcon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", Fl_FileIcon::PLAIN, - sizeof(image) / sizeof(image[0]), image); - new Fl_FileIcon("*", Fl_FileIcon::DIRECTORY, sizeof(dir) / sizeof(dir[0]), dir); - } - - // Mark things as initialized... - init = 1; - } -} - - -// -// 'load_kde_icons()' - Load KDE icon files. -// - -static void -load_kde_icons(const char *directory) // I - Directory to load -{ - int i; // Looping var - int n; // Number of entries in directory - dirent **entries; // Entries in directory - char full[1024]; // Full name of file - - - entries = (dirent **)0; - n = filename_list(directory, &entries); - - for (i = 0; i < n; i ++) - { - if (entries[i]->d_name[0] != '.') - { - strcpy(full, directory); - strcat(full,"/"); - strcat(full, entries[i]->d_name); - - if (filename_isdir(full)) - load_kde_icons(full); - else - load_kde_mimelnk(full); - } - - free((void *)entries[i]); - } - - free((void*)entries); -} - - -// -// 'load_kde_mimelnk()' - Load a KDE "mimelnk" file. -// - -static void -load_kde_mimelnk(const char *filename) -{ - FILE *fp; - char tmp[256]; - char iconfilename[1024]; - char pattern[1024]; - char mimetype[1024]; - char *val; - char full_iconfilename[1024]; - Fl_FileIcon *icon; - - - if ((fp = fopen(filename, "rb")) != NULL) - { - while (fgets(tmp, sizeof(tmp), fp)) - { - if ((val = get_kde_val(tmp, "Icon")) != NULL) - strcpy(iconfilename, val); - else if ((val = get_kde_val(tmp, "MimeType")) != NULL) - strcpy(mimetype, val); - else if ((val = get_kde_val(tmp, "Patterns")) != NULL) - strcpy(pattern, val); - } - - if (iconfilename && pattern) - { - sprintf(full_iconfilename, "/usr/share/icons/%s", iconfilename); - - if (strcmp(mimetype, "inode/directory") == 0) - icon = new Fl_FileIcon("*", Fl_FileIcon::DIRECTORY); - else - icon = new Fl_FileIcon(kde_to_fltk_pattern(pattern), Fl_FileIcon::PLAIN); - - icon->load_xpm(full_iconfilename); - } - - fclose(fp); - } -} - - -// -// 'kde_to_fltk_pattern()' - Convert a KDE pattern to a FLTK pattern. -// - -static char * -kde_to_fltk_pattern(const char *kdepattern) -{ - char *pattern, - *patptr; - - - pattern = (char *)malloc(strlen(kdepattern) + 3); - strcpy(pattern, "{"); - strcat(pattern, kdepattern); - - if (pattern[strlen(pattern) - 1] == ';') - pattern[strlen(pattern) - 1] = '\0'; - - strcat(pattern, "}"); - - for (patptr = pattern; *patptr; patptr ++) - if (*patptr == ';') - *patptr = '|'; - - return (pattern); -} - - -// -// 'get_kde_val()' - Get a KDE value. -// - -static char * -get_kde_val(char *str, - const char *key) -{ - while (*str == *key) - { - str ++; - key ++; - } - - if (*key == '\0' && *str == '=') - { - if (str[strlen(str) - 1] == '\n') - str[strlen(str) - 1] = '\0'; - - return (str + 1); - } - - return ((char *)0); -} - - -// -// End of "$Id: Fl_FileIcon.cxx,v 1.10.2.1 2001/08/02 16:17:04 easysw Exp $". -// |
