/**************************************************************************** PROGRAM: wincd.c PURPOSE: Hakemiston vaihto Windowsissa AUTHOR: Antero Aalto -1991, Vesa Lappalainen 6.11.1991 - PROJECT: wincd.c wincd.rc wincd.def wincdfil.c ncdread.c ALI\mjonot.c - merkkijonoaliohjelmia ALI\transdlg.c - dialogin käännös toiselle kielelle ALI\language.c - T() makro ja lisäksi transdlg.c tarvitsee ALI\dropfile.c - tiedostonimien raahaaminen ALI\clipboar.c - AddToClipboard ALI\optdlg.c - optiodialogit COMPILING: 16-bit: Automatic Far Data on, thershold 300 byte Ei toimi, koska tällöin ei voi olla montaa esiintymää! Constant strings in Code segment ei toimi kunnolla? (BC 4.51, WfW 3.11) FUNCTIONS: WinMain() - kutsuu alustusfunktiota, hoitaa viestisilmukan InitApplication() - alustaa ikkunan datan ja rekisteröi ikkunan InitInstance() - tallentaa esiintymän kahvan ja luo pääikkunan MainWndProc() - vastaanottaa viestejä ja suorittaa niiden vaatimat toimenpiteet About() - hoitelee "About" dialog boxin viestit OpenDlg() - hoitelee hakemiston vaihtodialogin viestit. UpdateListBox() - päivittää OpenDlg:n hakemistolistan. InitMenu() - Alustaa valikon UpdateMenu() - Päivittää valikon OnkoMenussa() - Tarkistaa, onko hakemiston nimi ennestään valikossa TallennaVanhat() - Tallentaa vanhat hakemistot WIN.INI:in writecurdir() - Tallentaa nykyisen WinCD-hakemiston. Tarkenne() - Palauttaa parametrina annettavan ohjelman nimen tarkenteen. Poikkeuksellisia asennuksia: BCW - kopioi TCDEFW.* oletushakemistoon WORKSHOP - muuta WORKSHOP.INI AMIPRO - laita asiakirjahakemistoksi . WINGZ - kopioi DG ja WZSCRIPT oletushakemistoon WPWIN - ?? pitäisi kai muuttaa WP{WP}.SET -tiedostoa Versioiden korjaukset: Versio Antero Aalto: + 9 edellistä + edellisiin vain Talleta -nappulalla + modeless-dialogi, jolloin mahdollista käyttää pikanäppäimiä edellisten hakemiseen + oma ikonin käsittely, ennen kaikista dialogeista tuli WinCD:n ikoni + About siirretty pois nappuloista, koska ei niin tärkeä + Uuden hakemiston luonti ja tuhoaminen mahdollista + Ohjelman käynnityshakmeistoon tehtävä nimi.INI -tiedosto, josta ohjelman käynnistysohjeita Versio 1.1 e 6.11.1991 + talletus WINCD.INI, ei enää WIN.INI + talletaa heti, ei kun WINCD loppuu Versio 1.1 f 7.11.1992 + AssosRun polku+tiedosto, ennen vain tiedosto + tallettaa tilansa myös kun Windows suljetaan, ei vain silloin kuin WinCD suljetaan Versio 1.1 g 15.11.1992 + edellisten talletuksessa kysytään mihin kohti + LogFile=tiedoston nimi WINCD.INI:ssä määrää tiedoston, johon jokaisen ohjelman käynnistysajankohta tallennetaan + [Paikka] ja [Vanhat] kohdat WINCD.INIin. + maskissa saa olla esim. *.c;*.h;*.rc Versio 1.1 h 17.11.1992 + Drag and Drop FileManagerista Versio 1.1 i 22.11.1992 + valinta listboxista häviää, kun mennään toiseen ikkunaan + NCD-tyylinen hakemiston vaihto Versio 1.1 j 2.12.1992 + tiedoston kopiointi toimii taas + maskien talletus omaan menuunsa CTRL+nro + tekstien talletus omaan menuunsa CTRL+kirjain Versio 1.1 k 3.12.1992 + käynnistys myös edit-ikkunasta kirjoittamalla Versio 1.1 l 11.12.1992 + ARGS ja ARGSA sectionit ja @-merkintä nykyhakemistolle. Versio 1.1 m 19.12.1992 + Assoc run toimii kuten FileManagerissakin, eli ^-osa korvataan polulla ja tiedoston nimellä ilman tarkenninta. Versio 1.1 n 22.12.1992 + RUNDIR ja &-merkki + & ja @ pois ja tilalle merkinnät :PROG:, :CUR:, :WIN:, :WINCD: Versio 1.1 o 23.12.1992 + WinCDdir_in lukeminen paikkaan, jossa myös parametririviltä käynnistys löytää sen Versio 1.1 q 25.12.1992 + Enter muutettu valitsemaan mieluummin sen kohdan, jossa kursori nyt on, ei aina hakemiston vaihtoa. Versio 1.2 a 29.8.1993 + Drop-palvelin (ei pudota FileManageriin) + minimoidun ikkunan sulkeminen ensin isontaa ja sitten tallettaa paikan (ennen meni ikonin koordinaatit) + FileList muutettu multiselect, jolloin hommia voidaan tehdä yhtäaikaa usealle tiedostolle + monikielisyys (käännös WinCD.tra), ctrl-R - kääntää myös ComboBoxin! Versio 1.2 b 12.9.1993 + Drop-palvelin ei pudota itseensä ennenkuin on käyty muualla. + ei käännä enää ComboBoxia jos se on kielletty! Ver 1.2 c 10.10.1993 + päähakemiston c:\\koe.txt -ongelma korjattu + Ei enää sekoa jos tiedoston lisäyksessä jos ko. tiedosto löytyy polusta + näppäin DaD Ver 1.2 d 24.10.1993 + help alustavasti Ver 1.2 e 15.6.1994 + jos monta esiintymää, niin vain 1. vaihtaa hakemistoa, muiden tarkoitus on toimia DaD-palvelimina + globaaleja muuttujia karsittu + jos korppu otettu pois, niin WinCD ei pääse pois => korjattu + lopettaminen ':uun suorittaa aina rivin ja poistaa ':un ennen suoritusta + F1 käynnistää HELPin Ver 1.2 f 28.7.1994 + jos pitkä hakemiston nimi, niin 1. käynnistyskerralla nimeen meni .. ja homma ei toiminut; korjattu + nyt vaihda pelkästään vaihtaa eikä aja ohjelmaa eikä tee NCDtä + taas tallettaa hakemiston vanhoihin Ver 1.3 a 2.10.1994/vl + ohjelmasta erotettu tiedostojen käsittely omaksi osakseen, jota voidaan sitten käyttää myös muissa ohjelmissa - wincddir winfileen Ver 1.4 a 9.8.1995/vl + Tallennus epäonnistui -ilmoitus pois 2. esiintymästä + Drag toimii nyt myös tiedostolistasta ja nykyhakemistosta + nykyhakemisto leikekirjaan + tiedoston nimet pieneksi pudotuksessa Ver 1.4 b 11.8.1995/vl + käynnistyy haluttaessa vaikkei hakemistoon päästäkään + optiodialogi WinCD:n optioille Ver 1.4 c 13.8.1995/vl + korjattu 1.4 b:n vikoja (osa johtui kääntäjän optioista) + optiodialogi DaD:n optioille + 2. esiintymän otsikko pienellä Ver 1.4 d 21.8.1995/vl + 2. esiintymä ei enää vaihda WinCD:n hakemistoa! Ver 1.4 f 21.8.1995/vl + 2. esiintymä osaa vaihtaa taas NCD:llä + leikekirjaan menee oikea hakemiston nimi, ei se missä viimeksi oltiin Ver 1.4 g 3.9.1995/vl + kakkosesiintymän ikkunan otsikko nyt oikein Ver 1.4 h 6.9.1995/vl - itse WinCD käynnistyy siihen hakemistoon, jossa oli viimeksi, eli ei enää tarvitse wincd wincd - jos current.wcd ei ole, käynnistetään oletushakemistoon Suunnitelmia: ------------- - DaD sallittu kun mennään ulos siitä ikkunasta, jossa se aloitettíin - pudotus nappuloiden päälle - dialogi pääikkunaksi kunnolla tehtynä - Ei enää turhaa hakemiston vaihtoa kun ... sotki joskus NCD:n jälkeen - hakemistot joissa saa käynnistää - hakemistot joissa ei saa käynnistää - merkki siitä että ohjelma on lähtemässä käyntiin klikkauksella - NCD-tiedoston kirjoittaminenkin - kopiointi DaD:stä Melkein tehty suunnitelmista: ----------------------------- - nykyhakemisto kaksoisklikkauksella ja Ctrl-Insillä ja Ctrl-C:llä leikekirjaan - yhdellä klikkauksella nykyhakemistosta tai automaattisesti - help-toimii - ei päivitetty + nykyhakemisto DaD:hen - OK + käynnistettäviä ohjelmia johonkin palkkiin - WinRun tehty tätä varten ****************************************************************************/ #define VERSIO "Ver 1.4 h 6.9.1995/vl" #include #include #include #include #include #include #include #include #include #include /* Drag and Drop, ks. BC exs. DragDrop */ #include "portable.h" #include "wincdfil.h" #include "wincd.h" #include "ncdread.h" #include "mdialog.h" #include "mjonot.h" #include "dropfile.h" #include "clipboar.h" #include "transdlg.h" #ifndef LANGUAGE_H # define T(str) str # define TB(str) str # define set_translate(k) # define read_translate(n,k) # define free_translate() # define language() 0 #endif /* Vakiot */ #ifndef __WIN32__ /* WIN-16 ***********************************************/ # define CWTITLE "WinCD" #else /* WIN 32 ************************************************************/ # define CWTITLE "WinCD32" #endif #define WTITLE WINCDTitle() #define VANHOJA 9 #define MASKEJA 9 #define TEKSTEJA 15 #define HISTORYS 20 #define UPDATE_LISTS 3333 #define FIRST_OLD 11001 #define FIRST_MASK 12001 #define FIRST_TEXT 13001 #define OLETUSMASKI "*.*" #define HISTORYITEM "History" #define POSITEM "Paikka" #define OLDITEM "Vanhat" /* Komentoriviargumenttien käsittelyssä tarvittavat muuttujat */ extern int _Cdecl _argc; extern char **_Cdecl _argv; extern char **_Cdecl environ; /************************************************************************/ /* Globaalit muuttujat: */ static HANDLE GhInstance; static char str[255]; /* Apumerkkijono */ static struct { /* Vanhat hakemistot */ char vanha[80]; char maski[40]; } vanhat[VANHOJA]; static struct { /* Vanhat maskit */ char maski[40]; } maskit[MASKEJA]; static struct { /* Vanhat tekstit */ char teksti[80]; } tekstit[TEKSTEJA]; static HMENU hPopMenu; static HMENU hPopMaskMenu; static HMENU hPopTextMenu; //static HICON ikoni; static int FirstInstance = 0; /***********************************************************************/ static int IndicateOnClipboard(HWND hWnd,int on) { if ( on ) SetDlgItemText(hWnd,IDC_CURRENTTEXT,T("&Nyt leikepöytä:")); else SetDlgItemText(hWnd,IDC_CURRENTTEXT,T("&Nykyhakemisto")); return 0; } /************************************************************************ FUNKTIO: CurDirToClipboard TARKOITUS: Tallentaa nykyisen WinCD-hakemiston leikekirjaan ************************************************************************/ static const char *CurDirToClipboard(HWND hWnd) { const char *s = WCD_GetCurrent(); kopioi_jono(N_S(str),s); jono_pieneksi(str); TextToClipboard(hWnd,str); IndicateOnClipboard(hWnd,1); return str; } /************************************************************************ FUNKTIO: writecurdir TARKOITUS: Tallentaa nykyisen WinCD-hakemiston tiedostoon. Vain ohjelman 1. esiintymä saa tallettaa muutoksen! ************************************************************************/ static const char *writecurdir(HWND hWnd) { if ( WinCDOptions.AutoClipboard ) CurDirToClipboard(hWnd); if ( !FirstInstance ) return WCD_GetCurrent(); return WCD_UpdateCurrentDir(); } /************************************************************************/ static int CheckIfInsideDlgItem(HWND hWnd,int id, const POINT *pt) { RECT rc; GetWindowRect(id ? GetDlgItem(hWnd,id) : hWnd,&rc); return PtInRect(&rc,*pt); } /************************************************************************/ int DoDropText(HWND hWnd,const char *s) { int ret; SetDlgItemText(hWnd,IDC_PATH,s); ret = DropText(hWnd,s); SetDlgItemText(hWnd,IDC_PATH,WCD_GetCurrent()); return ret; } /************************************************************************/ static int CheckIfInsideCurrent(HWND hWnd) { const char *s; POINT pt; GetCursorPos(&pt); if ( CheckIfInsideDlgItem(hWnd,IDC_CURRENTTEXT,&pt) == 0 && CheckIfInsideDlgItem(hWnd,IDC_PATH,&pt) == 0 ) return 0; s = CurDirToClipboard(hWnd); DoDropText(hWnd,s); return 1; } /****************************************************************************/ static const char *WINCDTitle(void) { static char wtitle[50]; kopioi_jono(N_S(wtitle),CWTITLE); if ( FirstInstance ) return wtitle; liita_jono(N_S(wtitle)," - "); liita_jono(N_S(wtitle),WCD_GetCurrent()); jono_pieneksi(wtitle); return wtitle; } LONG FAR PASCAL _export MainWndProc(HWND hWnd, unsigned message, WPARAM wParam, LPARAM lParam) { #pragma argsused return 0; } /****************************************************************************/ static int CountWinCDs(HANDLE hInstance) { WNDCLASS wc; /* Ikkunaluokka */ wc.style = NULL; wc.lpfnWndProc = DefDlgProc; wc.cbClsExtra = 0; wc.cbWndExtra = DLGWINDOWEXTRA;; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, "WINCDICON"); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "WinCDClass"; if ( RegisterClass(&wc) ) return 0; return 1; } /**************************************************************************** FUNCTION: GetListBoxText(HANDLE, int,char *,int) PURPOSE: Ottaa list_boxista nyt valitun tekstin ja paluttaa 1 jollei valintaa ole tehty, palauttaa 0 ****************************************************************************/ static int GetListBoxText(HWND hDlg,int idc_list,char *s,int max_s,int multi) { char ls[100]; LRESULT m = LB_ERR; LRESULT n; if ( multi ) { n = SendDlgItemMessage(hDlg, idc_list,LB_GETSELCOUNT,0,0); if ( n > 0 ) m = SendDlgItemMessage(hDlg, idc_list,LB_GETCARETINDEX,0,0); } else m = SendDlgItemMessage(hDlg, idc_list,LB_GETCURSEL,0,0); if ( m == LB_ERR ) return 0; SendDlgItemMessage(hDlg, idc_list, LB_GETTEXT,(WPARAM)m, (LPARAM)ls); strncpy(s,ls,max_s); s[max_s-1]=0; return 1; } /**************************************************************************** FUNCTION: InitInstance(HANDLE, int) PURPOSE: Tallentaa esiintymän kahvan ****************************************************************************/ static BOOL InitInstance(HANDLE hInstance,int nCmdShow) { #pragma argsused GhInstance = hInstance; return TRUE; } /***************************************************************************/ static int Unselect(HWND hDlg,WPARAM who) { if ( who != IDC_FILELIST ) { SendDlgItemMessage(hDlg,IDC_FILELIST,LB_SETCURSEL,-1,0); SendDlgItemMessage(hDlg,IDC_FILELIST,LB_SETSEL,FALSE,MAKELPARAM(-1,0)); } if ( who != IDC_DIRLIST ) SendDlgItemMessage(hDlg,IDC_DIRLIST,LB_SETCURSEL,-1,0); if ( who != IDC_DIRMASK ) SendDlgItemMessage(hDlg,IDC_DIRMASK,EM_SETSEL,0,MAKELPARAM(-1,0)); return 1; } /***************************************************************************/ static void AddSaveName(HMENU h,const char *s,int n) { AppendMenu(h, MF_SEPARATOR, n+10,""); AppendMenu(h, MF_STRING|MF_GRAYED, n, s); } /***************************************************************************/ static void InsertMenus(const char *d,const char *m,const char *s) { AddSaveName(hPopMenu,d,9000); AddSaveName(hPopMaskMenu,m,9001); AddSaveName(hPopTextMenu,s,9002); } /***************************************************************************/ static void DeleteSaveName(HMENU h,int n) { DeleteMenu(h, n, MF_BYCOMMAND); DeleteMenu(h, n+10, MF_BYCOMMAND); } /***************************************************************************/ static void DeleteMenus(void) { DeleteSaveName(hPopMenu, 9000); DeleteSaveName(hPopMaskMenu, 9001); DeleteSaveName(hPopTextMenu, 9002); } /***************************************************************************/ static void SaveEditHistory(HWND hDlg) { LRESULT i; if ( GetDlgItemText(hDlg, IDC_EDIT, N_S(str)) == 0 || str[0] == 0 ) return; // SendDlgItemMessage(hWndOpen,IDC_EDIT,CB_SETEDITSEL,0,0); i = SendDlgItemMessage(hDlg,IDC_EDIT,CB_FINDSTRING,0, (LPARAM)(LPCSTR)str); if ( i == 0 ) return; /* Alkuun ei lisätä */ if ( i != CB_ERR ) SendDlgItemMessage(hDlg,IDC_EDIT,CB_DELETESTRING,(WPARAM)i,0); i = SendDlgItemMessage(hDlg,IDC_EDIT,CB_GETCOUNT,0,0); if ( i >= HISTORYS ) SendDlgItemMessage(hDlg,IDC_EDIT,CB_DELETESTRING,(WPARAM)i-1,0); SendDlgItemMessage(hDlg,IDC_EDIT,CB_INSERTSTRING,0, (LPARAM)(LPCSTR)str); SendDlgItemMessage(hDlg,IDC_EDIT,CB_SETCURSEL,0,0); } /***************************************************************************/ static int DoRunEdit(HWND hDlg) { GetDlgItemText(hDlg, IDC_EDIT, N_S(str)); SaveEditHistory(hDlg); if ( str[strlen(str)-1] == '\'' ) str[strlen(str)-1]=0; return WCD_RunOrAssocRun(str,WTITLE); } /***************************************************************************/ static int DoRunLastFocus(HWND hDlg, int LastFocus) { char ohjelma[13]=""; if ( LastFocus == IDC_EDIT ) return DoRunEdit(hDlg); if ( !GetListBoxText(hDlg,IDC_FILELIST,N_S(ohjelma),1) ) { MessageBeep(0); return 0; } return WCD_RunOrAssocRun(ohjelma,WTITLE); } #define MAX_ITEMS 20 /***************************************************************************/ static int GetNextLBItem(HWND hWnd,char *s,int size,int id,int i) { static int items[MAX_ITEMS]; static LRESULT lkm=-1; LRESULT n; if ( i == 0 ) lkm = SendDlgItemMessage(hWnd,id,LB_GETSELITEMS,MAX_ITEMS, (LPARAM)(int FAR*)items); if ( lkm < 0 || i < 0 || lkm <= i ) return 1; n=SendDlgItemMessage(hWnd,id,LB_GETTEXTLEN,items[i],0); if ( n >= size ) { *s=0; return 0; } SendDlgItemMessage(hWnd,id,LB_GETTEXT,items[i],(LPARAM)(LPCSTR)(s)); return 0; } /**************************************************************************** FUNKTIO: DeleteFileOrDir(HWND); TARKOITUS: Tuhotaan joko valittu hakemisto tai tiedosto ****************************************************************************/ static void DeleteFileOrDir(HWND hDlg) { char sf[20],sd[20]; int is_file,is_dir,l; int dir_sel,file_sel; int msg; dir_sel = (int)SendDlgItemMessage(hDlg, IDC_DIRLIST,LB_GETCURSEL,0,0); file_sel= (int)SendDlgItemMessage(hDlg,IDC_FILELIST,LB_GETSELCOUNT,0,0); is_file = ( file_sel > 0 ); is_dir = ( dir_sel >= 0); if ( is_dir ) GetDlgItemText(hDlg, IDC_EDIT, N_S(sd)); if ( is_file && is_dir ) { /* Ei pitäsi olla mahdollista! */ WCD_MessageBox(hDlg,T("Valittu hakemisto ja tiedosto"), T("Valitse uudelleen"),MB_OK|MB_ICONEXCLAMATION); goto paivita; } if ( !is_file && !is_dir ) { WCD_MessageBox(hDlg,T("Mitään ei valittuna"), T("Valitse uudelleen"),MB_OK|MB_ICONEXCLAMATION); return; } if ( is_file ) { OFSTRUCT of; int i; for (i=0; !GetNextLBItem(hDlg,N_S(sf),IDC_FILELIST,i); i++) { msg = WCD_MessageBox(hDlg,sf,T("Tuhotaanko tiedosto"), MB_YESNOCANCEL|MB_ICONQUESTION); if ( msg == IDCANCEL ) goto paivita; if ( msg == IDNO ) continue; if ( OpenFile(sf,&of,OF_DELETE) == HFILE_ERROR ) { WCD_MessageBox(hDlg,sf, T("Tiedostoa ei voi tuhota"),MB_OK|MB_ICONEXCLAMATION); continue; } } goto paivita; } if ( is_dir ) { /* Hakmeiston poisto */ l = strlen(sd); if ( sd[l-1]=='\\' ) sd[l-1]=0; l = strlen(sd); if ( strchr(":.",sd[l-1]) ) return; if ( IDYES != WCD_MessageBox(hDlg,sd,T("Poistetaanko hakemisto"), MB_YESNOCANCEL|MB_ICONQUESTION) ) return; if ( rmdir(sd) ) { WCD_MessageBox(hDlg,sd, T("Hakemistoa ei voi poistaa"),MB_OK|MB_ICONEXCLAMATION); return; } goto paivita; } paivita: SendMessage(hDlg,WM_COMMAND,UPDATE_LISTS,0); SendDlgItemMessage(hDlg, IDC_DIRLIST,LB_SETCURSEL,dir_sel,0); SendDlgItemMessage(hDlg, IDC_FILELIST,LB_SETCURSEL,file_sel,0); return; } /***************************************************************************/ static void CopyList(HWND hDlg,int IDT,int IDF) { int i=0; long n; char ls[40]; while (1) { n = SendDlgItemMessage(hDlg, IDF, LB_GETTEXT,(WPARAM)i, (LPARAM)(LPSTR)ls); if ( n <= 0 ) return; SendDlgItemMessage(hDlg, IDT, LB_ADDSTRING,(WPARAM)i, (LPARAM)(LPSTR)ls); i++; } } static char MaskText[100]="*.*"; /***************************************************************************/ static const char *maski(HWND hDlg) { GetDlgItemText(hDlg,IDC_DIRMASK,N_S(MaskText)); return MaskText; } /***************************************************************************/ static char Gdrive[MAXDRIVE]; static char Gdir[MAXDIR]; static char Gfile[MAXFILE]; static char Gext[MAXEXT]; /***************************************************************************/ static int IsMask(char *s) { int flags; flags=fnsplit(s,Gdrive,Gdir,Gfile,Gext); if ( (flags & FILENAME) || (flags & EXTENSION) ) return 1; return 0; } /***************************************************************************/ static char *AddS(char *s) /* Jollei ole * tai ? jonossa, liitetään sellainen loppuun! */ { if ( !strpbrk(s,"*?") ) strcat(s,"*"); return s; } /**************************************************************************** FUNKTIO: UpdateListBox(HWND); TARKOITUS: Päivitetään OpenDlg:n hakemistolista ****************************************************************************/ #define DIR_DRIVES (DDL_DIRECTORY | DDL_DRIVES | DDL_EXCLUSIVE) #define FILES 0 static void UpdateListBox(HWND hDlg,const char *Path,int DoNCD) { int CorrectDir = 0; char str[100],mask[100],*m; const char *p; char DefPath[100]; int i; int ncd = 0; kopioi_jono(N_S(mask),maski(hDlg)); m = strtok(mask,";"); kopioi_jono(N_S(DefPath),Path); kopioi_jono(N_S(str), DefPath); if ( DoNCD > 0 ) goto NowDoNCD; uusi: if ( !IsMask(str) || strstr(str,"..")==str || !strpbrk(str,"*?.;") ) { /* Jollei maskia ole, lisätään maski */ if ( str[0] && !strpbrk(":\\",str+strlen(str)-1) ) liita_jono(N_S(str),"\\"); liita_jono(N_S(str),m); } if ( strchr(str,';') ) strtok(str,";"); if ( WCD_ChDrive(str) ) return; i = DlgDirList(hDlg, AddS(str), IDC_DIRLIST, IDC_PATH, DIR_DRIVES ); if ( i == 0 && ncd == 0 && DoNCD >= 0) { /* Yritetään kerran ncd jos muu ei onnistunut */ NowDoNCD: kopioi_jono(N_S(str),FindFirstDir(WCD_GetCurrent(),DefPath)); ncd = 1; p = FindNextDir(); if ( !*p ) DefPath[0] = 0; goto uusi; } /* To ensure that the listing is made for a subdir. of * current drive dir... */ if (!strchr (DefPath, ':')){ DlgDirList(hDlg, "", IDC_DIRLIST, IDC_PATH, DIR_DRIVES); } // i = DlgDirList(hDlg, AddS(str), IDC_FILELIST, IDC_PATH, FILES); // (void)i++; while ( ( m = strtok(NULL,";") ) != NULL ) { kopioi_jono(N_S(str),m); DlgDirList(hDlg, AddS(str), IDC_DIRLIST, IDC_PATH, FILES); CopyList(hDlg,IDC_FILELIST,IDC_DIRLIST); CorrectDir = 1; } if ( CorrectDir ) DlgDirList(hDlg, "", IDC_DIRLIST, IDC_PATH, DIR_DRIVES); // GetDlgItemText(hDlg,IDC_PATH,current,sizeof(current)); // WCD_UpdateCurrentDir(); #if 0 /* Remove the '..' character from path if it exists, since this * will make DlgDirList move us up an additional level in the tree * when UpdateListBox() is called again. */ if (strstr (DefPath, "..")) DefPath[0] = '\0'; #endif if ( !ncd ) DefPath[0]=0; SetDlgItemText(hDlg, IDC_EDIT, DefPath); #ifdef EDITEDIT SendDlgItemMessage(hDlg,IDC_EDIT,EM_SETSEL,NULL,MAKELONG(0, 0x7fff)); #else SendDlgItemMessage(hDlg,IDC_EDIT,CB_SETEDITSEL,NULL,MAKELONG(0, 0x7fff)); #endif WCD_CurrentDir(); SetWindowText(hDlg,WTITLE); } /**************************************************************************** FUNKTIO: About(HWND, unsigned, WORD, LONG) TARKOITUS: Hoitelee Tietoja-laatikon viestit MESSAGES: WM_INITDIALOG - alustetaan dialog box WM_COMMAND - syöte vastaanotettu ****************************************************************************/ BOOL CALLBACK _export About(HWND hDlg,unsigned message,WPARAM wParam,LPARAM lParam) { #pragma argsused switch (message) { case WM_INITDIALOG: TranslateDialog(hDlg,0); SetDlgItemText(hDlg,ID_A_VERSION,VERSIO); return TRUE; case WM_COMMAND: if (wParam == IDOK || wParam == IDCANCEL) { EndDialog(hDlg, TRUE); return TRUE; } break; } return FALSE; } /**************************************************************************** FUNKTIO: NewDir(HWND, unsigned, WORD, LONG) TARKOITUS: Hoitelee Uusi hakemisto-laatikon viestit MESSAGES: WM_INITDIALOG - alustetaan dialog box WM_COMMAND - syöte vastaanotettu ****************************************************************************/ BOOL CALLBACK _export NewDir(HWND hDlg,unsigned message,WPARAM wParam,LPARAM lParam) { #pragma argsused static char newdir[12]=""; int result = 0; switch (message) { case WM_INITDIALOG: TranslateDialog(hDlg,0); SetFocus(GetDlgItem(hDlg,IDE_NEWDIR)); SetDlgItemText(hDlg,IDE_NEWDIR,newdir); return (TRUE); case WM_COMMAND: switch (wParam) { case IDOK: GetDlgItemText(hDlg,IDE_NEWDIR,newdir,sizeof(newdir)); if ( newdir[0] ) { if ( mkdir(newdir) ) WCD_MessageBox(hDlg,newdir,T("Hakemistoa ei voida luoda"), MB_OK|MB_ICONEXCLAMATION); else result = 1; } case IDCANCEL: EndDialog(hDlg, result); return (TRUE); } break; } return (FALSE); } /***************************************************************************/ static const char *MenuStr(HWND hDlg,int n) { if ( n < 0 ) { if ( strcmp(maski(hDlg),OLETUSMASKI) ) sprintf(str,"%s (%s)",WCD_GetCurrent(),maski(hDlg)); else kopioi_jono(N_S(str),WCD_GetCurrent()); return str; } if ( strcmp(vanhat[n].maski,OLETUSMASKI) ) sprintf(str,"%s (%s)",vanhat[n].vanha,vanhat[n].maski); else kopioi_jono(N_S(str),vanhat[n].vanha); return str; } /***************************************************************************/ static char *MaskMenuStr(int n) { sprintf(str,"^&%d %s",n+1,maskit[n].maski); return str; } /***************************************************************************/ static char *TextMenuStr(int n) { sprintf(str,"^&%c %s",n+'A',tekstit[n].teksti); return str; } /**************************************************************************** FUNKTIO: InitMenu TARKOITUS: Alustaa dialog boxin valikon ****************************************************************************/ static void InitMenu(HWND hDlg) { int i; HMENU hMenu; char oletus[4],nimi[15],*s; for(i=0;i= 0, muuten -1 ****************************************************************************/ static int OnkoMenussa(const char *mj) { int i; for(i=0;i= 0, muuten -1 ****************************************************************************/ static int OnkoMaskeissa(const char *mj) { int i; for(i=0;i= 0, muuten -1 ****************************************************************************/ static int OnkoTeksteissa(const char *mj) { int i; for(i=0;i= 0 ) { if ( strcmp(ms,vanhat[i].maski) ) { kopioi_jono(N_S(vanhat[i].maski),ms); ModifyMenu(hPopMenu,i,MF_BYPOSITION|MF_STRING|MF_ENABLED, FIRST_OLD+i, MenuStr(hDlg,i)); TallennaVanhat(); } return i; } return -1; } #endif /***************************************************************************/ static int do_change(HWND hDlg,const char *DefPath,int ncd) /* DefPath pitää sisältää se nimi, johon vaihdetaan */ { UpdateListBox(hDlg,DefPath,ncd); if ( writecurdir(hDlg) == NULL ) WCD_MessageBox(hDlg, T("Tallennus epäonnistui!"),WTITLE, MB_OK | MB_ICONHAND); return 0; } /***************************************************************************/ static int DoChangeByNCD(HWND hDlg,const char *OpenName,int ncd) /* Tekee listan vaihtamisen jos OpenNamen mukaan. */ { do_change(hDlg,OpenName,ncd); return 0; } /***************************************************************************/ static int DoUpdateListNON(HWND hDlg) /* Tekee listan vaihtamisen ilman OpenName:en apua */ { return DoChangeByNCD(hDlg,"",0); } /***************************************************************************/ static int DoUpdateListOrRun(HWND hDlg,const char *OpenName) /* Tekee listan vaihtamisen jos OpenNamessa ei ole välilyöntiä. ** Jos on, niin ajaa OpenNamessa olevan komennon */ { if ( strchr(OpenName,' ') || OpenName[strlen(OpenName)-1]=='\'') return DoRunEdit(hDlg); return DoChangeByNCD(hDlg,OpenName,0); } /***************************************************************************/ static int DoChangeOrRun(HWND hDlg) /* Tekee listan vaihtamisen EDIT-ikkunan mukaisesti. */ { char OpenName[80]; GetDlgItemText(hDlg, IDC_EDIT, N_S(OpenName)); return DoUpdateListOrRun(hDlg,OpenName); } /***************************************************************************/ static int DoChangeNCD(HWND hDlg) /* Tekee listan vaihtamisen EDIT-ikkunan mukaisesti. */ /* Pakottaa NCD-vaihtoon */ { char OpenName[80]; GetDlgItemText(hDlg, IDC_EDIT, N_S(OpenName)); return DoChangeByNCD(hDlg,OpenName,1); } /***************************************************************************/ static int DoChange(HWND hDlg) /* Tekee listan vaihtamisen EDIT-ikkunan mukaisesti. */ /* Pakottaa tavalliseen vaihtoon */ { char OpenName[80]; GetDlgItemText(hDlg, IDC_EDIT, N_S(OpenName)); return DoChangeByNCD(hDlg,OpenName,-1); } /***************************************************************************/ static BOOL DoClose(HWND hDlg) /* Sulkemisen toimenpiteet */ { DragAcceptFiles(hDlg,FALSE); SavePos(hDlg); SaveLanguageAndFree(WINCDINI,NULL,NULL); InitDragAndDrop(WINCDINI,1); WinHelp(hDlg,WCD_CatWincdDir(T("WINCD.HLP")),HELP_QUIT,0); PostQuitMessage(0); return TRUE; } /***************************************************************************/ static int DropIDC_FILELIST(HWND hDlg) { getcwd(N_S(str)); DropListBoxFiles(hDlg,IDC_FILELIST,str); return 0; } /***************************************************************************/ int DropIDC_DIRLIST(HWND hDlg) { char s[50],cur[80],disk; int i,l; HWND lhWnd = GetDlgItem(hDlg,IDC_DIRLIST); i = ListBox_GetCurSel(lhWnd); l = ListBox_GetText(lhWnd,i,s); if ( l == 0 ) return 1; if ( s[l-1] == ']' ) s[l-1] = 0; if ( s[0] == '[' ) poista_alusta(s,1); getcwd(N_S(str)); if ( s[0] == '-' ) { /* Jos levyaseman nimi -a- */ // struct dfree free; // struct diskfree_t free; disk = (char)(s[1]-'a'+1); // if (_dos_getdiskfree(0, &free) != 0) return 1; // getdfree(disk,&free); // if ( free.df_sclus == (unsigned)-1 ) return 1; cur[0] = 0; getcurdir(disk,cur); str[0] = s[1]; str[1] = ':'; str[2] = '\\'; str[3] = 0; liita_jono(N_S(str),cur); } /* Jos levyaseman nimi -a- */ else { i = strlen(str); if ( i > 0 && str[i-1] != '\\' ) liita_jono(N_S(str),"\\"); liita_jono(N_S(str),s); } jono_pieneksi(str); DoDropText(hDlg,str); return 0; } /**************************************************************************** FUNKTIO: OpenDlg(HWND, unsigned, WORD, LONG) TARKOITUS: Käsittelee Dialog Boxin viestit Viestit: WM_COMMAND: FIRST_OLD - FIRST_OLD+VANHOJA+1: Valikosta valittu vanha hakemisto IDC_ABOUT: Painettu Tietoja-nappia IDC_DIRLIST: Valittu jokin hakemisto IDOK: Painettu Vaihda-nappia IDCANCEL: Painettu Lopeta-nappia WM_INITDIALOG: Dialog Box luodaan ****************************************************************************/ #define STOPSAVING() { \ SetWindowText(hDlg,WTITLE); \ DeleteMenus(); \ SavingOld = 0; \ } #if 0 BOOL CALLBACK _export OpenDlg(HWND hDlg,unsigned message,WPARAM wParam,LPARAM lParam) { switch (message) { case WM_DESTROY: case WM_CLOSE: PostQuitMessage(0); } return FALSE; } #else BOOL CALLBACK _export OpenDlg(HWND hDlg,unsigned message,WPARAM wParam,LPARAM lParam) { #pragma argsused RECT wndrect; // HCURSOR tiimalasi, nuoli; char *s; int i; static char OpenName[80]; static char LastOpenName[80]=""; static SavingOld = 0; static LastFocus = 0; static LastPos = 0; switch (message) { #if 1 // case WM_RBUTTONDOWN: case WM_DESTROYCLIPBOARD: IndicateOnClipboard(hDlg,0); return TRUE; case WM_LBUTTONDOWN: if ( CheckIfInsideCurrent(hDlg) ) break; DropIDC_FILELIST(hDlg); break; case WM_BEGINDRAG: { if ( GetDlgCtrlID(GET_WM_COMMAND_HWND(wParam,lParam)) == IDC_DIRLIST ) DropIDC_DIRLIST(hDlg); else DropIDC_FILELIST(hDlg); break; } case WM_DROPFILES: DragQueryFile((HDROP)wParam,0,N_S(str)); do_change(hDlg,str,0); if ( DragQueryFile((HDROP)wParam,-1,N_S(str)) == 1 && strchr(str,'.') == NULL ) { DragFinish((HDROP)wParam); /* Muistilohkon vapautus! */ return TRUE; /* Jos pudotettu vain pelkkä hakemiston nimi */ } DropFilesToListBox((HDROP)wParam,hDlg,IDC_FILELIST,3); return TRUE; case WM_COMMAND: if (wParam>=FIRST_OLD && wParam <=FIRST_OLD + VANHOJA-1) { /* Vanha val */ if ( SavingOld ) { UpdateMenu(hDlg,WCD_GetCurrent(),wParam-FIRST_OLD); STOPSAVING(); return TRUE; } kopioi_jono(N_S(OpenName),&vanhat[wParam-FIRST_OLD].vanha[3]); s = vanhat[wParam-FIRST_OLD].maski; if ( s[0] && strcmp(s,OLETUSMASKI) ) SetDlgItemText(hDlg,IDC_DIRMASK,s); return DoUpdateListOrRun(hDlg,OpenName) == 0; } else if (wParam>=FIRST_MASK && wParam <=FIRST_MASK + MASKEJA-1) { /* Vanha maski */ if ( SavingOld ) { UpdateMask(hDlg,wParam-FIRST_MASK); STOPSAVING(); return (TRUE); } s = maskit[wParam-FIRST_MASK].maski; if ( !s[0] ) return TRUE; if ( LastFocus == IDC_EDIT ) { SetDlgItemText(hDlg,IDC_EDIT,s); return DoChangeOrRun(hDlg); } SetDlgItemText(hDlg,IDC_DIRMASK,s); return DoUpdateListNON(hDlg); } else if (wParam>=FIRST_TEXT && wParam <=FIRST_TEXT + TEKSTEJA-1){ /* Vanha teksti */ if ( SavingOld ) { UpdateText(wParam-FIRST_TEXT,OpenName); STOPSAVING(); return (TRUE); } s = tekstit[wParam-FIRST_TEXT].teksti; if ( s[0] ) SetDlgItemText(hDlg,IDC_EDIT,s); if ( s[strlen(s)-1] == '\'' ) return DoRunEdit(hDlg) == 0; if ( strchr(s,' ') ) return TRUE; return DoChangeOrRun(hDlg) == 0; } else { /* Muut WM_COMMAND kuin Vanhat tai Maskit */ if ( SavingOld ) STOPSAVING(); switch (wParam) { case IDC_DELETE: DeleteFileOrDir(hDlg); return TRUE; case IDC_CURTOCLP: CurDirToClipboard(hDlg); return TRUE; case IDC_ABOUT: DoModalDialog(hDlg, "AboutBox", About); return TRUE; case IDC_HELP_INDEX: return WinHelp(hDlg,WCD_CatWincdDir(T("WINCD.HLP")),HELP_INDEX,0); case IDC_HELP_KBD: case IDC_HELP_COMMANDS: case IDC_HELP_USAGE: return WinHelp(hDlg,WCD_CatWincdDir(T("WINCD.HLP")),HELP_KEY, (DWORD)(LPSTR)T("kaytto")); case IDC_NEWDIR: if ( DoModalDialog(hDlg, "NewDirDlg",NewDir) ) SendMessage(hDlg,WM_COMMAND,UPDATE_LISTS,0); return TRUE; case IDC_RUN: return DoRunLastFocus(hDlg,LastFocus); case IDC_DIRLIST: switch (HIWORD(lParam)) { case LBN_SELCHANGE: DlgDirSelectEx(hDlg, str, sizeof(str),IDC_DIRLIST); SetDlgItemText(hDlg, IDC_EDIT, str); SendDlgItemMessage(hDlg,IDC_EDIT,EM_SETSEL,NULL,MAKELONG(0, 0x7fff)); return TRUE; case LBN_DBLCLK: return DoChange(hDlg); case LBN_SETFOCUS: LastFocus=wParam; Unselect(hDlg,wParam); return TRUE; } break; case IDC_FILELIST: switch (HIWORD(lParam)) { case LBN_DBLCLK: return DoRunLastFocus(hDlg,LastFocus); case LBN_SETFOCUS: LastFocus=wParam; Unselect(hDlg,wParam); return TRUE; } break; // case WM_MENUSELECT: case IDC_EDIT: switch (HIWORD(lParam)) { case EN_KILLFOCUS: case CBN_KILLFOCUS: LastFocus=wParam; LastPos = LOWORD(SendDlgItemMessage(hDlg,IDC_EDIT,EM_GETSEL,0,0)); return TRUE; case EN_SETFOCUS: case CBN_SETFOCUS: if ( LastFocus == wParam ) { SendDlgItemMessage(hDlg,IDC_EDIT,CB_SETEDITSEL,NULL,MAKELONG(LastPos, LastPos)); } LastFocus=wParam; Unselect(hDlg,wParam); return TRUE; } break; case IDC_DIRMASK: switch (HIWORD(lParam)) { case EN_SETFOCUS: LastFocus=wParam; Unselect(hDlg,wParam); // SendDlgItemMessage(hDlg,IDC_DIRMASK,EM_SETSEL,0,MAKELPARAM(0,-1)); return TRUE; } break; case IDC_SAVE: // if ( OnkoMaski(current) >= 0 ) return TRUE; GetDlgItemText(hDlg, IDC_EDIT, N_S(OpenName)); if ( !OpenName[0] ) kopioi_jono(N_S(OpenName),LastOpenName); SavingOld = 1; SetWindowText(hDlg,T("Valitse mihin kohti talletetaan:")); InsertMenus(MenuStr(hDlg,-1),maski(hDlg),OpenName); if ( LastFocus == IDC_DIRMASK ) { int m = OnkoMaskeissa(maski(hDlg)); if ( m < 0 ) m = OnkoMaskeissa(""); if ( m < 0 ) m = MASKEJA-1; for (i=0; i 8 ) { key = VK_UP; m = TEKSTEJA - m + 1; } for (i=0; i2)strcpy(dir,_argv[2]); else */ // return 0; return WCD_RunOrAssocRun(lpCmdLine,WTITLE); }