/*!
	カーソル行をクリップボードにコピーする

	@date 2007.10.08 ryoji 新規(Command_COPY()から処理抜き出し)
*/
void CEditView::CopyCurLine(
	bool			bAddCRLFWhenCopy,		//!< [in] 折り返し位置に改行コードを挿入するか?
	EEolType		neweol,					//!< [in] コピーするときのEOL。
	bool			bEnableLineModePaste	//!< [in] ラインモード貼り付けを可能にする
)
{
	if( GetSelectionInfo().IsTextSelected() ){
		return;
	}

	const CLayout*	pcLayout = m_pcEditDoc->m_cLayoutMgr.SearchLineByLayoutY( GetCaret().GetCaretLayoutPos().y );
	if( NULL == pcLayout ){
		return;
	}

	/* クリップボードに入れるべきテキストデータを、cmemBufに格納する */
	CNativeW cmemBuf;
	cmemBuf.SetString( pcLayout->GetPtr(), pcLayout->GetLengthWithoutEOL() );
	if( pcLayout->GetLayoutEol().GetLen() != 0 ){
		cmemBuf.AppendString(
			( neweol == EOL_UNKNOWN ) ?
				pcLayout->GetLayoutEol().GetValue2() : CEol(neweol).GetValue2()
		);
	}else if( bAddCRLFWhenCopy ){	// 2007.10.08 ryoji bAddCRLFWhenCopy対応処理追加
		cmemBuf.AppendString(
			( neweol == EOL_UNKNOWN ) ?
				WCODE::CRLF : CEol(neweol).GetValue2()
		);
	}

	/* クリップボードにデータcmemBufの内容を設定 */
	BOOL bSetResult = MySetClipboardData(
		cmemBuf.GetStringPtr(),
		cmemBuf.GetStringLength(),
		false,
		bEnableLineModePaste
	);
	if( !bSetResult ){
		ErrorBeep();
	}
}
Esempio n. 2
0
bool CopyToClipboard(LPCWSTR asText)
{
	INT_PTR cch = asText ? lstrlen(asText) : -1;
	if (cch < 0)
		return false;


	bool bCopied = false;


	if (MyOpenClipboard(L"CopyToClipboard"))
	{
		struct Data
		{
			size_t idx;
			HGLOBAL Hglbs[4];
			UINT Formats[4];

			void AddAnsiOem(LPCWSTR asText, INT_PTR cch, UINT cp)
			{
				HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (cch + 1) * sizeof(char));
				if (!hglbCopy)
					return;
				char* lpstrCopy = (char*)GlobalLock(hglbCopy);
				if (!lpstrCopy)
				{
					GlobalFree(hglbCopy);
					return;
				}

				int iLen = WideCharToMultiByte(cp, 0, asText, cch+1, lpstrCopy, cch+1, NULL, NULL);
				GlobalUnlock(hglbCopy);
				if (iLen < 1)
				{
					GlobalFree(hglbCopy);
				}
				else
				{
					Hglbs[idx] = hglbCopy;
					Formats[idx] = (cp == CP_ACP) ? CF_TEXT : CF_OEMTEXT;
					idx++;
				}
			};

			void AddData(const void* ptrData, size_t cbDataSize, UINT Format)
			{
				HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, cbDataSize);
				if (!hglbCopy)
					return;
				LPVOID lpbCopy = GlobalLock(hglbCopy);
				if (!lpbCopy)
				{
					GlobalFree(hglbCopy);
					return;
				}

				memmove(lpbCopy, ptrData, cbDataSize);
				GlobalUnlock(hglbCopy);
				Hglbs[idx] = hglbCopy;
				Formats[idx] = Format;
				idx++;
			};
		} data = {};

		if (gpSet->isCTSForceLocale)
		{
			data.AddAnsiOem(asText, cch, CP_ACP);
			data.AddAnsiOem(asText, cch, CP_OEMCP);
			_ASSERTE(sizeof(gpSet->isCTSForceLocale)==sizeof(DWORD));
			data.AddData(&gpSet->isCTSForceLocale, sizeof(gpSet->isCTSForceLocale), CF_LOCALE);
		}

		// And CF_UNICODE
		data.AddData(asText, (cch + 1) * sizeof(*asText), CF_UNICODETEXT);

		_ASSERTE(data.idx <= countof(data.Hglbs));

		if (data.idx)
		{
			EmptyClipboard();
		}

		for (size_t f = 0; f < data.idx; f++)
		{
			if (MySetClipboardData(data.Formats[f], data.Hglbs[f]) != NULL)
				bCopied = true;
			else
				GlobalFree(data.Hglbs[f]);
		}

		MyCloseClipboard();
	}

	return bCopied;
}