/*! @date 2003/02/18 ai @param flag [in] モード(true:登録, false:解除) */ void CEditView::SetBracketPairPos( bool flag ) { int mode; // 03/03/06 ai すべて置換、すべて置換後のUndo&Redoがかなり遅い問題に対応 if( m_bDoing_UndoRedo || !GetDrawSwitch() ){ return; } if( !m_pTypeData->m_ColorInfoArr[COLORIDX_BRACKET_PAIR].m_bDisp ){ return; } // 対括弧の検索&登録 /* bit0(in) : 表示領域外を調べるか? 0:調べない 1:調べる bit1(in) : 前方文字を調べるか? 0:調べない 1:調べる bit2(out) : 見つかった位置 0:後ろ 1:前 */ mode = 2; CLayoutPoint ptColLine; if( flag && !GetSelectionInfo().IsTextSelected() && !GetSelectionInfo().m_bDrawSelectArea && SearchBracket( GetCaret().GetCaretLayoutPos(), &ptColLine, &mode ) ) { // 登録指定(flag=true) && // テキストが選択されていない && // 選択範囲を描画していない && // 対応する括弧が見つかった 場合 if ( ( ptColLine.x >= GetTextArea().GetViewLeftCol() ) && ( ptColLine.x <= GetTextArea().GetRightCol() ) && ( ptColLine.y >= GetTextArea().GetViewTopLine() ) && ( ptColLine.y <= GetTextArea().GetBottomLine() ) ) { // 表示領域内の場合 // レイアウト位置から物理位置へ変換(強調表示位置を登録) m_pcEditDoc->m_cLayoutMgr.LayoutToLogic( ptColLine, &m_ptBracketPairPos_PHY ); m_ptBracketCaretPos_PHY.y = GetCaret().GetCaretLogicPos().y; if( 0 == ( mode & 4 ) ){ // カーソルの後方文字位置 m_ptBracketCaretPos_PHY.x = GetCaret().GetCaretLogicPos().x; }else{ // カーソルの前方文字位置 m_ptBracketCaretPos_PHY.x = GetCaret().GetCaretLogicPos().x - 1; } return; } } // 括弧の強調表示位置情報初期化 m_ptBracketPairPos_PHY.Set(CLogicInt(-1), CLogicInt(-1)); m_ptBracketCaretPos_PHY.Set(CLogicInt(-1), CLogicInt(-1)); return; }
/* フォーカス移動時の再描画 @date 2001/06/21 asa-o 「スクロールバーの状態を更新する」「カーソル移動」削除 */ void CEditView::RedrawAll() { if( NULL == GetHwnd() ){ return; } if( GetDrawSwitch() ){ // ウィンドウ全体を再描画 PAINTSTRUCT ps; HDC hdc = ::GetDC( GetHwnd() ); ::GetClientRect( GetHwnd(), &ps.rcPaint ); OnPaint( hdc, &ps, FALSE ); ::ReleaseDC( GetHwnd(), hdc ); } // キャレットの表示 GetCaret().ShowEditCaret(); // キャレットの行桁位置を表示する GetCaret().ShowCaretPosInfo(); // 親ウィンドウのタイトルを更新 m_pcEditWnd->UpdateCaption(); // Jul. 9, 2005 genta 選択範囲の情報をステータスバーへ表示 GetSelectionInfo().PrintSelectionInfoMsg(); // スクロールバーの状態を更新する AdjustScrollBars(); }
void SeqManageRosterWindow::MessageReceived(BMessage* msg) { switch (msg->what) { case NEW_ENTRY_MSG: { BString key; ShowEditWindow(key, BString() ); } break; case EDIT_ENTRY_MSG: { BString key, filePath; bool readOnly; if (GetSelectionInfo(key, filePath, &readOnly) == B_OK) { if (readOnly) read_only_warning(EntryMenuType(), key); else ShowEditWindow(key, filePath); } } break; case DUPLICATE_ENTRY_MSG: { BString key, filePath; AmFileRoster* roster = Roster(); if (roster && GetSelectionInfo(key, filePath) == B_OK) { roster->DuplicateEntry(key, filePath.String() ); } } break; case DELETE_ENTRY_MSG: { BString key, filePath; AmFileRoster* roster = Roster(); if (roster && GetSelectionInfo(key, filePath) == B_OK) { roster->DeleteEntry(key); } } break; case AM_FILE_ROSTER_CHANGED: { BuildList(); } break; case COLUMN_MSG: { const char* n; if (msg->FindString(COLUMN_NAME_STR, &n) == B_OK) ToggleColumn(n); } break; default: inherited::MessageReceived(msg); } }
/*! カーソル行をクリップボードにコピーする @date 2007.10.08 ryoji 新規(Command_COPY()から処理抜き出し) */ void CEditView::CopyCurLine( bool bAddCRLFWhenCopy, //!< [in] 折り返し位置に改行コードを挿入するか? EEolType neweol, //!< [in] コピーするときのEOL。 bool bEnableLineModePaste //!< [in] ラインモード貼り付けを可能にする ) { if( GetSelectionInfo().IsTextSelected() ){ return; } const CLayout* pcLayout = m_pcEditDoc->m_cLayoutMgr.SearchLineByLayoutY( GetCaret().GetCaretLayoutPos().y ); if( NULL == pcLayout ){ return; } /* クリップボードに入れるべきテキストデータを、cmemBufに格納する */ CNativeW cmemBuf; cmemBuf.SetString( pcLayout->GetPtr(), pcLayout->GetLengthWithoutEOL() ); if( pcLayout->GetLayoutEol().GetLen() != 0 ){ cmemBuf.AppendString( ( neweol == EOL_UNKNOWN ) ? pcLayout->GetLayoutEol().GetValue2() : CEol(neweol).GetValue2() ); }else if( bAddCRLFWhenCopy ){ // 2007.10.08 ryoji bAddCRLFWhenCopy対応処理追加 cmemBuf.AppendString( ( neweol == EOL_UNKNOWN ) ? WCODE::CRLF : CEol(neweol).GetValue2() ); } /* クリップボードにデータcmemBufの内容を設定 */ BOOL bSetResult = MySetClipboardData( cmemBuf.GetStringPtr(), cmemBuf.GetStringLength(), false, bEnableLineModePaste ); if( !bSetResult ){ ErrorBeep(); } }
void SeqManageRosterWindow::MenusBeginning() { inherited::MenusBeginning(); BMenuBar* bar = KeyMenuBar(); if (!bar) return; BColumnListView* table = dynamic_cast<BColumnListView*>( FindView(TABLE_STR) ); if (!table) return; BMenu* menu; BMenuItem* item; // Entry menu bool canEdit = false, canDuplicate = false; BString key, filePath; bool readOnly; if (GetSelectionInfo(key, filePath, &readOnly) == B_OK) { canEdit = !readOnly; canDuplicate = true; } if ( (menu = bar->SubmenuAt(ENTRY_MENU_INDEX)) != NULL) { if ( (item = menu->FindItem(EDIT_ENTRY_MSG)) != NULL) item->SetEnabled(canEdit); if ( (item = menu->FindItem(DUPLICATE_ENTRY_MSG)) != NULL) item->SetEnabled(canDuplicate); if ( (item = menu->FindItem(DELETE_ENTRY_MSG)) != NULL) item->SetEnabled(canEdit); } // Attributes menu if ( (menu = bar->SubmenuAt(ATTRIBUTES_MENU_INDEX)) != NULL) { for (int32 k = 0; (item = menu->ItemAt(k)) != NULL; k++) { const char* n; if (item->Message() && item->Message()->FindString(COLUMN_NAME_STR, &n) == B_OK) { BColumn* col = column_named(n, table); if (col && col->IsVisible() ) { if (!item->IsMarked() ) item->SetMarked(true); } else { if (item->IsMarked() ) item->SetMarked(false); } } } } }
/*! 対括弧の強調表示 @date 2002/09/18 ai @date 2003/02/18 ai 再描画対応の為大改造 */ void CEditView::DrawBracketPair( bool bDraw ) { // 03/03/06 ai すべて置換、すべて置換後のUndo&Redoがかなり遅い問題に対応 if( m_bDoing_UndoRedo || !GetDrawSwitch() ){ return; } if( !m_pTypeData->m_ColorInfoArr[COLORIDX_BRACKET_PAIR].m_bDisp ){ return; } // 括弧の強調表示位置が未登録の場合は終了 if( m_ptBracketPairPos_PHY.HasNegative() || m_ptBracketCaretPos_PHY.HasNegative() ){ return; } // 描画指定(bDraw=true) かつ // ( テキストが選択されている 又は // 選択範囲を描画している 又は // フォーカスを持っていない 又は // アクティブなペインではない ) 場合は終了 if( bDraw &&( GetSelectionInfo().IsTextSelected() || GetSelectionInfo().m_bDrawSelectArea || !m_bDrawBracketPairFlag || ( m_pcEditWnd->GetActivePane() != m_nMyIndex ) ) ){ return; } CGraphics gr; gr.Init(::GetDC(GetHwnd())); bool bCaretChange = false; gr.SetTextBackTransparent(true); for( int i = 0; i < 2; i++ ) { // i=0:対括弧,i=1:カーソル位置の括弧 // 2011.11.23 ryoji 対括弧 -> カーソル位置の括弧 の順に処理順序を変更 // # { と } が異なる行にある場合に { を BS で消すと } の強調表示が解除されない問題(Wiki BugReport/89)の対策 // # この順序変更によりカーソル位置が括弧でなくなっていても対括弧があれば対括弧側の強調表示は解除される CLayoutPoint ptColLine; if( i == 0 ){ m_pcEditDoc->m_cLayoutMgr.LogicToLayout( m_ptBracketPairPos_PHY, &ptColLine ); }else{ m_pcEditDoc->m_cLayoutMgr.LogicToLayout( m_ptBracketCaretPos_PHY, &ptColLine ); } if ( ( ptColLine.x >= GetTextArea().GetViewLeftCol() ) && ( ptColLine.x <= GetTextArea().GetRightCol() ) && ( ptColLine.y >= GetTextArea().GetViewTopLine() ) && ( ptColLine.y <= GetTextArea().GetBottomLine() ) ) { // 表示領域内の場合 if( !bDraw && GetSelectionInfo().m_bDrawSelectArea && ( 0 == IsCurrentPositionSelected( ptColLine ) ) ) { // 選択範囲描画済みで消去対象の括弧が選択範囲内の場合 continue; } const CLayout* pcLayout; CLogicInt nLineLen; const wchar_t* pLine = m_pcEditDoc->m_cLayoutMgr.GetLineStr( ptColLine.GetY2(), &nLineLen, &pcLayout ); if( pLine ) { EColorIndexType nColorIndex; CLogicInt OutputX = LineColumnToIndex( pcLayout, ptColLine.GetX2() ); if( bDraw ) { nColorIndex = COLORIDX_BRACKET_PAIR; } else{ if( IsBracket( pLine, OutputX, CLogicInt(1) ) ){ DispPos _sPos(0,0); // 注意:この値はダミー。CheckChangeColorでの参照位置は不正確 SColorStrategyInfo _sInfo; SColorStrategyInfo* pInfo = &_sInfo; pInfo->m_pDispPos = &_sPos; pInfo->m_pcView = this; // 03/10/24 ai 折り返し行のColorIndexが正しく取得できない問題に対応 // 2009.02.07 ryoji GetColorIndex に渡すインデックスの仕様変更(元はこっちの仕様だった模様) CColor3Setting cColor = GetColorIndex( pcLayout, ptColLine.GetY2(), OutputX, pInfo ); nColorIndex = cColor.eColorIndex2; } else{ SetBracketPairPos( false ); break; } } CTypeSupport cCuretLineBg(this,COLORIDX_CARETLINEBG); EColorIndexType nColorIndexBg = (cCuretLineBg.IsDisp() && ptColLine.GetY2() == GetCaret().GetCaretLayoutPos().GetY2() ? COLORIDX_CARETLINEBG : CTypeSupport(this,COLORIDX_EVENLINEBG).IsDisp() && ptColLine.GetY2() % 2 == 1 ? COLORIDX_EVENLINEBG : COLORIDX_TEXT); // 03/03/03 ai カーソルの左に括弧があり括弧が強調表示されている状態でShift+←で選択開始すると // 選択範囲内に反転表示されない部分がある問題の修正 CLayoutInt caretX = GetCaret().GetCaretLayoutPos().GetX2(); bool bCaretHide = (!bCaretChange && (ptColLine.x == caretX || ptColLine.x + 1 == caretX) && GetCaret().GetCaretShowFlag()); if( bCaretHide ){ bCaretChange = true; GetCaret().HideCaret_( GetHwnd() ); // キャレットが一瞬消えるのを防止 } { int nWidth = GetTextMetrics().GetHankakuDx(); int nHeight = GetTextMetrics().GetHankakuDy(); int nLeft = (GetTextArea().GetDocumentLeftClientPointX()) + GetTextMetrics().GetCharPxWidth(ptColLine.x); int nTop = (Int)( ptColLine.GetY2() - GetTextArea().GetViewTopLine() ) * nHeight + GetTextArea().GetAreaTop(); CLayoutXInt charsWidth = m_pcEditDoc->m_cLayoutMgr.GetLayoutXOfChar(pLine, nLineLen, OutputX); //色設定 CTypeSupport cTextType(this,COLORIDX_TEXT); cTextType.SetGraphicsState_WhileThisObj(gr); // 2013.05.24 背景色がテキストの背景色と同じならカーソル行の背景色を適用 CTypeSupport cColorIndexType(this,nColorIndex); CTypeSupport cColorIndexBgType(this,nColorIndexBg); CTypeSupport* pcColorBack = &cColorIndexType; if( cColorIndexType.GetBackColor() == cTextType.GetBackColor() && nColorIndexBg != COLORIDX_TEXT ){ pcColorBack = &cColorIndexBgType; } SetCurrentColor( gr, nColorIndex, nColorIndex, nColorIndexBg ); bool bTrans = false; // DEBUG_TRACE( _T("DrawBracket %d %d ") , ptColLine.y, ptColLine.x ); if( IsBkBitmap() && cTextType.GetBackColor() == pcColorBack->GetBackColor() ){ bTrans = true; RECT rcChar; rcChar.left = nLeft; rcChar.top = nTop; rcChar.right = nLeft + GetTextMetrics().GetCharPxWidth(charsWidth); rcChar.bottom = nTop + nHeight; HDC hdcBgImg = ::CreateCompatibleDC(gr); HBITMAP hBmpOld = (HBITMAP)::SelectObject(hdcBgImg, m_pcEditDoc->m_hBackImg); DrawBackImage(gr, rcChar, hdcBgImg); ::SelectObject(hdcBgImg, hBmpOld); ::DeleteDC(hdcBgImg); } DispPos sPos(nWidth, nHeight); sPos.InitDrawPos(CMyPoint(nLeft, nTop)); GetTextDrawer().DispText(gr, &sPos, 0, &pLine[OutputX], 1, bTrans); GetTextDrawer().DispNoteLine(gr, nTop, nTop + nHeight, nLeft, nLeft + (Int)charsWidth * nWidth); // 2006.04.30 Moca 対括弧の縦線対応 GetTextDrawer().DispVerticalLines(gr, nTop, nTop + nHeight, ptColLine.x, ptColLine.x + charsWidth); //※括弧が全角幅である場合を考慮 cTextType.RewindGraphicsState(gr); } if( ( m_pcEditWnd->GetActivePane() == m_nMyIndex ) && ( ( ptColLine.y == GetCaret().GetCaretLayoutPos().GetY() ) || ( ptColLine.y - 1 == GetCaret().GetCaretLayoutPos().GetY() ) ) ){ // 03/02/27 ai 行の間隔が"0"の時にアンダーラインが欠ける事がある為修正 GetCaret().m_cUnderLine.CaretUnderLineON( true, false ); } } } } if( bCaretChange ){ GetCaret().ShowCaret_( GetHwnd() ); // キャレットが一瞬消えるのを防止 } ::ReleaseDC( GetHwnd(), gr ); }
//改行記号を描画した場合はtrueを返す? bool CEditView::DrawLayoutLine(SColorStrategyInfo* pInfo) { bool bDispEOF = false; CTypeSupport cTextType(this,COLORIDX_TEXT); const CLayout* pcLayout = pInfo->m_pDispPos->GetLayoutRef(); //m_pcEditDoc->m_cLayoutMgr.SearchLineByLayoutY( pInfo->pDispPos->GetLayoutLineRef() ); // レイアウト情報 if( pcLayout ){ pInfo->m_pLineOfLogic = pcLayout->GetDocLineRef()->GetPtr(); } else{ pInfo->m_pLineOfLogic = NULL; } //文字列参照 const CDocLine* pcDocLine = pInfo->GetDocLine(); CStringRef cLineStr = pcDocLine->GetStringRefWithEOL(); // 描画範囲外の場合は色切替だけで抜ける if(pInfo->m_pDispPos->GetDrawPos().y < GetTextArea().GetAreaTop()){ if(pcLayout){ bool bChange = false; int nPosTo = pcLayout->GetLogicOffset() + pcLayout->GetLengthWithEOL(); CColor3Setting cColor; while(pInfo->m_nPosInLogic < nPosTo){ //色切替 bChange |= pInfo->CheckChangeColor(cLineStr); //1文字進む pInfo->m_nPosInLogic += CNativeW::GetSizeOfChar( cLineStr.GetPtr(), cLineStr.GetLength(), pInfo->m_nPosInLogic ); } if( bChange ){ pInfo->DoChangeColor(&cColor); SetCurrentColor(pInfo->m_gr, cColor.eColorIndex, cColor.eColorIndex2, cColor.eColorIndexBg); } } return false; } // コンフィグ int nLineHeight = GetTextMetrics().GetHankakuDy(); //行の縦幅? CTypeSupport cCaretLineBg(this, COLORIDX_CARETLINEBG); CTypeSupport cEvenLineBg(this, COLORIDX_EVENLINEBG); CTypeSupport cPageViewBg(this, COLORIDX_PAGEVIEW); CEditView& cActiveView = m_pcEditWnd->GetActiveView(); CTypeSupport& cBackType = (cCaretLineBg.IsDisp() && GetCaret().GetCaretLayoutPos().GetY() == pInfo->m_pDispPos->GetLayoutLineRef() && !m_bMiniMap ? cCaretLineBg : cEvenLineBg.IsDisp() && pInfo->m_pDispPos->GetLayoutLineRef() % 2 == 1 && !m_bMiniMap ? cEvenLineBg : (cPageViewBg.IsDisp() && m_bMiniMap && cActiveView.GetTextArea().GetViewTopLine() <= pInfo->m_pDispPos->GetLayoutLineRef() && pInfo->m_pDispPos->GetLayoutLineRef() < cActiveView.GetTextArea().GetBottomLine()) ? cPageViewBg : cTextType); bool bTransText = IsBkBitmap(); if( bTransText ){ bTransText = cBackType.GetBackColor() == cTextType.GetBackColor(); } // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // 行番号描画 // // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // GetTextDrawer().DispLineNumber( pInfo->m_gr, pInfo->m_pDispPos->GetLayoutLineRef(), pInfo->m_pDispPos->GetDrawPos().y ); // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // 本文描画開始 // // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // pInfo->m_pDispPos->ResetDrawCol(); // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // 行頭(インデント)背景描画 // // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // if(pcLayout && pcLayout->GetIndent()!=0) { RECT rcClip; if(!bTransText && GetTextArea().GenerateClipRect(&rcClip, *pInfo->m_pDispPos, pcLayout->GetIndent())){ cBackType.FillBack(pInfo->m_gr,rcClip); } //描画位置進める pInfo->m_pDispPos->ForwardDrawCol(pcLayout->GetIndent()); } // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // 本文描画 // // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // bool bSkipRight = false; // 続きを描画しなくていい場合はスキップする if(pcLayout){ const CLayout* pcLayoutNext = pcLayout->GetNextLayout(); if( NULL == pcLayoutNext ){ bSkipRight = true; }else if( pcLayoutNext->GetLogicOffset() == 0 ){ bSkipRight = true; // 次の行は別のロジック行なのでスキップ可能 } if( !bSkipRight ){ bSkipRight = CColorStrategyPool::getInstance()->IsSkipBeforeLayout(); } } //行終端または折り返しに達するまでループ if(pcLayout){ int nPosTo = pcLayout->GetLogicOffset() + pcLayout->GetLengthWithEOL(); CFigureManager* pcFigureManager = CFigureManager::getInstance(); while(pInfo->m_nPosInLogic < nPosTo){ //色切替 if( pInfo->CheckChangeColor(cLineStr) ){ CColor3Setting cColor; pInfo->DoChangeColor(&cColor); SetCurrentColor(pInfo->m_gr, cColor.eColorIndex, cColor.eColorIndex2, cColor.eColorIndexBg); } //1文字情報取得 $$高速化可能 CFigure& cFigure = pcFigureManager->GetFigure(&cLineStr.GetPtr()[pInfo->GetPosInLogic()], cLineStr.GetLength() - pInfo->GetPosInLogic()); //1文字描画 cFigure.DrawImp(pInfo); if( bSkipRight && GetTextArea().GetAreaRight() < pInfo->m_pDispPos->GetDrawPos().x ){ pInfo->m_nPosInLogic = nPosTo; break; } } } // 必要ならEOF描画 void _DispEOF( CGraphics& gr, DispPos* pDispPos, const CEditView* pcView); if(pcLayout && pcLayout->GetNextLayout()==NULL && pcLayout->GetLayoutEol().GetLen()==0){ // 有文字行のEOF _DispEOF(pInfo->m_gr,pInfo->m_pDispPos,this); bDispEOF = true; } else if(!pcLayout && pInfo->m_pDispPos->GetLayoutLineRef()==m_pcEditDoc->m_cLayoutMgr.GetLineCount()){ // 空行のEOF const CLayout* pBottom = m_pcEditDoc->m_cLayoutMgr.GetBottomLayout(); if(pBottom==NULL || (pBottom && pBottom->GetLayoutEol().GetLen())){ _DispEOF(pInfo->m_gr,pInfo->m_pDispPos,this); bDispEOF = true; } } // 必要なら折り返し記号描画 if(pcLayout && pcLayout->GetLayoutEol().GetLen()==0 && pcLayout->GetNextLayout()!=NULL){ _DispWrap(pInfo->m_gr,pInfo->m_pDispPos,this,pInfo->m_pDispPos->GetLayoutLineRef()); } // 行末背景描画 RECT rcClip; bool rcClipRet = GetTextArea().GenerateClipRectRight(&rcClip,*pInfo->m_pDispPos); if(rcClipRet){ if( !bTransText ){ cBackType.FillBack(pInfo->m_gr,rcClip); } CTypeSupport cSelectType(this, COLORIDX_SELECT); if( GetSelectionInfo().IsTextSelected() && cSelectType.IsDisp() ){ // 選択範囲の指定色:必要ならテキストのない部分の矩形選択を作画 CLayoutRange selectArea = GetSelectionInfo().GetSelectAreaLine(pInfo->m_pDispPos->GetLayoutLineRef(), pcLayout); // 2010.10.04 スクロール分の足し忘れ CPixelXInt nSelectFromPx = GetTextMetrics().GetCharPxWidth(selectArea.GetFrom().x - GetTextArea().GetViewLeftCol()); CPixelXInt nSelectToPx = GetTextMetrics().GetCharPxWidth(selectArea.GetTo().x - GetTextArea().GetViewLeftCol()); if( nSelectFromPx < nSelectToPx && selectArea.GetTo().x != INT_MAX ){ RECT rcSelect; // Pixel rcSelect.top = pInfo->m_pDispPos->GetDrawPos().y; rcSelect.bottom = pInfo->m_pDispPos->GetDrawPos().y + GetTextMetrics().GetHankakuDy(); rcSelect.left = GetTextArea().GetAreaLeft() + nSelectFromPx; rcSelect.right = GetTextArea().GetAreaLeft() + nSelectToPx; RECT rcDraw; if( ::IntersectRect(&rcDraw, &rcClip, &rcSelect) ){ COLORREF color = GetBackColorByColorInfo2(cSelectType.GetColorInfo(), cBackType.GetColorInfo()); if( color != cBackType.GetBackColor() ){ pInfo->m_gr.FillSolidMyRect(rcDraw, color); } } } } } // ノート線描画 if( !m_bMiniMap ){ GetTextDrawer().DispNoteLine( pInfo->m_gr, pInfo->m_pDispPos->GetDrawPos().y, pInfo->m_pDispPos->GetDrawPos().y + nLineHeight, GetTextArea().GetAreaLeft(), GetTextArea().GetAreaRight() ); } // 指定桁縦線描画 GetTextDrawer().DispVerticalLines( pInfo->m_gr, pInfo->m_pDispPos->GetDrawPos().y, pInfo->m_pDispPos->GetDrawPos().y + nLineHeight, CLayoutInt(0), CLayoutInt(-1) ); // 折り返し桁縦線描画 if( !m_bMiniMap ){ GetTextDrawer().DispWrapLine( pInfo->m_gr, pInfo->m_pDispPos->GetDrawPos().y, pInfo->m_pDispPos->GetDrawPos().y + nLineHeight ); } // 反転描画 if( pcLayout && GetSelectionInfo().IsTextSelected() ){ DispTextSelected( pInfo->m_gr, pInfo->m_pDispPos->GetLayoutLineRef(), CMyPoint(pInfo->m_sDispPosBegin.GetDrawPos().x, pInfo->m_pDispPos->GetDrawPos().y), pcLayout->CalcLayoutWidth(m_pcEditDoc->m_cLayoutMgr) + CLayoutInt(pcLayout->GetLayoutEol().GetLen() ? (CTypeSupport(this, COLORIDX_EOL).IsDisp() ? (GetTextMetrics().GetLayoutXDefault()+CLayoutXInt(4)) // HACK:EOLの描画幅分だけ確保する。4pxはCRLFのはみ出している分 : CLayoutXInt(2)) // 非表示 = 2px : CLayoutInt(0)) ); } return bDispEOF; }
/* テキスト反転 @param hdc @param nLineNum @param x @param y @param nX @note CCEditView::DrawLogicLine() での作画(WM_PAINT)時に、1レイアウト行をまとめて反転処理するための関数。 範囲選択の随時更新は、CEditView::DrawSelectArea() が選択・反転解除を行う。 */ void CEditView::DispTextSelected( HDC hdc, //!< 作画対象ビットマップを含むデバイス CLayoutInt nLineNum, //!< 反転処理対象レイアウト行番号(0開始) const CMyPoint& ptXY, //!< (相対レイアウト0桁目の左端座標, 対象行の上端座標) CLayoutInt nX_Layout //!< 対象行の終了桁位置。 [ABC\n]なら改行の後ろで4 ) { CLayoutInt nSelectFrom; CLayoutInt nSelectTo; RECT rcClip; int nLineHeight = GetTextMetrics().GetHankakuDy(); int nCharWidth = GetTextMetrics().GetCharPxWidth(); HRGN hrgnDraw; const CLayout* pcLayout = m_pcEditDoc->m_cLayoutMgr.SearchLineByLayoutY( nLineNum ); CLayoutRange& sSelect = GetSelectionInfo().m_sSelect; /* 選択範囲内の行かな */ // if( IsTextSelected() ){ if( nLineNum >= sSelect.GetFrom().y && nLineNum <= sSelect.GetTo().y ){ CLayoutRange selectArea = GetSelectionInfo().GetSelectAreaLine(nLineNum, pcLayout); nSelectFrom = selectArea.GetFrom().x; nSelectTo = selectArea.GetTo().x; if( nSelectFrom == INT_MAX ){ nSelectFrom = nX_Layout; } if( nSelectTo == INT_MAX ){ nSelectTo = nX_Layout; } // 2006.03.28 Moca 表示域外なら何もしない if( GetTextArea().GetRightCol() < nSelectFrom ){ return; } if( nSelectTo < GetTextArea().GetViewLeftCol() ){ // nSelectTo == GetTextArea().GetViewLeftCol()のケースは後で0文字マッチでないことを確認してから抜ける return; } if( nSelectFrom < GetTextArea().GetViewLeftCol() ){ nSelectFrom = GetTextArea().GetViewLeftCol(); } rcClip.left = ptXY.x + (Int)nSelectFrom * nCharWidth; rcClip.right = ptXY.x + (Int)nSelectTo * nCharWidth; rcClip.top = ptXY.y; rcClip.bottom = ptXY.y + nLineHeight; bool bOMatch = false; // 2005/04/02 かろと 0文字マッチだと反転幅が0となり反転されないので、1/3文字幅だけ反転させる // 2005/06/26 zenryaku 選択解除でキャレットの残骸が残る問題を修正 // 2005/09/29 ryoji スクロール時にキャレットのようなゴミが表示される問題を修正 if (GetSelectionInfo().IsTextSelected() && rcClip.right == rcClip.left && sSelect.IsLineOne() && sSelect.GetFrom().x >= GetTextArea().GetViewLeftCol()) { HWND hWnd = ::GetForegroundWindow(); if( hWnd && (hWnd == m_pcEditWnd->m_cDlgFind.GetHwnd() || hWnd == m_pcEditWnd->m_cDlgReplace.GetHwnd()) ){ rcClip.right = rcClip.left + 2; bOMatch = true; } } if( rcClip.right == rcClip.left ){ return; //0文字マッチによる反転幅拡張なし } // 2006.03.28 Moca ウィンドウ幅が大きいと正しく反転しない問題を修正 if( rcClip.right > GetTextArea().GetAreaRight() ){ rcClip.right = GetTextArea().GetAreaRight(); } // 選択色表示なら反転しない if( !bOMatch && CTypeSupport(this, COLORIDX_SELECT).IsDisp() ){ return; } HBRUSH hBrush = ::CreateSolidBrush( SELECTEDAREA_RGB ); int nROP_Old = ::SetROP2( hdc, SELECTEDAREA_ROP2 ); HBRUSH hBrushOld = (HBRUSH)::SelectObject( hdc, hBrush ); hrgnDraw = ::CreateRectRgn( rcClip.left, rcClip.top, rcClip.right, rcClip.bottom ); ::PaintRgn( hdc, hrgnDraw ); ::DeleteObject( hrgnDraw ); SetROP2( hdc, nROP_Old ); SelectObject( hdc, hBrushOld ); DeleteObject( hBrush ); } // } return; }
int MarkerHandler(int type, int par1, int par2) { if (type == EVT_POINTERDOWN) { selectingMarker = true; restore_current_position(); mainApplication->refreshWindow(); bookview->selectionModel().clear(); bookview->selectionModel().activate(par1 - imgposx, par2 - imgposy); SetHardTimer("SelectionTimer", SelectionTimer, 250); selMarkery1 = selMarkery2 = lasty = par2; lastx = par1; usersleep = 0; } else if (type == EVT_POINTERMOVE) { if (++trailMarker > 8) { if (selectingMarker) { lastx = par1; lasty = par2; bookview->selectionModel().extendTo(par1 - imgposx, par2 - imgposy); selMarkery2 = par2; usersleep = 0; } trailMarker = 0; } } else if (type == EVT_POINTERUP) { if (!selectingMarker) return 0; selectingMarker = false; ClearTimer(SelectionTimer); restore_current_position(); mainApplication->refreshWindow(); bookview->selectionModel().extendTo(par1 - imgposx, par2 - imgposy); long long spos, epos; bool clickOnly, emptyText; GetSelectionInfo(&spos, &epos, &emptyText, &clickOnly); if ((clickOnly && SynTOC.GetMarkerByPos(spos) != NULL) || emptyText) { OpenMarkerMenu(SynTOC.GetMarkerByPos(spos)); } else { MergeMarkers(spos, epos); bookview->selectionModel().clear(); repaint_all(-2); ToolBar.OutputPage(BitmapFromScreen(0, 0, ScreenWidth(), ScreenHeight()-PanelHeight()), 2, updMarkerx, updMarkery, updMarkerw, updMarkerh); } } else if (type == EVT_POINTERHOLD || type == EVT_POINTERLONG) { restore_current_position(); mainApplication->refreshWindow(); bookview->selectionModel().extendTo(par1 - imgposx, par2 - imgposy); long long spos, epos; bool clickOnly, emptyText; GetSelectionInfo(&spos, &epos, &emptyText, &clickOnly); if (clickOnly || emptyText) { OpenMarkerMenu(SynTOC.GetMarkerByPos(spos)); } } return 0; }