aboutsummaryrefslogtreecommitdiff
path: root/SrcUnix/espws-2.0/FileIcon.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'SrcUnix/espws-2.0/FileIcon.cxx')
-rw-r--r--SrcUnix/espws-2.0/FileIcon.cxx1217
1 files changed, 1217 insertions, 0 deletions
diff --git a/SrcUnix/espws-2.0/FileIcon.cxx b/SrcUnix/espws-2.0/FileIcon.cxx
new file mode 100644
index 0000000..9eae59a
--- /dev/null
+++ b/SrcUnix/espws-2.0/FileIcon.cxx
@@ -0,0 +1,1217 @@
+//
+// "$Id: FileIcon.cxx,v 1.19 2000/01/22 15:21:07 mike Exp $"
+//
+// FileIcon routines.
+//
+// KDE icon code donated by Maarten De Boer.
+//
+// Copyright 1997-2000 by Easy Software Products.
+//
+// These coded instructions, statements, and computer programs are the
+// property of Easy Software Products and are protected by Federal
+// copyright law. Distribution and use rights are outlined in the file
+// "COPYING" which should have been included with this file. If this
+// file is missing or damaged please contact Easy Software Products
+// at:
+//
+// Attn: ESP Licensing Information
+// Easy Software Products
+// 44141 Airport View Drive, Suite 204
+// Hollywood, Maryland 20636-3111 USA
+//
+// Voice: (301) 373-9600
+// EMail: info@easysw.com
+// WWW: http://www.easysw.com
+//
+// Contents:
+//
+// FileIcon::FileIcon() - Create a new file icon.
+// FileIcon::~FileIcon() - Remove a file icon.
+// FileIcon::add() - Add data to an icon.
+// FileIcon::find() - Find an icon based upon a given file.
+// FileIcon::draw() - Draw an icon.
+// FileIcon::label() - Set the widgets label to an icon.
+// FileIcon::labeltype() - Draw the icon label.
+// FileIcon::load() - Load an icon file...
+// FileIcon::load_fti() - Load an SGI-format FTI file...
+// FileIcon::load_xpm() - Load an XPM icon file...
+// FileIcon::load_system_icons() - Load the standard system icons/filetypes.
+//
+
+//
+// Include necessary header files...
+//
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.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 "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...
+//
+
+FileIcon *FileIcon::first_ = (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);
+
+
+//
+// 'FileIcon::FileIcon()' - Create a new file icon.
+//
+
+FileIcon::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;
+}
+
+
+//
+// 'FileIcon::~FileIcon()' - Remove a file icon.
+//
+
+FileIcon::~FileIcon()
+{
+ FileIcon *current, // Current icon in list
+ *prev; // Previous icon in list
+
+
+ // Find the icon in the list...
+ for (current = first_, prev = (FileIcon *)0;
+ current != this && current != (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_);
+}
+
+
+//
+// 'FileIcon::add()' - Add data to an icon.
+//
+
+short * // O - Pointer to new data value
+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);
+}
+
+
+//
+// 'FileIcon::find()' - Find an icon based upon a given file.
+//
+
+FileIcon * // O - Matching file icon or NULL
+FileIcon::find(const char *filename, // I - Name of file */
+ int filetype) // I - Enumerated file type
+{
+ 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 != (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);
+}
+
+
+//
+// 'FileIcon::draw()' - Draw an icon.
+//
+
+void
+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(fl_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(fl_inactive(ic));
+ else
+ fl_color(fl_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 = fl_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(fl_inactive(ic));
+ else
+ fl_color(fl_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();
+}
+
+
+//
+// 'FileIcon::label()' - Set the widget's label to an icon.
+//
+
+void
+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);
+}
+
+
+//
+// 'FileIcon::labeltype()' - Draw the icon label.
+//
+
+void
+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)
+{
+ FileIcon *icon; // Pointer to icon data
+
+
+ icon = (FileIcon *)(o->value);
+
+ icon->draw(x, y, w, h, (Fl_Color)(o->color));
+}
+
+
+//
+// 'FileIcon::load()' - Load an icon file...
+//
+
+void
+FileIcon::load(const char *f) // I - File to read from
+{
+ const char *ext; // File extension
+
+
+ if ((ext = filename_ext(f)) == NULL)
+ {
+ fprintf(stderr, "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, "FileIcon::load(): Unknown file type for \"%s\".\n", f);
+ return;
+ }
+}
+
+
+//
+// 'FileIcon::load_fti()' - Load an SGI-format FTI file...
+//
+
+void
+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, "r")) == NULL)
+ {
+ fprintf(stderr, "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, "FileIcon::load_fti(): Expected a letter at file position %d (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, "FileIcon::load_fti(): Expected a ( at file position %d (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, "FileIcon::load_fti(): Expected a ) at file position %d (saw '%c')\n",
+ ftell(fp) - 1, ch);
+ break;
+ }
+
+ // Make sure the next character is a semicolon...
+ if ((ch = getc(fp)) != ';')
+ {
+ fprintf(stderr, "FileIcon::load_fti(): Expected a ; at file position %d (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 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, "FileIcon::load_fti(): Unknown command \"%s\" at file position %d.\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 */
+}
+
+
+//
+// 'FileIcon::load_xpm()' - Load an XPM icon file...
+//
+
+void
+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, "r")) == NULL)
+ return;
+
+ // Read the file header until we find the first string...
+ 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;
+ }
+
+ 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 */
+}
+
+
+//
+// 'FileIcon::load_system_icons()' - Load the standard system icons/filetypes.
+
+void
+FileIcon::load_system_icons(void)
+{
+ 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 FileIcon("*", 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 FileIcon("*", FileIcon::PLAIN);
+ icon->load_xpm("/usr/share/icons/page.xpm");
+
+ icon = new FileIcon("*", FileIcon::DIRECTORY);
+ icon->load_xpm("/usr/share/icons/folder.xpm");
+ }
+ else if (!access("/usr/dt/appconfig/icons", F_OK))
+ {
+ // Load CDE icons...
+ icon = new FileIcon("*", FileIcon::PLAIN);
+ icon->load_xpm("/usr/dt/appconfig/icons/C/Dtdata.m.pm");
+
+ icon = new FileIcon("*", FileIcon::DIRECTORY);
+ icon->load_xpm("/usr/dt/appconfig/icons/C/DtdirB.m.pm");
+
+ icon = new FileIcon("core", FileIcon::PLAIN);
+ icon->load_xpm("/usr/dt/appconfig/icons/C/Dtcore.m.pm");
+
+ icon = new FileIcon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", FileIcon::PLAIN);
+ icon->load_xpm("/usr/dt/appconfig/icons/C/Dtimage.m.pm");
+
+ icon = new FileIcon("*.{eps|pdf|ps}", FileIcon::PLAIN);
+ icon->load_xpm("/usr/dt/appconfig/icons/C/Dtps.m.pm");
+
+ icon = new FileIcon("*.ppd", 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 FileIcon("*", FileIcon::PLAIN);
+ icon->load_fti("/usr/lib/filetype/iconlib/generic.doc.fti");
+
+ icon = new FileIcon("*", FileIcon::DIRECTORY);
+ icon->load_fti("/usr/lib/filetype/iconlib/generic.folder.closed.fti");
+
+ icon = new FileIcon("core", FileIcon::PLAIN);
+ icon->load_fti("/usr/lib/filetype/default/iconlib/CoreFile.fti");
+
+ icon = new FileIcon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", 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 FileIcon("*.{eps|ps}", FileIcon::PLAIN);
+ icon->load_fti("/usr/lib/filetype/system/iconlib/PostScriptFile.closed.fti");
+
+ icon = new FileIcon("*.pdf", FileIcon::PLAIN);
+ icon->load_fti("/usr/lib/filetype/install/iconlib/acroread.doc.fti");
+ }
+ else
+ {
+ icon = new FileIcon("*.{eps|pdf|ps}", 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 FileIcon("*.{htm|html|shtml}", 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 FileIcon("*.ppd", FileIcon::PLAIN);
+ icon->load_fti("/usr/lib/filetype/install/iconlib/color.ps.idle.fti");
+ }
+ }
+ else
+ {
+ // Create the default icons...
+ new FileIcon("*", FileIcon::PLAIN, sizeof(plain) / sizeof(plain[0]), plain);
+ new FileIcon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", FileIcon::PLAIN,
+ sizeof(image) / sizeof(image[0]), image);
+ new FileIcon("*", 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];
+ FileIcon *icon;
+
+
+ if ((fp = fopen(filename, "r")) != 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 (mimetype && strcmp(mimetype, "inode/directory") == 0)
+ icon = new FileIcon("*", FileIcon::DIRECTORY);
+ else
+ icon = new FileIcon(kde_to_fltk_pattern(pattern), 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: FileIcon.cxx,v 1.19 2000/01/22 15:21:07 mike Exp $".
+//