Exemplo n.º 1
0
/* initialize the status window (used to show console messages in the graphic environment */
void CARBON_GUI::setupStatusWindow() 
{
	OSStatus err=CreateWindowFromNib(nibRef,CFSTR("StatusWindow"),&statusWindow);
	if(err!=noErr) msg->error("Can't create status window (%d)!!",err);
	//SetDrawerParent(statusWindow,window);
	//SetDrawerPreferredEdge(statusWindow,kWindowEdgeBottom);
	//SetDrawerOffsets(statusWindow,20,20);
	
	/* install an eventHandler to intercept close requests */
	err = InstallWindowEventHandler (statusWindow, 
		NewEventHandlerUPP (StatusWindowEventHandler), 
		GetEventTypeCount(statusEvents), statusEvents, this, NULL);
	if(err != noErr) msg->error("Can't install status window eventHandler");
	
	/* and then install a command handler (to handle "clear" requests) */
	err=InstallWindowEventHandler(statusWindow,NewEventHandlerUPP(StatusWindowCommandHandler),
		GetEventTypeCount(commands),commands,this,NULL);
		
	/* obtain an HIViewRef for the status text box ... we have to use it 
	 * to setup various properties and to obain a TXNObject needed to manage its content */
	const ControlID txtid={ CARBON_GUI_APP_SIGNATURE, STATUS_TEXT_ID };
	err= HIViewFindByID(HIViewGetRoot(statusWindow), txtid, &statusTextView);
	if(err!=noErr) return;// msg->warning("Can't get textView for status window (%d)!!",err);
	statusText = HITextViewGetTXNObject(statusTextView);
	if(!statusText) {
		msg->error("Can't get statusText object from status window!!");
	}
//	TXNControlTag iControlTags[1] = { kTXNAutoScrollBehaviorTag };
//	TXNControlData iControlData[1] = { kTXNAutoScrollNever }; //kTXNAutoScrollWhenInsertionVisible };
//	err = TXNSetTXNObjectControls(statusText,false,1,iControlTags,iControlData);
	//TextViewSetObjectControlData
	//TextViewSetObjectControlData(statusText,kTXNAutoScrollBehaviorTag,kUn kTXNAutoScrollWhenInsertionVisible)
	/* setup status text font size and color */
	// Create type attribute data structure
	UInt32   fontSize = 10 << 16; // needs to be in Fixed format
	TXNAttributeData fsData,fcData;
	fsData.dataValue=fontSize;
	fcData.dataPtr=(void *)&black;
	TXNTypeAttributes attributes[] = {
		//{ kTXNQDFontStyleAttribute, kTXNQDFontStyleAttributeSize, bold },
		{ kTXNQDFontColorAttribute, kTXNQDFontColorAttributeSize,fcData}, //&lgrey },
		{ kTXNQDFontSizeAttribute, kTXNFontSizeAttributeSize,fsData }
	};
	err= TXNSetTypeAttributes( statusText, 2, attributes,
		kTXNStartOffset,kTXNEndOffset );
		
	/* block user input in the statusText box */
	TXNControlTag tags[] = { kTXNNoUserIOTag };
	TXNControlData vals[] = { kTXNReadOnly };
	err=TXNSetTXNObjectControls(statusText,false,1,tags,vals);
	if(err!=noErr) msg->error("Can't set statusText properties (%d)!!",err);
	// TXNSetScrollbarState(statusText,kScrollBarsAlwaysActive);
		
	//struct TXNBackground bg = {  kTXNBackgroundTypeRGB, black };
	//TXNSetBackground(statusText,&bg);
}
Exemplo n.º 2
0
OSStatus
TextViewSetObjectControlData( HIViewRef textView, TXNControlTag controlTag, Boolean isSigned, 
                                 SInt32 iSignedData, UInt32 iUnsignedData )
{
    OSStatus status = noErr;
    
	TXNControlTag iControlTags[1] = {controlTag};
	TXNControlData iControlData[1];
	if( isSigned )
		iControlData[0].sValue = (SInt32)iSignedData;
	else
		iControlData[0].uValue = (UInt32)iUnsignedData;

	return TXNSetTXNObjectControls( HITextViewGetTXNObject(textView), false, 1, iControlTags, iControlData );
}
Exemplo n.º 3
0
void CARBON_GUI::msgOut(char *txt) {
	ItemCount nLines=0;
	SInt32 sLines;
	Handle oldText = NULL;
	TXNOffset start = 0;
	TXNOffset end = 0;
	TXNDataType dType;
	UniChar *p;
	int off = 0;
	statusLock();
	if(txt && statusText) {
		TXNGetLineCount(statusText,&nLines);
		if(nLines > CGUI_STATUS_MAX_LINES) {
			TXNControlTag iControlTags[1] = { kTXNAutoScrollBehaviorTag };
			TXNControlData iControlData[1] = { kTXNAutoScrollNever }; //kTXNAutoScrollWhenInsertionVisible };
			err = TXNSetTXNObjectControls(statusText,false,1,iControlTags,iControlData);

			TXNTypeAttributes attr = { kTXNTextEncodingAttribute,kTXNTextEncodingAttributeSize,{0} };
			
			//TXNGetIndexedRunInfoFromRange(statusText,0,kTXNStartOffset,kTXNEndOffset,&start,&end,&dType,1,&attr);
			
			if(TXNGetData(statusText,kTXNStartOffset,kTXNEndOffset,&oldText) != noErr)
				msg->error("Can't get status text buffer!! (%d)\n");
			
			end = TXNDataSize(statusText);
			p = (UniChar *)*oldText;
			while(*((*oldText)+off) != '\n' && off < end) {
				off++;
			}
			p++;
			off++;
			//off = 256;
			TXNSetData(statusText,kTXNTextData,"",0,kTXNStartOffset,off/sizeof(UniChar));
			/*
			if(end > off) 
				TXNSetData(statusText,kTXNUnicodeTextData,(*oldText)+off,end-off,kTXNStartOffset,kTXNEndOffset);
			*/
			//err = TXNScroll(statusText,kTXNScrollUnitsInLines,kTXNScrollUnitsInLines,&nLines,&nCols);
		}
		TXNSetData(statusText,kTXNTextData,"[*] ",4,kTXNEndOffset,kTXNEndOffset);
		TXNSetData(statusText,kTXNTextData,txt,strlen(txt),kTXNEndOffset,kTXNEndOffset);
		TXNSetData(statusText,kTXNTextData,"\n",1,kTXNEndOffset,kTXNEndOffset);
	}
	if(oldText)
		DisposeHandle(oldText);
	statusUnlock();
}
Exemplo n.º 4
0
OSStatus
TextViewSetMargins( HIViewRef textView, SInt16 top, SInt16 left, SInt16 right )
{
	TXNMargins margins;
	
	margins.topMargin = top;
	margins.leftMargin = left;
	margins.bottomMargin = 0; // cannot change bottomMargin in MLTE at this time
	margins.rightMargin = right;

	//	Set the margins in the object.
	TXNControlTag	iControlTags[] = {kTXNMarginsTag};
	TXNControlData	iControlData[1];
	iControlData[0].marginsPtr = &margins;

	return TXNSetTXNObjectControls( HITextViewGetTXNObject(textView), false, 1, iControlTags, iControlData );
}
Exemplo n.º 5
0
void IGraphicsCarbon::CreateTextEntry(IControl* pControl, IText* pText, IRECT* pTextRect, const char* pString, IParam* pParam)
{
  if (!pControl || mTextEntryView || !mIsComposited) return; // Only composited carbon supports text entry

  WindowRef window = mWindow;
  TXNFrameOptions txnFrameOptions = kTXNMonostyledTextMask | kTXNDisableDragAndDropMask | kTXNSingleLineOnlyMask;
  TXNObject txnObject = 0;
  TXNFrameID frameID = 0;
  TXNObjectRefcon txnObjectRefCon = 0;

  HIRect rct;
  HIViewGetFrame(this->mView, &rct);

  HIViewRef contentView;
  HIViewFindByID (HIViewGetRoot(this->mWindow), kHIViewWindowContentID, &contentView);
  HIViewConvertRect(&rct, HIViewGetSuperview((HIViewRef)this->mView), contentView);

  Rect rect = { rct.origin.y + pTextRect->T,
                rct.origin.x + pTextRect->L,
                rct.origin.y + pTextRect->B + 1,
                rct.origin.x + pTextRect->R + 1
              };

  if (TXNNewObject(NULL,
                   window,
                   &rect,
                   txnFrameOptions,
                   kTXNTextEditStyleFrameType,
                   kTXNSingleStylePerTextDocumentResType,
                   kTXNMacOSEncoding,
                   &txnObject,
                   &frameID,
                   txnObjectRefCon) == noErr)
  {
    TXNSetFrameBounds(txnObject, rect.top, rect.left, rect.bottom, rect.right, frameID);
    mTextEntryView = txnObject;

    // Set the text to display by defualt
    TXNSetData(mTextEntryView, kTXNTextData, pString, strlen(pString)/*+1*/, kTXNStartOffset, kTXNEndOffset); // center aligned text has problems with uneven string lengths

    RGBColor tc;
    tc.red = pText->mTextEntryFGColor.R * 257;
    tc.green = pText->mTextEntryFGColor.G * 257;
    tc.blue = pText->mTextEntryFGColor.B * 257;

    TXNBackground bg;
    bg.bgType         = kTXNBackgroundTypeRGB;
    bg.bg.color.red   = pText->mTextEntryBGColor.R * 257;
    bg.bg.color.green = pText->mTextEntryBGColor.G * 257;
    bg.bg.color.blue  = pText->mTextEntryBGColor.B * 257;

    TXNSetBackground(mTextEntryView, &bg);

    // Set justification
    SInt16 justification;
    Fract flushness;

    switch ( pText->mAlign )
    {
      case IText::kAlignCenter:
        justification = kTXNCenter;  // seems to be buggy wrt dragging and alignement with uneven string lengths
        flushness = kATSUCenterAlignment;
        break;
      case IText::kAlignFar:
        justification = kTXNFlushRight;
        flushness = kATSUEndAlignment;
        break;
      case IText::kAlignNear:
      default:
        justification = kTXNFlushLeft;
        flushness = kATSUStartAlignment;
        break;
    }

    TXNControlTag controlTag[1];
    TXNControlData controlData[1];
    controlTag[0] = kTXNJustificationTag;
    controlData[0].sValue = justification;
    TXNSetTXNObjectControls(mTextEntryView, false, 1, controlTag, controlData);

    ATSUFontID fontid = kATSUInvalidFontID;

    if (pText->mFont && pText->mFont[0])
    {
      ATSUFindFontFromName(pText->mFont, strlen(pText->mFont),
                           kFontFullName /* kFontFamilyName? */ ,
                           (FontPlatformCode)kFontNoPlatform,
                           kFontNoScriptCode,
                           kFontNoLanguageCode,
                           &fontid);
    }

    // font (NOT working)
    TXNTypeAttributes attributes[3];
    attributes[0].tag = kATSUFontTag;
    attributes[0].size = sizeof(ATSUFontID);
    attributes[0].data.dataPtr = &fontid;
    // size
    attributes[1].tag = kTXNQDFontSizeAttribute;
    attributes[1].size = kTXNFontSizeAttributeSize;
    attributes[1].data.dataValue = pText->mSize << 16;
    // color
    attributes[2].tag = kTXNQDFontColorAttribute;
    attributes[2].size = kTXNQDFontColorAttributeSize;
    attributes[2].data.dataPtr = &tc;

    // Finally set the attributes
    TXNSetTypeAttributes(mTextEntryView, 3, attributes, kTXNStartOffset, kTXNEndOffset);

    // Ensure focus remains consistent
    SetUserFocusWindow(window);
    AdvanceKeyboardFocus(window);

    // Set the focus to the edit window
    TXNFocus(txnObject, true);
    TXNSelectAll(mTextEntryView);
    TXNShowSelection(mTextEntryView, true);

    // The event types
    const static EventTypeSpec eventTypes[] =
    {
      { kEventClassMouse,    kEventMouseMoved },
      { kEventClassMouse,    kEventMouseDown },
      { kEventClassMouse,    kEventMouseUp },
      { kEventClassMouse,    kEventMouseWheelMoved },
      { kEventClassWindow,   kEventWindowClosed },
      { kEventClassWindow,   kEventWindowDeactivated },
      { kEventClassWindow,   kEventWindowFocusRelinquish },
      { kEventClassKeyboard, kEventRawKeyDown },
      { kEventClassKeyboard, kEventRawKeyRepeat }
    };

    // Install the event handler
    InstallWindowEventHandler(window, TextEntryHandler, GetEventTypeCount(eventTypes), eventTypes, this, &mTextEntryHandler);

    mEdControl = pControl;
    mEdParam = pParam;
    mTextEntryRect = *pTextRect;
  }
}
Exemplo n.º 6
0
/*
 * clears the status window
 */
