// Automatically positions tabs // TODO: this should just add the tab to a list, and then // a layout function (e.g. Realize) should be called when all tabs have been added. // The view rect could easily change as the view window is resized. wxTabControl *wxTabView::AddTab(int id, const wxString& label, wxTabControl *existingTab) { // First, find which layer we should be adding to. wxTabLayerList::compatibility_iterator node = m_layers.GetLast(); if (!node) { wxTabLayer *newLayer = new wxTabLayer; node = m_layers.Append(newLayer); } // Check if adding another tab control would go off the // right-hand edge of the layer. wxTabLayer *tabLayer = (wxTabLayer *)node->GetData(); wxList::compatibility_iterator lastTabNode = tabLayer->GetLast(); if (lastTabNode) { wxTabControl *lastTab = (wxTabControl *)lastTabNode->GetData(); // Start another layer (row). // Tricky choice: can't just check if will be overlapping the edge, because // this happens anyway for 2nd and subsequent rows. // Should check this for 1st row, and then subsequent rows should not exceed 1st // in length. if (((tabLayer == m_layers.GetFirst()->GetData()) && ((lastTab->GetX() + 2*lastTab->GetWidth() + GetHorizontalTabSpacing()) > GetViewRect().width)) || ((tabLayer != m_layers.GetFirst()->GetData()) && (tabLayer->GetCount() == ((wxTabLayer *)m_layers.GetFirst()->GetData())->GetCount()))) { tabLayer = new wxTabLayer; m_layers.Append(tabLayer); lastTabNode = wxList::compatibility_iterator(); } } int layer = m_layers.GetCount() - 1; wxTabControl *tabControl = existingTab; if (!existingTab) tabControl = OnCreateTabControl(); tabControl->SetRowPosition(tabLayer->GetCount()); tabControl->SetColPosition(layer); wxTabControl *lastTab = NULL; if (lastTabNode) lastTab = (wxTabControl *)lastTabNode->GetData(); // Top of new tab int verticalOffset = (- GetTopMargin()) - ((layer+1)*GetTabHeight()); // Offset from view top-left int horizontalOffset = 0; if (!lastTab) horizontalOffset = layer*GetHorizontalTabOffset(); else horizontalOffset = lastTab->GetX() + GetTabWidth() + GetHorizontalTabSpacing(); tabControl->SetPosition(horizontalOffset, verticalOffset); tabControl->SetSize(GetTabWidth(), GetTabHeight()); tabControl->SetId(id); tabControl->SetLabel(label); tabControl->SetFont(* GetTabFont()); tabLayer->Append(tabControl); m_noTabs ++; return tabControl; }
void clTabRendererClassic::Draw(wxWindow* parent, wxDC& dc, wxDC& fontDC, const clTabInfo& tabInfo, const clTabColours& colors, size_t style, eButtonState buttonState) { const int tabRaius = 1.5; clTabColours colours = colors; if(DrawingUtils::IsDark(colours.activeTabBgColour)) { InitDarkColours(colours, colours.activeTabBgColour); } else { InitLightColours(colours, colours.activeTabBgColour); } wxColour bgColour(tabInfo.IsActive() ? colours.activeTabBgColour : colours.inactiveTabBgColour); wxColour penColour(tabInfo.IsActive() ? colours.activeTabPenColour : colours.inactiveTabPenColour); wxFont font = GetTabFont(false); fontDC.SetTextForeground(tabInfo.IsActive() ? colours.activeTabTextColour : colours.inactiveTabTextColour); fontDC.SetFont(font); if(style & kNotebook_BottomTabs) { // Bottom tabs wxRect tabRect = tabInfo.GetRect(); tabRect.SetHeight(tabRect.GetHeight() + tabRaius); tabRect.SetY(tabRect.GetY() - tabRaius); { dc.SetPen(penColour); dc.SetBrush(bgColour); dc.DrawRoundedRectangle(tabRect, tabRaius); } { tabRect.Deflate(1); // The inner border dc.SetPen(tabInfo.IsActive() ? colours.activeTabInnerPenColour : colours.inactiveTabInnerPenColour); dc.SetBrush(bgColour); dc.DrawRoundedRectangle(tabRect, tabRaius); } } else { // Default tabs (placed at the top) wxRect tabRect = tabInfo.GetRect(); tabRect.SetHeight(tabRect.GetHeight() + tabRaius); { dc.SetPen(penColour); dc.SetBrush(bgColour); dc.DrawRoundedRectangle(tabRect, tabRaius); } { tabRect.Deflate(1); // The inner border dc.SetPen(tabInfo.IsActive() ? colours.activeTabInnerPenColour : colours.inactiveTabInnerPenColour); dc.SetBrush(bgColour); dc.DrawRoundedRectangle(tabRect, tabRaius); } } // Draw bitmap if(tabInfo.GetBitmap().IsOk()) { const wxBitmap& bmp = (!tabInfo.IsActive() && tabInfo.GetDisabledBitmp().IsOk()) ? tabInfo.GetDisabledBitmp() : tabInfo.GetBitmap(); dc.DrawBitmap(bmp, tabInfo.m_bmpX + tabInfo.m_rect.GetX(), tabInfo.m_bmpY); } fontDC.DrawText(tabInfo.m_label, tabInfo.m_textX + tabInfo.m_rect.GetX(), tabInfo.m_textY); if(tabInfo.IsActive() && (style & kNotebook_CloseButtonOnActiveTab)) { DrawButton(parent, dc, tabInfo, colours, buttonState); } }