void Bitmap::Draw() { MathCell* tmp = m_tree; wxMemoryDC dc; dc.SelectObject(m_bmp); wxString bgColStr = wxT("white"); wxConfig::Get()->Read(wxT("Style/Background/color"), &bgColStr); dc.SetBackground(*(wxTheBrushList->FindOrCreateBrush(bgColStr, wxBRUSHSTYLE_SOLID))); dc.Clear(); if (tmp != NULL) { wxPoint point; point.x = 0; point.y = tmp->GetMaxCenter(); int fontsize = 12; int drop = tmp->GetMaxDrop(); wxConfig::Get()->Read(wxT("fontSize"), &fontsize); int mfontsize = fontsize; wxConfig::Get()->Read(wxT("mathfontsize"), &mfontsize); CellParser parser(dc); while (tmp != NULL) { if (!tmp->m_isBroken) { tmp->Draw(parser, point, tmp->IsMath() ? mfontsize : fontsize, false); if (tmp->m_next != NULL && tmp->m_next->BreakLineHere()) { point.x = 0; point.y += drop + tmp->m_next->GetMaxCenter(); if (tmp->m_bigSkip) point.y += MC_LINE_SKIP; drop = tmp->m_next->GetMaxDrop(); } else point.x += (tmp->GetWidth() + MC_CELL_SKIP); } else { if (tmp->m_next != NULL && tmp->m_next->BreakLineHere()) { point.x = 0; point.y += drop + tmp->m_next->GetMaxCenter(); if (tmp->m_bigSkip) point.y += MC_LINE_SKIP; drop = tmp->m_next->GetMaxDrop(); } } tmp = tmp->m_nextToDraw; } } dc.SelectObject(wxNullBitmap); }
void GroupCell::SelectRectInOutput(wxRect& rect, wxPoint& one, wxPoint& two, MathCell **first, MathCell **last) { if (m_hide) return; MathCell* tmp; wxPoint start, end; if (one.y < two.y || (one.y == two.y && one.x < two.x)) { start = one; end = two; } else { start = two; end = one; } // Lets select a rectangle tmp = m_output; *first = *last = NULL; while (tmp != NULL && !rect.Intersects(tmp->GetRect())) tmp = tmp->m_nextToDraw; *first = tmp; *last = tmp; while (tmp != NULL) { if (rect.Intersects(tmp->GetRect())) *last = tmp; tmp = tmp->m_nextToDraw; } if (*first != NULL && *last != NULL) { // If selection is on multiple lines, we need to correct it if ((*first)->GetCurrentY() != (*last)->GetCurrentY()) { tmp = *last; MathCell *curr; // Find the first cell in selection while (*first != tmp && ((*first)->GetCurrentX() + (*first)->GetWidth() < start.x || (*first)->GetCurrentY() + (*first)->GetDrop() < start.y)) *first = (*first)->m_nextToDraw; // Find the last cell in selection curr = *last = *first; while (1) { curr = curr->m_nextToDraw; if (curr == NULL) break; if (curr->GetCurrentX() <= end.x && curr->GetCurrentY() - curr->GetMaxCenter() <= end.y) *last = curr; if (curr == tmp) break; } } if (*first == *last) (*first)->SelectInner(rect, first, last); } }