📄 treelistctrl.cpp
字号:
}
int GetImage(wxTreeItemIcon which = wxTreeItemIcon_Normal) const
{ return m_images[which]; }
int GetImage(size_t col, wxTreeItemIcon which=wxTreeItemIcon_Normal) const
{
if(col == m_owner->GetMainColumn()) return m_images[which];
if(col < m_col_images.GetCount()) return m_col_images[col];
return NO_IMAGE;
}
wxTreeItemData *GetData() const { return m_data; }
// returns the current image for the item (depending on its
// selected/expanded/whatever state)
int GetCurrentImage() const;
void SetText( const wxString &text );
void SetText(size_t col, const wxString& text) // ALB
{
if(col < m_text.GetCount())
m_text[col] = text;
else if(col < m_owner->GetColumnCount()) {
int howmany = m_owner->GetColumnCount();
for(int i = m_text.GetCount(); i < howmany; ++i)
m_text.Add(wxEmptyString);
m_text[col] = text;
}
}
void SetImage(int image, wxTreeItemIcon which) { m_images[which] = image; }
void SetImage(size_t col, int image, wxTreeItemIcon which)
{
if(col == m_owner->GetMainColumn()) m_images[which] = image;
else if(col < m_col_images.GetCount())
m_col_images[col] = image;
else if(col < m_owner->GetColumnCount()) {
int howmany = m_owner->GetColumnCount();
for(int i = m_col_images.GetCount(); i < howmany; ++i)
m_col_images.Add(NO_IMAGE);
m_col_images[col] = image;
}
}
void SetData(wxTreeItemData *data) { m_data = data; }
void SetHasPlus(bool has = TRUE) { m_hasPlus = has; }
void SetBold(bool bold) { m_isBold = bold; }
int GetX() const { return m_x; }
int GetY() const { return m_y; }
void SetX(int x) { m_x = x; }
void SetY(int y) { m_y = y; }
int GetHeight() const { return m_height; }
int GetWidth() const { return m_width; }
void SetHeight(int h) { m_height = h; }
void SetWidth(int w) { m_width = w; }
wxTreeListItem *GetItemParent() const { return m_parent; }
// operations
// deletes all children notifying the treectrl about it if !NULL
// pointer given
void DeleteChildren(wxTreeListMainWindow *tree = NULL);
// get count of all children (and grand children if 'recursively')
size_t GetChildrenCount(bool recursively = TRUE) const;
void Insert(wxTreeListItem *child, size_t index)
{ m_children.Insert(child, index); }
void GetSize( int &x, int &y, const wxTreeListMainWindow* );
// return the item at given position (or NULL if no item), onButton is
// TRUE if the point belongs to the item's button, otherwise it lies
// on the button's label
wxTreeListItem *HitTest( const wxPoint& point,
const wxTreeListMainWindow *,
int &flags,
int level );
wxTreeListItem *HitTest( const wxPoint& point,
const wxTreeListMainWindow *,
int &flags, int& column /*ALB*/,
int level );
void Expand() { m_isCollapsed = FALSE; }
void Collapse() { m_isCollapsed = TRUE; }
void SetHilight( bool set = TRUE ) { m_hasHilight = set; }
// status inquiries
bool HasChildren() const { return !m_children.IsEmpty(); }
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 != 0; }
// attributes
// get them - may be NULL
wxTreeItemAttr *GetAttributes() const { return m_attr; }
// get them ensuring that the pointer is not NULL
wxTreeItemAttr& Attr()
{
if ( !m_attr )
{
m_attr = new wxTreeItemAttr;
m_ownsAttr = TRUE;
}
return *m_attr;
}
// set them
void SetAttributes(wxTreeItemAttr *attr)
{
if ( m_ownsAttr ) delete m_attr;
m_attr = attr;
m_ownsAttr = FALSE;
}
// set them and delete when done
void AssignAttributes(wxTreeItemAttr *attr)
{
SetAttributes(attr);
m_ownsAttr = TRUE;
}
private:
wxTreeListMainWindow *m_owner; // control the item belongs to
// since there can be very many of these, we save size by chosing
// the smallest representation for the elements and by ordering
// the members to avoid padding.
wxArrayString m_text; // labels to be rendered for item
wxTreeItemData *m_data; // user-provided data
wxArrayTreeListItems m_children; // list of children
wxTreeListItem *m_parent; // parent of this item
wxTreeItemAttr *m_attr; // attributes???
// tree ctrl images for the normal, selected, expanded and
// expanded+selected states
short m_images[wxTreeItemIcon_Max];
wxArrayShort m_col_images; // images for the various columns (!= main)
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
// use bitfields to save size
int m_isCollapsed :1;
int m_hasHilight :1; // same as focused
int m_hasPlus :1; // used for item which doesn't have
// children but has a [+] button
int m_isBold :1; // render the label in bold font
int m_ownsAttr :1; // delete attribute when done
};
// ===========================================================================
// implementation
// ===========================================================================
// ----------------------------------------------------------------------------
// private functions
// ----------------------------------------------------------------------------
// translate the key or mouse event flags to the type of selection we're
// dealing with
static void EventFlagsToSelType(long style,
bool shiftDown,
bool ctrlDown,
bool &is_multiple,
bool &extended_select,
bool &unselect_others)
{
is_multiple = (style & wxTR_MULTIPLE) != 0;
extended_select = shiftDown && is_multiple;
unselect_others = !(extended_select || (ctrlDown && is_multiple));
}
// ---------------------------------------------------------------------------
// wxTreeListRenameTimer (internal)
// ---------------------------------------------------------------------------
wxTreeListRenameTimer::wxTreeListRenameTimer( wxTreeListMainWindow *owner )
{
m_owner = owner;
}
void wxTreeListRenameTimer::Notify()
{
m_owner->OnRenameTimer();
}
//-----------------------------------------------------------------------------
// wxTreeListTextCtrl (internal)
//-----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxTreeListTextCtrl,wxTextCtrl)
EVT_CHAR (wxTreeListTextCtrl::OnChar)
EVT_KEY_UP (wxTreeListTextCtrl::OnKeyUp)
EVT_KILL_FOCUS (wxTreeListTextCtrl::OnKillFocus)
END_EVENT_TABLE()
wxTreeListTextCtrl::wxTreeListTextCtrl( wxWindow *parent,
const wxWindowID id,
bool *accept,
wxString *res,
wxTreeListMainWindow *owner,
const wxString &value,
const wxPoint &pos,
const wxSize &size,
int style,
const wxValidator& validator,
const wxString &name )
: wxTextCtrl( parent, id, value, pos, size, style, validator, name )
{
m_res = res;
m_accept = accept;
m_owner = owner;
(*m_accept) = FALSE;
(*m_res) = wxEmptyString;
m_startValue = value;
m_finished = FALSE;
}
void wxTreeListTextCtrl::OnChar( wxKeyEvent &event )
{
if (event.m_keyCode == WXK_RETURN)
{
(*m_accept) = TRUE;
(*m_res) = GetValue();
if ((*m_res) != m_startValue)
m_owner->OnRenameAccept();
if (!wxPendingDelete.Member(this))
wxPendingDelete.Append(this);
m_finished = TRUE;
m_owner->SetFocus(); // This doesn't work. TODO.
return;
}
if (event.m_keyCode == WXK_ESCAPE)
{
(*m_accept) = FALSE;
(*m_res) = wxEmptyString;
if (!wxPendingDelete.Member(this))
wxPendingDelete.Append(this);
m_finished = TRUE;
m_owner->SetFocus(); // This doesn't work. TODO.
return;
}
event.Skip();
}
void wxTreeListTextCtrl::OnKeyUp( wxKeyEvent &event )
{
if (m_finished)
{
event.Skip();
return;
}
// auto-grow the textctrl:
wxSize parentSize = m_owner->GetSize();
wxPoint myPos = GetPosition();
wxSize mySize = GetSize();
int sx, sy;
GetTextExtent(GetValue() + _T("M"), &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 wxTreeListTextCtrl::OnKillFocus( wxFocusEvent &event )
{
if (m_finished)
{
event.Skip();
return;
}
if (!wxPendingDelete.Member(this))
wxPendingDelete.Append(this);
(*m_accept) = TRUE;
(*m_res) = GetValue();
if ((*m_res) != m_startValue)
m_owner->OnRenameAccept();
}
//-----------------------------------------------------------------------------
// wxTreeListHeaderWindow
//-----------------------------------------------------------------------------
IMPLEMENT_DYNAMIC_CLASS(wxTreeListHeaderWindow,wxWindow)
BEGIN_EVENT_TABLE(wxTreeListHeaderWindow,wxWindow)
EVT_ERASE_BACKGROUND (wxTreeListHeaderWindow::OnEraseBackground)
EVT_PAINT (wxTreeListHeaderWindow::OnPaint)
EVT_MOUSE_EVENTS (wxTreeListHeaderWindow::OnMouse)
EVT_SET_FOCUS (wxTreeListHeaderWindow::OnSetFocus)
END_EVENT_TABLE()
void wxTreeListHeaderWindow::Init()
{
m_currentCursor = (wxCursor *) NULL;
m_isDragging = FALSE;
m_dirty = FALSE;
m_total_col_width = 0;
}
wxTreeListHeaderWindow::wxTreeListHeaderWindow()
{
Init();
m_owner = (wxTreeListMainWindow *) NULL;
m_resizeCursor = (wxCursor *) NULL;
}
wxTreeListHeaderWindow::wxTreeListHeaderWindow( wxWindow *win,
wxWindowID id,
wxTreeListMainWindow *owner,
const wxPoint& pos,
const wxSize& size,
long style,
const wxString &name )
: wxWindow( win, id, pos, size, style, name )
{
Init();
m_owner = owner;
m_resizeCursor = new wxCursor(wxCURSOR_SIZEWE);
SetBackgroundColour(wxSystemSettings::GetColour(
wxSYS_COLOUR_BTNFACE));
}
wxTreeListHeaderWindow::~wxTreeListHeaderWindow()
{
delete m_resizeCursor;
}
void wxTreeListHeaderWindow::DoDrawRect( wxDC *dc, int x, int y, int w, int h )
{
#ifdef __WXGTK__
GtkStateType state = m_parent->IsEnabled() ? GTK_STATE_NORMAL
: GTK_STATE_INSENSITIVE;
x = dc->XLOG2DEV( x );
gtk_paint_box (m_wxwindow->style, GTK_PIZZA(m_wxwindow)->bin_window,
state, GTK_SHADOW_OUT,
(GdkRectangle*) NULL, m_wxwindow, "button",
x-1, y-1, w+2, h+2);
#elif defined( __WXMAC__ )
const int m_corner = 1;
dc->SetBrush( *wxTRANSPARENT_BRUSH );
dc->SetPen( wxPen(wxSystemSettings::GetColour(
wxSYS_COLOUR_BTNSHADOW), 1, wxSOLID));
dc->DrawLine( x+w-m_corner+1, y, x+w, y+h ); // right (outer)
dc->DrawRectangle( x, y+h, w+1, 1 ); // bottom (outer)
wxPen pen( wxColour( 0x88 , 0x88 , 0x88 ), 1, wxSOLID );
dc->SetPen( pen );
dc->DrawLine( x+w-m_corner, y, x+w-1, y+h ); // right (inner)
dc->DrawRectangle( x+1, y+h-1, w-2, 1 ); // bottom (inner)
dc->SetPen( *wxWHITE_PEN );
dc->DrawRectangle( x, y, w-m_corner+1, 1 ); // top (outer)
dc->DrawRectangle( x, y, 1, h ); // left (outer)
dc->DrawLine( x, y+h-1, x+1, y+h-1 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -