#include #include #include //#include //#include //#include #include #include #include #include #include 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; }