void ListFiles(void) { /* int i,k; */ unsigned char Taste=0; AltPos=Pos; AltCPos=CPos; Pos=0; CPos=2; DisplayFiles(); for(;;) { Taste=getch(); if (Taste==27) { DatName1[0]=0; break; } if (Taste==73) { Pos-=21; if (Pos<0) { Pos=0; CPos=2; } DisplayFiles(); Taste=0; } if (Taste==81) { Pos+=21; if (Pos>Dateien-22) { Pos=Dateien-22; CPos=23; if (Pos<0) { Pos=0; CPos=Dateien+1; } } DisplayFiles(); Taste=0; } if (Taste==72 && CPos==2 && Pos>0) { Pos--; DisplayFiles(); Taste=0; } if (Taste==80 && CPos==23) { Pos++; if (Pos>Dateien-22) Pos=Dateien-22; DisplayFiles(); Taste=0; } if (Taste==72 && CPos==2 && Pos==0) Taste=0; if (Taste==80 && CPos<Dateien+1) { CPos++; DisplayFiles(); Taste=0; } if (Taste==72) { CPos--; DisplayFiles(); Taste=0; } if (Taste==79) { Pos=Dateien-22; CPos=23; if (Pos<0) { Pos=0; CPos=Dateien+1; } DisplayFiles(); } if (Taste==71) { Pos=0; CPos=2; DisplayFiles(); } if ( ((Taste>94 && Taste<123) || (Taste>32 && Taste<58)) && SPos<8) { SuchStr[SPos]=Taste; SuchStr[SPos+1]=0; Print(27,22,0,15," "); Print(27,22,0,15,SuchStr); SPos++; if (SPos>0) DateiSuchen(); } if (Taste==8 && SPos>0) { SPos--; SuchStr[SPos]=0; Print(27,22,0,15," "); Print(27,22,0,15,SuchStr); if (SPos>0) DateiSuchen(); } if (Taste==13) { strcpy(DatName1,Datai->FileName); break; } } if (Datai->Date==0 && strlen(DatName1)>0) { chdir(Datai->FileName); GetDir(WildCard); } Pos=AltPos; CPos=AltCPos; Dateien=0; DisplayFiles(); SuchStr[0]=0; SPos=0; CWeg(); }
/*----------------------------------------------------------------------------------------------------------------------*/ void FileOpenHome(GtkWidget *But,gpointer Unused) { char *Str,L2Str[LONG_TEXT_FIELD]; Str=getenv("HOME"); strcpy(FileX->Path,Str); gtk_entry_set_text(GTK_ENTRY(FileX->PEntry),FileX->Path); DisplayFiles(); gtk_entry_set_text(GTK_ENTRY(FileX->FEntry),""); gtk_widget_set_sensitive(FileX->But,FALSE); gtk_label_set_text(GTK_LABEL(FileX->Label1),""); sprintf(L2Str,"%d files found",FileX->Files); gtk_label_set_text(GTK_LABEL(FileX->Label2),L2Str); }
/*----------------------------------------------------------------------------------------------------------------------*/ void FileOpenReScan(GtkWidget *But,gpointer Unused) { gchar L2Str[LONG_TEXT_FIELD]; gchar *Entry; Entry=gtk_entry_get_text(GTK_ENTRY(FileX->PEntry)); strcpy(FileX->Path,Entry); DisplayFiles(); sprintf(L2Str,"%d files found",FileX->Files); gtk_label_set_text(GTK_LABEL(FileX->Label2),L2Str); gtk_entry_set_text(GTK_ENTRY(FileX->FEntry),""); gtk_widget_set_sensitive(FileX->But,FALSE); gtk_label_set_text(GTK_LABEL(FileX->Label1),""); }
/*----------------------------------------------------------------------------------------------------------------------*/ void FileOpenUp(GtkWidget *But,gpointer Unused) { gchar L2Str[LONG_TEXT_FIELD]; strcpy(strrchr(FileX->Path,'/'),"\0"); if (strlen(FileX->Path)==0) strcpy(FileX->Path,"/"); gtk_entry_set_text(GTK_ENTRY(FileX->PEntry),FileX->Path); DisplayFiles(); gtk_entry_set_text(GTK_ENTRY(FileX->FEntry),""); gtk_widget_set_sensitive(FileX->But,FALSE); gtk_label_set_text(GTK_LABEL(FileX->Label1),""); sprintf(L2Str,"%d files found",FileX->Files); gtk_label_set_text(GTK_LABEL(FileX->Label2),L2Str); }
void DateiSuchen(void) { int i; Datai=Da; for (i=0;i<Dateien;i++) { if (strnicmp(SuchStr,Datai->FileName,SPos)==0) { Pos=i-10; CPos=12; if (Pos<0 || Dateien<22) { CPos=i+2; Pos=0; break; } if (Pos>Dateien-22) { Pos=Dateien-22; CPos=Dateien-i; CPos=24-CPos; } break; } Datai++; } DisplayFiles(); }
/*----------------------------------------------------------------------------------------------------------------------*/ gint FSelect(GtkWidget *But,GdkEventButton *Event,gpointer Data) { gint I; struct stat StatBuf; gchar FullPath[NAME_MAX+255+5],FName[MAX_DIR_STRLEN],*Str,L2Str[LONG_TEXT_FIELD]; I=GPOINTER_TO_INT(Data); if (!strcmp(FileX->Path,"/")) sprintf(FullPath,"%s%s",FileX->Path,FileX->Names[I]); //If the path is "/" else sprintf(FullPath,"%s%c%s",FileX->Path,'/',FileX->Names[I]); //All other cases stat(FullPath,&StatBuf); if (Event->type==GDK_2BUTTON_PRESS) //Double Click { if (S_ISREG(StatBuf.st_mode)) //Double Click File { strcpy(FileX->TargetFile,FileX->Names[FileX->Index]); gtk_signal_emit_by_name(GTK_OBJECT(FileX->But),"clicked",NULL); } else //Double Click Folder { strcpy(FileX->Path,FullPath); gtk_entry_set_text(GTK_ENTRY(FileX->PEntry),FileX->Path); DisplayFiles(); gtk_entry_set_text(GTK_ENTRY(FileX->FEntry),""); gtk_widget_set_sensitive(FileX->But,FALSE); gtk_label_set_text(GTK_LABEL(FileX->Label1),""); sprintf(L2Str,"%d files found",FileX->Files); gtk_label_set_text(GTK_LABEL(FileX->Label2),L2Str); } return TRUE; } FileX->Index=I; //Single Click if (S_ISREG(StatBuf.st_mode)) //Single Click File { strcpy(FName,FileX->Names[FileX->Index]); if ((Str=strstr(FName,FileX->Mask))) Str[0]='\0'; //Get rid of mask and ff gtk_entry_set_text(GTK_ENTRY(FileX->FEntry),FName); AbbreviateFileName(L2Str,FileX->Names[FileX->Index],20); gtk_label_set_text(GTK_LABEL(FileX->Label1),L2Str); strcpy(FileX->TargetFile,FileX->Names[FileX->Index]); gtk_widget_set_sensitive(FileX->But,TRUE); } return FALSE; }
/*----------------------------------------------------------------------------------------------------------------------*/ void FileOpenNew(gchar *Title,GtkWidget *Parent,gint X,gint Y,gboolean OpenToRead,gchar *StartPath,gchar *Mask, gboolean MaskEditable,void (*CallBack)(GtkWidget *,gpointer),gboolean Persist) /* Must have FileX=g_new(struct FileSelectType,1) just before reference to FileOpenNew Title=Window title, Parent=Window wrt to which the file browser will be set_transient (keep NULL if not needed) X,Y=Window position, OpenToRead=TRUE to open file for read or FALSE to open file for write StartPath=initial directory, eg. "." or "/home/lamps/lamps" Mask eg. ".ban" (limited to 3 chars); "" will give all files; "d" will give all files ending in 'd' MaskEditable=TRUE allows the user to change the Mask CallBack=name of callback routine eg. &ReadFile, must g_free(FileX) in this except if Persist=TRUE Persist=TRUE keeps the browser open after selection and the "Cancel" button is replaced by "Dismiss" in this case do not g_free(FileX) in CallBack */ { GtkWidget *VBox,*HBox,*But,*ScrollW,*Label,*Arrow,*PxW; #include "Home.xpm" GdkBitmap *Msk; GdkPixmap *PxMp; GtkStyle *St; gint i,StatOut; struct stat StatBuf; gchar L2Str[LONG_TEXT_FIELD]; static GdkColor Red = {0,0xFFFF,0x0000,0x0000}; static GdkColor Blue = {0,0x0000,0x0000,0xFFFF}; GtkStyle *RedStyle,*BlueStyle; RedStyle=gtk_style_copy(gtk_widget_get_default_style()); RedStyle->fg[0]=RedStyle->text[0]=Red; BlueStyle=gtk_style_copy(gtk_widget_get_default_style()); BlueStyle->fg[0]=BlueStyle->text[0]=Blue; strcpy(FileX->Mask,Mask); FileX->Index=-1; FileX->N=0; for (i=0;i<MAX_DIR_ENTRIES;++i) strcpy(FileX->Names[i],""); FileX->Win=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_grab_add(FileX->Win); if (Parent) gtk_window_set_transient_for(GTK_WINDOW(FileX->Win),GTK_WINDOW(Parent)); gtk_window_set_title(GTK_WINDOW(FileX->Win),Title); gtk_signal_connect(GTK_OBJECT(FileX->Win),"delete_event",GTK_SIGNAL_FUNC(FileOpenDelete),NULL); gtk_container_set_border_width(GTK_CONTAINER(FileX->Win),10); gtk_widget_set_usize(GTK_WIDGET(FileX->Win),500,466); gtk_widget_set_uposition(GTK_WIDGET(FileX->Win),X,Y); gtk_widget_show(FileX->Win); St=gtk_widget_get_style(FileX->Win); VBox=gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(FileX->Win),VBox); HBox=gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(VBox),HBox,FALSE,FALSE,10); if (OpenToRead) Label=gtk_label_new("Look in:"); else Label=gtk_label_new("Save in:"); gtk_box_pack_start(GTK_BOX(HBox),Label,FALSE,FALSE,10); if (!strcmp(StartPath,".")) getcwd(FileX->Path,LONG_TEXT_FIELD); else strcpy(FileX->Path,StartPath); StatOut=stat(FileX->Path,&StatBuf); //Check if the supplied StartPath is a valid directory if (StatOut==-1) getcwd(FileX->Path,LONG_TEXT_FIELD); //stat in error else if (!S_ISDIR(StatBuf.st_mode)) getcwd(FileX->Path,LONG_TEXT_FIELD); //Not a directory FileX->PEntry=gtk_entry_new_with_max_length(LONG_TEXT_FIELD); gtk_entry_set_text(GTK_ENTRY(FileX->PEntry),FileX->Path); gtk_widget_set_usize(GTK_WIDGET(FileX->PEntry),320,24); gtk_box_pack_start(GTK_BOX(HBox),FileX->PEntry,FALSE,FALSE,0); But=gtk_button_new(); gtk_box_pack_start(GTK_BOX(HBox),But,FALSE,FALSE,0); Arrow=gtk_arrow_new(GTK_ARROW_UP,GTK_SHADOW_IN); gtk_container_add (GTK_CONTAINER(But),Arrow); gtk_signal_connect(GTK_OBJECT(But),"clicked",GTK_SIGNAL_FUNC(FileOpenUp),NULL); But=gtk_button_new(); gtk_box_pack_start(GTK_BOX(HBox),But,FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(But),"clicked",GTK_SIGNAL_FUNC(FileOpenHome),NULL); PxMp=gdk_pixmap_create_from_xpm_d((FileX->Win)->window,&Msk,&St->bg[GTK_STATE_NORMAL],(gchar **)Home_xpm); PxW=gtk_pixmap_new(PxMp,Msk); gtk_container_add(GTK_CONTAINER(But),PxW); But=gtk_button_new_with_label("Rescan"); gtk_box_pack_start(GTK_BOX(HBox),But,FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(But),"clicked",GTK_SIGNAL_FUNC(FileOpenReScan),NULL); ScrollW=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ScrollW),GTK_POLICY_NEVER,GTK_POLICY_ALWAYS); gtk_box_pack_start(GTK_BOX(VBox),ScrollW,FALSE,FALSE,0); gtk_widget_set_usize(GTK_WIDGET(ScrollW),0,340); FileX->Table=gtk_table_new(1,3,FALSE); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(ScrollW),FileX->Table); gtk_table_set_row_spacings(GTK_TABLE(FileX->Table),0); gtk_table_set_col_spacings(GTK_TABLE(FileX->Table),0); DisplayFiles(); HBox=gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(VBox),HBox,FALSE,FALSE,10); Label=gtk_label_new("File Name:"); gtk_box_pack_start(GTK_BOX(HBox),Label,FALSE,FALSE,0); gtk_widget_set_usize(GTK_WIDGET(Label),100,0); FileX->FEntry=gtk_entry_new_with_max_length(LONG_TEXT_FIELD); gtk_box_pack_start(GTK_BOX(HBox),FileX->FEntry,FALSE,FALSE,0); gtk_widget_set_usize(GTK_WIDGET(FileX->FEntry),160,0); gtk_signal_connect(GTK_OBJECT(FileX->FEntry),"changed",GTK_SIGNAL_FUNC(FileChanged),NULL); FileX->Label1=gtk_label_new(""); gtk_box_pack_start(GTK_BOX(HBox),FileX->Label1,FALSE,FALSE,0); SetStyleRecursively(FileX->Label1,RedStyle); gtk_widget_set_usize(GTK_WIDGET(FileX->Label1),170,0); if (OpenToRead) FileX->But=gtk_button_new_with_label("Open"); else FileX->But=gtk_button_new_with_label("Save"); gtk_box_pack_start(GTK_BOX(HBox),FileX->But,FALSE,FALSE,0); gtk_widget_set_usize(GTK_WIDGET(FileX->But),50,0); gtk_widget_set_sensitive(FileX->But,FALSE); gtk_signal_connect(GTK_OBJECT(FileX->But),"clicked",GTK_SIGNAL_FUNC(CallBack),NULL); if (!Persist) gtk_signal_connect_object(GTK_OBJECT(FileX->But),"clicked",GTK_SIGNAL_FUNC(gtk_widget_destroy), GTK_OBJECT(FileX->Win)); HBox=gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(VBox),HBox,FALSE,FALSE,0); if (OpenToRead) Label=gtk_label_new("Files of type:"); else Label=gtk_label_new("Save as type:"); gtk_box_pack_start(GTK_BOX(HBox),Label,FALSE,FALSE,0); gtk_widget_set_usize(GTK_WIDGET(Label),100,0); FileX->MEntry=gtk_entry_new_with_max_length(4); gtk_box_pack_start(GTK_BOX(HBox),FileX->MEntry,FALSE,FALSE,0); gtk_entry_set_text(GTK_ENTRY(FileX->MEntry),Mask); gtk_widget_set_usize(GTK_WIDGET(FileX->MEntry),110,0); if (MaskEditable) gtk_entry_set_editable(GTK_ENTRY(FileX->MEntry),TRUE); else gtk_entry_set_editable(GTK_ENTRY(FileX->MEntry),FALSE); gtk_signal_connect(GTK_OBJECT(FileX->MEntry),"changed",GTK_SIGNAL_FUNC(MaskChanged),NULL); But=gtk_button_new_with_label("Rescan"); gtk_box_pack_start(GTK_BOX(HBox),But,FALSE,FALSE,0); sprintf(L2Str,"%d files found",FileX->Files); FileX->Label2=gtk_label_new(L2Str); gtk_box_pack_start(GTK_BOX(HBox),FileX->Label2,FALSE,FALSE,0); gtk_widget_set_usize(GTK_WIDGET(FileX->Label2),170,0); gtk_signal_connect(GTK_OBJECT(But),"clicked",GTK_SIGNAL_FUNC(FileOpenReScan),NULL); SetStyleRecursively(FileX->Label2,BlueStyle); gtk_widget_set_usize(GTK_WIDGET(But),50,0); if (Persist) But=gtk_button_new_with_label("Dismiss"); else But=gtk_button_new_with_label("Cancel"); gtk_box_pack_start(GTK_BOX(HBox),But,FALSE,FALSE,0); gtk_signal_connect(GTK_OBJECT(But),"clicked",GTK_SIGNAL_FUNC(FileOpenCancel),FileX->Win); gtk_widget_set_usize(GTK_WIDGET(But),50,0); gtk_widget_show_all(FileX->Win); gtk_style_unref(RedStyle); gtk_style_unref(BlueStyle); }