📄 listbox.cpp
字号:
const wxString& wxMacListBoxItem::GetLabel() const
{
return m_label;
}
bool wxMacListBoxItem::IsLessThan(wxMacDataItemBrowserControl *owner ,
const wxMacDataItem* rhs,
DataBrowserPropertyID sortProperty) const
{
const wxMacListBoxItem* otherItem = dynamic_cast<const wxMacListBoxItem*>(rhs);
bool retval = false;
switch (sortProperty)
{
case kTextColumnId:
retval = m_label.CmpNoCase( otherItem->m_label) < 0;
break;
case kNumericOrderColumnId:
retval = m_order < otherItem->m_order;
break;
default:
break;
};
return retval;
}
OSStatus wxMacListBoxItem::GetSetData( wxMacDataItemBrowserControl *owner ,
DataBrowserPropertyID property,
DataBrowserItemDataRef itemData,
bool changeValue )
{
OSStatus err = errDataBrowserPropertyNotSupported;
wxListBox *list = wxDynamicCast( owner->GetPeer() , wxListBox );
wxCHECK_MSG( list != NULL , errDataBrowserPropertyNotSupported , wxT("Listbox expected"));
if ( !changeValue )
{
switch (property)
{
case kTextColumnId:
err = ::SetDataBrowserItemDataText( itemData, m_cfLabel );
err = noErr;
break;
case kNumericOrderColumnId:
err = ::SetDataBrowserItemDataValue( itemData, m_order );
err = noErr;
break;
default:
break;
}
}
else
{
switch (property)
{
// no editable props here
default:
break;
}
}
return err;
}
void wxMacListBoxItem::Notification(wxMacDataItemBrowserControl *owner ,
DataBrowserItemNotification message,
DataBrowserItemDataRef itemData ) const
{
wxMacDataBrowserListControl *lb = dynamic_cast<wxMacDataBrowserListControl*>(owner);
// we want to depend on as little as possible to make sure tear-down of controls is safe
if ( message == kDataBrowserItemRemoved)
{
if ( lb != NULL && lb->GetClientDataType() == wxClientData_Object )
{
delete (wxClientData*) (m_data);
}
delete this;
return;
}
wxListBox *list = wxDynamicCast( owner->GetPeer() , wxListBox );
wxCHECK_RET( list != NULL , wxT("Listbox expected"));
bool trigger = false;
wxCommandEvent event( wxEVT_COMMAND_LISTBOX_SELECTED, list->GetId() );
switch (message)
{
case kDataBrowserItemDeselected:
if ( list->HasMultipleSelection() )
trigger = !lb->IsSelectionSuppressed();
break;
case kDataBrowserItemSelected:
trigger = !lb->IsSelectionSuppressed();
break;
case kDataBrowserItemDoubleClicked:
event.SetEventType( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED );
trigger = true;
break;
default:
break;
}
if ( trigger )
{
event.SetEventObject( list );
if ( list->HasClientObjectData() )
event.SetClientObject( (wxClientData*) m_data );
else if ( list->HasClientUntypedData() )
event.SetClientData( m_data );
event.SetString( m_label );
event.SetInt( owner->GetLineFromItem( this ) );
event.SetExtraLong( list->HasMultipleSelection() ? message == kDataBrowserItemSelected : true );
wxPostEvent( list->GetEventHandler(), event );
// direct notification is not always having the listbox GetSelection() having in synch with event
// list->GetEventHandler()->ProcessEvent(event);
}
}
wxMacDataBrowserListControl::wxMacDataBrowserListControl( wxListBox *peer, const wxPoint& pos, const wxSize& size, long style)
: wxMacDataItemBrowserControl( peer, pos, size, style )
{
OSStatus err = noErr;
m_clientDataItemsType = wxClientData_None;
m_stringSorted = style & wxLB_SORT;
DataBrowserSelectionFlags options = kDataBrowserDragSelect;
if ( style & wxLB_MULTIPLE )
{
options |= kDataBrowserAlwaysExtendSelection | kDataBrowserCmdTogglesSelection;
}
else if ( style & wxLB_EXTENDED )
{
// default behaviour
}
else
{
options |= kDataBrowserSelectOnlyOne;
}
err = SetSelectionFlags( options );
verify_noerr( err );
DataBrowserListViewColumnDesc columnDesc;
columnDesc.headerBtnDesc.titleOffset = 0;
columnDesc.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
columnDesc.headerBtnDesc.btnFontStyle.flags =
kControlUseFontMask | kControlUseJustMask;
columnDesc.headerBtnDesc.btnContentInfo.contentType = kControlNoContent;
columnDesc.headerBtnDesc.btnFontStyle.just = teFlushDefault;
columnDesc.headerBtnDesc.btnFontStyle.font = kControlFontViewSystemFont;
columnDesc.headerBtnDesc.btnFontStyle.style = normal;
columnDesc.headerBtnDesc.titleString = NULL;
columnDesc.headerBtnDesc.minimumWidth = 0;
columnDesc.headerBtnDesc.maximumWidth = 10000;
columnDesc.propertyDesc.propertyID = kTextColumnId;
columnDesc.propertyDesc.propertyType = kDataBrowserTextType;
columnDesc.propertyDesc.propertyFlags = kDataBrowserTableViewSelectionColumn;
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
#endif
verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
columnDesc.headerBtnDesc.minimumWidth = 0;
columnDesc.headerBtnDesc.maximumWidth = 0;
columnDesc.propertyDesc.propertyID = kNumericOrderColumnId;
columnDesc.propertyDesc.propertyType = kDataBrowserPropertyRelevanceRankPart;
columnDesc.propertyDesc.propertyFlags = kDataBrowserTableViewSelectionColumn;
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
columnDesc.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn;
#endif
verify_noerr( AddColumn( &columnDesc, kDataBrowserListViewAppendColumn ) );
SetDataBrowserSortProperty( m_controlRef , kTextColumnId);
if ( m_stringSorted )
{
SetDataBrowserSortProperty( m_controlRef , kTextColumnId);
SetDataBrowserSortOrder( m_controlRef , kDataBrowserOrderIncreasing);
}
else
{
SetDataBrowserSortProperty( m_controlRef , kNumericOrderColumnId);
SetDataBrowserSortOrder( m_controlRef , kDataBrowserOrderIncreasing);
}
verify_noerr( AutoSizeColumns() );
verify_noerr( SetHiliteStyle(kDataBrowserTableViewFillHilite ) );
verify_noerr( SetHeaderButtonHeight( 0 ) );
err = SetHasScrollBars( (style & wxHSCROLL) != 0 , true );
#if 0
// shouldn't be necessary anymore under 10.2
m_peer->SetData( kControlNoPart, kControlDataBrowserIncludesFrameAndFocusTag, (Boolean)false );
m_peer->SetNeedsFocusRect( true );
#endif
}
wxMacDataBrowserListControl::~wxMacDataBrowserListControl()
{
}
wxMacListBoxItem* wxMacDataBrowserListControl::CreateItem()
{
return new wxMacListBoxItem();
}
wxListBox * wxMacDataBrowserListControl::GetPeer() const
{
return wxDynamicCast( wxMacControl::GetPeer() , wxListBox );
}
wxClientDataType wxMacDataBrowserListControl::GetClientDataType() const
{
return m_clientDataItemsType;
}
void wxMacDataBrowserListControl::SetClientDataType(wxClientDataType clientDataItemsType)
{
m_clientDataItemsType = clientDataItemsType;
}
unsigned int wxMacDataBrowserListControl::MacGetCount() const
{
return GetItemCount(wxMacDataBrowserRootContainer,false,kDataBrowserItemAnyState);
}
void wxMacDataBrowserListControl::MacDelete( unsigned int n )
{
wxMacListBoxItem* item = (wxMacListBoxItem*)GetItemFromLine( n );
RemoveItem( wxMacDataBrowserRootContainer, item );
}
void wxMacDataBrowserListControl::MacInsert( unsigned int n, const wxString& text)
{
wxMacListBoxItem* newItem = CreateItem();
newItem->SetLabel( text );
if ( !m_stringSorted )
{
// increase the order of the lines to be shifted
unsigned int lines = MacGetCount();
for ( unsigned int i = n; i < lines; ++i)
{
wxMacListBoxItem* iter = (wxMacListBoxItem*) GetItemFromLine(i);
iter->SetOrder( iter->GetOrder() + 1 );
}
SInt32 frontLineOrder = 0;
if ( n > 0 )
{
wxMacListBoxItem* iter = (wxMacListBoxItem*) GetItemFromLine(n-1);
frontLineOrder = iter->GetOrder();
}
newItem->SetOrder( frontLineOrder + 1 );
}
AddItem( wxMacDataBrowserRootContainer, newItem );
}
void wxMacDataBrowserListControl::MacInsert( unsigned int n, const wxArrayString& items)
{
size_t itemsCount = items.GetCount();
if ( itemsCount == 0 )
return;
SInt32 frontLineOrder = 0;
if ( !m_stringSorted )
{
// increase the order of the lines to be shifted
unsigned int lines = MacGetCount();
for ( unsigned int i = n; i < lines; ++i)
{
wxMacListBoxItem* iter = (wxMacListBoxItem*) GetItemFromLine(i);
iter->SetOrder( iter->GetOrder() + itemsCount );
}
if ( n > 0 )
{
wxMacListBoxItem* iter = (wxMacListBoxItem*) GetItemFromLine(n-1);
frontLineOrder = iter->GetOrder();
}
}
wxArrayMacDataItemPtr ids;
ids.SetCount( itemsCount );
for ( unsigned int i = 0; i < itemsCount; ++i )
{
wxMacListBoxItem* item = CreateItem();
item->SetLabel( items[i]);
if ( !m_stringSorted )
item->SetOrder( frontLineOrder + 1 + i );
ids[i] = item;
}
AddItems( wxMacDataBrowserRootContainer, ids );
}
int wxMacDataBrowserListControl::MacAppend( const wxString& text)
{
wxMacListBoxItem* item = CreateItem();
item->SetLabel( text );
if ( !m_stringSorted )
{
unsigned int lines = MacGetCount();
if ( lines == 0 )
item->SetOrder( 1 );
else
{
wxMacListBoxItem* frontItem = (wxMacListBoxItem*) GetItemFromLine(lines-1);
item->SetOrder( frontItem->GetOrder() + 1 );
}
}
AddItem( wxMacDataBrowserRootContainer, item );
return GetLineFromItem(item);
}
void wxMacDataBrowserListControl::MacClear()
{
wxMacDataItemBrowserSelectionSuppressor suppressor(this);
RemoveAllItems(wxMacDataBrowserRootContainer);
}
void wxMacDataBrowserListControl::MacDeselectAll()
{
wxMacDataItemBrowserSelectionSuppressor suppressor(this);
SetSelectedAllItems( kDataBrowserItemsRemove );
}
void wxMacDataBrowserListControl::MacSetSelection( unsigned int n, bool select )
{
wxMacListBoxItem* item = (wxMacListBoxItem*) GetItemFromLine(n);
wxMacDataItemBrowserSelectionSuppressor suppressor(this);
if ( IsItemSelected( item ) != select )
{
if ( select )
SetSelectedItem( item, GetPeer()->HasMultipleSelection() ? kDataBrowserItemsAdd : kDataBrowserItemsAssign );
else
SetSelectedItem( item, kDataBrowserItemsRemove );
}
MacScrollTo( n );
}
bool wxMacDataBrowserListControl::MacIsSelected( unsigned int n ) const
{
wxMacListBoxItem* item = (wxMacListBoxItem*) GetItemFromLine(n);
return IsItemSelected( item );
}
int wxMacDataBrowserListControl::MacGetSelection() const
{
wxMacDataItemPtr first, last;
GetSelectionAnchor( &first, &last );
if ( first != NULL )
{
return GetLineFromItem( first );
}
return -1;
}
int wxMacDataBrowserListControl::MacGetSelections( wxArrayInt& aSelections ) const
{
aSelections.Empty();
wxArrayMacDataItemPtr selectedItems;
GetItems( wxMacDataBrowserRootContainer, false , kDataBrowserItemIsSelected, selectedItems);
int count = selectedItems.GetCount();
for ( int i = 0; i < count; ++i)
{
aSelections.Add(GetLineFromItem(selectedItems[i]));
}
return count;
}
void wxMacDataBrowserListControl::MacSetString( unsigned int n, const wxString& text )
{
// as we don't store the strings we only have to issue a redraw
wxMacListBoxItem* item = (wxMacListBoxItem*) GetItemFromLine( n);
item->SetLabel( text );
UpdateItem( wxMacDataBrowserRootContainer, item , kTextColumnId );
}
wxString wxMacDataBrowserListControl::MacGetString( unsigned int n ) const
{
wxMacListBoxItem * item = (wxMacListBoxItem*) GetItemFromLine( n );
return item->GetLabel();
}
void wxMacDataBrowserListControl::MacSetClientData( unsigned int n, void * data)
{
wxMacListBoxItem* item = (wxMacListBoxItem*) GetItemFromLine( n);
item->SetData( data );
// not displayed, therefore no Update infos to DataBrowser
}
void * wxMacDataBrowserListControl::MacGetClientData( unsigned int n) const
{
wxMacListBoxItem * item = (wxMacListBoxItem*) GetItemFromLine( n );
return item->GetData();
}
void wxMacDataBrowserListControl::MacScrollTo( unsigned int n )
{
RevealItem( GetItemFromLine( n) , kDataBrowserRevealWithoutSelecting );
}
#if 0
// in case we need that one day
// ============================================================================
// HIView owner-draw-based implementation
// ============================================================================
static pascal void ListBoxDrawProc(
ControlRef browser, DataBrowserItemID item, DataBrowserPropertyID property,
DataBrowserItemState itemState, const Rect *itemRect, SInt16 depth, Boolean isColorDevice )
{
CFStringRef cfString;
ThemeDrawingState themeState;
long systemVersion;
GetThemeDrawingState( &themeState );
cfString = CFStringCreateWithFormat( NULL, NULL, CFSTR("Row %d"), item );
// In this sample we handle the "selected" state; all others fall through to our "active" state
if ( itemState == kDataBrowserItemIsSelected )
{
ThemeBrush colorBrushID;
// TODO: switch over to wxSystemSettingsNative::GetColour() when kThemeBrushSecondaryHighlightColor
// is incorporated Panther DB starts using kThemeBrushSecondaryHighlightColor
// for inactive browser highlighting
Gestalt( gestaltSystemVersion, &systemVersion );
if ( (systemVersion >= 0x00001030) && !IsControlActive( browser ) )
colorBrushID = kThemeBrushSecondaryHighlightColor;
else
colorBrushID = kThemeBrushPrimaryHighlightColor;
// First paint the hilite rect, then the text on top
SetThemePen( colorBrushID, 32, true );
PaintRect( itemRect );
SetThemeDrawingState( themeState, false );
}
DrawThemeTextBox( cfString, kThemeApplicationFont, kThemeStateActive, true, itemRect, teFlushDefault, NULL );
SetThemeDrawingState( themeState, true );
if ( cfString != NULL )
CFRelease( cfString );
}
#endif
#endif // wxUSE_LISTBOX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -