tabg.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,295 行 · 第 1/3 页
CPP
1,295 行
(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;
wxCoord x, y;
event.GetPosition(&x, &y);
wxTabControl *hitControl = (wxTabControl *) NULL;
wxTabLayerList::compatibility_iterator node = m_layers.GetFirst();
while (node)
{
wxTabLayer *layer = (wxTabLayer *)node->GetData();
wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2)
{
wxTabControl *control = (wxTabControl *)node2->GetData();
if (control->HitTest((int)x, (int)y))
{
hitControl = control;
node = wxTabLayerList::compatibility_iterator();
node2 = wxList::compatibility_iterator();
}
else
node2 = node2->GetNext();
}
if (node)
node = node->GetNext();
}
if (!hitControl)
return false;
wxTabControl *currentTab = FindTabControlForId(m_tabSelection);
if (hitControl == currentTab)
return false;
ChangeTab(hitControl);
return true;
}
bool wxTabView::ChangeTab(wxTabControl *control)
{
wxTabControl *currentTab = FindTabControlForId(m_tabSelection);
int oldTab = -1;
if (currentTab)
oldTab = currentTab->GetId();
if (control == currentTab)
return true;
if (m_layers.GetCount() == 0)
return false;
if (!OnTabPreActivate(control->GetId(), oldTab))
return false;
// Move the tab to the bottom
MoveSelectionTab(control);
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;
}
// Move the selected tab to the bottom layer, if necessary,
// without calling app activation code
bool wxTabView::MoveSelectionTab(wxTabControl *control)
{
if (m_layers.GetCount() == 0)
return false;
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))
{
// Do a swap
int col = 0;
wxList::compatibility_iterator thisNode = FindTabNodeAndColumn(control, &col);
if (!thisNode)
return false;
wxList::compatibility_iterator 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->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);
}
return true;
}
// Called when a tab is activated
void wxTabView::OnTabActivate(int /*activateId*/, int /*deactivateId*/)
{
}
void wxTabView::SetHighlightColour(const wxColour& col)
{
m_highlightColour = col;
m_highlightPen = wxThePenList->FindOrCreatePen(col, 1, wxSOLID);
}
void wxTabView::SetShadowColour(const wxColour& col)
{
m_shadowColour = col;
m_shadowPen = wxThePenList->FindOrCreatePen(col, 1, wxSOLID);
}
void wxTabView::SetBackgroundColour(const wxColour& col)
{
m_backgroundColour = col;
m_backgroundPen = wxThePenList->FindOrCreatePen(col, 1, wxSOLID);
m_backgroundBrush = wxTheBrushList->FindOrCreateBrush(col, wxSOLID);
}
// this may be called with sel = zero (which doesn't match any page)
// when wxMotif deletes a page
// so return the first tab...
void wxTabView::SetTabSelection(int sel, bool activateTool)
{
if ( sel==m_tabSelection )
return;
int oldSel = m_tabSelection;
wxTabControl *control = FindTabControlForId(sel);
if (sel == 0) sel=control->GetId();
wxTabControl *oldControl = FindTabControlForId(m_tabSelection);
if (!OnTabPreActivate(sel, oldSel))
return;
if (control)
control->SetSelected((sel != -1)); // TODO ??
else if (sel != -1)
{
wxFAIL_MSG(_("Could not find tab for id"));
return;
}
if (oldControl)
oldControl->SetSelected(false);
m_tabSelection = sel;
if (control)
MoveSelectionTab(control);
if (activateTool)
OnTabActivate(sel, oldSel);
}
// Find tab control for id
// this may be called with zero (which doesn't match any page)
// so return the first control...
wxTabControl *wxTabView::FindTabControlForId(int id) const
{
wxTabLayerList::compatibility_iterator node1 = m_layers.GetFirst();
while (node1)
{
wxTabLayer *layer = (wxTabLayer *)node1->GetData();
wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2)
{
wxTabControl *control = (wxTabControl *)node2->GetData();
if (control->GetId() == id || id == 0)
return control;
node2 = node2->GetNext();
}
node1 = node1->GetNext();
}
return (wxTabControl *) NULL;
}
// Find tab control for layer, position (starting from zero)
wxTabControl *wxTabView::FindTabControlForPosition(int layer, int position) const
{
wxTabLayerList::compatibility_iterator node1 = m_layers.Item(layer);
if (!node1)
return (wxTabControl *) NULL;
wxTabLayer *tabLayer = (wxTabLayer *)node1->GetData();
wxList::compatibility_iterator node2 = tabLayer->Item(position);
if (!node2)
return (wxTabControl *) NULL;
return (wxTabControl *)node2->GetData();
}
// Find the node and the column at which this control is positioned.
wxList::compatibility_iterator wxTabView::FindTabNodeAndColumn(wxTabControl *control, int *col) const
{
wxTabLayerList::compatibility_iterator node1 = m_layers.GetFirst();
while (node1)
{
wxTabLayer *layer = (wxTabLayer *)node1->GetData();
int c = 0;
wxList::compatibility_iterator node2 = layer->GetFirst();
while (node2)
{
wxTabControl *cnt = (wxTabControl *)node2->GetData();
if (cnt == control)
{
*col = c;
return node2;
}
node2 = node2->GetNext();
c ++;
}
node1 = node1->GetNext();
}
return wxList::compatibility_iterator();
}
int wxTabView::CalculateTabWidth(int noTabs, bool adjustView)
{
m_tabWidth = (int)((m_tabViewRect.width - ((noTabs - 1)*GetHorizontalTabSpacing()))/noTabs);
if (adjustView)
{
m_tabViewRect.width = noTabs*m_tabWidth + ((noTabs-1)*GetHorizontalTabSpacing());
}
return m_tabWidth;
}
/*
* wxTabbedDialog
*/
IMPLEMENT_CLASS(wxTabbedDialog, wxDialog)
BEGIN_EVENT_TABLE(wxTabbedDialog, wxDialog)
EVT_CLOSE(wxTabbedDialog::OnCloseWindow)
EVT_MOUSE_EVENTS(wxTabbedDialog::OnMouseEvent)
EVT_PAINT(wxTabbedDialog::OnPaint)
END_EVENT_TABLE()
wxTabbedDialog::wxTabbedDialog(wxWindow *parent, wxWindowID id,
const wxString& title,
const wxPoint& pos, const wxSize& size,
long windowStyle, const wxString& name):
wxDialog(parent, id, title, pos, size, windowStyle, name)
{
m_tabView = (wxTabView *) NULL;
}
wxTabbedDialog::~wxTabbedDialog(void)
{
if (m_tabView)
delete m_tabView;
}
void wxTabbedDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event) )
{
Destroy();
}
void wxTabbedDialog::OnMouseEvent(wxMouseEvent& event )
{
if (m_tabView)
m_tabView->OnEvent(event);
}
void wxTabbedDialog::OnPaint(wxPaintEvent& WXUNUSED(event) )
{
wxPaintDC dc(this);
if (m_tabView)
m_tabView->Draw(dc);
}
/*
* wxTabbedPanel
*/
IMPLEMENT_CLASS(wxTabbedPanel, wxPanel)
BEGIN_EVENT_TABLE(wxTabbedPanel, wxPanel)
EVT_MOUSE_EVENTS(wxTabbedPanel::OnMouseEvent)
EVT_PAINT(wxTabbedPanel::OnPaint)
END_EVENT_TABLE()
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 = (wxTabView *) NULL;
}
wxTabbedPanel::~wxTabbedPanel(void)
{
delete m_tabView;
}
void wxTabbedPanel::OnMouseEvent(wxMouseEvent& event)
{
if (m_tabView)
m_tabView->OnEvent(event);
}
void wxTabbedPanel::OnPaint(wxPaintEvent& WXUNUSED(event) )
{
wxPaintDC dc(this);
if (m_tabView)
m_tabView->Draw(dc);
}
/*
* wxPanelTabView
*/
IMPLEMENT_CLASS(wxPanelTabView, wxTabView)
wxPanelTabView::wxPanelTabView(wxPanel *pan, long style)
: wxTabView(style)
{
m_panel = pan;
m_currentWindow = (wxWindow *) NULL;
if (m_panel->IsKindOf(CLASSINFO(wxTabbedDialog)))
((wxTabbedDialog *)m_panel)->SetTabView(this);
else if (m_panel->IsKindOf(CLASSINFO(wxTabbedPanel)))
((wxTabbedPanel *)m_panel)->SetTabView(this);
SetWindow(m_panel);
}
wxPanelTabView::~wxPanelTabView(void)
{
ClearWindows(true);
}
// Called when a tab is activated
void wxPanelTabView::OnTabActivate(int activateId, int deactivateId)
{
if (!m_panel)
return;
wxWindow *oldWindow = ((deactivateId == -1) ? 0 : GetTabWindow(deactivateId));
wxWindow *newWindow = GetTabWindow(activateId);
if (oldWindow)
oldWindow->Show(false);
if (newWindow)
newWindow->Show(true);
m_panel->Refresh();
}
void wxPanelTabView::AddTabWindow(int id, wxWindow *window)
{
wxASSERT(m_tabWindows.find(id) == m_tabWindows.end());
m_tabWindows[id] = window;
window->Show(false);
}
wxWindow *wxPanelTabView::GetTabWindow(int id) const
{
wxIntToWindowHashMap::const_iterator it = m_tabWindows.find(id);
return it == m_tabWindows.end() ? NULL : it->second;
}
void wxPanelTabView::ClearWindows(bool deleteWindows)
{
if (deleteWindows)
WX_CLEAR_HASH_MAP(wxIntToWindowHashMap, m_tabWindows);
m_tabWindows.clear();
}
void wxPanelTabView::ShowWindowForTab(int id)
{
wxWindow *newWindow = GetTabWindow(id);
if (newWindow == m_currentWindow)
return;
if (m_currentWindow)
m_currentWindow->Show(false);
newWindow->Show(true);
newWindow->Refresh();
}
#endif // wxUSE_TAB_DIALOG
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?