static wxString ChopText(wxDC& dc, const wxString& text, int max_size)
{
wxCoord x,y;
-
+
// first check if the text fits with no problems
dc.GetTextExtent(text, &x, &y);
if (x <= max_size)
return text;
-
+
size_t i, len = text.Length();
size_t last_good_length = 0;
for (i = 0; i < len; ++i)
{
wxString s = text.Left(i);
s += wxT("...");
-
+
dc.GetTextExtent(s, &x, &y);
if (x > max_size)
break;
-
+
last_good_length = i;
}
class wxAuiCommandCapture : public wxEvtHandler
{
public:
-
+
wxAuiCommandCapture() { m_last_id = 0; }
int GetCommandId() const { return m_last_id; }
m_last_id = evt.GetId();
return true;
}
-
+
if (GetNextHandler())
return GetNextHandler()->ProcessEvent(evt);
return false;
}
-
+
private:
int m_last_id;
};
0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xFE, 0x03, 0xF8, 0x01, 0xF0, 0x19, 0xF3,
0xB8, 0xE3, 0xF0, 0xE1, 0xE0, 0xE0, 0xF0, 0xE1, 0xB8, 0xE3, 0x19, 0xF3,
0x01, 0xF0, 0x03, 0xF8, 0x0F, 0xFE, 0xFF, 0xFF };
-#elif defined( __WXGTK__)
- static unsigned char close_bits[]={
- 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xfb, 0xef, 0xdb, 0xed, 0x8b, 0xe8,
- 0x1b, 0xec, 0x3b, 0xee, 0x1b, 0xec, 0x8b, 0xe8, 0xdb, 0xed, 0xfb, 0xef,
- 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+#elif defined( __WXGTK__)
+ static unsigned char close_bits[]={
+ 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xfb, 0xef, 0xdb, 0xed, 0x8b, 0xe8,
+ 0x1b, 0xec, 0x3b, 0xee, 0x1b, 0xec, 0x8b, 0xe8, 0xdb, 0xed, 0xfb, 0xef,
+ 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
#else
static unsigned char close_bits[]={
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xf3, 0xcf, 0xf9,
m_selected_font = *wxNORMAL_FONT;
m_selected_font.SetWeight(wxBOLD);
m_measuring_font = m_selected_font;
-
+
m_fixed_tab_width = 100;
m_tab_ctrl_height = 0;
m_base_colour = base_colour;
wxColor darker2_colour = StepColour(base_colour, 70);
-
+
m_border_pen = wxPen(darker2_colour);
m_base_colour_pen = wxPen(m_base_colour);
m_base_colour_brush = wxBrush(m_base_colour);
-
+
m_active_close_bmp = BitmapFromBits(close_bits, 16, 16, *wxBLACK);
m_disabled_close_bmp = BitmapFromBits(close_bits, 16, 16, wxColour(128,128,128));
-
+
m_active_left_bmp = BitmapFromBits(left_bits, 16, 16, *wxBLACK);
m_disabled_left_bmp = BitmapFromBits(left_bits, 16, 16, wxColour(128,128,128));
-
+
m_active_right_bmp = BitmapFromBits(right_bits, 16, 16, *wxBLACK);
m_disabled_right_bmp = BitmapFromBits(right_bits, 16, 16, wxColour(128,128,128));
-
+
m_active_windowlist_bmp = BitmapFromBits(list_bits, 16, 16, *wxBLACK);
m_disabled_windowlist_bmp = BitmapFromBits(list_bits, 16, 16, wxColour(128,128,128));
-
+
m_flags = 0;
}
size_t tab_count)
{
m_fixed_tab_width = 100;
-
+
int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4;
if (tab_count > 0)
{
m_fixed_tab_width = tot_width/(int)tab_count;
}
-
-
+
+
if (m_fixed_tab_width < 100)
m_fixed_tab_width = 100;
-
+
if (m_fixed_tab_width > tot_width/2)
m_fixed_tab_width = tot_width/2;
-
+
if (m_fixed_tab_width > 220)
m_fixed_tab_width = 220;
-
+
m_tab_ctrl_height = tab_ctrl_size.y;
}
-
-
+
+
void wxAuiDefaultTabArt::DrawBackground(wxDC& dc,
wxWindow* WXUNUSED(wnd),
const wxRect& rect)
wxColor start_colour = StepColour(m_base_colour, 90);
wxColor end_colour = StepColour(m_base_colour, 110);
dc.GradientFillLinear(r, start_colour, end_colour, wxSOUTH);
-
+
// draw base lines
int y = rect.GetHeight();
int w = rect.GetWidth();
wxCoord normal_textx, normal_texty;
wxCoord selected_textx, selected_texty;
wxCoord textx, texty;
-
+
// if the caption is empty, measure some temporary text
wxString caption = caption_text;
if (caption_text.empty())
caption = wxT("Xj");
-
+
dc.SetFont(m_selected_font);
dc.GetTextExtent(caption, &selected_textx, &selected_texty);
-
+
dc.SetFont(m_normal_font);
dc.GetTextExtent(caption, &normal_textx, &normal_texty);
-
+
// figure out the size of the tab
wxSize tab_size = GetTabSize(dc,
wnd,
texty = normal_texty;
}
-
+
// create points that will make the tab outline
-
+
int clip_width = tab_width;
if (tab_x + clip_width > in_rect.x + in_rect.width)
clip_width = (in_rect.x + in_rect.width) - tab_x;
-
+
wxPoint clip_points[6];
clip_points[0] = wxPoint(tab_x, tab_y+tab_height-3);
clip_points[1] = wxPoint(tab_x, tab_y+2);
clip_points[5] = wxPoint(tab_x+clip_width+1, tab_y+tab_height-3);
// set the clipping region for the tab --
- wxRegion clipping_region(6, clip_points);
+ wxRegion clipping_region(WXSIZEOF(clip_points), clip_points);
dc.SetClippingRegion(clipping_region);
wxPoint border_points[6];
border_points[4] = wxPoint(tab_x+tab_width, tab_y+2);
border_points[5] = wxPoint(tab_x+tab_width, tab_y+tab_height-4);
-
+
int drawn_tab_yoff = border_points[1].y;
int drawn_tab_height = border_points[0].y - border_points[1].y;
if (active)
{
- // draw active tab
-
+ // draw active tab
+
// draw base background color
wxRect r(tab_x, tab_y, tab_width, tab_height);
dc.SetPen(m_base_colour_pen);
dc.SetBrush(m_base_colour_brush);
dc.DrawRectangle(r.x, r.y, r.width, r.height);
-
+
// this white helps fill out the gradient at the top of the tab
dc.SetPen(*wxWHITE_PEN);
dc.SetBrush(*wxWHITE_BRUSH);
dc.DrawRectangle(r.x+2, r.y+2, r.width-3, r.height);
-
+
// these two points help the rounded corners appear more antialiased
dc.SetPen(m_base_colour_pen);
dc.DrawPoint(r.x+2, r.y+2);
dc.DrawPoint(r.x+r.width-2, r.y+2);
-
+
// set rectangle down a bit for gradient drawing
r.SetHeight(r.GetHeight()/2);
r.x += 2;
r.width -= 2;
r.y += r.height;
-
+
// draw gradient background
wxColor start_color = StepColour(m_base_colour, 95);
wxColor end_color = *wxWHITE;
else
{
// draw inactive tab
-
+
wxRect r(tab_x, tab_y+1, tab_width, tab_height-3);
-
+
// draw base background color for inactive tabs
dc.SetPen(m_base_colour_pen);
dc.SetBrush(m_base_colour_brush);
r.x += 2;
r.width -= 2;
r.height /= 2;
-
+
// -- draw bottom gradient fill for glossy look
wxColor top_color = m_base_colour;
wxColor bottom_color = StepColour(top_color, 106);
dc.GradientFillLinear(r, bottom_color, top_color, wxNORTH);
}
-
- // draw tab outline
+
+ // draw tab outline
dc.SetPen(m_border_pen);
dc.SetBrush(*wxTRANSPARENT_BRUSH);
- dc.DrawPolygon(6, border_points);
-
+ dc.DrawPolygon(WXSIZEOF(border_points), border_points);
+
// there are two horizontal grey lines at the bottom of the tab control,
// this gets rid of the top one of those lines in the tab control
if (active)
border_points[5].x+1,
border_points[5].y);
}
-
+
int text_offset = tab_x + 8;
int close_button_width = 0;
{
close_button_width = m_active_close_bmp.GetWidth();
}
-
-
+
+
if (bitmap.IsOk())
{
int bitmap_offset = tab_x + 8;
-
+
// draw bitmap
dc.DrawBitmap(bitmap,
bitmap_offset,
drawn_tab_yoff + (drawn_tab_height/2) - (bitmap.GetHeight()/2) + 1,
true);
-
+
text_offset = bitmap_offset + bitmap.GetWidth();
text_offset += 3; // bitmap padding
}
{
text_offset = tab_x + 8;
}
-
+
wxString draw_text = ChopText(dc,
caption,
tab_width - (text_offset-tab_x) - close_button_width);
-
+
// draw tab text
dc.DrawText(draw_text,
text_offset,
{
bmp = m_active_close_bmp;
}
-
+
wxRect rect(tab_x + tab_width - close_button_width - 1,
tab_y + (tab_height/2) - (bmp.GetHeight()/2),
close_button_width,
tab_height);
IndentPressedBitmap(&rect, close_button_state);
dc.DrawBitmap(bmp, rect.x, rect.y, true);
-
+
*out_button_rect = rect;
}
-
+
*out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height);
-
+
dc.DestroyClippingRegion();
}
int* x_extent)
{
wxCoord measured_textx, measured_texty, tmp;
-
+
dc.SetFont(m_measuring_font);
dc.GetTextExtent(caption, &measured_textx, &measured_texty);
-
+
dc.GetTextExtent(wxT("ABCDEFXj"), &tmp, &measured_texty);
-
+
// add padding around the text
wxCoord tab_width = measured_textx;
wxCoord tab_height = measured_texty;
{
tab_width = m_fixed_tab_width;
}
-
+
*x_extent = tab_width;
-
+
return wxSize(tab_width, tab_height);
}
{
wxBitmap bmp;
wxRect rect;
-
+
if (bitmap_override.IsOk())
{
bmp = bitmap_override;
if (!bmp.IsOk())
return;
-
+
rect = in_rect;
-
+
if (orientation == wxLEFT)
{
rect.SetX(in_rect.x);
((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2),
bmp.GetWidth(), bmp.GetHeight());
}
-
+
IndentPressedBitmap(&rect, button_state);
dc.DrawBitmap(bmp, rect.x, rect.y, true);
-
+
*out_rect = rect;
}
{
menuPopup.AppendCheckItem(1000+i, items.Item(i));
}
-
+
if (active_idx != -1)
{
menuPopup.Check(1000+active_idx, true);
}
-
+
// find out where to put the popup menu of window
// items. Subtract 100 for now to center the menu
// a bit, until a better mechanism can be implemented
pt.x = 0;
else
pt.x -= 100;
-
+
// find out the screen coordinate at the bottom of the tab ctrl
wxRect cli_rect = wnd->GetClientRect();
pt.y = cli_rect.y + cli_rect.height;
-
+
wxAuiCommandCapture* cc = new wxAuiCommandCapture;
wnd->PushEventHandler(cc);
wnd->PopupMenu(&menuPopup, pt);
int command = cc->GetCommandId();
wnd->PopEventHandler(true);
-
+
if (command >= 1000)
return command-1000;
-
+
return -1;
}
{
wxClientDC dc(wnd);
dc.SetFont(m_measuring_font);
-
+
int max_y = 0;
size_t i, page_count = pages.GetCount();
for (i = 0; i < page_count; ++i)
&x_ext);
max_y = wxMax(max_y, s.y);
}
-
+
return max_y+2;
}
m_normal_bkpen = wxPen(normaltab_colour);
m_selected_bkbrush = wxBrush(selectedtab_colour);
m_selected_bkpen = wxPen(selectedtab_colour);
-
+
m_active_close_bmp = BitmapFromBits(close_bits, 16, 16, *wxBLACK);
m_disabled_close_bmp = BitmapFromBits(close_bits, 16, 16, wxColour(128,128,128));
-
+
m_active_left_bmp = BitmapFromBits(left_bits, 16, 16, *wxBLACK);
m_disabled_left_bmp = BitmapFromBits(left_bits, 16, 16, wxColour(128,128,128));
-
+
m_active_right_bmp = BitmapFromBits(right_bits, 16, 16, *wxBLACK);
m_disabled_right_bmp = BitmapFromBits(right_bits, 16, 16, wxColour(128,128,128));
-
+
m_active_windowlist_bmp = BitmapFromBits(list_bits, 16, 16, *wxBLACK);
m_disabled_windowlist_bmp = BitmapFromBits(list_bits, 16, 16, wxColour(128,128,128));
-
+
}
wxAuiSimpleTabArt::~wxAuiSimpleTabArt()
size_t tab_count)
{
m_fixed_tab_width = 100;
-
+
int tot_width = (int)tab_ctrl_size.x - GetIndentSize() - 4;
if (tab_count > 0)
{
m_fixed_tab_width = tot_width/(int)tab_count;
}
-
-
+
+
if (m_fixed_tab_width < 100)
m_fixed_tab_width = 100;
-
+
if (m_fixed_tab_width > tot_width/2)
m_fixed_tab_width = tot_width/2;
-
+
if (m_fixed_tab_width > 220)
m_fixed_tab_width = 220;
}
wxCoord normal_textx, normal_texty;
wxCoord selected_textx, selected_texty;
wxCoord textx, texty;
-
+
// if the caption is empty, measure some temporary text
wxString caption = caption_text;
if (caption_text.empty())
caption = wxT("Xj");
-
+
dc.SetFont(m_selected_font);
dc.GetTextExtent(caption, &selected_textx, &selected_texty);
-
+
dc.SetFont(m_normal_font);
dc.GetTextExtent(caption, &normal_textx, &normal_texty);
-
+
// figure out the size of the tab
wxSize tab_size = GetTabSize(dc,
wnd,
dc.SetClippingRegion(in_rect);
- dc.DrawPolygon(6, points);
+ dc.DrawPolygon(WXSIZEOF(points) - 1, points);
dc.SetPen(*wxGREY_PEN);
- //dc.DrawLines(active ? 6 : 7, points);
- dc.DrawLines(7, points);
+ //dc.DrawLines(active ? WXSIZEOF(points) - 1 : WXSIZEOF(points), points);
+ dc.DrawLines(WXSIZEOF(points), points);
int text_offset;
{
text_offset = tab_x + (tab_height/3) + (tab_width/2) - (textx/2);
}
-
+
// set minimum text offset
if (text_offset < tab_x + tab_height)
text_offset = tab_x + tab_height;
bmp = m_active_close_bmp;
else
bmp = m_disabled_close_bmp;
-
+
wxRect rect(tab_x + tab_width - close_button_width - 1,
tab_y + (tab_height/2) - (bmp.GetHeight()/2) + 1,
close_button_width,
tab_height - 1);
DrawButtons(dc, rect, bmp, *wxWHITE, close_button_state);
-
+
*out_button_rect = rect;
}
*out_tab_rect = wxRect(tab_x, tab_y, tab_width, tab_height);
-
+
dc.DestroyClippingRegion();
}
int* x_extent)
{
wxCoord measured_textx, measured_texty;
-
+
dc.SetFont(m_measuring_font);
dc.GetTextExtent(caption, &measured_textx, &measured_texty);
-
+
wxCoord tab_height = measured_texty + 4;
wxCoord tab_width = measured_textx + tab_height + 5;
if (close_button_state != wxAUI_BUTTON_STATE_HIDDEN)
tab_width += m_active_close_bmp.GetWidth();
-
+
if (m_flags & wxAUI_NB_TAB_FIXED_WIDTH)
{
tab_width = m_fixed_tab_width;
}
-
+
*x_extent = tab_width - (tab_height/2) - 1;
return wxSize(tab_width, tab_height);
{
wxBitmap bmp;
wxRect rect;
-
+
if (bitmap_override.IsOk())
{
bmp = bitmap_override;
if (!bmp.IsOk())
return;
-
+
rect = in_rect;
-
+
if (orientation == wxLEFT)
{
rect.SetX(in_rect.x);
((in_rect.y + in_rect.height)/2) - (bmp.GetHeight()/2),
bmp.GetWidth(), bmp.GetHeight());
}
-
-
+
+
DrawButtons(dc, rect, bmp, *wxWHITE, button_state);
-
+
*out_rect = rect;
}
{
menuPopup.AppendCheckItem(1000+i, items.Item(i));
}
-
+
if (active_idx != -1)
{
menuPopup.Check(1000+active_idx, true);
}
-
+
// find out where to put the popup menu of window
// items. Subtract 100 for now to center the menu
// a bit, until a better mechanism can be implemented
pt.x = 0;
else
pt.x -= 100;
-
+
// find out the screen coordinate at the bottom of the tab ctrl
wxRect cli_rect = wnd->GetClientRect();
pt.y = cli_rect.y + cli_rect.height;
-
+
wxAuiCommandCapture* cc = new wxAuiCommandCapture;
wnd->PushEventHandler(cc);
wnd->PopupMenu(&menuPopup, pt);
int command = cc->GetCommandId();
wnd->PopEventHandler(true);
-
+
if (command >= 1000)
return command-1000;
-
+
return -1;
}
m_tab_offset = 0;
m_flags = 0;
m_art = new wxAuiDefaultTabArt;
-
- AddButton(wxAUI_BUTTON_LEFT, wxLEFT);
+
+ AddButton(wxAUI_BUTTON_LEFT, wxLEFT);
AddButton(wxAUI_BUTTON_RIGHT, wxRIGHT);
AddButton(wxAUI_BUTTON_WINDOWLIST, wxRIGHT);
AddButton(wxAUI_BUTTON_CLOSE, wxRIGHT);
{
delete m_art;
m_art = art;
-
+
if (m_art)
{
m_art->SetFlags(m_flags);
void wxAuiTabContainer::SetFlags(unsigned int flags)
{
m_flags = flags;
-
+
// check for new close button settings
- RemoveButton(wxAUI_BUTTON_LEFT);
+ RemoveButton(wxAUI_BUTTON_LEFT);
RemoveButton(wxAUI_BUTTON_RIGHT);
RemoveButton(wxAUI_BUTTON_WINDOWLIST);
RemoveButton(wxAUI_BUTTON_CLOSE);
-
-
+
+
if (flags & wxAUI_NB_SCROLL_BUTTONS)
{
- AddButton(wxAUI_BUTTON_LEFT, wxLEFT);
+ AddButton(wxAUI_BUTTON_LEFT, wxLEFT);
AddButton(wxAUI_BUTTON_RIGHT, wxRIGHT);
}
{
AddButton(wxAUI_BUTTON_WINDOWLIST, wxRIGHT);
}
-
+
if (flags & wxAUI_NB_CLOSE_BUTTON)
{
AddButton(wxAUI_BUTTON_CLOSE, wxRIGHT);
}
-
+
if (m_art)
{
m_art->SetFlags(m_flags);
void wxAuiTabContainer::SetRect(const wxRect& rect)
{
m_rect = rect;
-
+
if (m_art)
{
m_art->SetSizingInfo(rect.GetSize(), m_pages.GetCount());
{
m_art->SetSizingInfo(m_rect.GetSize(), m_pages.GetCount());
}
-
+
return true;
}
{
m_art->SetSizingInfo(m_rect.GetSize(), m_pages.GetCount());
}
-
+
return true;
}
int idx = GetIdxFromWindow(page);
if (idx == -1)
return false;
-
+
// get page entry, make a copy of it
wxAuiNotebookPage p = GetPage(idx);
-
+
// remove old page entry
RemovePage(page);
-
+
// insert page where it should be
InsertPage(page, p, new_idx);
-
+
return true;
}
if (page.window == wnd)
{
m_pages.RemoveAt(i);
-
+
// let the art provider know how many pages we have
if (m_art)
{
m_art->SetSizingInfo(m_rect.GetSize(), m_pages.GetCount());
}
-
+
return true;
}
}
for (i = 0; i < page_count; ++i)
{
wxAuiNotebookPage& page = m_pages.Item(i);
-
+
// determine if a close button is on this tab
bool close_button = false;
if ((m_flags & wxAUI_NB_CLOSE_ON_ALL_TABS) != 0 ||
{
close_button = true;
}
-
-
+
+
int x_extent = 0;
wxSize size = m_art->GetTabSize(dc,
wnd,
wxAUI_BUTTON_STATE_NORMAL :
wxAUI_BUTTON_STATE_HIDDEN,
&x_extent);
-
+
if (i+1 < page_count)
total_width += x_extent;
else
total_width += size.x;
-
+
if (i >= m_tab_offset)
{
if (i+1 < page_count)
visible_width += size.x;
}
}
-
+
if (total_width > m_rect.GetWidth() || m_tab_offset != 0)
{
// show left/right buttons
// draw buttons
int left_buttons_width = 0;
int right_buttons_width = 0;
-
+
int offset = 0;
// draw the buttons on the right side
for (i = 0; i < button_count; ++i)
{
wxAuiTabContainerButton& button = m_buttons.Item(button_count - i - 1);
-
+
if (button.location != wxRIGHT)
continue;
if (button.cur_state & wxAUI_BUTTON_STATE_HIDDEN)
continue;
-
+
wxRect button_rect = m_rect;
button_rect.SetY(1);
button_rect.SetWidth(offset);
offset = 0;
-
+
// draw the buttons on the left side
for (i = 0; i < button_count; ++i)
{
wxAuiTabContainerButton& button = m_buttons.Item(button_count - i - 1);
-
+
if (button.location != wxLEFT)
continue;
if (button.cur_state & wxAUI_BUTTON_STATE_HIDDEN)
continue;
-
+
wxRect button_rect(offset, 1, 1000, m_rect.height);
m_art->DrawButton(dc,
wxLEFT,
wxNullBitmap,
&button.rect);
-
+
offset += button.rect.GetWidth();
left_buttons_width += button.rect.GetWidth();
}
offset = left_buttons_width;
-
+
if (offset == 0)
- offset += m_art->GetIndentSize();
-
-
+ offset += m_art->GetIndentSize();
+
+
// prepare the tab-close-button array
// make sure tab button entries which aren't used are marked as hidden
for (i = page_count; i < m_tab_close_buttons.GetCount(); ++i)
m_tab_close_buttons.Item(i).cur_state = wxAUI_BUTTON_STATE_HIDDEN;
-
+
// make sure there are enough tab button entries to accommodate all tabs
while (m_tab_close_buttons.GetCount() < page_count)
{
tempbtn.cur_state = wxAUI_BUTTON_STATE_HIDDEN;
m_tab_close_buttons.Add(tempbtn);
}
-
-
+
+
// buttons before the tab offset must be set to hidden
for (i = 0; i < m_tab_offset; ++i)
{
m_tab_close_buttons.Item(i).cur_state = wxAUI_BUTTON_STATE_HIDDEN;
}
-
-
+
+
// draw the tabs
size_t active = 999;
active_offset = offset;
active_rect = rect;
}
-
+
offset += x_extent;
}
&x_extent);
}
-
+
raw_dc->Blit(m_rect.x, m_rect.y,
m_rect.GetWidth(), m_rect.GetHeight(),
&dc, 0, 0);
{
if (!m_rect.Contains(x,y))
return false;
-
+
wxAuiTabContainerButton* btn = NULL;
if (ButtonHitTest(x, y, &btn))
{
return false;
size_t i, button_count;
-
-
+
+
button_count = m_buttons.GetCount();
for (i = 0; i < button_count; ++i)
{
return true;
}
}
-
+
button_count = m_tab_close_buttons.GetCount();
for (i = 0; i < button_count; ++i)
{
return true;
}
}
-
+
return false;
}
if (TabHitTest(evt.m_x, evt.m_y, &wnd))
{
int new_selection = GetIdxFromWindow(wnd);
-
+
if (new_selection != GetActivePage())
{
wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId);
m_click_pt.y = evt.m_y;
m_click_tab = wnd;
}
-
+
if (m_hover_button)
{
m_pressed_button = m_hover_button;
wxAuiTabContainerButton* button = NULL;
if (!ButtonHitTest(evt.m_x, evt.m_y, &button))
return;
-
+
if (button != m_pressed_button)
{
m_pressed_button = NULL;
evt.SetEventObject(this);
GetEventHandler()->ProcessEvent(evt);
}
-
+
m_pressed_button = NULL;
}
Refresh();
Update();
}
-
+
if (button->cur_state != wxAUI_BUTTON_STATE_HOVER)
{
button->cur_state = wxAUI_BUTTON_STATE_HOVER;
void wxAuiTabCtrl::OnButton(wxAuiNotebookEvent& event)
{
int button = event.GetInt();
-
+
if (button == wxAUI_BUTTON_LEFT || button == wxAUI_BUTTON_RIGHT)
{
if (button == wxAUI_BUTTON_LEFT)
else if (button == wxAUI_BUTTON_WINDOWLIST)
{
wxArrayString as;
-
+
size_t i, page_count = m_pages.GetCount();
for (i = 0; i < page_count; ++i)
{
}
int idx = GetArtProvider()->ShowWindowList(this, as, GetActivePage());
-
+
if (idx != -1)
{
wxAuiNotebookEvent e(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGING, m_windowId);
m_dummy_wnd = NULL;
m_tab_ctrl_height = 20;
m_flags = (unsigned int)style;
-
+
m_normal_font = *wxNORMAL_FONT;
m_selected_font = *wxNORMAL_FONT;
m_selected_font.SetWeight(wxBOLD);
void wxAuiNotebook::SetArtProvider(wxAuiTabArt* art)
{
m_tabs.SetArtProvider(art);
-
+
SetTabCtrlHeight(CalculateTabCtrlHeight());
}
if (m_tab_ctrl_height != height)
{
wxAuiTabArt* art = m_tabs.GetArtProvider();
-
+
m_tab_ctrl_height = height;
-
+
wxAuiPaneInfoArray& all_panes = m_mgr.GetAllPanes();
size_t i, pane_count = all_panes.GetCount();
for (i = 0; i < pane_count; ++i)
{
// find out new best tab height
wxAuiTabArt* art = m_tabs.GetArtProvider();
-
+
return art->GetBestTabCtrlSize(this, m_tabs.GetPages());
}
void wxAuiNotebook::SetWindowStyleFlag(long style)
{
wxControl::SetWindowStyleFlag(style);
-
+
m_flags = (unsigned int)style;
-
+
// if the control is already initialized
if (m_mgr.GetManagedWindow() == (wxWindow*)this)
{
// let all of the tab children know about the new style
-
+
wxAuiPaneInfoArray& all_panes = m_mgr.GetAllPanes();
size_t i, pane_count = all_panes.GetCount();
for (i = 0; i < pane_count; ++i)
// DeletePage() removes a tab from the multi-notebook,
// and destroys the window as well
bool wxAuiNotebook::DeletePage(size_t page_idx)
-{
+{
wxWindow* wnd = m_tabs.GetWindowFromIdx(page_idx);
if (!RemovePage(page_idx))
{
wnd->Destroy();
}
-
+
return true;
}
m_curpage = -1;
SetSelection(m_tabs.GetIdxFromWindow(new_active));
}
-
+
return true;
}
{
if (page_idx >= m_tabs.GetPageCount())
return false;
-
+
// update our own tab catalog
wxAuiNotebookPage& page_info = m_tabs.GetPage(page_idx);
page_info.bitmap = bitmap;
-
+
// tab height might have changed
SetTabCtrlHeight(CalculateTabCtrlHeight());
-
+
// update what's on screen
wxAuiTabCtrl* ctrl;
int ctrl_idx;
ctrl->Refresh();
ctrl->Update();
}
-
+
return true;
}
{
int old_curpage = m_curpage;
m_curpage = new_page;
-
+
// program allows the page change
evt.SetEventType(wxEVT_COMMAND_AUINOTEBOOK_PAGE_CHANGED);
(void)GetEventHandler()->ProcessEvent(evt);
wxAuiTabCtrl* src_tabs = (wxAuiTabCtrl*)evt.GetEventObject();
wxAuiTabCtrl* dest_tabs = GetTabCtrlFromPoint(client_pt);
-
+
if (dest_tabs == src_tabs)
{
if (src_tabs)
{
src_tabs->SetCursor(wxCursor(wxCURSOR_ARROW));
}
-
+
// always hide the hint for inner-tabctrl drag
m_mgr.HideHint();
-
+
// if tab moving is not allowed, leave
if (!(m_flags & wxAUI_NB_TAB_MOVE))
{
return;
}
-
+
wxPoint pt = dest_tabs->ScreenToClient(screen_pt);
wxWindow* dest_location_tab;
-
+
// this is an inner-tab drag/reposition
if (dest_tabs->TabHitTest(pt.x, pt.y, &dest_location_tab))
{
int src_idx = evt.GetSelection();
int dest_idx = dest_tabs->GetIdxFromWindow(dest_location_tab);
-
+
// prevent jumpy drag
if ((src_idx == dest_idx) || dest_idx == -1 ||
(src_idx > dest_idx && m_last_drag_x <= pt.x) ||
m_last_drag_x = pt.x;
}
-
+
return;
}
if (m_flags & wxAUI_NB_TAB_EXTERNAL_MOVE)
{
wxWindow* tab_ctrl = ::wxFindWindowAtPoint(screen_pt);
-
+
// if we aren't over any window, stop here
if (!tab_ctrl)
return;
-
+
// make sure we are not over the hint window
if (!tab_ctrl->IsKindOf(CLASSINFO(wxFrame)))
{
break;
tab_ctrl = tab_ctrl->GetParent();
}
-
+
if (tab_ctrl)
{
wxAuiNotebook* nb = (wxAuiNotebook*)tab_ctrl->GetParent();
-
+
if (nb != this)
{
wxRect hint_rect = tab_ctrl->GetClientRect();
// if there are less than two panes, split can't happen, so leave
if (m_tabs.GetPageCount() < 2)
return;
-
+
// if tab moving is not allowed, leave
if (!(m_flags & wxAUI_NB_TAB_SPLIT))
return;
{
src_tabs->SetCursor(wxCursor(wxCURSOR_SIZING));
}
-
-
+
+
if (dest_tabs)
{
wxRect hint_rect = dest_tabs->GetRect();
m_mgr.HideHint();
-
+
wxAuiTabCtrl* src_tabs = (wxAuiTabCtrl*)evt.GetEventObject();
wxAuiTabCtrl* dest_tabs = NULL;
if (src_tabs)
// set cursor back to an arrow
src_tabs->SetCursor(wxCursor(wxCURSOR_ARROW));
}
-
+
// get the mouse position, which will be used to determine the drop point
wxPoint mouse_screen_pt = ::wxGetMousePosition();
wxPoint mouse_client_pt = ScreenToClient(mouse_screen_pt);
if (m_flags & wxAUI_NB_TAB_EXTERNAL_MOVE)
{
wxWindow* tab_ctrl = ::wxFindWindowAtPoint(mouse_screen_pt);
-
+
while (tab_ctrl)
{
if (tab_ctrl->IsKindOf(CLASSINFO(wxAuiTabCtrl)))
break;
tab_ctrl = tab_ctrl->GetParent();
}
-
+
if (tab_ctrl)
{
wxAuiNotebook* nb = (wxAuiNotebook*)tab_ctrl->GetParent();
-
+
if (nb != this)
{
// find out from the destination control
e.SetEventObject(this);
e.SetDragSource(this);
e.Veto(); // dropping must be explicitly approved by control owner
-
+
nb->GetEventHandler()->ProcessEvent(e);
-
+
if (!e.IsAllowed())
{
// no answer or negative answer
m_mgr.HideHint();
return;
}
-
+
// drop was allowed
int src_idx = evt.GetSelection();
wxWindow* src_page = src_tabs->GetWindowFromIdx(src_idx);
-
+
// get main index of the page
int main_idx = m_tabs.GetIdxFromWindow(src_page);
-
+
// make a copy of the page info
wxAuiNotebookPage page_info = m_tabs.GetPage((size_t)main_idx);
-
+
// remove the page from the source notebook
RemovePage(main_idx);
-
+
// reparent the page
src_page->Reparent(nb);
-
-
+
+
// found out the insert idx
wxAuiTabCtrl* dest_tabs = (wxAuiTabCtrl*)tab_ctrl;
wxPoint pt = dest_tabs->ScreenToClient(mouse_screen_pt);
insert_idx = dest_tabs->GetIdxFromWindow(target);
}
-
+
// add the page to the new notebook
if (insert_idx == -1)
insert_idx = dest_tabs->GetPageCount();
nb->DoSizing();
dest_tabs->DoShowHide();
dest_tabs->Refresh();
-
+
// set the selection in the destination tab control
nb->SetSelection(nb->m_tabs.GetIdxFromWindow(page_info.window));
if (dest_tabs == src_tabs)
return;
-
-
+
+
wxPoint pt = dest_tabs->ScreenToClient(mouse_screen_pt);
wxWindow* target = NULL;
dest_tabs->TabHitTest(pt.x, pt.y, &target);
// there is no suitable drop location here, exit out
return;
}
-
-
+
+
// If there is no tabframe at all, create one
wxTabFrame* new_tabs = new wxTabFrame;
new_tabs->SetTabCtrlHeight(m_tab_ctrl_height);