// ★コメント未記入
/*-----------------------------------------------------------------------------
[名称]	MainFrm.cpp
[概要]	MainFrm.cpp : CMainFrame クラスの動作の定義を行います。
[備考]	CMainFrame のハンドル関数のみを抜き出してある。
[履歴]	2003-10-27	b031031 (3179)フリーカーソルON/OFFボタン追加(dincom)
		2003-11-08	b031130 (3146)タグジャンプ機能追加(moralog)
		2003-11-10	b031130 (3146)タグジャンプ情報取得関数追加(dincom)
		2003-12-06	b031130 (3146)タグジャンプ機能起動時AccessViolation修正(moralog)
		2003-12-20	b031228 (3146)タグジャンプキー割り当て(moralog)
		2003-12-28	b031228 (3146)空白を含むファイル名を許す(moralog)
		2004-01-30	b031228 (3367)Grep検索(dincom)
		2004-05-10	b031228 (3204)へぼぺとの連携(moralog)
		2004-05-10	b031228 (3751)文書名がショートファイルネームで表示される(moralog)
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// インクルード
//-----------------------------------------------------------------------------
#include "stdafx.h"
#define	APSTUDIO_INVOKED	// リソースIDの設定をちょっと覗き見たい
#include "resource.h"
#include "Shitarabian.h"
#include "MainFrm.h"
#include "Selection.h"
#include "Padding.h"

#include "ShitarabianView.h"
#include "BlankDlg.h"
#include "FlipDlg.h"
#include "Reverse.h"
#include "Common.h"
#include "ExeCommon.h"
#include "CommandMultiEdit.h"
#include "TokenReader.h"
#include "ShitarabianPlugInManager.h"
#include "ShitarabianPlugIn.h"
#include "PlugInDlg.h"
#include "DocumentIF.h"
#include "MacroExecute.h"
#include "ToolBarManager.h"
#include "ShitarabianDoc.h"
#include "SettingPath.h"
#include "GeneralSetting.h"
#include "ClipHistory.h"
#include "SettingCommonSheet.h"
#include "RelationDlg.h"
#include "BackUp.h"
#include <process.h>
#include "CharPaletteSettingDlg.h"
// ▼ (3146) BGN 2003.12.06 (moralog) 読み込み時、オプションを反映
#include "CommandCaret.h"
// ▲ (3146) END
// ▼ (3367) BGN 2004.1.30 (dincom)
#include "Grep.h"
// ▲ (3367) END
// ▼ (3204) BGN 2004.05.10 (moralog) ランチャツールバー追加、外部アプリとのIFにWM_COPYDATA
#include "Launcher.h"
#include "ShitarabianPostCommand.h"
// ▲ (3204) END
// ▼ (3344) BGN 2004.05.12 (moralog) Unicode文字描画自動化
#include "Unicoder.h"
// ▲ (3344) END

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CShitarabianApp theApp;
CStatusBar* m_pSystemStatusBar = NULL;


// ステータスバーのカスタマイズ
// http://www2u.biglobe.ne.jp/~factory7/tips/tips_001.html#L_TIP005


// ツールバーにテキストを表示する
// http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TBtext.html

// ▼ (3367) BGN 2004.1.30 (dincom) 
/*-----------------------------------------------------------------------------
[名称]	Grep処理
[機能]	Grep検索を行い、検索結果を文書に追加する。
[戻値]	UINT	HIT件数 [-] (-)
[備考]	ワーカスレッドとして使用。
		pThreadParam は TGrepRequest 。
-----------------------------------------------------------------------------*/
static UINT Grep(
	LPVOID pThreadParam	// <I> スレッドパラメータ [-] (-) :-
)
{
	TGrepRequest*	pParam = (TGrepRequest*)pThreadParam;

	// Grep条件を取得
	BOOL		bRegExp		= ( ( pParam->strCommand.Find( _T("R") , 1 ) ) > 0 );
	BOOL		bCaseCare	= ( ( pParam->strCommand.Find( _T("C") , 1 ) ) > 0 );
	BOOL		bToken		= ( ( pParam->strCommand.Find( _T("T") , 1 ) ) > 0 );
	BOOL		bSubFolder	= ( ( pParam->strCommand.Find( _T("S") , 1 ) ) > 0 );

	// Grepの実行
	CGrep	grep;
	grep.Execute(
		pParam->strFolder,
		pParam->strSubString,
		pParam->strFilter,
		bRegExp,
		bCaseCare,
		bToken,
		bSubFolder
	);
	delete pParam;
	return( 0 );
}
// ▲ (3367) END
/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_UPDATE_COMMAND_UI(IDM_VIEW_ZOOMIN, OnUpdateViewZoomin)
	ON_UPDATE_COMMAND_UI(IDM_VIEW_ZOOMOUT, OnUpdateViewZoomout)
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
	ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
	ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
	ON_COMMAND(IDM_SETTING_SETTING, OnSettingSetting)
	ON_UPDATE_COMMAND_UI(ID_FILE_PRINT, OnUpdateFilePrint)
	ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_PREVIEW, OnUpdateFilePrintPreview)
	ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_SETUP, OnUpdateFilePrintSetup)
	ON_COMMAND(IDM_HELP_URL, OnHelpUrl)
	ON_COMMAND(IDM_EDIT_DEMARK, OnEditDemark)
	ON_WM_CLOSE()
	ON_UPDATE_COMMAND_UI(IDM_EDIT_MODESELECT, OnUpdateEditModeselect)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_NEXTMARK, OnUpdateEditNextmark)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_FINDNEXT, OnUpdateEditFindnext)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_FINDPREV, OnUpdateEditFindprev)
	ON_UPDATE_COMMAND_UI(IDM_VIEW_FINDTOOLBAR, OnUpdateViewFindtoolbar)
	ON_COMMAND(IDM_VIEW_FINDTOOLBAR, OnViewFindtoolbar)
	ON_UPDATE_COMMAND_UI(IDC_COMBO_SUBSTRING, OnUpdateComboSubstring)
	ON_WM_SHOWWINDOW()
	ON_COMMAND(IDM_EDIT_MIRROR, OnEditMirror)
	ON_UPDATE_COMMAND_UI(ID_EDIT_CLIPHISTORY, OnUpdateEditClipHistory)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_MIRROR, OnUpdateEditMirror)
	ON_COMMAND(IDM_VIEW_EDITTOOLBAR, OnViewEdittoolbar)
	ON_UPDATE_COMMAND_UI(IDM_VIEW_EDITTOOLBAR, OnUpdateViewEdittoolbar)
	ON_COMMAND(IDM_EDIT_FLIP, OnEditFlip)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_FLIP, OnUpdateEditFlip)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_REMOVELASTBLANK, OnUpdateEditRemovelastblank)
	ON_COMMAND(IDM_EDIT_REMOVELASTBLANK, OnEditRemovelastblank)
	ON_COMMAND(IDM_SETTING_PLUGIN, OnSettingPlugin)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_ALLSELECT, OnUpdateEditAllselect)
	ON_COMMAND(IDM_EDIT_QUICKFIND, OnEditQuickfind)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_QUICKFIND, OnUpdateEditQuickfind)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_REPLACE, OnUpdateEditReplace)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_FIND, OnUpdateEditFind)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_MARK, OnUpdateEditMark)
	ON_COMMAND(IDM_EDIT_MARK, OnEditMark)
	ON_COMMAND(IDM_EDIT_NEXTMARK, OnEditNextmark)
	ON_COMMAND(IDM_EDIT_PREVMARK, OnEditPrevmark)
	ON_COMMAND(IDM_EDIT_CHARPALETTE, OnEditCharpalette)
	ON_COMMAND(ID_EDIT_CLIPHISTORY, OnEditClipHistory)
	ON_COMMAND(IDM_EDIT_ALLSELECT, OnEditAllselect)
	ON_COMMAND(IDM_VIEW_ZOOMIN, OnViewZoomin)
	ON_COMMAND(IDM_VIEW_ZOOMOUT, OnViewZoomout)
	ON_COMMAND(IDM_EDIT_FIND, OnEditFind)
	ON_COMMAND(IDM_EDIT_FINDNEXT, OnEditFindnext)
	ON_COMMAND(IDM_EDIT_FINDPREV, OnEditFindprev)
	ON_COMMAND(IDM_EDIT_REPLACE, OnEditReplace)
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
	ON_COMMAND(ID_EDIT_CUT, OnEditCut)
	ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
	ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_SHIFTLEFT, OnUpdateEditShiftleft)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_SHIFTRIGHT, OnUpdateEditShiftright)
	ON_COMMAND(IDM_EDIT_SHIFTLEFT, OnEditShiftleft)
	ON_COMMAND(IDM_EDIT_SHIFTRIGHT, OnEditShiftright)
	ON_COMMAND(IDM_VIEW_SETTINGTOOLBAR, OnViewSettingtoolbar)
	ON_UPDATE_COMMAND_UI(IDM_VIEW_SETTINGTOOLBAR, OnUpdateViewSettingtoolbar)
	ON_COMMAND(IDM_FIND_NEXTMODIFY, OnFindNextmodify)
	ON_COMMAND(IDM_FIND_PREVMODIFY, OnFindPrevmodify)
	ON_UPDATE_COMMAND_UI(IDM_FIND_NEXTMODIFY, OnUpdateFindNextmodify)
	ON_UPDATE_COMMAND_UI(IDM_FIND_PREVMODIFY, OnUpdateFindPrevmodify)
	ON_COMMAND(IDM_EDIT_LEFT, OnEditLeft)
	ON_COMMAND(IDM_EDIT_MID, OnEditMid)
	ON_COMMAND(IDM_EDIT_RIGHT, OnEditRight)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_LEFT, OnUpdateEditLeft)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_MID, OnUpdateEditMid)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_RIGHT, OnUpdateEditRight)
	ON_COMMAND(IDM_HELP_AAHEADLINE, OnHelpAaheadline)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_FILE_SAVE_AS_CUSTOM, OnFileSaveAs)
	ON_COMMAND(IDM_MAGIC_LINK, OnLink)
	ON_UPDATE_COMMAND_UI(IDM_MAGIC_LINK, OnUpdateLink)
	ON_COMMAND(IDM_MAGIC_COPY, OnMagicCopy)
	ON_UPDATE_COMMAND_UI(IDM_MAGIC_COPY, OnUpdateMagicCopy)
	ON_COMMAND(IDM_MAGIC_SELECT, OnMagicSelect)
	ON_UPDATE_COMMAND_UI(IDM_MAGIC_SELECT, OnUpdateMagicSelect)
	ON_COMMAND(IDM_EDIT_QUOTEPASTE, OnEditQuotepaste)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_QUOTEPASTE, OnUpdateEditQuotepaste)
	ON_COMMAND(IDM_SETTING_COMMON, OnSettingCommon)
	ON_WM_TIMER()
	ON_COMMAND(IDM_EDIT_CHARPALETTE_SETTING, OnEditCharpaletteSetting)
	ON_COMMAND(IDM_EDIT_FINDMAGICROD, OnEditFindmagicrod)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_FINDMAGICROD, OnUpdateEditFindmagicrod)
	ON_COMMAND(IDM_EDIT_FREECURSOL, OnEditFreecursol)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_FREECURSOL, OnUpdateEditFreecursol)
	ON_COMMAND(IDM_EDIT_FLIPCHAR, OnEditFlipchar)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_FLIPCHAR, OnUpdateEditFlipchar)
	ON_COMMAND(IDM_EDIT_MIRRORCHAR, OnEditMirrorchar)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_MIRRORCHAR, OnUpdateEditMirrorchar)
	ON_COMMAND(IDM_EDIT_BOXCHAR, OnEditBoxchar)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_BOXCHAR, OnUpdateEditBoxchar)
	ON_COMMAND(IDM_EDIT_UNICODE, OnEditUnicode)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_UNICODE, OnUpdateEditUnicode)
	ON_COMMAND(IDM_EDIT_TAGJUMP, OnEditTagjump)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_TAGJUMP, OnUpdateEditTagjump)
	ON_COMMAND(IDM_VIEW_EXTFINDTOOLBAR, OnViewExtfindtoolbar)
	ON_UPDATE_COMMAND_UI(IDM_VIEW_EXTFINDTOOLBAR, OnUpdateViewExtfindtoolbar)
	ON_COMMAND(IDM_EDIT_GREP, OnGrep)
	ON_COMMAND(IDM_VIEW_LAUNCHER, OnViewLauncher)
	ON_UPDATE_COMMAND_UI(IDM_VIEW_LAUNCHER, OnUpdateViewLauncher)
	ON_WM_COPYDATA()
	ON_WM_ACTIVATE()
	ON_UPDATE_COMMAND_UI(IDM_EDIT_PREVMARK, OnUpdateEditNextmark)
	ON_UPDATE_COMMAND_UI(IDM_EDIT_DEMARK, OnUpdateEditNextmark)
	ON_COMMAND(IDM_HELP_MANUAL, OnHelpManual)
	//}}AFX_MSG_MAP


	// DLLのツールバー用にとりあえず1000個のメッセージＩＤを確保してみる
	ON_COMMAND_RANGE(_APS_NEXT_COMMAND_VALUE, _APS_NEXT_COMMAND_VALUE+1000, CView::OnCmdMsg)
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // ステータス ライン インジケータ

    IDS_STATUS_OVERWRITE,
    IDS_STATUS_OPERATION,
/*
	ID_INDICATOR_KANA,
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
*/
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame クラスの構築/消滅

CMainFrame::CMainFrame()
:	m_bInitialized( FALSE )
{
	::SetMainFrame( this );

// ▼ (3204) BGN 2004.05.10 (moralog) 外部アプリとのＩＦをWM_COPYDATAメッセージとする
// ▽ original BGN
// ▼ (3367) BGN 2004.1.30 (dincom)
//	// 文字列挿入メッセージ
//	//m_UM_CommandMessageID = ::UniqueCommandID();
//	m_UM_CommandMessageID = ::RegisterWindowMessage( ::GetString(IDS_APPLICATION) );
// ▲ (3367) END
// △ original END
// ▲ (3204) END

}

CMainFrame::~CMainFrame()
{


}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// CGeneralSetting::GetInstance()のなかではいろんなダイアログにアクセスしてたりする。
// タイミングに要注意。

	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	EnableDocking(CBRS_ALIGN_ANY);

	// 標準編集ツールバー
	CRect	rcToolBar;
	{
		if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
			| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
			!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
		{
			return -1;      // 作成に失敗
		}
		m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
		DockControlBar(&m_wndToolBar);

		m_wndToolBar.GetWindowRect( &rcToolBar );
		DockControlBarLeftOf( &m_wndToolBar );
	}

	// ツールバーにテキストを表示する
	{
	// http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TBtext.html
	/*
		m_wndToolBar.SetButtonText(0, "新規ﾌｧｲﾙ");
		m_wndToolBar.SetButtonText(1, "開く");
		// ･･････  // 各ボタンにテキストを設定

		CRect rcButton;
		m_wndToolBar.GetItemRect(0, rcButton);
		m_wndToolBar.SetSizes(CSize(rcButton.Width(), rcButton.Height()), CSize(16, 15));
		ShowControlBar(&m_wndToolBar, TRUE, FALSE);
	*/
	}

	// 検索ツールバー
	{
		if (!m_wndFindBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
			| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
			!m_wndFindBar.LoadToolBar(IDR_FIND_TOOLBAR))
		{
			return -1;      // 作成に失敗
		}
		m_wndFindBar.EnableDocking(CBRS_ALIGN_ANY);
		DockControlBar(&m_wndFindBar);


// ▼ (3367) BGN 2004.3.13 (moralog) 
// ▽ Original BGN
//		int		idxPosition = 2;
// △ Original END
		int		idxPosition = 4;
// ▲ (3367) END
		m_wndFindBar.SetButtonInfo( idxPosition, IDC_COMBO_SUBSTRING, TBBS_SEPARATOR, 200 );

		CRect rect;
		m_wndFindBar.GetItemRect( idxPosition, &rect );
		rect.top = 3; //適当に位置を計算します
		rect.bottom = rect.top + 200;
		if( !m_wndSubStringCombo.Create(
						CBS_AUTOHSCROLL | 
						CBS_DROPDOWN|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL,
						rect, &m_wndFindBar, IDC_COMBO_SUBSTRING ) )
		{
			return  -1;
		}
		m_wndSubStringCombo.SetFont( CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT)));
		m_wndSubStringCombo.m_pMainFrame = this;
