Files
Work/aladin/divedlg.cpp
2024-08-07 09:12:07 -04:00

541 lines
16 KiB
C++

#include <aladin/divedlg.hpp>
#include <aladin/aladinrc.hpp>
#include <aladin/aladin.hpp>
#include <aladin/serdlg.hpp>
#include <aladin/graph.hpp>
#include <aladin/appreg.hpp>
#include <aladin/splash.hpp>
#include <common/odlstalt.hpp>
#include <common/block.hpp>
#include <common/puredwrd.hpp>
#include <common/opendlg.hpp>
#include <common/puremenu.hpp>
#include <common/regkey.hpp>
#include <common/process.hpp>
#include <common/profile.hpp>
DiveDlg::DiveDlg(void)
{
mInitHandler.setCallback(this,&DiveDlg::initHandler);
mCreateHandler.setCallback(this,&DiveDlg::createHandler);
mCloseHandler.setCallback(this,&DiveDlg::closeHandler);
mDestroyHandler.setCallback(this,&DiveDlg::destroyHandler);
mCommandHandler.setCallback(this,&DiveDlg::commandHandler);
insertHandler(VectorHandler::InitDialogHandler,&mInitHandler);
insertHandler(VectorHandler::CreateHandler,&mCreateHandler);
insertHandler(VectorHandler::CloseHandler,&mCloseHandler);
insertHandler(VectorHandler::CommandHandler,&mCommandHandler);
insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
}
DiveDlg::DiveDlg(const DiveDlg &someDiveDlg)
{ // private implementation
*this=someDiveDlg;
}
DiveDlg::~DiveDlg()
{
removeHandler(VectorHandler::InitDialogHandler,&mInitHandler);
removeHandler(VectorHandler::CreateHandler,&mCreateHandler);
removeHandler(VectorHandler::CloseHandler,&mCloseHandler);
removeHandler(VectorHandler::CommandHandler,&mCommandHandler);
removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
}
DiveDlg &DiveDlg::operator=(const DiveDlg &someDiveDlg)
{
return *this;
}
bool DiveDlg::perform(void)
{
return ::DialogBoxParam(processInstance(),(LPSTR)"DIVEBOOK",(HWND)0,DWindow::DlgProc,(LPARAM)(DWindow*)this);
}
CallbackData::ReturnType DiveDlg::initHandler(CallbackData &someCallbackData)
{
String strClass;
applyHistory();
::GetClassName(*this,strClass,String::MaxString);
::SetClassLong(*this,GCL_HICON,(LONG)::LoadIcon(processInstance(),"APPICON"));
enableMenuItems(false);
mOwnerDrawGraph=new OwnerDrawGraph(*this,getItem(DB_GRAPH),DB_GRAPH);
mOwnerDrawGraph.disposition(PointerDisposition::Delete);
setCaption(String(STRING_APPNAME)+String(" ")+String(STRING_VERSION));
Block<PureDWORD> logStopArray;
Block<PureDWORD> profileStopArray;
mLogList=new OwnerDrawListAltColor(*this,getItem(DB_LOGLIST),DB_LOGLIST);
mLogList.disposition(PointerDisposition::Delete);
mProfileList=new OwnerDrawListAltColor(*this,getItem(DB_PFLIST),DB_PFLIST);
mProfileList.disposition(PointerDisposition::Delete);
logStopArray.insert(&PureDWORD(50));
logStopArray.insert(&PureDWORD(70));
logStopArray.insert(&PureDWORD(92));
logStopArray.insert(&PureDWORD(112));
logStopArray.insert(&PureDWORD(130));
mLogList->setTabStops(logStopArray);
profileStopArray.insert(&PureDWORD(5));
profileStopArray.insert(&PureDWORD(25));
profileStopArray.insert(&PureDWORD(50));
mProfileList->setTabStops(profileStopArray);
::EnableWindow(getItem(DB_NITROX),false);
::EnableWindow(getItem(DB_O2),false);
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType DiveDlg::createHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType DiveDlg::closeHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType DiveDlg::destroyHandler(CallbackData &someCallbackData)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType DiveDlg::commandHandler(CallbackData &someCallbackData)
{
switch(someCallbackData.wmCommandID())
{
case APPMENU_FILE_EXIT :
case IDCANCEL :
handleCancel();
break;
case APPMENU_FILE_OPENDEVICE :
handleFileOpenDevice();
break;
case APPMENU_FILE_OPENLOG :
handleFileOpenLog();
break;
case APPMENU_FILE_IMPORT :
handleImport();
break;
case APPMENU_FILE_SAVEWORKSHEET :
handleSaveAsWorksheet();
break;
case APPMENU_FILE_SAVERAW :
handleSaveAsRaw();
break;
case APPMENU_FILE_SAVETEXT :
handleSaveAsText();
break;
case APPMENU_FILE_SAVEGRAPH :
handleSaveGraph();
break;
case APPMENU_FILE_SAVE :
handleFileSaveLog();
break;
case APPMENU_FILE_NEW :
handleFileNew();
break;
case APPMENU_SETTINGS_SERIAL :
handleSerialSettings();
break;
case APPMENU_HELP_ABOUT :
handleHelpAbout();
break;
case APPMENU_HELP_REGISTER :
handleHelpRegister();
break;
case APPMENU_HELP_HELP :
handleHelpHelp();
break;
case APPMENU_HELP_HOME :
handleHelpHome();
break;
case APPMENU_HELP_INTERFACES :
handleHelpInterfaces();
break;
case DB_PROFILES :
if(CBN_SELCHANGE==someCallbackData.wmCommandCommand())
handleProfileChange();
break;
case DB_GRAPH :
handleGraph();
break;
}
if(someCallbackData.wParam()>=StartDynamicID)handleFileOpen(someCallbackData);
return (CallbackData::ReturnType)FALSE;
}
void DiveDlg::handleGraph()
{
GDIPoint cursorPos;
if(!mOwnerDrawGraph->hasData())return;
cursorPos.x(0);
cursorPos.y(0);
PureMenu popupMenu(PureMenu::PopupMenu);
popupMenu.insertMenu(0,PureMenu::ItemString,APPMENU_FILE_SAVEGRAPH,"&Save Bitmap...");
popupMenu.trackPopupMenu(*this,cursorPos,PureMenu::CenterAlign|PureMenu::TopAlign);
}
void DiveDlg::handleSaveGraph()
{
OpenDialog openDialog;
String strPathFileName;
String strSaveAs;
sendMessage(DB_PROFILES,WM_GETTEXT,String::MaxString,(LPARAM)(LPSTR)strSaveAs.str());
strSaveAs+=".bmp";
if(!openDialog.getSaveFileName(".bmp","Save Bitmap",strSaveAs,strPathFileName))return;
mOwnerDrawGraph->saveBitmap(strPathFileName);
}
void DiveDlg::handleCancel()
{
endDialog(false);
}
void DiveDlg::handleOk()
{
endDialog(true);
}
void DiveDlg::handleSerialSettings()
{
SerialDlg serialDlg;
serialDlg.perform(*this);
}
void DiveDlg::handleFileOpen(CallbackData &someCallbackData)
{
PureMenu pureMenu(getMenu());
PureMenu fileMenu;
String menuItemString;
pureMenu.getSubMenu(0,fileMenu);
menuItemString=fileMenu.menuItemString(someCallbackData.wParam(),PureMenu::ByCommand);
if(menuItemString.isNull())return;
menuItemString=menuItemString.betweenString(')',0);
menuItemString.trimLeft();
if(menuItemString.strstr(".log"))handleFileOpenLog(menuItemString);
else if(menuItemString.strstr(".dat"))handleFileOpenRaw(menuItemString);
else ::MessageBox(*this,"Unknown data format","Error",MB_OK);
}
void DiveDlg::handleFileOpenDevice()
{
AppReg appReg;
LRESULT result;
if(mDiveProfile.isOkay())
{
result=::MessageBox(*this,"Merge into currently loaded log?","Confirm",MB_YESNOCANCEL);
if(IDCANCEL==result)return;
if(IDNO==result)mDiveProfile.clear();
}
if(!mDiveProfile.openDevice(appReg.getPort(),*this))return;
enableMenuItems(true,IDYES==result?false:true);
setCaption(String(STRING_APPNAME)+String(" ")+String(STRING_VERSION)+String(" (Device:")+appReg.getPort()+String(")"));
setData(mDiveProfile);
}
void DiveDlg::handleImport()
{
String strPathFileName;
OpenDialog openDialog;
if(!openDialog.getOpenFileName(*this,"*.dat","Open File","*.dat",strPathFileName))return;
handleFileOpenRaw(strPathFileName);
}
void DiveDlg::handleFileOpenLog(void)
{
OpenDialog openDialog;
String strPathFileName;
if(!openDialog.getOpenFileName(*this,"*.log","Open Log","*.log",strPathFileName))return;
handleFileOpenLog(strPathFileName);
}
void DiveDlg::handleFileOpenLog(const String &strPathFileName)
{
AppReg appReg;
LRESULT result;
if(mDiveProfile.isOkay())
{
result=::MessageBox(*this,"Merge into currently loaded log?","Confirm",MB_YESNOCANCEL);
if(IDCANCEL==result)return;
if(IDNO==result)mDiveProfile.clear();
}
if(!mDiveProfile.openLog(strPathFileName))
{
::MessageBox(*this,"Not a valid log file","Error",MB_OK);
return;
}
appReg.insertHistory(strPathFileName);
setCaption(String(STRING_APPNAME)+String(" ")+String(STRING_VERSION)+String(" (")+strPathFileName+String(")"));
enableMenuItems(true,false);
setData(mDiveProfile);
}
void DiveDlg::handleFileOpenRaw(const String &strPathFileName)
{
AppReg appReg;
LRESULT result;
if(mDiveProfile.isOkay())
{
result=::MessageBox(*this,"Merge into currently loaded log?","Confirm",MB_YESNOCANCEL);
if(IDCANCEL==result)return;
if(IDNO==result)mDiveProfile.clear();
}
if(!mDiveProfile.openRaw(strPathFileName))
{
::MessageBox(*this,"File is not in Aladin data format","Error",MB_OK);
return;
}
setCaption(String(STRING_APPNAME)+String(" ")+String(STRING_VERSION)+String(" (")+strPathFileName+String(")"));
enableMenuItems(true,IDYES==result?false:true);
setData(mDiveProfile);
appReg.insertHistory(strPathFileName);
}
void DiveDlg::clearData()
{
mDiveProfile.clear();
sendMessage(DB_PROFILES,CB_RESETCONTENT,0,0L);
setText(DB_COMPUTER,"");
setText(DB_BATTERY,"");
setText(DB_STANDARD,"");
sendMessage(DB_NITROX,BM_SETCHECK,0,0L);
sendMessage(DB_O2,BM_SETCHECK,0,0L);
mLogList->resetContent();
mProfileList->resetContent();
mOwnerDrawGraph->clearData();
mOwnerDrawGraph->invalidate();
}
void DiveDlg::setData(Aladin &diveInfo)
{
const Information &information=diveInfo.getInformation();
const CurrentStatus &status=diveInfo.getStatus();
const LogBook &logBook=diveInfo.getLogBook();
const Profiles &profiles=diveInfo.getProfile();
int index;
mLogList->resetContent();
mProfileList->resetContent();
sendMessage(DB_PROFILES,CB_RESETCONTENT,0,0L);
setText(DB_COMPUTER,information.getComputerTypeString());
setText(DB_BATTERY,String().fromDouble(status.getRemainingBattery()));
setText(DB_STANDARD,information.getStandardString());
sendMessage(DB_NITROX,BM_SETCHECK,information.isNitrox(),0L);
sendMessage(DB_O2,BM_SETCHECK,information.isO2(),0L);
sendMessage(DB_NITROX,WM_ENABLE,FALSE,0);
sendMessage(DB_O2,WM_ENABLE,FALSE,0);
for(index=0;index<logBook.size();index++)
{
const DiveLog &diveLog=((LogBook&)logBook)[index];
String str=diveLog.getEntryTime().toStringShort()+String("\t");
str+=String().fromInt(diveLog.getMaxDepth())+String("\t");
str+=String().fromInt(diveLog.getBottomTime())+String("\t");
str+=diveLog.getSurfaceTime().toString()+String("\t");
str+=String().fromInt(diveLog.getWaterTemperature());
mLogList->addString(str);
}
for(index=0;index<profiles.size();index++)
{
String str=String("Profile_")+String().fromInt(index+1);
sendMessage(DB_PROFILES,CB_INSERTSTRING,-1,(LPARAM)str.str());
}
sendMessage(DB_PROFILES,CB_SETCURSEL,0,0L);
handleProfileChange();
}
void DiveDlg::handleProfileChange()
{
const Profiles &profiles=mDiveProfile.getProfile();
if(!profiles.size())return;
int index=sendMessage(DB_PROFILES,CB_GETCURSEL,0,0L);
mProfileList->resetContent();
DiveProfile &diveProfile=((Block<DiveProfile>&)profiles)[index];
for(index=0;index<diveProfile.size();index++)
{
ProfileData &profileData=diveProfile[index];
String str=String("\t")+String().fromInt(profileData.getStageTime())+String("\t")+String().fromInt(profileData.getDepth());
mProfileList->addString(str);
}
sendMessage(DB_PFMAXDEPTH,WM_SETTEXT,0,(LONG)(LPSTR)String().fromInt(diveProfile.getMaxDepth()));
sendMessage(DB_PFBOTTOMTIME,WM_SETTEXT,0,(LONG)(LPSTR)String().fromInt(diveProfile.getBottomTime()));
mOwnerDrawGraph->setData(diveProfile);
mOwnerDrawGraph->invalidate();
}
void DiveDlg::handleSaveAsWorksheet()
{
OpenDialog openDialog;
String strPathFileName;
if(!openDialog.getSaveFileName(".123","Save As Lotus Worksheet","",strPathFileName))return;
if(!mDiveProfile.saveWorksheet(strPathFileName))
{
::MessageBox(*this,"Error saving file.","Error",MB_OK);
return;
}
}
void DiveDlg::handleSaveAsRaw()
{
OpenDialog openDialog;
String strPathFileName;
if(!openDialog.getSaveFileName(".dat","Save As Raw Data","",strPathFileName))return;
if(!mDiveProfile.saveRaw(strPathFileName))
{
::MessageBox(*this,"Error saving file.","Error",MB_OK);
return;
}
}
void DiveDlg::handleSaveAsText()
{
OpenDialog openDialog;
String strPathFileName;
if(!openDialog.getSaveFileName(".txt","Save As Text","",strPathFileName))return;
if(!mDiveProfile.saveText(strPathFileName))
{
::MessageBox(*this,"Error saving file.","Error",MB_OK);
return;
}
}
void DiveDlg::handleFileSaveLog(void)
{
OpenDialog openDialog;
String strPathFileName;
if(!openDialog.getSaveFileName(".log","Save Log","",strPathFileName))return;
if(!mDiveProfile.saveLog(strPathFileName))
{
::MessageBox(*this,"Error saving file.","Error",MB_OK);
return;
}
}
void DiveDlg::handleFileNew()
{
if(IDCANCEL==::MessageBox(*this,"Clear contents?","Confirm",MB_OKCANCEL))return;
clearData();
}
void DiveDlg::handleHelpAbout()
{
SplashScreen splashScreen("SPLASH",String(STRING_SPLASHURL),String(STRING_APPNAME));
splashScreen.perform();
}
void DiveDlg::handleHelpHelp()
{
String strCommand;
Process process;
if(!getBrowser(strCommand))return;
process.createProcess(strCommand,String(" ")+String(STRING_HOST)+String(STRING_HELPPAGE),false);
}
void DiveDlg::handleHelpRegister()
{
String strCommand;
Process process;
if(!getBrowser(strCommand))return;
process.createProcess(strCommand,String(" ")+String(STRING_HOST)+String(STRING_REGISTERPAGE),false);
}
void DiveDlg::handleHelpHome()
{
String strCommand;
Process process;
if(!getBrowser(strCommand))return;
process.createProcess(strCommand,String(" ")+String(STRING_HOST)+String(STRING_HOMEPAGE),false);
}
void DiveDlg::handleHelpInterfaces(void)
{
String strCommand;
Process process;
if(!getBrowser(strCommand))return;
process.createProcess(strCommand,String(" ")+String(STRING_LINKURL),false);
}
void DiveDlg::enableMenuItems(bool enable,bool enableSaveRaw)
{
PureMenu windowMenu(::GetMenu(*this));
windowMenu.getSubMenu(0,windowMenu);
if(enable)
{
windowMenu.getSubMenu(0,windowMenu);
windowMenu.enableMenuItem(APPMENU_FILE_SAVEWORKSHEET,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
if(!enableSaveRaw)windowMenu.enableMenuItem(APPMENU_FILE_SAVERAW,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
else windowMenu.enableMenuItem(APPMENU_FILE_SAVERAW,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
windowMenu.enableMenuItem(APPMENU_FILE_SAVETEXT,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
windowMenu.enableMenuItem(APPMENU_FILE_SAVE,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
windowMenu.enableMenuItem(APPMENU_FILE_NEW,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
}
else
{
windowMenu.getSubMenu(0,windowMenu);
windowMenu.enableMenuItem(APPMENU_FILE_SAVEWORKSHEET,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
windowMenu.enableMenuItem(APPMENU_FILE_SAVERAW,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
windowMenu.enableMenuItem(APPMENU_FILE_SAVETEXT,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
windowMenu.enableMenuItem(APPMENU_FILE_SAVE,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
windowMenu.enableMenuItem(APPMENU_FILE_NEW,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemDisabled|PureMenu::ItemGrayed));
}
}
bool DiveDlg::getBrowser(String &strBrowser)
{
RegKey regKey(RegKey::LocalMachine);
String strCommand;
int argPos;
if(!regKey.openKey(String(STRING_BROWSERKEY)))
{
if(!regKey.openKey(String(STRING_BROWSERKEYALT)))
{
::MessageBox(*this,"Unable to launch browser.","Error",MB_OK);
return false;
}
}
if(!regKey.enumValue(0,String(STRING_BROWSERCOMMAND),strCommand)||strCommand.isNull()||!strCommand.length())
{
::MessageBox(*this,"Unable to launch browser.","Error",MB_OK);
return false;
}
strCommand.removeTokens("'\"");
if(-1!=(argPos=strCommand.strpos("-")))strCommand=strCommand.substr(0,argPos-1);
strBrowser=strCommand;
return true;
}
void DiveDlg::applyHistory(void)
{
AppReg appReg;
Block<String> nameList;
PureMenu fileMenu;
String strItem;
PureMenu pureMenu(getMenu());
appReg.getHistory(nameList);
if(!nameList.size())return;
pureMenu.getSubMenu(0,fileMenu);
fileMenu.appendSeparator();
for(int itemIndex=0;itemIndex<nameList.size();itemIndex++)
{
::sprintf(strItem,"%d) %s",itemIndex+1,(char*)nameList[itemIndex]);
fileMenu.appendMenu(StartDynamicID+itemIndex,strItem);
}
}