• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2011 Google 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 are
6 * met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
14 * distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. AND ITS CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC.
20 * OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/**
30 * @constructor
31 * @extends {WebInspector.Object}
32 * @param {!WebInspector.Workspace} workspace
33 */
34WebInspector.SourcesNavigator = function(workspace)
35{
36    WebInspector.Object.call(this);
37    this._workspace = workspace;
38
39    this._tabbedPane = new WebInspector.TabbedPane();
40    this._tabbedPane.shrinkableTabs = true;
41    this._tabbedPane.element.classList.add("navigator-tabbed-pane");
42    new WebInspector.ExtensibleTabbedPaneController(this._tabbedPane, "navigator-view", this._navigatorViewCreated.bind(this));
43    /** @type {!StringMap.<?WebInspector.NavigatorView>} */
44    this._navigatorViews = new StringMap();
45}
46
47WebInspector.SourcesNavigator.Events = {
48    SourceSelected: "SourceSelected",
49    SourceRenamed: "SourceRenamed"
50}
51
52WebInspector.SourcesNavigator.prototype = {
53    /**
54     * @param {string} id
55     * @param {!WebInspector.View} view
56     */
57    _navigatorViewCreated: function(id, view)
58    {
59        var navigatorView = /** @type {!WebInspector.NavigatorView} */ (view);
60        navigatorView.addEventListener(WebInspector.NavigatorView.Events.ItemSelected, this._sourceSelected, this);
61        navigatorView.addEventListener(WebInspector.NavigatorView.Events.ItemRenamed, this._sourceRenamed, this);
62        this._navigatorViews.put(id, navigatorView);
63        navigatorView.setWorkspace(this._workspace);
64    },
65
66    /**
67     * @return {!WebInspector.View}
68     */
69    get view()
70    {
71        return this._tabbedPane;
72    },
73
74    /**
75     * @param {!WebInspector.UISourceCode} uiSourceCode
76     * @return {string|null}
77     */
78    _navigatorViewIdForUISourceCode: function(uiSourceCode)
79    {
80        var ids = this._navigatorViews.keys();
81        for (var i = 0; i < ids.length; ++i) {
82            var id = ids[i]
83            var navigatorView = this._navigatorViews.get(id);
84            if (navigatorView.accept(uiSourceCode))
85                return id;
86        }
87        return null;
88    },
89
90    /**
91     * @param {!WebInspector.UISourceCode} uiSourceCode
92     */
93    revealUISourceCode: function(uiSourceCode)
94    {
95        var id = this._navigatorViewIdForUISourceCode(uiSourceCode);
96        if (!id)
97            return;
98        var navigatorView = this._navigatorViews.get(id);
99        console.assert(navigatorView);
100        navigatorView.revealUISourceCode(uiSourceCode, true);
101        this._tabbedPane.selectTab(id);
102    },
103
104    /**
105     * @param {!WebInspector.Event} event
106     */
107    _sourceSelected: function(event)
108    {
109        this.dispatchEventToListeners(WebInspector.SourcesNavigator.Events.SourceSelected, event.data);
110    },
111
112    /**
113     * @param {!WebInspector.Event} event
114     */
115    _sourceRenamed: function(event)
116    {
117        this.dispatchEventToListeners(WebInspector.SourcesNavigator.Events.SourceRenamed, event.data);
118    },
119
120    __proto__: WebInspector.Object.prototype
121}
122
123/**
124 * @constructor
125 * @extends {WebInspector.NavigatorView}
126 */
127WebInspector.SnippetsNavigatorView = function()
128{
129    WebInspector.NavigatorView.call(this);
130}
131
132WebInspector.SnippetsNavigatorView.prototype = {
133    /**
134     * @override
135     * @param {!WebInspector.UISourceCode} uiSourceCode
136     * @return {boolean}
137     */
138    accept: function(uiSourceCode)
139    {
140        if (!WebInspector.NavigatorView.prototype.accept(uiSourceCode))
141            return false;
142        return uiSourceCode.project().type() === WebInspector.projectTypes.Snippets;
143    },
144
145    /**
146     * @param {!Event} event
147     */
148    handleContextMenu: function(event)
149    {
150        var contextMenu = new WebInspector.ContextMenu(event);
151        contextMenu.appendItem(WebInspector.UIString("New"), this._handleCreateSnippet.bind(this));
152        contextMenu.show();
153    },
154
155    /**
156     * @param {!Event} event
157     * @param {!WebInspector.UISourceCode} uiSourceCode
158     */
159    handleFileContextMenu: function(event, uiSourceCode)
160    {
161        var contextMenu = new WebInspector.ContextMenu(event);
162        contextMenu.appendItem(WebInspector.UIString("Run"), this._handleEvaluateSnippet.bind(this, uiSourceCode));
163        contextMenu.appendItem(WebInspector.UIString("Rename"), this.rename.bind(this, uiSourceCode));
164        contextMenu.appendItem(WebInspector.UIString("Remove"), this._handleRemoveSnippet.bind(this, uiSourceCode));
165        contextMenu.appendSeparator();
166        contextMenu.appendItem(WebInspector.UIString("New"), this._handleCreateSnippet.bind(this));
167        contextMenu.show();
168    },
169
170    /**
171     * @param {!WebInspector.UISourceCode} uiSourceCode
172     */
173    _handleEvaluateSnippet: function(uiSourceCode)
174    {
175        var executionContext = WebInspector.context.flavor(WebInspector.ExecutionContext);
176        if (uiSourceCode.project().type() !== WebInspector.projectTypes.Snippets || !executionContext)
177            return;
178        WebInspector.scriptSnippetModel.evaluateScriptSnippet(executionContext, uiSourceCode);
179    },
180
181    /**
182     * @param {!WebInspector.UISourceCode} uiSourceCode
183     */
184    _handleRemoveSnippet: function(uiSourceCode)
185    {
186        if (uiSourceCode.project().type() !== WebInspector.projectTypes.Snippets)
187            return;
188        uiSourceCode.remove();
189    },
190
191    _handleCreateSnippet: function()
192    {
193        this.create(WebInspector.scriptSnippetModel.project(), "")
194    },
195
196    /**
197     * @override
198     */
199    sourceDeleted: function(uiSourceCode)
200    {
201        this._handleRemoveSnippet(uiSourceCode);
202    },
203
204    __proto__: WebInspector.NavigatorView.prototype
205}
206