//========================================================================= // FRMBSMN.cpp : implementation of the FRMBaseMenu class // This is a part of the CPA project. // // Version 1.0 // Creation date 11/12/96 // Revision date // // (c) Ubi Studios 1996 // // DO NOT MODIFY THAT FILE. IF SOMETHING NEEDS TO BE CHANGE, PLEASE CONTACT // VINCENT GRECO OR CHRISTOPHE BEAUDET. //========================================================================= #include "stdafx.h" #include "acp_base.h" #include "direct.h" #include "itf/CPARes.h" #include "errint.h" #include "mmgint.h" #include "itf/FRMBase.hpp" #include "itf/FRMBsMn.hpp" #include "itf/CPAProj.hpp" #include "itf/A3dkeyal.hpp" #include "itf/CustomID.h" #include "itf/CPASubM.hpp" #include "itf/CPAMWorl.hpp" #include "itf/CPAKaCnf.hpp" #include "itf/CoheMngr.hpp" #include "itf/CPACont.hpp" #include "itf/DEVSgl3D.hpp" #include "itf/stddllid.h" #include "itf/camdllb.hpp" #include "itf/cpainter.hpp" #include "itf/cpaspec.hpp" #include "SaveMngr.h" #include "itf/namemngr.hpp" //nclude "SCR_Lib.h" #ifdef ACTIVE_EDITOR #define M_GetObjectDLLList() (M_GetMainWorld()->GetListOfObjectDLLBase()) #define M_GetToolDLLList() (M_GetMainWorld()->GetListOfToolDLLBase()) #define M_GetEditorList() (M_GetMainWorld()->GetListOfEditorBase()) // #define M_PosMenuFile 0 #define M_PosMenuEdit 1 #define M_PosMenuEditor 2 #define M_PosMenuTool 3 //ANNECY Shaitan NewInterface 24/03/98 { #define M_PosMenu3DView 4 #define M_PosMenuSpecific 5 #define M_PosMenuPreference 6 //ENDANNECY Shaitan NewInterface } #define M_PosMenuHelp (m_oGeneralMenu.GetMenuItemCount() - 1) #define M_IsGeneralSubMenu(pMenu,Pos) ( (m_oGeneralMenu.GetSubMenu(Pos)) && (pMenu->m_hMenu == m_oGeneralMenu.GetSubMenu(Pos)->m_hMenu)) tdstEDTInfo g_stInterfaceInfo; ///////////////////////////////////////////////////////////////////////////// // FRMBaseMenu IMPLEMENT_DYNCREATE(FRMBaseMenu, FRMBase) BEGIN_MESSAGE_MAP(FRMBaseMenu, FRMBase) //{{AFX_MSG_MAP(FRMBaseMenu) ON_WM_CREATE() ON_WM_INITMENU() ON_WM_INITMENUPOPUP() ON_COMMAND(CPA_IDM_SAVEALL, OnSaveAll) ON_COMMAND(CPA_IDM_INITMAP, OnInitMap) ON_COMMAND(CPA_IDCB_UNDO, OnUndo) ON_COMMAND(CPA_IDCB_REDO, OnRedo) ON_COMMAND(CPA_IDCB_SAVEALL, OnSaveAll) ON_COMMAND(CPA_IDCB_OPTIONS, OnOptions) ON_WM_SYSCOMMAND() ON_WM_NCLBUTTONDBLCLK() ON_WM_DRAWITEM() ON_WM_ACTIVATE() ON_WM_ENTERMENULOOP() ON_WM_EXITMENULOOP() ON_WM_MOUSEWHEEL() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // FRMBaseMenu construction/destruction FRMBaseMenu::FRMBaseMenu() { //statement m_p_oEditSubMenu = new EDT_SubMenu(C_SubMenuEdit,C_EditMenuIDStart); m_p_oEditorSubMenu = new EDT_SubMenu(C_SubMenuEditor,C_EditorMenuIDStart); m_p_oToolSubMenu = new EDT_SubMenu(C_SubMenuTool,C_ToolMenuIDStart); //ANNECY Shaitan NewInterface 24/03/98 { m_p_o3DViewSubMenu = new EDT_SubMenu(C_SubMenu3DView,C_3DViewMenuIDStart); m_p_oSpecificSubMenu = new EDT_SubMenu(C_SubMenuSpecific,C_SpecificMenuIDStart); //ENDANNECY Shaitan NewInterface } m_p_oPrefSubMenu = new EDT_SubMenu(C_SubMenuPreference,C_PrefMenuIDStart); m_bEnableEditors = FALSE; mbWantSplit = FALSE; mbWantNew = FALSE; mbWantTile = FALSE; mbWantClose = FALSE; g_stInterfaceInfo.csName = "Interface"; g_stInterfaceInfo.csAuthor = "Chantal Oury"; g_stInterfaceInfo.csVersion = "V 6.0.4 31/03/99"; g_stInterfaceInfo.csFrenchHelpFile = "General.hlp"; g_stInterfaceInfo.csEnglishHelpFile = ""; } FRMBaseMenu::~FRMBaseMenu() { //statement delete m_p_oEditSubMenu; delete m_p_oEditorSubMenu; delete m_p_oToolSubMenu; //ANNECY Shaitan NewInterface 24/03/98 { delete m_p_o3DViewSubMenu; delete m_p_oSpecificSubMenu; //ENDANNECY Shaitan NewInterface } delete m_p_oPrefSubMenu; } void FRMBaseMenu::OnActivate(UINT State, CWnd *pOther, BOOL bMini) { if(pOther == NULL) { g_oBaseFrame.OnActivate(State, pOther, bMini); if(State != WA_INACTIVE) g_oBaseFrame.BringWindowToTop(); } else CFrameWnd::OnActivate(State, pOther, bMini); } //// CPA_Interface * FRMBaseMenu::GetInterface (void) { return GetMultiDevice()->GetInterface(); } //// BOOL FRMBaseMenu::CreateBase ( LPCTSTR _lpStr, int, int, CPA_MainWorld* _p_oMainWorld ) { BOOL Ret; CCreateContext stContext; stContext.m_pNewViewClass = RUNTIME_CLASS(DEV_MultiDevice3D); stContext.m_pCurrentDoc = M_GetMainWnd()->GetActiveView()->GetDocument(); Ret = FRMBase::CreateBase(_lpStr, 2, 2, _p_oMainWorld, &stContext); SetParent(&g_oBaseFrame); return Ret; } //// BOOL FRMBaseMenu::CreateBase(LPCTSTR _lpStr, CPA_MainWorld* _p_oMainWorld) { BOOL Ret; CCreateContext stContext; stContext.m_pNewViewClass = RUNTIME_CLASS(DEV_MultiDevice3D); stContext.m_pCurrentDoc = M_GetMainWnd()->GetActiveView()->GetDocument(); Ret = FRMBase::CreateBase(_lpStr, 2, 2, _p_oMainWorld, &stContext); SetParent(&g_oBaseFrame); return Ret; } //// typedef struct tdstUpdateStat_ { char a_szText[500]; int iType; } tdstUpdateStat; tdstUpdateStat g_a_UpdateStat[20]; afx_msg void FRMBaseMenu::OnDrawItem(int nID, LPDRAWITEMSTRUCT pSt) { if(*g_a_UpdateStat[pSt->itemID].a_szText) { CDC *pDC = m_oStatusBar.GetDC(); CBrush oBrush; CRect oRect; CFont xFnt, *xFntPrev = NULL; PLOGFONT plf = (PLOGFONT) LocalAlloc(LPTR, sizeof(LOGFONT)); lstrcpy(plf->lfFaceName, "Arial"); plf->lfWeight = (g_a_UpdateStat[pSt->itemID].iType == C_STATUS_NORMAL) ? FW_NORMAL : FW_BOLD; plf->lfHeight = 15; plf->lfEscapement = 0; if (xFnt.CreateFontIndirect(plf)) xFntPrev = pDC->SelectObject(&xFnt); switch(g_a_UpdateStat[pSt->itemID].iType) { case C_STATUS_NORMAL: pDC->SetTextColor(RGB(0, 0, 0)); oBrush.CreateSolidBrush(RGB(200, 200, 200)); break; case C_STATUS_WARNING: pDC->SetTextColor(RGB(255, 255, 255)); oBrush.CreateSolidBrush(RGB(0, 0, 100)); break; case C_STATUS_ERROR: pDC->SetTextColor(RGB(255, 255, 255)); oBrush.CreateSolidBrush(RGB(100, 0, 0)); break; } pDC->SetBkMode(TRANSPARENT); pDC->FillRect(&pSt->rcItem, &oBrush); oRect.left = pSt->rcItem.left + 5; oRect.top = pSt->rcItem.top - 1; oRect.right = pSt->rcItem.right; oRect.bottom = pSt->rcItem.bottom; pDC->DrawText(g_a_UpdateStat[pSt->itemID].a_szText, strlen(g_a_UpdateStat[pSt->itemID].a_szText), &oRect, DT_LEFT|DT_TOP|DT_EXTERNALLEADING); if ( xFntPrev ) { pDC->SelectObject(xFntPrev); xFnt.DeleteObject(); } //do not forget to free the memory for the font LocalFree(plf); // do not forget to release the Device context !!! m_oStatusBar . ReleaseDC (pDC); } } void FRMBaseMenu::UpdateStatus(char *_p_szString, int _iPane, int _iType) { CStatusBarCtrl &Stat = m_oStatusBar.GetStatusBarCtrl(); BOOL bCanDisplay = ::IsWindow(Stat.m_hWnd); /* if(_iType == C_STATUS_NORMAL) Stat.SetText(_p_szString, _iPane, 0); else { */ if(_p_szString) { strcpy(g_a_UpdateStat[_iPane].a_szText, _p_szString); g_a_UpdateStat[_iPane].iType = _iType; } else *g_a_UpdateStat[_iPane].a_szText = '\0'; if ( bCanDisplay ) Stat.SetText(_p_szString, _iPane, SBT_OWNERDRAW); // } if((_iType == C_STATUS_ERROR) && (_p_szString) && (*_p_szString)) ::Beep(100, 250); if ( bCanDisplay ) Stat.UpdateWindow(); } BOOL FRMBaseMenu::fn_bCanClose(void) { // Ask DLLs if it's ok to close if (M_GetListOfAllDLL()->CallAcceptToExit() == FALSE) return FALSE; // They are some datas not saved ? if(SCR_g_st_Ntfy_Array.uiNumValues) { if(MessageBox("Some datas have not been saved. Exit anyway ?", NULL, MB_ICONQUESTION|MB_YESNO) == IDNO) return FALSE; } // We can close return TRUE; } int FRMBaseMenu::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; // // Create status bar (from MFC to avoid size box) // ModifyStyle(WS_THICKFRAME, 0); m_oStatusBar.Create(this, WS_CHILD | CBRS_BOTTOM); ModifyStyle(0, WS_THICKFRAME); UINT ar[2] = {CPA_IDR_MAINFRAME, CPA_IDR_MAINFRAME}; m_oStatusBar.SetIndicators(ar, 2); m_oStatusBar.SetPaneInfo(0, CPA_IDR_MAINFRAME, SBPS_NORMAL, 170); m_oStatusBar.SetPaneInfo(1, CPA_IDR_MAINFRAME, SBPS_NOBORDERS|SBPS_STRETCH, 0); UpdateStatus(NULL, 0, C_STATUS_NORMAL); UpdateStatus(NULL, 1, C_STATUS_NORMAL); // // Create general tool bar. By default, init and hide. // if (!m_oGeneralDialogBar.Create(this, CPA_IDD_GENERALDIALOGBAR, CBRS_ALIGN_TOP, 5000)) { TRACE0("Failed to create dialog bar m_oGeneralDialogBar\n"); return -1; } m_oGeneralMenu.LoadMenu(CPA_IDM_GENERALMENU); return 0; } //// void FRMBaseMenu::OnNcLButtonDblClk(UINT nID, CPoint point) { if(M_bEditorsActive()) return; CFrameWnd::OnNcLButtonDblClk(nID, point); } //// void FRMBaseMenu::OnSysCommand(UINT nID, LPARAM lParam) { if(M_bEditorsActive()) { if ( (nID == SC_CLOSE) || (nID == SC_MAXIMIZE) || (nID == SC_MINIMIZE) || (nID == SC_RESTORE) ) return; } CFrameWnd::OnSysCommand(nID, lParam); } //// void FRMBaseMenu::fn_vOnActivate(void) { m_p_oMainWorld->fn_vSetCurrentFRMBaseMenu(this); } //// void FRMBaseMenu::fn_vInitGeneralMenuWithContext(void) { UINT uiSTATE; uiSTATE = M_bEditorsActive() ? MF_BYPOSITION|MF_ENABLED : MF_BYPOSITION|MF_GRAYED; m_oGeneralMenu.EnableMenuItem(M_PosMenuFile, uiSTATE); m_oGeneralMenu.EnableMenuItem(M_PosMenuEdit, uiSTATE); m_oGeneralMenu.EnableMenuItem(M_PosMenuEditor, uiSTATE); m_oGeneralMenu.EnableMenuItem(M_PosMenuTool, uiSTATE); //ANNECY Shaitan NewInterface 24/03/98 { m_oGeneralMenu.EnableMenuItem(M_PosMenu3DView, uiSTATE); m_oGeneralMenu.EnableMenuItem(M_PosMenuSpecific, uiSTATE); //ENDANNECY Shaitan NewInterface } m_oGeneralMenu.EnableMenuItem(M_PosMenuPreference, uiSTATE); m_oGeneralMenu.EnableMenuItem(M_PosMenuHelp, uiSTATE); } //// void FRMBaseMenu::OnUndo(void) { M_GetEditManager()->Undo(); fn_vInitGeneralDialogBarWithContext(); } void FRMBaseMenu::OnRedo(void) { M_GetEditManager()->Redo(); fn_vInitGeneralDialogBarWithContext(); } BOOL FRMBaseMenu::OnCommand(WPARAM _wParam, LPARAM _lParam) { UINT IDCmdMsg = LOWORD(_wParam); UINT IDRealCmdMsg; CPA_EditorBase *pOwner; //////////////////// //Begin Mircea Dunka 31 Aug 1998 - DialogBar interface (no notify!) UINT IDNotifyMsg = HIWORD(_wParam); if(IDNotifyMsg != 0) return TRUE; // Editor buttons if ((IDCmdMsg >= C_EditorButtonIDStart) && (IDCmdMsg < C_EditorButtonIDEnd)) { //I have to re-initialize the "editors" menu in order to use the buttons :) m_p_oEditorSubMenu->Clear(); // call Hierarchy Editor M_GetEditor()->fn_bDefineSubMenu(m_p_oEditorSubMenu); // call Objects DLLs AddItemToPopupMenu(m_p_oEditorSubMenu,(CPA_List*)M_GetObjectDLLList()); // call Tool DLLs AddItemToPopupMenu(m_p_oEditorSubMenu,(CPA_List*)M_GetToolDLLList()); //send the same command as the corresponding menu item IDCmdMsg = IDCmdMsg - C_EditorButtonIDStart + C_EditorMenuIDStart; m_p_oEditorSubMenu->_OnCommand(IDCmdMsg); return TRUE; } //end Mircea Dunka 31 Aug 1998 - DialogBar interface // Edit PopupMenu if ((IDCmdMsg >= C_EditMenuIDStart) && (IDCmdMsg < C_EditMenuIDEnd)) { // undo if (IDCmdMsg == C_EditMenuIDUndo ) { M_GetEditManager()->Undo(); fn_vInitGeneralDialogBarWithContext(); } // redo else if (IDCmdMsg == C_EditMenuIDRedo ) { M_GetEditManager()->Redo(); fn_vInitGeneralDialogBarWithContext(); } //ANNECY Shaitan NewInterface 24/03/98 { // Interface commands else if ((m_p_oEditSubMenu->fn_bFindCmdID(IDCmdMsg,&pOwner,&IDRealCmdMsg))&&(pOwner == NULL)) GetInterface()->_OnSubMenuCommand(m_p_oEditSubMenu, IDRealCmdMsg); // custom commands else //ENDANNECY Shaitan NewInterface } m_p_oEditSubMenu->_OnCommand(IDCmdMsg); // message processed return TRUE; } // Editor PopupMenu if ((IDCmdMsg >= C_EditorMenuIDStart) && (IDCmdMsg < C_EditorMenuIDEnd)) { m_p_oEditorSubMenu->_OnCommand(IDCmdMsg); return TRUE; } // Tools PopupMenu if ((IDCmdMsg >= C_ToolMenuIDStart) && (IDCmdMsg < C_ToolMenuIDEnd)) { //ANNECY Shaitan NewInterface 24/03/98 { // Interface commands if ((m_p_oToolSubMenu->fn_bFindCmdID(IDCmdMsg,&pOwner,&IDRealCmdMsg))&&(pOwner == NULL)) GetInterface()->_OnSubMenuCommand(m_p_oToolSubMenu, IDRealCmdMsg); // Editors commands else //ENDANNECY Shaitan NewInterface } m_p_oToolSubMenu->_OnCommand(IDCmdMsg); return TRUE; } //ANNECY Shaitan NewInterface 24/03/98 { // Load PopupMenu /* if ((IDCmdMsg >= C_LoadMenuIDStart) && (IDCmdMsg < C_LoadMenuIDEnd)) { m_p_oLoadSubMenu->_OnCommand(IDCmdMsg); return TRUE; } */ // 3DView PopupMenu if ((IDCmdMsg >= C_3DViewMenuIDStart) && (IDCmdMsg < C_3DViewMenuIDEnd)) { // Interface commands if ((m_p_o3DViewSubMenu->fn_bFindCmdID(IDCmdMsg,&pOwner,&IDRealCmdMsg))&&(pOwner == NULL)) GetInterface()->_OnSubMenuCommand(m_p_o3DViewSubMenu, IDRealCmdMsg); // Editors commands else m_p_o3DViewSubMenu->_OnCommand(IDCmdMsg); return TRUE; } // Specific PopupMenu if ((IDCmdMsg >= C_SpecificMenuIDStart) && (IDCmdMsg < C_SpecificMenuIDEnd)) { m_p_oSpecificSubMenu->_OnCommand(IDCmdMsg); return TRUE; } //ENDANNECY Shaitan NewInterface } // Preferences PopupMenu if ((IDCmdMsg >= C_PrefMenuIDStart) && (IDCmdMsg < C_PrefMenuIDEnd)) { // undo if (IDCmdMsg == C_PrefMenuIDStart ) GetInterface()->fn_vSaveDisplayMode(); else m_p_oPrefSubMenu->_OnCommand(IDCmdMsg); return TRUE; } // Help PopupMenu if ((IDCmdMsg >= C_HelpMenuIDStart) && (IDCmdMsg < C_HelpMenuIDEnd)) { fn_vActivateHelp(IDCmdMsg); return TRUE; } // send message to contact if ((GetMultiDevice())&&(GetMultiDevice()->GetContact())) GetMultiDevice()->GetContact()->_OnCommand(IDCmdMsg); // default handling return FRMBase::OnCommand(_wParam,_lParam); } //// void FRMBaseMenu::OnInitMenu(CMenu *_pMenu) { CFrameWnd::OnInitMenu(_pMenu); } //// void FRMBaseMenu::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { if( M_IsGeneralSubMenu(pPopupMenu,nIndex) ) { CString oEntryName; switch(nIndex) { case M_PosMenuEdit: m_p_oEditSubMenu->Clear(); // add Undo entry oEntryName = M_GetEditManager()->GetUndoName(); oEntryName += "\t"; oEntryName += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Undo")); m_p_oEditSubMenu->AddAnEntry((CPA_DLLBase*)NULL,(char*)(LPCTSTR)oEntryName,0,FALSE,M_GetEditManager()->CanUndo()); // add Redo entry oEntryName = M_GetEditManager()->GetRedoName(); oEntryName += "\t"; oEntryName += M_GetMainApp()->mp_oAppKeyboard->mfn_oConvertIniStringToKeyString((const CString*)&CString("Redo")); m_p_oEditSubMenu->AddAnEntry((CPA_DLLBase*)NULL,(char*)(LPCTSTR)oEntryName,0,FALSE,M_GetEditManager()->CanRedo()); m_p_oEditSubMenu->AddASeparator(); //ANNECY Shaitan NewInterface 24/03/98 { // interface GetInterface()->fn_bDefineSubMenu(m_p_oEditSubMenu); // Call Hierarchy Editor M_GetEditor()->fn_bDefineSubMenu(m_p_oEditSubMenu); //ENDANNECY Shaitan NewInterface } // Build menu m_p_oEditSubMenu->Build(pPopupMenu); break; case M_PosMenuEditor: m_p_oEditorSubMenu->Clear(); // call Hierarchy Editor M_GetEditor()->fn_bDefineSubMenu(m_p_oEditorSubMenu); m_p_oEditorSubMenu->AddASeparator(); // call Objects DLLs if( !AddItemToPopupMenu(m_p_oEditorSubMenu,(CPA_List*)M_GetObjectDLLList()) ) m_p_oEditorSubMenu->AddAnEntry((CPA_DLLBase*)NULL, "No object editor", 0, FALSE, FALSE); m_p_oEditorSubMenu->AddASeparator(); // call Tool DLLs if( !AddItemToPopupMenu(m_p_oEditorSubMenu,(CPA_List*)M_GetToolDLLList()) ) m_p_oEditorSubMenu->AddAnEntry((CPA_DLLBase*)NULL, "No tool editor", 0, FALSE, FALSE); m_p_oEditorSubMenu->Build(pPopupMenu); break; case M_PosMenuTool: m_p_oToolSubMenu->Clear(); //ANNECY Shaitan NewInterface 24/03/98 { // load submenu m_p_oLoadSubMenu = m_p_oToolSubMenu->fn_p_oGetNewSubMenu("Load",C_SubMenuLoad); // objects DLLs AddItemToPopupMenu(m_p_oLoadSubMenu,(CPA_List*)M_GetObjectDLLList()); // tool DLLs AddItemToPopupMenu(m_p_oLoadSubMenu,(CPA_List*)M_GetToolDLLList()); m_p_oToolSubMenu->AddASubMenu(m_p_oLoadSubMenu); // objects DLLs AddItemToPopupMenu(m_p_oToolSubMenu,(CPA_List*)M_GetObjectDLLList()); // tool DLLs AddItemToPopupMenu(m_p_oToolSubMenu,(CPA_List*)M_GetToolDLLList()); // interface entries GetInterface()->fn_bDefineSubMenu(m_p_oToolSubMenu); m_p_oToolSubMenu->Build(pPopupMenu); break; case M_PosMenu3DView: m_p_o3DViewSubMenu->Clear(); // objects DLLs AddItemToPopupMenu(m_p_o3DViewSubMenu,(CPA_List*)M_GetObjectDLLList()); // tool DLLs AddItemToPopupMenu(m_p_o3DViewSubMenu,(CPA_List*)M_GetToolDLLList()); m_p_o3DViewSubMenu->AddASeparator(); // hierarchy editor M_GetEditor()->fn_bDefineSubMenu(m_p_o3DViewSubMenu); // interface GetInterface()->fn_bDefineSubMenu(m_p_o3DViewSubMenu); m_p_o3DViewSubMenu->Build(pPopupMenu); break; case M_PosMenuSpecific: m_p_oSpecificSubMenu->Clear(); // only current editor if (!M_GetCurrentEditor()->fn_bDefineSubMenu(m_p_oSpecificSubMenu)) m_p_oSpecificSubMenu->AddAnEntry((CPA_DLLBase*)NULL, "No Specific Entry", 0, FALSE, FALSE); m_p_oSpecificSubMenu->Build(pPopupMenu); break; //ENDANNECY Shaitan NewInterface } case M_PosMenuPreference: m_p_oPrefSubMenu->Clear(); // add preference entry m_p_oPrefSubMenu->AddAnEntry((CPA_DLLBase*)NULL, "Save Display Mode", 0, FALSE, TRUE); m_p_oPrefSubMenu->AddASeparator(); // call current editor if (!M_GetCurrentEditor()->fn_bDefineSubMenu(m_p_oPrefSubMenu)) m_p_oPrefSubMenu->AddAnEntry((CPA_DLLBase*)NULL, "No Preferences", 0, FALSE, FALSE); m_p_oPrefSubMenu->Build(pPopupMenu); break; /* case M_PosMenuOption: if (M_GetEditor()->GetSpecificEditor()->GetDisplayMode() == E_dm_DrawWorld) { m_oGeneralMenu.GetSubMenu(M_PosMenuOption)->CheckMenuItem(CPA_IDCB_DISPLAYWORLD, MF_BYCOMMAND|MF_CHECKED); m_oGeneralMenu.GetSubMenu(M_PosMenuOption)->CheckMenuItem(CPA_IDCB_DISPLAYSECTOR, MF_BYCOMMAND|MF_UNCHECKED); } else { m_oGeneralMenu.GetSubMenu(M_PosMenuOption)->CheckMenuItem(CPA_IDCB_DISPLAYWORLD, MF_BYCOMMAND|MF_UNCHECKED); m_oGeneralMenu.GetSubMenu(M_PosMenuOption)->CheckMenuItem(CPA_IDCB_DISPLAYSECTOR, MF_BYCOMMAND|MF_CHECKED); } CFrameWnd::OnInitMenuPopup(pPopupMenu,nIndex,bSysMenu); break; */ default: if( nIndex == M_PosMenuHelp ) // M_PosMenuHelp not constant fn_vFillHelpMenu(pPopupMenu); else { CFrameWnd::OnInitMenuPopup(pPopupMenu,nIndex,bSysMenu); } } } } //// BOOL FRMBaseMenu::AddItemToPopupMenu(EDT_SubMenu* _pSubMenu,CPA_List* _p_oListOfDLL) { BOOL bAddEntries = FALSE; POSITION stPos = _p_oListOfDLL->GetHeadPosition(); while(stPos) { CPA_DLLBase *p_oDLL = _p_oListOfDLL->GetNext(stPos); bAddEntries |= p_oDLL->fn_bDefineSubMenu(_pSubMenu); } return bAddEntries; } //// void FRMBaseMenu::fn_vFillHelpMenu(CMenu *pPopupMenu) { // delete menu while( pPopupMenu -> GetMenuItemCount() ) pPopupMenu -> DeleteMenu( 0, MF_BYPOSITION ); // add entries UINT uiID = C_HelpMenuIDStart ; // add about... pPopupMenu -> AppendMenu( MF_STRING, uiID++, "About..." ); pPopupMenu -> AppendMenu( MF_SEPARATOR ); // add interface help UINT nFlags = MF_STRING + ( (g_stInterfaceInfo.csFrenchHelpFile.IsEmpty() && g_stInterfaceInfo.csEnglishHelpFile.IsEmpty() ) ? MF_GRAYED : MF_ENABLED ); pPopupMenu -> AppendMenu( nFlags, uiID++, g_stInterfaceInfo.csName ); // add context help POSITION stPos = M_GetEditorList() -> GetHeadPosition(); while( stPos ) { tdstEDTInfo *p_stInfo = M_GetEditorList() -> GetNext( stPos ) -> GetEditorInfo(); UINT nFlags = MF_STRING + ( ( p_stInfo -> csFrenchHelpFile . IsEmpty() && p_stInfo -> csEnglishHelpFile . IsEmpty()) ? MF_GRAYED : MF_ENABLED ); pPopupMenu -> AppendMenu( nFlags, uiID++, p_stInfo -> csName ); } } //// void FRMBaseMenu::fn_vActivateHelp(UINT IDCmdMsg) { if( IDCmdMsg == C_HelpMenuIDStart ) { // About entry M_GetMainApp() -> OnHelpAbout(); } else { tdstEDTInfo *p_stInfo; CString csHelpFile; if (IDCmdMsg == C_HelpMenuIDStart + 1) p_stInfo = &g_stInterfaceInfo; else { int iNumEditor = IDCmdMsg - C_HelpMenuIDStart - 2; POSITION stPos = M_GetEditorList() -> FindIndex( iNumEditor ); CPA_EditorBase *p_oEditor = M_GetEditorList() -> GetAt( stPos ); p_stInfo = p_oEditor -> GetEditorInfo(); } if ((GetInterface()->fn_csGetCurrentLanguage() == "French") || (GetInterface()->fn_csGetCurrentLanguage() == "Francais")) { if (!p_stInfo->csFrenchHelpFile.IsEmpty()) csHelpFile = CString(M_GetMainApp() -> m_csEditorDataPath) + "EditorHelp\\French\\" + p_stInfo -> csFrenchHelpFile; else csHelpFile = CString(M_GetMainApp() -> m_csEditorDataPath) + "EditorHelp\\English\\" + p_stInfo -> csEnglishHelpFile; } else { if (!p_stInfo->csEnglishHelpFile.IsEmpty()) csHelpFile = CString(M_GetMainApp() -> m_csEditorDataPath) + "EditorHelp\\English\\" + p_stInfo -> csEnglishHelpFile; else csHelpFile = CString(M_GetMainApp() -> m_csEditorDataPath) + "EditorHelp\\French\\" + p_stInfo -> csFrenchHelpFile; } ::WinHelp( M_GetMainWnd()->m_hWnd, csHelpFile, HELP_FINDER, 0 ); } } //// void FRMBaseMenu::OnInitMap(void) { M_GetListOfAllDLL()->CallBeforeEngine(); M_GetMainApp()->fn_vReinitCurrentMap(); GetInterface()->SetInitialState(TRUE); M_GetListOfAllDLL()->CallBeforeEditor(); } ////------------------- // Call to options ////------------------- void FRMBaseMenu::OnOptions(void) { GetInterface()->fn_vDoDialogOptions(); } ////------------------- // Call to save ////------------------- void FRMBaseMenu::OnSaveAll(void) { POSITION stPos; SetCursor(M_GetMainApp()->LoadStandardCursor(IDC_WAIT)); ////////////////////////////// // Generate modification file ////////////////////////////// /* { unsigned int uiPos; SCR_tdst_Ntfy_Description *p_stNtfy; FILE *p_xFile; char szMdfName[MAX_PATH]; char *p_szNotfy; // Compute modification file name (last and new) strcpy(szMdfName, (LPCTSTR) M_GetMainApp()->m_csEngineDataPath); if(szMdfName[strlen(szMdfName) - 1] != '\\') strcat(szMdfName, "\\"); strcat(szMdfName, "modiflst.txt"); // Append modification list p_xFile = fopen(szMdfName, "at"); if(p_xFile == NULL) { SetCursor(M_GetMainApp()->LoadStandardCursor(IDC_ARROW)); MessageBox("Unable to create modification file."); return; } uiPos = 0; SCR_M_DyAr_GetNextElement(SCR_tdst_Ntfy_Description, uiPos, p_stNtfy, SCR_g_st_Ntfy_Array); while(p_stNtfy) { p_szNotfy = strchr(p_stNtfy->a_szSectionName, '\\') + 1; fputs(p_szNotfy, p_xFile); fputc('\n', p_xFile); uiPos++; SCR_M_DyAr_GetNextElement(SCR_tdst_Ntfy_Description, uiPos, p_stNtfy, SCR_g_st_Ntfy_Array); } fclose(p_xFile); } */ // call fn_bAcceptToSave msg stPos = M_GetEditorList() -> GetHeadPosition(); while( stPos ) { if (!M_GetEditorList() -> GetNext( stPos ) -> fn_bAcceptToSave()) { SetCursor(M_GetMainApp()->LoadStandardCursor(IDC_ARROW)); return; } } // call fn_vBeforeSaveAll msg stPos = M_GetEditorList() -> GetHeadPosition(); while( stPos ) { M_GetEditorList() -> GetNext( stPos ) -> fn_vBeforeSaveAll(); } // call saving if (GetInterface()->GetNbObjectsRenamed() != 0) { g_oNameManager.fn_vWriteNameConflicts(); UpdateStatus("Objects were renamed during loading : your changes cannot be saved", C_STATUSPANE_INFOS, C_STATUS_ERROR); MessageBox ("Objects were renamed during loading : \nyour changes in all editors cannot be saved", "PROBLEM !", MB_OK|MB_ICONEXCLAMATION); SetCursor(M_GetMainApp()->LoadStandardCursor(IDC_ARROW)); return; } /* * save in a directory all file that will be modified * in order to be able to recuperate data that currently work */ if ( !SAVE_fn_bGenerateACopyOfFilesBeforeModification( ) ) { UpdateStatus("Save canceled", C_STATUSPANE_INFOS, C_STATUS_ERROR); SetCursor(M_GetMainApp()->LoadStandardCursor(IDC_ARROW)); return; } // save SCR_fn_v_SvL1_UpdateAllNotify(); // call fn_vAfterSaveAll msg stPos = M_GetEditorList() -> GetHeadPosition(); while( stPos ) { M_GetEditorList() -> GetNext( stPos ) -> fn_vAfterSaveAll(); } // RAZ Undos M_GetEditManager()->Reset(); fn_vInitGeneralDialogBarWithContext(); // warn user UpdateStatus("Save complete", C_STATUSPANE_INFOS, C_STATUS_NORMAL); SetCursor(M_GetMainApp()->LoadStandardCursor(IDC_ARROW)); } //// void FRMBaseMenu::fn_vUpdateCurrentEditor (CPA_EditorBase *pNewCurrentEditor) { if(pNewCurrentEditor) { UpdateStatus((char *) (LPCTSTR) (pNewCurrentEditor->GetCurrentEditorName()), C_STATUSPANE_EDITOR, C_STATUS_NORMAL); // Dunka 17.09.1998 - update tool bar (the editor buttons) fn_vUpdateEditorButtonsToolbar(); //end Mircea Dunka 17.09.1998 - update tool bar (the editor buttons) } else UpdateStatus(NULL, C_STATUSPANE_EDITOR, C_STATUS_NORMAL); } //=========================================================================== // Description: Init dialog bar regardless to context of application. // => Combo box will contain all editors that can be current // one. // Creation date: 11 Jun 96 // Author: CB //--------------------------------------------------------------------------- // Return void //--------------------------------------------------------------------------- // Revision date: // Author: //=========================================================================== void FRMBaseMenu::fn_vInitGeneralDialogBarWithContext(void) { CButton *pBut; // For engine pBut = (CButton *) m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_SWAPTOEDITORS); pBut->SetCheck(0); pBut->ShowWindow(SW_HIDE); pBut = (CButton *) m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_PAUSEENGINE); pBut->SetCheck(0); pBut->ShowWindow(SW_HIDE); pBut = (CButton *) m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_ONESTEPENGINE); pBut->SetCheck(0); pBut->ShowWindow(SW_HIDE); pBut = (CButton *) m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_FULLSCREEN); pBut->SetCheck(0); pBut->ShowWindow(SW_HIDE); // Undo/Redo pBut = (CButton *) m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_UNDO); pBut->SetCheck(0); pBut->ShowWindow(SW_SHOW); pBut->EnableWindow(M_GetEditManager()->CanUndo() ? TRUE : FALSE); pBut = (CButton *) m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_REDO); pBut->SetCheck(0); pBut->ShowWindow(SW_SHOW); pBut->EnableWindow(M_GetEditManager()->CanRedo() ? TRUE : FALSE); // Save pBut = (CButton *) m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_SAVEALL); pBut->ShowWindow(SW_SHOW); // Options pBut = (CButton *) m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_OPTIONS); pBut->ShowWindow(SW_SHOW); // Device ToolBar mfn_vUpdateDeviceToolBar(); } //=========================================================================== // Description: resets all buttons except for the current editor // Creation date: 8.09.98 // Author: Mircea Dunka //--------------------------------------------------------------------------- // Return BOOL Helps the user to see what he's doing //--------------------------------------------------------------------------- // Revision date: // Author: //=========================================================================== void FRMBaseMenu::fn_vUpdateEditorButtonsToolbar() { if(m_oGeneralDialogBar.m_oListOfEditorButtons.IsEmpty()) return; CPA_DLLBase* pEditor = M_GetCurrentEditor(); POSITION stPos; stPos = m_oGeneralDialogBar.m_oListOfEditorButtons.GetHeadPosition(); while(stPos) { CButton *pBut = (CButton*)m_oGeneralDialogBar.m_oListOfEditorButtons.GetNext(stPos); if( GetWindowLong(pBut->m_hWnd,GWL_USERDATA) == (long)pEditor) pBut->SetCheck(1); else pBut->SetCheck(0); } return; } //end Mircea Dunka void FRMBaseMenu::mfn_vUpdateDeviceToolBar(void) { if(!M_bEditorsActive()) { // m_oGeneralDialogBar.m_oDeviceToolbar.ShowWindow(SW_HIDE); return; } /* if(!mbWantSplit && !mbWantNew && !mbWantTile) m_oGeneralDialogBar.m_oDeviceToolbar.ShowWindow(SW_HIDE); else */ { // m_oGeneralDialogBar.m_oDeviceToolbar.ShowWindow(SW_SHOW); /* if(!mbWantNew) m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_OPENDEVICE, FALSE); if(!mbWantSplit) { m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_SPLITVERT, FALSE); m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_SPLITHORIZ, FALSE); } else { m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_SPLITVERT, TRUE); m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_SPLITHORIZ, TRUE); if(m_oSplitter.GetColumnCount() == 2) m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_SPLITVERT, FALSE); if(m_oSplitter.GetRowCount() == 2) m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_SPLITHORIZ, FALSE); } */ // Is there an additional active device ? BOOL bActiv = FALSE; for(int i = 1; (i < MAX_DEVICE) && (GetActiveView()); i++) { if(((DEV_MultiDevice *) GetActiveView())->IsActivDevice(i)) { bActiv = TRUE; break; } } /* m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_TILE_HORZ, TRUE); m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_TILE_VERT, TRUE); m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_CASCADE, TRUE); if((!mbWantTile) || (!bActiv)) { m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_TILE_HORZ, FALSE); m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_TILE_VERT, FALSE); m_oGeneralDialogBar.m_oDeviceToolbar.SetPermission(CPA_IDB_DEVICE_CASCADE, FALSE); } */ } } //=========================================================================== // Description: Show or hide the general interface of application in edit // mode (toolbar and menu) // Creation date: 11 Jun 96 // Author: CB //--------------------------------------------------------------------------- // BOOL Not used // Return void //--------------------------------------------------------------------------- // Revision date: // Author: //=========================================================================== void FRMBaseMenu::fn_vShowGeneralInterface(BOOL bMustShow) { // Menu if (bMustShow) { // Update menu regardless to context fn_vInitGeneralMenuWithContext(); // Menu SetMenu(&m_oGeneralMenu); } else { SetMenu(NULL); } // ToolBar if (bMustShow) { // Update menu and toolbar regardless to context fn_vInitGeneralDialogBarWithContext(); } m_oGeneralDialogBar.ShowWindow( bMustShow ? SW_SHOWNORMAL : SW_HIDE ); m_oStatusBar.ShowWindow( bMustShow ? SW_SHOWNORMAL : SW_HIDE ); RecalcLayout(); } void FRMBaseMenu::fn_vEnableEditors(BOOL _bCan) { if(!M_bEditorsActive()) { CButton *pBut; m_bEnableEditors = _bCan; pBut = (CButton *) m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_SWAPTOEDITORS); pBut->SetCheck(0); pBut->ShowWindow(m_bEnableEditors ? SW_SHOW : SW_HIDE); pBut = (CButton *) m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_PAUSEENGINE); pBut->ShowWindow(m_bEnableEditors ? SW_SHOW : SW_HIDE); pBut = (CButton *) m_oGeneralDialogBar.GetDlgItem(CPA_IDCB_FULLSCREEN); pBut->ShowWindow(m_bEnableEditors ? SW_SHOW : SW_HIDE); } } void FRMBaseMenu::OnEnterMenuLoop(BOOL bIsTrackPopupMenu) { g_bMouseLocked = TRUE; } void FRMBaseMenu::OnExitMenuLoop(BOOL bIsTrackPopupMenu) { g_bMouseLocked = FALSE; } /////////////////////// // For splitter /////////////////////// IMPLEMENT_DYNCREATE(FRMSplitter, CSplitterWnd) BEGIN_MESSAGE_MAP(FRMSplitter, CSplitterWnd) ON_WM_LBUTTONDOWN() ON_WM_PAINT() ON_WM_MOUSEWHEEL() END_MESSAGE_MAP() BOOL FRMBaseMenu::OnCreateClient(LPCREATESTRUCT _p_stStruct, CCreateContext *_p_stContext) { m_oSplitter.Create ( this, 2, 2, CSize(10, 10),//chbani _p_stContext, WS_CHILD|WS_VISIBLE|SPLS_DYNAMIC_SPLIT ); return TRUE; } BOOL FRMBaseMenu::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { return FALSE; } BOOL FRMSplitter::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { return FALSE; } void FRMSplitter::RecalcLayout(void) { if(!M_bEditorsActive() && M_GetMainApp()->m_bFlagTaken == FALSE) if (WaitForSingleObject(M_GetMainApp()->m_hDrawSem,10000) == WAIT_TIMEOUT) ASSERT(0); CSplitterWnd::RecalcLayout(); if(!M_bEditorsActive() && M_GetMainApp()->m_bFlagTaken == FALSE) ReleaseSemaphore(M_GetMainApp()->m_hDrawSem, 1, NULL); } void FRMSplitter::DrawObject(CWnd *_p_stParam) { DEV_MultiDevice3D *pMulti = (DEV_MultiDevice3D *) GetPane(0, 0); DEV_MultiDevice3D *pInit = (DEV_MultiDevice3D *) _p_stParam; DEV_MultiDevice3D *pSingle; pSingle = (DEV_MultiDevice3D *) GetPane(0, 0); if(pSingle != pInit) { if(M_bEditorsActive()) { pSingle->m_p_oMultiToDraw = _p_stParam; pSingle->DrawObject(); pSingle->m_p_oMultiToDraw = NULL; } } if(GetColumnCount() == 2) { pSingle = (DEV_MultiDevice3D *) GetPane(0, 1); if(pSingle != pInit) { pSingle->m_p_oMultiToDraw = _p_stParam; pSingle->DrawObject(); pSingle->m_p_oMultiToDraw = NULL; } } if(GetRowCount() == 2) { pSingle = (DEV_MultiDevice3D *) GetPane(1, 0); if(pSingle != pInit) { pSingle->m_p_oMultiToDraw = _p_stParam; pSingle->DrawObject(); pSingle->m_p_oMultiToDraw = NULL; } if(GetColumnCount() == 2) { pSingle = (DEV_MultiDevice3D *) GetPane(1, 1); if(pSingle != pInit) { pSingle->m_p_oMultiToDraw = _p_stParam; pSingle->DrawObject(); pSingle->m_p_oMultiToDraw = NULL; } } } } BOOL FRMSplitter::CreateView(int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext) { CPA_SuperObject *p_oCameraSO; CPA_CameraDLLBase *p_oCamDLL; if(row || col) { CSplitterWnd::CreateView(row, col, pViewClass, sizeInit, pContext); ((DEV_MultiDevice3D *) GetPane(row, col))->m_cIsAdditional = 1; // create the default camera for the device p_oCamDLL = (CPA_CameraDLLBase*) M_GetMainApp()->m_p_oMainWorld->GetObjectDLLWithName(C_szDLLCameraName); ASSERT(p_oCamDLL != NULL); p_oCameraSO = p_oCamDLL->CreateDefaultCamera(); p_oCamDLL->InsertCameraInHierarchy(p_oCameraSO); ASSERT(p_oCameraSO != NULL); ((DEV_ViewPort3D*)(((DEV_MultiDevice3D *)GetPane(row, col))->GetDevice(0)->GetViewPort()))->ChangeCamera(p_oCameraSO); GetParentFrame()->mfn_vUpdateDeviceToolBar(); } else { CSplitterWnd::CreateView(row, col, pViewClass, sizeInit, pContext); ((DEV_MultiDevice3D *) GetPane(row, col))->m_cIsAdditional = 0; } return TRUE; } void FRMSplitter::DeleteView(int iRow, int iCol) { CSplitterWnd::DeleteView(iRow, iCol); } void FRMSplitter::DeleteRow(int iRow) { CSplitterWnd::DeleteRow(iRow); GetParentFrame()->mfn_vUpdateDeviceToolBar(); } void FRMSplitter::DeleteColumn(int iCol) { CSplitterWnd::DeleteColumn(iCol); GetParentFrame()->mfn_vUpdateDeviceToolBar(); } void FRMSplitter::SetActivePane(int iRow, int iCol, CWnd *pWnd /*= NULL*/) { CSplitterWnd::SetActivePane(iRow, iCol, pWnd); } // To disable the deletion of the game view. void FRMSplitter::OnLButtonDown(UINT nFlags, CPoint pt) { CSplitterWnd::OnLButtonDown(0, pt); if(M_GetMainDevice() == (DEV_MultiDevice *) GetPane(0, 0)) { int hit = HitTest( pt ); if ((hit >= 201) && (hit <= 215)) { hit -= 201; m_rectLimit.left = 20; } else if ((hit >= 101) && (hit <= 115)) { hit -= 101; m_rectLimit.top = 20; } } } BOOL FRMSplitter::CreateScrollBarCtrl(DWORD dwStyle, UINT nID) { CSplitterWnd::CreateScrollBarCtrl(dwStyle, nID); return TRUE; } int FRMSplitter::HitTest(CPoint pt) const { return CSplitterWnd::HitTest(pt); } void FRMSplitter::OnPaint() { CSplitterWnd::OnPaint(); } void FRMSplitter::MakeSplit(int ht) { // start tracking StartTracking(ht); CRect rect; rect.left = m_rectTracker.Width() / 2; rect.top = m_rectTracker.Height() / 2; if (m_ptTrackOffset.y != 0) rect.top = m_rectTracker.top; if (m_ptTrackOffset.x != 0) rect.left = m_bTracking2 ? m_rectTracker2.left :m_rectTracker.left; rect.OffsetRect(-m_ptTrackOffset.x, -m_ptTrackOffset.y); ClientToScreen(&rect); SetCursorPos(rect.left, rect.top); GetParentFrame()->mfn_vUpdateDeviceToolBar(); } #endif //ACTIVE_EDITOR