/** * CFootyView::AdjustVisibleLine * @brief 見える位置をキャレット位置から調整する処理 * @return 位置が変更されたときtrue */ bool CFootyView::AdjustVisibleLine(){ const LinePt pLine = m_pDocuments->GetCaretPosition()->GetLinePointer(); CEthicLine *pFirstVisible = m_pDocuments->GetFirstVisible(m_nViewID); // 倫理行オフセット位置を取得する size_t nFirstOffset = pFirstVisible->GetLinePointer()->GetOffset() + pFirstVisible->GetEthicNum(); CFootyLine::EthicInfo stEthicInfo = m_pDocuments->GetCaretPosition()->GetLinePointer()->CalcEthicLine (m_pDocuments->GetCaretPosition()->GetPosition(),m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(),m_pDocuments->GetLapelMode()); size_t nEthicOffset = pLine->GetOffset() + stEthicInfo.m_nEthicLine; //現在の位置の中に入っていないとき、調整 if (nEthicOffset < nFirstOffset){ // 現在位置より前に存在する pFirstVisible->MoveEthicBack (nFirstOffset - nEthicOffset + m_nVisibleLines / 2); return true; } if (nFirstOffset + m_nVisibleLines <= nEthicOffset){ // 現在位置より後ろに存在する pFirstVisible->MoveEthicNext(m_pDocuments->GetLineList(), nEthicOffset - nFirstOffset - m_nVisibleLines / 2); return true; } return false; }
int CEthicLine::GetDifference(CEthicLine &lnEthic,LsLines *pLines){ int nRetValue; CEthicLine lnWork = *this; if (lnWork <= lnEthic){ for (nRetValue=0;lnWork != lnEthic;nRetValue++){ lnWork.MoveEthicNext(pLines,1); } } else{ for (nRetValue=0;lnWork != lnEthic;nRetValue--){ lnWork.MoveEthicBack(1); } } return nRetValue; }
/** * @brief エディタ上におけるポジションを割り出す関数です。 * @param x [in] マウスのx座標 * @param y [in] マウスのy座標 * @return 範囲を超えているときはfalseが返りますが、xがエディタ内にありかつ * yが最終行を超えているときはfalseを返しつつポジションも割り出されます。 */ bool CFootyView::CalcInfoFromMouse(int x,int y,CEditPosition *pPos) { FOOTY2_ASSERT( pPos ); // 宣言 size_t nEthicColumn = 0; size_t nPosition; size_t nLineFromTop; CEthicLine cMouseLine; // 適合範囲外 if (x < m_nLineCountWidth) return false; if (y < m_nRulerHeight) return false; // 計算する nLineFromTop = (size_t) (y - m_nRulerHeight) / (m_pFonts->GetHeight() + m_nHeightMargin); nEthicColumn = (size_t)m_nFirstVisibleColumn + (x - m_nLineCountWidth + (m_pFonts->GetWidth() + m_nWidthMargin) / 2) / (m_pFonts->GetWidth() + m_nWidthMargin); // そこからポジションの割り出し cMouseLine = *m_pDocuments->GetFirstVisible(m_nViewID); if (cMouseLine.MoveEthicNext(m_pDocuments->GetLineList(),nLineFromTop)) { nPosition = cMouseLine.GetLinePointer()->CalcRealPosition (cMouseLine.GetEthicNum(),nEthicColumn, m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(), m_pDocuments->GetLapelMode()); pPos->SetPosition(cMouseLine.GetLinePointer(),nPosition); return true; } else // 最終行超えてる { LinePt pLast = m_pDocuments->GetLastLine(); nPosition = pLast->CalcRealPosition (pLast->GetEthicLine() - 1,nEthicColumn, m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(), m_pDocuments->GetLapelMode()); pPos->SetPosition(pLast,nPosition); return false; } }
/** * @brief 行番号表示領域をクリックされたと仮定してy座標から位置を割り出すルーチンです。 */ bool CFootyView::CalcLineCount(int y,CEditPosition *pStart,CEditPosition *pEnd) { // 宣言 size_t nPosition; size_t nLineFromTop; CEthicLine cMouseLine; LinePt pLine; // 適合範囲外 if (!pStart || !pEnd)return false; // 行位置の計算 cMouseLine = *m_pDocuments->GetFirstVisible(m_nViewID); if (y < m_nRulerHeight) { nLineFromTop = (size_t) (m_nRulerHeight - y) / (m_pFonts->GetHeight() + m_nHeightMargin); if (!cMouseLine.MoveEthicBack(nLineFromTop)) return false; } else { nLineFromTop = (size_t) (y - m_nRulerHeight) / (m_pFonts->GetHeight() + m_nHeightMargin); cMouseLine.MoveEthicNext(m_pDocuments->GetLineList(),nLineFromTop); } pLine = cMouseLine.GetLinePointer(); // 開始位置割り出し nPosition = pLine->CalcRealPosition (cMouseLine.GetEthicNum(),0, m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(), m_pDocuments->GetLapelMode()); pStart->SetPosition(pLine,nPosition); // 終了位置割り出し nPosition = pLine->CalcRealPosition (cMouseLine.GetEthicNum() + 1,0, m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(), m_pDocuments->GetLapelMode()); //if (nPosition == pLine->GetLineLength()) //{ // if (cMouseLine.MoveRealNext(m_pDocuments->GetLineList(),1)) // nPosition = 0; //} pEnd->SetPosition(cMouseLine.GetLinePointer(),nPosition); return true; }
/** * CFootyView::CaretMove * @brief キャレットの位置とIMEポジションの位置を設定する */ void CFootyView::CaretMove(){ /*宣言*/ const LinePt pLine = m_pDocuments->GetCaretPosition()->GetLinePointer(); const size_t nPosition = m_pDocuments->GetCaretPosition()->GetPosition(); CEthicLine cFirstVisible = *m_pDocuments->GetFirstVisible(m_nViewID); CFootyLine::EthicInfo stEthicInfo; int nCaretX,nCaretY; /*キャレット位置を計算する*/ int nOffset = (int)pLine->GetOffset(); stEthicInfo = pLine->CalcEthicLine (nPosition,m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(),m_pDocuments->GetLapelMode()); nCaretX = GetTextPosX((int)stEthicInfo.m_nEthicColumn); nCaretY = m_nRulerHeight + (int)(nOffset - cFirstVisible.GetLinePointer()->GetOffset() - cFirstVisible.GetEthicNum() + stEthicInfo.m_nEthicLine) * (m_pFonts->GetHeight() + m_nHeightMargin); /*キャレットの太さを決定する*/ if (!m_pDocuments->IsInsertMode()){ if (nPosition == pLine->GetLineLength()) m_nCaretWidth = 2; else{ stEthicInfo = pLine->CalcEthicLine (nPosition + 1,m_pDocuments->GetLapelColumn(), m_pDocuments->GetTabLen(),m_pDocuments->GetLapelMode()); m_nCaretWidth = GetTextPosX((int)stEthicInfo.m_nEthicColumn) - nCaretX; } } else m_nCaretWidth = 2; /*キャレットを再構築*/ if (m_bIsFocused){ m_cCaret.ReCreate(m_nCaretWidth,m_pFonts->GetHeight()); m_cCaret.Move(nCaretX,nCaretY); } int nHeightScroll = GetSystemMetrics(SM_CYHSCROLL); int nWidthScroll = GetSystemMetrics(SM_CXVSCROLL); if (nCaretX < m_nLineCountWidth || m_nWidth - nWidthScroll < nCaretX || nCaretY < m_nRulerHeight || m_nHeight - nHeightScroll < nCaretY){ nCaretX = 0; nCaretY = 0; m_cCaret.Hide(); } else{ if (m_bIsFocused)m_cCaret.Show(); } // IMEを設定する if (m_bIsFocused) { LOGFONT lFont; COMPOSITIONFORM cf; HIMC hImc=ImmGetContext(m_hWnd); if (hImc) { // フォントを設定する GetObject(m_pFonts->GetKanjiFont(),sizeof(LOGFONT),&lFont); ImmSetCompositionFont(hImc,&lFont); // IME表示領域を設定する cf.dwStyle = CFS_POINT; cf.ptCurrentPos.x = (long)nCaretX; cf.ptCurrentPos.y = (long)nCaretY; cf.rcArea.left = cf.ptCurrentPos.x; cf.rcArea.top = cf.ptCurrentPos.y; cf.rcArea.right = m_nWidth; cf.rcArea.bottom = m_nHeight; ImmSetCompositionWindow(hImc, &cf); // ハンドルの解放 ImmReleaseContext(m_hWnd,hImc); } } }