public:
wxTreeTextCtrl(wxGenericTreeCtrl *owner, wxGenericTreeItem *item);
+ // wxGenericTreeCtrl can use this one to abandon editing the given item,
+ // it's not an error to call it if this item is not being edited
+ void StopEditing(wxGenericTreeItem *item)
+ {
+ if ( item == m_itemEdited )
+ DoStopEditing();
+ }
+
protected:
void OnChar( wxKeyEvent &event );
void OnKeyUp( wxKeyEvent &event );
void OnKillFocus( wxFocusEvent &event );
+ void DoStopEditing()
+ {
+ Finish();
+ m_owner->OnRenameCancelled(m_itemEdited);
+ }
+
bool AcceptChanges();
void Finish();
// tree ctrl images for the normal, selected, expanded and
// expanded+selected states
- short m_images[wxTreeItemIcon_Max];
+ int m_images[wxTreeItemIcon_Max];
wxCoord m_x; // (virtual) offset from top
wxCoord m_y; // (virtual) offset from left
- short m_width; // width of this item
- unsigned char m_height; // height of this item
+ int m_width; // width of this item
+ int m_height; // height of this item
// use bitfields to save size
int m_isCollapsed :1;
// FIXME: what are all these hardcoded 4, 8 and 11s really?
x += image_w;
w -= image_w + 4;
+#ifdef __WXMAC__
+ wxSize bs = DoGetBestSize() ;
+ // edit control height
+ if ( h > bs.y - 8 )
+ {
+ int diff = h - ( bs.y - 8 ) ;
+ h -= diff ;
+ y += diff / 2 ;
+ }
+#endif
(void)Create(m_owner, wxID_ANY, m_startValue,
wxPoint(x - 4, y - 4), wxSize(w + 11, h + 8));
Finish();
}
// else do nothing, do not accept and do not close
-
break;
case WXK_ESCAPE:
- Finish();
- m_owner->OnRenameCancelled(m_itemEdited);
+ DoStopEditing();
break;
default:
sx = parentSize.x - myPos.x;
if (mySize.x > sx)
sx = mySize.x;
- SetSize(sx, wxDefaultSize.y);
+ SetSize(sx, wxDefaultCoord);
}
event.Skip();
void wxTreeTextCtrl::OnKillFocus( wxFocusEvent &event )
{
- if ( m_finished )
- {
- event.Skip();
- return;
- }
-
- if ( AcceptChanges() )
+ if ( !m_finished )
{
+ AcceptChanges();
+ // We must finish regardless of success, otherwise we'll get
+ // focus problems:
Finish();
}
+
+ // We must let the native text control handle focus, too, otherwise
+ // it could have problems with the cursor (e.g., in wxGTK):
+ event.Skip();
}
// -----------------------------------------------------------------------------
tree->SendDeleteEvent(child);
child->DeleteChildren(tree);
+ if (child == tree->m_select_me)
+ tree->m_select_me = NULL;
delete child;
}
m_lastOnSame = false;
-#if defined( __WXMAC__ ) && __WXMAC_CARBON__
+#ifdef __WXMAC_CARBON__
m_normalFont.MacCreateThemeFont( kThemeViewsFont ) ;
#else
m_normalFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
// called by wxTextTreeCtrl when it marks itself for deletion
void wxGenericTreeCtrl::ResetTextControl()
{
- m_textCtrl = NULL;
+ m_textCtrl = NULL;
}
// find the first item starting with the given prefix after the given item
wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem;
+ if ( m_textCtrl )
+ {
+ // can't delete the item being edited, cancel editing it first
+ m_textCtrl->StopEditing(item);
+ }
+
wxGenericTreeItem *parent = item->GetParent();
// don't keep stale pointers around!
// and delete all of its children and the item itself now
item->DeleteChildren(this);
SendDeleteEvent(item);
+
+ if (item == m_select_me)
+ m_select_me = NULL;
+
delete item;
}
GetEventHandler()->ProcessEvent( le );
}
-
-
-
void wxGenericTreeCtrl::OnRenameTimer()
{
Edit( m_current );
}
else
{
+ // If we got to this point, we are not dragging or moving the mouse.
+ // Because the code in carbon/toplevel.cpp will only set focus to the tree
+ // if we skip for EVT_LEFT_DOWN, we MUST skip this event here for focus to work.
+ // We skip even if we didn't hit an item because we still should
+ // restore focus to the tree control even if we didn't exactly hit an item.
+ if ( event.LeftDown() )
+ {
+ event.Skip();
+ }
+
// here we process only the messages which happen on tree items
m_dragCount = 0;
}
+wxSize wxGenericTreeCtrl::DoGetBestSize() const
+{
+ // something is better than nothing...
+ // 100x80 is what the MSW version will get from the default
+ // wxControl::DoGetBestSize
+ return wxSize(100,80);
+}
+
+
// NOTE: If using the wxListBox visual attributes works everywhere then this can
// be removed, as well as the #else case below.
#define _USE_VISATTR 0