Index: sakura_core/CLoadAgent.cpp =================================================================== --- sakura_core/CLoadAgent.cpp (リビジョン 4157) +++ sakura_core/CLoadAgent.cpp (作業コピー) @@ -175,6 +175,7 @@ // 文書種別確定 pcDoc->m_cDocType.SetDocumentType( sLoadInfo.nType, true ); + pcDoc->m_cDocType.LockDocumentType(); pcDoc->m_pcEditWnd->m_pcViewFontMiniMap->UpdateFont(&pcDoc->m_pcEditWnd->GetLogfont()); InitCharWidthCache( pcDoc->m_pcEditWnd->m_pcViewFontMiniMap->GetLogfont(), CWM_FONT_MINIMAP ); SelectCharWidthCache( CWM_FONT_EDIT, pcDoc->m_pcEditWnd->GetLogfontCacheMode() ); Index: sakura_core/doc/layout/CTsvModeInfo.cpp =================================================================== --- sakura_core/doc/layout/CTsvModeInfo.cpp (リビジョン 4157) +++ sakura_core/doc/layout/CTsvModeInfo.cpp (作業コピー) @@ -46,7 +46,7 @@ int nLineLen; int nCharChars; int nField = 0; - int nFieldWidth = 0; + CHabaXInt nFieldWidth = CHabaXInt(0); LPCWSTR pcLine = cDocLine->GetDocLineStrWithEOL(&nLineLen); for (i = 0; i < nLineLen; ) { if (WCODE::IsLineDelimiter(pcLine[i], true)) break; @@ -62,10 +62,9 @@ continue; } if( pcLine[i] != WCODE::TAB ){ - CKetaXInt nKeta = CNativeW::GetKetaOfChar(pcLine, nLineLen, i); - nFieldWidth += Int(nKeta); + nFieldWidth += CNativeW::GetHabaOfChar(pcLine, nLineLen, i); } else { - nFieldWidth++; + nFieldWidth += m_nMaxCharLayoutX; } nCharChars = CNativeW::GetSizeOfChar( pcLine, nLineLen, i ); i += nCharChars; @@ -77,14 +76,12 @@ nField++; } } - - for (ui = 0; uinModLineFrom = pArg->sDelRange.GetFrom().GetY2(); /* 再描画ヒント 変更されたレイアウト行From */ pArg->nModLineTo += ( pArg->nModLineFrom - CLayoutInt(1) ) ; /* 再描画ヒント 変更されたレイアウト行To */ +// 雑に TSVモードの再レイアウト +m_tsvInfo.CalcTabLength(m_pcDocLineMgr); +// 雑に全体再描画誘導&折り返さないときの横スクロールのための最長行情報更新 +if (m_tsvInfo.m_nTsvMode != TSV_MODE_NONE) { + pArg->nAddLineNum = -1; + pArg->nModLineFrom = CLayoutInt(0); + pArg->nModLineTo = CLayoutInt(m_nLines+1); + this->CalculateTextWidth(); +// CEditView_Command_New.cppの CEditView::InsertData_CEditViewが +// 渋くて前の行にさかのぼって再描画してくれないんだけど。 +} + //2007.10.18 kobake LayoutReplaceArg::ptLayoutNewはここで算出するのが正しい LogicToLayout(DLRArg.ptNewPos, &pArg->ptLayoutNew); // 挿入された部分の次の位置 } Index: sakura_core/doc/layout/CTsvModeInfo.h =================================================================== --- sakura_core/doc/layout/CTsvModeInfo.h (リビジョン 4157) +++ sakura_core/doc/layout/CTsvModeInfo.h (作業コピー) @@ -47,9 +47,10 @@ int m_nTsvMode; CLayoutInt m_nMaxCharLayoutX; + CKetaXInt m_nTabLength; private: - std::vector m_tabLength; + std::vector m_tabLength; }; #endif /* SAKURA_CTSVMODEINFO_BC141F5B_325B_4C02_9CC7_633B39FE482E1_H_ */ /*[EOF]*/ Index: sakura_core/doc/layout/CLayoutMgr.cpp =================================================================== --- sakura_core/doc/layout/CLayoutMgr.cpp (リビジョン 4157) +++ sakura_core/doc/layout/CLayoutMgr.cpp (作業コピー) @@ -42,7 +42,7 @@ m_pcDocLineMgr = NULL; m_pTypeConfig = NULL; m_nMaxLineKetas = CKetaXInt(MAXLINEKETAS); - m_nTabSpace = CKetaXInt(4); + m_nTabSpace = m_tsvInfo.m_nTabLength = CKetaXInt(4); m_tsvInfo.m_nTsvMode = TSV_MODE_NONE; m_pszKinsokuHead_1.clear(); /* 行頭禁則 */ //@@@ 2002.04.08 MIK m_pszKinsokuTail_1.clear(); /* 行末禁則 */ //@@@ 2002.04.08 MIK @@ -130,7 +130,7 @@ //タイプ別設定 m_pTypeConfig = &refType; m_nMaxLineKetas = nMaxLineKetas; - m_nTabSpace = nTabSpace; + m_nTabSpace = m_tsvInfo.m_nTabLength = nTabSpace; int nTsvModeOld = m_tsvInfo.m_nTsvMode; m_tsvInfo.m_nTsvMode = nTsvMode; if (nTsvModeOld != nTsvMode && nTsvMode != TSV_MODE_NONE) { @@ -152,9 +152,7 @@ } // 最大文字幅の計算 m_tsvInfo.m_nMaxCharLayoutX = WCODE::CalcPxWidthByFont(L'W'); - if (m_tsvInfo.m_nMaxCharLayoutX < m_nCharLayoutXPerKeta) { - m_tsvInfo.m_nMaxCharLayoutX = m_nCharLayoutXPerKeta; - } + m_tsvInfo.m_nMaxCharLayoutX = m_nCharLayoutXPerKeta; // 最大幅を想定すると余白が多くなりすぎる。 // Oct. 1, 2002 genta タイプによって処理関数を変更する // 数が増えてきたらテーブルにすべき @@ -662,7 +660,7 @@ if( nTabSize < 1 || nTabSize > 64 ) { return false; } if( nMaxLineKetas < MINLINEKETAS || nMaxLineKetas > MAXLINEKETAS ){ return false; } - m_nTabSpace = nTabSize; + m_nTabSpace = m_tsvInfo.m_nTabLength = nTabSize; int nTsvModeOld = m_tsvInfo.m_nTsvMode; m_tsvInfo.m_nTsvMode = nTsvMode; if (nTsvModeOld != nTsvMode) { Index: sakura_core/doc/layout/CLayoutMgr_DoLayout.cpp =================================================================== --- sakura_core/doc/layout/CLayoutMgr_DoLayout.cpp (リビジョン 4157) +++ sakura_core/doc/layout/CLayoutMgr_DoLayout.cpp (作業コピー) @@ -315,8 +315,8 @@ // 折り返し幅 <= TAB幅のとき無限ループするのを避けるため, // TABが折り返し幅以上の時はTAB=4としてしまう // 折り返し幅の最小値=10なのでこの値は問題ない - if( GetTabSpace() >= GetMaxLineKetas() ){ - m_nTabSpace = CKetaXInt(4); + if( GetTabSpaceKetas() >= GetMaxLineKetas() ){ + m_nTabSpace = m_tsvInfo.m_nTabLength = CKetaXInt(4); } nAllLineNum = m_pcDocLineMgr->GetLineCount(); Index: sakura_core/view/CEditView_Command_New.cpp =================================================================== --- sakura_core/view/CEditView_Command_New.cpp (リビジョン 4157) +++ sakura_core/view/CEditView_Command_New.cpp (作業コピー) @@ -204,6 +204,7 @@ // 文字列挿入 CLayoutInt nModifyLayoutLinesOld=CLayoutInt(0); CLayoutInt nInsLineNum; /* 挿入によって増えたレイアウト行の数 */ +CLayoutInt nStartLine; int nInsSeq; { LayoutReplaceArg arg; @@ -214,6 +215,7 @@ m_pcEditDoc->m_cLayoutMgr.ReplaceData_CLayoutMgr( &arg ); nInsLineNum = arg.nAddLineNum; nModifyLayoutLinesOld = arg.nModLineTo - arg.nModLineFrom + 1; +nStartLine = arg.nModLineFrom; *pptNewPos = arg.ptLayoutNew; nInsSeq = arg.nInsSeq; } @@ -261,7 +263,7 @@ PAINTSTRUCT ps; if( bRedraw ){ - CLayoutInt nStartLine(ptInsertPos.y); +// CLayoutInt nStartLine(ptInsertPos.y); // 2013.05.08 折り返し行でEOF直前で改行したときEOFが再描画されないバグの修正 if( nModifyLayoutLinesOld < 1 ){ nModifyLayoutLinesOld = CLayoutInt(1); Index: sakura_core/recent/CMruListener.cpp =================================================================== --- sakura_core/recent/CMruListener.cpp (リビジョン 4157) +++ sakura_core/recent/CMruListener.cpp (作業コピー) @@ -67,12 +67,7 @@ // タイプ別設定 if( !pLoadInfo->nType.IsValidType() ){ - if( 0 <= nPrevTypeId ){ - pLoadInfo->nType = CDocTypeManager().GetDocumentTypeOfId(nPrevTypeId); - } - if( !pLoadInfo->nType.IsValidType() ){ - pLoadInfo->nType = CDocTypeManager().GetDocumentTypeOfPath( pLoadInfo->cFilePath ); - } + pLoadInfo->nType = CDocTypeManager().GetDocumentTypeOfPath( pLoadInfo->cFilePath ); }