/*
// コンボボックスの裏にセパレータの縦線がばっちり見えてしまいます。
#include <afxtempl.h>
class CToolBarHoge : public CToolBar
{
public:
    CArray <int,int> m_arSeparators;    //ターゲットとなるボタンのＩＤ

void CToolBarHoge::OnPaint()
{
    // 描画用メッセージとして CWnd::OnPaint()を呼び出してはいけません
    if (m_bDelayedButtonLayout)
        Layout();

    CPaintDC dc(this);
    DefWindowProc(WM_PAINT,WPARAM(dc.m_hDC),0);

    //セパレータを塗りつぶします
    HBRUSH b = ::GetSysColorBrush( COLOR_3DFACE );
    if( b == NULL ) return;

    CBrush* pBrush = CBrush::FromHandle( b );
    CRect r;
    UINT nCmdID, nStyle;
    int iImage;
    if( pBrush )
    {
        for( int i=0; i<m_arSeparators.GetSize(); i++ )
        {
            int id = m_arSeparators.GetAt( i );
            nCmdID = 0;
            nStyle = 0;
            iImage = 0;
            GetButtonInfo( id, nCmdID, nStyle, iImage );
            if( nStyle != TBBS_SEPARATOR ) continue;

            GetItemRect( id, &r );
            dc.FillRect( &r, pBrush );
        }
    }
}

*/
		DockControlBarLeftOf( &m_wndFindBar );
	}

// ▼ (3146) BGN 2003.12.20 (moralog) 検索ツールバー分割
	// 拡張検索ツールバー
	{
		if (!m_wndExtFindBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
			| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
			!m_wndExtFindBar.LoadToolBar(IDR_EXTFIND_TOOLBAR))
		{
			return -1;      // 作成に失敗
		}
		m_wndExtFindBar.EnableDocking(CBRS_ALIGN_ANY);
		DockControlBar(&m_wndExtFindBar);

		DockControlBarLeftOf( &m_wndExtFindBar );
	}
// ▲ (3146) END

	// 編集ツールバー
	{
		if (!m_wndEditBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
			| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
			!m_wndEditBar.LoadToolBar(IDR_EDIT_TOOLBAR))
		{
			return -1;      // 作成に失敗
		}
		m_wndEditBar.EnableDocking(CBRS_ALIGN_ANY);
		DockControlBar(&m_wndEditBar);

		DockControlBarLeftOf( &m_wndEditBar );
	}

	// 設定ツールバー
	{
		if (!m_wndSettingBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
			| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
			!m_wndSettingBar.LoadToolBar(IDR_SETTING_TOOLBAR))
		{
			return -1;      // 作成に失敗
		}
		m_wndSettingBar.EnableDocking(CBRS_ALIGN_ANY);
		DockControlBar(&m_wndSettingBar);

// ▼ (3146) BGN 2003.12.20 (moralog) 拡大縮小ボタンを設定バーへ移動
		int		idxPosition = 3;
// ▽ oridinal BGN
//		int		idxPosition = 0;
// △ oridinal END
// ▲ (3146) END
		m_wndSettingBar.SetButtonInfo( idxPosition, IDC_COMBO_SUBSTRING, TBBS_SEPARATOR, 160 );

		CRect rect;
		m_wndSettingBar.GetItemRect( idxPosition, &rect );
		rect.top = 3; //適当に位置を計算します
		rect.bottom = rect.top + 200;
		if( !m_wndSettingNameCombo.Create(
						CBS_AUTOHSCROLL | 
						CBS_DROPDOWNLIST|WS_VISIBLE|WS_TABSTOP|WS_VSCROLL,
						rect, &m_wndSettingBar, IDC_COMBO_SETTINGNAME ) )
		{
			return  -1;
		}
		m_wndSettingNameCombo.SetFont( CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT)));
		m_wndSettingNameCombo.m_pMainFrame = this;
		DockControlBarLeftOf( &m_wndSettingBar );
	}

// ▼ (3204) BGN 2004.05.10 (moralog) ランチャツールバー追加 2004.06.09位置移動
	// ランチャツールバー
	{
		if (!m_wndLauncherBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
			| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
		{
			return -1;      // 作成に失敗
		}

		// ランチャ定義を読み込んで反映
		CLauncher::GetInstance()->Read();
		CLauncher::GetInstance()->CreateButtonz( &m_wndLauncherBar );

		m_wndLauncherBar.EnableDocking(CBRS_ALIGN_ANY);
		DockControlBar(&m_wndLauncherBar);

		DockControlBarLeftOf( &m_wndLauncherBar );

		if ( CLauncher::GetInstance()->GetLaunchDefine()->GetSize() <= 0 )
		{
			ShowControlBar( &m_wndLauncherBar, FALSE, 0 );
		}
	}
// ▲ (3204) END



	// ステータスバー
	{
		if (!m_wndStatusBar.Create(this) ||
			!m_wndStatusBar.SetIndicators(indicators,
			  sizeof(indicators)/sizeof(UINT)))
		{
			return -1;      // 作成に失敗
		}
		m_pSystemStatusBar = &m_wndStatusBar;
	}

	// ほかのダイアログにアイコンを設定する
	{
		m_dlgFinder.Create( IDD_FINDER, this );
		m_dlgReplacer.Create( IDD_REPLACER, this );
		m_dlgProgress.Create( IDD_PROGRESS, this );

		// ▼ (3367) BGN 2004.2.05 (dincom) 
		m_dlgGrep.Create( IDD_GREP , this );
		m_dlgGrepProgress.Create( IDD_GREP_PROGRESS , this );
		// ▲ (3367) END

		HICON hIcon = theApp.LoadIcon( IDR_MAINFRAME );
		m_dlgFinder.SendMessage( WM_SETICON, ICON_BIG, (LPARAM)hIcon );
		m_dlgReplacer.SendMessage( WM_SETICON, ICON_BIG, (LPARAM)hIcon );
		m_dlgProgress.SendMessage( WM_SETICON, ICON_BIG, (LPARAM)hIcon );

		// ▼ (3367) BGN 2004.2.05 (dincom) 
		m_dlgGrep.SendMessage( WM_SETICON, ICON_BIG, (LPARAM)hIcon );
		m_dlgGrepProgress.SendMessage( WM_SETICON, ICON_BIG, (LPARAM)hIcon );
		// ▲ (3367) END
	}

	//***** CGeneralSettingが使用できるのはここ以後！！ *****

	// 設定コンボの内容を構築
	ResetSettingCombo();

	// １秒間隔のタイマを設定
	SetTimer( 1, 1000, NULL );
	return 0;
}

BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/,
	CCreateContext* pContext)
{
	return m_wndSplitter.Create( this,
		2, 2,
		CSize( 10, 10 ),
		pContext );
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame クラスの診断

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG





/////////////////////////////////////////////////////////////////////////////
// CMainFrame メッセージ ハンドラ

#include "ShitarabianDoc.h"
#include "CommandManager.h"
#include "EditDrawer.h"
#include "CommandDelete.h"
#include "CommandInput.h"
#include "EmphasisDefine.h"
#include "SettingDlg.h"
#include "GeneralSetting.h"




/////////////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////////////


void CMainFrame::OnSettingSetting() 
{
	CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();

	CSettingDlg	dlg;
	dlg.Attach( CGeneralSetting::GetInstance() );
	dlg.Attach( pDoc );
	dlg.DoModal();
}


void CMainFrame::OnHelpUrl() 
{
	CString	strURL;
	strURL.LoadString( IDS_SUPPORTURL );
	ShellExecute( HWND_DESKTOP, NULL, strURL, NULL, NULL, SW_SHOWNORMAL);
}



void CMainFrame::OnEditDemark() 
{
	CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();

	pDoc->DeMark();

	pDoc->SetAllUpdate();
	pDoc->ReDraw();
}


void CMainFrame::OnClose() 
{
	// 設定情報の保存
	CGeneralSetting::GetInstance()->Write();

	// １秒間隔のタイマを殺す
	KillTimer( 1 );

	// 古いバックアップファイルの削除
	CBackUp::GetInstance()->DeleteBackup();

	CFrameWnd::OnClose();
}




void CMainFrame::DockControlBarLeftOf(CToolBar* pBar)
{
// http://www.geocities.co.jp/SiliconValley-SanJose/5309/index1.html
// ★複数のツールバーを任意の位置に置く
/*
	CRect RC;

	RecalcLayout();
	LeftOf->GetWindowRect(&RC);
	RC.OffsetRect(1,0);
	DWORD  dw=LeftOf->GetBarStyle();
	UINT n = 0;
	n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n;
	n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n;
	n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;
	n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;
	DockControlBar(Bar,n,&RC);
*/
	static CToolBar* pLeftOf = NULL;

	RecalcLayout();
	if ( pLeftOf != NULL )
	{
		CRect	rcClient;
		GetClientRect( &rcClient );
		ClientToScreen( &rcClient );

		CRect	rcNewBar;
		pBar->GetWindowRect( &rcNewBar );

		CRect	rcLeftOf;
		pLeftOf->GetWindowRect( &rcLeftOf );
		rcLeftOf.OffsetRect(1,0);

		if ( rcLeftOf.right + rcNewBar.Width() < rcClient.right )
		{
			DWORD  dw=pLeftOf->GetBarStyle();
			UINT n = 0;
			n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n;
			n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n;
			n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;
			n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;
			DockControlBar(pBar,n,&rcLeftOf);
		}
	}
	pLeftOf = pBar;
}


void CMainFrame::AddSubString(
	CString&		strSubString,
	CComboBox*		pComboBox
)
{
	// warning C4100:警告の無視
	pComboBox;

	// 既存の要素の削除
	int	idxExistsItem = m_wndSubStringCombo.FindStringExact( -1, strSubString );
	if ( idxExistsItem != CB_ERR )
	{
		m_wndSubStringCombo.DeleteString( idxExistsItem );
		m_dlgFinder.m_comboSubString.DeleteString( idxExistsItem );
		m_dlgReplacer.m_comboSubString.DeleteString( idxExistsItem );
		// ▼ (3367) BGN 2004.1.30 (dincom) 
		m_dlgGrep.m_comboSubstring.DeleteString( idxExistsItem );
		// ▲ (3367) END
	}

	// 要素数が多ければ削除
	int	nItem = m_wndSubStringCombo.GetCount();
	if( nItem >= 16 )
	{
		m_wndSubStringCombo.DeleteString( nItem-1 );
		m_dlgFinder.m_comboSubString.DeleteString( nItem-1 );
		m_dlgReplacer.m_comboSubString.DeleteString( nItem-1 );
		// ▼ (3367) BGN 2004.1.30 (dincom) 
		m_dlgGrep.m_comboSubstring.DeleteString( nItem-1 );
		// ▲ (3367) END
	}

	// 現在編集されているものをリストに加える
	if ( !strSubString.IsEmpty() )
	{
		m_wndSubStringCombo.InsertString( 0, strSubString );
		m_dlgFinder.m_comboSubString.InsertString( 0, strSubString );
		m_dlgReplacer.m_comboSubString.InsertString( 0, strSubString );
		// ▼ (3367) BGN 2004.1.30 (dincom) 
		m_dlgGrep.m_comboSubstring.InsertString( 0, strSubString );
		// ▲ (3367) END
	}

	// グローバルのデータを改訂
	CStringArray*	pSubStringz = CGeneralSetting::GetInstance()->GetSubStringz();
	int		idxItem;
	for( idxItem=0 ;idxItem<pSubStringz->GetSize() ; idxItem++ )
	{
		if( pSubStringz->GetAt( idxItem ) == strSubString )
		{
			pSubStringz->RemoveAt( idxItem );
			break;
		}
	}
	pSubStringz->Add( strSubString );

	m_wndSubStringCombo.SetWindowText( strSubString );
	m_dlgFinder.m_comboSubString.SetWindowText( strSubString );
	m_dlgReplacer.m_comboSubString.SetWindowText( strSubString );
	// ▼ (3367) BGN 2004.1.30 (dincom) 
	m_dlgGrep.m_comboSubstring.SetWindowText( strSubString );
	// ▲ (3367) END

	m_wndSubStringCombo.GetParent()->UpdateData();
	m_dlgFinder.m_comboSubString.GetParent()->UpdateData(  );
	m_dlgReplacer.m_comboSubString.GetParent()->UpdateData(  );
	// ▼ (3367) BGN 2004.1.30 (dincom) 
	m_dlgGrep.m_comboSubstring.GetParent()->UpdateData(  );
	// ▲ (3367) END
}

void CMainFrame::AddReplaceString(
	CString&		strReplaceString,
	CComboBox*		pComboBox
)
{
	// 既存の要素の削除
	int	idxExistsItem = m_dlgReplacer.m_comboReplace.FindStringExact( -1, strReplaceString );
	if ( idxExistsItem != CB_ERR )
	{
		m_dlgReplacer.m_comboReplace.DeleteString( idxExistsItem );
	}

	// 要素数が多ければ削除
	int	nItem = m_dlgReplacer.m_comboReplace.GetCount();
	if( nItem >= 16 )
	{
		m_dlgReplacer.m_comboReplace.DeleteString( nItem-1 );
	}

	// 現在編集されているものをリストに加える
	if ( !strReplaceString.IsEmpty() )
	{
		m_dlgReplacer.m_comboReplace.InsertString( 0, strReplaceString );
	}

	// グローバルのデータを改訂
	CStringArray*	pReplaceStringz = CGeneralSetting::GetInstance()->GetReplaceStringz();
	int		idxItem;
	for( idxItem=0 ;idxItem<pReplaceStringz->GetSize() ; idxItem++ )
	{
		if( pReplaceStringz->GetAt( idxItem ) == strReplaceString )
		{
			pReplaceStringz->RemoveAt( idxItem );
			break;
		}
	}
	pReplaceStringz->Add( strReplaceString );

	if ( pComboBox != NULL )
	{
		pComboBox->SetWindowText( strReplaceString );
		pComboBox->GetParent()->UpdateData();
	}
}



void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CFrameWnd::OnShowWindow(bShow, nStatus);
	
	if( !m_bInitialized )
	{
		CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();
		m_dlgFinder.Attach( pDoc );
		// ▼ (3367) BGN 2004.1.30 (dincom) 
		m_dlgGrep.Attach( pDoc );
		// ▲ (3367) END
		// DLLからのツールバーの初期化
		CShitarabianPlugInManager::GetInstance()->OnInitialize(
			pDoc
		);
		CShitarabianPlugInManager::GetInstance()->OnLoad(
			pDoc
		);

		// 設定コンボボックスのエディットを初期化
		m_wndSettingNameCombo.SelectString( -1, CGeneralSetting::GetInstance()->GetSettingName() );

// ▼ (3367) BGN 2004.1.30 (dincom)
	// １度目のオープンのみGrep指定を反映する
	{
		static BOOL	sbFirstOpen( true );
		if ( sbFirstOpen )
		{

			// コマンドテイルからGrep指定を取得
			CString	strGrep = ::DeQuoteString( ::GetCommandtailOption( ::GetString( IDS_OPTION_GREP ) ) );

			if ( !strGrep.IsEmpty() )
			{
				// コマンドテイルからフォルダ指定を取得
				CString	strFolder = ::DeQuoteString( ::GetCommandtailOption( ::GetString( IDS_OPTION_FOLDER ) ) );

				// コマンドテイルから語彙指定を取得
				CString	strSubString = ::DeQuoteString( ::GetCommandtailOption( ::GetString( IDS_OPTION_SUBSTRING ) ) );

				//　コマンドテイルからファイルフィルター指定を取得
				CString	strFilter = ::DeQuoteString( ::GetCommandtailOption( ::GetString( IDS_OPTION_FILTER ) ) );

				// サブスレッドの開始

				CMainFrame*		pFrame = ::GetMainFrame();
				if ( pFrame != NULL )
				{
					//GP
					//CProgressDlg*	pProgress = pFrame->GetProgressDlg();
					CGrepProgressDlg* pProgress = pFrame->GetGrepProgressDlg();
					if ( pProgress != NULL )
					{
						TGrepRequest*	pParam;
						pParam = new TGrepRequest;
						pParam->strFolder		= strFolder;
						pParam->strSubString	= strSubString;
						pParam->strCommand		= strGrep;
						pParam->strFilter		= strFilter;
						pProgress->Run();
						::AfxBeginThread( Grep, pParam );

						// スレッド終了までプログレスダイアログを表示
						sbFirstOpen = false;
					}
				}
			}
		}
	}
// ▲(3367) END

// ▼ (3146) BGN 2003.12.06 (moralog) 読み込み時、オプションを反映
		// タグジャンプオプションを反映
		{
			long	idxRow( 0 );
			long	idxColumn( 0 );
			static BOOL sbFirstOpen = TRUE;

			if ( sbFirstOpen )
			{
				sbFirstOpen = FALSE;

				idxRow = atol(::GetCommandtailOption( ::GetString( IDS_OPTION_ROW ) )) -1;
				if( idxRow > pDoc->GetLineCount() )
				{
					idxRow = pDoc->GetLineCount() - 1;
				}
				else if( idxRow < 0 )
				{
					idxRow = 0;
				}
				idxColumn = atol(::GetCommandtailOption( ::GetString( IDS_OPTION_COLUMN ) ));
			}
			CCommandCaret	cmdCaret;
			cmdCaret.SetAttribute( 0x00, idxRow, idxColumn );
			cmdCaret.Execute( pDoc );
		}

		// タグジャンプ位置へスクロール
		{
			// 起動時の位置オプション指定を反映する。
			// （スプリッタにペインが追加された後でないとスクロールさせられないので
			// このタイミングを使用する）
			static bool sbFirstTime = true;

			if ( sbFirstTime )
			{
				// キャレット位置へのスクロール
				CShitarabianView* pView = pDoc->GetMainView();

				if ( pView != NULL )
				{
					pView->ScrollToCaret();
					sbFirstTime = FALSE;
				}
			}
		} 
// ▲ (3146) END

		m_bInitialized = TRUE;
	}
}


void CMainFrame::OnEditMirror() 
{
	CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();

	CDC*	pDC = GetDC();
	CReverse::Mirror( pDoc, pDC );
	ReleaseDC( pDC );

	// 表示更新
	pDoc->ReDraw();
}


void CMainFrame::OnViewFindtoolbar() 
{
//	CWnd*	pParent = m_wndFindBar.GetParent();

	switch( m_wndFindBar.IsWindowVisible() )
	{
	case TRUE:
		ShowControlBar( &m_wndFindBar, FALSE, 0 );
		break;
	default:
		ShowControlBar( &m_wndFindBar, TRUE, 0 );
		break;
	}
}

// ▼ (3146) BGN 2003.12.20 (moralog) 検索ツールバー分割
void CMainFrame::OnViewExtfindtoolbar() 
{
	switch( m_wndExtFindBar.IsWindowVisible() )
	{
	case TRUE:
		ShowControlBar( &m_wndExtFindBar, FALSE, 0 );
		break;
	default:
		ShowControlBar( &m_wndExtFindBar, TRUE, 0 );
		break;
	}
}
// ▲ (3146) END

void CMainFrame::OnViewEdittoolbar() 
{
//	CWnd*	pParent = m_wndEditBar.GetParent();

	switch( m_wndEditBar.IsWindowVisible() )
	{
	case TRUE:
		ShowControlBar( &m_wndEditBar, FALSE, 0 );
		break;
	default:
		ShowControlBar( &m_wndEditBar, TRUE, 0 );
		break;
	}
}

void CMainFrame::OnEditFlip() 
{
	CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();
	CReverse::Flip( pDoc );

	// 表示更新
	pDoc->ReDraw();
}