void CARBON_GUI::clearStatus() {
	TXNSetData(statusText,kTXNTextData,"",0,kTXNStartOffset,kTXNEndOffset);
	TXNControlTag iControlTags[1] = { kTXNAutoScrollBehaviorTag };
	TXNControlData iControlData[1] = { 0 }; 
	err = TXNSetTXNObjectControls(statusText,false,1,iControlTags,iControlData);
}
OSStatus YASTControlAttachToExistingControl(ControlRef theControl) {
	OSStatus err;
	YASTControlVars *varsp;
	UInt32 outCommandID;
	EventHandlerRef controlEvents, windowEvents;
	TXNObject theTXNObject;
	RgnHandle outlineRegion;
	
		/* set up our locals */
	controlEvents = windowEvents = NULL;
	theTXNObject = NULL;
	outlineRegion = NULL;
	varsp = NULL;
	err = noErr;
	
		/* allocate our private storage and set up initial settings*/
	varsp = (YASTControlVars *) malloc(sizeof(YASTControlVars));
	if (varsp == NULL) {
		err = memFullErr;
	} else {
		varsp->fInFocus = false;
		varsp->fIsActive = true;
		varsp->fTXNObjectActive = false;
		varsp->fControl = theControl;
		varsp->fTabMovesFocus = true;
		varsp->fDrawFocusBox = true;
		varsp->fFocusDrawState = false;
		varsp->fIsReadOnly = false;
		varsp->fRTextOutlineRegion = NULL;
		varsp->fWindow = GetControlOwner(theControl);
		varsp->fGrafPtr = GetWindowPort(varsp->fWindow);
	}
	
		/* set our control's command id.  we don't actually use it, but it must
		be non-zero for our control to be sent command events.  only set it
		if it has not already been set.  */
	err = GetControlCommandID(theControl, &outCommandID);
	if (err == noErr) {
		if (outCommandID == 0) {
			err = SetControlCommandID(theControl, 1);
		}
	}
		/* calculate the rectangles used by the control */
	if (err == noErr) {
		outlineRegion = NewRgn();
		if (outlineRegion == NULL) {
			err = memFullErr;
		} else {
			Rect bounds;
			varsp->fRTextOutlineRegion = outlineRegion;
			GetControlBounds(theControl, &bounds);
			YASTControlCalculateBounds(varsp, &bounds);
		}
	}

		/* create the new edit field */
	if (err == noErr) {
		err = TXNNewObject(NULL, varsp->fWindow, &varsp->fRTextArea,
			kTXNWantVScrollBarMask | kTXNAlwaysWrapAtViewEdgeMask,
			kTXNTextEditStyleFrameType, kTXNTextensionFile, kTXNSystemDefaultEncoding, 
			&theTXNObject, &varsp->fTXNFrameID, (TXNObjectRefcon) varsp);
		if (err == noErr) {
			varsp->fTXNObject = theTXNObject;
		}
	}
	
		/* set the field's background */
	if (err == noErr) {
		RGBColor rgbWhite = {0xFFFF, 0xFFFF, 0xFFFF};
		TXNBackground tback;
		tback.bgType = kTXNBackgroundTypeRGB;
		tback.bg.color = rgbWhite;
		TXNSetBackground( varsp->fTXNObject, &tback);
	}
	
		/* set the margins for easier selection and display */
	if (err == noErr) {
		TXNControlData txnCControlData;
		TXNControlTag txnControlTag = kTXNMarginsTag;
		TXNMargins txnMargins = { 2, 3, 2, 1 };	/* t,l,b,r */
		txnCControlData.marginsPtr	= &txnMargins; 
		(void) TXNSetTXNObjectControls( varsp->fTXNObject, false, 1, &txnControlTag, &txnCControlData );
	}
	
		/* install our carbon event handlers */
	if (err == noErr) {
		static EventHandlerUPP gTPEventHandlerUPP = NULL;
		if (gTPEventHandlerUPP == NULL)
			gTPEventHandlerUPP = NewEventHandlerUPP(YASTControlCarbonEventHandler);
	
			/* carbon event handlers for the control */
		err = InstallEventHandler( GetControlEventTarget( theControl ),
			gTPEventHandlerUPP,
			(sizeof(gYASTControlEvents)/sizeof(EventTypeSpec)),
			gYASTControlEvents,
			varsp, &controlEvents);
		if (err == noErr) { 
			varsp->fControlEvents = windowEvents;
			
				/* carbon event handlers for the control's window */
			err = InstallEventHandler( GetWindowEventTarget( varsp->fWindow ),
				gTPEventHandlerUPP, (sizeof(gYASTControlWindowEvents)/sizeof(EventTypeSpec)),
				gYASTControlWindowEvents, varsp, &windowEvents);
			if (err == noErr) {
				varsp->fWindowEvents = windowEvents;
			}
		}
	}
	
		/* perform final activations and setup for our text field.  Here,
		we assume that the window is going to be the 'active' window. */
	if (err == noErr) {
		SetTextActivation(varsp, (varsp->fIsActive && varsp->fInFocus));
	}
	
		/* clean up on error */
	if (err != noErr) {
		if (controlEvents != NULL) RemoveEventHandler(controlEvents);
		if (windowEvents != NULL) RemoveEventHandler(windowEvents);
		if (theTXNObject != NULL) TXNDeleteObject(theTXNObject);
		if (outlineRegion != NULL) DisposeRgn(outlineRegion);
		if (varsp != NULL) free((void*) varsp);
	}
	
		/* all done */
	return err;
}
	/* YASTControlSetData is dispatched from our control event handler.  It is where
	we handle all calls to SetControlData directed to our control. */
