mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-14 15:37:55 +00:00
283 lines
5.5 KiB
C++
283 lines
5.5 KiB
C++
/* -*- 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<long>(&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<CTSMEditField *>( 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<CTSMEditField *>( 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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|