/************************************************************************ ** ** FILE : diwinmisc.c ** ** ZWECK : Enthaelt verschiedene private Funktionen fuer die DiWin-Funktionen ** DiCancel wenn CANCEL Button gedrueckt wird: ** schliest Widget ** DiFiSelect wenn File angeklickt wird: ** uebertraegt Filename von Liste in die File- ** Eingabezeile ** DiPaSelect wenn Verzeichnis angeklickt wird: ** richtet neuen Pfad ein und scannt Verzeichnis ** DiREAD wenn gelesen werden soll ** DiWRITE wenn geschrieben werden soll ** DiAskSayYes wenn Sicherheitsabfrage fuer Ueberschreiben ** mit Ja beantwortet wird: ** schreibt File und schliesst Widget ** DiAskSayNo wenn Sicherheitsabfrage fuer Ueberschreiben ** mit Nein beantwortet wird: ** macht gar nichts ** DiFiAction wenn File doppelt angeklickt wird, ** LESE/SCHREIBEN Button gedrueckt wird oder ** File von Hand eingegeben wird ** DiPaLoad wenn File von Hand eingegeben wird ** ** ANMERK: DiFiAction() wird als Action-Funktion UND als Callback-Funktion ** verwendet, obwohl eigentlich verschiedene Parameterlisten ** noetig waeren. Habe aber keine Probleme damit. ** ** AUTOR : Michael C. Ancutici ** Universitaet Stuttgart, Fakultaet Informatik ** ** DATUM : 14.03.93 ** *************************************************************************/ #include "diwin.H" #include "askwin.h" #include "fileio.h" #include "hamess.h" /************************************************************************* ** FUNKTION: DiCancel ** ZWECK: schliesst Widget *************************************************************************/ void DiCancel( w, client_data, call_data) Widget w; XtPointer client_data, call_data; { DiMessage( DI_CHECK_FOR_CLEAR); DiWinPopdown(); } /************************************************************************* ** FUNKTION: DiFiSelect ** ZWECK: Uebertraegt angeklickten Filenamen aus Liste in die ** File-Eingabezeile ** INPUT: Namen (und Index) ueber call_data *************************************************************************/ void DiFiSelect( w, client_data, call_data) Widget w; XtPointer client_data, call_data; { char *string = ((XawListReturnStruct *)call_data)->string; DiMessage( DI_CHECK_FOR_CLEAR); /* evtl. Statusanzeige loeschen */ XtVaSetValues( DiFiText, /* Filename anzeigen */ XtNstring, string, NULL); XtVaSetValues( DiFiText, /* Textcursor ans Ende setzen */ XtNinsertPosition, strlen(string), NULL); } /************************************************************************* ** FUNKTION: DiPaSelect ** ZWECK: Wenn ein Verzeichnis angeklickt wird, wird der neue Pfad *+ eingerichtet und das neue Verzeichnis gescannt ** INPUT: Index (und Name) ueber call_data *************************************************************************/ void DiPaSelect( w, client_data, call_data) Widget w; XtPointer client_data, call_data; { int index = ((XawListReturnStruct *)call_data)->list_index; if (index == DirInh.nPfad-1) { /* gerade aktuelles Verzeichnis */ XawListUnhighlight( DiPaList); /* angeklickt ? Dann Verzeichnis-*/ DiMessage( DI_HERE_WE_ARE); /* name wieder in normaler Hellig*/ } /* keit und Bemerkung Statusz. */ else { DiMessage( DI_CHECK_FOR_CLEAR); ChangePath( &DirInh, index); /* sonst neues Verzeichnis und */ DiScan(); /* scannen */ } } /************************************************************************* ** FUNKTION: DiRead ** ZWECK: liest File, setzt Pfad und Filename in DirInh gueltig ** und schliesst Widget ** INPUT: Pfad und Filename sowie nur Filename allein *************************************************************************/ void DiREAD( PfadPLUSFile, File) char *File; char *PfadPLUSFile; { if (FileLoad( PfadPLUSFile) == NOT_OK) { DiMessage( DI_IS_NO_NETFILE); return; } strcpy( DirInh.FilePfad, DirInh.Pfad); strcpy( DirInh.File, File); HaWinSetFilename( File); DiWinPopdown(); } /************************************************************************* ** FUNKTION: DiWRITE ** ZWECK: schreibt File, setzt Pfad und Filename in DirInh gueltig ** und schliesst Widget ** INPUT: Pfad und Filename sowie nur Filename allein *************************************************************************/ void DiWRITE( PfadPLUSFile, File) char *File; char *PfadPLUSFile; { FILE *fp; if (!(fp=fopen( PfadPLUSFile, "w"))) { /* File ueberschreibbar ? */ DiMessage( DI_CANNOT_WRITE_OVER); /* Nein: Meldung */ return; } else fclose( fp); FileSave( PfadPLUSFile); HaMessage( HA_FILE_SAVED); strcpy( DirInh.FilePfad, DirInh.Pfad); strcpy( DirInh.File, File); HaWinSetFilename( File); DirInh.ScanNew = TRUE; DiWinPopdown(); } /************************************************************************* ** FUNKTION: DiAskSayYes ** ZWECK: Funktion, die ausgefuehrt wird, wenn die Sicherheits- ** abfrage fuer das Ueberschreiben eines Files mit Ja be- ** antwortet wird: ** Es wird getestet, ob sich das File ueberhaupt ueberschreiben *+ laesst, dann wird ueberschrieben und das Widget geschlossen *************************************************************************/ void DiAskSayYes( w, client_data, call_data) Widget w; XtPointer client_data, call_data; { String File; STRING PfadPLUSFile; FILE *fp; AskWinPopdown(); /* Widget Sicherheitsabfrage schliessen */ XtVaGetValues( DiFiText, /* Filename holen */ XtNstring, &File, NULL); sprintf( PfadPLUSFile, "%s%s", DirInh.Pfad, File); /* vollst. Name */ if (!(fp=fopen( PfadPLUSFile, "w"))) /* File ueberschreibbar ? */ DiMessage( DI_CANNOT_WRITE_OVER); /* Nein: Meldung */ else { fclose( fp); DiWRITE( PfadPLUSFile, File); /* Ueberschreiben ! */ } } /************************************************************************* ** FUNKTION: DiAskSayNo ** ZWECK: Funktion, die ausgefuehrt wird, wenn die Sicherheits- ** abfrage fuer das Ueberschreiben eines Files mit Nein be- ** antwortet wird: ** Nichts machen. *************************************************************************/ void DiAskSayNo( w, client_data, call_data) Widget w; XtPointer client_data, call_data; { AskWinPopdown(); /* Widget Sicherheitsabfrage schliessen */ } /************************************************************************* ** FUNKTION: DiFiAction ** ZWECK: Funktion, die ausgefuehrt wird, wenn File doppelt angeklickt, ** LESE/SCHREIBEN Button gedrueckt oder File von Hand eingegeben ** wird. Test auf Existenz und Weiterverarbeitung je nach ** Auftrag Lesen oder Schreiben. *************************************************************************/ void DiFiAction() { String File; STRING PfadPLUSFile; STRING temp; FILE *fp; XtVaGetValues( DiFiText, /* Filename holen */ XtNstring, &File, NULL); DiMessage( DI_CHECK_FOR_CLEAR); /* evtl Statusanzeige loeschen */ if (File[ 0] != EOL) { sprintf( PfadPLUSFile, "%s%s", DirInh.Pfad, File); /* vollst. Name */ if (DiOrder == DI_READ) /* Auftrag Lesen ? */ if (!(fp=fopen( PfadPLUSFile, "r"))) /* Nichtexistenz ? */ DiMessage( DI_FILE_DOESNT_EXIST); /* Fehlermeldung */ else { fclose( fp); DiREAD( PfadPLUSFile, File); /* sonst lesen */ } else if (!(fp =fopen( PfadPLUSFile, "r"))) /* Nichtexistenz */ DiWRITE( PfadPLUSFile, File); /* Schreiben */ else { fclose( fp); /* sonst Sicherheitsabfr.*/ sprintf( temp, "Overwrite %s ?", File); AskWinPopup( DiShell, "Attention", temp, DiAskSayYes, DiAskSayNo); } } } /************************************************************************* ** FUNKTION: DiPaLoad ** ZWECK: Funktion, die ausgefuehrt wird, wenn Pfad manuell eingegeben ** wird: Pfad setzen (DirInh) und Verzeichnis scannen *************************************************************************/ void DiPaLoad() { String TempPfad; XtVaGetValues( DiPaText, /* Pfadstring lesen */ XtNstring, &TempPfad, NULL); if (SetPath( &DirInh, TempPfad) == NOT_OK) { /* Existenz ? */ DiMessage( DI_PATH_DOESNT_EXIST); } else { DiMessage( DI_CHECK_FOR_CLEAR); DiScan(); } }