# All files / scripts/CDP/UI/listview ListItemView.ts

33.33% Statements 15/45
12.5% Branches 2/16
25% Functions 3/12
30.23% Lines 13/43

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    1251x

    1x

    1x
    1x

    1x

    1x

    1x

    1x

    1x

    1x

    1x

    1x

    1x

     ﻿namespace CDP.UI {

        const TAG = "[CDP.UI.ListItemView] ";

        /**
         * @interface ListItemViewOptions
         * @brief ListItemView のオプション
         */
        export interface ListItemViewOptions<TModel extends Backbone.Model = Backbone.Model>
            extends Backbone.ViewOptions<TModel> {
            owner: BaseListView;
            $el?: JQuery;
            lineProfile: LineProfile;
        }

        /**
         * @class ListItemView
         * @brief ListView が扱う ListItem コンテナクラス
         */
        export class ListItemView<TModel extends Backbone.Model = Backbone.Model>
            extends Backbone.View<TModel> implements IListItemView, IComposableView {

            private _owner: BaseListView = null;
            private _lineProfile: LineProfile = null;

            /**
             * constructor
             */
            constructor(options: ListItemViewOptions<TModel>) {
                super(options);
                this._owner = options.owner;
                if (options.$el) {
                    const delegates = (<any>this).events ? true : false;
                    this.setElement(options.$el, delegates);
                }
                this._lineProfile = options.lineProfile;
            }

            ///////////////////////////////////////////////////////////////////////
            // Implements: ListItemView

            //! 描画: framework から呼び出されるため、オーバーライド必須
            render(): ListItemView<TModel> {
                console.warn(TAG + "need override 'render()' method.");
                return this;
            }

            //! 自身の Line インデックスを取得
            getIndex(): number {
                return this._lineProfile.index;
            }

            //! 自身に指定された高さを取得
            getSpecifiedHeight(): number {
                return this._lineProfile.height;
            }

            //! child node が存在するか判定
            hasChildNode(): boolean {
                if (!this.$el) {
                    return false;
                } else {
                    return 0 < this.$el.children().length;
                }
            }

            /**
             * 高さを更新
             *
             * @param newHeight {Number}              [in] 新しい高さ
             * @param options   {UpdateHeightOptions} [in] line の高さ更新時に影響するすべての LineProfile の再計算を行う場合は { reflectAll: true }
             * @return {ListItemView} インスタンス
             */
            updateHeight(newHeight: number, options?: UpdateHeightOptions): ListItemView<TModel> {
                if (this.$el) {
                    if (this.getSpecifiedHeight() !== newHeight) {
                        this._lineProfile.updateHeight(newHeight, options);
                        this.$el.height(newHeight);
                    }
                }
                return this;
            }

            ///////////////////////////////////////////////////////////////////////
            // Implements: IComposableView

            /**
             * すでに定義された Backbone.View を基底クラスに設定し、extend を実行する。
             *
             * @param derives         {Backbone.View|Backbone.View[]} [in] 合成元の View クラス
             * @param properties      {Object}                        [in] prototype プロパティ
             * @param classProperties {Object}                        [in] static プロパティ
             * @return {Backbone.View|Backbone.View[]} 新規に生成された View のコンストラクタ
             */
            static compose(derives: ViewConstructor | ViewConstructor[], properties: any, classProperties?: any): ViewConstructor {
                const composed: any = composeViews(ListItemView, derives);
                return composed.extend(properties, classProperties);
            }

            ///////////////////////////////////////////////////////////////////////
            // Override: Backbone.View

            //! 開放
            remove(): ListItemView<TModel> {
                // xperia AX Jelly Bean (4.1.2)にて、メモリーリークを軽減させる効果
                this.$el.find("figure").css("background-image", "none");
                // this.$el は再利用するため破棄しない
                this.$el.children().remove();
                this.$el.off();
                this.$el = null;
                this.stopListening();
                this._lineProfile = null;
                return this;
            }

            ///////////////////////////////////////////////////////////////////////
            // short cut methods

            //! Owner 取得
            get owner(): BaseListView {
                return this._owner;
            }
        }
    }