// GUI_VisualStudioView.cpp // // (c)1998-2025 Codejock Software, All Rights Reserved. // // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN // CONSENT OF CODEJOCK SOFTWARE. // // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A // SINGLE COMPUTER. // // CONTACT INFORMATION: // support@codejock.com // http://www.codejock.com // ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "GUI_VisualStudio.h" #include "GUI_VisualStudioDoc.h" #include "GUI_VisualStudioView.h" #include "MainFrm.h" #ifdef _DEBUG # define new DEBUG_NEW #endif // CGUI_VisualStudioView IMPLEMENT_DYNCREATE(CGUI_VisualStudioView, CXTPSyntaxEditView) BEGIN_MESSAGE_MAP(CGUI_VisualStudioView, CXTPSyntaxEditView) ON_COMMAND(ID_EDIT_PASTE, OnEmptyCommand) ON_COMMAND(ID_EDIT_CUT, OnEmptyCommand) ON_COMMAND(ID_EDIT_COPY, OnEmptyCommand) ON_COMMAND(ID_EDIT_SELECT_ALL, OnEmptyCommand) ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEmptyCommand) ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEmptyCommand) ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEmptyCommand) ON_UPDATE_COMMAND_UI(ID_EDIT_SELECT_ALL, OnUpdateEmptyCommand) ON_COMMAND(ID_FILE_PRINT, OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview) ON_WM_CONTEXTMENU() ON_WM_CREATE() ON_MESSAGE(WM_XTP_SETCONTROLTHEME, OnSetControlTheme) END_MESSAGE_MAP() // CGUI_VisualStudioView construction/destruction CGUI_VisualStudioView::CGUI_VisualStudioView() : ParentView() , m_bLoadConfigOnce(TRUE) { GetEditCtrl().m_bUseMonitor = TRUE; } CGUI_VisualStudioView::~CGUI_VisualStudioView() { } BOOL CGUI_VisualStudioView::PreCreateWindow(CREATESTRUCT& cs) { if (!ParentView::PreCreateWindow(cs)) return FALSE; return TRUE; } void CGUI_VisualStudioView::OnDraw(CDC* pDC) { UNREFERENCED_PARAMETER(pDC); CGUI_VisualStudioDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: add draw code for native data here } int CGUI_VisualStudioView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (ParentView::OnCreate(lpCreateStruct) == -1) { TRACE(_T("ERROR: Unable to create application view.\n")); return -1; } ModifyStyleEx(WS_EX_CLIENTEDGE, 0); RefreshColors(); return 0; } void CGUI_VisualStudioView::OnEmptyCommand() { AfxMessageBox(_T("TODO: Add your command handler")); } void CGUI_VisualStudioView::OnUpdateEmptyCommand(CCmdUI* pCmdUI) { _ASSERTE(NULL != pCmdUI); pCmdUI->Enable(TRUE); } BOOL CGUI_VisualStudioView::OnPreparePrinting(CPrintInfo* pInfo) { return DoPreparePrinting(pInfo); } void CGUI_VisualStudioView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) { ParentView::OnBeginPrinting(pDC, pInfo); // TODO: add extra initialization before printing } void CGUI_VisualStudioView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo) { // TODO: add cleanup after printing ParentView::OnEndPrinting(pDC, pInfo); } void CGUI_VisualStudioView::OnInitialUpdate() // called first time after construct { static BOOL bLoadOnce = FALSE; if (!bLoadOnce && GetDocument()->GetPathName().IsEmpty()) { bLoadOnce = TRUE; CStdioFile file; CFileException ex; if (!file.Open(CXTPSyntaxEditCtrl::GetModulePath() + _T("res\\SampleFrm.txt"), CFile::modeRead | CFile::shareDenyWrite, &ex)) { TCHAR szError[1024]; ex.GetErrorMessage(szError, 1024); TRACE(_T("Couldn't open source file: %s\n"), szError); } else { CString sText, sLine; while (file.ReadString(sLine)) { sText += sLine + _T("\r\n"); } GetEditCtrl().SetWindowText(sText); } GetDocument()->SetModifiedFlag(FALSE); // set the font size. CFont* pFont = GetEditCtrl().GetFont(); if (pFont) { LOGFONT lf; pFont->GetLogFont(&lf); lf.lfHeight = -XTP_DPI_Y(11); GetEditCtrl().SetFontIndirect(&lf, TRUE); } } } LRESULT CGUI_VisualStudioView::OnSetControlTheme(WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); UNREFERENCED_PARAMETER(wParam); RefreshColors(); return 0; } void CGUI_VisualStudioView::RefreshColors() { CString strModulePath = CXTPSyntaxEditCtrl::GetModulePath(); CString strIniPath = strModulePath + _T("\\EditConfig\\SyntaxEdit.ini"); CString strSchema = strModulePath + _T("\\EditConfig\\Schemas\\_cpp.schclass"); COLORREF clrLineNumberTextColor = RGB(43, 145, 175); COLORREF clrBackColor = RGB(255, 255, 255); BOOL bSelMargin = TRUE; XTPPaintTheme nTheme = theApp.GetAppTheme(); CString strThemeSettings = theApp.GetAppThemeSettings(); switch (nTheme) { case xtpThemeVisualStudio6: case xtpThemeVisualStudio2005: case xtpThemeVisualStudio2008: case xtpThemeVisualStudio2010: { strIniPath = strModulePath + _T("\\EditConfig\\SyntaxEdit.ini"); strSchema = strModulePath + _T("\\EditConfig\\Schemas\\_cpp.schclass"); clrLineNumberTextColor = RGB(43, 145, 175); clrBackColor = RGB(255, 255, 255); bSelMargin = TRUE; break; } case xtpThemeVisualStudio2012Light: { strIniPath = strModulePath + _T("\\EditConfig\\SyntaxEditLight.ini"); strSchema = strModulePath + _T("\\EditConfig\\Schemas\\_cppLight.schclass"); clrLineNumberTextColor = RGB(43, 145, 175); clrBackColor = RGB(246, 246, 246); bSelMargin = TRUE; break; } case xtpThemeVisualStudio2012Dark: { strIniPath = strModulePath + _T("\\EditConfig\\SyntaxEditDark.ini"); strSchema = strModulePath + _T("\\EditConfig\\Schemas\\_cppDark.schclass"); clrLineNumberTextColor = RGB(86, 156, 214); clrBackColor = RGB(28, 28, 28); bSelMargin = TRUE; break; } case xtpThemeVisualStudio2015: case xtpThemeVisualStudio2017: case xtpThemeVisualStudio2019: case xtpThemeVisualStudio2022: { if (0 < strThemeSettings.Find(_T("BLUE"))) { strIniPath = strModulePath + _T("\\EditConfig\\SyntaxEdit.ini"); strSchema = strModulePath + _T("\\EditConfig\\Schemas\\_cppLight.schclass"); clrLineNumberTextColor = RGB(43, 145, 175); clrBackColor = RGB(246, 246, 246); bSelMargin = TRUE; } else if (0 < strThemeSettings.Find(_T("BLUEEXTRA"))) { strIniPath = strModulePath + _T("\\EditConfig\\SyntaxEdit.ini"); strSchema = strModulePath + _T("\\EditConfig\\Schemas\\_cppLight.schclass"); clrLineNumberTextColor = RGB(43, 145, 175); clrBackColor = RGB(246, 246, 246); bSelMargin = TRUE; } else if (0 < strThemeSettings.Find(_T("LIGHT"))) { strIniPath = strModulePath + _T("\\EditConfig\\SyntaxEditLight.ini"); strSchema = strModulePath + _T("\\EditConfig\\Schemas\\_cppLight.schclass"); clrLineNumberTextColor = RGB(43, 145, 175); clrBackColor = RGB(246, 246, 246); bSelMargin = TRUE; } else if (0 < strThemeSettings.Find(_T("DARK"))) { strIniPath = strModulePath + _T("\\EditConfig\\SyntaxEditDark.ini"); strSchema = strModulePath + _T("\\EditConfig\\Schemas\\_cppDark.schclass"); clrLineNumberTextColor = RGB(86, 156, 214); clrBackColor = RGB(28, 28, 28); bSelMargin = FALSE; } break; } default: ASSERT(FALSE); break; } GetEditCtrl().GetPaintManager()->SetBackColor(clrBackColor, TRUE); GetEditCtrl().GetPaintManager()->SetLineNumberBackColor(clrBackColor, TRUE); GetEditCtrl().GetPaintManager()->SetLineNumberTextColor(clrLineNumberTextColor, TRUE); GetEditCtrl().SetSelMargin(bSelMargin); if (GetEditCtrl().GetEditBuffer()) GetEditCtrl().GetEditBuffer()->SetFileExt(_T(".cpp")); if (m_bLoadConfigOnce) { m_bLoadConfigOnce = FALSE; GetEditCtrl().SetConfigFile(strIniPath, TRUE); } else { if (!ReadFileLines(strIniPath, m_strIniData)) AfxMessageBox(_T("Could not load .INI file data"), MB_ICONERROR); if (!ReadFileLines(strSchema, m_strSchemaData)) AfxMessageBox(_T("Could not load .SCHCLASS file data"), MB_ICONERROR); if (!m_strIniData.IsEmpty() && !m_strSchemaData.IsEmpty()) GetEditCtrl().SetSyntaxAndColorScheme(m_strSchemaData, m_strIniData, FALSE, FALSE); } } BOOL CGUI_VisualStudioView::ReadFileLines(LPCTSTR lpzFilePath, CString& strLines) const { _ASSERTE(NULL != lpzFilePath); BOOL bSuccess = FALSE; CStdioFile file; CString strLine; strLines.Empty(); if (file.Open(lpzFilePath, CFile::modeRead)) { while (file.ReadString(strLine)) { strLines += strLine + _T("\r\n"); } file.Close(); bSuccess = TRUE; } return bSuccess; } CMainFrame* CGUI_VisualStudioView::GetMainFrame() const { CMainFrame* pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, AfxGetMainWnd()); ASSERT_VALID(pMainFrame); return pMainFrame; } // CGUI_VisualStudioView message handlers void CGUI_VisualStudioView::OnContextMenu(CWnd* pWnd, CPoint point) { UNREFERENCED_PARAMETER(pWnd); if (-1 == point.x && -1 == point.y) { // Keystroke invocation CXTPClientRect rect(this); ClientToScreen(rect); point = rect.TopLeft(); } CMenu menu; VERIFY(menu.LoadMenu(IDR_POPUP_EDIT)); CMenu* pPopupMenu = menu.GetSubMenu(0); _ASSERTE(NULL != pPopupMenu); GetMainFrame()->GetCommandBars()->TrackPopupMenuEx(pPopupMenu, TPM_RIGHTBUTTON, point.x, point.y); } #ifdef _DEBUG void CGUI_VisualStudioView::AssertValid() const { CXTPSyntaxEditView::AssertValid(); } void CGUI_VisualStudioView::Dump(CDumpContext& dc) const { CXTPSyntaxEditView::Dump(dc); } CGUI_VisualStudioDoc* CGUI_VisualStudioView::GetDocument() const { CGUI_VisualStudioDoc* pDoc = DYNAMIC_DOWNCAST(CGUI_VisualStudioDoc, m_pDocument); ASSERT_VALID(pDoc); return pDoc; } #endif //_DEBUG