void IGraphicsCarbon::EndUserInput(bool commit) { if (mTextEntryHandler) { RemoveEventHandler(mTextEntryHandler); mTextEntryHandler = 0; } else { return; } if (commit) { // Get the text CharsHandle textHandle; TXNGetDataEncoded(mTextEntryView, kTXNStartOffset, kTXNEndOffset, &textHandle, kTXNTextData); // Check that we have some worthwhile data if (textHandle != NULL && GetHandleSize(textHandle) > 0) { const long textLength = GetHandleSize(textHandle); char txt[257]; strncpy(txt, *textHandle, (textLength > 255) ? 255 : textLength); txt[(textLength > 255) ? 255 : textLength] = '\0'; if (mEdParam) mGraphicsMac->SetFromStringAfterPrompt(mEdControl, mEdParam, txt); else mEdControl->TextFromTextEntry(txt); } } if (mTextEntryView) { TXNFocus(mTextEntryView, false); TXNClear(mTextEntryView); TXNDeleteObject(mTextEntryView); mTextEntryView = 0; } if (mIsComposited) { HIViewSetNeedsDisplay(mView, true); } else { mEdControl->SetDirty(false); mEdControl->Redraw(); } SetThemeCursor(kThemeArrowCursor); SetUserFocusWindow(kUserFocusAuto); mEdControl = 0; mEdParam = 0; }
// static pascal OSStatus IGraphicsCarbon::TextEntryHandler(EventHandlerCallRef pHandlerCall, EventRef pEvent, void* pGraphicsCarbon) { IGraphicsCarbon* _this = (IGraphicsCarbon*) pGraphicsCarbon; UInt32 eventClass = GetEventClass(pEvent); UInt32 eventKind = GetEventKind(pEvent); switch (eventClass) { case kEventClassKeyboard: switch (eventKind) { case kEventRawKeyDown: case kEventRawKeyRepeat: { // Get the keys and modifiers char c; UInt32 k; UInt32 modifiers; GetEventParameter(pEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &c); GetEventParameter(pEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &k); GetEventParameter(pEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers); // paste if (c == 118 && modifiers == 256) { if (TXNIsScrapPastable()) { TXNPaste(_this->mTextEntryView); return eventNotHandledErr; } } // trap enter keys if (c == 3 || c == 13) { _this->EndUserInput(true); return noErr; } // trap escape key if (c == 27) { _this->EndUserInput(false); return noErr; } // pass arrow keys if (k == 125 || k == 126 || k == 123 || k == 124) return eventNotHandledErr; // pass delete keys if (c == 8 || c == 127) return eventNotHandledErr; if (_this->mEdParam) { switch ( _this->mEdParam->Type() ) { case IParam::kTypeEnum: case IParam::kTypeInt: case IParam::kTypeBool: if (c >= '0' && c <= '9') break; else if (c == '-') break; else if (c == '+') break; else return noErr; case IParam::kTypeDouble: if (c >= '0' && c <= '9') break; else if (c == '.') break; else if (c == '-') break; else if (c == '+') break; else return noErr; default: break; } } // Get the text CharsHandle textHandle; long textLength = 0; TXNGetDataEncoded(_this->mTextEntryView, kTXNStartOffset, kTXNEndOffset, &textHandle, kTXNTextData); // Check that we have some worthwhile data if (textHandle != NULL && GetHandleSize(textHandle) > 0) { textLength = GetHandleSize(textHandle); } if(textLength >= _this->mEdControl->GetTextEntryLength()) { return noErr; } else { EventRecord eventRecord; if (ConvertEventRefToEventRecord(pEvent, &eventRecord)) { TXNKeyDown(_this->mTextEntryView, &eventRecord); return noErr; } } } break; } break; case kEventClassMouse: { switch (eventKind) { case kEventMouseDown: case kEventMouseUp: { // Get the window handle WindowRef window; GetEventParameter(pEvent, kEventParamWindowRef, typeWindowRef, NULL, sizeof(WindowRef), NULL, &window); // Determine the point HIPoint p; GetEventParameter(pEvent, kEventParamMouseLocation, typeHIPoint, NULL, sizeof(HIPoint), NULL, &p); Point point = { (short)p.y, (short)p.x }; QDGlobalToLocalPoint(GetWindowPort (window), &point); // Get the viewable area Rect rect; TXNGetViewRect (_this->mTextEntryView, &rect); //swell collision #undef PtInRect #define MacPtInRect PtInRect // Handle the click as necessary if (PtInRect(point, &rect)) { #define PtInRect(r,p) SWELL_PtInRect(r,p) EventRecord eventRecord; if (eventKind == kEventMouseDown && ConvertEventRefToEventRecord(pEvent, &eventRecord)) { TXNClick(_this->mTextEntryView, &eventRecord); } return noErr; } else { CallNextEventHandler(pHandlerCall, pEvent); ClearKeyboardFocus(window); _this->EndUserInput(false); return noErr; } } break; case kEventMouseMoved: TXNAdjustCursor(_this->mTextEntryView, NULL); return noErr; case kEventMouseWheelMoved: return noErr; } break; } case kEventClassWindow: { WindowRef window; GetEventParameter (pEvent, kEventParamDirectObject, typeWindowRef, NULL, sizeof(WindowRef), NULL, &window); switch (eventKind) { case kEventWindowFocusRelinquish: case kEventWindowClosed: case kEventWindowDeactivated: CallNextEventHandler(pHandlerCall, pEvent); ClearKeyboardFocus(window); _this->EndUserInput(false); return noErr; } break; } } return eventNotHandledErr; }
/* YASTControlGetData is dispatched from our control event handler. It is where we handle all calls to GetControlData directed to our control. */ static OSStatus YASTControlGetData( YASTControlVarsPtr varsp, ResType inTagName, void * inBuffer, Size inBufferSize, Size *outBufferSize) { OSStatus err, returnedResult; /* default result */ returnedResult = eventNotHandledErr; /* dispatch event */ switch (inTagName) { case kYASTControlAllTextTag: case kYASTControlSelectedTextTag: { Handle oDataHandle; Size bytesCopied; TXNOffset oStartOffset, oEndOffset; if (inTagName == kYASTControlSelectedTextTag) TXNGetSelection( varsp->fTXNObject, &oStartOffset, &oEndOffset); else { oStartOffset = kTXNStartOffset; oEndOffset = kTXNEndOffset; } err = TXNGetDataEncoded( varsp->fTXNObject, oStartOffset, oEndOffset, &oDataHandle, kTXNTextData); if (err == noErr) { bytesCopied = GetHandleSize(oDataHandle); if (bytesCopied > inBufferSize) bytesCopied = inBufferSize; BlockMoveData(*oDataHandle, inBuffer, bytesCopied); if (outBufferSize != NULL) *outBufferSize = bytesCopied; DisposeHandle(oDataHandle); } } returnedResult = err; break; case kYASTControlAllUnicodeTextTag: /* CFStringRef */ case kYASTControlSelectedUnicodeTextTag: /* CFStringRef */ if (inBufferSize != sizeof(CFStringRef)) { err = paramErr; } else { TXNOffset oStartOffset, oEndOffset; Handle oDataHandle; if (inTagName == kYASTControlSelectedUnicodeTextTag) TXNGetSelection( varsp->fTXNObject, &oStartOffset, &oEndOffset); else { oStartOffset = kTXNStartOffset; oEndOffset = kTXNEndOffset; } err = TXNGetDataEncoded( varsp->fTXNObject, oStartOffset, oEndOffset, &oDataHandle, kTXNUnicodeTextData); if (err == noErr) { CFStringRef theString; HLock(oDataHandle); theString = CFStringCreateWithCharacters(NULL, (UniChar *) (*oDataHandle), GetHandleSize(oDataHandle)/sizeof(UniChar)); if (theString != NULL) { * (CFStringRef*) inBuffer = theString; if (outBufferSize != NULL) *outBufferSize = sizeof(CFStringRef); err = noErr; } else { err = memFullErr; } DisposeHandle(oDataHandle); } } returnedResult = err; break; case kYASTControlSelectionRangeTag: /* YASTControlEditTextSelectionRec */ if (inBufferSize != sizeof(YASTControlEditTextSelectionRec)) { err = paramErr; } else { YASTControlEditTextSelectionPtr range; range = (YASTControlEditTextSelectionPtr) inBuffer; TXNGetSelection( varsp->fTXNObject, &range->selStart, &range->selEnd); if (outBufferSize != NULL) *outBufferSize = sizeof(YASTControlEditTextSelectionRec); err = noErr; } returnedResult = err; break; case kYASTControlTXNObjectTag: /* fTXNObject - GetControlData only */ if (inBufferSize != sizeof(TXNObject)) { err = paramErr; } else { * (TXNObject*) inBuffer = varsp->fTXNObject; if (outBufferSize != NULL) *outBufferSize = sizeof(TXNObject); err = noErr; } returnedResult = err; break; case kYASTControlTabsAdvanceFocusTag: /* Boolean (default true) */ if (inBufferSize != sizeof(Boolean)) { err = paramErr; } else { * (Boolean*) inBuffer = varsp->fTabMovesFocus; if (outBufferSize != NULL) *outBufferSize = sizeof(Boolean); err = noErr; } returnedResult = err; break; case kYASTControlDoDrawFocusTag: /* Boolean (default true) */ if (inBufferSize != sizeof(Boolean)) { err = paramErr; } else { * (Boolean*) inBuffer = varsp->fDrawFocusBox; if (outBufferSize != NULL) *outBufferSize = sizeof(Boolean); err = noErr; } returnedResult = err; break; case kYASTControlReadOnlyTag: if (inBufferSize != sizeof(Boolean)) { err = paramErr; } else { * (Boolean*) inBuffer = varsp->fIsReadOnly; if (outBufferSize != NULL) *outBufferSize = sizeof(Boolean); err = noErr; } returnedResult = err; break; case kYASTControlTabSizeTag: if (inBufferSize != sizeof(SInt16)) { err = paramErr; } else { TXNTab txnTabData; TXNControlTag txnControlTag; txnControlTag = kTXNTabSettingsTag; err = TXNGetTXNObjectControls( varsp->fTXNObject, 1, &txnControlTag, &txnTabData ); if (err == noErr) { * (SInt16*) inBuffer = txnTabData.value; if (outBufferSize != NULL) *outBufferSize = sizeof(SInt16); } } returnedResult = err; break; } return returnedResult; }