fl_file_chooser2.cxx
来自「SRI international 发布的OAA框架软件」· CXX 代码 · 共 1,164 行 · 第 1/3 页
CXX
1,164 行
//
// 'Fl_File_Chooser::rescan()' - Rescan the current directory.
//
void
Fl_File_Chooser::rescan()
{
char pathname[1024]; // New pathname for filename field
// Clear the current filename
strlcpy(pathname, directory_, sizeof(pathname));
if (pathname[0] && pathname[strlen(pathname) - 1] != '/') {
strlcat(pathname, "/", sizeof(pathname));
}
// puts("Setting fileName in rescan()");
fileName->value(pathname);
if (type_ & DIRECTORY)
okButton->activate();
else
okButton->deactivate();
// Build the file list...
fileList->load(directory_, sort);
// Update the preview box...
update_preview();
}
//
// 'Fl_File_Chooser::showChoiceCB()' - Handle show selections.
//
void
Fl_File_Chooser::showChoiceCB()
{
const char *item, // Selected item
*patstart; // Start of pattern
char *patend; // End of pattern
char temp[1024]; // Temporary string for pattern
item = showChoice->text(showChoice->value());
if (strcmp(item, custom_filter_label) == 0) {
if ((item = fl_input(custom_filter_label, pattern_)) != NULL) {
strlcpy(pattern_, item, sizeof(pattern_));
quote_pathname(temp, item, sizeof(temp));
showChoice->add(temp);
showChoice->value(showChoice->size() - 2);
}
} else if ((patstart = strchr(item, '(')) == NULL) {
strlcpy(pattern_, item, sizeof(pattern_));
} else {
strlcpy(pattern_, patstart + 1, sizeof(pattern_));
if ((patend = strrchr(pattern_, ')')) != NULL) *patend = '\0';
}
fileList->filter(pattern_);
rescan();
}
//
// 'Fl_File_Chooser::update_favorites()' - Update the favorites menu.
//
void
Fl_File_Chooser::update_favorites()
{
int i; // Looping var
char pathname[1024], // Pathname
menuname[2048]; // Menu name
const char *home; // Home directory
favoritesButton->clear();
favoritesButton->add("bla");
favoritesButton->clear();
favoritesButton->add(add_favorites_label, FL_ALT + 'a', 0);
favoritesButton->add(manage_favorites_label, FL_ALT + 'm', 0, 0, FL_MENU_DIVIDER);
favoritesButton->add(filesystems_label, FL_ALT + 'f', 0);
if ((home = getenv("HOME")) != NULL) {
quote_pathname(menuname, home, sizeof(menuname));
favoritesButton->add(menuname, FL_ALT + 'h', 0);
}
for (i = 0; i < 100; i ++) {
sprintf(menuname, "favorite%02d", i);
prefs_.get(menuname, pathname, "", sizeof(pathname));
if (!pathname[0]) break;
quote_pathname(menuname, pathname, sizeof(menuname));
if (i < 10) favoritesButton->add(menuname, FL_ALT + '0' + i, 0);
else favoritesButton->add(menuname);
}
if (i == 100) ((Fl_Menu_Item *)favoritesButton->menu())[0].deactivate();
}
//
// 'Fl_File_Chooser::update_preview()' - Update the preview box...
//
void
Fl_File_Chooser::update_preview()
{
const char *filename; // Current filename
Fl_Shared_Image *image, // New image
*oldimage; // Old image
int pbw, pbh; // Width and height of preview box
int w, h; // Width and height of preview image
if (!previewButton->value()) return;
if ((filename = value()) == NULL) image = NULL;
else {
window->cursor(FL_CURSOR_WAIT);
Fl::check();
image = Fl_Shared_Image::get(filename);
if (image) {
window->cursor(FL_CURSOR_DEFAULT);
Fl::check();
}
}
oldimage = (Fl_Shared_Image *)previewBox->image();
if (oldimage) oldimage->release();
previewBox->image(0);
if (!image) {
FILE *fp;
int bytes;
char *ptr;
if (filename) fp = fopen(filename, "rb");
else fp = NULL;
if (fp != NULL) {
// Try reading the first 1k of data for a label...
bytes = fread(preview_text_, 1, sizeof(preview_text_) - 1, fp);
preview_text_[bytes] = '\0';
fclose(fp);
} else {
// Assume we can't read any data...
preview_text_[0] = '\0';
}
window->cursor(FL_CURSOR_DEFAULT);
Fl::check();
// Scan the buffer for printable chars...
for (ptr = preview_text_; *ptr && (isprint(*ptr) || isspace(*ptr)); ptr ++);
if (*ptr || ptr == preview_text_) {
// Non-printable file, just show a big ?...
previewBox->label(filename ? "?" : 0);
previewBox->align(FL_ALIGN_CLIP);
previewBox->labelsize(100);
previewBox->labelfont(FL_HELVETICA);
} else {
// Show the first 1k of text...
int size = previewBox->h() / 20;
if (size < 6) size = 6;
else if (size > 14) size = 14;
previewBox->label(preview_text_);
previewBox->align((Fl_Align)(FL_ALIGN_CLIP | FL_ALIGN_INSIDE |
FL_ALIGN_LEFT | FL_ALIGN_TOP));
previewBox->labelsize((uchar)size);
previewBox->labelfont(FL_COURIER);
}
} else {
pbw = previewBox->w() - 20;
pbh = previewBox->h() - 20;
if (image->w() > pbw || image->h() > pbh) {
w = pbw;
h = w * image->h() / image->w();
if (h > pbh) {
h = pbh;
w = h * image->w() / image->h();
}
oldimage = (Fl_Shared_Image *)image->copy(w, h);
previewBox->image((Fl_Image *)oldimage);
image->release();
} else {
previewBox->image((Fl_Image *)image);
}
previewBox->align(FL_ALIGN_CLIP);
previewBox->label(0);
}
previewBox->redraw();
}
//
// 'Fl_File_Chooser::value()' - Return a selected filename.
//
const char * // O - Filename or NULL
Fl_File_Chooser::value(int f) // I - File number
{
int i; // Looping var
int fcount; // Number of selected files
const char *name; // Current filename
char *slash; // Trailing slash, if any
static char pathname[1024]; // Filename + directory
if (!(type_ & MULTI)) {
name = fileName->value();
if (!name || !name[0]) return NULL;
else if (fl_filename_isdir(name)) {
if (type_ & DIRECTORY) {
// Strip trailing slash, if any...
strlcpy(pathname, name, sizeof(pathname));
slash = pathname + strlen(pathname) - 1;
if (*slash == '/') *slash = '\0';
return pathname;
} else return NULL;
} else return name;
}
for (i = 1, fcount = 0; i <= fileList->size(); i ++)
if (fileList->selected(i)) {
// See if this file is a directory...
name = fileList->text(i);
if (directory_[0]) {
snprintf(pathname, sizeof(pathname), "%s/%s", directory_, name);
} else {
strlcpy(pathname, name, sizeof(pathname));
}
if (!fl_filename_isdir(pathname)) {
// Nope, see if this this is "the one"...
fcount ++;
if (fcount == f) return (pathname);
}
}
return (NULL);
}
//
// 'Fl_File_Chooser::value()' - Set the current filename.
//
void
Fl_File_Chooser::value(const char *filename) // I - Filename + directory
{
int i, // Looping var
fcount; // Number of items in list
char *slash; // Directory separator
char pathname[1024]; // Local copy of filename
// printf("Fl_File_Chooser::value(\"%s\")\n", filename == NULL ? "(null)" : filename);
// See if the filename is the "My System" directory...
if (filename == NULL || !filename[0]) {
// Yes, just change the current directory...
directory(filename);
fileName->value("");
okButton->deactivate();
return;
}
// Switch to single-selection mode as needed
if (type_ & MULTI)
type(SINGLE);
// See if there is a directory in there...
fl_filename_absolute(pathname, sizeof(pathname), filename);
if ((slash = strrchr(pathname, '/')) == NULL)
slash = strrchr(pathname, '\\');
if (slash != NULL) {
// Yes, change the display to the directory...
if (!fl_filename_isdir(pathname)) *slash++ = '\0';
directory(pathname);
if (*slash == '/') slash = pathname;
} else {
directory(".");
slash = pathname;
}
// Set the input field to the absolute path...
if (slash > pathname) slash[-1] = '/';
fileName->value(pathname);
fileName->position(0, strlen(pathname));
okButton->activate();
// Then find the file in the file list and select it...
fcount = fileList->size();
fileList->deselect(0);
fileList->redraw();
for (i = 1; i <= fcount; i ++)
#if defined(WIN32) || defined(__EMX__)
if (strcasecmp(fileList->text(i), slash) == 0) {
#else
if (strcmp(fileList->text(i), slash) == 0) {
#endif // WIN32 || __EMX__
// printf("Selecting line %d...\n", i);
fileList->topline(i);
fileList->select(i);
break;
}
}
//
// 'quote_pathname()' - Quote a pathname for a menu.
//
static void
quote_pathname(char *dst, // O - Destination string
const char *src, // I - Source string
int dstsize) // I - Size of destination string
{
dstsize --;
while (*src && dstsize > 1) {
if (*src == '\\') {
// Convert backslash to forward slash...
*dst++ = '\\';
*dst++ = '/';
src ++;
} else {
if (*src == '/') *dst++ = '\\';
*dst++ = *src++;
}
}
*dst = '\0';
}
//
// 'unquote_pathname()' - Unquote a pathname from a menu.
//
static void
unquote_pathname(char *dst, // O - Destination string
const char *src, // I - Source string
int dstsize) // I - Size of destination string
{
dstsize --;
while (*src && dstsize > 1) {
if (*src == '\\') src ++;
*dst++ = *src++;
}
*dst = '\0';
}
//
// End of "$Id: Fl_File_Chooser2.cxx,v 1.1.1.1 2003/06/03 22:25:42 agno Exp $".
//
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?