class WXDLLEXPORT wxGenericTreeItem;
-WX_DEFINE_ARRAY(wxGenericTreeItem *, wxArrayGenericTreeItems);
+WX_DEFINE_EXPORTED_ARRAY(wxGenericTreeItem *, wxArrayGenericTreeItems);
//WX_DEFINE_OBJARRAY(wxArrayTreeItemIds);
// ----------------------------------------------------------------------------
const wxString &name = wxTextCtrlNameStr );
void OnChar( wxKeyEvent &event );
+ void OnKeyUp( wxKeyEvent &event );
void OnKillFocus( wxFocusEvent &event );
private:
// status inquiries
bool HasChildren() const { return !m_children.IsEmpty(); }
- bool IsSelected() const { return m_hasHilight; }
+ bool IsSelected() const { return m_hasHilight != 0; }
bool IsExpanded() const { return !m_isCollapsed; }
bool HasPlus() const { return m_hasPlus || HasChildren(); }
- bool IsBold() const { return m_isBold; }
+ bool IsBold() const { return m_isBold != 0; }
// attributes
// get them - may be NULL
BEGIN_EVENT_TABLE(wxTreeTextCtrl,wxTextCtrl)
EVT_CHAR (wxTreeTextCtrl::OnChar)
+ EVT_KEY_UP (wxTreeTextCtrl::OnKeyUp)
EVT_KILL_FOCUS (wxTreeTextCtrl::OnKillFocus)
END_EVENT_TABLE()
event.Skip();
}
+void wxTreeTextCtrl::OnKeyUp( wxKeyEvent &event )
+{
+ // auto-grow the textctrl:
+ wxSize parentSize = m_owner->GetSize();
+ wxPoint myPos = GetPosition();
+ wxSize mySize = GetSize();
+ int sx, sy;
+ GetTextExtent(GetValue() + _T("MM"), &sx, &sy);
+ if (myPos.x + sx > parentSize.x) sx = parentSize.x - myPos.x;
+ if (mySize.x > sx) sx = mySize.x;
+ SetSize(sx, -1);
+
+ event.Skip();
+}
+
void wxTreeTextCtrl::OnKillFocus( wxFocusEvent &WXUNUSED(event) )
{
if (!wxPendingDelete.Member(this))
m_imageListNormal =
m_imageListState = (wxImageList *) NULL;
+ m_ownsImageListNormal =
+ m_ownsImageListState = FALSE;
m_dragCount = 0;
m_isDragging = FALSE;
const wxValidator &validator,
const wxString& name )
{
- Init();
-
wxScrolledWindow::Create( parent, id, pos, size, style|wxHSCROLL|wxVSCROLL, name );
#if wxUSE_VALIDATORS
DeleteAllItems();
delete m_renameTimer;
+ if (m_ownsImageListNormal) delete m_imageListNormal;
+ if (m_ownsImageListState) delete m_imageListState;
}
// -----------------------------------------------------------------------------
// We have to call this here because the label in
// question might just have been added and no screen
// update taken place.
- if (m_dirty) wxYield();
+ if (m_dirty) wxYieldIfNeeded();
wxGenericTreeItem *gitem = (wxGenericTreeItem*) item.m_pItem;
void wxGenericTreeCtrl::SetImageList(wxImageList *imageList)
{
+ if (m_ownsImageListNormal) delete m_imageListNormal;
+
m_imageListNormal = imageList;
+ m_ownsImageListNormal = FALSE;
if ( !m_imageListNormal )
return;
void wxGenericTreeCtrl::SetStateImageList(wxImageList *imageList)
{
+ if (m_ownsImageListState) delete m_imageListState;
m_imageListState = imageList;
+ m_ownsImageListState = FALSE;
+}
+
+void wxGenericTreeCtrl::AssignImageList(wxImageList *imageList)
+{
+ SetImageList(imageList);
+ m_ownsImageListNormal = TRUE;
+}
+
+void wxGenericTreeCtrl::AssignStateImageList(wxImageList *imageList)
+{
+ SetStateImageList(imageList);
+ m_ownsImageListState = TRUE;
}
// -----------------------------------------------------------------------------
dc.SetBrush(wxBrush(colBg, wxSOLID));
}
- dc.DrawRectangle( item->GetX()-2, item->GetY(), item->GetWidth()+2, total_h );
+ if (item->IsSelected() && image != NO_IMAGE)
+ {
+ // If it's selected, and there's an image, then we should
+ // take care to leave the area under the image painted in the
+ // background colour.
+ dc.DrawRectangle( item->GetX() + image_w - 2, item->GetY(), item->GetWidth() - image_w + 2, total_h );
+ }
+ else
+ dc.DrawRectangle( item->GetX()-2, item->GetY(), item->GetWidth()+2, total_h );
if ( image != NO_IMAGE )
{
if ( attr && attr->HasTextColour() )
colText = attr->GetTextColour();
else
- colText = *wxBLACK;
+ colText = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_WINDOWTEXT );
}
// prepare to draw
// We have to call this here because the label in
// question might just have been added and no screen
// update taken place.
- if (m_dirty) wxYield();
+ if (m_dirty) wxYieldIfNeeded();
wxClientDC dc(this);
PrepareDC(dc);
if (point.y<0) flags|=wxTREE_HITTEST_ABOVE;
if (point.y>h) flags|=wxTREE_HITTEST_BELOW;
- return m_anchor->HitTest( wxPoint(x, y), this, flags);
+ if (m_anchor)
+ return m_anchor->HitTest( wxPoint(x, y), this, flags);
+ else
+ return wxTreeItemId();
}
// get the bounding rectangle of the item (or of its label only)
// We have to call this here because the label in
// question might just have been added and no screen
// update taken place.
- if (m_dirty) wxYield();
+ if (m_dirty) wxYieldIfNeeded();
wxString s = m_currentEdit->GetText();
int x = m_currentEdit->GetX();
x = dc.LogicalToDeviceX( x );
y = dc.LogicalToDeviceY( y );
- wxTreeTextCtrl *text = new wxTreeTextCtrl(
- this, -1, &m_renameAccept, &m_renameRes, this, s, wxPoint(x-4,y-4), wxSize(w+11,h+8) );
+ wxTreeTextCtrl *text = new wxTreeTextCtrl(this, -1,
+ &m_renameAccept,
+ &m_renameRes,
+ this,
+ s,
+ wxPoint(x-4,y-4),
+ wxSize(w+11,h+8));
text->SetFocus();
}
// highlight the current drop target if any
DrawDropEffect(m_dropTarget);
- wxYield();
+ wxYieldIfNeeded();
}
}
else if ( (event.LeftUp() || event.RightUp()) && m_isDragging )
SetCursor(m_oldCursor);
- wxYield();
+ wxYieldIfNeeded();
}
else
{
wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_RIGHT_CLICK, GetId());
nevent.m_item = (long) item;
nevent.m_code = 0;
+ CalcScrolledPosition(x, y,
+ &nevent.m_pointDrag.x,
+ &nevent.m_pointDrag.y);
nevent.SetEventObject(this);
GetEventHandler()->ProcessEvent(nevent);
}
- else if ( event.LeftUp() && m_lastOnSame )
+ else if ( event.LeftUp() )
{
- if ( (item == m_current) &&
- (flags & wxTREE_HITTEST_ONITEMLABEL) &&
- HasFlag(wxTR_EDIT_LABELS) )
+ if ( m_lastOnSame )
{
- m_renameTimer->Start( 100, TRUE );
- }
+ if ( (item == m_current) &&
+ (flags & wxTREE_HITTEST_ONITEMLABEL) &&
+ HasFlag(wxTR_EDIT_LABELS) )
+ {
+ if ( m_renameTimer->IsRunning() )
+ m_renameTimer->Stop();
+
+ m_renameTimer->Start( 100, TRUE );
+ }
- m_lastOnSame = FALSE;
+ m_lastOnSame = FALSE;
+ }
}
- else
+ else // !RightDown() && !LeftUp() ==> LeftDown() || LeftDClick()
{
if ( event.LeftDown() )
{
m_lastOnSame = item == m_current;
}
+ if ( flags & wxTREE_HITTEST_ONITEMBUTTON )
+ {
+ // only toggle the item for a single click, double click on
+ // the button doesn't do anything (it toggles the item twice)
+ if ( event.LeftDown() )
+ {
+ Toggle( item );
+ }
+
+ // don't select the item if the button was clicked
+ return;
+ }
+
// how should the selection work for this event?
bool is_multiple, extended_select, unselect_others;
EventFlagsToSelType(GetWindowStyleFlag(),
event.ControlDown(),
is_multiple, extended_select, unselect_others);
- if ( (flags & wxTREE_HITTEST_ONITEMBUTTON) && event.LeftDown() )
- {
- Toggle( item );
- if ( is_multiple )
- return;
- }
-
SelectItem(item, unselect_others, extended_select);
if ( event.LeftDClick() )
wxTreeEvent nevent( wxEVT_COMMAND_TREE_ITEM_ACTIVATED, GetId() );
nevent.m_item = (long) item;
nevent.m_code = 0;
+ CalcScrolledPosition(x, y,
+ &nevent.m_pointDrag.x,
+ &nevent.m_pointDrag.y);
nevent.SetEventObject( this );
GetEventHandler()->ProcessEvent( nevent );
}