Files
Work/m68hc11/Mainfrm.cpp
2024-08-07 09:16:27 -04:00

530 lines
16 KiB
C++

#include <m68hc11/mainfrm.hpp>
#include <m68hc11/serdlg.hpp>
#include <m68hc11/codeview.hpp>
#include <m68hc11/mcuview.hpp>
#include <m68hc11/cmpdlg.hpp>
#include <m68hc11/m68reg.hpp>
#include <m68hc11/splash.hpp>
#include <printman/printman.hpp>
#include <common/assert.hpp>
#include <common/opendlg.hpp>
#include <common/gdata.hpp>
#include <common/crsctrl.hpp>
#include <common/diskinfo.hpp>
char MainFrame::szClassName[]="M68HC11";
char MainFrame::szMenuName[]="mainMenu";
MainFrame::MainFrame(void)
{
mQueryEndSessionHandler.setCallback(this,&MainFrame::queryEndSessionHandler);
mPaintHandler.setCallback(this,&MainFrame::paintHandler);
mDestroyHandler.setCallback(this,&MainFrame::destroyHandler);
mCommandHandler.setCallback(this,&MainFrame::commandHandler);
mSizeHandler.setCallback(this,&MainFrame::sizeHandler);
mCreateHandler.setCallback(this,&MainFrame::createHandler);
mLineHandler.setCallback(this,&MainFrame::lineHandler);
insertHandlers();
}
MainFrame::~MainFrame()
{
destroy();
}
void MainFrame::insertHandlers(void)
{
insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
insertHandler(VectorHandler::PaintHandler,&mPaintHandler);
insertHandler(VectorHandler::CommandHandler,&mCommandHandler);
insertHandler(VectorHandler::SizeHandler,&mSizeHandler);
insertHandler(VectorHandler::CreateHandler,&mCreateHandler);
insertHandler(VectorHandler::QueryEndSessionHandler,&mQueryEndSessionHandler);
}
void MainFrame::removeHandlers(void)
{
removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
removeHandler(VectorHandler::PaintHandler,&mPaintHandler);
removeHandler(VectorHandler::CommandHandler,&mCommandHandler);
removeHandler(VectorHandler::SizeHandler,&mSizeHandler);
removeHandler(VectorHandler::CreateHandler,&mCreateHandler);
removeHandler(VectorHandler::QueryEndSessionHandler,&mQueryEndSessionHandler);
}
CallbackData::ReturnType MainFrame::createHandler(CallbackData &/*someCallbackData*/)
{
GlobalData<int> statParts;
createToolBar();
mStatusBar=::new StatusBarEx(*this,StatusBarID);
mStatusBar.disposition(PointerDisposition::Delete);
statParts.size(2);
*((int*)&statParts[0])=300;
*((int*)&statParts[1])=400;
mStatusBar->setParts(statParts);
mStatusBar->setText("Ready");
applyHistory(getFrameMenu());
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MainFrame::destroyHandler(CallbackData &/*someCallbackData*/)
{
removeHandlers();
::PostQuitMessage(0);
::WinHelp(*this,0,HELP_QUIT,0);
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MainFrame::queryEndSessionHandler(CallbackData &someCallbackData)
{
if(getClient().hasChildren())return (CallbackData::ReturnType)FALSE;
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MainFrame::sizeHandler(CallbackData &someCallbackData)
{
Rect statusRect;
Rect toolRect;
Rect cRect;
mToolBar.windowRect(toolRect);
mStatusBar->windowRect(statusRect);
cRect.right(someCallbackData.loWord());
cRect.bottom(someCallbackData.hiWord());
getClient().moveWindow(0,toolRect.bottom()-toolRect.top(),cRect.right(),cRect.bottom()-((statusRect.bottom()-statusRect.top())+(toolRect.bottom()-toolRect.top())));
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MainFrame::lineHandler(CallbackData &someCallbackData)
{
String msg;
::sprintf(msg,"Ln %d, Col %d",someCallbackData.loWord(),someCallbackData.hiWord());
mStatusBar->setText(msg,1);
mStatusBar->update();
return FALSE;
}
CallbackData::ReturnType MainFrame::paintHandler(CallbackData &/*someCallbackData*/)
{
return (CallbackData::ReturnType)FALSE;
}
CallbackData::ReturnType MainFrame::commandHandler(CallbackData &someCallbackData)
{
switch(someCallbackData.wmCommandID())
{
case MenuCodeCompile :
handleCodeCompile();
break;
case MenuCodeCompileAndLoad :
handleCodeCompileAndLoad();
break;
case MenuEditCut :
handleEditCut();
break;
case MenuEditCopy :
handleEditCopy();
break;
case MenuEditPaste :
handleEditPaste();
break;
case MenuEditFind :
handleEditFind();
break;
case MenuCascade :
cascade();
break;
case MenuTile :
tile();
break;
case MenuArrange :
arrange();
break;
case MenuCloseAll :
closeAll();
break;
case MenuMinimizeAll :
minimizeAll();
break;
case MenuRestoreAll :
restoreAll();
break;
case MenuFileNew :
handleFileNew();
break;
case MenuFileOpen :
handleFileOpen();
break;
case MenuFileSave :
handleFileSave();
break;
case MenuFilePrint :
handleFilePrint();
break;
case MenuFileSaveAs :
handleFileSaveAs();
break;
case MenuFileClose :
handleFileClose();
break;
case MenuCompiler :
handleMenuCompiler();
break;
case MenuFileQuit :
handleQuit();
break;
case MenuSettingsSerial :
handleCommunications();
break;
case MenuHelpContents :
handleHelp();
break;
case MenuHelpSearch :
handleHelp();
break;
case MenuRegistration :
break;
case MenuHelpAbout :
break;
}
if(someCallbackData.wParam()>=StartDynamicID)handleFileOpen(someCallbackData);
return (CallbackData::ReturnType)FALSE;
}
// handlers
void MainFrame::handleCodeCompile(void)
{
CursorControl cursorControl;
SmartPointer<MDIWindow> mdiWindow;
Block<String> includePath;
String strMessage;
M68Reg m68Reg;
if(!getActive(mdiWindow)||!(mdiWindow->className()==String(STRING_CODEVIEWCLASSNAME)))return;
CodeView &codeView=(CodeView&)*mdiWindow;
if(codeView.isDirty()&&IDYES==::MessageBox(*this,(LPSTR)"Save Changes?",(LPSTR)"M68HC11",MB_YESNO))if(!handleFileSave())return;
mStatusBar->setText("compiling...");
cursorControl.waitCursor(TRUE);
m68Reg.getIncludePath(includePath);
m68Assembler.assemble(codeView.getTitle(),includePath);
cursorControl.waitCursor(FALSE);
strMessage=m68Assembler.strLastMessage()+String(", code size is ")+String().fromInt(m68Assembler.codeSize())+String(" byte(s).");
mStatusBar->setText(strMessage);
}
void MainFrame::handleCodeCompileAndLoad(void)
{
CursorControl cursorControl;
Block<String> includePath;
bool assembleResult;
String strPathBinary;
String strMessage;
M68Reg m68Reg;
SmartPointer<MDIWindow> mdiWindow;
if(!getActive(mdiWindow)||!(mdiWindow->className()==String(STRING_CODEVIEWCLASSNAME)))return;
CodeView &codeView=(CodeView&)*mdiWindow;
if(codeView.isDirty()&&IDYES==::MessageBox(*this,(LPSTR)"Save Changes?",(LPSTR)"M68HC11",MB_YESNO))if(!handleFileSave())return;
mStatusBar->setText("compiling...");
cursorControl.waitCursor(TRUE);
m68Reg.getIncludePath(includePath);
assembleResult=m68Assembler.assemble(codeView.getTitle(),includePath);
cursorControl.waitCursor(FALSE);
strMessage=m68Assembler.strLastMessage()+String(", code size is ")+String().fromInt(m68Assembler.codeSize())+String(" byte(s).");
mStatusBar->setText(strMessage);
if(!assembleResult)return;
strPathBinary=codeView.getTitle().betweenString(0,'.');
strPathBinary+=".bin";
codeLoad(strPathBinary);
}
void MainFrame::handleEditCut(void)
{
SmartPointer<MDIWindow> mdiWindow;
if(!getActive(mdiWindow)||!(mdiWindow->className()==String(STRING_CODEVIEWCLASSNAME)))return;
((CodeView&)*mdiWindow).cut();
}
void MainFrame::handleEditCopy(void)
{
SmartPointer<MDIWindow> mdiWindow;
if(!getActive(mdiWindow)||!(mdiWindow->className()==String(STRING_CODEVIEWCLASSNAME)))return;
((CodeView&)*mdiWindow).copy();
}
void MainFrame::handleEditPaste(void)
{
SmartPointer<MDIWindow> mdiWindow;
if(!getActive(mdiWindow)||!(mdiWindow->className()==String(STRING_CODEVIEWCLASSNAME)))return;
((CodeView&)*mdiWindow).paste();
}
void MainFrame::handleEditFind(void)
{
SmartPointer<MDIWindow> mdiWindow;
if(!getActive(mdiWindow)||!(mdiWindow->className()==String(STRING_CODEVIEWCLASSNAME)))return;
((CodeView&)*mdiWindow).find();
}
void MainFrame::handleFileNew(void)
{
CodeView *pCodeView;
pCodeView=::new CodeView;
pCodeView->setLineHandler(&mLineHandler);
pCodeView->createWindow(*this,STRING_CODEVIEWCLASSNAME,STRING_CODEVIEWCLASSNAME,"codeMenu","Doc");
insert(*pCodeView);
}
void MainFrame::handleFileOpen(CallbackData &someCallbackData)
{
PureMenu fileMenu;
String menuItemString;
getFrameMenu().getSubMenu(0,fileMenu);
menuItemString=fileMenu.menuItemString(someCallbackData.wParam(),PureMenu::ByCommand);
if(menuItemString.isNull())return;
menuItemString=menuItemString.betweenString(')',0);
menuItemString.trimLeft();
handleFileOpen(menuItemString);
}
void MainFrame::handleFileOpen(void)
{
OpenDialog openDialog;
String strPathFileName;
if(!openDialog.getOpenFileName(*this,"*.asm","Open File","*.asm",strPathFileName))return;
handleFileOpen(strPathFileName);
}
void MainFrame::handleFileOpen(const String &strPathFileName)
{
CodeView *pCodeView;
CursorControl cursorControl;
if(bringDocumentToFront(strPathFileName))return;
mStatusBar->setText("Loading...");
cursorControl.waitCursor(TRUE);
pCodeView=::new CodeView;
insert(*pCodeView); // insert the pointer before creating/activating the window
pCodeView->createWindow(*this,STRING_CODEVIEWCLASSNAME,STRING_CODEVIEWCLASSNAME,"codeMenu","Doc");
pCodeView->setLineHandler(&mLineHandler);
pCodeView->open(strPathFileName);
mStatusBar->setText("Ready");
cursorControl.waitCursor(FALSE);
updateHistory(strPathFileName);
}
void MainFrame::handleFileClose(void)
{
SmartPointer<MDIWindow> mdiWindow;
if(!getActive(mdiWindow)||!(mdiWindow->className()==String(STRING_CODEVIEWCLASSNAME)))return;
mdiWindow->close();
}
void MainFrame::handleFilePrint(void)
{
SmartPointer<MDIWindow> mdiWindow;
if(!getActive(mdiWindow)||!(mdiWindow->className()==String(STRING_CODEVIEWCLASSNAME)))return;
((CodeView&)*mdiWindow).print();
}
BOOL MainFrame::handleFileSave(void)
{
SmartPointer<MDIWindow> mdiWindow;
if(!getActive(mdiWindow)||!(mdiWindow->className()==String(STRING_CODEVIEWCLASSNAME)))return FALSE;
CodeView &codeView=(CodeView&)*mdiWindow;
if(codeView.getTitle()==String(STRING_UNTITLED))return handleFileSaveAs();
if(!codeView.save())return mStatusBar->setText(codeView.getTitle()+String(" save failed.")),FALSE;
return mStatusBar->setText(codeView.getTitle()+String(" saved.")),TRUE;
return TRUE;
}
BOOL MainFrame::handleFileSaveAs(void)
{
SmartPointer<MDIWindow> mdiWindow;
OpenDialog openDialog;
String strPathFileName;
if(!getActive(mdiWindow)||!(mdiWindow->className()==String(STRING_CODEVIEWCLASSNAME)))return FALSE;
if(!openDialog.getSaveFileName(*this,"Assembly Files","File Save","*.asm",strPathFileName))return FALSE;
if(!strPathFileName.strstr(".asm"))strPathFileName+=".asm";
if(!((CodeView&)*mdiWindow).save(strPathFileName))return mStatusBar->setText(strPathFileName+String(" save failed!.")),FALSE;
return mStatusBar->setText(strPathFileName+String(" saved.")),TRUE;
}
void MainFrame::handleCommunications(void)
{
SerialDlg serDlg;
serDlg.perform(*this);
}
void MainFrame::handleHelp(void)
{
String strPathHelpFileName;
DiskInfo diskInfo;
diskInfo.getCurrentDirectory(strPathHelpFileName);
strPathHelpFileName+=String(STRING_HELPFILENAME);
::WinHelp(*this,strPathHelpFileName,HELP_CONTENTS,0);
}
void MainFrame::handleMenuCompiler()
{
M68Reg m68Reg;
CMPDlg cmpDlg;
Block<String> pathDirList;
m68Reg.getIncludePath(pathDirList);
cmpDlg.setIncludePath(pathDirList);
if(cmpDlg.perform(*this))
{
cmpDlg.getIncludePath(pathDirList);
m68Reg.setIncludePath(pathDirList);
}
return;
}
void MainFrame::handleQuit()
{
postMessage(*this,WM_CLOSE,0,0L);
}
// support & testing
BOOL MainFrame::codeLoad(const String &strPathBinary)
{
MCUView *pMCUView;
pMCUView=::new MCUView;
pMCUView->createWindow(*this,STRING_MCUVIEWCLASSNAME,STRING_MCUVIEWCLASSNAME,"mcuMenu","Doc");
insert(*pMCUView);
pMCUView->setCode(strPathBinary);
return TRUE;
}
void MainFrame::setParts(int numParts)
{
GlobalData<int> statParts;
if(1==numParts){statParts.size(1);*((int*)&statParts[0])=FirstPartWidth;}
else {statParts.size(2);*((int*)&statParts[0])=FirstPartWidth;*((int*)&statParts[0]+1)=SecondPartWidth;}
mStatusBar->setParts(statParts);
}
void MainFrame::updateHistory(const String &pathFileName)
{
M68Reg m68Reg;
Array<SmartPointer<MDIWindow> >mdiWindows;
if(!m68Reg.insertHistory(pathFileName))return;
removeHistory(getFrameMenu());
applyHistory(getFrameMenu());
getDocuments(mdiWindows);
for(int index=0;index<mdiWindows.size();index++)
{
SmartPointer<MDIWindow> &mdiWindow=mdiWindows[index];
removeHistory(mdiWindow->getMenu());
applyHistory(mdiWindow->getMenu());
}
}
void MainFrame::removeHistory(PureMenu &pureMenu)
{
M68Reg m68Reg;
UINT startID(StartDynamicID);
Block<String> nameList;
PureMenu fileMenu;
m68Reg.getHistory(nameList);
if(!nameList.size())return;
pureMenu.getSubMenu(0,fileMenu);
for(int itemIndex=0;itemIndex<nameList.size();itemIndex++)fileMenu.removeMenu(startID++,PureMenu::ByCommand);
int entries(fileMenu.size());
if((int)PureMenu::TypeSeparator&(int)fileMenu.getMenuItemType(entries-1,PureMenu::ByPosition))fileMenu.removeMenu(entries-1,PureMenu::ByPosition);
}
void MainFrame::applyHistory(PureMenu &pureMenu)
{
M68Reg m68Reg;
Block<String> nameList;
PureMenu fileMenu;
String strItem;
m68Reg.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);
}
}
void MainFrame::createToolBar(void)
{
Block<AddBitmap> addBitmaps;
mToolBar.create(*this,ToolBarID);
addBitmaps.insert(&AddBitmap(0,HINST_COMMCTRL));
if(!mToolBar.addBitmaps(addBitmaps))return;
mToolBar.addButton(ToolBarButton(STD_FILENEW,MenuFileNew,ToolBarButton::StateEnabled,ToolBarButton::StyleButton));
mToolBar.addButton(ToolBarButton(STD_FILEOPEN,MenuFileOpen,ToolBarButton::StateEnabled,ToolBarButton::StyleButton));
mToolBar.addButton(ToolBarButton(STD_FILESAVE,MenuFileSave,ToolBarButton::StateEnabled,ToolBarButton::StyleButton));
mToolBar.addButton(ToolBarButton(STD_PRINT,MenuFilePrint,ToolBarButton::StateEnabled,ToolBarButton::StyleButton));
mToolBar.addButton(ToolBarButton(STD_CUT,MenuEditCut,ToolBarButton::StateEnabled,ToolBarButton::StyleButton));
mToolBar.addButton(ToolBarButton(STD_COPY,MenuEditCopy,ToolBarButton::StateEnabled,ToolBarButton::StyleButton));
mToolBar.addButton(ToolBarButton(STD_PASTE,MenuEditPaste,ToolBarButton::StateEnabled,ToolBarButton::StyleButton));
mToolBar.addButton(ToolBarButton(STD_FIND,MenuEditFind,ToolBarButton::StateEnabled,ToolBarButton::StyleButton));
mToolBar.addButton(ToolBarButton(STD_PRINT,MenuFilePrint,ToolBarButton::StateEnabled,ToolBarButton::StyleButton));
}
BOOL MainFrame::bringDocumentToFront(const String &strTitle)
{
Array<SmartPointer<MDIWindow> >mdiWindows;
getDocuments(mdiWindows);
for(int index=0;index<mdiWindows.size();index++)
{
SmartPointer<MDIWindow> &mdiWindow=mdiWindows[index];
if(((CodeView&)*mdiWindow).getTitle()==strTitle){mdiWindow->bringWindowToTop();return TRUE;}
}
return false;
}
void MainFrame::splash(void)
{
SplashScreen splashScreen("SPLASH","M68HC11");
splashScreen.perform();
}
// virtuals
void MainFrame::mdiDestroy(MDIWindow &mdiWindow)
{
Array<SmartPointer<MDIWindow> >mdiWindows;
WORD winCount(0);
getDocuments(mdiWindows);
for(int index=0;index<mdiWindows.size();index++)
{
SmartPointer<MDIWindow> &mdiWindowPtr=mdiWindows[index];
if(mdiWindowPtr->className()==String(STRING_CODEVIEWCLASSNAME)&&((MDIWindow*)mdiWindowPtr!=&mdiWindow))winCount++;
}
if(!winCount)setParts(SinglePart);
}
void MainFrame::mdiActivate(MDIWindow &mdiWindow)
{
if(mdiWindow.className()==String(STRING_CODEVIEWCLASSNAME))setParts(DoublePart);
removeHistory(mdiWindow.getMenu());
applyHistory(mdiWindow.getMenu());
}
void MainFrame::mdiDeactivate(MDIWindow &/*mdiWindow*/)
{
}