前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3
SFOTableCellToggleReactor
テーブルセルにチェックボックスの描画・編集機能を提供するクラスです。
#include <SFOTableCellToggleReactor.h.hpp>
class SFOTableCellToggleReactor : public SFOTableCellReactor;
SFMTYPEDEFREFOBJECT(SFOTableCellToggleReactor)
        

継承図

SFOTableCellToggleReactor クラスの継承図

協調図

SFOTableCellToggleReactor クラスの協調図

解説

SFOTableCellToggleReactor クラスは、 Bool 型のセルオブジェクトに対して、 チェックボックス機能を提供するテーブルセルリアクターです。

テーブルセルをセレクトしたときにチェックマークの状態を反転させたい場合は、 SFLPROP_EDITABLE 属性を true に設定します。

参照

SFOTableCellReactor | SFXHierarchyProperty

メンバ

コンストラクタ/デストラクタ
SFOTableCellToggleReactor( Void )
SFOTableCellToggleReactor クラスのコンストラクタです。
~SFOTableCellToggleReactor( Void )
SFOTableCellToggleReactor クラスのデストラクタです。
パブリック関数
static
SFOTableCellToggleReactorSmp
NewInstance( SFCErrorPtr exception = null )
新しいインスタンスを作成します。
ValueRec GetProperty( UInt32 key , BoolPtr found = null , Bool recursive = true ) (SFOTableCellReactor から継承)
属性キーに対応する属性値を取得します。
Bool HasProperty( UInt32 key , Bool recursive = true ) (SFOTableCellReactor から継承)
指定された属性キーに対応する属性値が設定されているかどうかを判定します。
SFCError SetProperty( UInt32 key , ValueRec value ) (SFOTableCellReactor から継承)
属性キーに対応する属性値を設定します。
プロテクト関数
Bool Handle( SFXAnyRef object , SInt32 row )
テーブルセルが選択されたときにチェックマークの状態を反転させます。
SFCError Initialize( Void )
初期化を行います。
Void Render( SFXGraphicsPtr graphics , SFXRectangleConstRef bound , SFXAnyConstRef object , SInt32 row , Bool active , Bool focus )
テーブルセルにチェックボックスを描画します。
static
SFXRectangle
Align( SFXRectangleConstRef src , SFXRectangleConstRef ref , UInt32 alignment ) (SFOTableCellReactor から継承)
指定された矩形領域を基準となる矩形領域に基づいて整列した矩形領域を返します。
static
SFORefObjectSmp
Factory( SFORefObjectPtr object , SFCErrorPtr exception ) (SFORefObject から継承)
NewInstance 関数の実装を補助します。
UInt32 GetAlignment( Void ) (SFOTableCellReactor から継承)
アライメントを取得します。
SFXMargin GetMargin( Void ) (SFOTableCellReactor から継承)
テーブルセルの領域とセルの描画領域のマージンを取得します。
Void InvokeResultCell( Void ) (SFOTableCellReactor から継承)
テーブルセルの選択完了を知らせます。
Bool IsEditable( Void ) (SFOTableCellReactor から継承)
編集可能であるかどうかを判別します。
Bool IsWidgetAttachable( Void ) (SFOTableCellReactor から継承)
ウィジェットを取り付け可能かどうかを判定します。
Void OffFocus( SInt32 row , SFYWidgetSmpPtr widget ) (SFOTableCellReactor から継承)
テーブルセルのフォーカスが外れたときの振る舞いを行います。
Void OnFocus( SFXRectangleConstRef bound , SFXAnyConstRef object , SInt32 row , SFYWidgetSmpPtr widget ) (SFOTableCellReactor から継承)
テーブルセルにフォーカスが当たったときの振る舞いを行います。

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

解説

このコンストラクタは、 何も行いません。


SFOTableCellToggleReactor::~SFOTableCellToggleReactor
SFOTableCellToggleReactor クラスのデストラクタです。
[ protected, virtual ]
~SFOTableCellToggleReactor(Void);

解説

このデストラクタは、 何も行いません。


SFOTableCellToggleReactor::Handle
テーブルセルが選択されたときにチェックマークの状態を反転させます。
[ protected, virtual ]
Bool Handle(
    SFXAnyRef object   // セルオブジェクト
    SInt32 row         // 選択されたセルの行番号
);

戻り値

  • 真偽値が変更されたとき: true
  • そうでないとき: false

解説

この関数は、 テーブルセルが選択されたときにチェックマークの状態を反転させます。

編集モードであれば、選択されたテーブルセルの Bool 型セルオブジェクトに対して、真偽値を反転させます。

関数の最後で SFOTableCellReactor::InvokeResultCell 関数を呼び出します。

内部実装

この関数の内部実装は以下の通りです。

/*protected virtual */Bool SFOTableCellToggleReactor::Handle(SFXAnyRef object, SInt32 row)
{
    BoolRef                                     toggle(*any_cast<Bool>(&object));
    Bool                                        editable;

    unused(row);
    editable = IsEditable();
    if (editable) {
        toggle = !toggle;
    }
    InvokeResultCell();
    return editable;
}// SFOTableCellToggleReactor::Handle //

参照

SFOTableCellReactor::InvokeResultCell


SFOTableCellToggleReactor::Initialize
初期化を行います。
[ protected, virtual ]
SFCError Initialize(Void);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • メモリ不足のとき: SFERR_NO_MEMOERY

解説

この関数は、 (エラーが発生する可能性のある)初期化を行います。

デフォルトの実装では、 SFLPROP_LEFTTOP_MARGIN_SIZE 属性(セルの左上マージン)と SFLPROP_RIGHTBOTTOM_MARGIN_SIZE 属性(セルの右上マージン)を共に (1, 1) に設定します。

[Note] 注意

この関数は SFORefObject::Factory 関数内で呼ばれます。

具象クラス固有の初期化コードがあり、エラーが発生する可能性がある場合、 オーバーライドする必要があります。

以下の内部実装にあるように、 この関数は、親クラスの Initialize() 関数を先に呼び出して実装します。

内部実装

この関数の内部実装は以下の通りです。

/*protected */SFCError SFOTableCellToggleReactor::Initialize(Void)
{
    static SFXSize::AtomRecConst                MARGINSIZE = {
        1, 1
    };
    SFCError                                    error;

    if ((error = SFOTableCellReactor::Initialize()) == SFERR_NO_ERROR) {
        if ((error = SetProperty(SFLPROP_LEFTTOP_MARGIN_SIZE, MARGINSIZE)) == SFERR_NO_ERROR) {
            error = SetProperty(SFLPROP_RIGHTBOTTOM_MARGIN_SIZE, MARGINSIZE);
        }
    }
    return error;
}// SFOTableCellToggleReactor::Initialize //

参照

SFORefObject::Factory | SFOTableCellReactor::GetMargin


SFOTableCellToggleReactor::NewInstance
新しいインスタンスを作成します。
[ public, static ]
SFOTableCellToggleReactorSmp NewInstance(
    SFCErrorPtr exception = null   // エラー値
);

引数

exception

関数内部で発生したエラー値を返します。

戻り値

  • 成功したとき: null 以外のポインタ
  • 失敗したとき: null ポインタ

解説

この関数は、SFOTableCellToggleReactor インスタンスを作成します。

インスタンスの作成に成功した場合は null 以外のポインタを返します。 失敗した場合は、null ポインタを返します。

exception 引数を指定した場合、 この引数にはエラー値が返ります。

使用例

以下は、SFOTableCellToggleReactor インスタンスを生成するためのコードです。

SFOTableCellReactorSmp rtor;
SFCError error;

if ((rtor = SFOTableCellToggleReactor::NewInstance(&error)) != null) {

    // 編集可に設定する
    rtor->SetProperty(SFLPROP_EDITABLE, true);

    // .. (省略) ..
}

参照

SFOTableCellToggleReactor


SFOTableCellToggleReactor::Render
テーブルセルにチェックボックスを描画します。
[ protected, virtual, const ]
Void Render(
    SFXGraphicsPtr graphics      // グラフィックスオブジェクト
    SFXRectangleConstRef bound   // テーブルセル領域
    SFXAnyConstRef object        // セルオブジェクト
    SInt32 row                   // 描画するセルの行番号
    Bool active                  // セルの活性状態
    Bool focus                   // セルのフォーカス状態
);

解説

この関数は、 テーブルセルの領域内にマージンとアライメントを考慮してチェックボックスを描画します。

描画の内容は、SFZCheckboxControl クラスのものと同等です。

内部実装

この関数の内部実装は以下の通りです。

/*protected virtual */Void SFOTableCellToggleReactor::Render(SFXGraphicsPtr graphics, SFXRectangleConstRef bound, SFXAnyConstRef object, SInt32 row, Bool active, Bool focus) const
{
    SFXRectangle                                rxCB;
    SFXRectangle                                content;
    SFXRectangle                                clip;
    SFXGrid                                     grid;
    Bool                                        press(false);
    Bool                                        checked(any_cast<Bool>(object));

    unused(row);
    clip.Set(graphics->GetClip());
    content.Set(SFXRectangle(bound).Deflate(GetMargin()));
    graphics->SetClip(SFXRectangle(content).Intersection(clip));
    if (content.GetHeight() >= 28) {
        rxCB.SetWidth(28).SetHeight(28);
        rxCB.Set(Align(rxCB, content, GetAlignment()));
        grid.Set(DrawShadow28(graphics, rxCB.GetOrigin(), active, press));
        DrawButton27(graphics, grid, active, focus, press);
        grid.Add(3, 3);
        DrawCheckmark21(graphics, grid, checked, active);
    }
    else if (content.GetHeight() >= 14) {
        rxCB.SetWidth(14).SetHeight(14);
        rxCB.Set(Align(rxCB, content, GetAlignment()));
        grid.Set(DrawShadow14(graphics, rxCB.GetOrigin(), active, press));
        DrawButton13(graphics, grid, active, focus, press);
        grid.Add(2, 2);
        DrawCheckmark09(graphics, grid, checked, active);
    }
    graphics->SetClip(clip);
    return;
}// SFOTableCellToggleReactor::Render //

/*protected */Void SFOTableCellToggleReactor::DrawCheckmark09(SFXGraphicsPtr graphics, SFXGridConstRef grid, Bool checked, Bool active) const
{
    static SFXLine::AtomRecConst                line[] = {
        {{ 0,  5}, { 2,  7}},
        {{ 3,  6}, { 8,  1}},
        {{ 0,  6}, { 2,  8}},
        {{ 3,  7}, { 8,  2}}
    };

    RenderCheckmark(graphics, grid, atomic_cast(line), checked, active);
    return;
}// SFOTableCellToggleReactor::DrawCheckmark09 //

/*protected */Void SFOTableCellToggleReactor::DrawCheckmark21(SFXGraphicsPtr graphics, SFXGridConstRef grid, Bool checked, Bool active) const
{
    static SFXLine::AtomRecConst                line[] = {
        {{ 0, 15}, { 4, 19}},
        {{ 5, 18}, {20,  3}},
        {{ 0, 16}, { 4, 20}},
        {{ 5, 19}, {20,  4}}
    };

    RenderCheckmark(graphics, grid, atomic_cast(line), checked, active);
    return;
}// SFOTableCellToggleReactor::DrawCheckmark21 //

/*protected */Void SFOTableCellToggleReactor::DrawButton13(SFXGraphicsPtr graphics, SFXGridConstRef grid, Bool active, Bool focus, Bool press) const
{
    static SFXRectangle::AtomRecConst           rectangle[] = {
        {{ 0,  0}, {13, 13}},
        {{ 2,  2}, { 9,  9}}
    };

    RenderButton(graphics, grid, atomic_cast(rectangle), active, focus, press);
    return;
}// SFOTableCellToggleReactor::DrawButton13 //

/*protected */Void SFOTableCellToggleReactor::DrawButton27(SFXGraphicsPtr graphics, SFXGridConstRef grid, Bool active, Bool focus, Bool press) const
{
    static SFXRectangle::AtomRecConst           rectangle[] = {
        {{ 0,  0}, {27, 27}},
        {{ 2,  2}, {23, 23}}
    };

    RenderButton(graphics, grid, atomic_cast(rectangle), active, focus, press);
    return;
}// SFOTableCellToggleReactor::DrawButton27 //

/*protected */SFXGrid SFOTableCellToggleReactor::DrawShadow14(SFXGraphicsPtr graphics, SFXGridConstRef grid, Bool active, Bool press) const
{
    static SFXLine::AtomRecConst                line[][2] = {
        {{{13,  0}, {13, 13}}, {{ 0, 13}, {13, 13}}},
        {{{ 0,  0}, {13,  0}}, {{ 0,  0}, { 0, 13}}}
    };
    SFXGrid                                     result(grid);

    if (press) {
        RenderShadow(graphics, grid, atomic_cast(line[1]), active);
        result.Add(1, 1);
    }
    else {
        RenderShadow(graphics, grid, atomic_cast(line[0]), active);
        result.Add(0, 0);
    }
    return result;
}// SFOTableCellToggleReactor::DrawShadow14 //

/*protected */SFXGrid SFOTableCellToggleReactor::DrawShadow28(SFXGraphicsPtr graphics, SFXGridConstRef grid, Bool active, Bool press) const
{
    static SFXLine::AtomRecConst                line[][2] = {
        {{{27,  0}, {27, 27}}, {{ 0, 27}, {27, 27}}},
        {{{ 0,  0}, {27,  0}}, {{ 0,  0}, { 0, 27}}}
    };
    SFXGrid                                     result(grid);

    if (press) {
        RenderShadow(graphics, grid, atomic_cast(line[1]), active);
        result.Add(1, 1);
    }
    else {
        RenderShadow(graphics, grid, atomic_cast(line[0]), active);
        result.Add(0, 0);
    }
    return result;
}// SFOTableCellToggleReactor::DrawShadow28 //

