Use string column identifiers with NSTableColumns in wxDataViewCtrl.
Starting with OS X 10.7 the column identifiers used in NSOutlineView must be of type NSString, so convert the code to use string identifiers instead of wxPointerObject. Closes #13661. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69996 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
d86b82bb2c
commit
fc672a2aba
@ -156,11 +156,46 @@ inline wxDataViewItem wxDataViewItemFromMaybeNilItem(id item)
|
||||
{
|
||||
}
|
||||
|
||||
// Get the identifier we use for the specified column. This should be used
|
||||
// for finding columns from identifier only, to initialize the identifier
|
||||
// of a new column use initWithColumnPointer below instead.
|
||||
+(NSString*) identifierForColumnPointer:(const wxDataViewColumn*)column;
|
||||
|
||||
// Initialize the column with the given pointer to the associated
|
||||
// wxDataViewColumn. This pointer can later be retrieved using
|
||||
// getColumnPointer.
|
||||
-(id) initWithColumnPointer:(const wxDataViewColumn*)column;
|
||||
|
||||
// Retrieve the associated column.
|
||||
-(wxDataViewColumn*) getColumnPointer;
|
||||
|
||||
-(id) dataCellForRow:(NSInteger)row;
|
||||
@end
|
||||
|
||||
@implementation wxDVCNSTableColumn
|
||||
|
||||
+(NSString*) identifierForColumnPointer:(const wxDataViewColumn*)column
|
||||
{
|
||||
// Starting from OS X 10.7 the column identifier must be an NSString and
|
||||
// not just some arbitrary object, so we serialize the pointer into the
|
||||
// string. Notice the use of NSInteger which is big enough to store a
|
||||
// pointer in both 32 and 64 bit builds.
|
||||
return [NSString stringWithFormat:@"%lu", reinterpret_cast<NSUInteger>(column)];
|
||||
}
|
||||
|
||||
-(id) initWithColumnPointer:(const wxDataViewColumn*)column
|
||||
{
|
||||
[self initWithIdentifier: [wxDVCNSTableColumn identifierForColumnPointer:column]];
|
||||
return self;
|
||||
}
|
||||
|
||||
-(wxDataViewColumn*) getColumnPointer
|
||||
{
|
||||
// The case to NSString is needed for OS X < 10.7.
|
||||
return reinterpret_cast<wxDataViewColumn*>(
|
||||
[static_cast<NSString*>([self identifier]) integerValue]);
|
||||
}
|
||||
|
||||
-(id) dataCellForRow:(NSInteger)row
|
||||
{
|
||||
// what we want to do here is to simply return nil for the cells which
|
||||
@ -168,13 +203,7 @@ inline wxDataViewItem wxDataViewItemFromMaybeNilItem(id item)
|
||||
// or progress cells in the columns using the corresponding types even for
|
||||
// the container rows which is wrong
|
||||
|
||||
// half of the problem is just finding the objects we need from the column
|
||||
// pointer which is itself stashed inside wxPointerObject which we use as
|
||||
// our identifier
|
||||
const wxDataViewColumn * const
|
||||
dvCol = static_cast<wxDataViewColumn *>(
|
||||
[(wxPointerObject *)[self identifier] pointer]
|
||||
);
|
||||
const wxDataViewColumn * const dvCol = [self getColumnPointer];
|
||||
|
||||
const wxDataViewCtrl * const dvc = dvCol->GetOwner();
|
||||
const wxCocoaDataViewControl * const
|
||||
@ -316,10 +345,7 @@ NSTableColumn* CreateNativeColumn(const wxDataViewColumn *column)
|
||||
wxCHECK_MSG( renderer, NULL, "column should have a renderer" );
|
||||
|
||||
wxDVCNSTableColumn * const nativeColumn(
|
||||
[[wxDVCNSTableColumn alloc] initWithIdentifier:
|
||||
[[[wxPointerObject alloc] initWithPointer:
|
||||
const_cast<wxDataViewColumn*>(column)]
|
||||
autorelease]]
|
||||
[[wxDVCNSTableColumn alloc] initWithColumnPointer: column]
|
||||
);
|
||||
|
||||
// setting the size related parameters:
|
||||
@ -664,7 +690,8 @@ outlineView:(NSOutlineView*)outlineView
|
||||
|
||||
wxCHECK_MSG( model, nil, "Valid model in data source does not exist." );
|
||||
|
||||
wxDataViewColumn* col(static_cast<wxDataViewColumn*>([(wxPointerObject*)[tableColumn identifier] pointer]));
|
||||
wxDataViewColumn* const
|
||||
col([static_cast<wxDVCNSTableColumn*>(tableColumn) getColumnPointer]);
|
||||
const unsigned colIdx = col->GetModelColumn();
|
||||
|
||||
wxDataViewItem dataViewItem(wxDataViewItemFromItem(item));
|
||||
@ -687,7 +714,8 @@ outlineView:(NSOutlineView*)outlineView
|
||||
{
|
||||
wxUnusedVar(outlineView);
|
||||
|
||||
wxDataViewColumn* col(static_cast<wxDataViewColumn*>([(wxPointerObject*)[tableColumn identifier] pointer]));
|
||||
wxDataViewColumn* const
|
||||
col([static_cast<wxDVCNSTableColumn*>(tableColumn) getColumnPointer]);
|
||||
|
||||
col->GetRenderer()->
|
||||
OSXOnCellChanged(object, wxDataViewItemFromItem(item), col->GetModelColumn());
|
||||
@ -1624,7 +1652,8 @@ outlineView:(NSOutlineView*)outlineView
|
||||
//
|
||||
-(void) outlineView:(NSOutlineView*)outlineView mouseDownInHeaderOfTableColumn:(NSTableColumn*)tableColumn
|
||||
{
|
||||
wxDataViewColumn* const col(static_cast<wxDataViewColumn*>([(wxPointerObject*)[tableColumn identifier] pointer]));
|
||||
wxDataViewColumn* const
|
||||
col([static_cast<wxDVCNSTableColumn*>(tableColumn) getColumnPointer]);
|
||||
|
||||
wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl();
|
||||
|
||||
@ -1719,7 +1748,8 @@ outlineView:(NSOutlineView*)outlineView
|
||||
wxDataViewCtrl * const dvc = implementation->GetDataViewCtrl();
|
||||
wxDataViewModel * const model = dvc->GetModel();
|
||||
|
||||
wxDataViewColumn* const dvCol(static_cast<wxDataViewColumn*>([(wxPointerObject*)[tableColumn identifier] pointer]));
|
||||
wxDataViewColumn* const
|
||||
dvCol([static_cast<wxDVCNSTableColumn*>(tableColumn) getColumnPointer]);
|
||||
const unsigned colIdx = dvCol->GetModelColumn();
|
||||
|
||||
wxDataViewItem dvItem(wxDataViewItemFromItem(item));
|
||||
@ -1756,7 +1786,10 @@ outlineView:(NSOutlineView*)outlineView
|
||||
{
|
||||
int const newColumnPosition = [[[notification userInfo] objectForKey:@"NSNewColumn"] intValue];
|
||||
|
||||
wxDataViewColumn* const col(static_cast<wxDataViewColumn*>([(wxPointerObject*)[[[self tableColumns] objectAtIndex:newColumnPosition] identifier] pointer]));
|
||||
NSTableColumn*
|
||||
tableColumn = [[self tableColumns] objectAtIndex:newColumnPosition];
|
||||
wxDataViewColumn* const
|
||||
col([static_cast<wxDVCNSTableColumn*>(tableColumn) getColumnPointer]);
|
||||
|
||||
wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl();
|
||||
|
||||
@ -1823,9 +1856,10 @@ outlineView:(NSOutlineView*)outlineView
|
||||
currentlyEditedColumn = [self editedColumn];
|
||||
currentlyEditedRow = [self editedRow];
|
||||
|
||||
wxDataViewColumn* const col =
|
||||
static_cast<wxDataViewColumn*>(
|
||||
[(wxPointerObject*)[[[self tableColumns] objectAtIndex:currentlyEditedColumn] identifier] pointer]);
|
||||
NSTableColumn*
|
||||
tableColumn = [[self tableColumns] objectAtIndex:currentlyEditedColumn];
|
||||
wxDataViewColumn* const
|
||||
col([static_cast<wxDVCNSTableColumn*>(tableColumn) getColumnPointer]);
|
||||
|
||||
wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl();
|
||||
|
||||
@ -1861,9 +1895,10 @@ outlineView:(NSOutlineView*)outlineView
|
||||
// been sent the last edited column/row are valid:
|
||||
if ( currentlyEditedColumn != -1 && currentlyEditedRow != -1 )
|
||||
{
|
||||
wxDataViewColumn* const col =
|
||||
static_cast<wxDataViewColumn*>(
|
||||
[(wxPointerObject*)[[[self tableColumns] objectAtIndex:currentlyEditedColumn] identifier] pointer]);
|
||||
NSTableColumn*
|
||||
tableColumn = [[self tableColumns] objectAtIndex:currentlyEditedColumn];
|
||||
wxDataViewColumn* const
|
||||
col([static_cast<wxDVCNSTableColumn*>(tableColumn) getColumnPointer]);
|
||||
|
||||
wxDataViewCtrl* const dvc = implementation->GetDataViewCtrl();
|
||||
|
||||
@ -1965,7 +2000,7 @@ bool wxCocoaDataViewControl::DeleteColumn(wxDataViewColumn* columnPtr)
|
||||
[m_OutlineView setOutlineTableColumn:nil]; // due to a bug this does not work
|
||||
[m_OutlineView removeTableColumn:columnPtr->GetNativeData()->GetNativeColumnPtr()]; // due to a confirmed bug #6555162 the deletion does not work for
|
||||
// outline table columns (... and there is no workaround)
|
||||
return (([m_OutlineView columnWithIdentifier:[[[wxPointerObject alloc] initWithPointer:columnPtr] autorelease]]) == -1);
|
||||
return (([m_OutlineView columnWithIdentifier:[wxDVCNSTableColumn identifierForColumnPointer:columnPtr]]) == -1);
|
||||
}
|
||||
|
||||
void wxCocoaDataViewControl::DoSetExpanderColumn(const wxDataViewColumn *columnPtr)
|
||||
@ -1975,12 +2010,13 @@ void wxCocoaDataViewControl::DoSetExpanderColumn(const wxDataViewColumn *columnP
|
||||
|
||||
wxDataViewColumn* wxCocoaDataViewControl::GetColumn(unsigned int pos) const
|
||||
{
|
||||
return static_cast<wxDataViewColumn*>([(wxPointerObject*)[[[m_OutlineView tableColumns] objectAtIndex:pos] identifier] pointer]);
|
||||
NSTableColumn* tableColumn = [[m_OutlineView tableColumns] objectAtIndex:pos];
|
||||
return [static_cast<wxDVCNSTableColumn*>(tableColumn) getColumnPointer];
|
||||
}
|
||||
|
||||
int wxCocoaDataViewControl::GetColumnPosition(const wxDataViewColumn *columnPtr) const
|
||||
{
|
||||
return [m_OutlineView columnWithIdentifier:[[[wxPointerObject alloc] initWithPointer:const_cast<wxDataViewColumn*>(columnPtr)] autorelease]];
|
||||
return [m_OutlineView columnWithIdentifier:[wxDVCNSTableColumn identifierForColumnPointer:columnPtr]];
|
||||
}
|
||||
|
||||
bool wxCocoaDataViewControl::InsertColumn(unsigned int pos, wxDataViewColumn* columnPtr)
|
||||
@ -2324,7 +2360,7 @@ wxDataViewColumn* wxCocoaDataViewControl::GetSortingColumn() const
|
||||
|
||||
for (UInt32 i=0; i<noOfColumns; ++i)
|
||||
if ([[columns objectAtIndex:i] sortDescriptorPrototype] != nil)
|
||||
return static_cast<wxDataViewColumn*>([(wxPointerObject*)[[columns objectAtIndex:i] identifier] pointer]);
|
||||
return GetColumn(i);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -2359,7 +2395,7 @@ void wxCocoaDataViewControl::HitTest(const wxPoint& point, wxDataViewItem& item,
|
||||
indexRow = [m_OutlineView rowAtPoint: nativePoint];
|
||||
if ((indexColumn >= 0) && (indexRow >= 0))
|
||||
{
|
||||
columnPtr = static_cast<wxDataViewColumn*>([(wxPointerObject*)[[[m_OutlineView tableColumns] objectAtIndex:indexColumn] identifier] pointer]);
|
||||
columnPtr = GetColumn(indexColumn);
|
||||
item = wxDataViewItem([[m_OutlineView itemAtRow:indexRow] pointer]);
|
||||
}
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user