Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

キーワードヘルプの説明文に"\n"を表示できるようにしたい。 #1399

Merged
Merged
23 changes: 5 additions & 18 deletions sakura_core/cmd/CViewCommander_CustMenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,33 +23,21 @@
/* 右クリックメニュー */
void CViewCommander::Command_MENU_RBUTTON( void )
{
int nId;
int nLength;
// HGLOBAL hgClip;
// char* pszClip;
int i;
/* ポップアップメニュー(右クリック) */
nId = m_pCommanderView->CreatePopUpMenu_R();
auto nId = m_pCommanderView->CreatePopUpMenu_R();
if( 0 == nId ){
return;
}
switch( nId ){
case IDM_COPYDICINFO:
{
nLength = m_pCommanderView->m_cTipWnd.m_cInfo.GetStringLength();
const WCHAR* pszStr = m_pCommanderView->m_cTipWnd.m_cInfo.GetStringPtr();
WCHAR* pszWork = _wcsdup( pszStr );
CNativeW cInfo = m_pCommanderView->m_cTipWnd.GetInfoText();

// 見た目と同じように、\n を CR+LFへ変換する
for( i = 0; i < nLength ; ++i){
if( pszWork[i] == L'\\' && pszWork[i + 1] == L'n'){
pszWork[i] = WCODE::CR;
pszWork[i + 1] = WCODE::LF;
}
}
cInfo.Replace( L"\n", L"\r\n" );
beru marked this conversation as resolved.
Show resolved Hide resolved

/* クリップボードにデータを設定 */
m_pCommanderView->MySetClipboardData( pszWork, nLength, false );
free( pszWork );
m_pCommanderView->MySetClipboardData( cInfo.GetStringPtr(), cInfo.GetStringLength(), false );

break;
}
Expand All @@ -68,7 +56,6 @@ void CViewCommander::Command_MENU_RBUTTON( void )

default:
/* コマンドコードによる処理振り分け */
// HandleCommand( nId, true, 0, 0, 0, 0 );
::PostMessageCmd( GetMainWindow(), WM_COMMAND, MAKELONG( nId, 0 ), (LPARAM)NULL );
break;
}
Expand Down
118 changes: 55 additions & 63 deletions sakura_core/view/CEditView_Search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,85 +106,77 @@ BOOL CEditView::KeyWordHelpSearchDict( LID_SKH nID, POINT* po, RECT* rc )
*/
BOOL CEditView::KeySearchCore( const CNativeW* pcmemCurText )
{
CNativeW* pcmemRefKey;
int nCmpLen = STRNCMP_MAX; // 2006.04.10 fon
int nLine; // 2006.04.10 fon
/* tooltipバッファ初期化 */
beru marked this conversation as resolved.
Show resolved Hide resolved
m_cTipWnd.m_cInfo.Clear();

m_cTipWnd.m_cInfo.SetString( L"" ); /* tooltipバッファ初期化 */
/* 1行目にキーワード表示の場合 */
if(m_pTypeData->m_bUseKeyHelpKeyDisp){ /* キーワードも表示する */ // 2006.04.10 fon
m_cTipWnd.m_cInfo.AppendString( L"[ " );
m_cTipWnd.m_cInfo.AppendString( pcmemCurText->GetStringPtr() );
m_cTipWnd.m_cInfo.AppendString( L" ]" );
if( m_pTypeData->m_bUseKeyHelpKeyDisp ){ /* キーワードも表示する */ // 2006.04.10 fon
m_cTipWnd.m_cInfo.AppendStringF( L"[ %s ]", pcmemCurText->GetStringPtr() );
}
/* 途中まで一致を使う場合 */
if(m_pTypeData->m_bUseKeyHelpPrefix)
nCmpLen = wcslen( pcmemCurText->GetStringPtr() ); // 2006.04.10 fon

// 一致確認する最大文字数、途中まで一致を使う場合は短くする
const int nCmpLen = m_pTypeData->m_bUseKeyHelpPrefix
? std::min( STRNCMP_MAX, (int)::wcslen( pcmemCurText->GetStringPtr() ) )
: STRNCMP_MAX;

// 検索前にヒットフラグをクリアしておく
m_cTipWnd.m_KeyWasHit = FALSE;
for(int i =0 ; i < m_pTypeData->m_nKeyHelpNum; i++){ //最大数:MAX_KEYHELP_FILE

// 辞書ファイルの冊数、最大値は MAX_KEYHELP_FILE 。
const int nKeyHelpNum = std::min(m_pTypeData->m_nKeyHelpNum, (int)MAX_KEYHELP_FILE);

for( int i = 0; i < nKeyHelpNum; i++ ){
if( m_pTypeData->m_KeyHelpArr[i].m_bUse ){
// 2006.04.10 fon (nCmpLen,pcmemRefKey,nSearchLine)引数を追加
CNativeW* pcmemRefText;
int nSearchResult=m_cDicMgr.CDicMgr::Search(
CNativeW* pcmemRefKey = NULL;
CNativeW* pcmemRefText = NULL;
int nLine;
const auto& szPath = m_pTypeData->m_KeyHelpArr[i].m_szPath;
const int nSearchResult = m_cDicMgr.CDicMgr::Search(
pcmemCurText->GetStringPtr(),
nCmpLen,
&pcmemRefKey,
&pcmemRefText,
m_pTypeData->m_KeyHelpArr[i].m_szPath,
szPath,
&nLine
);
if(nSearchResult){
/* 該当するキーがある */
LPWSTR pszWork = pcmemRefText->GetStringPtr();

/* 該当するキーがある */
if( nSearchResult ){
// バッファが空でなければseparator挿入
if( m_cTipWnd.GetInfoText().GetStringLength() != 0 ){
m_cTipWnd.m_cInfo.AppendString( L"\n--------------------\n" );
}

/* 有効になっている辞書を全部なめて、ヒットの都度説明の継ぎ増し */
if(m_pTypeData->m_bUseKeyHelpAllSearch){ /* ヒットした次の辞書も検索 */ // 2006.04.10 fon
/* バッファに前のデータが詰まっていたらseparator挿入 */
if(m_cTipWnd.m_cInfo.GetStringLength() != 0)
m_cTipWnd.m_cInfo.AppendString( LS(STR_ERR_DLGEDITVW5) );
else
m_cTipWnd.m_cInfo.AppendString( LS(STR_ERR_DLGEDITVW6) ); /* 先頭の場合 */
/* 辞書のパス挿入 */
{
WCHAR szFile[MAX_PATH];
// 2013.05.08 表示するのはファイル名(拡張子なし)のみにする
_wsplitpath( m_pTypeData->m_KeyHelpArr[i].m_szPath, NULL, NULL, szFile, NULL );
m_cTipWnd.m_cInfo.AppendString( szFile );
}
m_cTipWnd.m_cInfo.AppendString( L"\n" );
/* 前方一致でヒットした単語を挿入 */
if(m_pTypeData->m_bUseKeyHelpPrefix){ /* 選択範囲で前方一致検索 */
m_cTipWnd.m_cInfo.AppendString( pcmemRefKey->GetStringPtr() );
m_cTipWnd.m_cInfo.AppendString( L" >>\n" );
}/* 調査した「意味」を挿入 */
m_cTipWnd.m_cInfo.AppendString( pszWork );
delete pcmemRefText;
delete pcmemRefKey; // 2006.07.02 genta
/* タグジャンプ用の情報を残す */
if(!m_cTipWnd.m_KeyWasHit){
m_cTipWnd.m_nSearchDict=i; /* 辞書を開くとき最初にヒットした辞書を開く */
m_cTipWnd.m_nSearchLine=nLine;
m_cTipWnd.m_KeyWasHit = TRUE;
}
if( m_pTypeData->m_bUseKeyHelpAllSearch ){ /* ヒットした次の辞書も検索 */
/* 複数辞書をなめるので辞書のパス挿入、表示するのはファイル名(拡張子なし)のみ */
WCHAR szFile[MAX_PATH];
_wsplitpath( szPath, NULL, NULL, szFile, NULL );
m_cTipWnd.m_cInfo.AppendStringF( L"■%s\n", szFile );
}

/* 前方一致でヒットした単語を挿入 */
if( m_pTypeData->m_bUseKeyHelpPrefix ){ /* 選択範囲で前方一致検索 */
m_cTipWnd.m_cInfo.AppendStringF(L"%s >>\n", pcmemRefKey->GetStringPtr() );
}
else{ /* 最初のヒット項目のみ返す場合 */
/* キーワードが入っていたらseparator挿入 */
if(m_cTipWnd.m_cInfo.GetStringLength() != 0)
m_cTipWnd.m_cInfo.AppendString( L"\n--------------------\n" );

/* 前方一致でヒットした単語を挿入 */
if(m_pTypeData->m_bUseKeyHelpPrefix){ /* 選択範囲で前方一致検索 */
m_cTipWnd.m_cInfo.AppendString( pcmemRefKey->GetStringPtr() );
m_cTipWnd.m_cInfo.AppendString( L" >>\n" );
}

/* 調査した「意味」を挿入 */
m_cTipWnd.m_cInfo.AppendString( pszWork );
delete pcmemRefText;
delete pcmemRefKey; // 2006.07.02 genta
/* 調査した「意味」を挿入 */
m_cTipWnd.m_cInfo.AppendString( UnEscapeInfoText( *pcmemRefText ) );

/* 最初のヒット項目のみ返す場合、または、初回ヒットの場合 */
if( !m_pTypeData->m_bUseKeyHelpAllSearch
|| !m_cTipWnd.m_KeyWasHit ){
/* タグジャンプ用の情報を残す */
m_cTipWnd.m_nSearchDict=i;
m_cTipWnd.m_nSearchLine=nLine;
m_cTipWnd.m_nSearchDict = i;
m_cTipWnd.m_nSearchLine = nLine;
m_cTipWnd.m_KeyWasHit = TRUE;
}

delete pcmemRefText;
delete pcmemRefKey;

/* 最初のヒット項目のみ返す場合 */
if( !m_pTypeData->m_bUseKeyHelpAllSearch ){
return TRUE;
}
}
Expand Down
17 changes: 13 additions & 4 deletions sakura_core/window/CTipWnd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,14 @@
// ダミー文字列
static constexpr WCHAR szDummy[] = { L" " };

/* Tipの内容データを設定するためにエスケープ解除を行う */
const WCHAR* UnEscapeInfoText( CNativeW& cInfo )
beru marked this conversation as resolved.
Show resolved Hide resolved
{
cInfo.Replace( L"\\n", L"\n" );
cInfo.Replace( L"\\x53", L"\\" );
return cInfo.GetStringPtr();
}

/* CTipWndクラス デストラクタ */
CTipWnd::CTipWnd()
: CWnd(L"::CTipWnd")
Expand Down Expand Up @@ -105,6 +113,7 @@ void CTipWnd::Show( int nX, int nY, const WCHAR* szText, RECT* pRect )

if( NULL != szText ){
m_cInfo.SetString( szText );
UnEscapeInfoText( m_cInfo );
}

hdc = ::GetDC( GetHwnd() );
Expand Down Expand Up @@ -166,7 +175,7 @@ void CTipWnd::ComputeWindowSize(
const bool isEndOfText = ( pszText[i] == '\0' );
// iの位置にNUL終端、または"\n"がある場合
if ( isEndOfText
|| ( i + 1 < cchText && pszText[i] == '\\' && pszText[i + 1] == 'n' ) ) {
|| pszText[i] == '\n' ) {
// 計測結果を格納する矩形
CMyRect rc;
// 計測対象の文字列がブランクでない場合
Expand Down Expand Up @@ -197,7 +206,7 @@ void CTipWnd::ComputeWindowSize(
}

// 次の行の開始位置を設定する
nLineBgn = i + 2; // "\\n" の文字数
nLineBgn = i + 1; // "\n" の文字数
i = nLineBgn;
}else{
// 現在位置の文字がTCHAR単位で何文字に当たるか計算してインデックスを進める
Expand Down Expand Up @@ -247,7 +256,7 @@ void CTipWnd::DrawTipText(
const bool isEndOfText = ( pszText[i] == '\0' );
// iの位置にNUL終端、または"\n"がある場合
if ( isEndOfText
|| ( i + 1 < cchText && pszText[i] == '\\' && pszText[i + 1] == 'n' ) ) {
|| pszText[i] == '\n' ) {
int nHeight;
// 計測対象の文字列がブランクでない場合
if ( 0 < i - nLineBgn ) {
Expand All @@ -269,7 +278,7 @@ void CTipWnd::DrawTipText(
}

// 次の行の開始位置を設定する
nLineBgn = i + 2; // "\\n" の文字数
nLineBgn = i + 1; // "\n" の文字数
i = nLineBgn;
}else{
// 現在位置の文字がTCHAR単位で何文字に当たるか計算してインデックスを進める
Expand Down
11 changes: 10 additions & 1 deletion sakura_core/window/CTipWnd.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
class CTipWnd;

#include "CWnd.h"
#include "mem/CMemory.h"
#include "mem/CNativeW.h"

/*-----------------------------------------------------------------------
クラスの宣言
-----------------------------------------------------------------------*/
Expand Down Expand Up @@ -74,5 +75,13 @@ class CTipWnd final : public CWnd

/* 仮想関数 メッセージ処理 詳しくは実装を参照 */
LRESULT OnPaint(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) override;/* 描画処理 */

public:
/* Tipの内容データを取得する */
const CNativeW& GetInfoText() const { return m_cInfo; }
};

/* Tipの内容データを設定するためにエスケープ解除を行う */
const WCHAR* UnEscapeInfoText( CNativeW& cInfo );

#endif /* SAKURA_CTIPWND_E3DB6CF2_888C_42F5_953E_D923221F0B16_H_ */