/*private */Void SFOTableCellToggleReactor::RenderCheckmark(SFXGraphicsPtr graphics, SFXGridConstRef grid, SFXLineConst line[4], Bool checked, Bool active) const
{
    SFXRGBColor                                 rgb;
    SFXRGBColor                                 checkmark(0x00, 0x00, 0x00, 0x00);
    Bool                                        checkmarkBright;

    if (checked) {
        graphics->SetTranslate(-grid);
        rgb.Set(checkmark);
        checkmarkBright = checkmark.GetBrightness() > 0x7F;
        if (!active) {
            (checkmarkBright) ? rgb.SubRGB(0x44) : rgb.AddRGB(0x44);
        }
        graphics->SetForeColor(rgb);
        graphics->DrawLine(line[0]);
        graphics->DrawLine(line[1]);
        (checkmarkBright) ? rgb.SubRGB(0x44) : rgb.AddRGB(0x44);
        graphics->SetForeColor(rgb);
        graphics->DrawLine(line[2]);
        graphics->DrawLine(line[3]);
        graphics->SetTranslate(grid);
    }
    return;
}// SFOTableCellToggleReactor::RenderCheckmark //

/*private */Void SFOTableCellToggleReactor::RenderButton(SFXGraphicsPtr graphics, SFXGridConstRef grid, SFXRectangleConst rectangle[2], Bool active, Bool focus, Bool press) const
{
    SFXBevelColor                               bevel;
    SFXRGBColorConstRef                         base(GetButtonColor().GetBase());
    SFXRGBColor                                 rgb;

    graphics->SetTranslate(-grid);
    bevel.Set(focus ? (GetFocusColor()) : (GetButtonColor()));
    rgb.Set(base);
    if (!active) {
        bevel.SetLight(bevel.GetBase());
        bevel.SetDark(bevel.GetBase());
    }
    if (press) {
        if (base.GetBrightness() > 0x7F) {
            bevel.SubRGB(0x11);
            rgb.SubRGB(0x11);
        }
        else {
            bevel.AddRGB(0x11);
            rgb.AddRGB(0x11);
        }
    }
    graphics->FillBevelRectangle(rectangle[0], bevel);
    graphics->FillRectangle(rectangle[1], rgb);
    graphics->SetTranslate(grid);
    return;
}// SFOTableCellToggleReactor::RenderButton //

/*private */Void SFOTableCellToggleReactor::RenderShadow(SFXGraphicsPtr graphics, SFXGridConstRef grid, SFXLineConst line[2], Bool active) const
{
    SFXRGBColor                                 rgb;

    graphics->SetTranslate(-grid);
    rgb.Set(GetShadowColor());
    if (!active) {
        (rgb.GetBrightness() > 0x7F) ? rgb.SubRGB(0x44) : rgb.AddRGB(0x44);
    }
    graphics->SetForeColor(rgb);
    graphics->DrawLine(line[0]);
    graphics->DrawLine(line[1]);
    graphics->SetTranslate(grid);
    return;
}// SFOTableCellToggleReactor::RenderShadow //

/*private static */SFXBevelColorConstRef SFOTableCellToggleReactor::GetFocusColor(Void)
{
    static SFXBevelColor::AtomRecConst          bevel = {
        {{{0x00, 0xCC, 0xCC, 0xCC}}}, {{{0x00, 0xAA, 0xAA, 0xAA}}}, {{{0x00, 0x55, 0x55, 0x55}}}
    };
    return bevel;
}// SFOTableCellToggleReactor::GetFocusColor //

/*private static */SFXBevelColorConstRef SFOTableCellToggleReactor::GetButtonColor(Void)
{
    static SFXBevelColor::AtomRecConst          bevel = {
        {{{0x00, 0xFF, 0xFF, 0xFF}}}, {{{0x00, 0xDD, 0xDD, 0xDD}}}, {{{0x00, 0x88, 0x88, 0x88}}}
    };
    return bevel;
}// SFOTableCellToggleReactor::GetButtonColor //

/*private static */SFXRGBColorConstRef SFOTableCellToggleReactor::GetShadowColor(Void)
{
    static SFXRGBColor::AtomRecConst            rgb = {
        {{0x00, 0x00, 0x00, 0x00}}
    };
    return rgb;
}// SFOTableCellToggleReactor::GetShadowColor //

参照

SFZCheckboxControl::HandleRenderRequest