// Created: 01/02/97
// RCS-ID: $Id$
// Copyright: (c)
-// Licence: wxWindows licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma hdrstop
#endif
+#if wxUSE_TAB_DIALOG
+
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/tab.h"
+// not defined: use old, square tab implementation (fills in tabs)
+// defined: use new, rounded tab implementation (doesn't colour in tabs)
+// #define wxUSE_NEW_METHOD
+
IMPLEMENT_DYNAMIC_CLASS(wxTabControl, wxObject)
IMPLEMENT_DYNAMIC_CLASS(wxTabLayer, wxList)
{
m_view = v;
m_isSelected = FALSE;
- m_labelFont = NULL;
m_offsetX = 0;
m_offsetY = 0;
m_width = 0;
wxTabControl::~wxTabControl(void)
{
}
-
+
void wxTabControl::OnDraw(wxDC& dc, bool lastInRow)
{
// Old, but in some ways better (drawing opaque tabs)
-#if 0
+#ifndef wxUSE_NEW_METHOD
if (!m_view)
return;
-
+
// Top-left of tab view area
int viewX = m_view->GetViewRect().x;
int viewY = m_view->GetViewRect().y;
-
+
// Top-left of tab control
int tabX = GetX() + viewX;
int tabY = GetY() + viewY;
int tabHeightInc = 0;
if (m_isSelected)
{
- tabHeightInc = (view->GetTabSelectionHeight() - view->GetTabHeight());
+ tabHeightInc = (m_view->GetTabSelectionHeight() - m_view->GetTabHeight());
tabY -= tabHeightInc;
}
-
- dc.SetPen(wxTRANSPARENT_PEN);
+
+ dc.SetPen(*wxTRANSPARENT_PEN);
// Draw grey background
- if (view->GetTabStyle() & wxTAB_STYLE_COLOUR_INTERIOR)
+ if (m_view->GetTabStyle() & wxTAB_STYLE_COLOUR_INTERIOR)
{
- dc.SetBrush(m_view->GetBackgroundBrush());
+ dc.SetBrush(*m_view->GetBackgroundBrush());
// Add 1 because the pen is transparent. Under Motif, may be different.
+#ifdef __WXMOTIF__
+ dc.DrawRectangle(tabX, tabY, (GetWidth()+1), (GetHeight() + tabHeightInc));
+#else
dc.DrawRectangle(tabX, tabY, (GetWidth()+1), (GetHeight() + 1 + tabHeightInc));
+#endif
}
-
+
// Draw highlight and shadow
- dc.SetPen(m_view->GetHighlightPen());
+ dc.SetPen(*m_view->GetHighlightPen());
// Calculate the top of the tab beneath. It's the height of the tab, MINUS
// a bit if the tab below happens to be selected. Check.
dc.DrawLine(tabX, tabY, tabX, (tabY + GetHeight() + tabHeightInc - subtractThis));
dc.DrawLine(tabX, tabY, (tabX + GetWidth()), tabY);
- dc.SetPen(m_view->GetShadowPen());
+ dc.SetPen(*m_view->GetShadowPen());
// Test if we're outside the right-hand edge of the view area
if (((tabX + GetWidth()) >= m_view->GetViewRect().x + m_view->GetViewRect().width) && (m_view->GetTabStyle() & wxTAB_STYLE_DRAW_BOX))
(tabX + GetWidth()), (bottomY-1));
// Draw black line to emphasize shadow
- dc.SetPen(wxBLACK_PEN);
+ dc.SetPen(*wxBLACK_PEN);
dc.DrawLine((tabX + GetWidth() + 1), (tabY+1),
(tabX + GetWidth() + 1), bottomY);
if (lastInRow)
{
// 25/5/97 UNLESS it's less than the max number of positions in this row
-
+
int topY = m_view->GetViewRect().y - m_view->GetTopMargin();
- int maxPositions = ((wxTabLayer *)m_view->GetLayers().Nth(0)->Data())->Number();
+ int maxPositions = ((wxTabLayer *)m_view->GetLayers().Item(0)->GetData())->GetCount();
// Only down to the bottom of the tab, not to the top of the view
- if ( GetColPosition() < maxPositions )
+ if ( GetRowPosition() < (maxPositions - 1) )
topY = tabY + GetHeight() + tabHeightInc;
+#ifdef __WXMOTIF__
+ topY -= 1;
+#endif
+
// Shadow
dc.DrawLine((tabX + GetWidth()), tabY, (tabX + GetWidth()), topY);
// Draw black line to emphasize shadow
- dc.SetPen(wxBLACK_PEN);
+ dc.SetPen(*wxBLACK_PEN);
dc.DrawLine((tabX + GetWidth() + 1), (tabY+1), (tabX + GetWidth() + 1),
topY);
}
if (tabBeneath && tabBeneath->IsSelected())
subtractThis = (m_view->GetTabSelectionHeight() - m_view->GetTabHeight());
+#ifdef __WXMOTIF__
+ subtractThis += 1;
+#endif
+
// Draw only to next tab down.
dc.DrawLine((tabX + GetWidth()), tabY,
(tabX + GetWidth()), (tabY + GetHeight() + tabHeightInc - subtractThis));
// Draw black line to emphasize shadow
- dc.SetPen(wxBLACK_PEN);
+ dc.SetPen(*wxBLACK_PEN);
dc.DrawLine((tabX + GetWidth() + 1), (tabY+1), (tabX + GetWidth() + 1),
(tabY + GetHeight() + tabHeightInc - subtractThis));
}
}
-
+
// Draw centered text
int textY = tabY + m_view->GetVerticalTabTextSpacing() + tabHeightInc;
if (m_isSelected)
- dc.SetFont(m_view->GetSelectedTabFont());
+ dc.SetFont(* m_view->GetSelectedTabFont());
else
- dc.SetFont(GetFont());
+ dc.SetFont(* GetFont());
wxColour col(m_view->GetTextColour());
- dc.SetTextForeground(&col);
-// dc.SetTextForeground(&(m_view->GetTextColour()));
+ dc.SetTextForeground(col);
dc.SetBackgroundMode(wxTRANSPARENT);
- float textWidth, textHeight;
+ long textWidth, textHeight;
dc.GetTextExtent(GetLabel(), &textWidth, &textHeight);
int textX = (int)(tabX + (GetWidth() - textWidth)/2.0);
+ if (textX < (tabX + 2))
+ textX = (tabX + 2);
+
+ dc.SetClippingRegion(tabX, tabY, GetWidth(), GetHeight());
dc.DrawText(GetLabel(), textX, textY);
+ dc.DestroyClippingRegion();
if (m_isSelected)
{
- dc.SetPen(m_view->GetHighlightPen());
+ dc.SetPen(*m_view->GetHighlightPen());
// Draw white highlight from the tab's left side to the left hand edge of the view
dc.DrawLine(m_view->GetViewRect().x, (tabY + GetHeight() + tabHeightInc),
dc.DrawLine((tabX + GetWidth()), (tabY + GetHeight() + tabHeightInc),
m_view->GetViewRect().x + m_view->GetViewRect().width, (tabY + GetHeight() + tabHeightInc));
}
-#endif
+#else
+ // New HEL version with rounder tabs
+
+ if (!m_view) return;
+
+ int tabInc = 0;
+ if (m_isSelected)
+ {
+ tabInc = m_view->GetTabSelectionHeight() - m_view->GetTabHeight();
+ }
+ int tabLeft = GetX() + m_view->GetViewRect().x;
+ int tabTop = GetY() + m_view->GetViewRect().y - tabInc;
+ int tabRight = tabLeft + m_view->GetTabWidth();
+ int left = m_view->GetViewRect().x;
+ int top = tabTop + m_view->GetTabHeight() + tabInc;
+ int right = left + m_view->GetViewRect().width;
+ int bottom = top + m_view->GetViewRect().height;
+
+ if (m_isSelected)
+ {
+ // TAB is selected - draw TAB and the View's full outline
+
+ dc.SetPen(*(m_view->GetHighlightPen()));
+ wxPoint pnts[10];
+ int n = 0;
+ pnts[n].x = left; pnts[n++].y = bottom;
+ pnts[n].x = left; pnts[n++].y = top;
+ pnts[n].x = tabLeft; pnts[n++].y = top;
+ pnts[n].x = tabLeft; pnts[n++].y = tabTop + 2;
+ pnts[n].x = tabLeft + 2; pnts[n++].y = tabTop;
+ pnts[n].x = tabRight - 1; pnts[n++].y = tabTop;
+ dc.DrawLines(n, pnts);
+ if (!lastInRow)
+ {
+ dc.DrawLine(
+ (tabRight + 2),
+ top,
+ right,
+ top
+ );
+ }
+
+ dc.SetPen(*(m_view->GetShadowPen()));
+ dc.DrawLine(
+ tabRight,
+ tabTop + 2,
+ tabRight,
+ top
+ );
+ dc.DrawLine(
+ right,
+ top,
+ right,
+ bottom
+ );
+ dc.DrawLine(
+ right,
+ bottom,
+ left,
+ bottom
+ );
+
+ dc.SetPen(*wxBLACK_PEN);
+ dc.DrawPoint(
+ tabRight,
+ tabTop + 1
+ );
+ dc.DrawPoint(
+ tabRight + 1,
+ tabTop + 2
+ );
+ if (lastInRow)
+ {
+ dc.DrawLine(
+ tabRight + 1,
+ bottom,
+ tabRight + 1,
+ tabTop + 1
+ );
+ }
+ else
+ {
+ dc.DrawLine(
+ tabRight + 1,
+ tabTop + 2,
+ tabRight + 1,
+ top
+ );
+ dc.DrawLine(
+ right + 1,
+ top,
+ right + 1,
+ bottom + 1
+ );
+ }
+ dc.DrawLine(
+ right + 1,
+ bottom + 1,
+ left + 1,
+ bottom + 1
+ );
+ }
+ else
+ {
+ // TAB is not selected - just draw TAB outline and RH edge
+ // if the TAB is the last in the row
+
+ int maxPositions = ((wxTabLayer*)m_view->GetLayers().Item(0)->GetData())->GetCount();
+ wxTabControl* tabBelow = 0;
+ wxTabControl* tabBelowRight = 0;
+ if (GetColPosition() > 0)
+ {
+ tabBelow = m_view->FindTabControlForPosition(
+ GetColPosition() - 1,
+ GetRowPosition()
+ );
+ }
+ if (!lastInRow && GetColPosition() > 0)
+ {
+ tabBelowRight = m_view->FindTabControlForPosition(
+ GetColPosition() - 1,
+ GetRowPosition() + 1
+ );
+ }
+
+ float raisedTop = top - m_view->GetTabSelectionHeight() +
+ m_view->GetTabHeight();
+
+ dc.SetPen(*(m_view->GetHighlightPen()));
+ wxPoint pnts[10];
+ int n = 0;
+
+ pnts[n].x = tabLeft;
+
+ if (tabBelow && tabBelow->IsSelected())
+ {
+ pnts[n++].y = (long)raisedTop;
+ }
+ else
+ {
+ pnts[n++].y = top;
+ }
+ pnts[n].x = tabLeft; pnts[n++].y = tabTop + 2;
+ pnts[n].x = tabLeft + 2; pnts[n++].y = tabTop;
+ pnts[n].x = tabRight - 1; pnts[n++].y = tabTop;
+ dc.DrawLines(n, pnts);
+
+ dc.SetPen(*(m_view->GetShadowPen()));
+ if (GetRowPosition() >= maxPositions - 1)
+ {
+ dc.DrawLine(
+ tabRight,
+ (tabTop + 2),
+ tabRight,
+ bottom
+ );
+ dc.DrawLine(
+ tabRight,
+ bottom,
+ (tabRight - m_view->GetHorizontalTabOffset()),
+ bottom
+ );
+ }
+ else
+ {
+ if (tabBelowRight && tabBelowRight->IsSelected())
+ {
+ dc.DrawLine(
+ tabRight,
+ (long)raisedTop,
+ tabRight,
+ tabTop + 1
+ );
+ }
+ else
+ {
+ dc.DrawLine(
+ tabRight,
+ top - 1,
+ tabRight,
+ tabTop + 1
+ );
+ }
+ }
+
+ dc.SetPen(*wxBLACK_PEN);
+ dc.DrawPoint(
+ tabRight,
+ tabTop + 1
+ );
+ dc.DrawPoint(
+ tabRight + 1,
+ tabTop + 2
+ );
+ if (GetRowPosition() >= maxPositions - 1)
+ {
+ // draw right hand edge to bottom of view
+ dc.DrawLine(
+ tabRight + 1,
+ bottom + 1,
+ tabRight + 1,
+ tabTop + 2
+ );
+ dc.DrawLine(
+ tabRight + 1,
+ bottom + 1,
+ (tabRight - m_view->GetHorizontalTabOffset()),
+ bottom + 1
+ );
+ }
+ else
+ {
+ // draw right hand edge of TAB
+ if (tabBelowRight && tabBelowRight->IsSelected())
+ {
+ dc.DrawLine(
+ tabRight + 1,
+ (long)(raisedTop - 1),
+ tabRight + 1,
+ tabTop + 2
+ );
+ }
+ else
+ {
+ dc.DrawLine(
+ tabRight + 1,
+ top - 1,
+ tabRight + 1,
+ tabTop + 2
+ );
+ }
+ }
+ }
+
+ // Draw centered text
+ dc.SetPen(*wxBLACK_PEN);
+ if (m_isSelected)
+ {
+ dc.SetFont(*(m_view->GetSelectedTabFont()));
+ }
+ else
+ {
+ dc.SetFont(*(GetFont()));
+ }
+
+ wxColour col(m_view->GetTextColour());
+ dc.SetTextForeground(col);
+ dc.SetBackgroundMode(wxTRANSPARENT);
+ long textWidth, textHeight;
+ dc.GetTextExtent(GetLabel(), &textWidth, &textHeight);
-// New HEL version with rounder tabs
-#if 1
- if (!m_view) return;
-
- int tabInc = 0;
- if (m_isSelected)
- {
- tabInc = m_view->GetTabSelectionHeight() - m_view->GetTabHeight();
- }
- int tabLeft = GetX() + m_view->GetViewRect().x;
- int tabTop = GetY() + m_view->GetViewRect().y - tabInc;
- int tabRight = tabLeft + m_view->GetTabWidth();
- int left = m_view->GetViewRect().x;
- int top = tabTop + m_view->GetTabHeight() + tabInc;
- int right = left + m_view->GetViewRect().width;
- int bottom = top + m_view->GetViewRect().height;
-
- if (m_isSelected)
- {
- // TAB is selected - draw TAB and the View's full outline
-
- dc.SetPen(*(m_view->GetHighlightPen()));
- wxPoint pnts[10];
- int n = 0;
- pnts[n].x = left; pnts[n++].y = bottom;
- pnts[n].x = left; pnts[n++].y = top;
- pnts[n].x = tabLeft; pnts[n++].y = top;
- pnts[n].x = tabLeft; pnts[n++].y = tabTop + 2;
- pnts[n].x = tabLeft + 2; pnts[n++].y = tabTop;
- pnts[n].x = tabRight - 1; pnts[n++].y = tabTop;
- dc.DrawLines(n, pnts);
- if (!lastInRow)
- {
- dc.DrawLine(
- (tabRight + 2),
- top,
- right,
- top
- );
- }
-
- dc.SetPen(*(m_view->GetShadowPen()));
- dc.DrawLine(
- tabRight,
- tabTop + 2,
- tabRight,
- top
- );
- dc.DrawLine(
- right,
- top,
- right,
- bottom
- );
- dc.DrawLine(
- right,
- bottom,
- left,
- bottom
- );
-
- dc.SetPen(*wxBLACK_PEN);
- dc.DrawPoint(
- tabRight,
- tabTop + 1
- );
- dc.DrawPoint(
- tabRight + 1,
- tabTop + 2
- );
- if (lastInRow)
- {
- dc.DrawLine(
- tabRight + 1,
- bottom,
- tabRight + 1,
- tabTop + 1
- );
- }
- else
- {
- dc.DrawLine(
- tabRight + 1,
- tabTop + 2,
- tabRight + 1,
- top
- );
- dc.DrawLine(
- right + 1,
- top,
- right + 1,
- bottom + 1
- );
- }
- dc.DrawLine(
- right + 1,
- bottom + 1,
- left + 1,
- bottom + 1
- );
- }
- else
- {
- // TAB is not selected - just draw TAB outline and RH edge
- // if the TAB is the last in the row
-
- int maxPositions = ((wxTabLayer*)m_view->GetLayers().Nth(0)->Data())->Number();
- wxTabControl* tabBelow = 0;
- wxTabControl* tabBelowRight = 0;
- if (GetColPosition() > 0)
- {
- tabBelow = m_view->FindTabControlForPosition(
- GetColPosition() - 1,
- GetRowPosition()
- );
- }
- if (!lastInRow && GetColPosition() > 0)
- {
- tabBelowRight = m_view->FindTabControlForPosition(
- GetColPosition() - 1,
- GetRowPosition() + 1
- );
- }
-
- float raisedTop = top - m_view->GetTabSelectionHeight() +
- m_view->GetTabHeight();
-
- dc.SetPen(*(m_view->GetHighlightPen()));
- wxPoint pnts[10];
- int n = 0;
-
- pnts[n].x = tabLeft;
-
- if (tabBelow && tabBelow->IsSelected())
- {
- pnts[n++].y = (long)raisedTop;
- }
- else
- {
- pnts[n++].y = top;
- }
- pnts[n].x = tabLeft; pnts[n++].y = tabTop + 2;
- pnts[n].x = tabLeft + 2; pnts[n++].y = tabTop;
- pnts[n].x = tabRight - 1; pnts[n++].y = tabTop;
- dc.DrawLines(n, pnts);
-
- dc.SetPen(*(m_view->GetShadowPen()));
- if (GetRowPosition() >= maxPositions - 1)
- {
- dc.DrawLine(
- tabRight,
- (tabTop + 2),
- tabRight,
- bottom
- );
- dc.DrawLine(
- tabRight,
- bottom,
- (tabRight - m_view->GetHorizontalTabOffset()),
- bottom
- );
- }
- else
- {
- if (tabBelowRight && tabBelowRight->IsSelected())
- {
- dc.DrawLine(
- tabRight,
- (long)raisedTop,
- tabRight,
- tabTop + 1
- );
- }
- else
- {
- dc.DrawLine(
- tabRight,
- top - 1,
- tabRight,
- tabTop + 1
- );
- }
- }
-
- dc.SetPen(*wxBLACK_PEN);
- dc.DrawPoint(
- tabRight,
- tabTop + 1
- );
- dc.DrawPoint(
- tabRight + 1,
- tabTop + 2
- );
- if (GetRowPosition() >= maxPositions - 1)
- {
- // draw right hand edge to bottom of view
- dc.DrawLine(
- tabRight + 1,
- bottom + 1,
- tabRight + 1,
- tabTop + 2
- );
- dc.DrawLine(
- tabRight + 1,
- bottom + 1,
- (tabRight - m_view->GetHorizontalTabOffset()),
- bottom + 1
- );
- }
- else
- {
- // draw right hand edge of TAB
- if (tabBelowRight && tabBelowRight->IsSelected())
- {
- dc.DrawLine(
- tabRight + 1,
- (long)(raisedTop - 1),
- tabRight + 1,
- tabTop + 2
- );
- }
- else
- {
- dc.DrawLine(
- tabRight + 1,
- top - 1,
- tabRight + 1,
- tabTop + 2
- );
- }
- }
- }
-
- // Draw centered text
- dc.SetPen(*wxBLACK_PEN);
- if (m_isSelected)
- {
- dc.SetFont(*(m_view->GetSelectedTabFont()));
- }
- else
- {
- dc.SetFont(*(GetFont()));
- }
-
- wxColour col(m_view->GetTextColour());
- dc.SetTextForeground(col);
- dc.SetBackgroundMode(wxTRANSPARENT);
- long textWidth, textHeight;
- dc.GetTextExtent(GetLabel(), &textWidth, &textHeight);
-
- float textX = (tabLeft + tabRight - textWidth) / 2;
- float textY = (tabInc + tabTop + m_view->GetVerticalTabTextSpacing());
-
- dc.DrawText(GetLabel(), (long)textX, (long)textY);
+ float textX = (tabLeft + tabRight - textWidth) / 2;
+ float textY = (tabInc + tabTop + m_view->GetVerticalTabTextSpacing());
+
+ dc.DrawText(GetLabel(), (long)textX, (long)textY);
#endif
}
// Bottom-right
int tabX2 = tabX1 + GetWidth();
int tabY2 = tabY1 + GetHeight();
-
+
if (x >= tabX1 && y >= tabY1 && x <= tabX2 && y <= tabY2)
return TRUE;
else
m_shadowPen = wxGREY_PEN;
m_backgroundPen = wxLIGHT_GREY_PEN;
m_backgroundBrush = wxLIGHT_GREY_BRUSH;
- m_tabFont = wxTheFontList->FindOrCreateFont(9, wxSWISS, wxNORMAL, wxNORMAL);
- m_tabSelectedFont = wxTheFontList->FindOrCreateFont(9, wxSWISS, wxNORMAL, wxBOLD);
- m_window = NULL;
+ m_tabFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+ m_tabSelectedFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+ m_window = (wxWindow *) NULL;
}
wxTabView::~wxTabView()
{
+ ClearTabs(TRUE);
}
-
+
// 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.
- wxNode *node = m_layers.Last();
+ wxNode *node = m_layers.GetLast();
if (!node)
{
wxTabLayer *newLayer = new wxTabLayer;
}
// Check if adding another tab control would go off the
// right-hand edge of the layer.
- wxTabLayer *tabLayer = (wxTabLayer *)node->Data();
- wxNode *lastTabNode = tabLayer->Last();
+ wxTabLayer *tabLayer = (wxTabLayer *)node->GetData();
+ wxNode *lastTabNode = tabLayer->GetLast();
if (lastTabNode)
{
- wxTabControl *lastTab = (wxTabControl *)lastTabNode->Data();
+ 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.First()->Data()) && ((lastTab->GetX() + 2*lastTab->GetWidth() + GetHorizontalTabSpacing())
+ if (((tabLayer == m_layers.GetFirst()->GetData()) && ((lastTab->GetX() + 2*lastTab->GetWidth() + GetHorizontalTabSpacing())
> GetViewRect().width)) ||
- ((tabLayer != m_layers.First()->Data()) && (tabLayer->Number() == ((wxTabLayer *)m_layers.First()->Data())->Number())))
+ ((tabLayer != m_layers.GetFirst()->GetData()) && (tabLayer->GetCount() == ((wxTabLayer *)m_layers.GetFirst()->GetData())->GetCount())))
{
tabLayer = new wxTabLayer;
m_layers.Append(tabLayer);
- lastTabNode = NULL;
+ lastTabNode = (wxNode *) NULL;
}
}
- int layer = m_layers.Number() - 1;
-
+ int layer = m_layers.GetCount() - 1;
+
wxTabControl *tabControl = existingTab;
if (!existingTab)
tabControl = OnCreateTabControl();
- tabControl->SetRowPosition(tabLayer->Number());
+ tabControl->SetRowPosition(tabLayer->GetCount());
tabControl->SetColPosition(layer);
-
- wxTabControl *lastTab = NULL;
+
+ wxTabControl *lastTab = (wxTabControl *) NULL;
if (lastTabNode)
- lastTab = (wxTabControl *)lastTabNode->Data();
-
+ lastTab = (wxTabControl *)lastTabNode->GetData();
+
// Top of new tab
int verticalOffset = (- GetTopMargin()) - ((layer+1)*GetTabHeight());
// Offset from view top-left
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());
-
+ tabControl->SetFont(* GetTabFont());
+
tabLayer->Append(tabControl);
m_noTabs ++;
-
+
return tabControl;
}
-
+
+// Remove the tab without deleting the window
+bool wxTabView::RemoveTab(int id)
+{
+ wxNode *layerNode = m_layers.GetFirst();
+ while (layerNode)
+ {
+ wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
+ wxNode *tabNode = layer->GetFirst();
+ while (tabNode)
+ {
+ wxTabControl *tab = (wxTabControl *)tabNode->GetData();
+ if (tab->GetId() == id)
+ {
+ if (id == m_tabSelection)
+ m_tabSelection = -1;
+ delete tab;
+ delete tabNode;
+ m_noTabs --;
+
+ // The layout has changed
+ LayoutTabs();
+ return TRUE;
+ }
+ tabNode = tabNode->GetNext();
+ }
+ layerNode = layerNode->GetNext();
+ }
+ return FALSE;
+}
+
+bool wxTabView::SetTabText(int id, const wxString& label)
+{
+ wxTabControl* control = FindTabControlForId(id);
+ if (!control)
+ return FALSE;
+ control->SetLabel(label);
+ return TRUE;
+}
+
+wxString wxTabView::GetTabText(int id) const
+{
+ wxTabControl* control = FindTabControlForId(id);
+ if (!control)
+ return wxEmptyString;
+ else
+ return control->GetLabel();
+}
+
+// Returns the total height of the tabs component -- this may be several
+// times the height of a tab, if there are several tab layers (rows).
+int wxTabView::GetTotalTabHeight()
+{
+ int minY = 0;
+
+ wxNode *layerNode = m_layers.GetFirst();
+ while (layerNode)
+ {
+ wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
+ wxNode *tabNode = layer->GetFirst();
+ while (tabNode)
+ {
+ wxTabControl *tab = (wxTabControl *)tabNode->GetData();
+
+ if (tab->GetY() < minY)
+ minY = tab->GetY();
+
+ tabNode = tabNode->GetNext();
+ }
+ layerNode = layerNode->GetNext();
+ }
+
+ return - minY;
+}
+
void wxTabView::ClearTabs(bool deleteTabs)
{
- wxNode *layerNode = m_layers.First();
+ wxNode *layerNode = m_layers.GetFirst();
while (layerNode)
{
- wxTabLayer *layer = (wxTabLayer *)layerNode->Data();
- wxNode *tabNode = layer->First();
+ wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
+ wxNode *tabNode = layer->GetFirst();
while (tabNode)
{
- wxTabControl *tab = (wxTabControl *)tabNode->Data();
+ wxTabControl *tab = (wxTabControl *)tabNode->GetData();
if (deleteTabs)
delete tab;
- wxNode *next = tabNode->Next();
+ wxNode *next = tabNode->GetNext();
delete tabNode;
tabNode = next;
}
- wxNode *nextLayerNode = layerNode->Next();
+ wxNode *nextLayerNode = layerNode->GetNext();
delete layer;
delete layerNode;
layerNode = nextLayerNode;
}
+ m_noTabs = 0;
+ m_tabSelection = -1;
}
-
+
+
// Layout tabs (optional, e.g. if resizing window)
-void wxTabView::Layout(void)
+void wxTabView::LayoutTabs(void)
{
// Make a list of the tab controls, deleting the wxTabLayers.
wxList controls;
- wxNode *layerNode = m_layers.First();
+ wxNode *layerNode = m_layers.GetFirst();
while (layerNode)
{
- wxTabLayer *layer = (wxTabLayer *)layerNode->Data();
- wxNode *tabNode = layer->First();
+ wxTabLayer *layer = (wxTabLayer *)layerNode->GetData();
+ wxNode *tabNode = layer->GetFirst();
while (tabNode)
{
- wxTabControl *tab = (wxTabControl *)tabNode->Data();
+ wxTabControl *tab = (wxTabControl *)tabNode->GetData();
controls.Append(tab);
- wxNode *next = tabNode->Next();
+ wxNode *next = tabNode->GetNext();
delete tabNode;
tabNode = next;
}
- wxNode *nextLayerNode = layerNode->Next();
+ wxNode *nextLayerNode = layerNode->GetNext();
delete layer;
delete layerNode;
layerNode = nextLayerNode;
}
-
- wxTabControl *lastTab = NULL;
-
+
+ wxTabControl *lastTab = (wxTabControl *) NULL;
+
wxTabLayer *currentLayer = new wxTabLayer;
m_layers.Append(currentLayer);
-
- wxNode *node = controls.First();
+
+ wxNode *node = controls.GetFirst();
while (node)
{
- wxTabControl *tabControl = (wxTabControl *)node->Data();
+ wxTabControl *tabControl = (wxTabControl *)node->GetData();
if (lastTab)
{
// Start another layer (row).
// 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 (((currentLayer == m_layers.First()->Data()) && ((lastTab->GetX() + 2*lastTab->GetWidth() + GetHorizontalTabSpacing())
+ if (((currentLayer == m_layers.GetFirst()->GetData()) && ((lastTab->GetX() + 2*lastTab->GetWidth() + GetHorizontalTabSpacing())
> GetViewRect().width)) ||
- ((currentLayer != m_layers.First()->Data()) && (currentLayer->Number() == ((wxTabLayer *)m_layers.First()->Data())->Number())))
+ ((currentLayer != m_layers.GetFirst()->GetData()) && (currentLayer->GetCount() == ((wxTabLayer *)m_layers.GetFirst()->GetData())->GetCount())))
{
currentLayer = new wxTabLayer;
m_layers.Append(currentLayer);
- lastTab = NULL;
+ lastTab = (wxTabControl *) NULL;
}
}
-
- int layer = m_layers.Number() - 1;
- tabControl->SetRowPosition(currentLayer->Number());
+ int layer = m_layers.GetCount() - 1;
+
+ tabControl->SetRowPosition(currentLayer->GetCount());
tabControl->SetColPosition(layer);
-
+
// Top of new tab
int verticalOffset = (- GetTopMargin()) - ((layer+1)*GetTabHeight());
// Offset from view top-left
horizontalOffset = layer*GetHorizontalTabOffset();
else
horizontalOffset = lastTab->GetX() + GetTabWidth() + GetHorizontalTabSpacing();
-
+
tabControl->SetPosition(horizontalOffset, verticalOffset);
tabControl->SetSize(GetTabWidth(), GetTabHeight());
currentLayer->Append(tabControl);
lastTab = tabControl;
- node = node->Next();
+ node = node->GetNext();
}
// Move the selected tab to the bottom
// Draw all tabs
void wxTabView::Draw(wxDC& dc)
{
- // Draw top margin area (beneath tabs and above view area)
- if (GetTabStyle() & wxTAB_STYLE_COLOUR_INTERIOR)
- {
- dc.SetPen(*wxTRANSPARENT_PEN);
- dc.SetBrush(*GetBackgroundBrush());
-
- // Add 1 because the pen is transparent. Under Motif, may be different.
- dc.DrawRectangle(
- m_tabViewRect.x,
- (m_tabViewRect.y - m_topMargin),
- (m_tabViewRect.width + 1),
- (m_topMargin + 1)
- );
- }
-
- // Draw layers in reverse order
- wxNode *node = m_layers.Last();
- while (node)
- {
- wxTabLayer *layer = (wxTabLayer *)node->Data();
- wxNode *node2 = layer->First();
- while (node2)
- {
- wxTabControl *control = (wxTabControl *)node2->Data();
- control->OnDraw(dc, (node2->Next() == NULL));
- node2 = node2->Next();
- }
-
- node = node->Previous();
- }
-
-
-#if 0
- if (GetTabStyle() & wxTAB_STYLE_DRAW_BOX)
- {
- dc.SetPen(GetShadowPen());
-
- // Draw bottom line
- dc.DrawLine(
- (GetViewRect().x + 1),
- (GetViewRect().y + GetViewRect().height),
- (GetViewRect().x + GetViewRect().width),
- (GetViewRect().y + GetViewRect().height)
- );
-
- // Draw right line
- dc.DrawLine(
- (GetViewRect().x + GetViewRect().width),
- (GetViewRect().y - GetTopMargin() + 1),
- (GetViewRect().x + GetViewRect().width),
- (GetViewRect().y + GetViewRect().height)
- );
-
- dc.SetPen(wxBLACK_PEN);
-
- // Draw bottom line
- dc.DrawLine(
- (GetViewRect().x),
- (GetViewRect().y + GetViewRect().height + 1),
- (GetViewRect().x + GetViewRect().width),
- (GetViewRect().y + GetViewRect().height + 1)
- );
-
- // Draw right line
- dc.DrawLine(
- (GetViewRect().x + GetViewRect().width + 1),
- (GetViewRect().y - GetTopMargin()),
- (GetViewRect().x + GetViewRect().width + 1),
- (GetViewRect().y + GetViewRect().height + 1)
- );
- }
+ // Don't draw anything if there are no tabs.
+ if (GetNumberOfTabs() == 0)
+ return;
+
+ // Draw top margin area (beneath tabs and above view area)
+ if (GetTabStyle() & wxTAB_STYLE_COLOUR_INTERIOR)
+ {
+ dc.SetPen(*wxTRANSPARENT_PEN);
+ dc.SetBrush(*GetBackgroundBrush());
+
+ // Add 1 because the pen is transparent. Under Motif, may be different.
+ dc.DrawRectangle(
+ m_tabViewRect.x,
+ (m_tabViewRect.y - m_topMargin),
+ (m_tabViewRect.width + 1),
+ (m_topMargin + 1)
+ );
+ }
+
+ // Draw layers in reverse order
+ wxNode *node = m_layers.GetLast();
+ while (node)
+ {
+ wxTabLayer *layer = (wxTabLayer *)node->GetData();
+ wxNode *node2 = layer->GetFirst();
+ while (node2)
+ {
+ wxTabControl *control = (wxTabControl *)node2->GetData();
+ control->OnDraw(dc, (node2->GetNext() == NULL));
+ node2 = node2->GetNext();
+ }
+
+ node = node->GetPrevious();
+ }
+
+
+#ifndef wxUSE_NEW_METHOD
+ if (GetTabStyle() & wxTAB_STYLE_DRAW_BOX)
+ {
+ dc.SetPen(* GetShadowPen());
+
+ // Draw bottom line
+ dc.DrawLine(
+ (GetViewRect().x + 1),
+ (GetViewRect().y + GetViewRect().height),
+ (GetViewRect().x + GetViewRect().width + 1),
+ (GetViewRect().y + GetViewRect().height)
+ );
+
+ // Draw right line
+ dc.DrawLine(
+ (GetViewRect().x + GetViewRect().width),
+ (GetViewRect().y - GetTopMargin() + 1),
+ (GetViewRect().x + GetViewRect().width),
+ (GetViewRect().y + GetViewRect().height)
+ );
+
+ dc.SetPen(* wxBLACK_PEN);
+
+ // Draw bottom line
+ dc.DrawLine(
+ (GetViewRect().x),
+ (GetViewRect().y + GetViewRect().height + 1),
+#if defined(__WXMOTIF__)
+ (GetViewRect().x + GetViewRect().width + 1),
+#else
+ (GetViewRect().x + GetViewRect().width + 2),
+#endif
+
+ (GetViewRect().y + GetViewRect().height + 1)
+ );
+
+ // Draw right line
+ dc.DrawLine(
+ (GetViewRect().x + GetViewRect().width + 1),
+ (GetViewRect().y - GetTopMargin()),
+ (GetViewRect().x + GetViewRect().width + 1),
+ (GetViewRect().y + GetViewRect().height + 1)
+ );
+ }
#endif
}
-
+
// Process mouse event, return FALSE if we didn't process it
bool wxTabView::OnEvent(wxMouseEvent& event)
{
if (!event.LeftDown())
return FALSE;
-
- float x, y;
- event.Position(&x, &y);
-
- wxTabControl *hitControl = NULL;
-
- wxNode *node = m_layers.First();
+
+ wxCoord x, y;
+ event.GetPosition(&x, &y);
+
+ wxTabControl *hitControl = (wxTabControl *) NULL;
+
+ wxNode *node = m_layers.GetFirst();
while (node)
{
- wxTabLayer *layer = (wxTabLayer *)node->Data();
- wxNode *node2 = layer->First();
+ wxTabLayer *layer = (wxTabLayer *)node->GetData();
+ wxNode *node2 = layer->GetFirst();
while (node2)
{
- wxTabControl *control = (wxTabControl *)node2->Data();
+ wxTabControl *control = (wxTabControl *)node2->GetData();
if (control->HitTest((int)x, (int)y))
{
hitControl = control;
- node = NULL;
- node2 = NULL;
+ node = (wxNode *) NULL;
+ node2 = (wxNode *) NULL;
}
else
- node2 = node2->Next();
+ node2 = node2->GetNext();
}
-
+
if (node)
- node = node->Next();
+ node = node->GetNext();
}
-
+
if (!hitControl)
return FALSE;
-
+
wxTabControl *currentTab = FindTabControlForId(m_tabSelection);
-
+
if (hitControl == currentTab)
return FALSE;
-
+
ChangeTab(hitControl);
-
+
return TRUE;
}
int oldTab = -1;
if (currentTab)
oldTab = currentTab->GetId();
-
+
if (control == currentTab)
return TRUE;
-
- if (m_layers.Number() == 0)
+
+ if (m_layers.GetCount() == 0)
return FALSE;
-
+
if (!OnTabPreActivate(control->GetId(), oldTab))
return FALSE;
if (currentTab)
currentTab->SetSelected(FALSE);
-
+
control->SetSelected(TRUE);
m_tabSelection = control->GetId();
OnTabActivate(control->GetId(), oldTab);
-
+
// Leave window refresh for the implementing window
return TRUE;
// without calling app activation code
bool wxTabView::MoveSelectionTab(wxTabControl *control)
{
- if (m_layers.Number() == 0)
+ if (m_layers.GetCount() == 0)
return FALSE;
-
- wxTabLayer *firstLayer = (wxTabLayer *)m_layers.First()->Data();
-
+
+ wxTabLayer *firstLayer = (wxTabLayer *)m_layers.GetFirst()->GetData();
+
// Find what column this tab is at, so we can swap with the one at the bottom.
// If we're on the bottom layer, then no need to swap.
if (!firstLayer->Member(control))
wxNode *thisNode = FindTabNodeAndColumn(control, &col);
if (!thisNode)
return FALSE;
- wxNode *otherNode = firstLayer->Nth(col);
+ wxNode *otherNode = firstLayer->Item(col);
if (!otherNode)
return FALSE;
-
+
// If this is already in the bottom layer, return now
if (otherNode == thisNode)
return TRUE;
-
- wxTabControl *otherTab = (wxTabControl *)otherNode->Data();
-
+
+ wxTabControl *otherTab = (wxTabControl *)otherNode->GetData();
+
// We now have pointers to the tab to be changed to,
// and the tab on the first layer. Swap tab structures and
// position details.
-
+
int thisX = control->GetX();
int thisY = control->GetY();
int thisColPos = control->GetColPosition();
int otherX = otherTab->GetX();
int otherY = otherTab->GetY();
int otherColPos = otherTab->GetColPosition();
-
+
control->SetPosition(otherX, otherY);
control->SetColPosition(otherColPos);
otherTab->SetPosition(thisX, thisY);
otherTab->SetColPosition(thisColPos);
-
+
// Swap the data for the nodes
thisNode->SetData(otherTab);
otherNode->SetData(control);
void wxTabView::OnTabActivate(int /*activateId*/, int /*deactivateId*/)
{
}
-
+
void wxTabView::SetHighlightColour(const wxColour& col)
{
m_highlightColour = col;
void wxTabView::SetTabSelection(int sel, bool activateTool)
{
+ if ( sel==m_tabSelection )
+ return;
+
int oldSel = m_tabSelection;
wxTabControl *control = FindTabControlForId(sel);
+ wxTabControl *oldControl = FindTabControlForId(m_tabSelection);
if (!OnTabPreActivate(sel, oldSel))
return;
-
+
if (control)
- control->SetSelected((sel != 0)); // TODO ??
- else
+ control->SetSelected((sel != -1)); // TODO ??
+ else if (sel != -1)
{
- wxMessageBox("Could not find tab for id", "Error", wxOK);
+ wxFAIL_MSG(_("Could not find tab for id"));
return;
}
-
+
+ if (oldControl)
+ oldControl->SetSelected(FALSE);
+
m_tabSelection = sel;
- MoveSelectionTab(control);
-
+
+ if (control)
+ MoveSelectionTab(control);
+
if (activateTool)
OnTabActivate(sel, oldSel);
}
// Find tab control for id
wxTabControl *wxTabView::FindTabControlForId(int id) const
{
- wxNode *node1 = m_layers.First();
+ wxNode *node1 = m_layers.GetFirst();
while (node1)
{
- wxTabLayer *layer = (wxTabLayer *)node1->Data();
- wxNode *node2 = layer->First();
+ wxTabLayer *layer = (wxTabLayer *)node1->GetData();
+ wxNode *node2 = layer->GetFirst();
while (node2)
{
- wxTabControl *control = (wxTabControl *)node2->Data();
+ wxTabControl *control = (wxTabControl *)node2->GetData();
if (control->GetId() == id)
return control;
- node2 = node2->Next();
+ node2 = node2->GetNext();
}
- node1 = node1->Next();
+ node1 = node1->GetNext();
}
- return NULL;
+ return (wxTabControl *) NULL;
}
// Find tab control for layer, position (starting from zero)
wxTabControl *wxTabView::FindTabControlForPosition(int layer, int position) const
{
- wxNode *node1 = m_layers.Nth(layer);
+ wxNode *node1 = m_layers.Item(layer);
if (!node1)
- return NULL;
- wxTabLayer *tabLayer = (wxTabLayer *)node1->Data();
- wxNode *node2 = tabLayer->Nth(position);
+ return (wxTabControl *) NULL;
+ wxTabLayer *tabLayer = (wxTabLayer *)node1->GetData();
+ wxNode *node2 = tabLayer->Item(position);
if (!node2)
- return NULL;
- return (wxTabControl *)node2->Data();
+ return (wxTabControl *) NULL;
+ return (wxTabControl *)node2->GetData();
}
// Find the node and the column at which this control is positioned.
wxNode *wxTabView::FindTabNodeAndColumn(wxTabControl *control, int *col) const
{
- wxNode *node1 = m_layers.First();
+ wxNode *node1 = m_layers.GetFirst();
while (node1)
{
- wxTabLayer *layer = (wxTabLayer *)node1->Data();
+ wxTabLayer *layer = (wxTabLayer *)node1->GetData();
int c = 0;
- wxNode *node2 = layer->First();
+ wxNode *node2 = layer->GetFirst();
while (node2)
{
- wxTabControl *cnt = (wxTabControl *)node2->Data();
+ wxTabControl *cnt = (wxTabControl *)node2->GetData();
if (cnt == control)
{
*col = c;
return node2;
}
- node2 = node2->Next();
+ node2 = node2->GetNext();
c ++;
}
- node1 = node1->Next();
+ node1 = node1->GetNext();
}
- return NULL;
+ return (wxNode *) NULL;
}
int wxTabView::CalculateTabWidth(int noTabs, bool adjustView)
/*
* wxTabbedDialog
*/
-
+
IMPLEMENT_CLASS(wxTabbedDialog, wxDialog)
BEGIN_EVENT_TABLE(wxTabbedDialog, wxDialog)
EVT_PAINT(wxTabbedDialog::OnPaint)
END_EVENT_TABLE()
-wxTabbedDialog::wxTabbedDialog(wxWindow *parent, const wxWindowID id,
+wxTabbedDialog::wxTabbedDialog(wxWindow *parent, wxWindowID id,
const wxString& title,
const wxPoint& pos, const wxSize& size,
- const long windowStyle, const wxString& name):
+ long windowStyle, const wxString& name):
wxDialog(parent, id, title, pos, size, windowStyle, name)
{
- m_tabView = NULL;
+ m_tabView = (wxTabView *) NULL;
}
wxTabbedDialog::~wxTabbedDialog(void)
if (m_tabView)
delete m_tabView;
}
-
+
void wxTabbedDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event) )
{
Destroy();
/*
* wxTabbedPanel
*/
-
+
IMPLEMENT_CLASS(wxTabbedPanel, wxPanel)
BEGIN_EVENT_TABLE(wxTabbedPanel, wxPanel)
EVT_PAINT(wxTabbedPanel::OnPaint)
END_EVENT_TABLE()
-wxTabbedPanel::wxTabbedPanel(wxWindow *parent, const wxWindowID id, const wxPoint& pos,
- const wxSize& size, const long windowStyle, const wxString& name):
+wxTabbedPanel::wxTabbedPanel(wxWindow *parent, wxWindowID id, const wxPoint& pos,
+ const wxSize& size, long windowStyle, const wxString& name):
wxPanel(parent, id, pos, size, windowStyle, name)
{
- m_tabView = NULL;
+ m_tabView = (wxTabView *) NULL;
}
wxTabbedPanel::~wxTabbedPanel(void)
{
delete m_tabView;
}
-
+
void wxTabbedPanel::OnMouseEvent(wxMouseEvent& event)
{
if (m_tabView)
}
/*
- * wxDialogTabView
+ * wxPanelTabView
*/
-
+
IMPLEMENT_CLASS(wxPanelTabView, wxTabView)
-
+
wxPanelTabView::wxPanelTabView(wxPanel *pan, long style): wxTabView(style), m_tabWindows(wxKEY_INTEGER)
{
m_panel = pan;
- m_currentWindow = NULL;
+ m_currentWindow = (wxWindow *) NULL;
if (m_panel->IsKindOf(CLASSINFO(wxTabbedDialog)))
((wxTabbedDialog *)m_panel)->SetTabView(this);
{
if (!m_panel)
return;
-
+
wxWindow *oldWindow = ((deactivateId == -1) ? 0 : GetTabWindow(deactivateId));
wxWindow *newWindow = GetTabWindow(activateId);
oldWindow->Show(FALSE);
if (newWindow)
newWindow->Show(TRUE);
-
+
m_panel->Refresh();
}
-
+
void wxPanelTabView::AddTabWindow(int id, wxWindow *window)
{
m_tabWindows.Append((long)id, window);
{
wxNode *node = m_tabWindows.Find((long)id);
if (!node)
- return NULL;
- return (wxWindow *)node->Data();
+ return (wxWindow *) NULL;
+ return (wxWindow *)node->GetData();
}
void wxPanelTabView::ClearWindows(bool deleteWindows)
newWindow->Refresh();
}
+#endif // wxUSE_TAB_DIALOG