/*! Owner Draw List Boxに指定の値を追加する (Windows XPの問題回避用) Windows XP + manifestの時にLB_ADDSTRINGが値0を受け付けないので とりあえず0以外の値を入れてから0に設定し直して回避する。 1回目の挿入は0でなければ何でもいいはず。 @param hWnd [in] リストボックスのウィンドウハンドル @param index [in] 挿入位置 @param value [in] 挿入する値 @return 挿入位置。エラーの時はLB_ERRまたはLB_ERRSPACE @date 2002.04.13 genta */ int Listbox_ADDDATA( HWND hWnd, //!< handle to destination window int value ) { int nIndex1 = List_AddItemData( hWnd, 1 ); if( nIndex1 == LB_ERR || nIndex1 == LB_ERRSPACE ){ TopErrorMessage( NULL, LS(STR_PROPCOMTOOL_ERR03), nIndex1 ); return nIndex1; } else if( List_SetItemData( hWnd, nIndex1, value ) == LB_ERR ){ TopErrorMessage( NULL, LS(STR_PROPCOMTOOL_ERR04), nIndex1 ); return LB_ERR; } return nIndex1; }
/*! Owner Draw List Boxに指定の値を挿入する (Windows XPの問題回避用) Windows XP + manifestの時にLB_INSERTSTRINGが値0を受け付けないので とりあえず0以外の値を入れてから0に設定し直して回避する。 1回目の挿入は0でなければ何でもいいはず。 @param hWnd [in] リストボックスのウィンドウハンドル @param index [in] 挿入位置 @param value [in] 挿入する値 @return 挿入位置。エラーの時はLB_ERRまたはLB_ERRSPACE @date 2002.04.13 genta */ int Listbox_INSERTDATA( HWND hWnd, //!< handle to destination window int index, //!< item index int value ) { int nIndex1 = List_InsertItemData( hWnd, index, 1 ); if( nIndex1 == LB_ERR || nIndex1 == LB_ERRSPACE ){ TopErrorMessage( NULL, LS(STR_PROPCOMTOOL_ERR01), index, nIndex1 ); return nIndex1; } else if( List_SetItemData( hWnd, nIndex1, value ) == LB_ERR ){ TopErrorMessage( NULL, LS(STR_PROPCOMTOOL_ERR02), nIndex1 ); return LB_ERR; } return nIndex1; }
ECallbackResult CSaveAgent::OnCheckSave(SSaveInfo* pSaveInfo) { CEditDoc* pcDoc = GetListeningDoc(); // Jun. 5, 2004 genta // ビューモードのチェックをCEditDocから上書き保存処理に移動 // 同名で上書きされるのを防ぐ if( CAppMode::getInstance()->IsViewMode() && pSaveInfo->IsSamePath(pcDoc->m_cDocFile.GetFilePath()) ){ ErrorBeep(); TopErrorMessage( CEditWnd::getInstance()->GetHwnd(), LS(STR_SAVEAGENT_VIEW_FILE) ); return CALLBACK_INTERRUPT; } // 他ウィンドウで開いているか確認する // 2009.04.07 ryoji if( !pSaveInfo->IsSamePath(pcDoc->m_cDocFile.GetFilePath()) ){ HWND hwndOwner; if( CShareData::getInstance()->IsPathOpened( pSaveInfo->cFilePath, &hwndOwner ) ){ ErrorMessage( CEditWnd::getInstance()->GetHwnd(), LS(STR_SAVEAGENT_OTHER), (LPCTSTR)pSaveInfo->cFilePath ); return CALLBACK_INTERRUPT; } } // 書込可能チェック ######### スマートじゃない。ホントは書き込み時エラーチェック検出機構を用意したい { // ロックは一時的に解除してチェックする(チェックせずに後戻りできないところまで進めるより安全) // ※ ロックしていてもファイル属性やアクセス許可の変更によって書き込めなくなっていることもある bool bLock = (pSaveInfo->IsSamePath(pcDoc->m_cDocFile.GetFilePath()) && pcDoc->m_cDocFile.IsFileLocking()); if( bLock ) pcDoc->m_cDocFileOperation.DoFileUnlock(); try{ bool bExist = fexist(pSaveInfo->cFilePath); CStream out(pSaveInfo->cFilePath, _T("ab"), true); // 実際の保存は "wb" だがここは "ab"(ファイル内容は破棄しない)でチェックする // 2009.08.21 ryoji out.Close(); if(!bExist){ ::DeleteFile(pSaveInfo->cFilePath); } } catch(CError_FileOpen){ // ※ たとえ上書き保存の場合でもここでの失敗では書込み禁止へは遷移しない if( bLock ) pcDoc->m_cDocFileOperation.DoFileLock(false); ErrorMessage( CEditWnd::getInstance()->GetHwnd(), LS(STR_SAVEAGENT_OTHER_APP), pSaveInfo->cFilePath.c_str() ); return CALLBACK_INTERRUPT; } if( bLock ) pcDoc->m_cDocFileOperation.DoFileLock(false); } return CALLBACK_CONTINUE; }
/* 全行データを返す 改行コードは、CRLFに統一される。 @retval 全行データ。freeで解放しなければならない。 @note Debug版のテストにのみ使用している。 */ wchar_t* CDocReader::GetAllData(int* pnDataLen) { int nDataLen; int nLineLen; const CDocLine* pDocLine; pDocLine = m_pcDocLineMgr->GetDocLineTop(); nDataLen = 0; while( NULL != pDocLine ){ // Oct. 7, 2002 YAZAKI nDataLen += pDocLine->GetLengthWithoutEOL() + 2; // \r\nを追加して返すため+2する。 pDocLine = pDocLine->GetNextLine(); } wchar_t* pData; pData = (wchar_t*)malloc( (nDataLen + 1) * sizeof(wchar_t) ); if( NULL == pData ){ TopErrorMessage( NULL, LS(STR_ERR_DLGDOCLM6), nDataLen + 1 ); return NULL; } pDocLine = m_pcDocLineMgr->GetDocLineTop(); nDataLen = 0; while( NULL != pDocLine ){ // Oct. 7, 2002 YAZAKI nLineLen = pDocLine->GetLengthWithoutEOL(); if( 0 < nLineLen ){ wmemcpy( &pData[nDataLen], pDocLine->GetPtr(), nLineLen ); nDataLen += nLineLen; } pData[nDataLen++] = L'\r'; pData[nDataLen++] = L'\n'; pDocLine = pDocLine->GetNextLine(); } pData[nDataLen] = L'\0'; *pnDataLen = nDataLen; return pData; }
/* Toolbar メッセージ処理 */ INT_PTR CPropToolbar::DispatchEvent( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { WORD wNotifyCode; WORD wID; HWND hwndCtl; NMHDR* pNMHDR; int idCtrl; static HWND hwndCombo; static HWND hwndFuncList; static HWND hwndResList; LPDRAWITEMSTRUCT pDis; int nIndex1; int nIndex2; // int nIndex3; int nNum; int i; int j; static int nListItemHeight; LRESULT lResult; switch( uMsg ){ case WM_INITDIALOG: /* コントロールのハンドルを取得 */ hwndCombo = ::GetDlgItem( hwndDlg, IDC_COMBO_FUNCKIND ); hwndFuncList = ::GetDlgItem( hwndDlg, IDC_LIST_FUNC ); hwndResList = ::GetDlgItem( hwndDlg, IDC_LIST_RES ); { // 2014.11.25 フォントの高さが正しくなかったバグを修正 CTextWidthCalc calc(hwndResList); int nFontHeight = calc.GetTextHeight(); nListItemHeight = std::max(nFontHeight, GetSystemMetrics(SM_CYSMICON)) + DpiScaleY(2); nToolBarListBoxTopMargin = (nListItemHeight - (nFontHeight + 1)) / 2; } /* ダイアログデータの設定 Toolbar */ SetData( hwndDlg ); // Modified by KEITA for WIN64 2003.9.6 ::SetWindowLongPtr( hwndDlg, DWLP_USER, lParam ); // From Here Oct.14, 2000 JEPRO added (Ref. CPropComCustmenu.cpp 内のWM_INITDIALOGを参考にした) /* キー選択時の処理 */ ::SendMessageCmd( hwndDlg, WM_COMMAND, MAKELONG( IDC_COMBO_FUNCKIND, CBN_SELCHANGE ), (LPARAM)hwndCombo ); // To Here Oct. 14, 2000 ::SetTimer( hwndDlg, 1, 300, NULL ); SetDlgItemsEnableState( hwndDlg, hwndResList, hwndFuncList ); return TRUE; case WM_DRAWITEM: idCtrl = (UINT) wParam; /* コントロールのID */ pDis = (LPDRAWITEMSTRUCT) lParam; /* 項目描画情報 */ switch( idCtrl ){ case IDC_LIST_RES: /* ツールバーボタン結果リスト */ case IDC_LIST_FUNC: /* ボタン一覧リスト */ DrawToolBarItemList( pDis ); /* ツールバーボタンリストのアイテム描画 */ return TRUE; } return TRUE; case WM_NOTIFY: idCtrl = (int)wParam; pNMHDR = (NMHDR*)lParam; switch( pNMHDR->code ){ case PSN_HELP: OnHelp( hwndDlg, IDD_PROP_TOOLBAR ); return TRUE; case PSN_KILLACTIVE: // MYTRACE( _T("PROP_TOOLBAR PSN_KILLACTIVE\n") ); /* ダイアログデータの取得 Toolbar */ GetData( hwndDlg ); return TRUE; //@@@ 2002.01.03 YAZAKI 最後に表示していたシートを正しく覚えていないバグ修正 case PSN_SETACTIVE: m_nPageNum = ID_PROPCOM_PAGENUM_TOOLBAR; return TRUE; } break; case WM_COMMAND: wNotifyCode = HIWORD( wParam ); /* 通知コード */ wID = LOWORD( wParam ); /* 項目ID、 コントロールID、 またはアクセラレータID */ hwndCtl = (HWND) lParam; /* コントロールのハンドル */ if( hwndResList == hwndCtl ){ switch( wNotifyCode ){ case LBN_SELCHANGE: return TRUE; } }else if( hwndCombo == hwndCtl ){ switch( wNotifyCode ){ case CBN_SELCHANGE: nIndex2 = Combo_GetCurSel( hwndCombo ); List_ResetContent( hwndFuncList ); /* 機能一覧に文字列をセット (リストボックス) */ // From Here Oct. 15, 2001 genta Lookupを使うように変更 nNum = m_cLookup.GetItemCount( nIndex2 ); for( i = 0; i < nNum; ++i ){ nIndex1 = m_cLookup.Pos2FuncCode( nIndex2, i ); int nbarNo = m_pcMenuDrawer->FindToolbarNoFromCommandId( nIndex1 ); if( nbarNo >= 0 ){ /* ツールバーボタンの情報をセット (リストボックス) */ lResult = ::Listbox_ADDDATA( hwndFuncList, (LPARAM)nbarNo ); if( lResult == LB_ERR || lResult == LB_ERRSPACE ){ break; } lResult = List_SetItemHeight( hwndFuncList, lResult, nListItemHeight ); } } return TRUE; } }else{ switch( wNotifyCode ){ /* ボタン/チェックボックスがクリックされた */ case BN_CLICKED: switch( wID ){ case IDC_BUTTON_INSERTSEPARATOR: nIndex1 = List_GetCurSel( hwndResList ); if( LB_ERR == nIndex1 ){ // break; nIndex1 = 0; } // From Here Apr. 13, 2002 genta nIndex1 = ::Listbox_INSERTDATA( hwndResList, nIndex1, 0 ); if( nIndex1 == LB_ERR || nIndex1 == LB_ERRSPACE ){ break; } // To Here Apr. 13, 2002 genta List_SetCurSel( hwndResList, nIndex1 ); break; // 2005/8/9 aroka 折返ボタンが押されたら、右のリストに「ツールバー折返」を追加する。 case IDC_BUTTON_INSERTWRAP: nIndex1 = List_GetCurSel( hwndResList ); if( LB_ERR == nIndex1 ){ // break; nIndex1 = 0; } // From Here Apr. 13, 2002 genta // 2010.06.25 Moca 折り返しのツールバーのボタン番号定数名を変更。最後ではなく固定値にする nIndex1 = ::Listbox_INSERTDATA( hwndResList, nIndex1, CMenuDrawer::TOOLBAR_BUTTON_F_TOOLBARWRAP ); if( nIndex1 == LB_ERR || nIndex1 == LB_ERRSPACE ){ break; } // To Here Apr. 13, 2002 genta List_SetCurSel( hwndResList, nIndex1 ); break; case IDC_BUTTON_DELETE: nIndex1 = List_GetCurSel( hwndResList ); if( LB_ERR == nIndex1 ){ break; } i = List_DeleteString( hwndResList, nIndex1 ); if( i == LB_ERR ){ break; } if( nIndex1 >= i ){ if( i == 0 ){ i = List_SetCurSel( hwndResList, 0 ); }else{ i = List_SetCurSel( hwndResList, i - 1 ); } }else{ i = List_SetCurSel( hwndResList, nIndex1 ); } break; case IDC_BUTTON_INSERT: nIndex1 = List_GetCurSel( hwndResList ); if( LB_ERR == nIndex1 ){ // break; nIndex1 = 0; } nIndex2 = List_GetCurSel( hwndFuncList ); if( LB_ERR == nIndex2 ){ break; } i = List_GetItemData( hwndFuncList, nIndex2 ); // From Here Apr. 13, 2002 genta nIndex1 = ::Listbox_INSERTDATA( hwndResList, nIndex1, i ); if( nIndex1 == LB_ERR || nIndex1 == LB_ERRSPACE ){ break; } // To Here Apr. 13, 2002 genta List_SetCurSel( hwndResList, nIndex1 + 1 ); break; case IDC_BUTTON_ADD: nIndex1 = List_GetCount( hwndResList ); nIndex2 = List_GetCurSel( hwndFuncList ); if( LB_ERR == nIndex2 ){ break; } i = List_GetItemData( hwndFuncList, nIndex2 ); // From Here Apr. 13, 2002 genta // ここでは i != 0 だとは思うけど、一応保険です。 nIndex1 = ::Listbox_INSERTDATA( hwndResList, nIndex1, i ); if( nIndex1 == LB_ERR || nIndex1 == LB_ERRSPACE ){ TopErrorMessage( NULL, LS(STR_PROPCOMTOOL_ERR05), nIndex1 ); break; } // To Here Apr. 13, 2002 genta List_SetCurSel( hwndResList, nIndex1 ); break; case IDC_BUTTON_UP: nIndex1 = List_GetCurSel( hwndResList ); if( LB_ERR == nIndex1 || 0 >= nIndex1 ){ break; } i = List_GetItemData( hwndResList, nIndex1 ); j = List_DeleteString( hwndResList, nIndex1 ); if( j == LB_ERR ){ break; } // From Here Apr. 13, 2002 genta nIndex1 = ::Listbox_INSERTDATA( hwndResList, nIndex1 - 1, i ); if( nIndex1 == LB_ERR || nIndex1 == LB_ERRSPACE ){ TopErrorMessage( NULL, LS(STR_PROPCOMTOOL_ERR05), nIndex1 ); break; } // To Here Apr. 13, 2002 genta List_SetCurSel( hwndResList, nIndex1 ); break; case IDC_BUTTON_DOWN: i = List_GetCount( hwndResList ); nIndex1 = List_GetCurSel( hwndResList ); if( LB_ERR == nIndex1 || nIndex1 + 1 >= i ){ break; } i = List_GetItemData( hwndResList, nIndex1 ); j = List_DeleteString( hwndResList, nIndex1 ); if( j == LB_ERR ){ break; } // From Here Apr. 13, 2002 genta nIndex1 = ::Listbox_INSERTDATA( hwndResList, nIndex1 + 1, i ); if( nIndex1 == LB_ERR || nIndex1 == LB_ERRSPACE ){ TopErrorMessage( NULL, LS(STR_PROPCOMTOOL_ERR05), nIndex1 ); break; } List_SetCurSel( hwndResList, nIndex1 ); // To Here Apr. 13, 2002 genta break; } break; } } break; case WM_TIMER: SetDlgItemsEnableState( hwndDlg, hwndResList, hwndFuncList ); break; case WM_DESTROY: ::KillTimer( hwndDlg, 1 ); break; //@@@ 2001.02.04 Start by MIK: Popup Help case WM_HELP: { HELPINFO *p = (HELPINFO *)lParam; MyWinHelp( (HWND)p->hItemHandle, HELP_WM_HELP, (ULONG_PTR)(LPVOID)p_helpids ); // 2006.10.10 ryoji MyWinHelpに変更に変更 } return TRUE; /*NOTREACHED*/ //break; //@@@ 2001.02.04 End //@@@ 2001.12.22 Start by MIK: Context Menu Help //Context Menu case WM_CONTEXTMENU: MyWinHelp( hwndDlg, HELP_CONTEXTMENU, (ULONG_PTR)(LPVOID)p_helpids ); // 2006.10.10 ryoji MyWinHelpに変更に変更 return TRUE; //@@@ 2001.12.22 End } return FALSE; }
/*! @brief コントロールプロセスを初期化する MutexCPを作成・ロックする。 CControlTrayを作成する。 @author aroka @date 2002/01/07 @date 2002/02/17 YAZAKI 共有メモリを初期化するのはCProcessに移動。 @date 2006/04/10 ryoji 初期化完了イベントの処理を追加、異常時の後始末はデストラクタに任せる @date 2013.03.20 novice コントロールプロセスのカレントディレクトリをシステムディレクトリに変更 */ bool CControlProcess::InitializeProcess() { MY_RUNNINGTIMER( cRunningTimer, "CControlProcess::InitializeProcess" ); // アプリケーション実行検出用(インストーラで使用) m_hMutex = ::CreateMutex( NULL, FALSE, GSTR_MUTEX_SAKURA ); if( NULL == m_hMutex ){ ErrorBeep(); TopErrorMessage( NULL, _T("CreateMutex()失敗。\n終了します。") ); return false; } std::tstring strProfileName = to_tchar(CCommandLine::getInstance()->GetProfileName()); // 初期化完了イベントを作成する std::tstring strInitEvent = GSTR_EVENT_SAKURA_CP_INITIALIZED; strInitEvent += strProfileName; m_hEventCPInitialized = ::CreateEvent( NULL, TRUE, FALSE, strInitEvent.c_str() ); if( NULL == m_hEventCPInitialized ) { ErrorBeep(); TopErrorMessage( NULL, _T("CreateEvent()失敗。\n終了します。") ); return false; } /* コントロールプロセスの目印 */ std::tstring strCtrlProcEvent = GSTR_MUTEX_SAKURA_CP; strCtrlProcEvent += strProfileName; m_hMutexCP = ::CreateMutex( NULL, TRUE, strCtrlProcEvent.c_str() ); if( NULL == m_hMutexCP ){ ErrorBeep(); TopErrorMessage( NULL, _T("CreateMutex()失敗。\n終了します。") ); return false; } if( ERROR_ALREADY_EXISTS == ::GetLastError() ){ return false; } /* 共有メモリを初期化 */ if( !CProcess::InitializeProcess() ){ return false; } // コントロールプロセスのカレントディレクトリをシステムディレクトリに変更 TCHAR szDir[_MAX_PATH]; ::GetSystemDirectory( szDir, _countof(szDir) ); ::SetCurrentDirectory( szDir ); /* 共有データのロード */ // 2007.05.19 ryoji 「設定を保存して終了する」オプション処理(sakuext連携用)を追加 if( !CShareData_IO::LoadShareData() || CCommandLine::getInstance()->IsWriteQuit() ){ /* レジストリ項目 作成 */ CShareData_IO::SaveShareData(); if( CCommandLine::getInstance()->IsWriteQuit() ){ return false; } } /* 言語を選択する */ CSelectLang::ChangeLang( GetDllShareData().m_Common.m_sWindow.m_szLanguageDll ); RefreshString(); MY_TRACETIME( cRunningTimer, "Before new CControlTray" ); /* タスクトレイにアイコン作成 */ m_pcTray = new CControlTray; MY_TRACETIME( cRunningTimer, "After new CControlTray" ); HWND hwnd = m_pcTray->Create( GetProcessInstance() ); if( !hwnd ){ ErrorBeep(); TopErrorMessage( NULL, LS(STR_ERR_CTRLMTX3) ); return false; } SetMainWindow(hwnd); GetDllShareData().m_sHandles.m_hwndTray = hwnd; // 初期化完了イベントをシグナル状態にする if( !::SetEvent( m_hEventCPInitialized ) ){ ErrorBeep(); TopErrorMessage( NULL, LS(STR_ERR_CTRLMTX4) ); return false; } return true; }