/*-----------------------------------------------------------------------------
[名称]	選択行末空白文字除去（メニューハンドラ）
[機能]	選択された行に対して、行末の空白文字を取り除く。
		一部でも選択されている行に対して処理する。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CMainFrame::OnEditRemovelastblank()
{
	CShitarabianDoc*	pDoc = (CShitarabianDoc*)GetActiveDocument();
	CSelection*			pSelection = pDoc->GetSelection();

	CArray<TSelectColumn, TSelectColumn&>*	paColumnz = pDoc->GetSelection()->GetSelectedLinez();

	int		idxStartRow = pDoc->GetSelection()->GetSelectedStartRow();
	int		idxEndRow = pDoc->GetSelection()->GetSelectedEndRow();

	// ノーマル選択のために選択範囲をノーマライズ
	pSelection->Normalize();

	if ( paColumnz->GetSize() != (idxEndRow-idxStartRow+1) )
	{
		// 選択情報がおかしい
		ASSERT( FALSE );
		return;
	}

	CCommandMultiEdit	cmdEdit;
	int		idxRow;
	// 選択行について
	for( idxRow=idxStartRow ; idxRow<=idxEndRow ; idxRow++ )
	{
		CString*	pstrLine = pDoc->GetLine( idxRow );

//		int idxStartColumn = paColumnz->GetAt(idxRow-idxStartRow).idxStart;
//		int idxEndColumn = paColumnz->GetAt(idxRow-idxStartRow).idxEnd;

		// 行について
		// Tokenを分割し、
		CArray< TToken, TToken& >	aTokenz;
		CTokenReader::StringToCharTypez(
			*pstrLine,
			&aTokenz
		);

		// 行末から空白でないカラムを探し、
		for( int idxToken=aTokenz.GetSize()-1 ; idxToken>=0 ; idxToken-- )
		{
			if( aTokenz[idxToken].eCharType != CharTypeWhitespace )
			{
				break;
			}
		}

		// それより後を削除する。
		if ( idxToken+1 < aTokenz.GetSize() )
		{
			CCommandDelete	cmdDelete;
			cmdDelete.SetAttribute(
				idxRow,
				aTokenz[idxToken+1].idxStartColumn,
				idxRow,
				aTokenz[idxToken+1].idxStartColumn + aTokenz[idxToken+1].nColumn
			);

			cmdEdit.Add( cmdDelete );
		}
	}

	cmdEdit.Execute( pDoc );
	// コマンドマネージャに登録
	CCommandManager*	pCmd = CCommandManager::GetInstance();
	pCmd->Add( cmdEdit );

	pDoc->ReDraw();
}



void CMainFrame::OnSettingPlugin() 
{
	CShitarabianDoc*	pDoc = (CShitarabianDoc*)GetActiveDocument();

	CPlugInDlg	dlg;
	dlg.Attach( pDoc );
	dlg.DoModal();

	pDoc->ReDraw();
}

void CMainFrame::OnEditQuickfind() 
{
	CShitarabianDoc*	pDoc = (CShitarabianDoc*)GetActiveDocument();
	CString		strSubString;
	strSubString = pDoc->GetSelection()->GetSelectedText();
	if ( !strSubString.IsEmpty() )
	{
		// 選択語彙を検索文字列とする
		m_wndSubStringCombo.SetWindowText( strSubString );
		UpdateData( TRUE );

		// FindNextをかける
		OnEditFindnext();
	}
}

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 
{
// 「メニューを動的に追加する」
// http://www.kab-studio.com/Programing/Codian/MFCTips/05.html
// ツールバーに応用。

	if( pHandlerInfo == NULL )				// すでに割り当てられているメッセージがない場合……
	if ( nID >= _APS_NEXT_COMMAND_VALUE )	// 動的に作ったボタン
	switch ( nCode )
	{
	case CN_COMMAND:			// pExtra = CCmdUI* 
		{
			CToolBarManager*	pManager = CToolBarManager::GetInstance();
			int		idCommand = nID;
			int		idxButton = 0;

// ▼ (3204) BGN 2004.05.10 (moralog) ランチャツールバー追加
			// ランチャツールバーに合致するか
			CLauncher*	pLauncher = CLauncher::GetInstance();
			if ( pLauncher->CommandHandler( idCommand ) )
			{
				return( TRUE );
			}
// ▲ (3204) END

			// ツールバー管理の内包するツールバーのボタンすべてと合致するか検査。
			// 合致すれば対応するDLLへ処理の振り分け。
			HINSTANCE hDLL = pManager->GetDLLHandleFromButton( idCommand, &idxButton );
			if( hDLL != NULL )
			{
				// 合致するＤＬＬがあればコマンドを通知
				CShitarabianPlugInManager::GetInstance()->OnToolButton(
					hDLL,
					(CShitarabianDoc*)GetActiveDocument(),
					idxButton
				);
				return( TRUE );
			}
			else
			{
				// 合致するメニューがあるか
				int		idxPlugin = CShitarabianPlugInManager::GetInstance()->GetPlugInIndexFromMenu( idCommand );
				if( idxPlugin >= 0 )
				{
					// 合致するＤＬＬがあればコマンドを通知
					CShitarabianPlugInManager::GetInstance()->OnSetting(
						(CShitarabianDoc*)GetActiveDocument(),
						idxPlugin
					);
					return( TRUE );
				}
			}
		}
		break;

	case CN_UPDATE_COMMAND_UI:	// pExtra = CCmdUI* 
		{
			CToolBarManager*	pManager = CToolBarManager::GetInstance();
			int		idCommand = nID;
			int		idxButton = 0;

			// ツールバー管理の内包するツールバーのボタンすべてと合致するか検査。
			// 合致すれば対応するDLLへ処理の振り分け。
			HINSTANCE hDLL = pManager->GetDLLHandleFromButton( idCommand, &idxButton );
			if( hDLL != NULL )
			{
				// 合致するＤＬＬがあればコマンドを通知
				CShitarabianPlugInManager::GetInstance()->OnToolButtonUI(
					hDLL,
					(CShitarabianDoc*)GetActiveDocument(),
					idxButton,
					(CCmdUI*)pExtra
				);
				return( TRUE );
			}
		}
		break;

	default:
		break;
	}

	return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}


BOOL CMainFrame::RecalcScrollBar()
{
	CSplitterWnd*	pSplitter = ((CMainFrame*)::AfxGetMainWnd())->GetSplitter();

	int	nRow;
	int	nColumn;
	nRow = pSplitter->GetRowCount();
	nColumn = pSplitter->GetColumnCount();

	for ( int idxRow=0 ; idxRow<nRow ; idxRow++ )
	for ( int idxColumn=0 ; idxColumn<nColumn ; idxColumn++ )
	{
		CWnd*	pWnd = pSplitter->GetPane( idxRow, idxColumn );
		((CShitarabianView*)pWnd)->RecalcScrollBar();
	}
	return( TRUE );
}

BOOL CMainFrame::DestroyWindow() 
{
	m_dlgFinder.DestroyWindow();
	m_dlgReplacer.DestroyWindow();
	// ▼ (3367) BGN 2004.1.30 (dincom) 
	m_dlgGrep.DestroyWindow();
	// ▲ (3367) END
	CGeneralSetting::GetInstance()->GetCharPaletteManager()->DestroyCharPaletteDlg();

	CShitarabianDoc*	pDoc = (CShitarabianDoc*)GetActiveDocument();
	if ( pDoc != NULL )
	{
		CShitarabianPlugInManager::GetInstance()->OnSave( (CShitarabianDoc*)GetActiveDocument() );
		CShitarabianPlugInManager::GetInstance()->OnDestroy( (CShitarabianDoc*)GetActiveDocument() );
		CShitarabianPlugInManager::GetInstance()->RemoveAll();
	}	
	return CFrameWnd::DestroyWindow();
}

void CMainFrame::OnViewSettingtoolbar() 
{
//	CWnd*	pParent = m_wndSettingBar.GetParent();

	switch( m_wndSettingBar.IsWindowVisible() )
	{
	case TRUE:
		ShowControlBar( &m_wndSettingBar, FALSE, 0 );
		break;
	default:
		ShowControlBar( &m_wndSettingBar, TRUE, 0 );
		break;
	}	
}

void CMainFrame::OnUpdateViewSettingtoolbar(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck( m_wndSettingBar.IsWindowVisible() );	
}




void CMainFrame::ResetSettingCombo()
{
// 設定ファイルのフォルダを検索
// コンボボックスに列挙する
	m_wndSettingNameCombo.ResetContent();
	m_wndSettingNameCombo.EnableWindow( TRUE );

//	m_wndSettingNameCombo.AddString("（現在の設定）");

	int	nSetting = CSettingPath::GetInstance()->Count();
	{
		int	idxFolder;
		for( idxFolder=0 ; idxFolder<nSetting ; idxFolder++)
		{
			CString	str = CSettingPath::GetInstance()->GetFolderName(idxFolder);
			m_wndSettingNameCombo.AddString( str );
		}
	}

	// 現在の設定を選択
	int		idxItem = m_wndSettingNameCombo.FindStringExact( 0, CGeneralSetting::GetInstance()->GetSettingName() );
	m_wndSettingNameCombo.SetCurSel( idxItem );

	if ( nSetting == 0 )
	{
		m_wndSettingNameCombo.EnableWindow( FALSE );
	}
}



BOOL CMainFrame::PreTranslateManagedCombo(
	CManagedCombo*	pSender,
	EComboEvent		eEvent
)
{
	if ( pSender == &m_wndSubStringCombo )	
	{
		switch( eEvent )
		{
		case ReturnKeyDown:
			SetFocus();
			PostMessage( WM_COMMAND, IDM_EDIT_FINDNEXT, 0 );
			break;

		default:
			break;
		}
	}

	if ( pSender == &m_wndSettingNameCombo )	
	{
		switch( eEvent )
		{
		case SelChange:
			{
				CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();

				int	idxCel = m_wndSettingNameCombo.GetCurSel(); 
				if ( idxCel != CB_ERR )
				{
					// 表示している最上行を取得（表示行位置復元のため）
					long	lStartRow = pDoc->GetMainView()->VisibleRowStart();

					// 設定フォルダを変更してロード
					CSettingPath::GetInstance()->SetFolderIndex(
						idxCel
					);

					CGeneralSetting::GetInstance()->Read();
					CShitarabianPlugInManager::GetInstance()->OnLoad( pDoc );

					// 設定フォルダを元に戻す
					CSettingPath::GetInstance()->ResetGeneralFolder();

					// 全表示データ再構築
					RebuildEmphasis();

					// 表示行を復元する
					{
						// スクロールボックス移動
						CPoint		ptScroll;
						ptScroll.y = CEditDrawer::GetInstance()->CaretRowToPixelZoomed( lStartRow );
						ptScroll.x = 0;

					// please! すべてのVIewに適用しないといけないと思うが
						pDoc->GetMainView()->SetDeviceScrollPosition( ptScroll );
					}
					// 表示更新
					pDoc->SetAllUpdate();
					pDoc->ReDraw();
				}

				// ビューにフォーカスを当てる
				pDoc->GetMainView()->SetFocus();
			}
			break;

		default:
			break;
		}
	}
	return( TRUE );
}



void CMainFrame::OnHelpAaheadline() 
{
	CString	strURL;
	strURL.LoadString( IDS_AAHEADLINEURL );
	ShellExecute( HWND_DESKTOP, NULL, strURL, NULL, NULL, SW_SHOWNORMAL);
}

void CMainFrame::OnFileOpen() 
{
	// フィルタ文字列の作成
	CString		strFilter;			// ファイルフィルタ
	CString		strDefaultExt;		// デフォルト拡張子
	CSettingPath::GetInstance()->GetFilter(
		&strFilter,
		&strDefaultExt
	);

	// オープンダイアログを表示
	CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();
	CFileDialog	dlg(
		TRUE,
		strDefaultExt,
		pDoc->GetPathName(),
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		strFilter,
		this
	);
	if ( dlg.DoModal() == IDOK )
	{
// ▼ xxxxx BGN 2003.01.26 (moralog)
		// 別ウィンドウで開く（秀丸やWordと同じ動作）
		const	iMaxLength( 1028 );	// パス格納バッファ長さ

		// 実行ファイル名を得る
// ▼ (3751) BGN 2004.05.10 (moralog) 関数化
	CString	strExeShortPath = ::GetShortFilePath( ::GetExePathName() );
/*
// ▽ original BGN
		char	strExeShortPath[ iMaxLength ];
		{
			char	strExeLongPath[ iMaxLength ];
			::GetModuleFileName(
				NULL,
				strExeLongPath,
				iMaxLength
			);

			// ショートファイルのパスを得る
			::GetShortPathName( strExeLongPath, strExeShortPath, iMaxLength );
		}
// △ original END
*/
// ▲ (3751) END

// ▼ (3751) BGN 2004.05.31 (moralog) 開いたファイルがショートファイルネームで表示される
		// 別窓で開く
		_spawnl( _P_NOWAIT, strExeShortPath, strExeShortPath, ::QuoteString(dlg.GetFileName()), NULL );
/*
// ▽ original BGN
		// ドキュメントファイル名を得る
		char	strDocumentShortPath[ iMaxLength ];
		::GetShortPathName( dlg.GetFileName(), strDocumentShortPath, iMaxLength );

		// 別窓で開く
		_spawnl( _P_NOWAIT, strExeShortPath, strExeShortPath, strDocumentShortPath, NULL );
// △ original END
*/
// ▲ (3751) END


// ▽ oridinal BGN
//		pDoc->SetPathName( dlg.GetFileName() );
//		pDoc->OnOpenDocument( dlg.GetFileName() );
// △ oridinal END
// ▲ xxxxx END
	}
}

void CMainFrame::OnFileSaveAs() 
{
	// フィルタ文字列の作成
	CString		strFilter;			// ファイルフィルタ
	CString		strDefaultExt;		// デフォルト拡張子
	CSettingPath::GetInstance()->GetFilter(
		&strFilter,
		&strDefaultExt
	);

	// セーブダイアログを表示
	CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();
	CFileDialog	dlg(
		FALSE,
		strDefaultExt,
		pDoc->GetPathName(),
		OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		strFilter,
		this
	);
	if ( dlg.DoModal() == IDOK )
	{
		pDoc->SetPathName( dlg.GetFileName() );
		pDoc->OnSaveDocument( dlg.GetFileName() );
	}
}



/*-----------------------------------------------------------------------------
[名称]	表示設定変更
[機能]	表示設定変更に伴う表示情報の再構築。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
void CMainFrame::RebuildEmphasis() 
{
	CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();

	// Drawerにフォント変更通知
	CEditDrawer::GetInstance()->RecalcFontSize();

	// ドキュメント表示情報の再構築
	pDoc->ReflectEmphasis();

	// 表示色解析
	// 速度を優先するため、複数行表示色の解析のみを行い、
	// まじめな解析は表示時にする。
	pDoc->AnalizeEmphasisLinez(
		0,
		pDoc->GetLineCount()-1
	);

	// 再描画用設定
	RecalcScrollBar();
	pDoc->SetAllUpdate();
}


/*-----------------------------------------------------------------------------
[名称]	クリップボードペースト
[機能]	文字列をクリップボードから読み出す。
[戻値]	なし
[備考]	なし
-----------------------------------------------------------------------------*/
CString	CMainFrame::EditPasteString()
{
	CString	strInsert;
	if ( OpenClipboard() )
	{

		HGLOBAL		hMemUnicode;
		HGLOBAL		hMemShiftJis;

		// ユニコードテキストのチェック
		hMemUnicode = GetClipboardData( CF_UNICODETEXT );
		hMemShiftJis = GetClipboardData( CF_TEXT );
		if ( hMemShiftJis != NULL )
		{
			const wchar_t*	pwcstr = (wchar_t*)(GlobalLock( hMemUnicode ));
			const char*		pcstr = (LPCTSTR)(GlobalLock( hMemShiftJis ));

			if( hMemUnicode != NULL )
			{
				strInsert = CUnicoder::GetSJisString(
					pcstr,
					pwcstr
				);
			}
			else
			{
				strInsert = pcstr;
			}
		}

		if ( hMemShiftJis != NULL )
		{
			GlobalUnlock( hMemShiftJis );
		}
		if ( hMemUnicode != NULL )
		{
			GlobalUnlock( hMemUnicode );
		}
		CloseClipboard();
	}

	// クリップボード履歴へ登録
	// 外部からの貼り付けの場合、Paste時にクリップボード履歴に登録する
	CClipHistory::GetInstance()->AddHistory( strInsert );

	return( strInsert );
}


void CMainFrame::OnSettingCommon() 
{
	CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();

	CSettingCommonSheet	dlg;
	dlg.Attach( CGeneralSetting::GetInstance() );
	dlg.Attach( pDoc );
	dlg.DoModal();

//	pDoc->SetAllUpdate();
//	pDoc->ReDraw();

//	ResetSettingCombo();
}

void CMainFrame::OnTimer(UINT nIDEvent) 
{
	static	long lPassedTime = 0;
	lPassedTime++;

	// n分おきに自動セーブ
	if( lPassedTime > CBackUp::GetInstance()->GetInterval() *60 )
	{
		CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();
		if ( pDoc != NULL )
		if ( pDoc->IsNeedBackUp() )
		{
			CBackUp::GetInstance()->DocumentSave( pDoc );
			pDoc->NeedBackUp( FALSE );
		}
		lPassedTime = 0;
	}

	CFrameWnd::OnTimer(nIDEvent);
}

/*-----------------------------------------------------------------------------
[名称]	文字パレット設定
[機能]	設定ダイアログの表示と、設定の反映。
[戻値]	なし
[備考]	設定を反映するため、文字パレットダイアログの再構築を行う。
-----------------------------------------------------------------------------*/
void CMainFrame::OnEditCharpaletteSetting() 
{
	CCharPaletteManager*	pManager = CGeneralSetting::GetInstance()->GetCharPaletteManager();
	CCharPaletteSettingDlg	dlg;
	if ( dlg.DoModal() == IDOK )
	{
		pManager->GetCharPaletteDlg()->ShowWindow( SW_SHOW );
	}
}

// ▼ (3179) BGN 2003.10.28 (dincom) ツールバーからの切り替え機能追加
/*-----------------------------------------------------------------------------
[名称]	フリーカーソル
[機能]	フリーカーソルのON/OFF切り替え
[戻値]	なし
[備考]	(3179) 2003-10-27	 関数付加(dincom)
-----------------------------------------------------------------------------*/
void CMainFrame::OnEditFreecursol() 
{
	BOOL bFreeCursor = CGeneralSetting::GetInstance()->GetFreeCursor(); //フリーカソルかの判断

	if( bFreeCursor )
	{
		CGeneralSetting::GetInstance()->SetFreeCursor( FALSE );  //フリーカソルOFF
	}
	else
	{
		CGeneralSetting::GetInstance()->SetFreeCursor( TRUE );  //フリーカソルON
	}
}

// ▲ (3179) END

// ▼ (3179) BGN 2003.10.28 (dincom) ツールバーからの切り替え機能追加
/*-----------------------------------------------------------------------------
[名称]	上下反転文字 
[機能]	上下反転文字のON/OFF切り替え
[戻値]	なし
[備考]	(3179) 2003-10-28	 関数付加(dincom)
-----------------------------------------------------------------------------*/
void CMainFrame::OnEditFlipchar() 
{
	CFliperDefine* pFliper = CGeneralSetting::GetInstance()->GetFlipz();

	//上下反転文字有効判定
	if( pFliper->GetEnable() )
	{
		pFliper->SetEnable( FALSE );
	}
	else
	{
		pFliper->SetEnable( TRUE );
	}
}
// ▲ (3179) END

// ▼ (3179) BGN 2003.10.28 (dincom) ツールバーからの切り替え機能追加
/*-----------------------------------------------------------------------------
[名称]	左右反転文字 
[機能]	左右反転文字のON/OFF切り替え
[戻値]	なし
[備考]	(3179) 2003-10-28	 関数付加(dincom)
-----------------------------------------------------------------------------*/
void CMainFrame::OnEditMirrorchar() 
{
	CFliperDefine* pFliper = CGeneralSetting::GetInstance()->GetMirrorz();

	//左右反転文字有効判定
	if( pFliper->GetEnable() )
	{
		pFliper->SetEnable( FALSE );
	}
	else
	{
		pFliper->SetEnable( TRUE );
	}
	
}
// ▲ (3179) END

// ▼ (3179) BGN 2003.11.08 (moralog) ツールバーからの切り替え機能追加
/*-----------------------------------------------------------------------------
[名称]	BOX表示
[機能]	BOX表示のON/OFF切り替え
[戻値]	なし
[備考]	(3179) 2003-10-28	 関数付加(dincom)
-----------------------------------------------------------------------------*/
void CMainFrame::OnEditBoxchar() 
{
	CShitarabianDoc* pDoc =(CShitarabianDoc*)GetActiveDocument();
	CBoxCharDefine* pBoxChar =CGeneralSetting::GetInstance()->GetBoxCharDefine();

	//BOX表示有効判定
	if( pBoxChar->GetEnable() )
	{
		pBoxChar->SetEnable( FALSE );
	}
	else
	{
		pBoxChar->SetEnable( TRUE );
	}

	// ドキュメント表示情報の再構築
	pDoc->ReflectEmphasis();
	pDoc->AnalizeEmphasisLinez( 0, pDoc->GetLineCount()-1 );

	pDoc->SetAllUpdate();
	pDoc->ReDraw();
}
// ▲ (3179) END

// ▼ (3179) BGN 2003.11.08 (moralog) ツールバーからの切り替え機能追加
/*-----------------------------------------------------------------------------
[名称]	ユニコード表示
[機能]	ユニコード表示のON/OFF切り替え
[戻値]	なし
[備考]	(3179) 2003-10-28	 関数付加(dincom)
-----------------------------------------------------------------------------*/
void CMainFrame::OnEditUnicode() 
{
	CUnicoder*	pUnicoder = CUnicoder::GetInstance();
	pUnicoder->SetEnable( !pUnicoder->GetEnable() );

	// ドキュメント表示情報の再構築
	CShitarabianDoc* pDoc = (CShitarabianDoc*)GetActiveDocument();
	pDoc->ReflectEmphasis();
	pDoc->AnalizeEmphasisLinez( 0, pDoc->GetLineCount()-1 );

	pDoc->SetAllUpdate();
	pDoc->ReDraw();
}
// ▲ (3179) END

// ▼ (3146) BGN 2003.11.08 (moralog) タグジャンプ機能追加
/*-----------------------------------------------------------------------------
[名称]	タグジャンプ
[機能]	タグジャンプの実行。新しいウィンドウで開く。
[戻値]	なし
[備考]	(3146) 2003-11-08	 関数追加(moralog)
-----------------------------------------------------------------------------*/
void CMainFrame::OnEditTagjump() 
{
	CShitarabianDoc*	pDoc = (CShitarabianDoc*)GetActiveDocument();

	// 現在行を取得
	int			idxRow = pDoc->GetCaretRow();
	CString*	pstrLine = pDoc->GetLine( idxRow );
	if ( pstrLine != NULL )
	{
		// ジャンプ先取得
		CString		strDocumentFilePath;
		CString		strOptionRow;
		CString		strOptionColumn;
		{
			long	idxRow( 0 );
			long	idxColumn( 0 );

			// ジャンプ先の行・カラムを取得
			// ▼ (3146) BGN 2003.11.10 (dincom)
			GetTagJumpInfo( *pstrLine , &strDocumentFilePath , &idxRow , &idxColumn );
			// ▲ (3146) END

			strOptionRow.Format( _T("-%s=%d"), ::GetString(IDS_OPTION_ROW), idxRow );
			strOptionColumn.Format( _T("-%s=%d"), ::GetString(IDS_OPTION_COLUMN), idxColumn );
		}

		// 実行ファイル名を得る
// ▼ (3751) BGN 2004.05.10 (moralog) 関数化
	CString	strExeShortPath = ::GetShortFilePath( ::GetExePathName() );
/*
// ▽ original BGN
		const	iMaxLength( 1028 );	// パス格納バッファ長さ
		char	strExeShortPath[ iMaxLength ];
		{
			char	strExeLongPath[ iMaxLength ];
			::GetModuleFileName(
				NULL,
				strExeLongPath,
				iMaxLength
			);

			// ショートファイルのパスを得る
			::GetShortPathName( strExeLongPath, strExeShortPath, iMaxLength );
		}
// △ original END
*/
// ▲ (3751) END

// ▼ (3146) BGN 2003.12.20 (moralog) ファイル存在チェック
		// ファイルの存在チェック
		{
			BOOL	bExist;

			// ファイルが存在するか？（ディレクトリでないもの）
			CFileStatus		status;

			bExist = CFile::GetStatus( strDocumentFilePath, status );
			bExist &= !(status.m_attribute & CFile::Attribute::directory );

			// 存在しなければ警告して終了
			if ( !bExist )
			{
				CString		strMes;
				strMes.Format( _T("ファイルが存在しません。") );
				::AfxMessageBox( strMes );
				return;
			}
		}
// ▲ (3146) END

// ▼ (3146) BGN 2003.12.28 (moralog) 空白を含むファイル名を許す
		CString	strTmp = strDocumentFilePath;
		strDocumentFilePath.Format( _T("\"%s\""), strTmp );
// ▲ (3146) END

		// 別窓で開く
		_spawnl(
			_P_NOWAIT,
			strExeShortPath,
			strExeShortPath,
			strDocumentFilePath,
			strOptionRow,
			strOptionColumn,
			NULL
		);
	}
}
// ▲ (3146) END


// ▼ (3367) BGN 2003.02.03 (dincom) XPでファイル名指定起動後、終了時にAccessViolation修正
/*-----------------------------------------------------------------------------
[名称]	プログレスダイアログ取得
[機能]	プログレスダイアログを取得する
[戻値]	CProgressDlg* 取得したプログレスダイアログ
[備考]	なし
-----------------------------------------------------------------------------*/
/*CProgressDlg* CMainFrame::GetProgressDlg()
{
	CWnd* pWnd = NULL;
	pWnd = GetParent();

	if ( pWnd != NULL )
	if ( pWnd->IsWindowVisible() )
	{
		return( &m_dlgProgress );
	}
	return( NULL );
}*/
// ▲ (3367) END

// ▼ (3367) BGN 2003.02.05 (dincom) 
/*-----------------------------------------------------------------------------
[名称]	プログレスダイアログ取得
[機能]	プログレスダイアログを取得する
[戻値]	CGrepProgressDlg* 取得したGrepプログレスダイアログ
[備考]	なし
-----------------------------------------------------------------------------*/
/*CGrepProgressDlg* CMainFrame::GetGrepProgressDlg()
{
	CWnd* pWnd = NULL;
	pWnd = GetParent();

	if ( pWnd != NULL )
	if ( pWnd->IsWindowVisible() )
	{
		return( &m_dlgGrepProgress );
	}
	return( NULL );
}*/
// ▲ (3367) END



// ▼ (3204) BGN 2004.05.10 (moralog) ランチャツールバー追加
/*-----------------------------------------------------------------------------
[名称]	ランチャツールバー表示切替
[機能]	ランチャツールバーの表示有無をトグル切替する。
[戻値]	なし
[備考]	(3204) 2004-01-08	 関数追加(moralog)
-----------------------------------------------------------------------------*/
void CMainFrame::OnViewLauncher() 
{
	switch( m_wndLauncherBar.IsWindowVisible() )
	{
	case TRUE:
		ShowControlBar( &m_wndLauncherBar, FALSE, 0 );
		break;
	default:
		ShowControlBar( &m_wndLauncherBar, TRUE, 0 );
		break;
	}
}
// ▲ (3204) END

// ▼ (3204) BGN 2004.05.10 (moralog) ランチャツールバー追加
/*-----------------------------------------------------------------------------
[名称]	ランチャツールバー表示切替UI
[機能]	ランチャツールバー表示有無項目をの表示設定をする。
[戻値]	なし
[備考]	(3204) 2004-01-08	 関数追加(moralog)
-----------------------------------------------------------------------------*/
void CMainFrame::OnUpdateViewLauncher(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable( CLauncher::GetInstance()->GetLaunchDefine()->GetSize() > 0 );
	pCmdUI->SetCheck( m_wndLauncherBar.IsWindowVisible() );	
}
// ▲ (3204) END

// ▼ (3204) BGN 2004.05.10 (moralog) ランチャツールバー追加
/*-----------------------------------------------------------------------------
[名称]	ランチャツールバー再構築
[機能]	ランチャツールバーを再構築する。
[戻値]	なし
[備考]	(3204) 2004-01-08	 関数追加(moralog)
-----------------------------------------------------------------------------*/
void CMainFrame::RebuildLuncherToolBar()
{
	CLauncher::GetInstance()->DestroyButtonz( &m_wndLauncherBar );
	CLauncher::GetInstance()->Read();
	CLauncher::GetInstance()->CreateButtonz( &m_wndLauncherBar );
}
// ▲ (3204) END




// ▼ (3204) BGN 2004.05.10 (moralog) 外部アプリとのＩＦをWM_COPYDATAメッセージとする
BOOL CMainFrame::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct) 
{
	CShitarabianDoc* pDoc = GetDocument();

	switch( pCopyDataStruct->dwData )
	{
	case COMMAND_MESSAGE_INSERT:
		{
			CString	strInsert = (LPCTSTR)(pCopyDataStruct->lpData);
			((CShitarabianView*)GetActiveView())->OnChar( strInsert, FALSE, FALSE, FALSE, FALSE );
		}
		break;

	case COMMAND_MESSAGE_CARET_EOF:
		// キャレットを文末に移動する
		{
			int nRow = pDoc->GetLineCount();
			CCommandCaret	cmdCaret;
			cmdCaret.SetAttribute( 0x00, nRow-1, 0 );
			cmdCaret.Execute( pDoc );
			cmdCaret.SetAttribute( VK_END, 0, 0 );
		}
		break;

	case COMMAND_MESSAGE_INIT_SELECTION:
		// 選択状態の解除
		{
			pDoc->GetSelection()->SetSelectedNutral();
		}
		break;

	case COMMAND_MESSAGE_PASTE:
		OnEditPaste();
		break;

	default:
		break;
	}
	
	return CFrameWnd::OnCopyData(pWnd, pCopyDataStruct);
}
// ▲ (3204) END


// ▼ (3751) BGN 2004.05.20 (moralog) フォーカス有無による表示の変化
void CMainFrame::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
{
	CFrameWnd::OnActivate(nState, pWndOther, bMinimized);
	CShitarabianDoc* pDoc = GetDocument();

	switch( nState )
	{
	case WA_INACTIVE:
		pDoc->SetTitle( NULL );
		break;
	default:
		pDoc->SetTitle( NULL );
		break;
	}
}
// ▲ (3751) END

// ▼ (追加) BGN 2004.06.14 (moralog) メニューにマニュアル項目追加
void CMainFrame::OnHelpManual() 
{
	CString	strURL;
	strURL.LoadString( IDS_MANUALURL );

	CString	strPath = ::PathFromPathName( ::GetExePathName() );
	CString strPathName;
	strPathName.Format( "%s\\%s", strPath, strURL );

	ShellExecute( HWND_DESKTOP, NULL, strPathName, NULL, NULL, SW_SHOWNORMAL);
}
// ▲ (追加) END
