dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #include "stdafx.h" dcdd144598 2011-02-23 kinaba: #include "ConfigManager.h" dcdd144598 2011-02-23 kinaba: #include "rsrc/resource.h" dcdd144598 2011-02-23 kinaba: #include "RSearch.h" dcdd144598 2011-02-23 kinaba: using namespace ki; dcdd144598 2011-02-23 kinaba: using namespace editwing; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void BootNewProcess( const TCHAR* cmd ); // in GpMain.cpp dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: // 設定項目管理。 dcdd144598 2011-02-23 kinaba: // SetDocTypeで切り替えると、文書タイプ依存の項目を自動で dcdd144598 2011-02-23 kinaba: // 入れ替えたり色々。 dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ConfigManager::ConfigManager() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // デフォルトのレイアウト設定は何よりも先に読んでおく dcdd144598 2011-02-23 kinaba: DocType d; dcdd144598 2011-02-23 kinaba: d.name.Load( IDS_DEFAULT ); dcdd144598 2011-02-23 kinaba: d.layfile = TEXT("default.lay"); dcdd144598 2011-02-23 kinaba: LoadLayout( &d ); dcdd144598 2011-02-23 kinaba: dtList_.Add( d ); dcdd144598 2011-02-23 kinaba: curDt_ = dtList_.begin(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // ini読み込み dcdd144598 2011-02-23 kinaba: LoadIni(); dcdd144598 2011-02-23 kinaba: SetDocTypeByName( newfileDoctype_ ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ConfigManager::~ConfigManager() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // ini保存 dcdd144598 2011-02-23 kinaba: SaveIni(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void ConfigManager::SetDocTypeByName( const ki::String& nam ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: curDt_ = dtList_.begin(); dcdd144598 2011-02-23 kinaba: DtList::iterator b = dtList_.begin(); dcdd144598 2011-02-23 kinaba: DtList::iterator e = dtList_.end(); dcdd144598 2011-02-23 kinaba: for( ; b!=e; ++b ) dcdd144598 2011-02-23 kinaba: if( b->name == nam ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: curDt_ = b; dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: LoadLayout( &*curDt_ ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: int ConfigManager::SetDocType( const Path& fname ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: const unicode* uname = fname.ConvToWChar(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: int ct = 1; dcdd144598 2011-02-23 kinaba: DtList::iterator i=dtList_.begin(), e=dtList_.end(); dcdd144598 2011-02-23 kinaba: if( fname.len() > 0 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: for( ++i; i!=e; ++i, ++ct ) dcdd144598 2011-02-23 kinaba: if( i->pattern.len() > 0 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: const unicode* upat = i->pattern.ConvToWChar(); dcdd144598 2011-02-23 kinaba: bool b = MatchDocType( uname, upat ); dcdd144598 2011-02-23 kinaba: i->pattern.FreeWCMem( upat ); dcdd144598 2011-02-23 kinaba: if( b ) break; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: if( i == e ) dcdd144598 2011-02-23 kinaba: ct=0, i=dtList_.begin(); // 適切なのが見つからなければ[標準]。 dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ct = 0; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SetDocTypeByName( i->name ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: fname.FreeWCMem( uname ); dcdd144598 2011-02-23 kinaba: return ct; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool ConfigManager::MatchDocType dcdd144598 2011-02-23 kinaba: ( const unicode* fname, const unicode* pat ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // pattern と fname とのマッチをとって判定… dcdd144598 2011-02-23 kinaba: return reg_match( pat, fname, false ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: // 設定ダイアログ関連 dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: struct ConfigDlg : public ki::DlgImpl dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: typedef ConfigManager::DtList::iterator DTI; dcdd144598 2011-02-23 kinaba: ulong curSel_; dcdd144598 2011-02-23 kinaba: void SaveDt() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: DTI p=myDtl_.begin(), e=myDtl_.end(); dcdd144598 2011-02-23 kinaba: for( ulong ct=0; p!=e && ct!=curSel_; ++ct,++p ); dcdd144598 2011-02-23 kinaba: if( p==e ) return; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: TCHAR buf[256]; dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_DT_PAT, WM_GETTEXT, dcdd144598 2011-02-23 kinaba: countof(buf),reinterpret_cast<LPARAM>(buf)); dcdd144598 2011-02-23 kinaba: p->pattern = buf; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_KWD, CB_GETLBTEXT, dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_KWD, CB_GETCURSEL), dcdd144598 2011-02-23 kinaba: reinterpret_cast<LPARAM>(buf) ); dcdd144598 2011-02-23 kinaba: p->kwdfile = buf; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_LAY, CB_GETLBTEXT, dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_LAY, CB_GETCURSEL), dcdd144598 2011-02-23 kinaba: reinterpret_cast<LPARAM>(buf) ); dcdd144598 2011-02-23 kinaba: p->layfile = buf; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: void SelDt(ulong i) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: DTI p=myDtl_.begin(), e=myDtl_.end(); dcdd144598 2011-02-23 kinaba: for( ulong ct=0; p!=e && ct!=i; ++ct,++p ); dcdd144598 2011-02-23 kinaba: if( p==e ) return; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: curSel_ = i; dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_DT_PAT, WM_SETTEXT, p->pattern.c_str()); dcdd144598 2011-02-23 kinaba: if( p->kwdfile.len()==0 ) dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_KWD, CB_SETCURSEL); dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_KWD,CB_SELECTSTRING,p->kwdfile.c_str()); dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_LAY,CB_SELECTSTRING,p->layfile.c_str()); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: void on_deldoctype() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ulong ct; dcdd144598 2011-02-23 kinaba: DTI p=myDtl_.begin(), e=myDtl_.end(); dcdd144598 2011-02-23 kinaba: for( ct=0; p!=e && ct!=curSel_; ++ct,++p ); dcdd144598 2011-02-23 kinaba: if( p==e ) return; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: String msg = TEXT("["); dcdd144598 2011-02-23 kinaba: msg += p->name, msg += TEXT("]"), msg += String(IDS_OKTODEL); dcdd144598 2011-02-23 kinaba: if( IDNO == dcdd144598 2011-02-23 kinaba: MsgBox( msg.c_str(), String(IDS_APPNAME).c_str(), MB_YESNO ) ) dcdd144598 2011-02-23 kinaba: return; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: myDtl_.Del(p); dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_DOCTYPELIST, LB_DELETESTRING, ct ); dcdd144598 2011-02-23 kinaba: SelDt(0); dcdd144598 2011-02-23 kinaba: if( ct+1 == (ulong)SendMsgToItem(IDC_NEWDT,CB_GETCURSEL) ) dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWDT, CB_SETCURSEL ); dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWDT, CB_DELETESTRING, ct+1 ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: void on_newdoctype() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: struct NewDocTypeDlg : public DlgImpl dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: NewDocTypeDlg(HWND wnd) dcdd144598 2011-02-23 kinaba: : DlgImpl(IDD_ADDDOCTYPE) { GoModal(wnd); } dcdd144598 2011-02-23 kinaba: virtual bool on_ok() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: TCHAR buf[MAX_PATH]; dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_NAME, WM_GETTEXT, dcdd144598 2011-02-23 kinaba: countof(buf),reinterpret_cast<LPARAM>(buf)); dcdd144598 2011-02-23 kinaba: name = buf; dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_EXT, WM_GETTEXT, dcdd144598 2011-02-23 kinaba: countof(buf),reinterpret_cast<LPARAM>(buf)); dcdd144598 2011-02-23 kinaba: ext=buf; dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: String name; dcdd144598 2011-02-23 kinaba: String ext; dcdd144598 2011-02-23 kinaba: } dlg( hwnd() ); dcdd144598 2011-02-23 kinaba: if( IDOK == dlg.endcode() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ConfigManager::DocType ndt; dcdd144598 2011-02-23 kinaba: TCHAR buf[200]; dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_KWD, CB_GETLBTEXT, dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_KWD, CB_GETCURSEL), dcdd144598 2011-02-23 kinaba: reinterpret_cast<LPARAM>(buf) ); dcdd144598 2011-02-23 kinaba: ndt.kwdfile = buf; dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_LAY, CB_GETLBTEXT, dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_LAY, CB_GETCURSEL), dcdd144598 2011-02-23 kinaba: reinterpret_cast<LPARAM>(buf) ); dcdd144598 2011-02-23 kinaba: ndt.layfile = buf; dcdd144598 2011-02-23 kinaba: ndt.name = dlg.name; dcdd144598 2011-02-23 kinaba: ndt.pattern = TEXT(".*\\.")+dlg.ext+TEXT("$"); dcdd144598 2011-02-23 kinaba: myDtl_.Add(ndt); dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_DOCTYPELIST, LB_ADDSTRING, dcdd144598 2011-02-23 kinaba: ndt.name.c_str() ); dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWDT, CB_ADDSTRING, dcdd144598 2011-02-23 kinaba: ndt.name.c_str() ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: ConfigDlg( ConfigManager& cfg, HWND wnd ) dcdd144598 2011-02-23 kinaba: : cfg_( cfg ) dcdd144598 2011-02-23 kinaba: , DlgImpl( IDD_CONFIG ) dcdd144598 2011-02-23 kinaba: , curSel_( 0xffffffff ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: for( DTI i=++cfg_.dtList_.begin(); i!=cfg_.dtList_.end(); ++i ) dcdd144598 2011-02-23 kinaba: myDtl_.Add( *i ); dcdd144598 2011-02-23 kinaba: GoModal( wnd ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: void on_init() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_LATEST_NUM, WM_SETTEXT, dcdd144598 2011-02-23 kinaba: String().SetInt(cfg_.mrus_).c_str() ); dcdd144598 2011-02-23 kinaba: if( cfg_.undoLimit() == -1 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_UNDOLIM1, BM_SETCHECK, BST_CHECKED); dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_UNDO_CT, WM_SETTEXT, TEXT("20") ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_UNDOLIM2, BM_SETCHECK, BST_CHECKED); dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_UNDO_CT, WM_SETTEXT, dcdd144598 2011-02-23 kinaba: String().SetInt(cfg_.undoLimit()).c_str() ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: if( cfg_.countByUnicode() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_COUNTBYLETTER, BM_SETCHECK, BST_CHECKED); dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_COUNTBYLETTER2, BM_SETCHECK); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_COUNTBYLETTER, BM_SETCHECK); dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_COUNTBYLETTER2, BM_SETCHECK, BST_CHECKED); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_TXTFILT, WM_SETTEXT, dcdd144598 2011-02-23 kinaba: cfg_.txtFileFilter().c_str() ); dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_EXTGREP, WM_SETTEXT, dcdd144598 2011-02-23 kinaba: cfg_.grepExe().c_str() ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( cfg_.openSame() ) dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_OPENSAME, BM_SETCHECK, BST_CHECKED); dcdd144598 2011-02-23 kinaba: if( cfg_.rememberWindowSize_ ) dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_REMSIZE, BM_SETCHECK, BST_CHECKED); dcdd144598 2011-02-23 kinaba: if( cfg_.rememberWindowPlace_ ) dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_REMPLACE, BM_SETCHECK, BST_CHECKED); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: CharSetList& csl = cfg_.GetCharSetList(); dcdd144598 2011-02-23 kinaba: for(ulong i=1; i<csl.size(); ++i) dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWCS, CB_ADDSTRING, csl[i].longName ); dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWCS, CB_SETCURSEL, csl.findCsi(cfg_.newfileCharset_)-1 ); dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWLB, CB_ADDSTRING, TEXT("CR") ); dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWLB, CB_ADDSTRING, TEXT("LF") ); dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWLB, CB_ADDSTRING, TEXT("CRLF") ); dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWLB, CB_SETCURSEL, cfg_.newfileLB_ ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ulong nfd_idx=0, nfd_cnt=1; dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWDT, CB_ADDSTRING, dcdd144598 2011-02-23 kinaba: cfg_.dtList_.begin()->name.c_str() ); dcdd144598 2011-02-23 kinaba: for( DTI i=myDtl_.begin(), e=myDtl_.end(); i!=e; ++i,++nfd_cnt ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_DOCTYPELIST, LB_ADDSTRING, dcdd144598 2011-02-23 kinaba: i->name.c_str() ); dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWDT, CB_ADDSTRING, dcdd144598 2011-02-23 kinaba: i->name.c_str() ); dcdd144598 2011-02-23 kinaba: if( i->name == cfg_.newfileDoctype_ ) dcdd144598 2011-02-23 kinaba: nfd_idx = nfd_cnt; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_NEWDT, CB_SETCURSEL, nfd_idx ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: FindFile f; dcdd144598 2011-02-23 kinaba: WIN32_FIND_DATA fd; dcdd144598 2011-02-23 kinaba: f.Begin( (Path(Path::Exe)+=TEXT("type\\*.kwd")).c_str() ); dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_PAT_KWD, CB_ADDSTRING, TEXT("") ); dcdd144598 2011-02-23 kinaba: while( f.Next(&fd) ) dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_PAT_KWD, CB_ADDSTRING, fd.cFileName ); dcdd144598 2011-02-23 kinaba: f.Begin( (Path(Path::Exe)+=TEXT("type\\*.lay")).c_str() ); dcdd144598 2011-02-23 kinaba: while( f.Next(&fd) ) dcdd144598 2011-02-23 kinaba: SendMsgToItem( IDC_PAT_LAY, CB_ADDSTRING, fd.cFileName ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SelDt(0); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SetCenter( hwnd(), ::GetParent(hwnd()) ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool on_command( UINT cmd, UINT id, HWND ctrl ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: switch( cmd ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: case LBN_SELCHANGE: dcdd144598 2011-02-23 kinaba: SaveDt(); dcdd144598 2011-02-23 kinaba: SelDt( (ulong)SendMsgToItem( IDC_DOCTYPELIST, LB_GETCURSEL ) ); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: default: dcdd144598 2011-02-23 kinaba: TCHAR buf[256]; dcdd144598 2011-02-23 kinaba: switch( id ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: case IDC_EDITKWD: dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_KWD, CB_GETLBTEXT, dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_KWD, CB_GETCURSEL), dcdd144598 2011-02-23 kinaba: reinterpret_cast<LPARAM>(buf) ); dcdd144598 2011-02-23 kinaba: if( buf[0] != TEXT('\0') ) dcdd144598 2011-02-23 kinaba: BootNewProcess( (TEXT("\"")+Path(Path::Exe)+ dcdd144598 2011-02-23 kinaba: TEXT("type\\")+buf+TEXT("\"") ).c_str()); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case IDC_EDITLAY: dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_LAY, CB_GETLBTEXT, dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_PAT_LAY, CB_GETCURSEL), dcdd144598 2011-02-23 kinaba: reinterpret_cast<LPARAM>(buf) ); dcdd144598 2011-02-23 kinaba: BootNewProcess( (TEXT("\"")+Path(Path::Exe)+ dcdd144598 2011-02-23 kinaba: TEXT("type\\")+buf+TEXT("\"") ).c_str()); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case IDC_NEWDOCTYPE: dcdd144598 2011-02-23 kinaba: on_newdoctype(); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case IDC_DELDOCTYPE: dcdd144598 2011-02-23 kinaba: on_deldoctype(); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: default: dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool on_ok() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: TCHAR buf[100]; dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_LATEST_NUM, WM_GETTEXT, dcdd144598 2011-02-23 kinaba: countof(buf),reinterpret_cast<LPARAM>(buf)); dcdd144598 2011-02-23 kinaba: cfg_.mrus_ = String::GetInt(buf); dcdd144598 2011-02-23 kinaba: cfg_.mrus_ = Min(Max(0, cfg_.mrus_), 20); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( BST_CHECKED == SendMsgToItem(IDC_UNDOLIM1, BM_GETCHECK) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: cfg_.undoLimit_ = -1; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_UNDO_CT, WM_GETTEXT, dcdd144598 2011-02-23 kinaba: countof(buf),reinterpret_cast<LPARAM>(buf)); dcdd144598 2011-02-23 kinaba: cfg_.undoLimit_ = String::GetInt(buf); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_TXTFILT, WM_GETTEXT, dcdd144598 2011-02-23 kinaba: countof(buf),reinterpret_cast<LPARAM>(buf)); dcdd144598 2011-02-23 kinaba: cfg_.txtFilter_ = buf; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SendMsgToItem(IDC_EXTGREP, WM_GETTEXT, dcdd144598 2011-02-23 kinaba: countof(buf),reinterpret_cast<LPARAM>(buf)); dcdd144598 2011-02-23 kinaba: cfg_.grepExe_ = buf; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: cfg_.openSame_ = dcdd144598 2011-02-23 kinaba: ( BST_CHECKED==SendMsgToItem(IDC_OPENSAME, BM_GETCHECK) ); dcdd144598 2011-02-23 kinaba: cfg_.rememberWindowSize_ = dcdd144598 2011-02-23 kinaba: ( BST_CHECKED==SendMsgToItem(IDC_REMSIZE, BM_GETCHECK) ); dcdd144598 2011-02-23 kinaba: cfg_.rememberWindowPlace_ = dcdd144598 2011-02-23 kinaba: ( BST_CHECKED==SendMsgToItem(IDC_REMPLACE, BM_GETCHECK) ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: cfg_.countbyunicode_ = dcdd144598 2011-02-23 kinaba: ( BST_CHECKED==SendMsgToItem(IDC_COUNTBYLETTER, BM_GETCHECK) ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: cfg_.newfileCharset_ = cfg_.GetCharSetList()[1+SendMsgToItem(IDC_NEWCS, CB_GETCURSEL)].ID; dcdd144598 2011-02-23 kinaba: cfg_.newfileLB_ = (lbcode) SendMsgToItem(IDC_NEWLB, CB_GETCURSEL); dcdd144598 2011-02-23 kinaba: size_t nfd_idx=SendMsgToItem(IDC_NEWDT, CB_GETCURSEL), nfd_cnt=1; dcdd144598 2011-02-23 kinaba: cfg_.newfileDoctype_ = String(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SaveDt(); dcdd144598 2011-02-23 kinaba: cfg_.dtList_.DelAfter( ++cfg_.dtList_.begin() ); dcdd144598 2011-02-23 kinaba: for( DTI i=myDtl_.begin(), e=myDtl_.end(); i!=e; ++i, ++nfd_cnt ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: cfg_.dtList_.Add( *i ); dcdd144598 2011-02-23 kinaba: if( nfd_idx == nfd_cnt ) dcdd144598 2011-02-23 kinaba: cfg_.newfileDoctype_ = i->name; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: ConfigManager& cfg_; dcdd144598 2011-02-23 kinaba: ConfigManager::DtList myDtl_; dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool ConfigManager::DoDialog( const ki::Window& parent ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LoadIni(); dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ConfigDlg dlg(*this, parent.hwnd()); dcdd144598 2011-02-23 kinaba: if( IDOK != dlg.endcode() ) dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: curDt_ = dtList_.begin(); // とりあえず dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: SaveIni(); dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: // *.lay ファイルからの読み込み処理 dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: namespace { dcdd144598 2011-02-23 kinaba: static ulong ToByte( unicode* str ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ulong c = str[0]; dcdd144598 2011-02-23 kinaba: if( L'a' <= str[0] ) c -= (L'a' - 10); dcdd144598 2011-02-23 kinaba: else if( L'A' <= str[0] ) c -= (L'A' - 10); dcdd144598 2011-02-23 kinaba: else c -= L'0'; dcdd144598 2011-02-23 kinaba: c = c*16 + str[1]; dcdd144598 2011-02-23 kinaba: if( L'a' <= str[1] ) c -= (L'a' - 10); dcdd144598 2011-02-23 kinaba: else if( L'A' <= str[1] ) c -= (L'A' - 10); dcdd144598 2011-02-23 kinaba: else c -= L'0'; dcdd144598 2011-02-23 kinaba: return c; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: static ulong GetColor( unicode* str ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return ToByte(str) + (ToByte(str+2)<<8) + (ToByte(str+4)<<16); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: static int GetInt( unicode* str ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: int c = 0; dcdd144598 2011-02-23 kinaba: int s = 1; dcdd144598 2011-02-23 kinaba: if( *str == L'-' ) dcdd144598 2011-02-23 kinaba: s=-1, ++str; dcdd144598 2011-02-23 kinaba: for( ; *str!=L'\0'; ++str ) dcdd144598 2011-02-23 kinaba: c = c * 10 + *str - L'0'; dcdd144598 2011-02-23 kinaba: return c*s; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void ConfigManager::LoadLayout( ConfigManager::DocType* dt ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 1.省略値として… dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: DtList::iterator ref = dtList_.begin(); dcdd144598 2011-02-23 kinaba: if( ref != dtList_.end() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // default.layがロードされていればそれを使う dcdd144598 2011-02-23 kinaba: dt->vc = ref->vc; dcdd144598 2011-02-23 kinaba: dt->wrapWidth = ref->wrapWidth; dcdd144598 2011-02-23 kinaba: dt->wrapType = ref->wrapType; dcdd144598 2011-02-23 kinaba: dt->showLN = ref->showLN; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 組み込みのデフォルト設定をロード dcdd144598 2011-02-23 kinaba: dt->vc.SetFont( TEXT("FixedSys"), 14 ); dcdd144598 2011-02-23 kinaba: dt->vc.SetTabStep( 4 ); dcdd144598 2011-02-23 kinaba: dt->vc.color[TXT] = RGB(0,0,0); dcdd144598 2011-02-23 kinaba: dt->vc.color[KWD] = RGB(0,90,230); dcdd144598 2011-02-23 kinaba: dt->vc.color[CMT] = RGB(0,0,0); dcdd144598 2011-02-23 kinaba: dt->vc.color[BG] = RGB(255,255,255); dcdd144598 2011-02-23 kinaba: dt->vc.color[CTL] = RGB(240,200,240); dcdd144598 2011-02-23 kinaba: dt->vc.color[LN] = RGB(0,0,0); dcdd144598 2011-02-23 kinaba: dt->vc.sc[scEOF] = dt->vc.sc[scEOL]=true; dcdd144598 2011-02-23 kinaba: dt->vc.sc[scHSP] = dt->vc.sc[scZSP]=dt->vc.sc[scTAB]=false; dcdd144598 2011-02-23 kinaba: dt->wrapWidth = 80; dcdd144598 2011-02-23 kinaba: dt->wrapType = -1; dcdd144598 2011-02-23 kinaba: dt->showLN = false; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 2.*.layファイルからの読み込み dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: TextFileR tf( UTF16LE ); dcdd144598 2011-02-23 kinaba: if( tf.Open( (Path(Path::Exe)+TEXT("type\\")+dt->layfile).c_str() ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: String fontname; dcdd144598 2011-02-23 kinaba: int fontsize=0; dcdd144598 2011-02-23 kinaba: int x; dcdd144598 2011-02-23 kinaba: bool clfound = false; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: unicode buf[1024], *ptr=buf+3; dcdd144598 2011-02-23 kinaba: while( tf.state() != 0 ) // !EOF dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: size_t len = tf.ReadLine( buf, countof(buf)-1 ); dcdd144598 2011-02-23 kinaba: if( len<=3 || buf[2]!=L'=' ) dcdd144598 2011-02-23 kinaba: continue; dcdd144598 2011-02-23 kinaba: buf[len] = L'\0'; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: switch( (buf[0]<<16)|buf[1] ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: case 0x00630074: // ct: COLOR-TEXT dcdd144598 2011-02-23 kinaba: dt->vc.color[TXT] = GetColor(ptr); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x0063006B: // ck: COLOR-KEYWORD dcdd144598 2011-02-23 kinaba: dt->vc.color[KWD] = GetColor(ptr); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x00630062: // cb: COLOR-BACKGROUND dcdd144598 2011-02-23 kinaba: dt->vc.color[BG ] = GetColor(ptr); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x00630063: // cc: COLOR-COMMENT dcdd144598 2011-02-23 kinaba: dt->vc.color[CMT] = GetColor(ptr); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x0063006E: // cn: COLOR-CONTROL dcdd144598 2011-02-23 kinaba: dt->vc.color[CTL] = GetColor(ptr); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x0063006C: // cl: COLOR-LINE dcdd144598 2011-02-23 kinaba: clfound = true; dcdd144598 2011-02-23 kinaba: dt->vc.color[LN] = GetColor(ptr); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x00660074: // ft: FONT dcdd144598 2011-02-23 kinaba: fontname = ptr; dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x0073007A: // sz: SIZE dcdd144598 2011-02-23 kinaba: fontsize = GetInt(ptr); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x00740062: // tb: TAB dcdd144598 2011-02-23 kinaba: dt->vc.SetTabStep( GetInt(ptr) ); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x00730063: // sc: SPECIAL-CHAR dcdd144598 2011-02-23 kinaba: x = GetInt(ptr); dcdd144598 2011-02-23 kinaba: dt->vc.sc[scZSP] = (0!=x%10); x/=10; dcdd144598 2011-02-23 kinaba: dt->vc.sc[scHSP] = (0!=x%10); x/=10; dcdd144598 2011-02-23 kinaba: dt->vc.sc[scTAB] = (0!=x%10); x/=10; dcdd144598 2011-02-23 kinaba: dt->vc.sc[scEOL] = (0!=x%10); x/=10; dcdd144598 2011-02-23 kinaba: dt->vc.sc[scEOF] = (0!=x%10); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x00770070: // wp: WRAP-TYPE dcdd144598 2011-02-23 kinaba: dt->wrapType = GetInt(ptr); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x00770077: // ww: WRAP-WIDTH dcdd144598 2011-02-23 kinaba: dt->wrapWidth = GetInt(ptr); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case 0x006C006E: // ln: LINE-NO dcdd144598 2011-02-23 kinaba: dt->showLN = (0!=GetInt(ptr)); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( !clfound ) dcdd144598 2011-02-23 kinaba: dt->vc.color[LN] = dt->vc.color[TXT]; dcdd144598 2011-02-23 kinaba: if( fontname.len()!=0 && fontsize!=0 ) dcdd144598 2011-02-23 kinaba: dt->vc.SetFont( fontname.c_str(), fontsize ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: // *.ini ファイルからの読み込み/書き込み処理 dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: static const TCHAR s_sharedConfigSection[] = TEXT("SharedConfig"); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void ConfigManager::LoadIni() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: FileW fp; dcdd144598 2011-02-23 kinaba: Path inipath(Path::Exe); dcdd144598 2011-02-23 kinaba: inipath+=Path(Path::ExeName).body(); dcdd144598 2011-02-23 kinaba: inipath+=TEXT(".ini"); dcdd144598 2011-02-23 kinaba: if( !inipath.exist() && fp.Open(inipath.c_str()) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: static const char s_defaultIni[] = dcdd144598 2011-02-23 kinaba: "[DocType]\r\n" dcdd144598 2011-02-23 kinaba: "1=C/C++\r\n" dcdd144598 2011-02-23 kinaba: "2=C#\r\n" dcdd144598 2011-02-23 kinaba: "3=D\r\n" dcdd144598 2011-02-23 kinaba: "4=Java\r\n" dcdd144598 2011-02-23 kinaba: "5=HTML\r\n" dcdd144598 2011-02-23 kinaba: "6=CSS\r\n" dcdd144598 2011-02-23 kinaba: "7=Perl\r\n" dcdd144598 2011-02-23 kinaba: "8=Ruby\r\n" dcdd144598 2011-02-23 kinaba: "9=PHP\r\n" dcdd144598 2011-02-23 kinaba: "10=Python\r\n" dcdd144598 2011-02-23 kinaba: "11=Haskell\r\n" dcdd144598 2011-02-23 kinaba: "12=OCaml\r\n" dcdd144598 2011-02-23 kinaba: "13=INI\r\n" dcdd144598 2011-02-23 kinaba: "14=UnicodeText\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[C/C++]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*(\\.(c|cpp|cxx|cc|h|hpp)|include\\\\[^\\.]+)$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=C.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=program.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[Java]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*\\.java$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=Java.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=program.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[HTML]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*(\\.html|\\.htm|temporary internet files\\\\.+)$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=HTML.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=html.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[CSS]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*\\.css$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=CSS.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=program.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[PHP]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*\\.(php|php3|php4)$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=PHP.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=program.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[Python]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*\\.py$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=Python.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=program.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[Ruby]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*\\.rb$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=Ruby.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=program.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[D]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*\\.d$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=D.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=program.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[Haskell]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*\\.l?hs$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=Haskell.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=program.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[OCaml]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*\\.mli?$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=OCaml.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=program.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[C#]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*\\.cs$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=C#.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=program.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[INI]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*\\.ini$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=ini.kwd\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[Perl]\r\n" dcdd144598 2011-02-23 kinaba: "Pattern=.*\\.(pl|pm|cgi)$\r\n" dcdd144598 2011-02-23 kinaba: "Keyword=perl.kwd\r\n" dcdd144598 2011-02-23 kinaba: "Layout=program.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n" dcdd144598 2011-02-23 kinaba: "[UnicodeText]\r\n" dcdd144598 2011-02-23 kinaba: "Layout=unitext.lay\r\n" dcdd144598 2011-02-23 kinaba: "\r\n"; dcdd144598 2011-02-23 kinaba: fp.Write( s_defaultIni, sizeof(s_defaultIni)-1 ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 共通の設定の読み取りセクション dcdd144598 2011-02-23 kinaba: sharedConfigMode_ = ini_.HasSectionEnabled( s_sharedConfigSection ); dcdd144598 2011-02-23 kinaba: if( sharedConfigMode_ ) dcdd144598 2011-02-23 kinaba: ini_.SetSection( s_sharedConfigSection ); dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: ini_.SetSectionAsUserName(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 共通の設定 dcdd144598 2011-02-23 kinaba: undoLimit_ = ini_.GetInt( TEXT("UndoLimit"), -1 ); dcdd144598 2011-02-23 kinaba: txtFilter_ = ini_.GetStr( TEXT("TxtFilter"), dcdd144598 2011-02-23 kinaba: TEXT("*.txt;*.htm;*.html;*.css;*.js;*.d;*.c;*.cpp;*.cc;*.cxx;*.h;*.hpp;*.php;*.php3;*.ini") ); dcdd144598 2011-02-23 kinaba: grepExe_ = ini_.GetStr( TEXT("GrepExe"), TEXT("") ); dcdd144598 2011-02-23 kinaba: openSame_ = ini_.GetBool( TEXT("OpenSame"), false ); dcdd144598 2011-02-23 kinaba: countbyunicode_ = ini_.GetBool( TEXT("CountUni"), false ); dcdd144598 2011-02-23 kinaba: showStatusBar_ = ini_.GetBool( TEXT("StatusBar"), true ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // wnd dcdd144598 2011-02-23 kinaba: rememberWindowSize_ = ini_.GetBool( TEXT("RememberWindowSize"), false ); dcdd144598 2011-02-23 kinaba: rememberWindowPlace_ = ini_.GetBool( TEXT("RememberWindowPos"), false ); dcdd144598 2011-02-23 kinaba: wndX_ = ini_.GetInt( TEXT("WndX"), CW_USEDEFAULT ); dcdd144598 2011-02-23 kinaba: wndY_ = ini_.GetInt( TEXT("WndY"), CW_USEDEFAULT ); dcdd144598 2011-02-23 kinaba: wndW_ = ini_.GetInt( TEXT("WndW"), CW_USEDEFAULT ); dcdd144598 2011-02-23 kinaba: wndH_ = ini_.GetInt( TEXT("WndH"), CW_USEDEFAULT ); dcdd144598 2011-02-23 kinaba: wndM_ = ini_.GetBool( TEXT("WndM"), false ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // TODO: MRU dcdd144598 2011-02-23 kinaba: mrus_ = ini_.GetInt( TEXT("MRU"), 4 ); dcdd144598 2011-02-23 kinaba: mrus_ = Min(Max(0, mrus_), 20); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 新規ファイル関係 dcdd144598 2011-02-23 kinaba: newfileCharset_ = ini_.GetInt( TEXT("NewfileCharset"), charSets_.defaultCs() ); dcdd144598 2011-02-23 kinaba: if(newfileCharset_ == -1) newfileCharset_ = 1252; // 1.07.4 bugfix dcdd144598 2011-02-23 kinaba: newfileDoctype_ = ini_.GetStr( TEXT("NewfileDoctype"), String() ); dcdd144598 2011-02-23 kinaba: newfileLB_ = (lbcode) ini_.GetInt( TEXT("NewfileLB"), CRLF ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 文書タイプリストの0番以外のクリア dcdd144598 2011-02-23 kinaba: dtList_.DelAfter( ++dtList_.begin() ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: String s, r; dcdd144598 2011-02-23 kinaba: for( int i=1; true; ++i ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 文書タイプ名を読み込み dcdd144598 2011-02-23 kinaba: ini_.SetSection( TEXT("DocType") ); dcdd144598 2011-02-23 kinaba: s.SetInt(i); dcdd144598 2011-02-23 kinaba: r = ini_.GetStr( s.c_str(), String() ); dcdd144598 2011-02-23 kinaba: if( r.len() == 0 ) dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // その文書タイプを実際に読み込み dcdd144598 2011-02-23 kinaba: ini_.SetSection( r.c_str() ); dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: DocType d; dcdd144598 2011-02-23 kinaba: d.name = r; dcdd144598 2011-02-23 kinaba: d.layfile = ini_.GetStr( TEXT("Layout"),TEXT("default.lay")); dcdd144598 2011-02-23 kinaba: d.kwdfile = ini_.GetStr( TEXT("Keyword"), String() ); dcdd144598 2011-02-23 kinaba: d.pattern = ini_.GetStr( TEXT("Pattern"), String() ); dcdd144598 2011-02-23 kinaba: dtList_.Add( d ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void ConfigManager::SaveIni() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Path inipath(Path::Exe); dcdd144598 2011-02-23 kinaba: inipath+=Path(Path::ExeName).body(); dcdd144598 2011-02-23 kinaba: inipath+=TEXT(".ini"); dcdd144598 2011-02-23 kinaba: if( inipath.isReadOnly() ) dcdd144598 2011-02-23 kinaba: return; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 共通の設定の書き込みセクション dcdd144598 2011-02-23 kinaba: if( sharedConfigMode_ ) dcdd144598 2011-02-23 kinaba: ini_.SetSection( s_sharedConfigSection ); dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: ini_.SetSectionAsUserName(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 共通の設定 dcdd144598 2011-02-23 kinaba: ini_.PutInt( TEXT("UndoLimit"), undoLimit_ ); dcdd144598 2011-02-23 kinaba: ini_.PutStr( TEXT("TxtFilter"), txtFilter_.c_str() ); dcdd144598 2011-02-23 kinaba: ini_.PutStr( TEXT("GrepExe"), grepExe_.c_str() ); dcdd144598 2011-02-23 kinaba: ini_.PutBool( TEXT("OpenSame"), openSame_ ); dcdd144598 2011-02-23 kinaba: ini_.PutBool( TEXT("CountUni"), countbyunicode_ ); dcdd144598 2011-02-23 kinaba: ini_.PutBool( TEXT("StatusBar"), showStatusBar_ ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // Wnd dcdd144598 2011-02-23 kinaba: ini_.PutBool( TEXT("RememberWindowSize"), rememberWindowSize_ ); dcdd144598 2011-02-23 kinaba: ini_.PutBool( TEXT("RememberWindowPos"), rememberWindowPlace_ ); dcdd144598 2011-02-23 kinaba: ini_.PutInt( TEXT("WndX"), wndX_ ); dcdd144598 2011-02-23 kinaba: ini_.PutInt( TEXT("WndY"), wndY_ ); dcdd144598 2011-02-23 kinaba: ini_.PutInt( TEXT("WndW"), wndW_ ); dcdd144598 2011-02-23 kinaba: ini_.PutInt( TEXT("WndH"), wndH_ ); dcdd144598 2011-02-23 kinaba: ini_.PutBool( TEXT("WndM"), wndM_ ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 新規ファイル関係 dcdd144598 2011-02-23 kinaba: ini_.PutInt( TEXT("NewfileCharset"), newfileCharset_ ); dcdd144598 2011-02-23 kinaba: ini_.PutStr( TEXT("NewfileDoctype"), newfileDoctype_.c_str() ); dcdd144598 2011-02-23 kinaba: ini_.PutInt( TEXT("NewfileLB"), newfileLB_ ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // MRU dcdd144598 2011-02-23 kinaba: ini_.PutInt( TEXT("MRU"), mrus_ ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // DocType dcdd144598 2011-02-23 kinaba: for(DtList::iterator i=++dtList_.begin(); i!=dtList_.end(); ++i ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ini_.SetSection( i->name.c_str() ); dcdd144598 2011-02-23 kinaba: ini_.PutStr( TEXT("Pattern"), i->pattern.c_str() ); dcdd144598 2011-02-23 kinaba: ini_.PutStr( TEXT("Keyword"), i->kwdfile.c_str() ); dcdd144598 2011-02-23 kinaba: ini_.PutStr( TEXT("Layout"), i->layfile.c_str() ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ulong ct=1; dcdd144598 2011-02-23 kinaba: ini_.SetSection( TEXT("DocType") ); dcdd144598 2011-02-23 kinaba: for(DtList::iterator i=++dtList_.begin(); i!=dtList_.end(); ++i,++ct) dcdd144598 2011-02-23 kinaba: ini_.PutStr( String().SetInt(ct).c_str(), i->name.c_str() ); dcdd144598 2011-02-23 kinaba: ini_.PutStr( String().SetInt(ct).c_str(), TEXT("") ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: // [最近使ったファイル]関係 dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: namespace { dcdd144598 2011-02-23 kinaba: static const TCHAR* const s_mrulock = TEXT("GreenPad_MRUMutex"); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void ConfigManager::AddMRU( const ki::Path& fname ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Mutex mx(s_mrulock); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // メモリ内のMRUリストを更新 dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: int i; dcdd144598 2011-02-23 kinaba: for( i=0; i<countof(mru_); ++i ) dcdd144598 2011-02-23 kinaba: if( mru_[i] == fname ) dcdd144598 2011-02-23 kinaba: {++i; break;} dcdd144598 2011-02-23 kinaba: for( --i; i>0; --i ) dcdd144598 2011-02-23 kinaba: mru_[i] = mru_[i-1]; dcdd144598 2011-02-23 kinaba: mru_[0] = fname; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // iniへ保存 dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ini_.SetSectionAsUserName(); dcdd144598 2011-02-23 kinaba: const String key = TEXT("MRU"); dcdd144598 2011-02-23 kinaba: for( int i=0; i<countof(mru_); ++i ) dcdd144598 2011-02-23 kinaba: ini_.PutPath( dcdd144598 2011-02-23 kinaba: (key+String().SetInt(i+1)).c_str(), mru_[i] ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void ConfigManager::SetUpMRUMenu( HMENU m, UINT id ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Mutex mx(s_mrulock); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // iniから読み込み dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ini_.SetSectionAsUserName(); dcdd144598 2011-02-23 kinaba: const String key = TEXT("MRU"); dcdd144598 2011-02-23 kinaba: for( int i=0; i<countof(mru_); ++i ) dcdd144598 2011-02-23 kinaba: mru_[i] = ini_.GetPath( dcdd144598 2011-02-23 kinaba: (key+String().SetInt(i+1)).c_str(), Path() ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 全項目を削除 dcdd144598 2011-02-23 kinaba: while( ::DeleteMenu( m, 0, MF_BYPOSITION ) ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // メニュー構築 dcdd144598 2011-02-23 kinaba: MENUITEMINFO mi = { sizeof(MENUITEMINFO) }; dcdd144598 2011-02-23 kinaba: mi.fMask = MIIM_ID | MIIM_TYPE; dcdd144598 2011-02-23 kinaba: mi.fType = MFT_STRING; dcdd144598 2011-02-23 kinaba: for( int i=0; i<countof(mru_); ++i ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( i>=mrus_ || mru_[i].len()==0 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( i==0 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: mi.fMask |= MIIM_STATE; dcdd144598 2011-02-23 kinaba: mi.wID = id; dcdd144598 2011-02-23 kinaba: mi.fState = MFS_DISABLED; dcdd144598 2011-02-23 kinaba: mi.dwTypeData = TEXT("no files"); dcdd144598 2011-02-23 kinaba: mi.cch = 0; dcdd144598 2011-02-23 kinaba: ::InsertMenuItem( m, 0, MF_BYPOSITION, &mi ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: String cpt = mru_[i].CompactIfPossible(60); dcdd144598 2011-02-23 kinaba: mi.wID = id + i; dcdd144598 2011-02-23 kinaba: mi.dwTypeData = const_cast<TCHAR*>(cpt.c_str()); dcdd144598 2011-02-23 kinaba: mi.cch = cpt.len(); dcdd144598 2011-02-23 kinaba: ::InsertMenuItem( m, i, MF_BYPOSITION, &mi ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Path ConfigManager::GetMRU( int no ) const dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: return (0<=no && no<mrus_ ? mru_[no] : Path()); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: // ウインドウサイズ復元処理 dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void ConfigManager::RememberWnd( ki::Window* wnd ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: RECT rc; dcdd144598 2011-02-23 kinaba: wnd->getPos(&rc); dcdd144598 2011-02-23 kinaba: WINDOWPLACEMENT wp = {sizeof(wp)}; dcdd144598 2011-02-23 kinaba: ::GetWindowPlacement( wnd->hwnd(), &wp ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( wp.showCmd==SW_SHOWNORMAL || wp.showCmd == SW_MAXIMIZE ) dcdd144598 2011-02-23 kinaba: wndM_ = (wp.showCmd == SW_MAXIMIZE); dcdd144598 2011-02-23 kinaba: if( wp.showCmd==SW_SHOWNORMAL ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: wndX_ = rc.left; dcdd144598 2011-02-23 kinaba: wndY_ = rc.top; dcdd144598 2011-02-23 kinaba: wndW_ = rc.right- rc.left; dcdd144598 2011-02-23 kinaba: wndH_ = rc.bottom - rc.top; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: //if( this->rememberWindowPlace_ || this->rememberWindowSize_ ) dcdd144598 2011-02-23 kinaba: // SaveIni(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: // [文書タイプ]サブメニューの作成 dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void ConfigManager::SetDocTypeMenu( HMENU m, UINT idstart ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 全項目を削除 dcdd144598 2011-02-23 kinaba: while( ::DeleteMenu( m, 0, MF_BYPOSITION ) ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 順に追加 dcdd144598 2011-02-23 kinaba: MENUITEMINFO mi = { sizeof(MENUITEMINFO) }; dcdd144598 2011-02-23 kinaba: mi.fMask = MIIM_ID | MIIM_STATE | MIIM_TYPE; dcdd144598 2011-02-23 kinaba: mi.fType = MFT_STRING | MFT_RADIOCHECK; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: DtList::iterator i=dtList_.begin(), e=dtList_.end(); dcdd144598 2011-02-23 kinaba: for( int ct=0; i!=e; ++i, ++ct ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: mi.wID = idstart + ct; dcdd144598 2011-02-23 kinaba: mi.fState = (i==curDt_ ? MFS_CHECKED : MFS_UNCHECKED); dcdd144598 2011-02-23 kinaba: mi.dwTypeData = const_cast<TCHAR*>(i->name.c_str()); dcdd144598 2011-02-23 kinaba: mi.cch = i->name.len(); dcdd144598 2011-02-23 kinaba: ::InsertMenuItem( m, ct, MF_BYPOSITION, &mi ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void ConfigManager::SetDocTypeByMenu( int pos, HMENU m ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: MENUITEMINFO mi = { sizeof(MENUITEMINFO) }; dcdd144598 2011-02-23 kinaba: mi.fMask = MIIM_STATE; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: DtList::iterator i=dtList_.begin(), e=dtList_.end(); dcdd144598 2011-02-23 kinaba: for( int ct=0; i!=e; ++i, ++ct ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: mi.fState = (ct==pos ? MFS_CHECKED : MFS_UNCHECKED); dcdd144598 2011-02-23 kinaba: ::SetMenuItemInfo( m, ct, MF_BYPOSITION, &mi ); dcdd144598 2011-02-23 kinaba: if( ct == pos ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: curDt_ = i; dcdd144598 2011-02-23 kinaba: LoadLayout( &*curDt_ ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void ConfigManager::CheckMenu( HMENU m, int pos ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: MENUITEMINFO mi = { sizeof(MENUITEMINFO) }; dcdd144598 2011-02-23 kinaba: mi.fMask = MIIM_STATE; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: DtList::iterator i=dtList_.begin(), e=dtList_.end(); dcdd144598 2011-02-23 kinaba: for( int ct=0; i!=e; ++i, ++ct ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: mi.fState = (ct==pos ? MFS_CHECKED : MFS_UNCHECKED); dcdd144598 2011-02-23 kinaba: ::SetMenuItemInfo( m, ct, MF_BYPOSITION, &mi ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: