private:
wxGenericTreeCtrl *m_owner;
- DECLARE_NO_COPY_CLASS(wxTreeRenameTimer)
+ wxDECLARE_NO_COPY_CLASS(wxTreeRenameTimer);
};
// control used for in-place edit
bool m_aboutToFinish;
DECLARE_EVENT_TABLE()
- DECLARE_NO_COPY_CLASS(wxTreeTextCtrl)
+ wxDECLARE_NO_COPY_CLASS(wxTreeTextCtrl);
};
// timer used to clear wxGenericTreeCtrl::m_findPrefix if no key was pressed
private:
wxGenericTreeCtrl *m_owner;
- DECLARE_NO_COPY_CLASS(wxTreeFindTimer)
+ wxDECLARE_NO_COPY_CLASS(wxTreeFindTimer);
};
// a tree item
unsigned int m_isBold :1; // render the label in bold font
unsigned int m_ownsAttr :1; // delete attribute when done
- DECLARE_NO_COPY_CLASS(wxGenericTreeItem)
+ wxDECLARE_NO_COPY_CLASS(wxGenericTreeItem);
};
// =============================================================================
m_owner = owner;
m_aboutToFinish = false;
- int w = m_itemEdited->GetWidth(),
- h = m_itemEdited->GetHeight();
-
- int x, y;
- m_owner->CalcScrolledPosition(item->GetX(), item->GetY(), &x, &y);
-
- int image_h = 0,
- image_w = 0;
-
- int image = item->GetCurrentImage();
- if ( image != NO_IMAGE )
- {
- if ( m_owner->m_imageListNormal )
- {
- m_owner->m_imageListNormal->GetSize( image, image_w, image_h );
- image_w += MARGIN_BETWEEN_IMAGE_AND_TEXT;
- }
- else
- {
- wxFAIL_MSG(_T("you must create an image list to use images!"));
- }
- }
+ wxRect rect;
+ m_owner->GetBoundingRect(m_itemEdited, rect, true);
- // 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
+ // corrects position and size for better appearance
+#ifdef __WXMSW__
+ rect.x -= 5;
+ rect.width += 10;
+#elif defined(__WXGTK__)
+ rect.x -= 5;
+ rect.y -= 2;
+ rect.width += 8;
+ rect.height += 4;
+#elif defined(__WXMAC__)
+ int bestHeight = GetBestSize().y - 8;
+ if ( rect.height > bestHeight )
+ {
+ int diff = rect.height - bestHeight;
+ rect.height -= diff;
+ rect.y += diff / 2;
+ }
+#endif // platforms
(void)Create(m_owner, wxID_ANY, m_startValue,
- wxPoint(x - 4, y - 4), wxSize(w + 11, h + 8));
+ rect.GetPosition(), rect.GetSize());
+
+ SetSelection(-1, -1);
}
void wxTreeTextCtrl::EndEdit(bool discardChanges)
int text_h = m_heightText + 2;
- int image_h = 0;
- int image_w = 0;
+ int image_h = 0, image_w = 0;
int image = GetCurrentImage();
- if ( image != NO_IMAGE )
+ if ( image != NO_IMAGE && control->m_imageListNormal )
{
- if ( control->m_imageListNormal )
- {
- control->m_imageListNormal->GetSize( image, image_w, image_h );
- image_w += MARGIN_BETWEEN_IMAGE_AND_TEXT;
- }
+ control->m_imageListNormal->GetSize(image, image_w, image_h);
+ image_w += MARGIN_BETWEEN_IMAGE_AND_TEXT;
}
int state_h = 0, state_w = 0;
int state = GetState();
- if ( state != wxTREE_ITEMSTATE_NONE )
+ if ( state != wxTREE_ITEMSTATE_NONE && control->m_imageListState )
{
- if ( control->m_imageListState )
- {
- control->m_imageListState->GetSize( state, state_w, state_h );
- if ( image != NO_IMAGE )
- state_w += MARGIN_BETWEEN_STATE_AND_IMAGE;
- else
- state_w += MARGIN_BETWEEN_IMAGE_AND_TEXT;
- }
+ control->m_imageListState->GetSize(state, state_w, state_h);
+ if ( image_w != 0 )
+ state_w += MARGIN_BETWEEN_STATE_AND_IMAGE;
+ else
+ state_w += MARGIN_BETWEEN_IMAGE_AND_TEXT;
}
- m_height = (image_h > text_h) ? image_h : text_h;
+ int img_h = wxMax(state_h, image_h);
+ m_height = wxMax(img_h, text_h);
if (m_height < 30)
m_height += 2; // at least 2 pixels
m_findTimer = NULL;
m_dropEffectAboveItem = false;
-
+
m_dndEffect = NoEffect;
m_dndEffectItem = NULL;
}
wxGenericTreeItem *parent = item->GetParent();
+
+ // if the selected item will be deleted, select the parent ...
+ wxGenericTreeItem *to_be_selected = parent;
+ if (parent)
+ {
+ // .. unless there is a next sibling like wxMSW does it
+ int pos = parent->GetChildren().Index( item );
+ if ((int)(parent->GetChildren().GetCount()) > pos+1)
+ to_be_selected = parent->GetChildren().Item( pos+1 );
+ }
// don't keep stale pointers around!
if ( IsDescendantOf(item, m_key_current) )
// a different item, in idle time.
if ( m_select_me && IsDescendantOf(item, m_select_me) )
{
- m_select_me = parent;
+ m_select_me = to_be_selected;
}
if ( IsDescendantOf(item, m_current) )
// m_current = parent;
m_current = NULL;
- m_select_me = parent;
+ m_select_me = to_be_selected;
}
// remove the item from the tree
{
if ( m_imageListNormal )
{
- m_imageListNormal->GetSize( image, image_w, image_h );
+ m_imageListNormal->GetSize(image, image_w, image_h);
image_w += MARGIN_BETWEEN_IMAGE_AND_TEXT;
}
else
{
if ( m_imageListState )
{
- m_imageListState->GetSize( state, state_w, state_h );
- if ( image != NO_IMAGE )
+ m_imageListState->GetSize(state, state_w, state_h);
+ if ( image_w != 0 )
state_w += MARGIN_BETWEEN_STATE_AND_IMAGE;
else
state_w += MARGIN_BETWEEN_IMAGE_AND_TEXT;
// except for custom item backgrounds, works for both kinds of theme.
else if (drawItemBackground)
{
- wxRect rect( item->GetX()-2, item->GetY()+offset,
- item->GetWidth()+2, total_h-offset );
+ wxRect rect( item->GetX() + state_w + image_w - 2,
+ item->GetY() + offset,
+ item->GetWidth() - state_w - image_w + 2,
+ total_h - offset );
if ( hasBgColour )
{
dc.DrawRectangle( rect );
// restore normal font
dc.SetFont( m_normalFont );
-
+
if (item == m_dndEffectItem)
{
dc.SetPen( *wxBLACK_PEN );
m_dndEffect = NoEffect;
m_dndEffectItem = NULL;
}
-
+
wxRect rect( i->GetX()-1, i->GetY()-1, i->GetWidth()+2, GetLineHeight(i)+2 );
CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
RefreshRect( rect );
m_dndEffect = NoEffect;
m_dndEffectItem = NULL;
}
-
+
wxRect rect( i->GetX()-1, i->GetY()-1, i->GetWidth()+2, GetLineHeight(i)+2 );
CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
RefreshRect( rect );
if ( textOnly )
{
- rect.x = i->GetX();
- rect.width = i->GetWidth();
+ int image_h = 0, image_w = 0;
+ int image = ((wxGenericTreeItem*) item.m_pItem)->GetCurrentImage();
+ if ( image != NO_IMAGE && m_imageListNormal )
+ {
+ m_imageListNormal->GetSize( image, image_w, image_h );
+ image_w += MARGIN_BETWEEN_IMAGE_AND_TEXT;
+ }
- if ( m_imageListNormal )
+ int state_h = 0, state_w = 0;
+ int state = ((wxGenericTreeItem*) item.m_pItem)->GetState();
+ if ( state != wxTREE_ITEMSTATE_NONE && m_imageListState )
{
- int image_w, image_h;
- m_imageListNormal->GetSize( 0, image_w, image_h );
- rect.width += image_w + MARGIN_BETWEEN_IMAGE_AND_TEXT;
+ m_imageListState->GetSize( state, state_w, state_h );
+ if ( image_w != 0 )
+ state_w += MARGIN_BETWEEN_STATE_AND_IMAGE;
+ else
+ state_w += MARGIN_BETWEEN_IMAGE_AND_TEXT;
}
+
+ rect.x = i->GetX() + state_w + image_w;
+ rect.width = i->GetWidth() - state_w - image_w;
+
}
else // the entire line
{
#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXGTK20__)
Update();
#else
+ // TODO: remove this call or use wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI)
+ // instead (needs to be tested!)
wxYieldIfNeeded();
#endif
}
SetCursor(m_oldCursor);
-#if defined( __WXMSW__ ) || defined(__WXMAC__)
+#if defined( __WXMSW__ ) || defined(__WXMAC__) || defined(__WXGTK20__)
Update();
#else
+ // TODO: remove this call or use wxEventLoopBase::GetActive()->YieldFor(wxEVT_CATEGORY_UI)
+ // instead (needs to be tested!)
wxYieldIfNeeded();
#endif
}