aboutsummaryrefslogtreecommitdiff
path: root/js/components/treeview/treeview.reel/treeview.js
blob: ebbfe685d3a92355688c558d022699f8d4aa5093 (plain)
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
125
126
127
128
129
/* <copyright>
 This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
 No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
 (c) Copyright 2011 Motorola Mobility, Inc.  All Rights Reserved.
 </copyright> */

var Montage   = require("montage/core/core").Montage,
    Component = require("montage/ui/component").Component;

exports.Treeview = Montage.create(Component, {

    substitution      : { value : null },
    data              : { value : null },

    _hasBeenDeserialized: {
        value: false,
        enumerable: false
    },

    branchComponent : {
        value: null,
        serializable: true
    },
    leafComponent : {
        value: null,
        serializable: true
    },

    hasTemplate: {
        value: true
    },
    templateDidLoad : {
        value : function() {
            this._initializeRootBranch();
        }
    },
    _initializeRootBranch : {
        value: function() {
            var rootBranch;

            ///// Get user-defined branch/leaf components or use defaults
            this.branchComponent = this.branchComponent || this.defaultBranchComponent;

            ///// Tell branch component what the label key is (defined in tree controller)
            this.branchComponent.labelKey = this.contentController.labelKey;

            ///// Tell branch component what the branch key is (so it can recursively generate branches)
            this.branchComponent.branchKey = this.contentController.branchKey;

            rootBranch = Montage.create(this.branchComponent);
            rootBranch.hideLabel = !this.showRoot;
            rootBranch.treeView = this;

            this.slot.content = rootBranch;
            rootBranch.sourceObject = this.contentController.root;
            rootBranch.needsDraw = true;
            this.needsDraw = true;

        }
    },
    showRoot : {
        value: null
    },

    _contentController: {
        enumerable: false,
        value: null
    },

    contentController: {
        enumerable: false,
        get: function() {
            return this._contentController;
        },
        set: function(value) {
            if (this._contentController === value) {
                return;
            }

            if (this._contentController) {
                Object.deleteBinding(this, "selectedIndexes");
            }

            this._contentController = value;

            if (this._contentController) {

                // And bind what we need from the new contentController
                var selectedIndexesBindingDescriptor;

                selectedIndexesBindingDescriptor = {
                    boundObject: this._contentController,
                    boundObjectPropertyPath: "selectedIndexes"
                };

                if (this._hasBeenDeserialized) {
                    Object.defineBinding(this, "selectedIndexes", selectedIndexesBindingDescriptor);
                } else {
                    // otherwise we need to defer it until later; we haven't been deserialized yet
                    if (!this._controllerBindingsToInstall) {
                        this._controllerBindingsToInstall = {};
                    }
                    this._controllerBindingsToInstall.selectedIndexes = selectedIndexesBindingDescriptor;
                }
            }

        }
    },

    deserializedFromTemplate: {
        value: function() {
            var controllerBindingDescriptorsToInstall = this._controllerBindingsToInstall;

            if (controllerBindingDescriptorsToInstall) {
                for (var key in controllerBindingDescriptorsToInstall) {
                    Object.defineBinding(this, key, controllerBindingDescriptorsToInstall[key]);
                }
                delete this._controllerBindingsToInstall;
            }

            this._hasBeenDeserialized = true;
        }
    },

    selectedIndexes: {
        enumerable: false,
        value: null
    }
});