Index: sakura_core/CViewCommander.cpp =================================================================== --- sakura_core/CViewCommander.cpp (リビジョン 1779) +++ sakura_core/CViewCommander.cpp (作業コピー) @@ -2054,58 +2054,69 @@ /* 行削除(折り返し単位) */ void CViewCommander::Command_DELETE_LINE( void ) { - if( m_pCommanderView->GetSelectionInfo().IsMouseSelecting() ){ /* マウスによる範囲選択中 */ + CEditView* view = this->m_pCommanderView; // ショートカット + CViewSelect& sel = view->GetSelectionInfo(); // ショートカット + + if( sel.IsTextSelecting() || sel.IsTextSelected() || sel.IsMouseSelecting() ) { + // 選択中はややこしいので削除しない。 ErrorBeep(); return; } - const CLayout* pcLayout; - if( m_pCommanderView->GetSelectionInfo().IsTextSelected() ){ /* テキストが選択されているか */ + const CLayoutPoint ptCaret = GetCaret().GetCaretLayoutPos(); + const CLayout* const pLayout = GetDocument()->m_cLayoutMgr.SearchLineByLayoutY( ptCaret.y ); + + if( ! pLayout ) { + // おそらく EOFのみの行。削除対象がない。 ErrorBeep(); return; } - pcLayout = GetDocument()->m_cLayoutMgr.SearchLineByLayoutY( GetCaret().GetCaretLayoutPos().GetY2() ); - if( NULL == pcLayout ){ - ErrorBeep(); - return; + + // キャレット。Redoのために削除前位置登録。 + if( ! view->m_bDoing_UndoRedo ) { + GetOpeBlk()->AppendOpe( new CMoveCaretOpe( GetCaret().GetCaretLogicPos(), GetCaret().GetCaretLogicPos() ) ); } - GetSelect().SetFrom(CLayoutPoint(CLayoutInt(0),GetCaret().GetCaretLayoutPos().GetY2() )); //範囲選択開始位置 - GetSelect().SetTo (CLayoutPoint(CLayoutInt(0),GetCaret().GetCaretLayoutPos().GetY2() + 1)); //範囲選択終了位置 - CLayoutPoint ptCaretPos_OLD = GetCaret().GetCaretLayoutPos(); + // 削除後のキャレット位置シミュレート。 + // ※キャレットを実際に移動するので動きが見えないように DrawSwitch OFF。 + // ※EOFのみの行は行削除できないので、削除する行が先頭行でなく次の行がEOFのみなら、下でなく上の行に移動する。 + const bool movePrevLine = pLayout && ! pLayout->GetNextLayout() && pLayout->GetPrevLayout(); + const bool prevDrawSwitch = view->SetDrawSwitch( false ); + GetCaret().Cursor_UPDOWN( CLayoutInt( movePrevLine ? -1 : 1 ), sel.m_bSelectingLock ); + view->SetDrawSwitch( prevDrawSwitch ); + const CLayoutPoint ptCaretAfterDeleting = CLayoutPoint( + GetCaret().GetCaretLayoutPos().y == ptCaret.y ? CLayoutInt(0) : GetCaret().GetCaretLayoutPos().x, + movePrevLine ? GetCaret().GetCaretLayoutPos().y : ptCaret.y + ); + // ReplaceData_CEditView()がいじってしまうのを元に戻すために + // 横スクロール位置と直前のキャレット桁位置を記憶する。 + const CLayoutInt ketaOfViewLeft = view->GetTextArea().GetViewLeftCol(); ///< Viewの左端が行頭から何桁目か。 + const CLayoutInt xPrevCaret = GetCaret().m_nCaretPosX_Prev; - Command_DELETE(); - pcLayout = GetDocument()->m_cLayoutMgr.SearchLineByLayoutY( GetCaret().GetCaretLayoutPos().GetY2() ); - if( NULL != pcLayout ){ - // 2003-04-30 かろと - // 行削除した後、フリーカーソルでないのにカーソル位置が行端より右になる不具合対応 - // フリーカーソルモードでない場合は、カーソル位置を調整する - if( !GetDllShareData().m_Common.m_sGeneral.m_bIsFreeCursorMode ) { - CLogicInt nIndex; + // 削除 + view->ReplaceData_CEditView( + CLayoutRange( + CLayoutPoint( CLayoutInt(0), ptCaret.y ), + CLayoutPoint( CLayoutInt(0), ptCaret.y + 1 ) + ), /* 削除範囲(レイアウト単位) */ + NULL, /* [out] 削除されたデータ */ + L"", /* 挿入するデータ */ + CLogicInt(0), /* 挿入するデータの長さ */ + false, /* bRedraw */ + view->m_bDoing_UndoRedo ? NULL : view->m_pcOpeBlk + ); + // ReplaceData_CEditView()により移動されたキャレットの現在位置と + // 直前の桁位置、ビューのスクロール位置を元に戻す。 + view->GetTextArea().SetViewLeftCol( ketaOfViewLeft ); + view->InvalidateRect( NULL ); + GetCaret().m_nCaretPosX_Prev = xPrevCaret; + GetCaret().MoveCursor( ptCaretAfterDeleting, true ); - CLayoutInt tmp; - nIndex = m_pCommanderView->LineColmnToIndex2( pcLayout, ptCaretPos_OLD.GetX2(), &tmp ); - ptCaretPos_OLD.x=tmp; + // キャレット。削除後位置登録。 + if( ! view->m_bDoing_UndoRedo ) { + GetOpeBlk()->AppendOpe( new CMoveCaretOpe( GetCaret().GetCaretLogicPos(), GetCaret().GetCaretLogicPos() ) ); + } - if (ptCaretPos_OLD.x > 0) { - ptCaretPos_OLD.x--; - } else { - ptCaretPos_OLD.x = m_pCommanderView->LineIndexToColmn( pcLayout, nIndex ); - } - } - /* 操作前の位置へカーソルを移動 */ - GetCaret().MoveCursor( ptCaretPos_OLD, TRUE ); - GetCaret().m_nCaretPosX_Prev = GetCaret().GetCaretLayoutPos().GetX2(); - if( !m_pCommanderView->m_bDoing_UndoRedo ){ /* アンドゥ・リドゥの実行中か */ - /* 操作の追加 */ - GetOpeBlk()->AppendOpe( - new CMoveCaretOpe( - GetCaret().GetCaretLogicPos(), - GetCaret().GetCaretLogicPos() - ) - ); - } - } return; } Index: sakura_core/view/CEditView.h =================================================================== --- sakura_core/view/CEditView.h (リビジョン 1779) +++ sakura_core/view/CEditView.h (作業コピー) @@ -243,9 +243,11 @@ { return m_bDrawSWITCH; } - void SetDrawSwitch(bool b) + bool SetDrawSwitch(bool b) { + bool prev = m_bDrawSWITCH; m_bDrawSWITCH = b; + return prev; }