📄 tomdoc.cpp
字号:
if(pCount)
*pCount = i;
if(Count <= 0) // Note: for Count <= 0, for
{ // loop does nothing, since
if(Count < 0)
Count = DEFAULT_UNDO_SIZE;
i = HandleSetUndoLimit(Count);
}
return i == Count ? NOERROR : S_FALSE;
}
/*
* ITextDocument::Unfreeze(long *pCount)
*
* @mfunc
* Method to decrement freeze count. If this count goes to zero,
* screen updating is enabled. This method cannot decrement the
* count below zero.
*
* @rdesc
* HRESULT = (screen updating enabled) ? NOERROR : S_FALSE
*
* @devnote
* The display maintains its own private reference count which may
* temporarily exceed the reference count of this method. So even
* if this method indicates that the display is unfrozen, it may be
* for a while longer.
*/
STDMETHODIMP CTxtEdit::Unfreeze (
long *pCount) //@parm Out parm to receive updated freeze count
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::Unfreeze");
#ifdef FUTURE
if(_cFreeze)
{
AssertSz(_pdp && _pdp->IsFrozen(),
"CTxtEdit::Unfreeze: screen not frozen but expected to be");
_cFreeze--;
_pdp->Thaw();
}
if(pCount)
*pCount = _cFreeze;
return _cFreeze ? S_FALSE : NOERROR;
#endif
return E_NOTIMPL;
}
//----------------------- ITextDocument Helper Functions -----------------------
/*
* ITextDocument::CloseFile ()
*
* @mfunc
* Method that closes the current document. If changes have been made
* in the current document since the last save and document file
* information exists, the current document is saved.
*
* @rdesc
* HRESULT = NOERROR
*/
HRESULT CTxtEdit::CloseFile (BOOL bSave)
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::Close");
CDocInfo *pDocInfo = _pDocInfo;
if(pDocInfo)
{
if(bSave) // Save current file if
Save(NULL, 0, 0); // any changes made
// FUTURE(BradO): This code is very similar to the destructor code.
// We have a problem here in that some of the CDocInfo information
// should persist from Open to Close to Open (ex. default tab stop)
// mixed with other per-Open/Close info. A better job of abstracting
// these two types of info would really clean up this code.
if(pDocInfo->pName)
{
pSysFreeString(pDocInfo->pName); // Free filename BSTR
pDocInfo->pName = NULL;
}
if(pDocInfo->hFile)
{
CloseHandle(pDocInfo->hFile); // Close file if open
pDocInfo->hFile = NULL;
}
pDocInfo->wFlags = 0;
pDocInfo->wCpg = 0;
pDocInfo->lcid = 0;
pDocInfo->lcidfe = 0;
if(pDocInfo->lpstrLeadingPunct)
{
FreePv(pDocInfo->lpstrLeadingPunct);
pDocInfo->lpstrLeadingPunct = NULL;
}
if(pDocInfo->lpstrFollowingPunct)
{
FreePv(pDocInfo->lpstrFollowingPunct);
pDocInfo->lpstrFollowingPunct = NULL;
}
}
return NOERROR;
}
/*
* SetDefaultLCID (lcid)
*
* @mfunc
* Property set method that sets the default LCID
*
* @rdesc
* HRESULT = NOERROR
*
* @comm
* This property should be part of TOM
*/
HRESULT CTxtEdit::SetDefaultLCID (
LCID lcid) //@parm New default LCID value
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::SetDefaultLCID");
CDocInfo *pDocInfo = GetDocInfo();
if(!pDocInfo) // Doc info doesn't exist
return E_OUTOFMEMORY;
pDocInfo->lcid = lcid;
return NOERROR;
}
/*
* GetDefaultLCID (pLCID)
*
* @mfunc
* Property get method that gets the default LCID
*
* @rdesc
* HRESULT = (!pLCID) ? E_INVALIDARG : NOERROR
*/
HRESULT CTxtEdit::GetDefaultLCID (
LCID *pLCID) //@parm Out parm with default LCID value
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::GetDefaultLCID");
if(!pLCID)
return E_INVALIDARG;
CDocInfo *pDocInfo = GetDocInfo();
if(!pDocInfo) // Doc info doesn't exist
return E_OUTOFMEMORY;
*pLCID = _pDocInfo->lcid;
return NOERROR;
}
/*
* SetDefaultLCIDFE (lcid)
*
* @mfunc
* Property set method that sets the default FE LCID
*
* @rdesc
* HRESULT = NOERROR
*
* @comm
* This property should be part of TOM
*/
HRESULT CTxtEdit::SetDefaultLCIDFE (
LCID lcid) //@parm New default LCID value
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::SetDefaultLCIDFE");
CDocInfo *pDocInfo = GetDocInfo();
if(!pDocInfo) // Doc info doesn't exist
return E_OUTOFMEMORY;
pDocInfo->lcidfe = lcid;
return NOERROR;
}
/*
* GetDefaultLCIDFE (pLCID)
*
* @mfunc
* Property get method that gets the default FE LCID
*
* @rdesc
* HRESULT = (!pLCID) ? E_INVALIDARG : NOERROR
*/
HRESULT CTxtEdit::GetDefaultLCIDFE (
LCID *pLCID) //@parm Out parm with default LCID value
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::GetDefaultLCID");
if(!pLCID)
return E_INVALIDARG;
CDocInfo *pDocInfo = GetDocInfo();
if(!pDocInfo) // Doc info doesn't exist
return E_OUTOFMEMORY;
*pLCID = _pDocInfo->lcidfe;
return NOERROR;
}
/*
* CTxtEdit::SetDocumentType(bDocType)
*
* @mfunc
* Property set method that sets the document's type (none-\ltrdoc-\rtldoc)
*
* @rdesc
* HRESULT = NOERROR
*/
HRESULT CTxtEdit::SetDocumentType (
LONG DocType) //@parm New document-type value
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::SetDocumentType");
CDocInfo *pDocInfo = GetDocInfo();
if(!pDocInfo) // Doc info doesn't exist
return E_OUTOFMEMORY;
pDocInfo->bDocType = (BYTE)DocType;
return NOERROR;
}
/*
* GetDocumentType (pDocType)
*
* @mfunc
* Property get method that gets the document type
*
* @rdesc
* HRESULT = (!pDocType) ? E_INVALIDARG : NOERROR
*/
HRESULT CTxtEdit::GetDocumentType (
LONG *pDocType) //@parm Out parm with document type value
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::GetDocumentType");
if(!pDocType)
return E_INVALIDARG;
CDocInfo *pDocInfo = GetDocInfo();
if(!pDocInfo) // Doc info doesn't exist
return E_OUTOFMEMORY;
*pDocType = _pDocInfo->bDocType;
return NOERROR;
}
/*
* CTxtEdit::GetLeadingPunct (plpstrLeadingPunct)
*
* @mfunc
* Retrieve leading kinsoku punctuation for document
*
* @rdesc
* HRESULT = (!<p plpstrLeadingPunct>) ? E_INVALIDARG :
* (no leading punct) ? S_FALSE :
* (if not enough RAM) ? E_OUTOFMEMORY : NOERROR
*/
HRESULT CTxtEdit::GetLeadingPunct (
LPWSTR * plpstrLeadingPunct) //@parm Out parm to receive leading
// kinsoku punctuation
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::GetLeadingPunct");
if(!plpstrLeadingPunct)
return E_INVALIDARG;
*plpstrLeadingPunct = NULL;
if(!_pDocInfo || !_pDocInfo->lpstrLeadingPunct)
return S_FALSE;
*plpstrLeadingPunct = _pDocInfo->lpstrLeadingPunct;
return NOERROR;
}
/*
* CTxtEdit::SetLeadingPunct (lpstrLeadingPunct)
*
* @mfunc
* Set leading kinsoku punctuation for document
*
* @rdesc
* HRESULT = (if not enough RAM) ? E_OUTOFMEMORY : NOERROR
*/
HRESULT CTxtEdit::SetLeadingPunct (
LPWSTR lpstrLeadingPunct) //@parm In parm containing leading
// kinsoku punctuation
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::SetLeadingPunct");
CDocInfo *pDocInfo = GetDocInfo();
if(!pDocInfo)
return E_OUTOFMEMORY;
if(pDocInfo->lpstrLeadingPunct)
{
FreePv(pDocInfo->lpstrLeadingPunct);
}
if(lpstrLeadingPunct && *lpstrLeadingPunct)
{
pDocInfo->lpstrLeadingPunct =
(WCHAR *)PvAlloc((wcslen(lpstrLeadingPunct) + 1) * sizeof(WCHAR),
GMEM_ZEROINIT);
if(!pDocInfo->lpstrLeadingPunct)
return E_OUTOFMEMORY;
wcscpy(pDocInfo->lpstrLeadingPunct, lpstrLeadingPunct);
}
else
{
pDocInfo->lpstrLeadingPunct = NULL;
}
return NOERROR;
}
/*
* CTxtEdit::GetFollowingPunct (plpstrFollowingPunct)
*
* @mfunc
* Retrieve following kinsoku punctuation for document
*
* @rdesc
* HRESULT = (!<p plpstrFollowingPunct>) ? E_INVALIDARG :
* (no following punct) ? S_FALSE :
* (if not enough RAM) ? E_OUTOFMEMORY : NOERROR
*/
HRESULT CTxtEdit::GetFollowingPunct (
LPWSTR * plpstrFollowingPunct) //@parm Out parm to receive following
// kinsoku punctuation
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::GetFollowingPunct");
if(!plpstrFollowingPunct)
return E_INVALIDARG;
*plpstrFollowingPunct = NULL;
if(!_pDocInfo || !_pDocInfo->lpstrFollowingPunct)
return S_FALSE;
*plpstrFollowingPunct = _pDocInfo->lpstrFollowingPunct;
return NOERROR;
}
/*
* CTxtEdit::SetFollowingPunct (lpstrFollowingPunct)
*
* @mfunc
* Set following kinsoku punctuation for document
*
* @rdesc
* HRESULT = (if not enough RAM) ? E_OUTOFMEMORY : NOERROR
*/
HRESULT CTxtEdit::SetFollowingPunct (
LPWSTR lpstrFollowingPunct) //@parm In parm containing following
// kinsoku punctuation
{
TRACEBEGIN(TRCSUBSYSTOM, TRCSCOPEEXTERN, "CTxtEdit::SetFollowingPunct");
CDocInfo *pDocInfo = GetDocInfo();
if(!pDocInfo)
return E_OUTOFMEMORY;
if(pDocInfo->lpstrFollowingPunct)
{
FreePv(pDocInfo->lpstrFollowingPunct);
}
if(lpstrFollowingPunct && *lpstrFollowingPunct)
{
pDocInfo->lpstrFollowingPunct =
(WCHAR *)PvAlloc((wcslen(lpstrFollowingPunct) + 1) * sizeof(WCHAR),
GMEM_ZEROINIT);
if(!pDocInfo->lpstrFollowingPunct)
return E_OUTOFMEMORY;
wcscpy(pDocInfo->lpstrFollowingPunct, lpstrFollowingPunct);
}
else
{
pDocInfo->lpstrFollowingPunct = NULL;
}
return NOERROR;
}
/*
* CTxtEdit::InitDocInfo()
*
* @mfunc constructor for the docinfo class
*/
HRESULT CTxtEdit::InitDocInfo()
{
_wZoomNumerator = _wZoomDenominator = 0;
if(_pDocInfo)
{
_pDocInfo->InitDocInfo();
return NOERROR;
}
return GetDocInfo() ? NOERROR : E_OUTOFMEMORY;
}
//----------------------- CDocInfo related Functions -----------------------
/*
* CDocInfo::InitDocInfo()
*
* @mfunc constructor for the docinfo class
*/
void CDocInfo::InitDocInfo()
{
wCpg = GetACP();
lcid = GetSystemDefaultLCID();
if(IsFELCID(lcid))
{
lcidfe = lcid;
lcid = MAKELCID(sLanguageEnglishUS, SORT_DEFAULT);
}
dwDefaultTabStop = lDefaultTab;
bDocType = 0;
}
/*
* CDocInfo::~CDocInfo
*
* @mfunc desctructor for the docinfo class
*/
CDocInfo::~CDocInfo()
{
if( pName )
{
pSysFreeString(pName);
pName = NULL;
}
if( hFile )
{
CloseHandle(hFile);
hFile = NULL;
}
if(lpstrLeadingPunct)
{
FreePv(lpstrLeadingPunct);
lpstrLeadingPunct = NULL;
}
if(lpstrFollowingPunct)
{
FreePv(lpstrFollowingPunct);
lpstrFollowingPunct = NULL;
}
}
/*
* CTxtEdit::GetDocInfo ()
*
* @mfunc
* If _pDocInfo is NULL, equate it to a new CDocInfo. In either case
* return _pDocInfo
*
* @rdesc
* CTxtEdit::_pDocInfo, the ptr to the CDocInfo object
*/
CDocInfo * CTxtEdit::GetDocInfo()
{
TRACEBEGIN(TRCSUBSYSEDIT, TRCSCOPEINTERN, "CTxtEdit::GetDocInfo");
if (!_pDocInfo)
_pDocInfo = new CDocInfo();
// It is the caller's responsiblity to notice that an error occurred
// in the allocation of the CDocInfo object.
return _pDocInfo;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -