// headers
// -----------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "treectlg.h"
#endif
#include "wx/settings.h"
#include "wx/dcclient.h"
-#ifdef __WXMAC__
- #include "wx/mac/private.h"
-#endif
+#include "wx/renderer.h"
// -----------------------------------------------------------------------------
// array types
class WXDLLEXPORT wxGenericTreeItem;
-WX_DEFINE_EXPORTED_ARRAY_NO_PTR(wxGenericTreeItem *, wxArrayGenericTreeItems);
+WX_DEFINE_EXPORTED_ARRAY_PTR(wxGenericTreeItem *, wxArrayGenericTreeItems);
// ----------------------------------------------------------------------------
// constants
static const int PIXELS_PER_UNIT = 10;
-// ----------------------------------------------------------------------------
-// Aqua arrows
-// ----------------------------------------------------------------------------
-
-/* XPM */
-static const char *aqua_arrow_right[] = {
-/* columns rows colors chars-per-pixel */
-"13 11 4 1",
-" c None",
-"b c #C0C0C0",
-"c c #707070",
-"d c #A0A0A0",
-/* pixels */
-" b ",
-" ddb ",
-" cccdb ",
-" cccccd ",
-" ccccccdb ",
-" ccccccccd",
-" ccccccdb ",
-" cccccb ",
-" cccdb ",
-" ddb ",
-" b "
-};
-
-/* XPM */
-static const char *aqua_arrow_down[] = {
-/* columns rows colors chars-per-pixel */
-"13 11 4 1",
-" c None",
-"b c #C0C0C0",
-"c c #707070",
-"d c #A0A0A0",
-/* pixels */
-" ",
-" ",
-" bdcccccccdb ",
-" dcccccccd ",
-" bcccccccb ",
-" dcccccd ",
-" bcccccb ",
-" bcccd ",
-" dcd ",
-" bcb ",
-" d "
-};
-
// -----------------------------------------------------------------------------
// private classes
// -----------------------------------------------------------------------------
else
flags |= wxTREE_HITTEST_ONITEMLOWERPART;
- // 5 is the size of the plus sign
int xCross = m_x - theCtrl->GetSpacing();
+#ifdef __WXMAC__
+ // according to the drawing code the triangels are drawn
+ // at -4 , -4 from the position up to +10/+10 max
+ if ((point.x > xCross-4) && (point.x < xCross+10) &&
+ (point.y > y_mid-4) && (point.y < y_mid+10) &&
+ HasPlus() && theCtrl->HasButtons() )
+#else
+ // 5 is the size of the plus sign
if ((point.x > xCross-5) && (point.x < xCross+5) &&
(point.y > y_mid-5) && (point.y < y_mid+5) &&
HasPlus() && theCtrl->HasButtons() )
+#endif
{
flags |= wxTREE_HITTEST_ONITEMBUTTON;
return this;
const wxPoint& pos,
const wxSize& size,
long style,
- const wxValidator &validator,
+ const wxValidator& wxVALIDATOR_PARAM(validator),
const wxString& name )
{
#ifdef __WXMAC__
int major,minor;
wxGetOsVersion( &major, &minor );
- if (style & wxTR_HAS_BUTTONS) style |= wxTR_MAC_BUTTONS;
- if (style & wxTR_HAS_BUTTONS) style &= ~wxTR_HAS_BUTTONS;
style &= ~wxTR_LINES_AT_ROOT;
style |= wxTR_NO_LINES;
if (major < 10)
style |= wxTR_ROW_LINES;
- if (major >= 10)
- style |= wxTR_AQUA_BUTTONS;
-#endif
-
- if (style & wxTR_AQUA_BUTTONS)
- {
- m_arrowRight = new wxBitmap( aqua_arrow_right );
- m_arrowDown = new wxBitmap( aqua_arrow_down );
- }
- else
- {
- m_arrowRight = NULL;
- m_arrowDown = NULL;
- }
+#endif // __WXMAC__
wxScrolledWindow::Create( parent, id, pos, size,
style|wxHSCROLL|wxVSCROLL, name );
delete m_hilightBrush;
delete m_hilightUnfocusedBrush;
- delete m_arrowRight;
- delete m_arrowDown;
-
DeleteAllItems();
delete m_renameTimer;
size_t *pIndex = (size_t *)&cookie;
if ( *pIndex < children.Count() )
{
- return children.Item(*pIndex++);
+ return children.Item((*pIndex)++);
}
else
{
void wxGenericTreeCtrl::SelectItemRange(wxGenericTreeItem *item1, wxGenericTreeItem *item2)
{
- // item2 is not necessary after item1
- wxGenericTreeItem *first=NULL, *last=NULL;
m_select_me = NULL;
+ // item2 is not necessary after item1
// choice first' and 'last' between item1 and item2
- if (item1->GetY()<item2->GetY())
- {
- first=item1;
- last=item2;
- }
- else
- {
- first=item2;
- last=item1;
- }
+ wxGenericTreeItem *first= (item1->GetY()<item2->GetY()) ? item1 : item2;
+ wxGenericTreeItem *last = (item1->GetY()<item2->GetY()) ? item2 : item1;
bool select = m_current->IsSelected();
dc.SetPen(m_dottedPen);
dc.SetTextForeground(*wxBLACK);
- if (item->HasPlus() && HasButtons()) // should the item show a button?
+ if ( !HasFlag(wxTR_NO_LINES) )
{
- if (!HasFlag(wxTR_NO_LINES))
- {
- if (x > (signed)m_indent)
- dc.DrawLine(x - m_indent, y_mid, x - 5, y_mid);
- else if (HasFlag(wxTR_LINES_AT_ROOT))
- dc.DrawLine(3, y_mid, x - 5, y_mid);
- dc.DrawLine(x + 5, y_mid, x + m_spacing, y_mid);
- }
+ // draw the horizontal line here
+ int x_start = x;
+ if (x > (signed)m_indent)
+ x_start -= m_indent;
+ else if (HasFlag(wxTR_LINES_AT_ROOT))
+ x_start = 3;
+ dc.DrawLine(x_start, y_mid, x + m_spacing, y_mid);
+ }
- if (m_imageListButtons != NULL)
+ // should the item show a button?
+ if ( item->HasPlus() && HasButtons() )
+ {
+ if ( m_imageListButtons )
{
// draw the image button here
- int image_h = 0, image_w = 0, image = wxTreeItemIcon_Normal;
- if (item->IsExpanded()) image = wxTreeItemIcon_Expanded;
- if (item->IsSelected())
+ int image_h = 0,
+ image_w = 0;
+ int image = item->IsExpanded() ? wxTreeItemIcon_Expanded
+ : wxTreeItemIcon_Normal;
+ if ( item->IsSelected() )
image += wxTreeItemIcon_Selected - wxTreeItemIcon_Normal;
+
m_imageListButtons->GetSize(image, image_w, image_h);
- int xx = x - (image_w>>1);
- int yy = y_mid - (image_h>>1);
- dc.SetClippingRegion(xx, yy, image_w, image_h);
+ int xx = x - image_w/2;
+ int yy = y_mid - image_h/2;
+
+ wxDCClipper clip(dc, xx, yy, image_w, image_h);
m_imageListButtons->Draw(image, dc, xx, yy,
wxIMAGELIST_DRAW_TRANSPARENT);
- dc.DestroyClippingRegion();
- }
- else if (HasFlag(wxTR_TWIST_BUTTONS))
- {
- // draw the twisty button here
-
- if (HasFlag(wxTR_AQUA_BUTTONS))
- {
- // This causes update problems, so disabling for now.
-#if 0 // def __WXMAC__
- wxMacPortSetter helper(&dc) ;
- wxMacWindowClipper clipper(this) ;
- wxDC::MacSetupBackgroundForCurrentPort( MacGetBackgroundBrush() ) ;
-
- int loc_x = x - 5 ;
- int loc_y = y_mid - 6 ;
- MacWindowToRootWindow( & loc_x , & loc_y ) ;
- Rect bounds = { loc_y , loc_x , loc_y + 18 , loc_x + 12 } ;
- ThemeButtonDrawInfo info = { kThemeStateActive , item->IsExpanded() ? kThemeDisclosureDown : kThemeDisclosureRight ,
- kThemeAdornmentNone };
- DrawThemeButton( &bounds, kThemeDisclosureButton ,
- &info , NULL , NULL , NULL , NULL ) ;
-#else
- if (item->IsExpanded())
- dc.DrawBitmap( *m_arrowDown, x-5, y_mid-6, TRUE );
- else
- dc.DrawBitmap( *m_arrowRight, x-5, y_mid-6, TRUE );
-#endif
- }
- else
- {
- dc.SetBrush(*m_hilightBrush);
- dc.SetPen(*wxBLACK_PEN);
- wxPoint button[3];
-
- if (item->IsExpanded())
- {
- button[0].x = x-5;
- button[0].y = y_mid-2;
- button[1].x = x+5;
- button[1].y = y_mid-2;
- button[2].x = x;
- button[2].y = y_mid+3;
- }
- else
- {
- button[0].y = y_mid-5;
- button[0].x = x-2;
- button[1].y = y_mid+5;
- button[1].x = x-2;
- button[2].y = y_mid;
- button[2].x = x+3;
- }
- dc.DrawPolygon(3, button);
- dc.SetPen(m_dottedPen);
- }
}
- else // if (HasFlag(wxTR_HAS_BUTTONS))
+ else // no custom buttons
{
- // draw the plus sign here
- dc.SetPen(*wxGREY_PEN);
- dc.SetBrush(*wxWHITE_BRUSH);
- dc.DrawRectangle(x-5, y_mid-4, 11, 9);
- dc.SetPen(*wxBLACK_PEN);
- dc.DrawLine(x-2, y_mid, x+3, y_mid);
- if (!item->IsExpanded())
- dc.DrawLine(x, y_mid-2, x, y_mid+3);
- dc.SetPen(m_dottedPen);
+ static const int wImage = 9;
+ static const int hImage = 9;
+
+ wxRendererNative::Get().DrawTreeItemButton
+ (
+ this,
+ dc,
+ wxRect(x - wImage/2,
+ y_mid - hImage/2,
+ wImage, hImage),
+ item->IsExpanded()
+ ? wxCONTROL_EXPANDED
+ : 0
+ );
}
}
- else if (!HasFlag(wxTR_NO_LINES)) // no button; maybe a line?
- {
- // draw the horizontal line here
- int x_start = x;
- if (x > (signed)m_indent)
- x_start -= m_indent;
- else if (HasFlag(wxTR_LINES_AT_ROOT))
- x_start = 3;
- dc.DrawLine(x_start, y_mid, x + m_spacing, y_mid);
- }
}
if (item->IsExpanded())
if (!next)
{
wxTreeItemId current = m_key_current;
- while (current && !next)
+ while (current.IsOk() && !next)
{
current = GetItemParent( current );
if (current) next = GetNextSibling( current );
{
if ( !m_anchor ) return;
+#if wxUSE_TOOLTIPS
+ // Determines what item we are hovering over and need a tooltip for
+ wxTreeItemId hoverItem = HitTest(ScreenToClient(wxGetMousePosition()));
+
+ // We do not want a tooltip if we are dragging, or if the rename timer is running
+ if (hoverItem.IsOk() && !m_isDragging && (!m_renameTimer || !m_renameTimer->IsRunning()))
+ {
+ // Ask the tree control what tooltip (if any) should be shown
+ wxTreeEvent hevent(wxEVT_COMMAND_TREE_ITEM_GETTOOLTIP, GetId());
+ hevent.m_item = hoverItem;
+ hevent.SetEventObject(this);
+
+ if ( GetEventHandler()->ProcessEvent(hevent) && hevent.IsAllowed() )
+ {
+ SetToolTip(hevent.m_label);
+ }
+ }
+#endif
+
// we process left mouse up event (enables in-place edit), right down
// (pass to the user code), left dbl click (activate item) and
// dragging/moving events for items drag-and-drop