Files
Work/drums/ViewWnd.cpp
2024-08-07 09:16:27 -04:00

571 lines
17 KiB
C++

#include <drums/viewwnd.hpp>
#include <drums/drums.hpp>
#include <drums/DrumControl.hpp>
//#include <guitar/guitar.hpp>
//#include <guitar/GlobalDefs.hpp>
//#include <guitar/MessageBox.hpp>
#include <statbar/statbarx.hpp>
#include <common/profile.hpp>
#include <common/puremenu.hpp>
#include <common/opendlg.hpp>
#include <common/mdifrm.hpp>
ViewWindow::ViewWindow(void)
//: mIsInRepeatPlay(false)
{
mCreateHandler.setCallback(this,&ViewWindow::createHandler);
mSizeHandler.setCallback(this,&ViewWindow::sizeHandler);
mPaintHandler.setCallback(this,&ViewWindow::paintHandler);
mLeftButtonDoubleHandler.setCallback(this,&ViewWindow::leftButtonDoubleHandler);
mThreadHandler.setCallback(this,&ViewWindow::threadHandler);
mCloseHandler.setCallback(this,&ViewWindow::closeHandler);
mRightButtonDownHandler.setCallback(this,&ViewWindow::rightButtonDownHandler);
MDIWindow::insertHandler(VectorHandler::CreateHandler,&mCreateHandler);
MDIWindow::insertHandler(VectorHandler::SizeHandler,&mSizeHandler);
MDIWindow::insertHandler(VectorHandler::PaintHandler,&mPaintHandler);
MDIWindow::insertHandler(VectorHandler::LeftButtonDoubleHandler,&mLeftButtonDoubleHandler);
MDIWindow::insertHandler(VectorHandler::CloseHandler,&mCloseHandler);
MDIWindow::insertHandler(VectorHandler::RightButtonDownHandler,&mRightButtonDownHandler);
MessageThread::insertHandler(&mThreadHandler);
start();
}
ViewWindow::~ViewWindow()
{
MDIWindow::removeHandler(VectorHandler::CreateHandler,&mCreateHandler);
MDIWindow::removeHandler(VectorHandler::SizeHandler,&mSizeHandler);
MDIWindow::removeHandler(VectorHandler::PaintHandler,&mPaintHandler);
MDIWindow::removeHandler(VectorHandler::LeftButtonDoubleHandler,&mLeftButtonDoubleHandler);
MDIWindow::removeHandler(VectorHandler::CloseHandler,&mCloseHandler);
MDIWindow::removeHandler(VectorHandler::RightButtonDownHandler,&mRightButtonDownHandler);
stop();
}
CallbackData::ReturnType ViewWindow::createHandler(CallbackData &someCallbackData)
{
/* mTabPage=::new TabPage(*this);
mTabPage.disposition(PointerDisposition::Delete);
setTitle(STRING_NOTITLE);*/
mDrumControl=new DrumControl(*this);
mDrumControl.disposition(PointerDisposition::Delete);
setTitle("{None}");
return false;
}
CallbackData::ReturnType ViewWindow::closeHandler(CallbackData &someCallbackData)
{
/* mTabPage->setCancelled(true);
if(mTabPage->isDirty())
{
LRESULT result=MessageBox::messageBox(*this,"Project has changed.","Save changes?",MB_YESNOCANCEL);
if(IDCANCEL==result)return true;
else if(IDNO==result)
{
mTabPage->isDirty(false);
return false;
}
else
{
saveProject();
mTabPage->isDirty(false);
return false;
}
}
*/
return false;
}
CallbackData::ReturnType ViewWindow::rightButtonDownHandler(CallbackData &someCallbackData)
{
/* GlobalDefs::outDebug("ViewWindow::rightButtonDownHandler");
PureMenu popupMenu(PureMenu::PopupMenu);
GDIPoint trackPoint;
trackPoint.x(someCallbackData.loWord());
trackPoint.y(someCallbackData.hiWord());
clientToScreen(trackPoint);
if(mTabPage->isInPlay())
{
popupMenu.appendMenu(MENU_TABLATURE_STOP,"&Stop");
}
else
{
popupMenu.appendMenu(MENU_TABLATURE_PLAY,"&Play");
popupMenu.appendMenu(MENU_TABLATURE_PLAYREPEATED,"Play (&Repeated)");
if(mTabPage->hasRange())
{
popupMenu.appendMenu(MENU_TABLATURE_PLAYRANGE,"Play R&ange...");
popupMenu.appendMenu(MENU_TABLATURE_PLAYRANGE_REPEATED,"Play Rang&e (Repeated)...");
}
if(mTabPage->isInOutline())
{
popupMenu.appendMenu(MENU_TABLATURE_PLAYTOEND,"P&lay From Here");
if(!mTabPage->isInSetRange())
{
popupMenu.appendSeparator();
popupMenu.appendMenu(MENU_TABLATURE_SETSTARTRANGE,"S&tart Range");
}
else
{
popupMenu.appendSeparator();
popupMenu.appendMenu(MENU_TABLATURE_SETENDRANGE,"&End Range");
}
popupMenu.appendSeparator();
popupMenu.appendMenu(MENU_TABLATURE_ENTRYPROPS,"&Properties...");
}
}
popupMenu.trackPopupMenu(*(getFrame()),trackPoint);
::SetCursorPos(trackPoint.x(),trackPoint.y());
*/
return false;
}
CallbackData::ReturnType ViewWindow::sizeHandler(CallbackData &someCallbackData)
{
return false;
}
CallbackData::ReturnType ViewWindow::paintHandler(CallbackData &someCallbackData)
{
return false;
}
CallbackData::ReturnType ViewWindow::leftButtonDoubleHandler(CallbackData &someCallbackData)
{
return false;
}
// ************************************************************************************************
/*
bool ViewWindow::insert(const TabEntry &entry)
{
// return mTabPage->insert(entry);
return false;
}
*/
/*
bool ViewWindow::insert(const TabEntries &entries)
{
if(!mTabPage->insert(entries))return false;
invalidate();
mTabPage->isDirty(true);
return true;
}
*/
void ViewWindow::setTitle(const String &strTitle)
{
String strCaption;
String strString;
windowText(strCaption);
strString=strCaption;
strCaption=strCaption.betweenString(0,' ');
if(strCaption.isNull())strCaption=strString;
strCaption+=String(" - [")+strTitle+String("]");
setCaption(strCaption);
}
String ViewWindow::getTitle(void)const
{
String strCaption;
windowText(strCaption);
return strCaption.betweenString('[',']');
}
/*
void ViewWindow::play(void)
{
ThreadMessage thMessage(ThreadMessage::TM_USER,THPlay);
enablePlaySelect(false);
MessageThread::postMessage(thMessage);
return;
}
void ViewWindow::playFromCurrent(void)
{
ThreadMessage thMessage(ThreadMessage::TM_USER,THPlayFromCurrent);
enablePlaySelect(false);
MessageThread::postMessage(thMessage);
return;
}
void ViewWindow::playRepeated(void)
{
ThreadMessage thMessage(ThreadMessage::TM_USER,THPlay);
enablePlaySelect(false);
isInRepeatPlay(true);
MessageThread::postMessage(thMessage);
return;
}
void ViewWindow::playRange(int rangeIndex)
{
ThreadMessage thMessage(ThreadMessage::TM_USER,THPlayRange,rangeIndex);
enablePlaySelect(false);
MessageThread::postMessage(thMessage);
}
void ViewWindow::playRangeRepeated(int rangeIndex)
{
ThreadMessage thMessage(ThreadMessage::TM_USER,THPlayRange,rangeIndex);
enablePlaySelect(false);
isInRepeatPlay(true);
MessageThread::postMessage(thMessage);
}
void ViewWindow::stopPlay(void)
{
isInRepeatPlay(false);
mTabPage->setCancelled(true);
}
void ViewWindow::modifyProperties(void)
{
mTabPage->modifyProperties();
}
void ViewWindow::increaseTempo(void)
{
mTabPage->increaseTempo();
}
void ViewWindow::decreaseTempo(void)
{
mTabPage->decreaseTempo();
}
void ViewWindow::enablePlaySelect(bool enable)
{
PureMenu &pureMenu=getMenu();
if(enable)
{
pureMenu.enableMenuItem(MENU_TABLATURE_PLAY,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYREPEATED,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYRANGE,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
pureMenu.enableMenuItem(MENU_TABLATURE_STOP,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
}
else
{
pureMenu.enableMenuItem(MENU_TABLATURE_PLAY,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYREPEATED,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYRANGE,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
pureMenu.enableMenuItem(MENU_TABLATURE_STOP,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
}
}
void ViewWindow::enableCut(bool enable)
{
PureMenu &pureMenu=getMenu();
pureMenu.enableMenuItem(MENU_EDIT_CUT,PureMenu::ByCommand,enable?PureMenu::InsertFlags(PureMenu::ItemEnabled):PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
}
void ViewWindow::enableCopy(bool enable)
{
PureMenu &pureMenu=getMenu();
pureMenu.enableMenuItem(MENU_EDIT_COPY,PureMenu::ByCommand,enable?PureMenu::InsertFlags(PureMenu::ItemEnabled):PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
}
void ViewWindow::enablePaste(bool enable)
{
PureMenu &pureMenu=getMenu();
pureMenu.enableMenuItem(MENU_EDIT_PASTE,PureMenu::ByCommand,enable?PureMenu::InsertFlags(PureMenu::ItemEnabled):PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
}
bool ViewWindow::getEnableCut(void)
{
UINT state;
PureMenu &pureMenu=getMenu();
state=pureMenu.getMenuState(MENU_EDIT_CUT,PureMenu::ByCommand);
return !((state&MF_GRAYED)||(state&MF_DISABLED));
}
bool ViewWindow::getEnableCopy(void)
{
UINT state;
PureMenu &pureMenu=getMenu();
state=pureMenu.getMenuState(MENU_EDIT_COPY,PureMenu::ByCommand);
return !((state&MF_GRAYED)||(state&MF_DISABLED));
}
bool ViewWindow::getEnablePaste(void)
{
UINT state;
PureMenu &pureMenu=getMenu();
state=pureMenu.getMenuState(MENU_EDIT_PASTE,PureMenu::ByCommand);
return !((state&MF_GRAYED)||(state&MF_DISABLED));
}
void ViewWindow::enableStopSelect(bool enable)
{
PureMenu &pureMenu=getMenu();
if(enable)pureMenu.enableMenuItem(MENU_TABLATURE_STOP,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
else pureMenu.enableMenuItem(MENU_TABLATURE_STOP,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
}
bool ViewWindow::createProject(const String &strPathTabFile)
{
if(Profile::verifyPathFileName(Tablature::getPathFileProject(strPathTabFile)))
{
String strMessage=String("Project '")+Tablature::getPathFileProject(strPathTabFile)+String("' already exists, overwrite?");
if(IDCANCEL==MessageBox::messageBox(*this,"Warning",strMessage,MB_OKCANCEL))return false;
}
if(!mTablature.import(strPathTabFile))
{
switch(mTablature.getLastError())
{
case Tablature::FileOpenError :
MessageBox::messageBox(*this,"Load Tablature","Referenced tablature could not be opened.");
return false;
case Tablature::NoTabsParsedError :
MessageBox::messageBox(*this,"Load Tablature","File contained no valid tablatures.",MB_OK);
return false;
case Tablature::NoFrettedNotesError :
MessageBox::messageBox(*this,"Load Tablature","File contained tablatures, but none of them were parsed.");
return false;
default :
MessageBox::messageBox(*this,"Load Tablature","Error creating project.");
return false;
}
}
setTitle(mTablature.getPathFileProject());
saveProject();
show(SW_SHOW);
top();
mTabPage->insert(mTablature.getTabEntries(),false);
PureMenu &pureMenu=getMenu();
pureMenu.enableMenuItem(MENU_TABLATURE_STOP,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
invalidate();
return true;
}
bool ViewWindow::createProject(void)
{
show(SW_SHOW);
top();
setTitle(STRING_NOTITLE);
PureMenu &pureMenu=getMenu();
pureMenu.enableMenuItem(MENU_TABLATURE_STOP,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
invalidate();
mTabPage->isDirty(true);
return true;
}
bool ViewWindow::openProject(const String &pathFileName)
{
if(!mTablature.openProject(pathFileName))
{
switch(mTablature.getLastError())
{
case Tablature::FileOpenError :
MessageBox::messageBox(*this,pathFileName,"Referenced tablature could not be opened.");
return false;
case Tablature::NoTabsParsedError :
MessageBox::messageBox(*this,pathFileName,"File contained no valid tablatures.");
return false;
case Tablature::NoFrettedNotesError :
MessageBox::messageBox(*this,pathFileName,"Warning, No tablatures were found in the file.\nYou can insert tablature by using the Insert key.");
}
}
PureMenu &pureMenu=getMenu();
show(SW_SHOW);
top();
mTabPage->insert(mTablature.getTabEntries(),false); // don't set the dirty flag when loading
if(mTabPage->insert(mTablature.getTabRanges(),false)) // don't set the dirty flag when loading
{
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYRANGE,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYRANGE_REPEATED,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
}
setTitle(mTablature.getPathFileProject());
pureMenu.enableMenuItem(MENU_TABLATURE_STOP,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
return true;
}
bool ViewWindow::getProjectName(String &strPathFileProject)
{
OpenDialog openDialog;
if(!openDialog.getSaveFileName(*this,"Project Files","Project Save",String(STRING_PRJALLEXTENSION),strPathFileProject))return false;
if(!strPathFileProject.strstr(String(STRING_PRJEXTENSION)))strPathFileProject+=String(STRING_PRJEXTENSION);
return true;
}
bool ViewWindow::saveProject(const String &pathFileName)
{
bool returnCode=false;
if(mTabPage->isDirty())
{
mTablature.setTabEntries(mTabPage->getEntries());
mTablature.setTabRanges(mTabPage->getRanges());
mTabPage->isDirty(false);
}
returnCode=mTablature.saveProject(pathFileName);
if(returnCode&&String(STRING_NOTITLE)==getTitle())setTitle(mTablature.getPathFileProject());
return returnCode;
}
bool ViewWindow::saveProject(void)
{
bool returnCode=false;
if(getTitle()==String(STRING_NOTITLE))
{
Registry registry;
String strPathFileProject;
if(!getProjectName(strPathFileProject))return false;
if(!saveProject(strPathFileProject))return false;
registry.insertHistory(strPathFileProject);
setTitle(mTablature.getPathFileProject());
return true;
}
if(mTabPage->isDirty())
{
mTablature.setTabEntries(mTabPage->getEntries());
mTablature.setTabRanges(mTabPage->getRanges());
mTabPage->isDirty(false);
}
returnCode=mTablature.saveProject();
if(returnCode&&String(STRING_NOTITLE)==getTitle())setTitle(mTablature.getPathFileProject());
return returnCode;
}
void ViewWindow::cut(void)
{
mTabPage->cut();
}
void ViewWindow::copy(void)
{
mTabPage->copy();
}
void ViewWindow::paste(void)
{
mTabPage->paste();
}
void ViewWindow::setStartRange(void)
{
mTabPage->setStartRange();
}
void ViewWindow::setEndRange(void)
{
PureMenu &pureMenu=getMenu();
mTabPage->setEndRange();
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYRANGE,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYRANGE_REPEATED,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
}
bool ViewWindow::getTabRanges(TabRanges &ranges)
{
ranges.remove();
ranges=mTabPage->getRanges();
return ranges.size()?true:false;
}
void ViewWindow::setTabRanges(const TabRanges &ranges)
{
PureMenu &pureMenu=getMenu();
mTabPage->setRanges(ranges);
if(ranges.size())
{
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYRANGE,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYRANGE_REPEATED,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemEnabled));
}
else
{
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYRANGE,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
pureMenu.enableMenuItem(MENU_TABLATURE_PLAYRANGE_REPEATED,PureMenu::ByCommand,PureMenu::InsertFlags(PureMenu::ItemGrayed|PureMenu::ItemDisabled));
}
}
*/
// thread handler
DWORD ViewWindow::threadHandler(ThreadMessage &threadMessage)
{
switch(threadMessage.message())
{
case ThreadMessage::TM_USER :
break;
// if(THPlay==threadMessage.userDataOne())thPlay();
// else if(THPlayFromCurrent==threadMessage.userDataOne())thPlayFromCurrent();
// else if(THPlayRange==threadMessage.userDataOne())thPlayRange(threadMessage.userDataTwo());
}
return 0;
}
/*
void ViewWindow::thPlayRange(int rangeIndex)
{
::OutputDebugString("[ViewWindow::thPlayRange] ENTER\n");
ThreadPriority prevPriority=setThreadPriority(PureThread::ThreadPriorityHighest);
mTabPage->playRange(rangeIndex);
setThreadPriority(prevPriority);
if(mTabPage->getCancelled())isInRepeatPlay(false);
if(isInRepeatPlay())
{
::Sleep(RestBeforeRepeat);
ThreadMessage thMessage(ThreadMessage::TM_USER,THPlayRange,rangeIndex);
MessageThread::postMessage(thMessage);
}
else
{
enablePlaySelect(true);
}
::OutputDebugString("[ViewWindow::thPlayRange] LEAVE\n");
}
void ViewWindow::thPlay()
{
::OutputDebugString("[ViewWindow::thPlay] ENTER\n");
ThreadPriority prevPriority=setThreadPriority(PureThread::ThreadPriorityHighest);
mTabPage->play();
setThreadPriority(prevPriority);
if(mTabPage->getCancelled())isInRepeatPlay(false);
if(isInRepeatPlay())
{
::Sleep(RestBeforeRepeat);
ThreadMessage thMessage(ThreadMessage::TM_USER,THPlay);
MessageThread::postMessage(thMessage);
}
else
{
enablePlaySelect(true);
}
::OutputDebugString("[ViewWindow::thPlay] LEAVE\n");
}
void ViewWindow::thPlayFromCurrent()
{
::OutputDebugString("[ViewWindow::thPlayFromCurrent] ENTER\n");
ThreadPriority prevPriority=setThreadPriority(PureThread::ThreadPriorityHighest);
mTabPage->playFromCurrent();
setThreadPriority(prevPriority);
enablePlaySelect(true);
::OutputDebugString("[ViewWindow::thPlayFromCurrent] LEAVE\n");
}
*/
// *** virtuals
void ViewWindow::preRegister(WNDCLASS &wndClass)
{
wndClass.style|=CS_SAVEBITS|CS_OWNDC;
wndClass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH);
wndClass.hCursor=::LoadCursor(processInstance(),MAKEINTRESOURCE(HARROW));
}
void ViewWindow::preCreate(MDICREATESTRUCT &createStruct)
{
createStruct.style=WS_SYSMENU|WS_CAPTION|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
}