Files
Work/common/OPENDLG.CPP
2024-08-07 09:09:36 -04:00

459 lines
12 KiB
C++

#include <common/opendlg.hpp>
#include <common/guiwnd.hpp>
#include <common/StringBuffer.hpp>
OpenDialog::OpenDialog(void)
{
setZero();
setLength();
}
OpenDialog::OpenDialog(const OpenDialog &someOpenDialog)
{
setLength();
*this=someOpenDialog;
}
OpenDialog::~OpenDialog()
{
}
OpenDialog &OpenDialog::operator=(const OpenDialog &someOpenDialog)
{
owner(someOpenDialog.owner());
instance(someOpenDialog.instance());
filter(someOpenDialog.filter());
filterPattern(someOpenDialog.filterPattern());
customFilter(someOpenDialog.customFilter());
filterIndex(someOpenDialog.filterIndex());
fileName(someOpenDialog.fileName());
fileTitle(someOpenDialog.fileTitle());
initialDirectory(someOpenDialog.initialDirectory());
title(someOpenDialog.title());
creationFlags(someOpenDialog.creationFlags());
defaultExtension(someOpenDialog.defaultExtension());
return *this;
}
BOOL OpenDialog::operator==(const OpenDialog &someOpenDialog)const
{
return (owner()==someOpenDialog.owner()&&
instance()==someOpenDialog.instance()&&
filter()==someOpenDialog.filter()&&
filterPattern()==someOpenDialog.filterPattern()&&
customFilter()==someOpenDialog.customFilter()&&
filterIndex()==someOpenDialog.filterIndex()&&
fileName()==someOpenDialog.fileName()&&
fileTitle()==someOpenDialog.fileTitle()&&
initialDirectory()==someOpenDialog.initialDirectory()&&
title()==someOpenDialog.title()&&
creationFlags()==someOpenDialog.creationFlags()&&
defaultExtension()==someOpenDialog.defaultExtension());
}
HWND OpenDialog::owner(void)const
{
return OPENFILENAME::hwndOwner;
}
void OpenDialog::owner(HWND hwndOwner)
{
OPENFILENAME::hwndOwner=hwndOwner;
}
HINSTANCE OpenDialog::instance(void)const
{
return OPENFILENAME::hInstance;
}
void OpenDialog::instance(HINSTANCE hInstance)
{
OPENFILENAME::hInstance=hInstance;
}
const String &OpenDialog::filter(void)const
{
return mFilter;
}
void OpenDialog::filter(const String &filter)
{
mFilter=filter;
}
const String &OpenDialog::filterPattern(void)const
{
return mFilterPattern;
}
void OpenDialog::filterPattern(const String &filterPattern)
{
mFilterPattern=filterPattern;
}
const String &OpenDialog::customFilter(void)const
{
return mCustomFilter;
}
void OpenDialog::customFilter(const String &customFilter)
{
mCustomFilter=customFilter;
}
DWORD OpenDialog::filterIndex(void)const
{
return OPENFILENAME::nFilterIndex;
}
void OpenDialog::filterIndex(DWORD filterIndex)
{
OPENFILENAME::nFilterIndex=filterIndex;
}
const String &OpenDialog::fileName(void)const
{
return mFileName;
}
void OpenDialog::fileName(const String &fileName)
{
mFileName=fileName;
}
const String &OpenDialog::fileTitle(void)const
{
return mFileTitle;
}
void OpenDialog::fileTitle(const String &fileTitle)
{
mFileTitle=fileTitle;
}
const String &OpenDialog::initialDirectory(void)const
{
return mInitialDirectory;
}
void OpenDialog::initialDirectory(const String &initialDirectory)
{
mInitialDirectory=initialDirectory;
}
const String &OpenDialog::title(void)const
{
return mTitle;
}
void OpenDialog::title(const String &title)
{
mTitle=title;
}
DWORD OpenDialog::creationFlags(void)const
{
return OPENFILENAME::Flags;
}
void OpenDialog::creationFlags(DWORD creationFlags)
{
OPENFILENAME::Flags=creationFlags;
}
const String &OpenDialog::defaultExtension(void)const
{
return mDefaultExtension;
}
void OpenDialog::defaultExtension(const String &defaultExtension)
{
mDefaultExtension=defaultExtension;
}
const String &OpenDialog::templateName(void)const
{
return mTemplateName;
}
void OpenDialog::templateName(const String &templateName)
{
if(templateName.isNull())return;
mTemplateName=templateName;
OPENFILENAME::lpTemplateName=(char*)mTemplateName;
}
LPOFNHOOKPROC OpenDialog::hookProc(void)const
{
return OPENFILENAME::lpfnHook;
}
void OpenDialog::hookProc(LPOFNHOOKPROC pHookProc)
{
OPENFILENAME::lpfnHook=pHookProc;
}
DWORD OpenDialog::customData(void)const
{
return OPENFILENAME::lCustData;
}
void OpenDialog::customData(DWORD customData)
{
OPENFILENAME::lCustData=customData;
}
void OpenDialog::setZero(void)
{
::memset(&((OPENFILENAME&)*this),0,sizeof(OPENFILENAME));
}
void OpenDialog::setLength(void)
{
OPENFILENAME::lStructSize=sizeof(OPENFILENAME);
}
BOOL OpenDialog::getSaveFileName(GUIWindow &parentWindow,const String &filterPatternString,const String &titleString,const String &fileTitleString,String &pathFileName)
{
owner(parentWindow);
return getSaveFileName(filterPatternString,titleString,fileTitleString,pathFileName);
}
BOOL OpenDialog::getOpenFileName(GUIWindow &parentWindow,const String &filterPatternString,const String &titleString,const String &fileTitleString,String &pathFileName)
{
owner(parentWindow);
return getOpenFileName(filterPatternString,titleString,fileTitleString,pathFileName);
}
BOOL OpenDialog::getSaveFileName(const String &filterPatternString,const String &titleString,const String &fileTitleString,String &pathFileName)
{
String filterString;
if(filterPatternString.isNull()||titleString.isNull())return FALSE;
filter(filterPatternString);
if(filterString.isNull()){filterString=fileTitleString.betweenString('.',0);filterString.insert("*.");}
filterPattern(filterString);
instance((HINSTANCE)0);
hookProc(0);
customData(0);
if(fileTitleString.isNull())fileName(filterPatternString);
else fileName(fileTitleString);
title(titleString);
fileTitle(titleString);
creationFlags(OpenDialog::EXPLORER|OpenDialog::OVERWRITEPROMPT|OpenDialog::PATHMUSTEXIST);
if(!getSaveFileName())return FALSE;
pathFileName=fileName();
return TRUE;
}
BOOL OpenDialog::getOpenFileName(const String &filterPatternString,const String &titleString,const String &fileTitleString,String &pathFileName)
{
String filterString;
if(filterPatternString.isNull()||titleString.isNull())return FALSE;
filterString=filterPatternString.betweenString('.',0);
instance((HINSTANCE)0);
hookProc(0);
customData(0);
filter(filterString);
filterPattern(filterPatternString);
if(fileTitleString.isNull())fileName(filterPatternString);
else fileName(fileTitleString);
title(titleString);
fileTitle(titleString);
creationFlags(creationFlags()|OpenDialog::EXPLORER|OpenDialog::PATHMUSTEXIST|OpenDialog::FILEMUSTEXIST);
if(!getOpenFileName())return FALSE;
pathFileName=fileName();
return TRUE;
}
BOOL OpenDialog::getOpenFileName(const String &filterPatternString,const String &titleString,const String &fileTitleString,Block<String> &strFileNames)
{
String filterString;
String strPath;
String strPathFileName;
char *ptrString;
strFileNames.remove();
if(filterPatternString.isNull()||titleString.isNull())return FALSE;
filterString=filterPatternString.betweenString('.',0);
instance((HINSTANCE)0);
hookProc(0);
customData(0);
filter(filterString);
filterPattern(filterPatternString);
if(fileTitleString.isNull())fileName(filterPatternString);
else fileName(fileTitleString);
title(titleString);
fileTitle(titleString);
creationFlags(OpenDialog::ALLOWMULTISELECT|OpenDialog::EXPLORER|OpenDialog::PATHMUSTEXIST);
mFileNameBuffer.reserve(MaxMultiSelect);
if(!getOpenFileName())return FALSE;
ptrString=mFileNameBuffer;
if(!ptrString)return FALSE;
strPath=ptrString;
if(strPath.strstr(".")){strFileNames.insert(&strPath);return TRUE;}
while(TRUE)
{
while(*ptrString)ptrString++;
if(!*(++ptrString))break;
strPathFileName=strPath+String("\\");
strPathFileName+=ptrString;
strFileNames.insert(&strPathFileName);
}
return (strFileNames.size()?TRUE:FALSE);
}
BOOL OpenDialog::getOpenFileName(void)
{
String filterPattern;
WORD returnCode;
mFileNameBuffer.reserve(MaxLength);
mFileTitleBuffer.reserve(MaxTitle);
if(mFilter.isNull()||mFilterPattern.isNull())OPENFILENAME::lpstrFilter=0;
else
{
long lengthFilter(mFilter.length());
long lengthPattern(mFilterPattern.length());
filterPattern.reserve(lengthFilter+lengthPattern+3);
::memcpy((LPSTR)filterPattern,(LPSTR)mFilter,lengthFilter);
((LPSTR)filterPattern)[lengthFilter]=0;
::memcpy(((LPSTR)filterPattern)+lengthFilter+1,(LPSTR)mFilterPattern,lengthPattern);
((LPSTR)filterPattern)[lengthFilter+lengthPattern+1]=0;
((LPSTR)filterPattern)[lengthFilter+lengthPattern+2]=0;
OPENFILENAME::lpstrFilter=(LPSTR)filterPattern;
}
OPENFILENAME::lpstrCustomFilter=0;
OPENFILENAME::nMaxCustFilter=0;
if(OPENFILENAME::lpstrFilter)OPENFILENAME::nFilterIndex=1;
else OPENFILENAME::nFilterIndex=0;
::memcpy((LPSTR)mFileNameBuffer,(LPSTR)mFileName,mFileName.length());
OPENFILENAME::lpstrFile=(LPSTR)mFileNameBuffer;
OPENFILENAME::nMaxFile=mFileNameBuffer.lengthBytes();
::memcpy((LPSTR)mFileTitleBuffer,(LPSTR)mFileTitle,mFileTitle.length());
OPENFILENAME::lpstrFileTitle=(LPSTR)mFileTitleBuffer;
OPENFILENAME::nMaxFileTitle=mFileTitleBuffer.lengthBytes();
if(mInitialDirectory.isNull())OPENFILENAME::lpstrInitialDir=0;
else OPENFILENAME::lpstrInitialDir=(LPSTR)mInitialDirectory;
if(mTitle.isNull())OPENFILENAME::lpstrTitle=0;
else OPENFILENAME::lpstrTitle=(LPSTR)mTitle;
OPENFILENAME::Flags=creationFlags();
if(!mFileNameBuffer.isNull())
{
int stringPos(mFileNameBuffer.strpos("."));
OPENFILENAME::nFileExtension=stringPos-1;
char *lpStr=(LPSTR)mFileNameBuffer;
while(lpStr[stringPos]!='\\'&&lpStr[stringPos]!='/'&&lpStr[stringPos]!=':'&&stringPos>=0)stringPos--;
OPENFILENAME::nFileOffset=stringPos+1;
}
if(!mDefaultExtension.isNull())OPENFILENAME::lpstrDefExt=(LPSTR)mDefaultExtension;
else OPENFILENAME::lpstrDefExt=0;
returnCode=::GetOpenFileName(&((OPENFILENAME&)*this));
if(returnCode)
{
parseFileNames(mFileNameBuffer,mFileNames);
if(mFileNames.size())mFileName=mFileNames[0];
mFileTitle=mFileTitleBuffer;
}
return returnCode;
}
BOOL OpenDialog::getSaveFileName(void)
{
String filterPattern;
String fileName;
String fileTitle;
WORD returnCode;
fileName.reserve(MaxSaveLength);
fileTitle.reserve(MaxTitle);
if(mFilter.isNull()||mFilterPattern.isNull())OPENFILENAME::lpstrFilter=0;
else
{
long lengthFilter(mFilter.length());
long lengthPattern(mFilterPattern.length());
filterPattern.reserve(lengthFilter+lengthPattern+3);
::memcpy((LPSTR)filterPattern,(LPSTR)mFilter,lengthFilter);
((LPSTR)filterPattern)[lengthFilter]=0;
::memcpy(((LPSTR)filterPattern)+lengthFilter+1,(LPSTR)mFilterPattern,lengthPattern);
((LPSTR)filterPattern)[lengthFilter+lengthPattern+1]=0;
((LPSTR)filterPattern)[lengthFilter+lengthPattern+2]=0;
OPENFILENAME::lpstrFilter=(LPSTR)filterPattern;
}
OPENFILENAME::lpstrCustomFilter=0;
OPENFILENAME::nMaxCustFilter=0;
if(OPENFILENAME::lpstrFilter)OPENFILENAME::nFilterIndex=1;
else OPENFILENAME::nFilterIndex=0;
::memcpy((LPSTR)fileName,(LPSTR)mFileName,mFileName.length());
OPENFILENAME::lpstrFile=(LPSTR)fileName;
OPENFILENAME::nMaxFile=MaxSaveLength;
::memcpy((LPSTR)fileTitle,(LPSTR)mFileTitle,mFileTitle.length());
OPENFILENAME::lpstrFileTitle=(LPSTR)fileTitle;
OPENFILENAME::nMaxFileTitle=MaxTitle;
if(mInitialDirectory.isNull())OPENFILENAME::lpstrInitialDir=0;
else OPENFILENAME::lpstrInitialDir=(LPSTR)mInitialDirectory;
if(mTitle.isNull())OPENFILENAME::lpstrTitle=0;
else OPENFILENAME::lpstrTitle=(LPSTR)mTitle;
OPENFILENAME::Flags=creationFlags();
if(!fileName.isNull())
{
int stringPos(fileName.strpos("."));
OPENFILENAME::nFileExtension=stringPos-1;
char *lpStr=(LPSTR)fileName;
while(lpStr[stringPos]!='\\'&&lpStr[stringPos]!='/'&&lpStr[stringPos]!=':'&&stringPos>=0)stringPos--;
OPENFILENAME::nFileOffset=stringPos+1;
}
if(!mDefaultExtension.isNull())OPENFILENAME::lpstrDefExt=(LPSTR)mDefaultExtension;
else OPENFILENAME::lpstrDefExt=0;
OPENFILENAME::lpfnHook=0;
returnCode=::GetSaveFileName(&((OPENFILENAME&)*this));
if(returnCode)
{
mFileName=fileName;
mFileTitle=fileTitle;
}
return returnCode;
}
void OpenDialog::parseFileNames(const String &nameBuffer,Block<String> &fileNames)
{
String directoryName;
String item;
int index;
bool isFirst;
index=0;
isFirst=true;
fileNames.remove();
if(!(creationFlags()&ALLOWMULTISELECT))
{
fileNames.insert(&nameBuffer);
return;
}
while(true)
{
item=parseLine(index,nameBuffer);
if(item.isNull())break;
if(isFirst)
{
isFirst=false;
directoryName=item;
}
else fileNames.insert(&String(directoryName+"\\"+item));
}
if(!fileNames.size())fileNames.insert(&directoryName);
}
String OpenDialog::parseLine(int &index,const String &strLine)
{
StringBuffer sb;
while(strLine[index]!=0)
{
sb.append(strLine[index]);
index++;
}
index++;
return sb.toString();
}