SophiaFramework UNIVERSE 5.3 |
SFXEditor クラスは、 BREW ネイティブテキスト入力コントロール( BREW API ITextCtl と BREW API IMenuCtl)をカプセル化して簡単に扱うための具象クラスです。
SFZSingleEditLabelControl クラスと SFZSingleEditBoxControl クラス、 SFZMultipleEditLabelControl クラスと SFZMultipleEditBoxControl クラスが、 それぞれ内部で子レスポンダとして保持する SFYSingleEditWidget クラス、SFYMultipleEditWidget クラスで内部的に利用されます。
SophiaFramework UNIVERSE では、BREW ネイティブテキスト入力コントロールの処理は SFXBaseEditor、 SFXEditor、 SFXEditProperty クラスに一元化されています。 そして、BREW SDK のバージョンや、シミュレータ、実機に関係なく、単一の同じコードを記述するだけで良いように実装されています。
SFXBaseEditor | SFXEditProperty | SFZSingleEditLabelControl | SFZSingleEditBoxControl | SFYSingleEditWidget | SFZMultipleEditLabelControl | SFZMultipleEditBoxControl | SFYMultipleEditWidget | BREW API ITextCtl | BREW API IMenuCtl | BREW API AEETextInputMode
コンストラクタ/デストラクタ |
---|
SFXEditor( Void ) SFXEditor クラスのコンストラクタです。
|
~SFXEditor( Void ) SFXEditor クラスのデストラクタです。
|
パブリック関数 | |
---|---|
Void |
Close( Void ) ネイティブテキスト入力コントロールを終了します。
|
SFCError |
Open(
SFXEditPropertyPtr property
, CallbackSPP spp
, VoidPtr reference
) ネイティブテキスト入力コントロールを開始します。
|
AEECLSID |
GetSFBMenuCtlClassID( Void )
(SFXBaseEditor から継承)
ネイティブテキスト入力コントロールのメニューコントロールのクラス ID を取得します。
|
AEECLSID |
GetSFBTextCtlClassID( Void )
(SFXBaseEditor から継承)
ネイティブテキスト入力コントロールのクラス ID を取得します。
|
Void |
SetSFBMenuCtlClassID(
AEECLSID param
)
(SFXBaseEditor から継承)
メニューコントロールのクラス ID を設定します。
|
Void |
SetSFBTextCtlClassID(
AEECLSID param
)
(SFXBaseEditor から継承)
ネイティブテキスト入力コントロールのクラス ID を設定します。
|
プロテクト関数 | |
---|---|
static SFCError |
RegisterBypass(
SFCApplication::CallbackSPP spp
, VoidPtr reference
)
(SFXBaseEditor から継承)
優先的イベントハンドラを登録します。
|
static Void |
UnregisterBypass(
SFCApplication::CallbackSPP spp
, VoidPtr reference
)
(SFXBaseEditor から継承)
優先的イベントハンドラの登録を解除します。
|
型 |
---|
CallbackSPP
(SFXBaseEditor から継承)
ネイティブテキスト入力コントロール(FEP)終了時に呼び出されるコールバック関数を表す型です。
|
[ public, explicit ] SFXEditor(Void);
このコンストラクタは、 内部で保持する SFXEditProperty インスタンスへのポインタを null に設定します。
[ public ] ~SFXEditor(Void);
このデストラクタは、 SFXEditor::Close 関数を呼び出してネイティブテキスト入力コントロールを終了します。
[ public ] Void Close(Void);
この関数は、ネイティブテキスト入力コントロールを終了します。
具体的には、この関数は、 SFXBaseEditor::SetSFBMenuCtlClassID / SFXBaseEditor::SetSFBTextCtlClassID 関数を呼び出して 設定したメニューコントロールとネイティブテキスト入力コントロールを非アクティブにして解放します。 また、SFXBaseEditor::UnregisterBypass 関数を呼び出して優先的イベントハンドラの登録を解除します。
優先的イベントハンドラについて | |
---|---|
SFXEventBypass::Register にある解説を参照してください。 |
注意 | |
---|---|
SFXEditor::Close 関数は、 SFXEditor::Open 関数内部でエラーが発生したとき、 または SFXEditor::~SFXEditor 関数内で自動的に呼び出されます。 |
SFXEditor::~SFXEditor 関数の実装における使用例です。
/*public */SFXEditor::~SFXEditor(Void) { Close(); }// SFXEditor::~SFXEditor //
この関数の内部実装は以下の通りです。
/*public */SFXEditor::~SFXEditor(Void) /*public */Void SFXEditor::Close(Void) { if (_textctl != null) { _textctl->SetSoftKeyMenu(SFBMenuCtlSmp::EmptyInstance()); _textctl->SetActive(false); } UnregisterBypass(XALLBACK_INTERNAL(OnBypass)); _textctl.Release(); _menuctl.Release(); _property = null; return; }// SFXEditor::Close //
SFXBaseEditor::SetSFBMenuCtlClassID | SFXBaseEditor::SetSFBTextCtlClassID | SFXBaseEditor::UnregisterBypass | SFXEditor::Open | SFXEditor::~SFXEditor
[ public, virtual ] SFCError Open( SFXEditPropertyPtr property // ネイティブテキスト入力コントロールのプロパティ CallbackSPP spp // ネイティブテキスト入力コントロール終了時に起動されるコールバック関数 VoidPtr reference // コールバック関数に渡されるデータ(参照値) );
この関数は、ネイティブテキスト入力コントロールを開始します。
spp 引数には、テキスト入力コントロール終了時に起動されるコールバック関数 (SFXBaseEditor::CallbackSPP)を指定します。 reference 引数には、そのコールバック関数に渡すデータを指定します。
具体的には、この関数は、 SFXBaseEditor::SetSFBMenuCtlClassID / SFXBaseEditor::SetSFBTextCtlClassID / SFXEditProperty::SetPasswordMode / SFXEditProperty::SetInputMode / SFXEditProperty::SetMaximumLength / SFXEditProperty::SetText 関数を使用して設定された内容でネイティブテキスト入力コントロールを作成します。 同時に、SFXBaseEditor::RegisterBypass 関数を呼び出して優先的イベントハンドラを登録します。 ネイティブテキスト入力コントロール終了後は、spp 引数に指定したコールバック関数を呼び出します。
優先的イベントハンドラについて | |
---|---|
SFXEventBypass::Register にある解説を参照してください。 |
以下は、SFYSingleEditWidget::Edit 関数の実装における使用例です。
class SFYSingleEditWidget : public SFYWidget { private: ... SFXEditProperty _property; ... }; // テキスト入力コントロールに遷移する関数 /*public */SFCError SFYSingleEditWidget::Edit(Void) { SFCError error(SFERR_NO_ERROR); // テキスト入力コントロールのテキストサイズの最大値を設定する if ((error = _property.SetMaximumLength(_maximum)) == SFERR_NO_ERROR) { // テキスト入力コントロールの初期値を設定する if ((error = _property.SetText(_text)) == SFERR_NO_ERROR) { // テキスト入力コントロールを起動する(標準 BREW に含まれる ITextCtl) // OnEditor は、テキスト入力コントロール終了時に起動されるコールバック関数 error = _editor.Open(XALLBACK_INTERNAL(OnEditor)); } } return error; }// SFYSingleEditWidget::Edit // // テキスト入力コントロール終了時に起動されるコールバック関数 /*private */XALLBACK_IMPLEMENT_SFXEDITOR(SFYSingleEditWidget, OnEditor, context) { SFCError error; if ((error = context) == SFERR_NO_ERROR) { // FEP にて入力されたテキストを取得し、内部で保持する SFYSingleTextWidget クラスに設定する if ((error = SetTextMaximumLength(_property.GetText(), _property.GetMaximumLength())) == SFERR_NO_ERROR) { // SFYSingleEditWidget クラスに SFEVT_RESPONDER_RESULT イベントを送信する InvokeForward(SFXEvent(SFEVT_RESPONDER_RESULT, SFP16_RESULT_OK, 0), false); } } if (error != SFERR_NO_ERROR) { // SFYSingleEditWidget クラスに SFEVT_RESPONDER_RESULT イベントを送信する InvokeForward(SFXEvent(SFEVT_RESPONDER_RESULT, SFP16_RESULT_ERROR, error), false); } return; }// XALLBACK_IMPLEMENT_SFXEDITOR(SFYSingleEditWidget, OnEditor) //
この関数の内部実装は以下の通りです。
テキスト入力コントロールの起動 /*public virtual*/SFCError SFXEditor::Open(SFXEditPropertyPtr property, CallbackSPP spp, VoidPtr reference) { #if defined TARGET_ENVIRONMENT_SIMULATOR || defined TARGET_LANGUAGE_ENGLISH static SFXRGBColor::AtomRecConst color[] = { {{{0x00, 0xFF, 0xFF, 0xFF}}}, {{{0x00, 0x00, 0x00, 0x00}}} }; #endif SFBDisplaySmp display; SFXWideString string; SFXRectangle remember; SFXRectangle rectangle; UInt32 flag; SFCError error(SFERR_NO_ERROR); if (property != null) { _property = property; if ((display = SFBDisplay::GetInstance()) != null) { display->GetClipRect(&remember); display->SetClipRect(SFXRectangle::EmptyInstance()); if ((_textctl = SFBTextCtl::NewInstance(GetSFBTextCtlClassID(), &error)) != null) { if ((_menuctl = SFBMenuCtl::NewInstance(GetSFBMenuCtlClassID(), &error)) != null) { if ((error = string.Set(ITEM_NAME)) == SFERR_NO_ERROR) { if (_menuctl->AddItem(LABEL_OK, &string, reinterpret_cast<UInt32>(_menuctl.Get()))) { _textctl->SetSoftKeyMenu(_menuctl); #if defined TARGET_ENVIRONMENT_SIMULATOR || defined TARGET_LANGUAGE_ENGLISH flag = TP_FRAME | TP_MULTILINE | TP_FIXSETRECT; #else flag = TP_NODRAW | TP_FRAME | TP_NOUPDATE | TP_FIXSETRECT; #endif if (_property->GetPasswordMode()) { flag |= TP_PASSWORD; } _textctl->SetProperties(flag); rectangle.Set(SFXGrid::ZeroInstance(), SFXDevice().GetScreenSize()); rectangle.SubBottom(_menuctl->GetRect().GetHeight()); _textctl->SetRect(rectangle); _textctl->SetMaxSize(_property->GetMaximumLength()); _textctl->SetInputMode(_property->GetInputMode()); if (_textctl->SetText(_property->GetText())) { if ((error = RegisterBypass(XALLBACK_INTERNAL(OnBypass))) == SFERR_NO_ERROR) { _spp = spp; _reference = reference; } } else { error = SFERR_FAILED; } } else { error = SFERR_FAILED; } } } } if (error != SFERR_NO_ERROR) { Close(); } display->SetClipRect(remember); if (error == SFERR_NO_ERROR) { #if defined TARGET_ENVIRONMENT_SIMULATOR || defined TARGET_LANGUAGE_ENGLISH display->SetColor(CLR_USER_TEXT, color[1]); display->SetColor(CLR_USER_BACKGROUND, color[0]); display->SetColor(CLR_USER_LINE, color[1]); #endif _textctl->SetActive(true); _textctl->SetCursorPos(TC_CURSORSTART); } } else { error = SFERR_FAILED; } } else { error = SFERR_INVALID_PARAM; } return error; }// SFXEditor::Open // 優先的イベントハンドラ /*private */XALLBACK_IMPLEMENT_SFCAPPLICATION(SFXEditor, OnBypass, event) { SFXWideString string; SFCApplicationPtr application; SFCError error; Bool result(false); result = _textctl->HandleEvent(event); #if defined TARGET_ENVIRONMENT_SIMULATOR || defined TARGET_LANGUAGE_ENGLISH if (!result) { result = _menuctl->HandleEvent(event); } #endif switch (event.GetType()) { case SFEVT_APP_RESUME: #if defined TARGET_ENVIRONMENT_SIMULATOR || defined TARGET_LANGUAGE_ENGLISH if (_menuctl->IsActive()) { _menuctl->SetActive(false); } if (!_textctl->IsActive()) { _textctl->SetActive(true); } #endif result = true; break; case SFEVT_APP_SUSPEND: result = true; break; case SFEVT_KEY: case SFEVT_KEY_PRESS: case SFEVT_KEY_RELEASE: #if TARGET_VERSION_LT(3, 0, 0) case SFEVT_KEY_HELD: #endif result = true; break; case SFEVT_COMMAND: if (!result) { switch (event.GetP16()) { case LABEL_OK: if ((error = string.Set(_textctl->GetTextPtr())) == SFERR_NO_ERROR) { if ((error = _property->SetText(string)) == SFERR_NO_ERROR) { _property->SetInputMode(_textctl->GetInputMode()); } } Close(); if (_spp != null) { (*_spp)(error, _reference); } if ((application = SFCApplication::GetInstance()) != null) { application->RenderDeviceScreen(); } break; default: break; } result = true; } break; default: break; } return result; }// XALLBACK_IMPLEMENT_SFCAPPLICATION(SFXEditor, OnBypass) //
SFXEditor::Close | SFXBaseEditor::SetSFBMenuCtlClassID | SFXBaseEditor::SetSFBTextCtlClassID | SFXEditProperty::SetPasswordMode | SFXEditProperty::SetInputMode | SFXEditProperty::SetMaximumLength | SFXEditProperty::SetText | SFXBaseEditor::RegisterBypass | SFCApplication::RenderDeviceScreen | SFXBaseEditor::CallbackSPP |
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |