/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ #include "CTSMEditField.h" Boolean CTSMEditField::sInitialized = false; Boolean CTSMEditField::sHasTSM = false; TSMTEPreUpdateUPP CTSMEditField::sPreUpdateUPP = NewTSMTEPreUpdateProc( CTSMEditField::PreUpdate ); TSMTEPostUpdateUPP CTSMEditField::sPostUpdateUPP = NewTSMTEPostUpdateProc( CTSMEditField::PostUpdate ); // Default constructor CTSMEditField::CTSMEditField () { } // CTSMEditField::CTSMEditField CTSMEditField::CTSMEditField( LStream* inStream ) : LEditField( inStream ) { if ( !sInitialized ) Initialize(); OSErr result = noErr; OSType theServiceTypes = kTSMTEInterfaceType; mTSMDocID = 0; mTSMTEHandle = NULL; Try_ { if ( sHasTSM ) { result = ::NewTSMDocument( 1, &theServiceTypes, &mTSMDocID, static_cast(&mTSMTEHandle) ); ThrowIfOSErr_( result ); if ( !mTSMTEHandle && mTSMDocID ) { ::DeleteTSMDocument( mTSMDocID ); mTSMDocID = 0; Throw_( paramErr ); } (*mTSMTEHandle)->textH = mTextEditH; (*mTSMTEHandle)->preUpdateProc = sPreUpdateUPP; (*mTSMTEHandle)->postUpdateProc = sPostUpdateUPP; (*mTSMTEHandle)->updateFlag = kTSMTEAutoScroll; (*mTSMTEHandle)->refCon = (Int32)this; } } Catch_( inErr ) { // Failure just means that this edit field won't support TSMTE } EndCatch_; } // // Parameterized constructor CTSMEditField::CTSMEditField ( const SPaneInfo& inPaneInfo, Str255 inString, ResIDT inTextTraitsID, Int16 inMaxChars, Uint8 inAttributes, TEKeyFilterFunc inKeyFilter, LCommander* inSuper) : LEditField ( inPaneInfo, inString, inTextTraitsID, inMaxChars, inAttributes, inKeyFilter, inSuper ) { } // CTSMEditField::CTSMEditField CTSMEditField::~CTSMEditField() { OSErr result = noErr; try { if ( mTSMDocID != 0 ) { ::FixTSMDocument( mTSMDocID ); ::DeactivateTSMDocument( mTSMDocID ); // for a bug in TSM. See TE27 result = ::DeleteTSMDocument( mTSMDocID ); Assert_( result == noErr ); mTSMDocID = 0; } } catch ( ... ) { } } pascal void CTSMEditField::PreUpdate( TEHandle inTEHandle, Int32 inRefCon ) { CTSMEditField *theOwnerEditField = NULL; if ( inRefCon != NULL ) { theOwnerEditField = reinterpret_cast( inRefCon ); theOwnerEditField->FocusDraw(); } } pascal void CTSMEditField::PostUpdate( TEHandle inTEHandle, Int32 fixLen, Int32 inputAreaStart, Int32 inputAreaEnd, Int32 pinStart, Int32 pinEnd, Int32 inRefCon ) { CTSMEditField *theOwnerEditField = NULL; if ( inRefCon != NULL && fixLen > 0 ) { theOwnerEditField = reinterpret_cast( inRefCon ); // Undo of TSM input is currently not supported. // if (theOwnerEditField->mTypingAction != NULL) theOwnerEditField->mTypingAction->Reset(); } } void CTSMEditField::BeTarget( void ) { OSErr result = noErr; short oldScript = ::GetScriptManagerVariable(smKeyScript); #ifdef Debug_Signal OSErr err; // check to see if a bug in TSM will be encountered ProcessSerialNumber psn, csn; err = GetCurrentProcess(&psn); err = GetFrontProcess(&csn); Assert_((psn.highLongOfPSN == csn.highLongOfPSN) && (psn.lowLongOfPSN == csn.lowLongOfPSN)); #endif FocusDraw(); LEditField::BeTarget(); if ( mTSMDocID != NULL ) { result = ::ActivateTSMDocument( mTSMDocID ); Assert_( result == noErr ); } if (oldScript != ::GetScriptManagerVariable(smKeyScript)) ::KeyScript(oldScript); } void CTSMEditField::DontBeTarget( void ) { OSErr result = noErr; FocusDraw(); if ( mTSMDocID != NULL ) { ::FixTSMDocument( mTSMDocID ); result = ::DeactivateTSMDocument( mTSMDocID ); Assert_( result == noErr ); } LEditField::DontBeTarget(); } void CTSMEditField::Initialize() { OSErr result = noErr; SInt32 gestaltResponse = 0; Assert_( sInitialized == false ); if ( sInitialized == false ) { sInitialized = true; result = ::Gestalt( gestaltTSMgrVersion, &gestaltResponse ); if ( (result == noErr) && (gestaltResponse >= 1) ) { result = ::Gestalt( gestaltTSMTEAttr, &gestaltResponse ); if ( (result == noErr) && ((gestaltResponse >> gestaltTSMTEPresent) & 1) ) { sHasTSM = true; } } } }