osxtexteditpeer.cpp

来自「这是VCF框架的代码」· C++ 代码 · 共 1,049 行 · 第 1/2 页

CPP
1,049
字号
//OSXTextEditPeer.cpp/*Copyright 2000-2004 The VCF Project.Please see License.txt in the top level directorywhere you installed the VCF.*/#include "vcf/ApplicationKit/ApplicationKit.h"#include "vcf/ApplicationKit/ApplicationKitPrivate.h"#include "vcf/ApplicationKit/OSXControl.h"#include "vcf/ApplicationKit/OSXTextEditPeer.h"#include "vcf/ApplicationKit/TextControl.h"#include "vcf/FoundationKit/Dictionary.h"using namespace VCF;OSXTextEditPeer::OSXTextEditPeer( TextControl* component, const bool& isMultiLineControl ):	OSXControl( component ),	OSXTextPeer( true, isMultiLineControl ),	textControl_(component),	editState_(0){	if ( isMultiLineControl ) {		editState_ |= esMultiLined; 	}}OSXTextEditPeer::~OSXTextEditPeer(){	//null this out so the ~OSXTextPeer doesn't	//release the txnObject_ - this is handled by the 	//HITextView	txnObject_ = NULL;}void OSXTextEditPeer::create( Control* owningControl ){	if ( NULL == textControl_ ){		throw RuntimeException( MAKE_ERROR_MSG_2( "NULL owner control for Text Edit Peer" ) );	}		TXNFrameOptions frameOptions;		frameOptions = kTXNDoFontSubstitutionMask;				//we may want these in the future		//kTXNShowWindowMask | kTXNWantVScrollBarMask |		//kTXNWantHScrollBarMask |kTXNDrawGrowIconMask;		::HIRect r;		r.origin.x = 0;		r.origin.y = 0;						r.size.width = 0;		r.size.height = 0;		//if ( noErr != TXNCreateObject( &r, frameOptions, &txnObject_ ) ) {		//	throw RuntimeException( MAKE_ERROR_MSG_2("MLTE TXNCreateObject failed!") );	//	}			hiView_ = NULL;			HITextViewCreate( &r, 0, kTXNSingleLineOnlyMask, &hiView_ );				if ( NULL == hiView_ ) {			throw RuntimeException( MAKE_ERROR_MSG_2("HITextViewCreate failed for OSXTextEditPeer!") );		}				txnObject_ = HITextViewGetTXNObject( hiView_ ) ;				OSXControl* thisPtr = this;		SetControlProperty( hiView_, 							VCF_PROPERTY_CREATOR, 							VCF_PROPERTY_CONTROL_VAL, 							sizeof(thisPtr), 							&thisPtr );									OSStatus err = OSXControl::installStdControlHandler();									if ( err != noErr ) {			throw RuntimeException( MAKE_ERROR_MSG_2("InstallEventHandler failed for OSXTextEditPeer!") );		}				/*		TXNCarbonEventInfo      carbonEventInfo;		TXNControlTag           iControlTags[] = { kTXNUseCarbonEvents };  		TXNControlData          iControlData[1];		carbonEventInfo.useCarbonEvents = false;  		carbonEventInfo.filler = 0;		carbonEventInfo.flags = 0;   		carbonEventInfo.fDictionary = NULL;		iControlData[0].uValue = (UInt32) &carbonEventInfo;		TXNSetTXNObjectControls( txnObject_, false, 1, iControlTags, iControlData ); 		*/		setFont( textControl_->getFont() );		textControl_->ControlModelChanged +=			new GenericEventHandler<OSXTextEditPeer>( this, &OSXTextEditPeer::onControlModelChanged, "OSXTextEditPeer::onControlModelChanged" );		textControl_->getFont()->FontChanged += 			new GenericEventHandler<OSXTextEditPeer>( this, &OSXTextEditPeer::onTextControlFontChanged, "OSXTextEditPeer::onTextControlFontChanged" );	}	OSStatus OSXTextEditPeer::handleOSXEvent( EventHandlerCallRef nextHandler, EventRef theEvent ){	OSStatus result = eventNotHandledErr;	    UInt32 whatHappened = GetEventKind (theEvent);	TCarbonEvent event( theEvent );		switch ( GetEventClass( theEvent ) )  {				 		case kEventClassControl : {			switch( whatHappened ) {											case kEventControlOwningWindowChanged : {					WindowRef owningWindow;					GetEventParameter( theEvent, kEventParamControlCurrentOwningWindow, typeWindowRef, NULL,										sizeof (WindowRef), NULL, &owningWindow);															TXNAttachObjectToWindowRef( txnObject_, owningWindow );				}				break;								case kEventControlActivate : {					TXNFocus( txnObject_, true );					result = OSXControl::handleOSXEvent( nextHandler, theEvent );                }                break;								case kEventControlDeactivate : {					TXNFocus( txnObject_, false );					result = OSXControl::handleOSXEvent( nextHandler, theEvent );					                }                break;								case kEventControlBoundsChanged : {					UInt32 attributes = 0;					OSStatus err = GetEventParameter( theEvent,                                                kEventParamAttributes,                                                typeUInt32,                                                NULL,                                                sizeof( UInt32 ),                                                NULL, &attributes );					if ( err == noErr ) 	{                        ::Rect currentBounds;						GetEventParameter( theEvent, kEventParamCurrentBounds, typeQDRectangle,                                                NULL, sizeof(currentBounds), NULL, &currentBounds);						HIRect hiBounds;						hiBounds.origin.x = currentBounds.left;						hiBounds.origin.y = currentBounds.top;						hiBounds.size.width = currentBounds.right - currentBounds.left;						hiBounds.size.height = currentBounds.bottom - currentBounds.top;												TXNSetHIRectBounds( txnObject_, &hiBounds, &hiBounds, false );					}                }                break;								case kEventControlGetPartRegion : {					// get the region type					ControlPartCode part;					GetEventParameter( theEvent, kEventParamControlPart, typeControlPartCode,                                                NULL, sizeof(part), NULL, &part);										if ( kControlStructureMetaPart == part ) {												HIRect frame;							HIViewGetFrame( hiView_, &frame );						::Rect r;												SInt32 frameOutset;						GetThemeMetric( kThemeMetricEditTextFrameOutset, &frameOutset );						SInt32 focusRingOutset;						GetThemeMetric( kThemeMetricFocusRectOutset, &focusRingOutset );											r.left = - (frameOutset + focusRingOutset);						r.top = -(frameOutset + focusRingOutset);						r.right = frame.size.width+(frameOutset + focusRingOutset);						r.bottom = frame.size.height+(frameOutset + focusRingOutset);												RgnHandle rgn;						GetEventParameter( theEvent, kEventParamControlRegion, typeQDRgnHandle,                                                NULL, sizeof(rgn), NULL, &rgn);												RectRgn( rgn, &r );											result = noErr;					}					else {						result = CallNextEventHandler( nextHandler, theEvent );						}														}				break;								case kEventControlDraw : {					//Make SURE to call our default handler here so that text					//get painted					::Rect r;					HIRect frame;						HIViewGetFrame( hiView_, &frame );					SInt32 frameOutset;					GetThemeMetric( kThemeMetricEditTextFrameOutset, &frameOutset );					SInt32 focusRingOutset;					GetThemeMetric( kThemeMetricFocusRectOutset, &focusRingOutset );											r.left = -frameOutset;					r.top = -frameOutset;					r.right = frame.size.width + frameOutset;					r.bottom = frame.size.height + frameOutset;										result = CallNextEventHandler( nextHandler, theEvent );																				r.left = -frameOutset;					r.top = -frameOutset;					r.right = frame.size.width + frameOutset;					r.bottom = frame.size.height + frameOutset;										ThemeDrawState  state = kThemeStateInactive;										if ( IsControlActive( hiView_ ) ) {						state = kThemeStateActive;					}										DrawThemeEditTextFrame( &r, state );										HIViewPartCode focusPart = 0;					HIViewGetFocusPart( hiView_, &focusPart );																if ( focusPart != kHIViewNoPart ) {						r.left = -frameOutset;						r.top = -frameOutset;						r.right = frame.size.width + frameOutset;						r.bottom = frame.size.height + frameOutset;											DrawThemeFocusRect( &r, TRUE );					}				}				break;								default : {                    result = OSXControl::handleOSXEvent( nextHandler, theEvent );                }                break;			}		}		break;				default : {            result = OSXControl::handleOSXEvent( nextHandler, theEvent );        }        break; 	}			return result;}	OSHandleID OSXTextEditPeer::getTextObjectHandle(){	return OSXTextPeer::getTextObjectHandle();}void OSXTextEditPeer::setRightMargin( const double & rightMargin ){	editState_ |= esStyleChanging;		editState_ &= ~esStyleChanging;}void OSXTextEditPeer::setLeftMargin( const double & leftMargin ){	editState_ |= esStyleChanging;		editState_ &= ~esStyleChanging;}unsigned long OSXTextEditPeer::getLineCount(){	return 0;}VCF::Rect OSXTextEditPeer::getContentBoundsForWidth(const double& width){	return OSXTextPeer::getContentBoundsForWidth(width);}unsigned long OSXTextEditPeer::getCurrentLinePosition(){	unsigned long result = 0;	return result;}double OSXTextEditPeer::getLeftMargin(){	double result = 0.0;		return result;}double OSXTextEditPeer::getRightMargin(){	double result = 0.0;		return result;}void OSXTextEditPeer::insertText( unsigned int start, const String& text ){	editState_ |= esPeerTextChanging;	OSXTextPeer::insertText( start, text );	editState_ &= ~esPeerTextChanging;}void OSXTextEditPeer::deleteText( unsigned int start, unsigned int length ){	editState_ |= esPeerTextChanging;	OSXTextPeer::deleteText( start, length );	editState_ &= ~esPeerTextChanging;}unsigned int OSXTextEditPeer::getTextLength(){	return OSXTextPeer::getTextLength();}String OSXTextEditPeer::getText( unsigned int start, unsigned int length ){	return OSXTextPeer::getText(start,length);}String OSXTextEditPeer::getText(){		return OSXTextPeer::getText( 0, OSXTextPeer::getTextLength() );}void OSXTextEditPeer::paint( GraphicsContext* context, const Rect& paintRect ){	OSXTextPeer::paint( context, paintRect );}void OSXTextEditPeer::setTopMargin( const double & topMargin ){	editState_ |= esStyleChanging;	OSXTextPeer::setTopMargin( topMargin );	editState_ &= ~esStyleChanging;}void OSXTextEditPeer::setBottomMargin( const double & bottomMargin ){	editState_ |= esStyleChanging;	OSXTextPeer::setBottomMargin( bottomMargin );	editState_ &= ~esStyleChanging;}double OSXTextEditPeer::getTopMargin(){	return OSXTextPeer::getTopMargin();}double OSXTextEditPeer::getBottomMargin(){	return OSXTextPeer::getBottomMargin();}void OSXTextEditPeer::setStyle( unsigned int start, unsigned int length, Dictionary& styles ){	editState_ |= esStyleChanging;	OSXTextPeer::setStyle( start, length, styles );	editState_ &= ~esStyleChanging;}void OSXTextEditPeer::getStyle( unsigned int start, unsigned int length, Dictionary& styles, Color& color ){	OSXTextPeer::getStyle( start, length, styles, color );}void OSXTextEditPeer::setDefaultStyle( Dictionary& styles ){	editState_ |= esStyleChanging;	OSXTextPeer::setDefaultStyle( styles );	editState_ &= ~esStyleChanging;}VCF::Point* OSXTextEditPeer::getPositionFromCharIndex( const unsigned long& index ){		return &ptAtCharPos_;}unsigned long OSXTextEditPeer::getCharIndexFromPosition( VCF::Point* point ){	unsigned long result = 0;	return result;}unsigned long OSXTextEditPeer::getCaretPosition(){	return getSelectionStart();}void OSXTextEditPeer::setCaretPosition( const unsigned long& caretPos ){}uint32 OSXTextEditPeer::convertCharToVKCode( VCFChar ch ){	uint32 result = 0;	ch = tolower( ch );	switch ( ch ) {		case 'a' : {			result = vkLetterA;		}		break;		case 'b' : {			result = vkLetterB;		}		break;		case 'c' : {			result = vkLetterC;		}		break;		case 'd' : {			result = vkLetterD;		}		break;		case 'e' : {			result = vkLetterE;		}		break;		case 'f' : {			result = vkLetterF;		}		break;		case 'g' : {			result = vkLetterG;		}		break;		case 'h' : {			result = vkLetterH;		}		break;		case 'i' : {			result = vkLetterI;		}		break;		case 'j' : {			result = vkLetterJ;		}		break;		case 'k' : {			result = vkLetterK;		}		break;		case 'l' : {			result = vkLetterL;		}		break;		case 'm' : {			result = vkLetterM;		}		break;		case 'n' : {			result = vkLetterN;		}		break;		case 'o' : {			result = vkLetterO;		}		break;

⌨️ 快捷键说明

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