Beispiel #1
0
/** 行の解析

	@param[in] buf 行(先頭から)
	@param[in] linelen 行の長さ
	@param[in] linenum 行番号
*/
bool COutlineErlang::parse( const wchar_t* buf, int linelen, CLogicInt linenum )
{
	const wchar_t* pos = buf;
	const wchar_t* const end = buf + linelen;
	if( m_state == STATE_FUNC_FOUND ){
		m_state = STATE_NORMAL;
	}
	if( m_state == STATE_NORMAL ){
		pos = ScanFuncName( buf, end, pos );
		if( m_state != STATE_NORMAL ){
			m_lnum = linenum;
		}
	}
	while( pos < end ){
		switch( m_state ){
			case STATE_FUNC_CANDIDATE_FIN:
				pos = EnterArgs( end, pos ); break;
			case STATE_FUNC_ARGS1:
				pos = ScanArgs1( end, pos ); break;
			case STATE_FUNC_ARGS:
				pos = ScanArgs( end, pos ); break;
			case STATE_FUNC_ARGS_FIN:
				pos = EnterCond( end, pos ); break;
			default:
				PleaseReportToAuthor(NULL, _T("COutlineErlang::parse Unknown State: %d"), m_state );
				break;
		}
		if( m_state == STATE_FUNC_FOUND ){
			build_arity( m_argcount );
			break;
		}
	}
	return m_state == STATE_FUNC_FOUND;
}
/*!
	ダイアログ上のコントロールを初期化する

	@param hwndDlg ダイアログボックスのウィンドウハンドル
*/
void CPropPlugin::InitDialog( HWND hwndDlg )
{
    const struct ColumnData_CPropPlugin_Init ColumnList[] = {
        { STR_PROPCOMPLG_LIST1, 40 },
        { STR_PROPCOMPLG_LIST2, 200 },
        { STR_PROPCOMPLG_LIST3, 40 },
        { STR_PROPCOMPLG_LIST4, 40 },
        { STR_PROPCOMPLG_LIST5, 150 },
    };

    //	ListViewの初期化
    HWND hListView = ::GetDlgItem( hwndDlg, IDC_PLUGINLIST );

    LVCOLUMN sColumn;
    int pos;
    RECT rc;
    ::GetWindowRect( hListView, &rc );
    int width = rc.right - rc.left;

    for( pos = 0; pos < _countof( ColumnList ); ++pos ) {

        memset_raw( &sColumn, 0, sizeof( sColumn ));
        sColumn.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_FMT;
        sColumn.pszText = const_cast<TCHAR*>(LS(ColumnList[pos].titleId));
        sColumn.cx = ColumnList[pos].width * width / 499;
        sColumn.iSubItem = pos;
        sColumn.fmt = LVCFMT_LEFT;

        if( ListView_InsertColumn( hListView, pos, &sColumn ) < 0 ) {
            PleaseReportToAuthor( hwndDlg, _T("PropComMacro::InitDlg::ColumnRegistrationFail") );
            return;	//	よくわからんけど失敗した
        }
    }

}
/*! プロパティシートの作成
	@date 2002.2.17 YAZAKI CShareDataのインスタンスは、CProcessにひとつあるのみ。
*/
INT_PTR CPropCommon::DoPropertySheet( int nPageNum, bool bTrayProc )
{
	INT_PTR				nRet;
	int					nIdx;

	m_bTrayProc = bTrayProc;

	//	From Here Jun. 2, 2001 genta
	//	Feb. 11, 2007 genta URLをTABと入れ換え	// 2007.02.13 順序変更(TABをWINの次に)
	//!	「共通設定」プロパティシートの作成時に必要な情報の配列.
	//	順序変更 Win,Toolbar,Tab,Statusbarの順に、File,FileName 順に	2008/6/22 Uchi 
	//	DProcの変更	2010/5/9 Uchi
	static const ComPropSheetInfo ComPropSheetInfoList[] = {
		{ STR_PROPCOMMON_GENERAL,	IDD_PROP_GENERAL,	CPropGeneral::DlgProc_page },
		{ STR_PROPCOMMON_WINDOW,	IDD_PROP_WIN,		CPropWin::DlgProc_page },
		{ STR_PROPCOMMON_MAINMENU,	IDD_PROP_MAINMENU,	CPropMainMenu::DlgProc_page },	// 2010/5/8 Uchi
		{ STR_PROPCOMMON_TOOLBAR,	IDD_PROP_TOOLBAR,	CPropToolbar::DlgProc_page },
		{ STR_PROPCOMMON_TABS,		IDD_PROP_TAB,		CPropTab::DlgProc_page },
		{ STR_PROPCOMMON_STATBAR,	IDD_PROP_STATUSBAR,	CPropStatusbar::DlgProc_page },	// 文字コード表示指定	2008/6/21	Uchi
		{ STR_PROPCOMMON_EDITING,	IDD_PROP_EDIT,		CPropEdit::DlgProc_page },
		{ STR_PROPCOMMON_FILE,		IDD_PROP_FILE,		CPropFile::DlgProc_page },
		{ STR_PROPCOMMON_FILENAME,	IDD_PROP_FNAME,		CPropFileName::DlgProc_page },
		{ STR_PROPCOMMON_BACKUP,	IDD_PROP_BACKUP,	CPropBackup::DlgProc_page },
		{ STR_PROPCOMMON_FORMAT,	IDD_PROP_FORMAT,	CPropFormat::DlgProc_page },
		{ STR_PROPCOMMON_SEARCH,	IDD_PROP_GREP,		CPropGrep::DlgProc_page },	// 2006.08.23 ryoji タイトル変更(Grep -> 検索)
		{ STR_PROPCOMMON_KEYS,		IDD_PROP_KEYBIND,	CPropKeybind::DlgProc_page },
		{ STR_PROPCOMMON_CUSTMENU,	IDD_PROP_CUSTMENU,	CPropCustmenu::DlgProc_page },
		{ STR_PROPCOMMON_KEYWORD,	IDD_PROP_KEYWORD,	CPropKeyword::DlgProc_page },
		{ STR_PROPCOMMON_SUPPORT,	IDD_PROP_HELPER,	CPropHelper::DlgProc_page },
		{ STR_PROPCOMMON_MACRO,		IDD_PROP_MACRO,		CPropMacro::DlgProc_page },
		{ STR_PROPCOMMON_PLUGIN,	IDD_PROP_PLUGIN,	CPropPlugin::DlgProc_page },
	};

	std::tstring		sTabname[_countof(ComPropSheetInfoList)];
	PROPSHEETPAGE		psp[_countof(ComPropSheetInfoList)];
	for( nIdx = 0; nIdx < _countof(ComPropSheetInfoList); nIdx++ ){
		sTabname[nIdx] = LS(ComPropSheetInfoList[nIdx].m_nTabNameId);

		PROPSHEETPAGE *p = &psp[nIdx];
		memset_raw( p, 0, sizeof_raw( *p ) );
		p->dwSize      = sizeof_raw( *p );
		p->dwFlags     = PSP_USETITLE | PSP_HASHELP;
		p->hInstance   = CSelectLang::getLangRsrcInstance();
		p->pszTemplate = MAKEINTRESOURCE( ComPropSheetInfoList[nIdx].resId );
		p->pszIcon     = NULL;
		p->pfnDlgProc  = ComPropSheetInfoList[nIdx].DProc;
		p->pszTitle    = sTabname[nIdx].c_str();
		p->lParam      = (LPARAM)this;
		p->pfnCallback = NULL;
	}
	//	To Here Jun. 2, 2001 genta

	PROPSHEETHEADER		psh;
	memset_raw( &psh, 0, sizeof_raw( psh ) );
	
	//	Jun. 29, 2002 こおり
	//	Windows 95対策.Property SheetのサイズをWindows95が認識できる物に固定する.
	psh.dwSize = sizeof_old_PROPSHEETHEADER;

	//	JEPROtest Sept. 30, 2000 共通設定の隠れ[適用]ボタンの正体はここ。行頭のコメントアウトを入れ替えてみればわかる
	psh.dwFlags    = PSH_NOAPPLYNOW | PSH_PROPSHEETPAGE | PSH_USEPAGELANG;
	psh.hwndParent = m_hwndParent;
	psh.hInstance  = CSelectLang::getLangRsrcInstance();
	psh.pszIcon    = NULL;
	psh.pszCaption = LS( STR_PROPCOMMON );	//_T("共通設定");
	psh.nPages     = nIdx;

	//- 20020106 aroka # psh.nStartPage は unsigned なので負にならない
	if( -1 == nPageNum ){
		psh.nStartPage = m_nPageNum;
	}else
	if( 0 > nPageNum ){			//- 20020106 aroka
		psh.nStartPage = 0;
	}else{
		psh.nStartPage = nPageNum;
	}
	if( psh.nPages - 1 < psh.nStartPage ){
		psh.nStartPage = psh.nPages - 1;
	}

	psh.ppsp = psp;
	psh.pfnCallback = NULL;

	nRet = MyPropertySheet( &psh );	// 2007.05.24 ryoji 独自拡張プロパティシート
	if( -1 == nRet ){
		TCHAR*	pszMsgBuf;
		::FormatMessage(
			FORMAT_MESSAGE_ALLOCATE_BUFFER |
			FORMAT_MESSAGE_FROM_SYSTEM |
			FORMAT_MESSAGE_IGNORE_INSERTS,
			NULL,
			::GetLastError(),
			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),	// デフォルト言語
			(LPTSTR)&pszMsgBuf,
			0,
			NULL
		);
		PleaseReportToAuthor(
			NULL,
			LS(STR_ERR_DLGPROPCOMMON24),
			psh.nStartPage,
			pszMsgBuf
		);
		::LocalFree( pszMsgBuf );
	}

	return nRet;
}
Beispiel #4
0
/** パラメータの解析とカウント

	@param[in] end buf末尾
	@param[in] p 解析の現在位置
	
	パラメータを解析する.パラメータの数と末尾の閉じ括弧を正しく判別するために,
	引用符,括弧,パラメータの区切りのカンマに着目する.
	引用符は改行を含むことができない.
*/
const wchar_t* COutlineErlang::ScanArgs( const wchar_t* end, const wchar_t* p )
{
	assert( m_state == STATE_FUNC_ARGS );

	const int parptr_max = sizeof( m_parenthesis ) / sizeof( m_parenthesis[0] );
	wchar_t quote = L'\0'; // 先頭位置を保存
	for(const wchar_t* head = p ; p < end ; p++ ){
		if( quote ){
			if( *p == quote )
				quote = L'\0';
		}
		else {
			if( wcschr( L"([{", *p )){	//)
				// level up
				if( m_parenthesis_ptr < parptr_max ){
					m_parenthesis[ m_parenthesis_ptr ] = *p;
				}
				m_parenthesis_ptr++;
			}
			else if( wcschr( L")]}", *p )){	//)
				wchar_t op;
				switch( *p ){
					case L')': op = L'('; break;
					case L']': op = L'['; break;
					case L'}': op = L'{'; break;
					default:
						PleaseReportToAuthor(NULL, LS(STR_OUTLINE_ERLANG_SCANARGS));
						op = 0;
						break;
				}
				// level down
				--m_parenthesis_ptr;
				while( 1 <= m_parenthesis_ptr && m_parenthesis_ptr < parptr_max ){
					if( m_parenthesis[ m_parenthesis_ptr ] != op ){
						// if unmatch then skip
						--m_parenthesis_ptr;
					}
					else{
						break;
					}
				}
				
				// check level
				if( m_parenthesis_ptr == 0 ){
					m_state = STATE_FUNC_ARGS_FIN;
					++p;
					return p;
				}
			}
			else if( *p == L',' && m_parenthesis_ptr == 1 ){
				++m_argcount;
			}
			else if( *p == L';' ){
				//	セミコロンは複数の文の区切り.
				//	パラメータ中には現れないので,解析が失敗している
				//	括弧の閉じ忘れが考えられるので,仕切り直し
				m_state = STATE_NORMAL;
				return end;
			}
			else if( *p == L'.' ){
				//	ピリオドは式の末尾か,小数点として使われる.
				if( p > head && ( L'0' <= p[-1] && p[-1] <= L'9' )){
					//	小数点かもしれないので,そのままにする
				}
				else {
					//	引数の途中で文末が現れたのは解析が失敗している
					//	括弧の閉じ忘れが考えられるので,仕切り直し
					m_state = STATE_NORMAL;
					return end;
				}
			}
			else if( *p == L'"' ){
				quote = L'"';
			}
			else if( *p == L'\'' ){
				quote = L'\'';
			}
			else if( IS_COMMENT( *p )){
				return end;
			}
		}
	}
	return p;
}