dcdd144598 2011-02-23 kinaba: #include "stdafx.h" dcdd144598 2011-02-23 kinaba: #include "rsrc/resource.h" dcdd144598 2011-02-23 kinaba: #include "GpMain.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: //------------------------------------------------------------------------- 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 = TEXT("") ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: STARTUPINFO sti; dcdd144598 2011-02-23 kinaba: PROCESS_INFORMATION psi; dcdd144598 2011-02-23 kinaba: ::GetStartupInfo( &sti ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: String fcmd = Path(Path::ExeName).BeShortStyle(); dcdd144598 2011-02-23 kinaba: fcmd += ' '; dcdd144598 2011-02-23 kinaba: fcmd += cmd; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( ::CreateProcess( NULL, const_cast<TCHAR*>(fcmd.c_str()), dcdd144598 2011-02-23 kinaba: NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, dcdd144598 2011-02-23 kinaba: &sti, &psi ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ::CloseHandle( psi.hThread ); dcdd144598 2011-02-23 kinaba: ::CloseHandle( psi.hProcess ); 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: dcdd144598 2011-02-23 kinaba: inline GpStBar::GpStBar() dcdd144598 2011-02-23 kinaba: : str_(NULL) dcdd144598 2011-02-23 kinaba: , lb_(2) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void GpStBar::SetCsText( const TCHAR* str ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 文字コード表示領域にSetTextする dcdd144598 2011-02-23 kinaba: SetText( str_=str, 1 ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void GpStBar::SetLbText( int lb ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 改行コード表示領域にSetTextする dcdd144598 2011-02-23 kinaba: static const TCHAR* const lbstr[] = {TEXT("CR"),TEXT("LF"),TEXT("CRLF")}; dcdd144598 2011-02-23 kinaba: SetText( lbstr[lb_=lb], 2 ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: int GpStBar::AutoResize( bool maximized ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 文字コード表示領域を確保しつつリサイズ dcdd144598 2011-02-23 kinaba: int h = StatusBar::AutoResize( maximized ); dcdd144598 2011-02-23 kinaba: int w[] = { width()-5, width()-5, width()-5 }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: HDC dc = ::GetDC( hwnd() ); dcdd144598 2011-02-23 kinaba: SIZE s; dcdd144598 2011-02-23 kinaba: if( ::GetTextExtentPoint32( dc, TEXT("BBBBM"), 5, &s ) ) dcdd144598 2011-02-23 kinaba: w[1] = w[2] - s.cx; dcdd144598 2011-02-23 kinaba: if( ::GetTextExtentPoint32( dc, TEXT("BBBBB"), 5, &s ) ) dcdd144598 2011-02-23 kinaba: w[0] = w[1] - s.cx; dcdd144598 2011-02-23 kinaba: ::ReleaseDC( hwnd(), dc ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SetParts( countof(w), w ); dcdd144598 2011-02-23 kinaba: SetCsText( str_ ); dcdd144598 2011-02-23 kinaba: SetLbText( lb_ ); dcdd144598 2011-02-23 kinaba: return h; 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: LRESULT GreenPadWnd::on_message( UINT msg, WPARAM wp, LPARAM lp ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: switch( msg ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // アクティブ化。EditCtrlにフォーカスを。 dcdd144598 2011-02-23 kinaba: case WM_ACTIVATE: dcdd144598 2011-02-23 kinaba: if( LOWORD(wp) != WA_INACTIVE ) dcdd144598 2011-02-23 kinaba: edit_.SetFocus(); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // サイズ変更。子窓を適当に移動。 dcdd144598 2011-02-23 kinaba: case WM_SIZE: dcdd144598 2011-02-23 kinaba: if( wp==SIZE_MAXIMIZED || wp==SIZE_RESTORED ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: int ht = stb_.AutoResize( wp==SIZE_MAXIMIZED ); dcdd144598 2011-02-23 kinaba: edit_.MoveTo( 0, 0, LOWORD(lp), HIWORD(lp)-ht ); dcdd144598 2011-02-23 kinaba: cfg_.RememberWnd(this); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // ウインドウ移動 dcdd144598 2011-02-23 kinaba: case WM_MOVE: dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: RECT rc; dcdd144598 2011-02-23 kinaba: getPos(&rc); dcdd144598 2011-02-23 kinaba: cfg_.RememberWnd(this); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // システムコマンド。終了ボタンとか。 dcdd144598 2011-02-23 kinaba: case WM_SYSCOMMAND: dcdd144598 2011-02-23 kinaba: if( wp==SC_CLOSE || wp==SC_DEFAULT ) dcdd144598 2011-02-23 kinaba: on_exit(); dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: return WndImpl::on_message( msg, wp, lp ); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 右クリックメニュー dcdd144598 2011-02-23 kinaba: case WM_CONTEXTMENU: dcdd144598 2011-02-23 kinaba: if( reinterpret_cast<HWND>(wp) == edit_.hwnd() ) dcdd144598 2011-02-23 kinaba: ::TrackPopupMenu( dcdd144598 2011-02-23 kinaba: ::GetSubMenu( ::GetMenu(hwnd()), 1 ), // 編集メニュー表示 dcdd144598 2011-02-23 kinaba: TPM_LEFTALIGN|TPM_TOPALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, dcdd144598 2011-02-23 kinaba: LOWORD(lp), HIWORD(lp), 0, hwnd(), NULL ); dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: return WndImpl::on_message( msg, wp, lp ); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // メニューのグレーアウト処理 dcdd144598 2011-02-23 kinaba: case WM_INITMENU: dcdd144598 2011-02-23 kinaba: case WM_INITMENUPOPUP: dcdd144598 2011-02-23 kinaba: on_initmenu( reinterpret_cast<HMENU>(wp), msg==WM_INITMENUPOPUP ); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // D&D dcdd144598 2011-02-23 kinaba: case WM_DROPFILES: dcdd144598 2011-02-23 kinaba: on_drop( reinterpret_cast<HDROP>(wp) ); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // MRU dcdd144598 2011-02-23 kinaba: case GPM_MRUCHANGED: dcdd144598 2011-02-23 kinaba: SetupMRUMenu(); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // その他 dcdd144598 2011-02-23 kinaba: default: dcdd144598 2011-02-23 kinaba: return WndImpl::on_message( msg, wp, lp ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: return 0; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool GreenPadWnd::on_command( UINT id, HWND ctrl ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: switch( id ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // Window dcdd144598 2011-02-23 kinaba: case ID_CMD_NEXTWINDOW: on_nextwnd(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_PREVWINDOW: on_prevwnd(); break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // File dcdd144598 2011-02-23 kinaba: case ID_CMD_NEWFILE: on_newfile(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_OPENFILE: on_openfile(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_REOPENFILE: on_reopenfile();break; dcdd144598 2011-02-23 kinaba: case ID_CMD_SAVEFILE: on_savefile(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_SAVEFILEAS: on_savefileas();break; dcdd144598 2011-02-23 kinaba: case ID_CMD_EXIT: on_exit(); break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // Edit dcdd144598 2011-02-23 kinaba: case ID_CMD_UNDO: edit_.getDoc().Undo(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_REDO: edit_.getDoc().Redo(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_CUT: edit_.getCursor().Cut(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_COPY: edit_.getCursor().Copy(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_PASTE: edit_.getCursor().Paste(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_DELETE: if( edit_.getCursor().isSelected() ) dcdd144598 2011-02-23 kinaba: edit_.getCursor().Del(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_SELECTALL: edit_.getCursor().Home(true,false); dcdd144598 2011-02-23 kinaba: edit_.getCursor().End(true,true); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_DATETIME: on_datetime(); break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // Search dcdd144598 2011-02-23 kinaba: case ID_CMD_FIND: search_.ShowDlg(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_FINDNEXT: search_.FindNext(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_FINDPREV: search_.FindPrev(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_JUMP: on_jump(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_GREP: on_grep();break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // View dcdd144598 2011-02-23 kinaba: case ID_CMD_NOWRAP: edit_.getView().SetWrapType( wrap_=-1 ); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_WRAPWIDTH: edit_.getView().SetWrapType( wrap_=cfg_.wrapWidth() ); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_WRAPWINDOW: edit_.getView().SetWrapType( wrap_=0 ); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_CONFIG: on_config(); break; dcdd144598 2011-02-23 kinaba: case ID_CMD_STATUSBAR: on_statusBar(); break; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // DocType dcdd144598 2011-02-23 kinaba: default: if( ID_CMD_DOCTYPE <= id ) { dcdd144598 2011-02-23 kinaba: on_doctype( id - ID_CMD_DOCTYPE ); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: } else if( ID_CMD_MRU <= id ) { dcdd144598 2011-02-23 kinaba: on_mru( id - ID_CMD_MRU ); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // Default dcdd144598 2011-02-23 kinaba: return false; 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 GreenPadWnd::PreTranslateMessage( MSG* msg ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 苦肉の策^^; dcdd144598 2011-02-23 kinaba: if( search_.TrapMsg(msg) ) dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: // キーボードショートカット処理 dcdd144598 2011-02-23 kinaba: return 0 != ::TranslateAccelerator( hwnd(), accel_, msg ); 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: void GreenPadWnd::on_dirtyflag_change( bool ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: UpdateWindowName(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_newfile() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: BootNewProcess(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_openfile() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Path fn; dcdd144598 2011-02-23 kinaba: int cs; dcdd144598 2011-02-23 kinaba: if( ShowOpenDlg( &fn, &cs ) ) dcdd144598 2011-02-23 kinaba: Open( fn, cs ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_reopenfile() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( !isUntitled() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ReopenDlg dlg( charSets_, csi_ ); dcdd144598 2011-02-23 kinaba: dlg.GoModal( hwnd() ); dcdd144598 2011-02-23 kinaba: if( dlg.endcode()==IDOK && AskToSave() ) dcdd144598 2011-02-23 kinaba: OpenByMyself( filename_, charSets_[dlg.csi()].ID, false ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_savefile() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Save_showDlgIfNeeded(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_savefileas() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( ShowSaveDlg() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Save(); dcdd144598 2011-02-23 kinaba: ReloadConfig(); // 文書タイプに応じて表示を更新 dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_exit() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: search_.SaveToINI( cfg_.getImpl() ); dcdd144598 2011-02-23 kinaba: if( AskToSave() ) dcdd144598 2011-02-23 kinaba: Destroy(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_initmenu( HMENU menu, bool editmenu_only ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LOGGER("GreenPadWnd::ReloadConfig on_initmenu begin"); dcdd144598 2011-02-23 kinaba: MENUITEMINFO mi = { sizeof(MENUITEMINFO), MIIM_STATE }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: mi.fState = dcdd144598 2011-02-23 kinaba: (edit_.getCursor().isSelected() ? MFS_ENABLED : MFS_DISABLED); dcdd144598 2011-02-23 kinaba: SetMenuItemInfo( menu, ID_CMD_CUT, FALSE, &mi ); dcdd144598 2011-02-23 kinaba: SetMenuItemInfo( menu, ID_CMD_COPY, FALSE, &mi ); dcdd144598 2011-02-23 kinaba: SetMenuItemInfo( menu, ID_CMD_DELETE, FALSE, &mi ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: mi.fState = dcdd144598 2011-02-23 kinaba: (edit_.getDoc().isUndoAble() ? MFS_ENABLED : MFS_DISABLED); dcdd144598 2011-02-23 kinaba: SetMenuItemInfo( menu, ID_CMD_UNDO, FALSE, &mi ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: mi.fState = dcdd144598 2011-02-23 kinaba: (edit_.getDoc().isRedoAble() ? MFS_ENABLED : MFS_DISABLED); dcdd144598 2011-02-23 kinaba: SetMenuItemInfo( menu, ID_CMD_REDO, FALSE, &mi ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( editmenu_only ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LOGGER("GreenPadWnd::ReloadConfig on_initmenu end"); dcdd144598 2011-02-23 kinaba: return; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: mi.fState = (isUntitled() || edit_.getDoc().isModified() dcdd144598 2011-02-23 kinaba: ? MFS_ENABLED : MFS_DISABLED); dcdd144598 2011-02-23 kinaba: SetMenuItemInfo( menu, ID_CMD_SAVEFILE, FALSE, &mi ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: mi.fState = dcdd144598 2011-02-23 kinaba: (!isUntitled() ? MFS_ENABLED : MFS_DISABLED); dcdd144598 2011-02-23 kinaba: SetMenuItemInfo( menu, ID_CMD_REOPENFILE, FALSE, &mi ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: mi.fState = dcdd144598 2011-02-23 kinaba: (cfg_.grepExe().len()>0 ? MFS_ENABLED : MFS_DISABLED); dcdd144598 2011-02-23 kinaba: SetMenuItemInfo( menu, ID_CMD_GREP, FALSE, &mi ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: UINT id = (wrap_==-1 ? ID_CMD_NOWRAP dcdd144598 2011-02-23 kinaba: : (wrap_>0 ? ID_CMD_WRAPWIDTH : ID_CMD_WRAPWINDOW)); dcdd144598 2011-02-23 kinaba: ::CheckMenuRadioItem( dcdd144598 2011-02-23 kinaba: menu, ID_CMD_NOWRAP, ID_CMD_WRAPWINDOW, id, MF_BYCOMMAND ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ::CheckMenuItem( menu, ID_CMD_STATUSBAR, dcdd144598 2011-02-23 kinaba: cfg_.showStatusBar()?MFS_CHECKED:MFS_UNCHECKED ); dcdd144598 2011-02-23 kinaba: LOGGER("GreenPadWnd::ReloadConfig on_initmenu end"); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_drop( HDROP hd ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: UINT iMax = ::DragQueryFile( hd, 0xffffffff, NULL, 0 ); dcdd144598 2011-02-23 kinaba: for( UINT i=0; i<iMax; ++i ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: TCHAR str[MAX_PATH]; dcdd144598 2011-02-23 kinaba: ::DragQueryFile( hd, i, str, countof(str) ); dcdd144598 2011-02-23 kinaba: Open( str, AutoDetect ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: ::DragFinish( hd ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_jump() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: struct JumpDlg : public DlgImpl { dcdd144598 2011-02-23 kinaba: JumpDlg(HWND w) : DlgImpl(IDD_JUMP), w_(w) { GoModal(w); } dcdd144598 2011-02-23 kinaba: void on_init() { dcdd144598 2011-02-23 kinaba: SetCenter(hwnd(),w_); ::SetFocus(item(IDC_LINEBOX)); } dcdd144598 2011-02-23 kinaba: bool on_ok() { dcdd144598 2011-02-23 kinaba: TCHAR str[100]; dcdd144598 2011-02-23 kinaba: ::GetWindowText( item(IDC_LINEBOX), str, countof(str) ); dcdd144598 2011-02-23 kinaba: LineNo = String(str).GetInt(); dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: int LineNo; HWND w_; dcdd144598 2011-02-23 kinaba: } dlg(hwnd()); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( IDOK == dlg.endcode() ) dcdd144598 2011-02-23 kinaba: JumpToLine( dlg.LineNo ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_grep() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Path g = cfg_.grepExe(); dcdd144598 2011-02-23 kinaba: if( g.len() != 0 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Path d; dcdd144598 2011-02-23 kinaba: if( filename_.len() ) dcdd144598 2011-02-23 kinaba: (d = filename_).BeDirOnly().BeBackSlash(false); dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: d = Path(Path::Cur); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: String fcmd; dcdd144598 2011-02-23 kinaba: for( int i=0, e=g.len(); i<e; ++i ) dcdd144598 2011-02-23 kinaba: if( g[i]==TEXT('%') ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( g[i+1]==TEXT('1') || g[i+1]==TEXT('D') ) // '1' for bkwd compat dcdd144598 2011-02-23 kinaba: ++i, fcmd += d; dcdd144598 2011-02-23 kinaba: else if( g[i+1]==TEXT('F') ) dcdd144598 2011-02-23 kinaba: ++i, fcmd += filename_; dcdd144598 2011-02-23 kinaba: else if( g[i+1]==TEXT('N') ) dcdd144598 2011-02-23 kinaba: ++i, fcmd += filename_.name(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: fcmd += g[i]; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: PROCESS_INFORMATION psi; dcdd144598 2011-02-23 kinaba: STARTUPINFO sti = {sizeof(STARTUPINFO)}; dcdd144598 2011-02-23 kinaba: //sti.dwFlags = STARTF_USESHOWWINDOW; dcdd144598 2011-02-23 kinaba: //sti.wShowWindow = SW_SHOWNORMAL; dcdd144598 2011-02-23 kinaba: if( ::CreateProcess( NULL, const_cast<TCHAR*>(fcmd.c_str()), dcdd144598 2011-02-23 kinaba: NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, dcdd144598 2011-02-23 kinaba: &sti, &psi ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ::CloseHandle( psi.hThread ); dcdd144598 2011-02-23 kinaba: ::CloseHandle( psi.hProcess ); 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 GreenPadWnd::on_datetime() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: TCHAR buf[255], tmp[255]; dcdd144598 2011-02-23 kinaba: ::GetTimeFormat dcdd144598 2011-02-23 kinaba: ( LOCALE_USER_DEFAULT, 0, NULL, TEXT("HH:mm "), buf, countof(buf)); dcdd144598 2011-02-23 kinaba: ::GetDateFormat dcdd144598 2011-02-23 kinaba: ( LOCALE_USER_DEFAULT, 0, NULL, TEXT("yy/MM/dd"),tmp,countof(tmp)); dcdd144598 2011-02-23 kinaba: ::lstrcat( buf, tmp ); dcdd144598 2011-02-23 kinaba: edit_.getCursor().Input( buf, ::lstrlen(buf) ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_doctype( int no ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( HMENU m = ::GetSubMenu( ::GetSubMenu(::GetMenu(hwnd()),3),4 ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: cfg_.SetDocTypeByMenu( no, m ); dcdd144598 2011-02-23 kinaba: ReloadConfig( true ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_config() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( cfg_.DoDialog(*this) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: SetupSubMenu(); dcdd144598 2011-02-23 kinaba: SetupMRUMenu(); dcdd144598 2011-02-23 kinaba: ReloadConfig(false); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: static inline void MyShowWnd( HWND wnd ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( ::IsIconic(wnd) ) dcdd144598 2011-02-23 kinaba: ::ShowWindow( wnd, SW_RESTORE ); dcdd144598 2011-02-23 kinaba: ::BringWindowToTop( wnd ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_nextwnd() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( HWND next = ::FindWindowEx( NULL, hwnd(), className_, NULL ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: HWND last=next, pos; dcdd144598 2011-02-23 kinaba: while( last != NULL ) dcdd144598 2011-02-23 kinaba: last = ::FindWindowEx( NULL, pos=last, className_, NULL ); dcdd144598 2011-02-23 kinaba: if( pos != next ) dcdd144598 2011-02-23 kinaba: ::SetWindowPos( hwnd(), pos, dcdd144598 2011-02-23 kinaba: 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW ); dcdd144598 2011-02-23 kinaba: MyShowWnd( next ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_prevwnd() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: HWND pos=NULL, next=::FindWindowEx( NULL,NULL,className_,NULL ); dcdd144598 2011-02-23 kinaba: if( next==hwnd() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: while( next != NULL ) dcdd144598 2011-02-23 kinaba: next = ::FindWindowEx( NULL,pos=next,className_,NULL ); dcdd144598 2011-02-23 kinaba: if( pos!=hwnd()) dcdd144598 2011-02-23 kinaba: MyShowWnd( pos ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: while( next!=hwnd() && next!=NULL ) dcdd144598 2011-02-23 kinaba: next = ::FindWindowEx( NULL,pos=next,className_,NULL ); dcdd144598 2011-02-23 kinaba: if( next!=NULL ) dcdd144598 2011-02-23 kinaba: MyShowWnd( pos ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_statusBar() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: stb_.SetStatusBarVisible( !stb_.isStatusBarVisible() ); dcdd144598 2011-02-23 kinaba: cfg_.ShowStatusBarSwitch(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: WINDOWPLACEMENT wp = {sizeof(wp)}; dcdd144598 2011-02-23 kinaba: ::GetWindowPlacement( hwnd(), &wp ); dcdd144598 2011-02-23 kinaba: if( wp.showCmd != SW_MINIMIZE ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: const int ht = stb_.AutoResize( wp.showCmd == SW_MAXIMIZE ); dcdd144598 2011-02-23 kinaba: RECT rc; dcdd144598 2011-02-23 kinaba: getClientRect(&rc); dcdd144598 2011-02-23 kinaba: edit_.MoveTo( 0, 0, rc.right, rc.bottom-ht ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_move( const DPos& c, const DPos& s ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: static int busy_cnt = 0; dcdd144598 2011-02-23 kinaba: if( edit_.getDoc().isBusy() && ((++busy_cnt)&0xff) ) dcdd144598 2011-02-23 kinaba: return; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ulong cad = c.ad; dcdd144598 2011-02-23 kinaba: if( ! cfg_.countByUnicode() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // ShiftJIS風のByte数カウント dcdd144598 2011-02-23 kinaba: const unicode* cu = edit_.getDoc().tl(c.tl); dcdd144598 2011-02-23 kinaba: const ulong tab = cfg_.vConfig().tabstep; dcdd144598 2011-02-23 kinaba: cad = 0; dcdd144598 2011-02-23 kinaba: for( ulong i=0; i<c.ad; ++i ) dcdd144598 2011-02-23 kinaba: if( cu[i] == L'\t' ) dcdd144598 2011-02-23 kinaba: cad = (cad/tab+1)*tab; dcdd144598 2011-02-23 kinaba: else if( cu[i]<0x80 || 0xff60<=cu[i] && cu[i]<=0xff9f ) dcdd144598 2011-02-23 kinaba: cad = cad + 1; dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: cad = cad + 2; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: String str; dcdd144598 2011-02-23 kinaba: str += TEXT('('); dcdd144598 2011-02-23 kinaba: str += String().SetInt(c.tl+1); dcdd144598 2011-02-23 kinaba: str += TEXT(','); dcdd144598 2011-02-23 kinaba: str += String().SetInt(cad+1); dcdd144598 2011-02-23 kinaba: str += TEXT(')'); dcdd144598 2011-02-23 kinaba: if( c != s ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ulong sad = s.ad; dcdd144598 2011-02-23 kinaba: if( ! cfg_.countByUnicode() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // ShiftJIS風のByte数カウント dcdd144598 2011-02-23 kinaba: const unicode* su = edit_.getDoc().tl(s.tl); dcdd144598 2011-02-23 kinaba: sad = 0; dcdd144598 2011-02-23 kinaba: for( ulong i=0; i<s.ad; ++i ) dcdd144598 2011-02-23 kinaba: sad += (su[i]<0x80 || 0xff60<=su[i] && su[i]<=0xff9f ? 1 : 2); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: str += TEXT(" - ("); dcdd144598 2011-02-23 kinaba: str += String().SetInt(s.tl+1); dcdd144598 2011-02-23 kinaba: str += TEXT(','); dcdd144598 2011-02-23 kinaba: str += String().SetInt(sad+1); dcdd144598 2011-02-23 kinaba: str += TEXT(')'); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: stb_.SetText( str.c_str() ); 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: void GreenPadWnd::JumpToLine( ulong ln ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: edit_.getCursor().MoveCur( DPos(ln-1,0), false ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::SetupSubMenu() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( HMENU m = ::GetSubMenu( ::GetSubMenu(::GetMenu(hwnd()),3),4 ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: cfg_.SetDocTypeMenu( m, ID_CMD_DOCTYPE ); dcdd144598 2011-02-23 kinaba: ::DrawMenuBar( hwnd() ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::UpdateWindowName() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // タイトルバーに表示される文字列の調整 dcdd144598 2011-02-23 kinaba: // [FileName *] - GreenPad dcdd144598 2011-02-23 kinaba: String name; dcdd144598 2011-02-23 kinaba: name += TEXT('['); dcdd144598 2011-02-23 kinaba: name += isUntitled() ? TEXT("untitled") : filename_.name(); dcdd144598 2011-02-23 kinaba: if( edit_.getDoc().isModified() ) name += TEXT(" *"); dcdd144598 2011-02-23 kinaba: name += TEXT("] - "); dcdd144598 2011-02-23 kinaba: name += String(IDS_APPNAME).c_str(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SetText( name.c_str() ); dcdd144598 2011-02-23 kinaba: stb_.SetCsText( charSets_[csi_].shortName ); dcdd144598 2011-02-23 kinaba: stb_.SetLbText( lb_ ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::SetupMRUMenu() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( HMENU m = ::GetSubMenu( ::GetSubMenu(::GetMenu(hwnd()),0),8 ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: cfg_.SetUpMRUMenu( m, ID_CMD_MRU ); dcdd144598 2011-02-23 kinaba: ::DrawMenuBar( hwnd() ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_mru( int no ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Path fn = cfg_.GetMRU(no); dcdd144598 2011-02-23 kinaba: if( fn.len() != 0 ) dcdd144598 2011-02-23 kinaba: Open( fn, AutoDetect ); 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: void GreenPadWnd::ReloadConfig( bool noSetDocType ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 文書タイプロード dcdd144598 2011-02-23 kinaba: if( !noSetDocType ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: int t = cfg_.SetDocType( filename_ ); dcdd144598 2011-02-23 kinaba: if( HMENU m = ::GetSubMenu( ::GetSubMenu(::GetMenu(hwnd()),3),4 ) ) dcdd144598 2011-02-23 kinaba: cfg_.CheckMenu( m, t ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: LOGGER("GreenPadWnd::ReloadConfig DocTypeLoaded"); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // Undo回数制限 dcdd144598 2011-02-23 kinaba: edit_.getDoc().SetUndoLimit( cfg_.undoLimit() ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 行番号 dcdd144598 2011-02-23 kinaba: bool ln = cfg_.showLN(); dcdd144598 2011-02-23 kinaba: edit_.getView().ShowLineNo( ln ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 折り返し方式 dcdd144598 2011-02-23 kinaba: wrap_ = cfg_.wrapType(); dcdd144598 2011-02-23 kinaba: edit_.getView().SetWrapType( wrap_ ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 色・フォント dcdd144598 2011-02-23 kinaba: VConfig vc = cfg_.vConfig(); dcdd144598 2011-02-23 kinaba: edit_.getView().SetFont( vc ); dcdd144598 2011-02-23 kinaba: LOGGER("GreenPadWnd::ReloadConfig ViewConfigLoaded"); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // キーワードファイル dcdd144598 2011-02-23 kinaba: Path kwd = cfg_.kwdFile(); dcdd144598 2011-02-23 kinaba: FileR fp; dcdd144598 2011-02-23 kinaba: if( kwd.len()!=0 && fp.Open(kwd.c_str()) ) dcdd144598 2011-02-23 kinaba: edit_.getDoc().SetKeyword((const unicode*)fp.base(),fp.size()/2); dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: edit_.getDoc().SetKeyword(NULL,0); dcdd144598 2011-02-23 kinaba: LOGGER("GreenPadWnd::ReloadConfig KeywordLoaded"); 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: bool GreenPadWnd::ShowOpenDlg( Path* fn, int* cs ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // [Open][Cancel] 開くファイル名指定ダイアログを表示 dcdd144598 2011-02-23 kinaba: String flst[] = { dcdd144598 2011-02-23 kinaba: String(IDS_TXTFILES), dcdd144598 2011-02-23 kinaba: String(cfg_.txtFileFilter()), dcdd144598 2011-02-23 kinaba: String(IDS_ALLFILES), dcdd144598 2011-02-23 kinaba: String(TEXT("*.*")) dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: aarr<TCHAR> filt = OpenFileDlg::ConnectWithNull(flst,countof(flst)); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: OpenFileDlg ofd( charSets_ ); dcdd144598 2011-02-23 kinaba: bool ok = ofd.DoModal( hwnd(), filt.get(), filename_.c_str() ); dcdd144598 2011-02-23 kinaba: if( ok ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: *fn = ofd.filename(); dcdd144598 2011-02-23 kinaba: *cs = charSets_[ofd.csi()].ID; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: return ok; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool GreenPadWnd::Open( const ki::Path& fn, int cs ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( isUntitled() && !edit_.getDoc().isModified() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 無題で無変更だったら自分で開く dcdd144598 2011-02-23 kinaba: return OpenByMyself( fn, cs ); 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: if( cfg_.openSame() ) dcdd144598 2011-02-23 kinaba: return ( AskToSave() ? OpenByMyself( fn, cs ) : true ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // そうでなければ他へ回す dcdd144598 2011-02-23 kinaba: String dcdd144598 2011-02-23 kinaba: cmd = TEXT("-c"); dcdd144598 2011-02-23 kinaba: cmd += String().SetInt( cs ); dcdd144598 2011-02-23 kinaba: cmd += TEXT(" \""); dcdd144598 2011-02-23 kinaba: cmd += fn; dcdd144598 2011-02-23 kinaba: cmd += TEXT('\"'); dcdd144598 2011-02-23 kinaba: BootNewProcess( cmd.c_str() ); 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: bool GreenPadWnd::OpenByMyself( const ki::Path& fn, int cs, bool needReConf ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // ファイルを開けなかったらそこでおしまい。 dcdd144598 2011-02-23 kinaba: aptr<TextFileR> tf( new TextFileR(cs) ); dcdd144598 2011-02-23 kinaba: if( !tf->Open( fn.c_str() ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // ERROR! dcdd144598 2011-02-23 kinaba: MsgBox( String(IDS_OPENERROR).c_str() ); dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 自分内部の管理情報を更新 dcdd144598 2011-02-23 kinaba: if( fn[0]==TEXT('\\') || fn[1]==TEXT(':') ) dcdd144598 2011-02-23 kinaba: filename_ = fn; dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: filename_ = Path( Path::Cur ) + fn; dcdd144598 2011-02-23 kinaba: if( tf->size() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: csi_ = charSets_.findCsi( tf->codepage() ); dcdd144598 2011-02-23 kinaba: if( tf->nolb_found() ) dcdd144598 2011-02-23 kinaba: lb_ = cfg_.GetNewfileLB(); dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: lb_ = tf->linebreak(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: { // 空ファイルの場合は新規作成と同じ扱い dcdd144598 2011-02-23 kinaba: csi_ = cfg_.GetNewfileCsi(); dcdd144598 2011-02-23 kinaba: lb_ = cfg_.GetNewfileLB(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: filename_.BeShortLongStyle(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // カレントディレクトリを、ファイルのある位置以外にしておく dcdd144598 2011-02-23 kinaba: // (こうしないと、開いているファイルのあるディレクトリが削除できない) dcdd144598 2011-02-23 kinaba: ::SetCurrentDirectory( Path(filename_).BeDriveOnly().c_str() ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 文書タイプに応じて表示を更新 dcdd144598 2011-02-23 kinaba: if( needReConf ) dcdd144598 2011-02-23 kinaba: ReloadConfig(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 開く dcdd144598 2011-02-23 kinaba: edit_.getDoc().ClearAll(); dcdd144598 2011-02-23 kinaba: edit_.getDoc().OpenFile( tf ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // タイトルバー更新 dcdd144598 2011-02-23 kinaba: UpdateWindowName(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // [最近使ったファイル]へ追加 dcdd144598 2011-02-23 kinaba: cfg_.AddMRU( filename_ ); dcdd144598 2011-02-23 kinaba: HWND wnd = NULL; dcdd144598 2011-02-23 kinaba: while( NULL!=(wnd=::FindWindowEx( NULL, wnd, className_, NULL )) ) dcdd144598 2011-02-23 kinaba: SendMessage( wnd, GPM_MRUCHANGED, 0, 0 ); 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: 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: bool GreenPadWnd::ShowSaveDlg() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // [Save][Cancel] 保存先ファイル名指定ダイアログを表示 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: String flst[] = { dcdd144598 2011-02-23 kinaba: String(IDS_ALLFILES), dcdd144598 2011-02-23 kinaba: String(TEXT("*.*")) dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: aarr<TCHAR> filt = SaveFileDlg::ConnectWithNull( flst, countof(flst) ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SaveFileDlg sfd( charSets_, csi_, lb_ ); dcdd144598 2011-02-23 kinaba: if( !sfd.DoModal( hwnd(), filt.get(), filename_.c_str() ) ) dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: filename_ = sfd.filename(); dcdd144598 2011-02-23 kinaba: csi_ = sfd.csi(); dcdd144598 2011-02-23 kinaba: lb_ = sfd.lb(); 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 GreenPadWnd::Save_showDlgIfNeeded() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: bool wasUntitled = isUntitled(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // [Save][Cancel] ファイル名未定ならダイアログ表示 dcdd144598 2011-02-23 kinaba: if( isUntitled() ) dcdd144598 2011-02-23 kinaba: if( !ShowSaveDlg() ) dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: if( Save() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: if( wasUntitled ) dcdd144598 2011-02-23 kinaba: ReloadConfig(); // 文書タイプに応じて表示を更新 dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: return false; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool GreenPadWnd::AskToSave() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 変更されていたら、 dcdd144598 2011-02-23 kinaba: // [Yes][No][Cancel] 保存するかどうか尋ねる。 dcdd144598 2011-02-23 kinaba: // 保存するなら dcdd144598 2011-02-23 kinaba: // [Save][Cancel] ファイル名未定ならダイアログ表示 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( edit_.getDoc().isModified() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: int answer = MsgBox( dcdd144598 2011-02-23 kinaba: String(IDS_ASKTOSAVE).c_str(), dcdd144598 2011-02-23 kinaba: String(IDS_APPNAME).c_str(), dcdd144598 2011-02-23 kinaba: MB_YESNOCANCEL|MB_ICONQUESTION dcdd144598 2011-02-23 kinaba: ); dcdd144598 2011-02-23 kinaba: if( answer == IDYES ) return Save_showDlgIfNeeded(); dcdd144598 2011-02-23 kinaba: if( answer == IDCANCEL ) return false; 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 GreenPadWnd::Save() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: TextFileW tf( charSets_[csi_].ID, lb_ ); dcdd144598 2011-02-23 kinaba: if( tf.Open( filename_.c_str() ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 無事ファイルに保存できた場合 dcdd144598 2011-02-23 kinaba: edit_.getDoc().SaveFile( tf ); dcdd144598 2011-02-23 kinaba: UpdateWindowName(); dcdd144598 2011-02-23 kinaba: // [最近使ったファイル]更新 dcdd144598 2011-02-23 kinaba: cfg_.AddMRU( filename_ ); dcdd144598 2011-02-23 kinaba: HWND wnd = NULL; dcdd144598 2011-02-23 kinaba: while( NULL!=(wnd=::FindWindowEx( NULL, wnd, className_, NULL )) ) dcdd144598 2011-02-23 kinaba: SendMessage( wnd, GPM_MRUCHANGED, 0, 0 ); dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // Error! dcdd144598 2011-02-23 kinaba: MsgBox( String(IDS_SAVEERROR).c_str() ); dcdd144598 2011-02-23 kinaba: return 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: GreenPadWnd::ClsName GreenPadWnd::className_ = TEXT("GreenPad MainWnd"); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: GreenPadWnd::GreenPadWnd() dcdd144598 2011-02-23 kinaba: : WndImpl ( className_, WS_OVERLAPPEDWINDOW, WS_EX_ACCEPTFILES ) dcdd144598 2011-02-23 kinaba: , charSets_( cfg_.GetCharSetList() ) dcdd144598 2011-02-23 kinaba: , csi_ ( cfg_.GetNewfileCsi() ) dcdd144598 2011-02-23 kinaba: , lb_ ( cfg_.GetNewfileLB() ) dcdd144598 2011-02-23 kinaba: , search_ ( *this, edit_ ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LOGGER( "GreenPadWnd::Construct begin" ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: static WNDCLASSEX wc; dcdd144598 2011-02-23 kinaba: wc.hIcon = app().LoadIcon( IDR_MAIN ); dcdd144598 2011-02-23 kinaba: wc.hCursor = app().LoadOemCursor( IDC_ARROW ); dcdd144598 2011-02-23 kinaba: wc.lpszMenuName = MAKEINTRESOURCE( IDR_MAIN ); dcdd144598 2011-02-23 kinaba: wc.lpszClassName = className_; dcdd144598 2011-02-23 kinaba: WndImpl::Register( &wc ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: ime().EnableGlobalIME( true ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LOGGER( "GreenPadWnd::Construct end" ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::on_create( CREATESTRUCT* cs ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LOGGER("GreenPadWnd::on_create begin"); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: accel_ = app().LoadAccel( IDR_MAIN ); dcdd144598 2011-02-23 kinaba: stb_.Create( hwnd() ); dcdd144598 2011-02-23 kinaba: edit_.Create( NULL, hwnd(), 0, 0, 100, 100 ); dcdd144598 2011-02-23 kinaba: LOGGER("GreenPadWnd::on_create edit created"); dcdd144598 2011-02-23 kinaba: edit_.getDoc().AddHandler( this ); dcdd144598 2011-02-23 kinaba: edit_.getCursor().AddHandler( this ); dcdd144598 2011-02-23 kinaba: stb_.SetStatusBarVisible( cfg_.showStatusBar() ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LOGGER("GreenPadWnd::on_create halfway"); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: search_.LoadFromINI( cfg_.getImpl() ); dcdd144598 2011-02-23 kinaba: SetupSubMenu(); dcdd144598 2011-02-23 kinaba: SetupMRUMenu(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LOGGER("GreenPadWnd::on_create menu"); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool GreenPadWnd::StartUp( const Path& fn, int cs, int ln ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LOGGER( "GreenPadWnd::StartUp begin" ); dcdd144598 2011-02-23 kinaba: Create( 0, 0, cfg_.GetWndX(), cfg_.GetWndY(), cfg_.GetWndW(), cfg_.GetWndH(), 0 ); dcdd144598 2011-02-23 kinaba: LOGGER( "GreenPadWnd::Created" ); dcdd144598 2011-02-23 kinaba: if( fn.len()==0 || !OpenByMyself( fn, cs ) ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LOGGER( "for new file..." ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // ファイルを開か(け)なかった場合 dcdd144598 2011-02-23 kinaba: ReloadConfig( fn.len()==0 ); dcdd144598 2011-02-23 kinaba: LOGGER( "GreenPadWnd::StartUp reloadconfig end" ); dcdd144598 2011-02-23 kinaba: UpdateWindowName(); dcdd144598 2011-02-23 kinaba: LOGGER( "GreenPadWnd::StartUp updatewindowname end" ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 指定の行へジャンプ dcdd144598 2011-02-23 kinaba: if( ln != -1 ) dcdd144598 2011-02-23 kinaba: JumpToLine( ln ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LOGGER( "GreenPadWnd::StartUp end" ); dcdd144598 2011-02-23 kinaba: return true; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void GreenPadWnd::ShowUp2() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: Window::ShowUp( cfg_.GetWndM() ? SW_MAXIMIZE : SW_SHOW ); 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: int kmain() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LOGGER( "kmain() begin" ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Argv arg; dcdd144598 2011-02-23 kinaba: ulong i; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LOGGER( "argv processed" ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //-- まずオプションスイッチを処理 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: int optL = -1; dcdd144598 2011-02-23 kinaba: int optC = 0; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: for( i=1; i<arg.size() && arg[i][0]==TEXT('-'); ++i ) dcdd144598 2011-02-23 kinaba: switch( arg[i][1] ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: case TEXT('c'): dcdd144598 2011-02-23 kinaba: optC = String::GetInt( arg[i]+2 ); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: case TEXT('l'): dcdd144598 2011-02-23 kinaba: optL = String::GetInt( arg[i]+2 ); dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LOGGER( "option processed" ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //-- 次にファイル名 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Path file; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( i < arg.size() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: file = arg[i]; dcdd144598 2011-02-23 kinaba: if( !file.isFile() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ulong j; // ""無しで半スペ入りでもそれなりに対処 dcdd144598 2011-02-23 kinaba: for( j=i+1; j<arg.size(); ++j ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: file += ' '; dcdd144598 2011-02-23 kinaba: file += arg[j]; dcdd144598 2011-02-23 kinaba: if( file.isFile() ) dcdd144598 2011-02-23 kinaba: break; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( j==arg.size() ) dcdd144598 2011-02-23 kinaba: file = arg[i]; dcdd144598 2011-02-23 kinaba: else dcdd144598 2011-02-23 kinaba: i=j; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LOGGER( "filename processed" ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //-- 余ってる引数があれば、それで新規プロセス起動 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: if( ++i < arg.size() ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: String cmd; dcdd144598 2011-02-23 kinaba: for( ; i<arg.size(); ++i ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: cmd += TEXT('\"'); dcdd144598 2011-02-23 kinaba: cmd += arg[i]; dcdd144598 2011-02-23 kinaba: cmd += TEXT("\" "); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: ::BootNewProcess( cmd.c_str() ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LOGGER( "newprocess booted" ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //-- メインウインドウ発進 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: GreenPadWnd wnd; dcdd144598 2011-02-23 kinaba: if( !wnd.StartUp(file,optC,optL) ) dcdd144598 2011-02-23 kinaba: return -1; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LOGGER( "kmain() startup ok" ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //-- メインループ dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: wnd.ShowUp2(); dcdd144598 2011-02-23 kinaba: LOGGER( "showup!" ); dcdd144598 2011-02-23 kinaba: wnd.MsgLoop(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LOGGER( "fin" ); dcdd144598 2011-02-23 kinaba: return 0; dcdd144598 2011-02-23 kinaba: }