前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3
SFXEditor
ネイティブテキスト入力コントロールエディタの具象クラスです。
#include <SFXEditor.h.hpp>
class SFXEditor : public SFXBaseEditor;
SFMTYPEDEFCLASS(SFXEditor)

継承図

SFXEditor クラスの継承図

協調図

SFXEditor クラスの協調図

解説

SFXEditor クラスは、 BREW ネイティブテキスト入力コントロール( BREW API ITextCtl BREW API IMenuCtl)をカプセル化して簡単に扱うための具象クラスです。

SFZSingleEditLabelControl クラスと SFZSingleEditBoxControl クラス、 SFZMultipleEditLabelControl クラスと SFZMultipleEditBoxControl クラスが、 それぞれ内部で子レスポンダとして保持する SFYSingleEditWidget クラス、SFYMultipleEditWidget クラスで内部的に利用されます。

SophiaFramework UNIVERSE では、BREW ネイティブテキスト入力コントロールの処理は SFXBaseEditorSFXEditorSFXEditProperty クラスに一元化されています。 そして、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)終了時に呼び出されるコールバック関数を表す型です。

SFXEditor::SFXEditor
SFXEditor クラスのコンストラクタです。
[ public, explicit ]
SFXEditor(Void);

解説

このコンストラクタは、 内部で保持する SFXEditProperty インスタンスへのポインタを null に設定します。

参照

SFXEditProperty


SFXEditor::~SFXEditor
SFXEditor クラスのデストラクタです。
[ public ]
~SFXEditor(Void);

解説

このデストラクタは、 SFXEditor::Close 関数を呼び出してネイティブテキスト入力コントロールを終了します。

参照

SFXEditor::Close


SFXEditor::Close
ネイティブテキスト入力コントロールを終了します。
[ public ]
Void Close(Void);

解説

この関数は、ネイティブテキスト入力コントロールを終了します。

具体的には、この関数は、 SFXBaseEditor::SetSFBMenuCtlClassID / SFXBaseEditor::SetSFBTextCtlClassID 関数を呼び出して 設定したメニューコントロールとネイティブテキスト入力コントロールを非アクティブにして解放します。 また、SFXBaseEditor::UnregisterBypass 関数を呼び出して優先的イベントハンドラの登録を解除します。

[Note] 優先的イベントハンドラについて

SFXEventBypass::Register にある解説を参照してください。

[Note] 注意

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


SFXEditor::Open
ネイティブテキスト入力コントロールを開始します。
[ public, virtual ]
SFCError Open(
    SFXEditPropertyPtr property   // ネイティブテキスト入力コントロールのプロパティ
    CallbackSPP spp               // ネイティブテキスト入力コントロール終了時に起動されるコールバック関数
    VoidPtr reference             // コールバック関数に渡されるデータ(参照値)
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • spp 引数が null とき: SFERR_INVALID_PARAM
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、ネイティブテキスト入力コントロールを開始します。

spp 引数には、テキスト入力コントロール終了時に起動されるコールバック関数 (SFXBaseEditor::CallbackSPP)を指定します。 reference 引数には、そのコールバック関数に渡すデータを指定します。

具体的には、この関数は、 SFXBaseEditor::SetSFBMenuCtlClassID / SFXBaseEditor::SetSFBTextCtlClassID / SFXEditProperty::SetPasswordMode / SFXEditProperty::SetInputMode / SFXEditProperty::SetMaximumLength / SFXEditProperty::SetText 関数を使用して設定された内容でネイティブテキスト入力コントロールを作成します。 同時に、SFXBaseEditor::RegisterBypass 関数を呼び出して優先的イベントハンドラを登録します。 ネイティブテキスト入力コントロール終了後は、spp 引数に指定したコールバック関数を呼び出します。

[Note] 優先的イベントハンドラについて

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 |