// ini stuff #include #pragma hdrstop #include #include #include #include #ifdef WIN16 BOOL ReadIniString(const char *Section,const char *Item,String &S,BOOL) { String Temp(256); if (GetPrivateProfileString(Section,Item,"",Temp,Temp.Size(),App::IniFile)) { S=Temp; return TRUE; } return FALSE;; } void ReadIniBool(const char *Section,const char *Item,BOOL &Bool,BOOL) { char temp[20]; if (GetPrivateProfileString(Section,Item,"",temp,20,App::IniFile)) Bool=(stricmp(temp,"Yes")==0); } void WriteIniString(const char *Section,const char *Item,char *Val,BOOL) { WritePrivateProfileString(Section,Item,Val,App::IniFile); } void WriteIniBool(const char *Section,const char *Item,BOOL Bool,BOOL) { WritePrivateProfileString(Section,Item,Bool ? "Yes":"No",App::IniFile); } void ReadIniInt(const char *Section,const char *Item,int &Int,BOOL) { Int=GetPrivateProfileInt(Section,Item,Int,App::IniFile); } void WriteIniInt(const char *Section,const char *Item,int Int,BOOL) { WritePrivateProfileString(Section,Item,String() << Int,App::IniFile); } void ReadIniInt(const char *Section,const char *Item,long &Int,BOOL) { String S(12); GetPrivateProfileString(Section,Item,"",S,S.Size(),App::IniFile); if (!S.Empty()) S >> Int; } void WriteIniInt(const char *Section,const char *Item,long Int,BOOL) { WritePrivateProfileString(Section,Item,String() << Int,App::IniFile); } #else // Win32 registry version BOOL ReadIniString(const char *Section,const char *Item,String &S,BOOL Global) { String Temp(256); DWORD Size=Temp.Size(); if (RegQueryValueEx(Global ? App::Machine : App::User,String() << (char*) Section << ':' << (char*) Item,NULL,NULL,(LPBYTE) Temp.Str,&Size)==ERROR_SUCCESS) { S=Temp; return TRUE; } return FALSE; } void WriteIniString(const char *Section,const char *Item,char *Val,BOOL Global) { HKEY Key=Global ? App::Machine : App::User; String Value; Value << (char*) Section << ':' << (char*) Item; if (Val) RegSetValueEx(Key,Value,0,REG_SZ,(LPBYTE) Val,strlen(Val)+1); else RegDeleteValue(Key,Value); } void ReadIniBool(const char *Section,const char *Item,BOOL &Bool,BOOL Global) { DWORD Size=sizeof(Bool); RegQueryValueEx(Global ? App::Machine : App::User,String() << (char*) Section << ':' << (char*) Item,NULL,NULL,(LPBYTE) &Bool,&Size); } void WriteIniBool(const char *Section,const char *Item,BOOL Bool,BOOL Global) { RegSetValueEx(Global ? App::Machine : App::User,String() << (char*) Section << ':' << (char*) Item,0,REG_DWORD,(LPBYTE) &Bool,sizeof(Bool)); } void ReadIniInt(const char *Section,const char *Item,int &Int,BOOL Global) { DWORD Size=sizeof(Int); RegQueryValueEx(Global ? App::Machine : App::User,String() << (char*) Section << ':' << (char*) Item,NULL,NULL,(LPBYTE) &Int,&Size); } void WriteIniInt(const char *Section,const char *Item,int Int,BOOL Global) { RegSetValueEx(Global ? App::Machine : App::User,String() << (char*) Section << ':' << (char*) Item,0,REG_DWORD,(LPBYTE) &Int,sizeof(Int)); } // long duplicates int but keeps 16 bit interface void ReadIniInt(const char *Section,const char *Item,long &Int,BOOL Global) { DWORD Size=sizeof(Int); RegQueryValueEx(Global ? App::Machine : App::User,String() << (char*) Section << ':' << (char*) Item,NULL,NULL,(LPBYTE) &Int,&Size); } void WriteIniInt(const char *Section,const char *Item,long Int,BOOL Global) { RegSetValueEx(Global ? App::Machine : App::User,String() << (char*) Section << ':' << (char*) Item,0,REG_DWORD,(LPBYTE) &Int,sizeof(Int)); } #endif int MruNum,BeforeID; HWND MruHw; #define MRU_BREAKLEN 40 SimpleList MruList; SimpleList MruList2; BOOL DeleteBlock(HMENU hm,int id) { int id2=id; while (DeleteMenu(hm,id2,MF_BYCOMMAND)) id2++; return id2>id; } void AddBlock(HMENU hm,SimpleList &sList,int &Pos,int &Num,int ID) { slIterator it(sList); while (it()) { // make short version of name, double up &'s String S=it.Get(); if (S.Len()>MRU_BREAKLEN) { // keep first 2 and last 2 idenifiers int n=2,i=0,j; do { i=1+S.Pos('\\',i); if (S[i]=='\\') i++; else if (--n==0) break; } while (i>0); n=2,j=S.Len(); do { j=S.rPos('\\',j); if (--n==0) break; } while (j>=0); // remove from i to j if (i>0 && j>i) { S.Remove(i,j-i); S.Insert("...",i); } } int i=0; while ((i=1+S.Pos('&',i))>0) { S.Insert('&',i++); } String T; T << '&' << Num << ' ' << S; InsertMenu(hm,Pos++,MF_BYPOSITION,ID+Num++,T); it++; } } void SetMru(HWND hw,UINT before) { BeforeID=before; MruHw=hw; HMENU hMenu=GetMenu(hw); hMenu=GetSubMenu(hMenu,0); if (hMenu==NULL) return; int Pos; BOOL Del=DeleteBlock(hMenu,MRU_ID+1); BOOL Del2=DeleteBlock(hMenu,MRU2_ID+1); // get pos of before id int n=GetMenuItemCount(hMenu); for (Pos=0;Pos1) InsertMenu(hMenu,Pos,MF_BYPOSITION | MF_SEPARATOR,0,NULL); Pos++; int Num2=Num; AddBlock(hMenu,MruList2,Pos,Num2,MRU2_ID+1-Num); if (!Del2 && Num2>Num) InsertMenu(hMenu,Pos,MF_BYPOSITION | MF_SEPARATOR,0,NULL); } void ReadMru(int Num) { MruNum=Num; String S; int i=1; while (ReadIniString("MRU",String()< &sList,char *Add) { slIterator it(sList); while (it()) { if (it.Get()==Add) { // remove it it.Remove(); break; } it++; } sList.AddHead(String(Add)); if (sList.Count()>MruNum) sList.RemoveTail(); // rebuild mru list SetMru(MruHw,BeforeID); } void AddToMru(char*Add) { AddToList(MruList,Add); } void AddToMru2(char*Add) { AddToList(MruList2,Add); } void WriteMru() { int i=1; slIterator it(MruList); while (it()) { WriteIniString("MRU",String()< it2(MruList2); while (it2()) { WriteIniString("MRU2",String()<