2de0830d909f07cbba63b6f4c618f308aacadfa4
[WebKit-https.git] / Source / WebInspectorUI / UserInterface / Views / TreeOutlineGroup.js
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 WI.TreeOutlineGroup = class TreeOutlineGroup extends WI.Collection
27 {
28     constructor()
29     {
30         super((object) => object instanceof WI.TreeOutline);
31     }
32
33     // Static
34
35     static groupForTreeOutline(treeOutline)
36     {
37         return treeOutline[WI.TreeOutlineGroup.GroupForTreeOutlineSymbol] || null;
38     }
39
40     // Public
41
42     get selectedTreeElement()
43     {
44         for (let treeOutline of this.items) {
45             if (treeOutline.selectedTreeElement)
46                 return treeOutline.selectedTreeElement;
47         }
48
49         return null;
50     }
51
52     // Protected
53
54     itemAdded(treeOutline)
55     {
56         console.assert(!treeOutline[WI.TreeOutlineGroup.GroupForTreeOutlineSymbol]);
57         treeOutline[WI.TreeOutlineGroup.GroupForTreeOutlineSymbol] = this;
58
59         if (treeOutline.selectedTreeElement)
60             this._removeConflictingTreeSelections(treeOutline.selectedTreeElement);
61     }
62
63     itemRemoved(treeOutline)
64     {
65         console.assert(treeOutline[WI.TreeOutlineGroup.GroupForTreeOutlineSymbol] === this);
66         treeOutline[WI.TreeOutlineGroup.GroupForTreeOutlineSymbol] = null;
67     }
68
69     didSelectTreeElement(treeElement)
70     {
71         // Called by TreeOutline.
72
73         if (!treeElement)
74             return;
75
76         this._removeConflictingTreeSelections(treeElement);
77     }
78
79     // Private
80
81     _removeConflictingTreeSelections(treeElement)
82     {
83         let selectedTreeOutline = treeElement.treeOutline;
84         console.assert(selectedTreeOutline, "Should have a parent tree outline.");
85
86         for (let treeOutline of this.items) {
87             if (selectedTreeOutline === treeOutline)
88                 continue;
89
90             if (treeOutline.selectedTreeElement)
91                 treeOutline.selectedTreeElement.deselect();
92         }
93     }
94 };
95
96 WI.TreeOutlineGroup.GroupForTreeOutlineSymbol = Symbol("group-for-tree-outline");