static OSStatus YASTControlSetData(
						YASTControlVarsPtr varsp, 
						ResType inTagName,
						void * inBuffer,
						Size inBufferSize) {
	OSStatus err, returnedResult;
		/* default result */
	returnedResult = eventNotHandledErr;
		/* dispatch according to the tag */
	switch (inTagName) {
	
		case kYASTControlAllTextTag: /* char* */
		case kYASTControlSelectedTextTag: /* char* */
			{	TXNOffset oStartOffset, oEndOffset;
					/* pick the range of chars we want to replace */
				if (inTagName == kYASTControlSelectedTextTag) 
					TXNGetSelection( varsp->fTXNObject, &oStartOffset, &oEndOffset);
				else { oStartOffset = kTXNStartOffset; oEndOffset = kTXNEndOffset; }
					/* get the new text */
				err = TXNSetData( varsp->fTXNObject, kTXNTextData,
						inBuffer, inBufferSize, oStartOffset, oEndOffset );
			}
			returnedResult = err;
			break;
		
		case kYASTControlAllUnicodeTextTag: /* CFStringRef */
		case kYASTControlSelectedUnicodeTextTag: /* CFStringRef */
			if (inBufferSize != sizeof(CFStringRef)) {
				err = paramErr;
			} else {
				CFStringRef theString;
				CFIndex length;
				UniChar *buffer;
				TXNOffset oStartOffset, oEndOffset;
					/* pick the range of chars we want to replace */
				if (inTagName == kYASTControlSelectedUnicodeTextTag) 
					TXNGetSelection( varsp->fTXNObject, &oStartOffset, &oEndOffset);
				else { oStartOffset = kTXNStartOffset; oEndOffset = kTXNEndOffset; }
				theString = * (CFStringRef*) inBuffer;
					/* get the new text */
				length = CFStringGetLength(theString);
				buffer = (UniChar *) malloc(length*sizeof(UniChar));
				if (buffer != NULL) {
					CFRange range;
					range.location = 0;
					range.length = length;
					CFStringGetCharacters(theString, range, buffer);
						/* add the new text */
					err = TXNSetData( varsp->fTXNObject, kTXNUnicodeTextData,
									buffer, length*2, oStartOffset, oEndOffset);
					free(buffer);
				} else {
					err = memFullErr;
				}
			}
			returnedResult = err;
			break;
		
		case kYASTControlSelectionRangeTag: /* YASTControlEditTextSelectionRec */
			if (inBufferSize != sizeof(CFRange)) {
				err = paramErr;
			} else {
				YASTControlEditTextSelectionPtr range;
				range = (YASTControlEditTextSelectionPtr) inBuffer;
				err = TXNSetSelection( varsp->fTXNObject, range->selStart, range->selEnd);
				if (err == noErr) {
					TXNShowSelection( varsp->fTXNObject, false);
				}
			}
			returnedResult = err;
			break;

		case kYASTControlTabsAdvanceFocusTag: /* Boolean (default true) */
			if (inBufferSize != sizeof(Boolean)) {
				err = paramErr;
			} else {
				varsp->fTabMovesFocus = * (Boolean*) inBuffer;
				err = noErr;
			}
			returnedResult = err;
			break;
			
		case kYASTControlDoDrawFocusTag: /* Boolean (default true) */
			if (inBufferSize != sizeof(Boolean)) {
				err = paramErr;
			} else {
				varsp->fDrawFocusBox = * (Boolean*) inBuffer;
				RedrawFocusOutline(varsp);
				err = noErr;
			}
			returnedResult = err;
			break;
			
		case kYASTControlReadOnlyTag:
			if (inBufferSize != sizeof(Boolean)) {
				err = paramErr;
			} else {
				TXNControlData txnCControlData;
				TXNControlTag txnControlTag;
				txnControlTag = kTXNIOPrivilegesTag;
				if ( * (Boolean*) inBuffer )
					txnCControlData.uValue = kTXNReadOnly; 
				else txnCControlData.uValue = kTXNReadWrite; 
				err = TXNSetTXNObjectControls( varsp->fTXNObject,
								false, 1, &txnControlTag, &txnCControlData );
				if (err == noErr) {
					varsp->fIsReadOnly = * (Boolean*) inBuffer;
				}
			}
			returnedResult = err;
			break;
			
		case kYASTControlTabSizeTag:
			if (inBufferSize != sizeof(SInt16)) {
				err = paramErr;
			} else {
				TXNTab txnTabData;
				TXNControlTag txnControlTag;
				txnControlTag = kTXNTabSettingsTag;
				txnTabData.value = * (SInt16*) inBuffer;
				txnTabData.tabType = kTXNRightTab;
				txnTabData.filler = 0;
				err = TXNSetTXNObjectControls( varsp->fTXNObject,
							false, 1, &txnControlTag, &txnTabData );
			}
			returnedResult = err;
			break;

	}
	return returnedResult;
}