*** rasmol.c 2004/10/30 20:42:19 1.2 --- rasmol.c 2004/10/30 20:45:18 *************** *** 188,194 **** --- 185,195 ---- #endif #ifdef XFORMSLIB + #include #include + #define XFORMS_FONTSIZE 14 + #define XFORMS_OPENDIALOG 0 + #define XFORMS_SAVEDIALOG 1 #endif #define IsIdentChar(x) ((isalnum(x))||((x)=='_')||((x)=='$')) *************** *** 829,834 **** --- 830,836 ---- { char *r; + fl_use_fselector(XFORMS_OPENDIALOG); r = fl_show_fselector("Open Structure file", "", "", ""); if (r && *r) { *************** *** 840,845 **** --- 842,964 ---- ResetCommandLine(0); } } + + static void HandleFileSave( int selector ) + { + char *r; + struct stat status; + static const char * cmd[] = { + "pdb", + "gif", + "epsf", + "ppm", + "iris", + "ras", + "bpm", + "pict" + }; + static const char * suffix[] = { + "*.pdb", + "*.gif", + "*.epsf", + "*.ppm", + "*.rgb", + "*.ras", + "*.bpm", + "*.pict" + }; + static const char * mesg[] = { + "Save current molecule as", + "Save GIF image as", + "Save EPSF file as", + "Save PPM image as", + "Save IRIS image as", + "Save Raster format as", + "Save BPM image as", + "Save PICT file as" + }; + + if (selector < 0 || selector > 7) { + WriteString("Error: command not supported"); + return; + } + + fl_use_fselector(XFORMS_SAVEDIALOG); + do { + r = fl_show_fselector(mesg[selector], "", suffix[selector], ""); + + if (r == NULL || *r == 0) + break; + + if (stat(r, &status)) + break; + + if (status.st_mode & S_IFREG) { + if (fl_show_question("Overwrite existing file?", 0)) + break; + continue; + } + + fl_show_alert("Following name is directory or used for another purpose:", r, "Please chose another.", 0); + } while (r); + + if (r && *r) { + if (selector) + WriteString("write "); + else + WriteString("save "); + WriteString(cmd[selector]); + WriteChar(' '); + WriteString(r); + WriteChar(' '); + switch (selector) + { case 1: WriteGIFFile(r); break; + case 2: WriteEPSFFile(r,True,True); break; + case 3: WritePPMFile(r,True); break; + case 4: WriteIRISFile(r); break; + case 5: WriteRastFile(r,True); break; + case 6: WriteBMPFile(r); break; + case 7: WritePICTFile(r); break; + default: SavePDBMolecule(r); + break; + } + ResetCommandLine(0); + } + } + + #define MAX_PATH_LEN 256 + + static void CreateNewFolder(void * name) + { + char *dir, *parent, *ans; + long len; + + do { + ans = fl_show_input("Create New Folder as:", name); + if (ans == NULL) + break; + if (strlen(ans) < MAX_PATH_LEN) + break; + fl_show_alert("Too long", "", "", 0); + } while (0); + + parent = fl_get_directory(); + len = strlen(parent) + MAX_PATH_LEN; + dir = malloc(len); + if (dir == NULL) { + fl_show_alert("ERROR:", "NO memory", "", 0); + return; + } + + strcpy(dir, parent); + strcat(dir, "/"); + strcat(dir, ans); + + if (mkdir(dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) + fl_show_alert("Cannot create", dir, "", 0); + free(dir); + fl_refresh_fselector(); + } #endif static void HandleMenu( int hand ) *************** *** 864,870 **** --- 983,993 ---- case(2): /* Save As */ if( Database ) + #ifdef XFORMSLIB + HandleFileSave(0); + #else ResetCommandLine(4); + #endif break; case(3): /* Close */ *************** *** 1094,1101 **** --- 1217,1228 ---- break; case(5): /* Export Menu */ + #ifdef XFORMSLIB + HandleFileSave(item); + #else ResetCommandLine(3); StateOption = item; + #endif break; case(6): /* Help Menu */ *************** *** 1475,1480 **** --- 1602,1635 ---- } } + #ifdef XFORMSLIB + static void InitialiseFSDialogs(void) + { + FD_FSELECTOR *fs; + + if ( ! Interactive ) + return; + + /* fl_initialize(&argc, argv, VersionStr, 0, 0); */ + fl_init(); + + /* Open File Dialog */ + fl_use_fselector(XFORMS_OPENDIALOG); + fl_set_fselector_fontsize(XFORMS_FONTSIZE); + fs = fl_get_fselector_fdstruct(); + fl_set_object_label(fs->ready, "Load"); + fl_fit_object_label(fs->ready, 1, 1); + + /* Save File Dialog */ + fl_use_fselector(XFORMS_SAVEDIALOG); + fl_set_fselector_fontsize(XFORMS_FONTSIZE); + fl_add_fselector_appbutton("New Folder", CreateNewFolder, (void *)"Untitled") ; + fs = fl_get_fselector_fdstruct(); + fl_set_object_label(fs->ready, "Save as"); + fl_fit_object_label(fs->ready, 1, 1); + + } + #endif int main( int argc, char *argv[] ) { *************** *** 1527,1540 **** } #ifdef XFORMSLIB ! if ( Interactive ) { ! FD_FSELECTOR *fs; ! fl_initialize(&argc, argv, VersionStr, 0, 0); ! fl_set_fselector_fontsize(14); ! fs = fl_get_fselector_fdstruct(); ! fl_set_object_label(fs->ready, "Load"); ! fl_fit_object_label(fs->ready, 1, 1); ! } #endif InitialiseCmndLine(); --- 1682,1688 ---- } #ifdef XFORMSLIB ! InitialiseFSDialogs(); #endif InitialiseCmndLine();