// XTPSyntaxEditDoc.cpp : implementation file // // This file is a part of the XTREME TOOLKIT PRO MFC class library. // (c)1998-2012 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 SYNTAX EDIT 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 "Resource.h" // common includes #include "Common/XTPSmartPtrInternalT.h" #include "Common/XTPColorManager.h" #include "Common/XTPDrawHelpers.h" // syntax editor includes #include "XTPSyntaxEditDefines.h" #include "XTPSyntaxEditStruct.h" #include "XTPSyntaxEditBufferManager.h" #include "XTPSyntaxEditCtrl.h" #include "XTPSyntaxEditDoc.h" #include "XTPSyntaxEditView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CXTPSyntaxEditDoc IMPLEMENT_DYNCREATE(CXTPSyntaxEditDoc, CDocument) BEGIN_MESSAGE_MAP(CXTPSyntaxEditDoc, CDocument) //{{AFX_MSG_MAP(CXTPSyntaxEditDoc) //}}AFX_MSG_MAP END_MESSAGE_MAP() CXTPSyntaxEditDoc::CXTPSyntaxEditDoc() : m_bAutoReload(FALSE) , m_bNewFile(TRUE) , m_bOpened(FALSE) , m_bDocCreated(FALSE) , m_iTopRow(1) , m_iHScrollPos(0) , m_bReloading(FALSE) { ::ZeroMemory(&m_curFileData, sizeof(WIN32_FIND_DATA)); CWinApp* pWinApp = AfxGetApp(); if (pWinApp != NULL) { m_bAutoReload = pWinApp->GetProfileInt( XTP_EDIT_REG_SETTINGS, XTP_EDIT_REG_AUTORELOAD, m_bAutoReload); } m_ptrDataMan = NULL; } CXTPSyntaxEditDoc::~CXTPSyntaxEditDoc() { if (m_ptrDataMan) { CMDTARGET_RELEASE(m_ptrDataMan); } } BOOL CXTPSyntaxEditDoc::IsReadonly() { return ((m_curFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) == FILE_ATTRIBUTE_READONLY); } BOOL CXTPSyntaxEditDoc::SaveFileData(LPCTSTR lpszPathName) { HANDLE hFind = ::FindFirstFile(lpszPathName, &m_curFileData); if (hFind == INVALID_HANDLE_VALUE) return FALSE; ::FindClose(hFind); // if (IsReadonly()) // { // TRACE(_T("Cannot write to a read only file")); // return FALSE; // } return TRUE; } BOOL CXTPSyntaxEditDoc::OnNewDocument() { CWaitCursor wait; if (!CDocument::OnNewDocument()) { return FALSE; } wait.Restore(); m_bOpened = FALSE; m_bNewFile = TRUE; m_bDocCreated = TRUE; ::ZeroMemory(&m_curFileData, sizeof(WIN32_FIND_DATA)); if (m_ptrDataMan) { m_ptrDataMan->InsertText(_T(""), 1, 1, FALSE); } UpdateAllViews(NULL, xtpEditHintRefreshView); return TRUE; } BOOL CXTPSyntaxEditDoc::OnOpenDocument(LPCTSTR lpszPathName) { CWaitCursor wait; m_bNewFile = FALSE; BOOL bRes = CDocument::OnOpenDocument(lpszPathName); wait.Restore(); if (bRes) { UpdateAllViews(NULL, xtpEditHintRefreshView); bRes = SaveFileData(lpszPathName); } if (!bRes && m_bAutoDelete) { delete this; } return bRes; } BOOL CXTPSyntaxEditDoc::OnSaveDocument(LPCTSTR lpszPathName) { CWaitCursor wait; if (!CDocument::OnSaveDocument(lpszPathName)) return FALSE; if (!SaveFileData(lpszPathName)) return FALSE; UpdateAllViews(NULL, xtpEditHintRefreshView); return TRUE; } BOOL CXTPSyntaxEditDoc::ReOpen() { return OnOpenDocument(GetPathName()); } void CXTPSyntaxEditDoc::OnCloseDocument() { CWaitCursor wait; if (m_ptrDataMan) { m_ptrDataMan->Close(); } CDocument::OnCloseDocument(); } ///////////////////////////////////////////////////////////////////////////// // CXTPSyntaxEditDoc serialization void CXTPSyntaxEditDoc::Serialize(CArchive& ar) { if (m_ptrDataMan) { CWaitCursor wait; m_ptrDataMan->Serialize(ar); } } ///////////////////////////////////////////////////////////////////////////// // CXTPSyntaxEditDoc diagnostics #ifdef _DEBUG void CXTPSyntaxEditDoc::AssertValid() const { CDocument::AssertValid(); } void CXTPSyntaxEditDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CXTPSyntaxEditDoc commands void CXTPSyntaxEditDoc::OnChangedViewList() { if (!m_bDocCreated) return; int iTopRow = 1; BOOL bFirst = TRUE; POSITION pos = GetFirstViewPosition(); while (pos) { CXTPSyntaxEditView *pView = (CXTPSyntaxEditView *)GetNextView(pos); if (!pView->IsKindOf(RUNTIME_CLASS(CXTPSyntaxEditView))) continue; if (bFirst) { iTopRow = pView->GetTopRow(); bFirst = FALSE; } else { pView->SetTopRow(iTopRow); } } CDocument::OnChangedViewList(); } void CXTPSyntaxEditDoc::SetDataManager(CXTPSyntaxEditBufferManager *pDataMan) { CMDTARGET_RELEASE(m_ptrDataMan); m_ptrDataMan = pDataMan; CMDTARGET_ADDREF(m_ptrDataMan); } void CXTPSyntaxEditDoc::SetConfigFile(LPCTSTR szPath) { if (m_ptrDataMan) { m_ptrDataMan->SetConfigFile(szPath); } } BOOL CXTPSyntaxEditDoc::CheckFileModified(LPCTSTR lpszPathName) { if (!GetAutoReload()) return FALSE; WIN32_FIND_DATA newFileData; HANDLE hFound = ::FindFirstFile(lpszPathName, &newFileData); if (hFound != INVALID_HANDLE_VALUE) { ::FindClose(hFound); // If file attributes have changed or file write time has changed, reload file. if (!m_bReloading && ( (m_curFileData.ftLastWriteTime.dwLowDateTime != newFileData.ftLastWriteTime.dwLowDateTime) || (m_curFileData.ftLastWriteTime.dwHighDateTime != newFileData.ftLastWriteTime.dwHighDateTime) || (m_curFileData.dwFileAttributes != newFileData.dwFileAttributes))) { m_bReloading = TRUE; CString csWarning; csWarning.Format(XTP_IDS_EDIT_MSG_WARN_RELOAD, lpszPathName); if (AfxMessageBox(csWarning, MB_YESNO|MB_ICONQUESTION) == IDNO) { m_bReloading = FALSE; return FALSE; } if (ReOpen()) { ::memcpy(&m_curFileData, &newFileData, sizeof(WIN32_FIND_DATA)); m_bReloading = FALSE; return TRUE; } } } return FALSE; } BOOL CXTPSyntaxEditDoc::SetAutoReload(BOOL bAutoReload, BOOL bUpdateReg/*=FALSE*/) { m_bAutoReload = bAutoReload; if (bUpdateReg) { CWinApp* pWinApp = AfxGetApp(); if (pWinApp != NULL) { if (pWinApp->WriteProfileInt(XTP_EDIT_REG_SETTINGS, XTP_EDIT_REG_AUTORELOAD, (int)bAutoReload)) return TRUE; } return FALSE; } return TRUE; } CXTPSyntaxEditView* CXTPSyntaxEditDoc::GetFirstView() { POSITION pos = GetFirstViewPosition(); return DYNAMIC_DOWNCAST(CXTPSyntaxEditView, GetNextView(pos)); }