-/* mUPOpenControl initializes a user pane control so it will be drawn
- and will behave as a scrolling text edit field inside of a window.
- This routine performs all of the initialization steps necessary,
- except it does not create the user pane control itself. theControl
- should refer to a user pane control that you have either created
- yourself or extracted from a dialog's control heirarchy using
- the GetDialogItemAsControl routine. */
-OSStatus mUPOpenControl(ControlHandle theControl, bool multiline) {
- Rect bounds;
- WindowPtr theWindow;
- STPTextPaneVars **tpvars, *varsp;
- OSStatus err;
- RGBColor rgbWhite = {0xFFFF, 0xFFFF, 0xFFFF};
- TXNBackground tback;
-
- /* set up our globals */
- if (gTPDrawProc == NULL) gTPDrawProc = NewControlUserPaneDrawUPP(TPPaneDrawProc);
- if (gTPHitProc == NULL) gTPHitProc = NewControlUserPaneHitTestUPP(TPPaneHitTestProc);
- if (gTPTrackProc == NULL) gTPTrackProc = NewControlUserPaneTrackingUPP(TPPaneTrackingProc);
- if (gTPIdleProc == NULL) gTPIdleProc = NewControlUserPaneIdleUPP(TPPaneIdleProc);
- if (gTPKeyProc == NULL) gTPKeyProc = NewControlUserPaneKeyDownUPP(TPPaneKeyDownProc);
- if (gTPActivateProc == NULL) gTPActivateProc = NewControlUserPaneActivateUPP(TPPaneActivateProc);
- if (gTPFocusProc == NULL) gTPFocusProc = NewControlUserPaneFocusUPP(TPPaneFocusProc);
-
- /* allocate our private storage */
- tpvars = (STPTextPaneVars **) NewHandleClear(sizeof(STPTextPaneVars));
- SetControlReference(theControl, (long) tpvars);
- HLock((Handle) tpvars);
- varsp = *tpvars;
- /* set the initial settings for our private data */
- varsp->fInFocus = false;
- varsp->fIsActive = true;
- varsp->fTEActive = false;
- varsp->fUserPaneRec = theControl;
- theWindow = varsp->fOwner = GetControlOwner(theControl);
-#if TARGET_CARBON
- varsp->fDrawingEnvironment = GetWindowPort(varsp->fOwner);
-#else
- varsp->fDrawingEnvironment = (GrafPtr) GetWindowPort(varsp->fOwner);
-#endif
- varsp->fInDialogWindow = ( GetWindowKind(varsp->fOwner) == kDialogWindowKind );
- /* set up the user pane procedures */
- SetControlData(theControl, kControlEntireControl, kControlUserPaneDrawProcTag, sizeof(gTPDrawProc), &gTPDrawProc);
- SetControlData(theControl, kControlEntireControl, kControlUserPaneHitTestProcTag, sizeof(gTPHitProc), &gTPHitProc);
- SetControlData(theControl, kControlEntireControl, kControlUserPaneTrackingProcTag, sizeof(gTPTrackProc), &gTPTrackProc);
- SetControlData(theControl, kControlEntireControl, kControlUserPaneIdleProcTag, sizeof(gTPIdleProc), &gTPIdleProc);
- SetControlData(theControl, kControlEntireControl, kControlUserPaneKeyDownProcTag, sizeof(gTPKeyProc), &gTPKeyProc);
- SetControlData(theControl, kControlEntireControl, kControlUserPaneActivateProcTag, sizeof(gTPActivateProc), &gTPActivateProc);
- SetControlData(theControl, kControlEntireControl, kControlUserPaneFocusProcTag, sizeof(gTPFocusProc), &gTPFocusProc);
- /* calculate the rectangles used by the control */
- GetControlBounds(theControl, &bounds);
- SetRect(&varsp->fRFocusOutline, bounds.left, bounds.top, bounds.right, bounds.bottom);
- SetRect(&varsp->fRTextOutline, bounds.left, bounds.top, bounds.right, bounds.bottom);
- SetRect(&varsp->fRTextArea, bounds.left, bounds.top, bounds.right, bounds.bottom);
- /* calculate the background region for the text. In this case, it's kindof
- and irregular region because we're setting the scroll bar a little ways inside
- of the text area. */
- RectRgn((varsp->fTextBackgroundRgn = NewRgn()), &varsp->fRTextOutline);
-
- /* set up the drawing environment */
- SetPort(varsp->fDrawingEnvironment);
-
- /* create the new edit field */
- TXNNewObject(NULL, varsp->fOwner, &varsp->fRTextArea,
- kTXNWantVScrollBarMask | kTXNAlwaysWrapAtViewEdgeMask,
- kTXNTextEditStyleFrameType,
- kTXNTextensionFile,
- kTXNSystemDefaultEncoding,
- &varsp->fTXNRec, &varsp->fTXNFrame, (TXNObjectRefcon) tpvars);
-
- /* set the field's background */
- tback.bgType = kTXNBackgroundTypeRGB;
- tback.bg.color = rgbWhite;
- TXNSetBackground( varsp->fTXNRec, &tback);
-
- /* install our focus advance override routine */
-#if TARGET_CARBON
- varsp->handlerUPP = NewEventHandlerUPP(FocusAdvanceOverride);
- err = InstallWindowEventHandler( varsp->fOwner, varsp->handlerUPP,
- kMLTEEventCount, gMLTEEvents, tpvars, &varsp->handlerRef );
-#endif
- /* unlock our storage */
- HUnlock((Handle) tpvars);
- /* perform final activations and setup for our text field. Here,
- we assume that the window is going to be the 'active' window. */
- TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus);
- /* all done */
- return noErr;