use YieldFor() in wxTopLevelWindowGTK::RequestUserAttention; comment on the use of YieldFor() in wxProgressDialog; add some TODOs near wxYieldIfNeeded()/wxSafeYield() calls in wxListCtrl, wxDataViewCtrl, wxTreeCtrl (closes #10320)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58916 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -189,7 +189,7 @@ private:
|
||||
{
|
||||
wxDataViewCtrl * const owner = GetOwner();
|
||||
owner->ColumnMoved(owner->GetColumn(event.GetColumn()),
|
||||
event.GetNewOrder());
|
||||
event.GetNewOrder());
|
||||
}
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
@@ -543,8 +543,8 @@ private:
|
||||
|
||||
// for double click logic
|
||||
unsigned int m_lineLastClicked,
|
||||
m_lineBeforeLastClicked,
|
||||
m_lineSelectSingleOnUp;
|
||||
m_lineBeforeLastClicked,
|
||||
m_lineSelectSingleOnUp;
|
||||
|
||||
// the pen used to draw horiz/vertical rules
|
||||
wxPen m_penRule;
|
||||
@@ -583,7 +583,7 @@ public:
|
||||
virtual bool Cleared()
|
||||
{ return m_mainWindow->Cleared(); }
|
||||
virtual void Resort()
|
||||
{ m_mainWindow->Resort(); }
|
||||
{ m_mainWindow->Resort(); }
|
||||
|
||||
wxDataViewMainWindow *m_mainWindow;
|
||||
};
|
||||
@@ -641,7 +641,7 @@ int wxDataViewRenderer::CalculateAlignment() const
|
||||
if (m_align == wxDVR_DEFAULT_ALIGNMENT)
|
||||
{
|
||||
if (GetOwner() == NULL)
|
||||
return wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL;
|
||||
return wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL;
|
||||
|
||||
return GetOwner()->GetAlignment() | wxALIGN_CENTRE_VERTICAL;
|
||||
}
|
||||
@@ -656,7 +656,7 @@ int wxDataViewRenderer::CalculateAlignment() const
|
||||
IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
|
||||
|
||||
wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype,
|
||||
wxDataViewCellMode mode, int align ) :
|
||||
wxDataViewCellMode mode, int align ) :
|
||||
wxDataViewRenderer( varianttype, mode, align )
|
||||
{
|
||||
}
|
||||
@@ -704,8 +704,8 @@ wxControl* wxDataViewTextRenderer::CreateEditorCtrl( wxWindow *parent,
|
||||
wxRect labelRect, const wxVariant &value )
|
||||
{
|
||||
return new wxTextCtrl( parent, wxID_ANY, value,
|
||||
wxPoint(labelRect.x,labelRect.y),
|
||||
wxSize(labelRect.width,labelRect.height) );
|
||||
wxPoint(labelRect.x,labelRect.y),
|
||||
wxSize(labelRect.width,labelRect.height) );
|
||||
}
|
||||
|
||||
bool wxDataViewTextRenderer::GetValueFromEditorCtrl( wxControl *editor, wxVariant &value )
|
||||
@@ -761,13 +761,13 @@ bool wxDataViewTextRendererAttr::Render( wxRect cell, wxDC *dc, int WXUNUSED(sta
|
||||
|
||||
if (m_attr.GetBold() || m_attr.GetItalic())
|
||||
{
|
||||
font = dc->GetFont();
|
||||
wxFont myfont = font;
|
||||
if (m_attr.GetBold())
|
||||
myfont.SetWeight( wxFONTWEIGHT_BOLD );
|
||||
if (m_attr.GetItalic())
|
||||
myfont.SetStyle( wxFONTSTYLE_ITALIC );
|
||||
dc->SetFont( myfont );
|
||||
font = dc->GetFont();
|
||||
wxFont myfont = font;
|
||||
if (m_attr.GetBold())
|
||||
myfont.SetWeight( wxFONTWEIGHT_BOLD );
|
||||
if (m_attr.GetItalic())
|
||||
myfont.SetStyle( wxFONTSTYLE_ITALIC );
|
||||
dc->SetFont( myfont );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -885,8 +885,8 @@ bool wxDataViewToggleRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state
|
||||
}
|
||||
|
||||
bool wxDataViewToggleRenderer::Activate( wxRect WXUNUSED(cell),
|
||||
wxDataViewModel *model,
|
||||
const wxDataViewItem & item, unsigned int col)
|
||||
wxDataViewModel *model,
|
||||
const wxDataViewItem & item, unsigned int col)
|
||||
{
|
||||
bool value = !m_toggle;
|
||||
wxVariant variant = value;
|
||||
@@ -1049,7 +1049,7 @@ wxSize wxDataViewDateRenderer::GetSize() const
|
||||
}
|
||||
|
||||
bool wxDataViewDateRenderer::Activate( wxRect WXUNUSED(cell), wxDataViewModel *model,
|
||||
const wxDataViewItem & item, unsigned int col )
|
||||
const wxDataViewItem & item, unsigned int col )
|
||||
{
|
||||
wxVariant variant;
|
||||
model->GetValue( variant, item, col );
|
||||
@@ -1075,7 +1075,7 @@ bool wxDataViewDateRenderer::Activate( wxRect WXUNUSED(cell), wxDataViewModel *m
|
||||
IMPLEMENT_CLASS(wxDataViewIconTextRenderer, wxDataViewCustomRenderer)
|
||||
|
||||
wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(
|
||||
const wxString &varianttype, wxDataViewCellMode mode, int align ) :
|
||||
const wxString &varianttype, wxDataViewCellMode mode, int align ) :
|
||||
wxDataViewCustomRenderer( varianttype, mode, align )
|
||||
{
|
||||
SetMode(mode);
|
||||
@@ -1129,15 +1129,15 @@ wxSize wxDataViewIconTextRenderer::GetSize() const
|
||||
|
||||
wxControl *
|
||||
wxDataViewIconTextRenderer::CreateEditorCtrl(wxWindow * WXUNUSED(parent),
|
||||
wxRect WXUNUSED(labelRect),
|
||||
const wxVariant& WXUNUSED(value))
|
||||
wxRect WXUNUSED(labelRect),
|
||||
const wxVariant& WXUNUSED(value))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool
|
||||
wxDataViewIconTextRenderer::GetValueFromEditorCtrl(wxControl* WXUNUSED(editor),
|
||||
wxVariant& WXUNUSED(value))
|
||||
wxVariant& WXUNUSED(value))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -1152,7 +1152,7 @@ class wxBitmapCanvas: public wxWindow
|
||||
{
|
||||
public:
|
||||
wxBitmapCanvas( wxWindow *parent, const wxBitmap &bitmap, const wxSize &size ) :
|
||||
wxWindow( parent, wxID_ANY, wxPoint(0,0), size )
|
||||
wxWindow( parent, wxID_ANY, wxPoint(0,0), size )
|
||||
{
|
||||
m_bitmap = bitmap;
|
||||
Connect( wxEVT_PAINT, wxPaintEventHandler(wxBitmapCanvas::OnPaint) );
|
||||
@@ -1171,7 +1171,7 @@ class wxDataViewDropSource: public wxDropSource
|
||||
{
|
||||
public:
|
||||
wxDataViewDropSource( wxDataViewMainWindow *win, unsigned int row ) :
|
||||
wxDropSource( win )
|
||||
wxDropSource( win )
|
||||
{
|
||||
m_win = win;
|
||||
m_row = row;
|
||||
@@ -1200,12 +1200,12 @@ public:
|
||||
wxBitmap ib = m_win->CreateItemBitmap( m_row, indent );
|
||||
m_dist_x -= indent;
|
||||
m_hint = new wxFrame( m_win->GetParent(), wxID_ANY, wxEmptyString,
|
||||
wxPoint(pos.x - m_dist_x, pos.y + 5 ),
|
||||
ib.GetSize(),
|
||||
wxFRAME_TOOL_WINDOW |
|
||||
wxFRAME_FLOAT_ON_PARENT |
|
||||
wxFRAME_NO_TASKBAR |
|
||||
wxNO_BORDER );
|
||||
wxPoint(pos.x - m_dist_x, pos.y + 5 ),
|
||||
ib.GetSize(),
|
||||
wxFRAME_TOOL_WINDOW |
|
||||
wxFRAME_FLOAT_ON_PARENT |
|
||||
wxFRAME_NO_TASKBAR |
|
||||
wxNO_BORDER );
|
||||
new wxBitmapCanvas( m_hint, ib, ib.GetSize() );
|
||||
m_hint->Show();
|
||||
}
|
||||
@@ -1236,28 +1236,28 @@ public:
|
||||
|
||||
virtual wxDragResult OnDragOver( wxCoord x, wxCoord y, wxDragResult def )
|
||||
{
|
||||
wxDataFormat format = GetMatchingPair();
|
||||
if (format == wxDF_INVALID)
|
||||
return wxDragNone;
|
||||
return m_win->OnDragOver( format, x, y, def);
|
||||
wxDataFormat format = GetMatchingPair();
|
||||
if (format == wxDF_INVALID)
|
||||
return wxDragNone;
|
||||
return m_win->OnDragOver( format, x, y, def);
|
||||
}
|
||||
|
||||
virtual bool OnDrop( wxCoord x, wxCoord y )
|
||||
{
|
||||
wxDataFormat format = GetMatchingPair();
|
||||
if (format == wxDF_INVALID)
|
||||
return false;
|
||||
return m_win->OnDrop( format, x, y );
|
||||
wxDataFormat format = GetMatchingPair();
|
||||
if (format == wxDF_INVALID)
|
||||
return false;
|
||||
return m_win->OnDrop( format, x, y );
|
||||
}
|
||||
|
||||
virtual wxDragResult OnData( wxCoord x, wxCoord y, wxDragResult def )
|
||||
{
|
||||
wxDataFormat format = GetMatchingPair();
|
||||
if (format == wxDF_INVALID)
|
||||
return wxDragNone;
|
||||
if (!GetData())
|
||||
return wxDragNone;
|
||||
return m_win->OnData( format, x, y, def );
|
||||
wxDataFormat format = GetMatchingPair();
|
||||
if (format == wxDF_INVALID)
|
||||
return wxDragNone;
|
||||
if (!GetData())
|
||||
return wxDragNone;
|
||||
return m_win->OnData( format, x, y, def );
|
||||
}
|
||||
|
||||
virtual void OnLeave()
|
||||
@@ -1527,8 +1527,8 @@ wxBitmap wxDataViewMainWindow::CreateItemBitmap( unsigned int row, int &indent )
|
||||
indent = GetOwner()->GetIndent() * node->GetIndentLevel();
|
||||
indent = indent + m_lineHeight; //try to use the m_lineHeight as the expander space
|
||||
|
||||
if(!node->HasChildren())
|
||||
delete node;
|
||||
if(!node->HasChildren())
|
||||
delete node;
|
||||
}
|
||||
width -= indent;
|
||||
|
||||
@@ -1641,7 +1641,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
||||
unsigned int item_start = GetLineAt( wxMax(0,update.y) );
|
||||
unsigned int item_count =
|
||||
wxMin( (int)( GetLineAt( wxMax(0,update.y+update.height) ) - item_start + 1),
|
||||
(int)(GetRowCount( ) - item_start));
|
||||
(int)(GetRowCount( ) - item_start));
|
||||
unsigned int item_last = item_start + item_count;
|
||||
|
||||
// compute which columns needs to be redrawn
|
||||
@@ -1739,7 +1739,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
||||
if (m_dropHint)
|
||||
{
|
||||
wxRect rect( x_start, GetLineStart( m_dropHintLine ),
|
||||
x_last, GetLineHeight( m_dropHintLine ) );
|
||||
x_last, GetLineHeight( m_dropHintLine ) );
|
||||
dc.SetPen( *wxBLACK_PEN );
|
||||
dc.SetBrush( *wxTRANSPARENT_BRUSH );
|
||||
dc.DrawRectangle( rect );
|
||||
@@ -1835,8 +1835,8 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
||||
else
|
||||
wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, flag);
|
||||
}
|
||||
//force the expander column to left-center align
|
||||
cell->SetAlignment( wxALIGN_CENTER_VERTICAL );
|
||||
//force the expander column to left-center align
|
||||
cell->SetAlignment( wxALIGN_CENTER_VERTICAL );
|
||||
}
|
||||
if (node && !node->HasChildren())
|
||||
{
|
||||
@@ -1903,7 +1903,11 @@ void wxDataViewMainWindow::OnRenameTimer()
|
||||
// We have to call this here because changes may just have
|
||||
// been made and no screen update taken place.
|
||||
if ( m_dirty )
|
||||
{
|
||||
// TODO: use wxTheApp->SafeYieldFor(NULL, wxEVT_CATEGORY_UI) instead
|
||||
// (needs to be tested!)
|
||||
wxSafeYield();
|
||||
}
|
||||
|
||||
int xpos = 0;
|
||||
unsigned int cols = GetOwner()->GetColumnCount();
|
||||
@@ -1919,26 +1923,26 @@ void wxDataViewMainWindow::OnRenameTimer()
|
||||
xpos += c->GetWidth();
|
||||
}
|
||||
|
||||
// we have to take an expander column into account and compute its indentation
|
||||
// to get the editor at the correct x position where the actual text is
|
||||
int indent = 0;
|
||||
if (!IsVirtualList() && GetOwner()->GetExpanderColumn() == m_currentCol)
|
||||
{
|
||||
wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow);
|
||||
indent = GetOwner()->GetIndent() * node->GetIndentLevel();
|
||||
indent = indent + m_lineHeight;
|
||||
// we have to take an expander column into account and compute its indentation
|
||||
// to get the editor at the correct x position where the actual text is
|
||||
int indent = 0;
|
||||
if (!IsVirtualList() && GetOwner()->GetExpanderColumn() == m_currentCol)
|
||||
{
|
||||
wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow);
|
||||
indent = GetOwner()->GetIndent() * node->GetIndentLevel();
|
||||
indent = indent + m_lineHeight;
|
||||
|
||||
if(!node->HasChildren())
|
||||
delete node;
|
||||
}
|
||||
if(!node->HasChildren())
|
||||
delete node;
|
||||
}
|
||||
|
||||
wxRect labelRect( xpos + indent,
|
||||
GetLineStart( m_currentRow ),
|
||||
m_currentCol->GetWidth() - indent,
|
||||
GetLineHeight( m_currentRow ) );
|
||||
GetLineStart( m_currentRow ),
|
||||
m_currentCol->GetWidth() - indent,
|
||||
GetLineHeight( m_currentRow ) );
|
||||
|
||||
GetOwner()->CalcScrolledPosition( labelRect.x, labelRect.y,
|
||||
&labelRect.x, &labelRect.y);
|
||||
&labelRect.x, &labelRect.y);
|
||||
|
||||
wxDataViewItem item = GetItemByRow( m_currentRow );
|
||||
m_currentCol->GetRenderer()->StartEditing( item, labelRect );
|
||||
@@ -2006,7 +2010,7 @@ bool Walker( wxDataViewTreeNode * node, DoJob & func )
|
||||
continue;
|
||||
case DoJob::CONT:
|
||||
default:
|
||||
;
|
||||
;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
@@ -2052,7 +2056,7 @@ bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxData
|
||||
static void DestroyTreeHelper( wxDataViewTreeNode * node);
|
||||
|
||||
bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent,
|
||||
const wxDataViewItem& item)
|
||||
const wxDataViewItem& item)
|
||||
{
|
||||
if (!m_root)
|
||||
{
|
||||
@@ -2290,7 +2294,7 @@ unsigned int wxDataViewMainWindow::GetLastVisibleRow()
|
||||
{
|
||||
wxSize client_size = GetClientSize();
|
||||
m_owner->CalcUnscrolledPosition( client_size.x, client_size.y,
|
||||
&client_size.x, &client_size.y );
|
||||
&client_size.x, &client_size.y );
|
||||
|
||||
//we should deal with the pixel here
|
||||
unsigned int row = GetLineAt(client_size.y) - 1;
|
||||
@@ -2471,7 +2475,7 @@ void wxDataViewMainWindow::RefreshRowsAfter( unsigned int firstRow )
|
||||
void wxDataViewMainWindow::OnArrowChar(unsigned int newCurrent, const wxKeyEvent& event)
|
||||
{
|
||||
wxCHECK_RET( newCurrent < GetRowCount(),
|
||||
_T("invalid item index in OnArrowChar()") );
|
||||
_T("invalid item index in OnArrowChar()") );
|
||||
|
||||
// if there is no selection, we cannot move it anywhere
|
||||
if (!HasCurrentRow())
|
||||
@@ -2601,14 +2605,14 @@ int wxDataViewMainWindow::GetLineAt( unsigned int y ) const
|
||||
unsigned int yy = 0;
|
||||
for (;;)
|
||||
{
|
||||
const wxDataViewTreeNode* node = GetTreeNodeByRow(row);
|
||||
if (!node)
|
||||
{
|
||||
// not really correct...
|
||||
return row + ((y-yy) / m_lineHeight);
|
||||
}
|
||||
const wxDataViewTreeNode* node = GetTreeNodeByRow(row);
|
||||
if (!node)
|
||||
{
|
||||
// not really correct...
|
||||
return row + ((y-yy) / m_lineHeight);
|
||||
}
|
||||
|
||||
wxDataViewItem item = node->GetItem();
|
||||
wxDataViewItem item = node->GetItem();
|
||||
|
||||
if (node && !node->HasChildren())
|
||||
{
|
||||
@@ -2617,11 +2621,11 @@ int wxDataViewMainWindow::GetLineAt( unsigned int y ) const
|
||||
wxDELETE(node);
|
||||
}
|
||||
|
||||
unsigned int cols = GetOwner()->GetColumnCount();
|
||||
unsigned int col;
|
||||
int height = m_lineHeight;
|
||||
for (col = 0; col < cols; col++)
|
||||
{
|
||||
unsigned int cols = GetOwner()->GetColumnCount();
|
||||
unsigned int col;
|
||||
int height = m_lineHeight;
|
||||
for (col = 0; col < cols; col++)
|
||||
{
|
||||
const wxDataViewColumn *column = GetOwner()->GetColumn(col);
|
||||
if (column->IsHidden())
|
||||
continue; // skip it!
|
||||
@@ -2635,13 +2639,13 @@ int wxDataViewMainWindow::GetLineAt( unsigned int y ) const
|
||||
wxDataViewRenderer *renderer2 = const_cast<wxDataViewRenderer*>(renderer);
|
||||
renderer2->SetValue( value );
|
||||
height = wxMax( height, renderer->GetSize().y );
|
||||
}
|
||||
}
|
||||
|
||||
yy += height;
|
||||
if (y < yy)
|
||||
return row;
|
||||
yy += height;
|
||||
if (y < yy)
|
||||
return row;
|
||||
|
||||
row++;
|
||||
row++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2663,7 +2667,7 @@ int wxDataViewMainWindow::GetLineHeight( unsigned int row ) const
|
||||
{
|
||||
// Yes, if the node does not have any child, it must be a leaf which
|
||||
// mean that it is a temporarily created by GetTreeNodeByRow
|
||||
wxDELETE(node);
|
||||
wxDELETE(node);
|
||||
}
|
||||
|
||||
int height = m_lineHeight;
|
||||
@@ -2705,7 +2709,7 @@ public:
|
||||
{
|
||||
current ++;
|
||||
if( current == static_cast<int>(row))
|
||||
{
|
||||
{
|
||||
ret = node->GetItem();
|
||||
return DoJob::OK;
|
||||
}
|
||||
@@ -2733,7 +2737,7 @@ public:
|
||||
{
|
||||
current ++;
|
||||
if( current == static_cast<int>(row))
|
||||
{
|
||||
{
|
||||
ret = wxDataViewItem( n );
|
||||
return DoJob::OK;
|
||||
}
|
||||
@@ -2776,7 +2780,7 @@ public:
|
||||
{
|
||||
current ++;
|
||||
if( current == static_cast<int>(row))
|
||||
{
|
||||
{
|
||||
ret = node;
|
||||
return DoJob::OK;
|
||||
}
|
||||
@@ -2810,7 +2814,7 @@ public:
|
||||
{
|
||||
current ++;
|
||||
if( current == static_cast<int>(row))
|
||||
{
|
||||
{
|
||||
ret = new wxDataViewTreeNode( parent );
|
||||
ret->SetItem( wxDataViewItem( n ));
|
||||
ret->SetHasChildren(false);
|
||||
@@ -2854,16 +2858,16 @@ wxDataViewEvent wxDataViewMainWindow::SendExpanderEvent( wxEventType type, const
|
||||
bool wxDataViewMainWindow::IsExpanded( unsigned int row ) const
|
||||
{
|
||||
if (IsVirtualList())
|
||||
return false;
|
||||
return false;
|
||||
|
||||
wxDataViewTreeNode * node = GetTreeNodeByRow(row);
|
||||
if (!node)
|
||||
return false;
|
||||
return false;
|
||||
|
||||
if (!node->HasChildren())
|
||||
{
|
||||
delete node;
|
||||
return false;
|
||||
delete node;
|
||||
return false;
|
||||
}
|
||||
|
||||
return node->IsOpen();
|
||||
@@ -2873,7 +2877,7 @@ bool wxDataViewMainWindow::IsExpanded( unsigned int row ) const
|
||||
void wxDataViewMainWindow::OnExpanding( unsigned int row )
|
||||
{
|
||||
if (IsVirtualList())
|
||||
return;
|
||||
return;
|
||||
|
||||
wxDataViewTreeNode * node = GetTreeNodeByRow(row);
|
||||
if( node != NULL )
|
||||
@@ -2882,39 +2886,39 @@ void wxDataViewMainWindow::OnExpanding( unsigned int row )
|
||||
{
|
||||
if( !node->IsOpen())
|
||||
{
|
||||
wxDataViewEvent e = SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING,node->GetItem());
|
||||
//Check if the user prevent expanding
|
||||
if( e.GetSkipped() )
|
||||
wxDataViewEvent e = SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING,node->GetItem());
|
||||
//Check if the user prevent expanding
|
||||
if( e.GetSkipped() )
|
||||
return;
|
||||
|
||||
node->ToggleOpen();
|
||||
//Here I build the children of current node
|
||||
if( node->GetChildrenNumber() == 0 )
|
||||
{
|
||||
SortPrepare();
|
||||
::BuildTreeHelper(GetOwner()->GetModel(), node->GetItem(), node);
|
||||
}
|
||||
node->ToggleOpen();
|
||||
//Here I build the children of current node
|
||||
if( node->GetChildrenNumber() == 0 )
|
||||
{
|
||||
SortPrepare();
|
||||
::BuildTreeHelper(GetOwner()->GetModel(), node->GetItem(), node);
|
||||
}
|
||||
|
||||
// By expanding the node all row indices that are currently in the selection list
|
||||
// and are greater than our node have become invalid. So we have to correct that now.
|
||||
const unsigned rowAdjustment = node->GetSubTreeCount();
|
||||
for(unsigned i=0; i<m_selection.size(); ++i)
|
||||
{
|
||||
const unsigned testRow = m_selection[i];
|
||||
// all rows above us are not affected, so skip them
|
||||
if(testRow <= row)
|
||||
continue;
|
||||
// By expanding the node all row indices that are currently in the selection list
|
||||
// and are greater than our node have become invalid. So we have to correct that now.
|
||||
const unsigned rowAdjustment = node->GetSubTreeCount();
|
||||
for(unsigned i=0; i<m_selection.size(); ++i)
|
||||
{
|
||||
const unsigned testRow = m_selection[i];
|
||||
// all rows above us are not affected, so skip them
|
||||
if(testRow <= row)
|
||||
continue;
|
||||
|
||||
m_selection[i] += rowAdjustment;
|
||||
}
|
||||
m_selection[i] += rowAdjustment;
|
||||
}
|
||||
|
||||
if(m_currentRow > row)
|
||||
ChangeCurrentRow(m_currentRow + rowAdjustment);
|
||||
if(m_currentRow > row)
|
||||
ChangeCurrentRow(m_currentRow + rowAdjustment);
|
||||
|
||||
m_count = -1;
|
||||
UpdateDisplay();
|
||||
//Send the expanded event
|
||||
SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,node->GetItem());
|
||||
m_count = -1;
|
||||
UpdateDisplay();
|
||||
//Send the expanded event
|
||||
SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,node->GetItem());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2932,7 +2936,7 @@ void wxDataViewMainWindow::OnExpanding( unsigned int row )
|
||||
void wxDataViewMainWindow::OnCollapsing(unsigned int row)
|
||||
{
|
||||
if (IsVirtualList())
|
||||
return;
|
||||
return;
|
||||
|
||||
wxDataViewTreeNode * node = GetTreeNodeByRow(row);
|
||||
if( node != NULL )
|
||||
@@ -2945,53 +2949,53 @@ void wxDataViewMainWindow::OnCollapsing(unsigned int row)
|
||||
if( e.GetSkipped() )
|
||||
return;
|
||||
|
||||
// Find out if there are selected items below the current node.
|
||||
bool selectCollapsingRow = false;
|
||||
const unsigned rowAdjustment = node->GetSubTreeCount();
|
||||
unsigned maxRowToBeTested = row + rowAdjustment;
|
||||
for(unsigned i=0; i<m_selection.size(); ++i)
|
||||
{
|
||||
const unsigned testRow = m_selection[i];
|
||||
if(testRow > row && testRow <= maxRowToBeTested)
|
||||
{
|
||||
selectCollapsingRow = true;
|
||||
// get out as soon as we have found a node that is selected
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Find out if there are selected items below the current node.
|
||||
bool selectCollapsingRow = false;
|
||||
const unsigned rowAdjustment = node->GetSubTreeCount();
|
||||
unsigned maxRowToBeTested = row + rowAdjustment;
|
||||
for(unsigned i=0; i<m_selection.size(); ++i)
|
||||
{
|
||||
const unsigned testRow = m_selection[i];
|
||||
if(testRow > row && testRow <= maxRowToBeTested)
|
||||
{
|
||||
selectCollapsingRow = true;
|
||||
// get out as soon as we have found a node that is selected
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
node->ToggleOpen();
|
||||
node->ToggleOpen();
|
||||
|
||||
// If the node to be closed has selected items the user won't see those any longer.
|
||||
// We select the collapsing node in this case.
|
||||
if(selectCollapsingRow)
|
||||
{
|
||||
SelectAllRows(false);
|
||||
ChangeCurrentRow(row);
|
||||
SelectRow(row, true);
|
||||
SendSelectionChangedEvent(GetItemByRow(row));
|
||||
}
|
||||
else
|
||||
{
|
||||
// if there were no selected items below our node we still need to "fix" the
|
||||
// selection list to adjust for the changing of the row indices.
|
||||
// We actually do the opposite of what we are doing in OnExpanding().
|
||||
for(unsigned i=0; i<m_selection.size(); ++i)
|
||||
{
|
||||
const unsigned testRow = m_selection[i];
|
||||
// all rows above us are not affected, so skip them
|
||||
if(testRow <= row)
|
||||
continue;
|
||||
// If the node to be closed has selected items the user won't see those any longer.
|
||||
// We select the collapsing node in this case.
|
||||
if(selectCollapsingRow)
|
||||
{
|
||||
SelectAllRows(false);
|
||||
ChangeCurrentRow(row);
|
||||
SelectRow(row, true);
|
||||
SendSelectionChangedEvent(GetItemByRow(row));
|
||||
}
|
||||
else
|
||||
{
|
||||
// if there were no selected items below our node we still need to "fix" the
|
||||
// selection list to adjust for the changing of the row indices.
|
||||
// We actually do the opposite of what we are doing in OnExpanding().
|
||||
for(unsigned i=0; i<m_selection.size(); ++i)
|
||||
{
|
||||
const unsigned testRow = m_selection[i];
|
||||
// all rows above us are not affected, so skip them
|
||||
if(testRow <= row)
|
||||
continue;
|
||||
|
||||
m_selection[i] -= rowAdjustment;
|
||||
}
|
||||
m_selection[i] -= rowAdjustment;
|
||||
}
|
||||
|
||||
// if the "current row" is being collapsed away we change it to the current row ;-)
|
||||
if(m_currentRow > row && m_currentRow <= maxRowToBeTested)
|
||||
ChangeCurrentRow(row);
|
||||
else if(m_currentRow > row)
|
||||
ChangeCurrentRow(m_currentRow - rowAdjustment);
|
||||
}
|
||||
// if the "current row" is being collapsed away we change it to the current row ;-)
|
||||
if(m_currentRow > row && m_currentRow <= maxRowToBeTested)
|
||||
ChangeCurrentRow(row);
|
||||
else if(m_currentRow > row)
|
||||
ChangeCurrentRow(m_currentRow - rowAdjustment);
|
||||
}
|
||||
|
||||
m_count = -1;
|
||||
UpdateDisplay();
|
||||
@@ -3059,7 +3063,7 @@ wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item
|
||||
if (nodes[i]->GetItem() == (**iter))
|
||||
{
|
||||
if (nodes[i]->GetItem() == item)
|
||||
return nodes[i];
|
||||
return nodes[i];
|
||||
|
||||
node = nodes[i];
|
||||
found = true;
|
||||
@@ -3108,10 +3112,10 @@ wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, const wxD
|
||||
wxDataViewColumn *col = NULL;
|
||||
for( int i = 0, cols = GetOwner()->GetColumnCount(); i < cols; i ++ )
|
||||
{
|
||||
col = GetOwner()->GetColumnAt( i );
|
||||
x += col->GetWidth();
|
||||
if( GetOwner()->GetColumnAt(i+1) == column )
|
||||
break;
|
||||
col = GetOwner()->GetColumnAt( i );
|
||||
x += col->GetWidth();
|
||||
if( GetOwner()->GetColumnAt(i+1) == column )
|
||||
break;
|
||||
}
|
||||
int w = col->GetWidth();
|
||||
m_owner->CalcScrolledPosition( x, y, &x, &y );
|
||||
@@ -3140,7 +3144,7 @@ class ItemToRowJob : public DoJob
|
||||
public:
|
||||
ItemToRowJob(const wxDataViewItem& item_, ItemList::const_iterator iter)
|
||||
: m_iter(iter),
|
||||
item(item_)
|
||||
item(item_)
|
||||
{
|
||||
ret = -1;
|
||||
}
|
||||
@@ -3148,22 +3152,22 @@ public:
|
||||
//Maybe binary search will help to speed up this process
|
||||
virtual int operator() ( wxDataViewTreeNode * node)
|
||||
{
|
||||
ret ++;
|
||||
if( node->GetItem() == item )
|
||||
{
|
||||
return DoJob::OK;
|
||||
}
|
||||
ret ++;
|
||||
if( node->GetItem() == item )
|
||||
{
|
||||
return DoJob::OK;
|
||||
}
|
||||
|
||||
if( node->GetItem() == **m_iter )
|
||||
{
|
||||
m_iter++;
|
||||
return DoJob::CONT;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret += node->GetSubTreeCount();
|
||||
return DoJob::IGR;
|
||||
}
|
||||
if( node->GetItem() == **m_iter )
|
||||
{
|
||||
m_iter++;
|
||||
return DoJob::CONT;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret += node->GetSubTreeCount();
|
||||
return DoJob::IGR;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3289,7 +3293,7 @@ void wxDataViewMainWindow::DestroyTree()
|
||||
{
|
||||
if (!IsVirtualList())
|
||||
{
|
||||
::DestroyTreeHelper(m_root);
|
||||
::DestroyTreeHelper(m_root);
|
||||
m_count = 0;
|
||||
m_root = NULL;
|
||||
}
|
||||
@@ -3338,11 +3342,11 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event )
|
||||
break;
|
||||
//Add the process for tree expanding/collapsing
|
||||
case WXK_LEFT:
|
||||
OnCollapsing(m_currentRow);
|
||||
break;
|
||||
case WXK_RIGHT:
|
||||
OnExpanding( m_currentRow);
|
||||
break;
|
||||
OnCollapsing(m_currentRow);
|
||||
break;
|
||||
case WXK_RIGHT:
|
||||
OnExpanding( m_currentRow);
|
||||
break;
|
||||
case WXK_END:
|
||||
if (!IsEmpty())
|
||||
OnArrowChar( GetRowCount() - 1, event );
|
||||
@@ -3432,11 +3436,11 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
|
||||
int indent = node->GetIndentLevel();
|
||||
indent = GetOwner()->GetIndent()*indent;
|
||||
|
||||
// we make the rectangle we are looking in a bit bigger than the actual
|
||||
// visual expander so the user can hit that little thing reliably
|
||||
// we make the rectangle we are looking in a bit bigger than the actual
|
||||
// visual expander so the user can hit that little thing reliably
|
||||
wxRect rect( xpos + indent,
|
||||
GetLineStart( current ) + (GetLineHeight(current) - m_lineHeight)/2,
|
||||
m_lineHeight, m_lineHeight);
|
||||
GetLineStart( current ) + (GetLineHeight(current) - m_lineHeight)/2,
|
||||
m_lineHeight, m_lineHeight);
|
||||
if( rect.Contains(x, y) )
|
||||
{
|
||||
//So the mouse is over the expander
|
||||
@@ -3530,17 +3534,17 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
|
||||
wxDataViewItem item = GetItemByRow(current);
|
||||
bool ignore_other_columns =
|
||||
((GetOwner()->GetExpanderColumn() != col) &&
|
||||
(model->IsContainer(item)) &&
|
||||
(!model->HasContainerColumns(item)));
|
||||
(model->IsContainer(item)) &&
|
||||
(!model->HasContainerColumns(item)));
|
||||
|
||||
if (event.LeftDClick())
|
||||
{
|
||||
if(hoverOverExpander)
|
||||
{
|
||||
// a double click on the expander will be converted into a "simulated" normal click
|
||||
simulateClick = true;
|
||||
}
|
||||
else if ( current == m_lineLastClicked )
|
||||
if(hoverOverExpander)
|
||||
{
|
||||
// a double click on the expander will be converted into a "simulated" normal click
|
||||
simulateClick = true;
|
||||
}
|
||||
else if ( current == m_lineLastClicked )
|
||||
{
|
||||
if ((!ignore_other_columns) && (cell->GetMode() == wxDATAVIEW_CELL_ACTIVATABLE))
|
||||
{
|
||||
@@ -3548,7 +3552,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
|
||||
model->GetValue( value, item, col->GetModelColumn() );
|
||||
cell->SetValue( value );
|
||||
wxRect cell_rect( xpos, GetLineStart( current ),
|
||||
col->GetWidth(), GetLineHeight( current ) );
|
||||
col->GetWidth(), GetLineHeight( current ) );
|
||||
cell->Activate( cell_rect, model, item, col->GetModelColumn() );
|
||||
|
||||
}
|
||||
@@ -3633,17 +3637,17 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
|
||||
{
|
||||
}
|
||||
|
||||
if((event.LeftDown() || simulateClick) && hoverOverExpander)
|
||||
{
|
||||
wxDataViewTreeNode* node = GetTreeNodeByRow(current);
|
||||
// hoverOverExpander being true tells us that our node must be valid and have children.
|
||||
// So we don't need any extra checks.
|
||||
if( node->IsOpen() )
|
||||
OnCollapsing(current);
|
||||
else
|
||||
OnExpanding(current);
|
||||
}
|
||||
else if ((event.LeftDown() || simulateClick) && !hoverOverExpander)
|
||||
if((event.LeftDown() || simulateClick) && hoverOverExpander)
|
||||
{
|
||||
wxDataViewTreeNode* node = GetTreeNodeByRow(current);
|
||||
// hoverOverExpander being true tells us that our node must be valid and have children.
|
||||
// So we don't need any extra checks.
|
||||
if( node->IsOpen() )
|
||||
OnCollapsing(current);
|
||||
else
|
||||
OnExpanding(current);
|
||||
}
|
||||
else if ((event.LeftDown() || simulateClick) && !hoverOverExpander)
|
||||
{
|
||||
SetFocus();
|
||||
|
||||
@@ -3682,7 +3686,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
|
||||
ChangeCurrentRow(current);
|
||||
|
||||
unsigned int lineFrom = oldCurrentRow,
|
||||
lineTo = current;
|
||||
lineTo = current;
|
||||
|
||||
if ( lineTo < lineFrom )
|
||||
{
|
||||
@@ -3719,7 +3723,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
|
||||
model->GetValue( value, item, col->GetModelColumn() );
|
||||
cell->SetValue( value );
|
||||
wxRect cell_rect( xpos, GetLineStart( current ),
|
||||
col->GetWidth(), GetLineHeight( current ) );
|
||||
col->GetWidth(), GetLineHeight( current ) );
|
||||
/* ignore ret */ cell->LeftClick( event.GetPosition(), cell_rect, model, item, col->GetModelColumn());
|
||||
}
|
||||
}
|
||||
@@ -3784,8 +3788,8 @@ void wxDataViewCtrl::Init()
|
||||
}
|
||||
|
||||
bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
|
||||
const wxPoint& pos, const wxSize& size,
|
||||
long style, const wxValidator& validator )
|
||||
const wxPoint& pos, const wxSize& size,
|
||||
long style, const wxValidator& validator )
|
||||
{
|
||||
// if ( (style & wxBORDER_MASK) == 0)
|
||||
// style |= wxBORDER_SUNKEN;
|
||||
@@ -3827,8 +3831,8 @@ wxBorder wxDataViewCtrl::GetDefaultBorder() const
|
||||
|
||||
#ifdef __WXMSW__
|
||||
WXLRESULT wxDataViewCtrl::MSWWindowProc(WXUINT nMsg,
|
||||
WXWPARAM wParam,
|
||||
WXLPARAM lParam)
|
||||
WXWPARAM wParam,
|
||||
WXLPARAM lParam)
|
||||
{
|
||||
WXLRESULT rc = wxDataViewCtrlBase::MSWWindowProc(nMsg, wParam, lParam);
|
||||
|
||||
@@ -3848,7 +3852,7 @@ wxSize wxDataViewCtrl::GetSizeAvailableForScrollTarget(const wxSize& size)
|
||||
{
|
||||
wxSize newsize = size;
|
||||
if (!HasFlag(wxDV_NO_HEADER) && (m_headerArea))
|
||||
newsize.y -= m_headerArea->GetSize().y;
|
||||
newsize.y -= m_headerArea->GetSize().y;
|
||||
|
||||
return newsize;
|
||||
}
|
||||
@@ -3976,7 +3980,7 @@ wxDataViewColumn *wxDataViewCtrl::GetColumnAt(unsigned int pos) const
|
||||
// columns can't be reordered if there is no header window which allows
|
||||
// to do this
|
||||
const unsigned idx = m_headerArea ? m_headerArea->GetColumnsOrder()[pos]
|
||||
: pos;
|
||||
: pos;
|
||||
|
||||
return GetColumn(idx);
|
||||
}
|
||||
@@ -3994,7 +3998,7 @@ int wxDataViewCtrl::GetColumnIndex(const wxDataViewColumn *column) const
|
||||
}
|
||||
|
||||
void wxDataViewCtrl::ColumnMoved(wxDataViewColumn * WXUNUSED(col),
|
||||
unsigned int WXUNUSED(new_pos))
|
||||
unsigned int WXUNUSED(new_pos))
|
||||
{
|
||||
// do _not_ reorder m_cols elements here, they should always be in the
|
||||
// order in which columns were added, we only display the columns in
|
||||
@@ -4044,7 +4048,7 @@ int wxDataViewCtrl::GetColumnPosition( const wxDataViewColumn *column ) const
|
||||
wxDataViewColumn *wxDataViewCtrl::GetSortingColumn() const
|
||||
{
|
||||
return m_sortingColumnIdx == wxNOT_FOUND ? NULL
|
||||
: GetColumn(m_sortingColumnIdx);
|
||||
: GetColumn(m_sortingColumnIdx);
|
||||
}
|
||||
|
||||
//Selection code with wxDataViewItem as parameters
|
||||
@@ -4277,7 +4281,7 @@ bool wxDataViewCtrl::IsExpanded( const wxDataViewItem & item ) const
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
// !wxUSE_GENERICDATAVIEWCTRL
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user