⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listbox.cpp

📁 Wxpython Implemented on Windows CE, Source code
💻 CPP
📖 第 1 页 / 共 2 页
字号:

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 + -