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

📄 textctrl.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
void wxMacMLTEControl::SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ){    wxMacEditHelper help( m_txn ) ;    TXNSetAttribute( wxTextAttr( foreground, wxNullColour, font ), kTXNStartOffset, kTXNEndOffset ) ;}void wxMacMLTEControl::SetStyle( long start, long end, const wxTextAttr& style ){    wxMacEditHelper help( m_txn ) ;    TXNSetAttribute( style, start, end ) ;}void wxMacMLTEControl::Copy(){    ClearCurrentScrap();    TXNCopy( m_txn );    TXNConvertToPublicScrap();}void wxMacMLTEControl::Cut(){    ClearCurrentScrap();    TXNCut( m_txn );    TXNConvertToPublicScrap();}void wxMacMLTEControl::Paste(){    TXNConvertFromPublicScrap();    TXNPaste( m_txn );}bool wxMacMLTEControl::CanPaste() const{    return TXNIsScrapPastable() ;}void wxMacMLTEControl::SetEditable(bool editable){    TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;    TXNControlData data[] = { { editable ? kTXNReadWrite : kTXNReadOnly } } ;    TXNSetTXNObjectControls( m_txn, false, WXSIZEOF(tag), tag, data ) ;}wxTextPos wxMacMLTEControl::GetLastPosition() const{    wxTextPos actualsize = 0 ;    Handle theText ;    OSErr err = TXNGetDataEncoded( m_txn, kTXNStartOffset, kTXNEndOffset, &theText, kTXNTextData );    // all done    if ( err == noErr )    {        actualsize = GetHandleSize( theText ) ;        DisposeHandle( theText ) ;    }    else    {        actualsize = 0 ;    }    return actualsize ;}void wxMacMLTEControl::Replace( long from , long to , const wxString &str ){    wxString value = str ;    wxMacConvertNewlines10To13( &value ) ;    wxMacEditHelper help( m_txn ) ;#ifndef __LP64__    wxMacWindowClipper c( m_peer ) ;#endif    TXNSetSelection( m_txn, from, to ) ;    TXNClear( m_txn ) ;    SetTXNData( value, kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;}void wxMacMLTEControl::Remove( long from , long to ){#ifndef __LP64__    wxMacWindowClipper c( m_peer ) ;#endif    wxMacEditHelper help( m_txn ) ;    TXNSetSelection( m_txn , from , to ) ;    TXNClear( m_txn ) ;}void wxMacMLTEControl::GetSelection( long* from, long* to) const{    TXNGetSelection( m_txn , (TXNOffset*) from , (TXNOffset*) to ) ;}void wxMacMLTEControl::SetSelection( long from , long to ){#ifndef __LP64__    wxMacWindowClipper c( m_peer ) ;#endif    // change the selection    if ((from == -1) && (to == -1))        TXNSelectAll( m_txn );    else        TXNSetSelection( m_txn, from, to );    TXNShowSelection( m_txn, kTXNShowStart );}void wxMacMLTEControl::WriteText( const wxString& str ){    wxString st = str ;    wxMacConvertNewlines10To13( &st ) ;    long start , end , dummy ;    GetSelection( &start , &dummy ) ;#ifndef __LP64__    wxMacWindowClipper c( m_peer ) ;#endif    {        wxMacEditHelper helper( m_txn ) ;        SetTXNData( st, kTXNUseCurrentSelection, kTXNUseCurrentSelection ) ;    }    GetSelection( &dummy, &end ) ;    // TODO: SetStyle( start , end , GetDefaultStyle() ) ;}void wxMacMLTEControl::Clear(){#ifndef __LP64__    wxMacWindowClipper c( m_peer ) ;#endif    wxMacEditHelper st( m_txn ) ;    TXNSetSelection( m_txn , kTXNStartOffset , kTXNEndOffset ) ;    TXNClear( m_txn ) ;}bool wxMacMLTEControl::CanUndo() const{    return TXNCanUndo( m_txn , NULL ) ;}void wxMacMLTEControl::Undo(){    TXNUndo( m_txn ) ;}bool wxMacMLTEControl::CanRedo() const{    return TXNCanRedo( m_txn , NULL ) ;}void wxMacMLTEControl::Redo(){    TXNRedo( m_txn ) ;}int wxMacMLTEControl::GetNumberOfLines() const{    ItemCount lines = 0 ;    TXNGetLineCount( m_txn, &lines ) ;    return lines ;}long wxMacMLTEControl::XYToPosition(long x, long y) const{    Point curpt ;    wxTextPos lastpos ;    // TODO: find a better implementation : while we can get the    // line metrics of a certain line, we don't get its starting    // position, so it would probably be rather a binary search    // for the start position    long xpos = 0, ypos = 0 ;    int lastHeight = 0 ;    ItemCount n ;    lastpos = GetLastPosition() ;    for ( n = 0 ; n <= (ItemCount) lastpos ; ++n )    {        if ( y == ypos && x == xpos )            return n ;        TXNOffsetToPoint( m_txn, n, &curpt ) ;        if ( curpt.v > lastHeight )        {            xpos = 0 ;            if ( n > 0 )                ++ypos ;            lastHeight = curpt.v ;        }        else            ++xpos ;    }    return 0 ;}bool wxMacMLTEControl::PositionToXY( long pos, long *x, long *y ) const{    Point curpt ;    wxTextPos lastpos ;    if ( y )        *y = 0 ;    if ( x )        *x = 0 ;    lastpos = GetLastPosition() ;    if ( pos <= lastpos )    {        // TODO: find a better implementation - while we can get the        // line metrics of a certain line, we don't get its starting        // position, so it would probably be rather a binary search        // for the start position        long xpos = 0, ypos = 0 ;        int lastHeight = 0 ;        ItemCount n ;        for ( n = 0 ; n <= (ItemCount) pos ; ++n )        {            TXNOffsetToPoint( m_txn, n, &curpt ) ;            if ( curpt.v > lastHeight )            {                xpos = 0 ;                if ( n > 0 )                    ++ypos ;                lastHeight = curpt.v ;            }            else                ++xpos ;        }        if ( y )            *y = ypos ;        if ( x )            *x = xpos ;    }    return false ;}void wxMacMLTEControl::ShowPosition( long pos ){    Point current, desired ;    TXNOffset selstart, selend;    TXNGetSelection( m_txn, &selstart, &selend );    TXNOffsetToPoint( m_txn, selstart, &current );    TXNOffsetToPoint( m_txn, pos, &desired );    // TODO: use HIPoints for 10.3 and above    OSErr theErr = noErr;    long dv = desired.v - current.v;    long dh = desired.h - current.h;    TXNShowSelection( m_txn, kTXNShowStart ) ; // NB: should this be kTXNShowStart or kTXNShowEnd ??    theErr = TXNScroll( m_txn, kTXNScrollUnitsInPixels, kTXNScrollUnitsInPixels, &dv, &dh );    // there will be an error returned for classic MLTE implementation when the control is    // invisible, but HITextView works correctly, so we don't assert that one    // wxASSERT_MSG( theErr == noErr, _T("TXNScroll returned an error!") );}void wxMacMLTEControl::SetTXNData( const wxString& st, TXNOffset start, TXNOffset end ){#if wxUSE_UNICODE#if SIZEOF_WCHAR_T == 2    size_t len = st.length() ;    TXNSetData( m_txn, kTXNUnicodeTextData, (void*)st.wc_str(), len * 2, start, end );#else    wxMBConvUTF16 converter ;    ByteCount byteBufferLen = converter.WC2MB( NULL, st.wc_str(), 0 ) ;    UniChar *unibuf = (UniChar*)malloc( byteBufferLen ) ;    converter.WC2MB( (char*)unibuf, st.wc_str(), byteBufferLen ) ;    TXNSetData( m_txn, kTXNUnicodeTextData, (void*)unibuf, byteBufferLen, start, end ) ;    free( unibuf ) ;#endif#else    wxCharBuffer text = st.mb_str( wxConvLocal ) ;    TXNSetData( m_txn, kTXNTextData, (void*)text.data(), strlen( text ), start, end ) ;#endif}wxString wxMacMLTEControl::GetLineText(long lineNo) const{    wxString line ;    if ( lineNo < GetNumberOfLines() )    {        Point firstPoint;        Fixed lineWidth, lineHeight, currentHeight;        long ypos ;        // get the first possible position in the control        TXNOffsetToPoint(m_txn, 0, &firstPoint);        // Iterate through the lines until we reach the one we want,        // adding to our current y pixel point position        ypos = 0 ;        currentHeight = 0;        while (ypos < lineNo)        {            TXNGetLineMetrics(m_txn, ypos++, &lineWidth, &lineHeight);            currentHeight += lineHeight;        }        Point thePoint = { firstPoint.v + (currentHeight >> 16), firstPoint.h + (0) };        TXNOffset theOffset;        TXNPointToOffset(m_txn, thePoint, &theOffset);        wxString content = GetStringValue() ;        Point currentPoint = thePoint;        while (thePoint.v == currentPoint.v && theOffset < content.length())        {            line += content[theOffset];            TXNOffsetToPoint(m_txn, ++theOffset, &currentPoint);        }    }    return line ;}int wxMacMLTEControl::GetLineLength(long lineNo) const{    int theLength = 0;    if ( lineNo < GetNumberOfLines() )    {        Point firstPoint;        Fixed lineWidth, lineHeight, currentHeight;        long ypos;        // get the first possible position in the control        TXNOffsetToPoint(m_txn, 0, &firstPoint);        // Iterate through the lines until we reach the one we want,        // adding to our current y pixel point position        ypos = 0;        currentHeight = 0;        while (ypos < lineNo)        {            TXNGetLineMetrics(m_txn, ypos++, &lineWidth, &lineHeight);            currentHeight += lineHeight;        }        Point thePoint = { firstPoint.v + (currentHeight >> 16), firstPoint.h + (0) };        TXNOffset theOffset;        TXNPointToOffset(m_txn, thePoint, &theOffset);        wxString content = GetStringValue() ;        Point currentPoint = thePoint;        while (thePoint.v == currentPoint.v && theOffset < content.length())        {            ++theLength;            TXNOffsetToPoint(m_txn, ++theOffset, &currentPoint);        }    }    return theLength ;}#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5// ----------------------------------------------------------------------------// MLTE control implementation (classic part)// ----------------------------------------------------------------------------// OS X Notes : We still don't have a full replacement for MLTE, so this implementation// has to live on. We have different problems coming from outdated implementations on the// various OS X versions. Most deal with the scrollbars: they are not correctly embedded// while this can be solved on 10.3 by reassigning them the correct place, on 10.2 there is// no way out, therefore we are using our own implementation and our own scrollbars ....#ifdef __WXMAC_OSX__TXNScrollInfoUPP gTXNScrollInfoProc = NULL ;ControlActionUPP gTXNScrollActionProc = NULL ;pascal void wxMacMLTEClassicControl::TXNScrollInfoProc(    SInt32 iValue, SInt32 iMaximumValue,    TXNScrollBarOrientation iScrollBarOrientation, SInt32 iRefCon ){    wxMacMLTEClassicControl* mlte = (wxMacMLTEClassicControl*) iRefCon ;    SInt32 value =  wxMax( iValue , 0 ) ;    SInt32 maximum = wxMax( iMaximumValue , 0 ) ;    if ( iScrollBarOrientation == kTXNHorizontal )    {        if ( mlte->m_sbHorizontal )        {            SetControl32BitValue( mlte->m_sbHorizontal , value ) ;            SetControl32BitMaximum( mlte->m_sbHorizontal , maximum ) ;            mlte->m_lastHorizontalValue = value ;        }    }    else if ( iScrollBarOrientation == kTXNVertical )    {        if ( mlte->m_sbVertical )        {            SetControl32BitValue( mlte->m_sbVertical , value ) ;            SetControl32BitMaximum( mlte->m_sbVertical , maximum ) ;            mlte->m_lastVerticalValue = value ;        }    }}pascal void wxMacMLTEClassicControl::TXNScrollActionProc( ControlRef controlRef , ControlPartCode partCode ){    wxMacMLTEClassicControl* mlte = (wxMacMLTEClassicControl*) GetControlReference( controlRef ) ;    if ( mlte == NULL )        return ;    if ( controlRef != mlte->m_sbVertical && controlRef != mlte->m_sbHorizontal )        return ;    OSStatus err ;    bool isHorizontal = ( controlRef == mlte->m_sbHorizontal ) ;    SInt32 minimum = 0 ;    SInt32 maximum = GetControl32BitMaximum( controlRef ) ;    SInt32 value = GetControl32BitValue( controlRef ) ;    SInt32 delta = 0;    switch ( partCode )    {        case kControlDownButtonPart :            delta = 10 ;            break ;        case kControlUpButtonPart :            delta = -10 ;            break ;        case kControlPageDownPart :            delta = GetControlViewSize( controlRef ) ;            break ;        case kControlPageUpPart :            delta = -GetControlViewSize( controlRef ) ;            break ;        case kControlIndicatorPart :            delta = value - (isHorizontal ? mlte->m_lastHorizontalValue : mlte->m_lastVerticalValue) ;            break ;        default :            break ;    }    if ( delta != 0 )    {        SInt32 newValue = value ;        if ( partCode != kControlIndicatorPart )        {            if ( value + delta < minimum )                delta = minimum - value ;            if ( value + delta > maximum )                delta = maximum - value ;            SetControl32BitValue( controlRef , value + delta ) ;            newValue = value + delta ;        }        SInt32 verticalDelta = isHorizontal ? 0 : delta ;        SInt32 horizontalDelta = isHorizontal ? delta : 0 ;        err = TXNScroll(            mlte->m_txn, kTXNScrollUnitsInPixels, kTXNScrollUnitsInPixels,            &verticalDelta, &horizontalDelta );        verify_noerr( err );        if ( isHorizontal )            mlte->m_lastHorizontalValue = newV

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -