//鼠标消息 VOID CDlgSkinControl::OnMouseMove(UINT nFlags, CPoint Point) { __super::OnMouseMove(nFlags,Point); //设置颜色 if (m_wMouseDownColor!=INVALID_WORD) { //更新颜色 INT nXExcursion=Point.x-COLOR_ORIGIN_X; SetCurrentColor(m_wMouseDownColor,__min(__max(nXExcursion,0),m_SizeColorItem.cx)); //保存配置 CParameterGlobal * pParameterGlobal=CParameterGlobal::GetInstance(); if (pParameterGlobal!=NULL) pParameterGlobal->m_SkinRenderInfo=m_CurrentRenderInfo; //设置资源 CSkinResourceManager * pSkinResourceManager=CSkinResourceManager::GetInstance(); if (pSkinResourceManager!=NULL) pSkinResourceManager->SetSkinResource(m_CurrentRenderInfo); //事件通知 CPlatformEvent * pPlatformEvent=CPlatformEvent::GetInstance(); if (pPlatformEvent!=NULL) pPlatformEvent->PostPlatformEvent(EVENT_SKIN_CONFIG_UPDATE,0L); //更新界面 RedrawWindow(NULL,NULL,RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASENOW); } return; }
ECode GestureOverlayView::SetGesture( /* [in] */ IGesture *gesture) { if (mCurrentGesture != NULL) { Clear(FALSE); } SetCurrentColor(mCertainGestureColor); mCurrentGesture = gesture; const AutoPtr<IPath> path; mCurrentGesture->ToPath((IPath**)&path); const AutoPtr<IRectF> bounds; CRectF::New((IRectF**)&bounds); path->ComputeBounds(bounds, TRUE); // TODO: The path should also be scaled to fit inside this view mPath->Rewind(); Float left, width, top, height; bounds->GetLeft(&left); bounds->GetWidth(&width); bounds->GetTop(&top); bounds->GetHeight(&height); Int32 w,h; this->GetWidth(&w); this->GetHeight(&h); mPath->AddPath(path, -left + (w - width) / 2.0f, -top + (h - height) / 2.0f); mResetGesture = TRUE; Invalidate(); return NOERROR; }
void nuiColorSelector::SwatchSelected(const nuiEvent& rEvent) { nuiPane* pPane = (nuiPane*) rEvent.mpUser; SetCurrentColor(pPane->GetFillColor()); // send event SwatchColorChanged(); rEvent.Cancel(); }
static void CPROC FillConsoleRect( PCONSOLE_INFO pdp, RECT *r, enum fill_color_type type ) { int c; uint32_t dwSize; move( r->top-1, r->left ); lprintf( "Filling blank line: at %d,%d %d,%d = %d", r->top, r->left, r->left, r->right, r->right-r->left); switch( type ) { case FILL_COMMAND_BACK: SetCurrentColor( pdp, COLOR_COMMAND, NULL ); //FillRect( pdp->wincon.hDC, r, pdp->wincon.hbrBackground ); break; case FILL_DISPLAY_BACK: SetCurrentColor( pdp, COLOR_DEFAULT, NULL ); //FillRect( pdp->wincon.hDC, r, pdp->wincon.hbrCommandBackground ); break; } for( c = r->left; c < r->right; c++ ) WriteConsole( pdp->consolecon.hStdout, " ", 1, &dwSize, NULL ); }
void nuiColorSelector::RGBSliderChanged(const nuiEvent& rEvent) { nuiSize red = (float)mpRedSlider->GetRange().GetValue(); nuiSize green = (float)mpGreenSlider->GetRange().GetValue(); nuiSize blue = (float)mpBlueSlider->GetRange().GetValue(); nuiSize alpha = (float)mpRGBAlphaSlider->GetRange().GetValue(); SetCurrentColor(nuiColor(red, green, blue, alpha)); // send event RGBColorChanged(); rEvent.Cancel(); }
void nuiColorSelector::HSVSliderChanged(const nuiEvent& rEvent) { nuiSize h = (float)mpHueSlider->GetRange().GetValue(); nuiSize s = (float)mpSaturationSlider->GetRange().GetValue(); nuiSize v = (float)mpValueSlider->GetRange().GetValue(); nuiSize alpha = (float)mpHSVAlphaSlider->GetRange().GetValue(); nuiColor c; c.SetHSV(h, s, v, alpha); SetCurrentColor(c); // send event HSVColorChanged(); rEvent.Cancel(); }
void CPROC RenderSeparator( PCONSOLE_INFO pdp, int nStart ) { int c; uint32_t dwSize; #define SetCurrentColor(f,b) do { /*lprintf( "setting attrbute %d:%d", f, b );*/ SetConsoleTextAttribute( pdp->consolecon.hStdout, f|((b)<<4) ); }while(0) #define move(y,x) do { COORD pos; /*lprintf( "setting position: %d,%d", x, y );*/ pos.X = x; pos.Y = y; SetConsoleCursorPosition( pdp->consolecon.hStdout, pos ); }while(0) if( nStart == -1 ) return; // asm("int $3\n"); //lprintf( "Rendering some separator at %d", nStart ); SetCurrentColor( 15, 0 ); move( nStart-1, 0 ); WriteConsole( pdp->consolecon.hStdout, ">", 1, &dwSize, NULL ); for( c = 0; c < pdp->nWidth-2; c++ ) WriteConsole( pdp->consolecon.hStdout, "-", 1, &dwSize, NULL ); WriteConsole( pdp->consolecon.hStdout, "<", 1, &dwSize, NULL ); #undef SetCurrentColor return; }
/*! 対括弧の強調表示 @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; }
/*! 行のテキスト/選択状態の描画 1回で1ロジック行分を作画する。 @return EOFを作画したらtrue @date 2001.02.17 MIK @date 2001.12.21 YAZAKI 改行記号の描きかたを変更 @date 2007.08.31 kobake 引数 bDispBkBitmap を削除 */ bool CEditView::DrawLogicLine( HDC _hdc, //!< [in] 作画対象 DispPos* _pDispPos, //!< [in,out] 描画する箇所、描画元ソース CLayoutInt nLineTo //!< [in] 作画終了するレイアウト行番号 ) { // MY_RUNNINGTIMER( cRunningTimer, "CEditView::DrawLogicLine" ); bool bDispEOF = false; SColorStrategyInfo _sInfo; SColorStrategyInfo* pInfo = &_sInfo; pInfo->m_gr.Init(_hdc); pInfo->m_pDispPos = _pDispPos; pInfo->m_pcView = this; //CColorStrategyPool初期化 CColorStrategyPool* pool = CColorStrategyPool::getInstance(); pool->SetCurrentView(this); pool->NotifyOnStartScanLogic(); bool bSkipBeforeLayout = pool->IsSkipBeforeLayout(); //DispPosを保存しておく pInfo->m_sDispPosBegin = *pInfo->m_pDispPos; //処理する文字位置 pInfo->m_nPosInLogic = CLogicInt(0); //☆開始 // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // 論理行データの取得 -> pLine, pLineLen // // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- // // 前行の最終設定色 { const CLayout* pcLayout = pInfo->m_pDispPos->GetLayoutRef(); if( bSkipBeforeLayout ){ EColorIndexType eRet = COLORIDX_TEXT; const CLayoutColorInfo* colorInfo = NULL; if( pcLayout ){ eRet = pcLayout->GetColorTypePrev(); // COLORIDX_TEXTのはず colorInfo = pcLayout->GetColorInfo(); } pInfo->m_pStrategy = pool->GetStrategyByColor(eRet); if( pInfo->m_pStrategy ){ pInfo->m_pStrategy->InitStrategyStatus(); pInfo->m_pStrategy->SetStrategyColorInfo(colorInfo); } }else{ CColor3Setting cColor = GetColorIndex(pcLayout, pInfo->m_pDispPos->GetLayoutLineRef(), 0, pInfo, true); SetCurrentColor(pInfo->m_gr, cColor.eColorIndex, cColor.eColorIndex2, cColor.eColorIndexBg); } } //開始ロジック位置を算出 { const CLayout* pcLayout = pInfo->m_pDispPos->GetLayoutRef(); pInfo->m_nPosInLogic = pcLayout?pcLayout->GetLogicOffset():CLogicInt(0); } for (;;) { //対象行が描画範囲外だったら終了 if( GetTextArea().GetBottomLine() < pInfo->m_pDispPos->GetLayoutLineRef() ){ pInfo->m_pDispPos->SetLayoutLineRef(nLineTo + CLayoutInt(1)); break; } if( nLineTo < pInfo->m_pDispPos->GetLayoutLineRef() ){ break; } //レイアウト行を1行描画 bDispEOF = DrawLayoutLine(pInfo); //行を進める CLogicInt nOldLogicLineNo = pInfo->m_pDispPos->GetLayoutRef()->GetLogicLineNo(); pInfo->m_pDispPos->ForwardDrawLine(1); //描画Y座標++ pInfo->m_pDispPos->ForwardLayoutLineRef(1); //レイアウト行++ // ロジック行を描画し終わったら抜ける if(pInfo->m_pDispPos->GetLayoutRef()->GetLogicLineNo()!=nOldLogicLineNo){ break; } // nLineToを超えたら抜ける if(pInfo->m_pDispPos->GetLayoutLineRef() >= nLineTo + CLayoutInt(1)){ break; } } return bDispEOF; }
void APRView::MessageReceived(BMessage *msg) { if (msg->WasDropped()) { rgb_color *color; ssize_t size; if (msg->FindData("RGBColor", (type_code)'RGBC', (const void**)&color, &size) == B_OK) { SetCurrentColor(*color); } } switch (msg->what) { case DECORATOR_CHANGED: { int32 index = fDecorMenu->IndexOf(fDecorMenu->FindMarked()); #ifdef ANTARES_TARGET_PLATFORM_ANTARES if (index >= 0) BPrivate::set_decorator(index); #endif break; } case UPDATE_COLOR: { // Received from the color fPicker when its color changes rgb_color color = fPicker->ValueAsColor(); SetCurrentColor(color); Window()->PostMessage(kMsgUpdate); break; } case ATTRIBUTE_CHOSEN: { // Received when the user chooses a GUI fAttribute from the list ColorWhichItem *item = (ColorWhichItem*) fAttrList->ItemAt(fAttrList->CurrentSelection()); if (item == NULL) break; fWhich = item->ColorWhich(); rgb_color color = fCurrentSet.GetColor(fWhich); SetCurrentColor(color); Window()->PostMessage(kMsgUpdate); break; } case REVERT_SETTINGS: { fCurrentSet = fPrevSet; UpdateControls(); UpdateAllColors(); Window()->PostMessage(kMsgUpdate); break; } case DEFAULT_SETTINGS: { fCurrentSet = ColorSet::DefaultColorSet(); UpdateControls(); UpdateAllColors(); if (fDecorMenu) { BMenuItem *item = fDecorMenu->FindItem("Default"); if (item) { item->SetMarked(true); #ifdef ANTARES_TARGET_PLATFORM_ANTARES BPrivate::set_decorator(fDecorMenu->IndexOf(item)); #endif } } Window()->PostMessage(kMsgUpdate); break; } default: BView::MessageReceived(msg); break; } }