Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1509)

Unified Diff: Source/devtools/front_end/SettingsScreen.js

Issue 283063003: DevTools: Implement extension-based status bar buttons (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Fix setting-based buttons initialization logic Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/devtools/front_end/SettingsScreen.js
diff --git a/Source/devtools/front_end/SettingsScreen.js b/Source/devtools/front_end/SettingsScreen.js
deleted file mode 100644
index 172138e18ef99abf27516672be149b85a8429614..0000000000000000000000000000000000000000
--- a/Source/devtools/front_end/SettingsScreen.js
+++ /dev/null
@@ -1,1075 +0,0 @@
-/*
- * Copyright (C) 2013 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/**
- * @constructor
- * @param {!function()} onHide
- * @extends {WebInspector.HelpScreen}
- */
-WebInspector.SettingsScreen = function(onHide)
-{
- WebInspector.HelpScreen.call(this);
- this.element.id = "settings-screen";
-
- /** @type {function()} */
- this._onHide = onHide;
-
- this._tabbedPane = new WebInspector.TabbedPane();
- this._tabbedPane.element.classList.add("help-window-main");
- var settingsLabelElement = document.createElement("div");
- settingsLabelElement.className = "help-window-label";
- settingsLabelElement.createTextChild(WebInspector.UIString("Settings"));
- this._tabbedPane.element.insertBefore(settingsLabelElement, this._tabbedPane.element.firstChild);
- this._tabbedPane.element.appendChild(this._createCloseButton());
- this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.General, WebInspector.UIString("General"), new WebInspector.GenericSettingsTab());
- this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Workspace, WebInspector.UIString("Workspace"), new WebInspector.WorkspaceSettingsTab());
- if (WebInspector.experimentsSettings.experimentsEnabled)
- this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Experiments, WebInspector.UIString("Experiments"), new WebInspector.ExperimentsSettingsTab());
- this._tabbedPane.appendTab(WebInspector.SettingsScreen.Tabs.Shortcuts, WebInspector.UIString("Shortcuts"), WebInspector.shortcutsScreen.createShortcutsTabView());
- this._tabbedPane.shrinkableTabs = false;
- this._tabbedPane.verticalTabLayout = true;
-
- this._lastSelectedTabSetting = WebInspector.settings.createSetting("lastSelectedSettingsTab", WebInspector.SettingsScreen.Tabs.General);
- this.selectTab(this._lastSelectedTabSetting.get());
- this._tabbedPane.addEventListener(WebInspector.TabbedPane.EventTypes.TabSelected, this._tabSelected, this);
- this.element.addEventListener("keydown", this._keyDown.bind(this), false);
- this._developerModeCounter = 0;
-}
-
-/**
- * @param {number} min
- * @param {number} max
- * @param {string} text
- * @return {?string}
- */
-WebInspector.SettingsScreen.integerValidator = function(min, max, text)
-{
- var value = Number(text);
- if (isNaN(value))
- return WebInspector.UIString("Invalid number format");
- if (value < min || value > max)
- return WebInspector.UIString("Value is out of range [%d, %d]", min, max);
- return null;
-}
-
-WebInspector.SettingsScreen.Tabs = {
- General: "general",
- Overrides: "overrides",
- Workspace: "workspace",
- Experiments: "experiments",
- Shortcuts: "shortcuts"
-}
-
-WebInspector.SettingsScreen.prototype = {
- /**
- * @param {string} tabId
- */
- selectTab: function(tabId)
- {
- this._tabbedPane.selectTab(tabId);
- },
-
- /**
- * @param {!WebInspector.Event} event
- */
- _tabSelected: function(event)
- {
- this._lastSelectedTabSetting.set(this._tabbedPane.selectedTabId);
- },
-
- /**
- * @override
- */
- wasShown: function()
- {
- this._tabbedPane.show(this.element);
- WebInspector.HelpScreen.prototype.wasShown.call(this);
- },
-
- /**
- * @override
- * @return {boolean}
- */
- isClosingKey: function(keyCode)
- {
- return [
- WebInspector.KeyboardShortcut.Keys.Enter.code,
- WebInspector.KeyboardShortcut.Keys.Esc.code,
- ].indexOf(keyCode) >= 0;
- },
-
- /**
- * @override
- */
- willHide: function()
- {
- this._onHide();
- WebInspector.HelpScreen.prototype.willHide.call(this);
- },
-
- /**
- * @param {?Event} event
- */
- _keyDown: function(event)
- {
- var shiftKeyCode = 16;
- if (event.keyCode === shiftKeyCode && ++this._developerModeCounter > 5)
- this.element.classList.add("settings-developer-mode");
- },
-
- __proto__: WebInspector.HelpScreen.prototype
-}
-
-/**
- * @constructor
- * @extends {WebInspector.VBox}
- * @param {string} name
- * @param {string=} id
- */
-WebInspector.SettingsTab = function(name, id)
-{
- WebInspector.VBox.call(this);
- this.element.classList.add("settings-tab-container");
- if (id)
- this.element.id = id;
- var header = this.element.createChild("header");
- header.createChild("h3").appendChild(document.createTextNode(name));
- this.containerElement = this.element.createChild("div", "help-container-wrapper").createChild("div", "settings-tab help-content help-container");
-}
-
-WebInspector.SettingsTab.prototype = {
- /**
- * @param {string=} name
- * @return {!Element}
- */
- _appendSection: function(name)
- {
- var block = this.containerElement.createChild("div", "help-block");
- if (name)
- block.createChild("div", "help-section-title").textContent = name;
- return block;
- },
-
- _createSelectSetting: function(name, options, setting)
- {
- var p = document.createElement("p");
- var labelElement = p.createChild("label");
- labelElement.textContent = name;
-
- var select = p.createChild("select");
- var settingValue = setting.get();
-
- for (var i = 0; i < options.length; ++i) {
- var option = options[i];
- select.add(new Option(option[0], option[1]));
- if (settingValue === option[1])
- select.selectedIndex = i;
- }
-
- function changeListener(e)
- {
- // Don't use e.target.value to avoid conversion of the value to string.
- setting.set(options[select.selectedIndex][1]);
- }
-
- select.addEventListener("change", changeListener, false);
- return p;
- },
-
- __proto__: WebInspector.VBox.prototype
-}
-
-/**
- * @constructor
- * @extends {WebInspector.SettingsTab}
- */
-WebInspector.GenericSettingsTab = function()
-{
- WebInspector.SettingsTab.call(this, WebInspector.UIString("General"), "general-tab-content");
-
- this._populateSectionsFromExtensions();
-
- var restoreDefaults = this._appendSection().createChild("input", "settings-tab-text-button");
- restoreDefaults.type = "button";
- restoreDefaults.value = WebInspector.UIString("Restore defaults and reload");
- restoreDefaults.addEventListener("click", restoreAndReload);
-
- function restoreAndReload()
- {
- if (window.localStorage)
- window.localStorage.clear();
- WebInspector.reload();
- }
-}
-
-WebInspector.GenericSettingsTab.prototype = {
- _populateSectionsFromExtensions: function()
- {
- /** @const */
- var explicitSectionOrder = ["", "Appearance", "Elements", "Sources", "Profiler", "Console", "Extensions"];
-
- var allExtensions = WebInspector.moduleManager.extensions("ui-setting");
-
- /** @type {!StringMultimap.<!WebInspector.ModuleManager.Extension>} */
- var extensionsBySectionId = new StringMultimap();
- /** @type {!StringMultimap.<!WebInspector.ModuleManager.Extension>} */
- var childSettingExtensionsByParentName = new StringMultimap();
-
- allExtensions.forEach(function(extension) {
- var descriptor = extension.descriptor();
- var sectionName = descriptor["section"] || "";
- if (!sectionName && descriptor["parentSettingName"]) {
- childSettingExtensionsByParentName.put(descriptor["parentSettingName"], extension);
- return;
- }
- extensionsBySectionId.put(sectionName, extension);
- });
-
- var sectionIds = extensionsBySectionId.keys();
- var explicitlyOrderedSections = {};
- for (var i = 0; i < explicitSectionOrder.length; ++i) {
- explicitlyOrderedSections[explicitSectionOrder[i]] = true;
- var extensions = /** @type {!Set.<!WebInspector.ModuleManager.Extension>} */ (extensionsBySectionId.get(explicitSectionOrder[i]));
- if (!extensions)
- continue;
- this._addSectionWithExtensionProvidedSettings(explicitSectionOrder[i], extensions.values(), childSettingExtensionsByParentName);
- }
- for (var i = 0; i < sectionIds.length; ++i) {
- if (explicitlyOrderedSections[sectionIds[i]])
- continue;
- this._addSectionWithExtensionProvidedSettings(sectionIds[i], /** @type {!Set.<!WebInspector.ModuleManager.Extension>} */ (extensionsBySectionId.get(sectionIds[i])).values(), childSettingExtensionsByParentName);
- }
- },
-
- /**
- * @param {string} sectionName
- * @param {!Array.<!WebInspector.ModuleManager.Extension>} extensions
- * @param {!StringMultimap.<!WebInspector.ModuleManager.Extension>} childSettingExtensionsByParentName
- */
- _addSectionWithExtensionProvidedSettings: function(sectionName, extensions, childSettingExtensionsByParentName)
- {
- var uiSectionName = sectionName && WebInspector.UIString(sectionName);
- var sectionElement = this._appendSection(uiSectionName);
- extensions.forEach(processSetting.bind(this, null));
-
- /**
- * @param {?Element} parentFieldset
- * @param {!WebInspector.ModuleManager.Extension} extension
- * @this {WebInspector.GenericSettingsTab}
- */
- function processSetting(parentFieldset, extension)
- {
- var descriptor = extension.descriptor();
- var experimentName = descriptor["experiment"];
- if (experimentName && (!WebInspector.experimentsSettings[experimentName] || !WebInspector.experimentsSettings[experimentName].isEnabled()))
- return;
-
- var settingName = descriptor["settingName"];
- var setting = WebInspector.settings[settingName];
- var instance = extension.instance();
- var settingControl;
- if (instance && descriptor["settingType"] === "custom") {
- settingControl = instance.settingElement();
- if (!settingControl)
- return;
- }
- if (!settingControl) {
- var uiTitle = WebInspector.UIString(descriptor["title"]);
- settingControl = createSettingControl.call(this, uiTitle, setting, descriptor, instance);
- }
- if (settingName) {
- var childSettings = /** @type {!Set.<!WebInspector.ModuleManager.Extension>|undefined} */ (childSettingExtensionsByParentName.get(settingName));
- if (childSettings) {
- var fieldSet = WebInspector.SettingsUI.createSettingFieldset(setting);
- settingControl.appendChild(fieldSet);
- childSettings.values().forEach(function(item) { processSetting.call(this, fieldSet, item); }, this);
- }
- }
- var containerElement = parentFieldset || sectionElement;
- containerElement.appendChild(settingControl);
- }
-
- /**
- * @param {string} uiTitle
- * @param {!WebInspector.Setting} setting
- * @param {!Object} descriptor
- * @param {?Object} instance
- * @return {!Element}
- * @this {WebInspector.GenericSettingsTab}
- */
- function createSettingControl(uiTitle, setting, descriptor, instance)
- {
- switch (descriptor["settingType"]) {
- case "checkbox":
- return WebInspector.SettingsUI.createSettingCheckbox(uiTitle, setting);
- case "select":
- var descriptorOptions = descriptor["options"]
- var options = new Array(descriptorOptions.length);
- for (var i = 0; i < options.length; ++i) {
- // The third array item flags that the option name is "raw" (non-i18n-izable).
- var optionName = descriptorOptions[i][2] ? descriptorOptions[i][0] : WebInspector.UIString(descriptorOptions[i][0]);
- options[i] = [WebInspector.UIString(descriptorOptions[i][0]), descriptorOptions[i][1]];
- }
- return this._createSelectSetting(uiTitle, options, setting);
- default:
- throw "Invalid setting type: " + descriptor["settingType"];
- }
- }
- },
-
- /**
- * @param {?Element} p
- */
- _appendDrawerNote: function(p)
- {
- var noteElement = p.createChild("div", "help-field-note");
- noteElement.createTextChild("Hit ");
- noteElement.createChild("span", "help-key").textContent = "Esc";
- noteElement.createTextChild(WebInspector.UIString(" or click the"));
- noteElement.appendChild(new WebInspector.StatusBarButton(WebInspector.UIString("Drawer"), "console-status-bar-item").element);
- noteElement.createTextChild(WebInspector.UIString("toolbar item"));
- },
-
- __proto__: WebInspector.SettingsTab.prototype
-}
-
-/**
- * @constructor
- * @extends {WebInspector.SettingsTab}
- */
-WebInspector.WorkspaceSettingsTab = function()
-{
- WebInspector.SettingsTab.call(this, WebInspector.UIString("Workspace"), "workspace-tab-content");
- WebInspector.isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded, this._fileSystemAdded, this);
- WebInspector.isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved, this._fileSystemRemoved, this);
-
- this._commonSection = this._appendSection(WebInspector.UIString("Common"));
- var folderExcludePatternInput = WebInspector.SettingsUI.createSettingInputField(WebInspector.UIString("Folder exclude pattern"), WebInspector.settings.workspaceFolderExcludePattern, false, 0, "270px", WebInspector.SettingsUI.regexValidator);
- this._commonSection.appendChild(folderExcludePatternInput);
-
- this._fileSystemsSection = this._appendSection(WebInspector.UIString("Folders"));
- this._fileSystemsListContainer = this._fileSystemsSection.createChild("p", "settings-list-container");
-
- this._addFileSystemRowElement = this._fileSystemsSection.createChild("div");
- var addFileSystemButton = this._addFileSystemRowElement.createChild("input", "settings-tab-text-button");
- addFileSystemButton.type = "button";
- addFileSystemButton.value = WebInspector.UIString("Add folder\u2026");
- addFileSystemButton.addEventListener("click", this._addFileSystemClicked.bind(this));
-
- this._editFileSystemButton = this._addFileSystemRowElement.createChild("input", "settings-tab-text-button");
- this._editFileSystemButton.type = "button";
- this._editFileSystemButton.value = WebInspector.UIString("Edit\u2026");
- this._editFileSystemButton.addEventListener("click", this._editFileSystemClicked.bind(this));
- this._updateEditFileSystemButtonState();
-
- this._reset();
-}
-
-WebInspector.WorkspaceSettingsTab.prototype = {
- wasShown: function()
- {
- WebInspector.SettingsTab.prototype.wasShown.call(this);
- this._reset();
- },
-
- _reset: function()
- {
- this._resetFileSystems();
- },
-
- _resetFileSystems: function()
- {
- this._fileSystemsListContainer.removeChildren();
- var fileSystemPaths = WebInspector.isolatedFileSystemManager.mapping().fileSystemPaths();
- delete this._fileSystemsList;
-
- if (!fileSystemPaths.length) {
- var noFileSystemsMessageElement = this._fileSystemsListContainer.createChild("div", "no-file-systems-message");
- noFileSystemsMessageElement.textContent = WebInspector.UIString("You have no file systems added.");
- return;
- }
-
- this._fileSystemsList = new WebInspector.SettingsList(["path"], this._renderFileSystem.bind(this));
- this._fileSystemsList.element.classList.add("file-systems-list");
- this._fileSystemsList.addEventListener(WebInspector.SettingsList.Events.Selected, this._fileSystemSelected.bind(this));
- this._fileSystemsList.addEventListener(WebInspector.SettingsList.Events.Removed, this._fileSystemRemovedfromList.bind(this));
- this._fileSystemsList.addEventListener(WebInspector.SettingsList.Events.DoubleClicked, this._fileSystemDoubleClicked.bind(this));
- this._fileSystemsListContainer.appendChild(this._fileSystemsList.element);
- for (var i = 0; i < fileSystemPaths.length; ++i)
- this._fileSystemsList.addItem(fileSystemPaths[i]);
- this._updateEditFileSystemButtonState();
- },
-
- _updateEditFileSystemButtonState: function()
- {
- this._editFileSystemButton.disabled = !this._selectedFileSystemPath();
- },
-
- /**
- * @param {!WebInspector.Event} event
- */
- _fileSystemSelected: function(event)
- {
- this._updateEditFileSystemButtonState();
- },
-
- /**
- * @param {!WebInspector.Event} event
- */
- _fileSystemDoubleClicked: function(event)
- {
- var id = /** @type{?string} */ (event.data);
- this._editFileSystem(id);
- },
-
- /**
- * @param {!WebInspector.Event=} event
- */
- _editFileSystemClicked: function(event)
- {
- this._editFileSystem(this._selectedFileSystemPath());
- },
-
- /**
- * @param {?string} id
- */
- _editFileSystem: function(id)
- {
- WebInspector.EditFileSystemDialog.show(WebInspector.inspectorView.element, id);
- },
-
- /**
- * @param {function(?Event)} handler
- * @return {!Element}
- */
- _createRemoveButton: function(handler)
- {
- var removeButton = document.createElement("button");
- removeButton.classList.add("button");
- removeButton.classList.add("remove-item-button");
- removeButton.value = WebInspector.UIString("Remove");
- if (handler)
- removeButton.addEventListener("click", handler, false);
- else
- removeButton.disabled = true;
- return removeButton;
- },
-
- /**
- * @param {!Element} columnElement
- * @param {string} column
- * @param {?string} id
- */
- _renderFileSystem: function(columnElement, column, id)
- {
- if (!id)
- return "";
- var fileSystemPath = id;
- var textElement = columnElement.createChild("span", "list-column-text");
- var pathElement = textElement.createChild("span", "file-system-path");
- pathElement.title = fileSystemPath;
-
- const maxTotalPathLength = 55;
- const maxFolderNameLength = 30;
-
- var lastIndexOfSlash = fileSystemPath.lastIndexOf(WebInspector.isWin() ? "\\" : "/");
- var folderName = fileSystemPath.substr(lastIndexOfSlash + 1);
- var folderPath = fileSystemPath.substr(0, lastIndexOfSlash + 1);
- folderPath = folderPath.trimMiddle(maxTotalPathLength - Math.min(maxFolderNameLength, folderName.length));
- folderName = folderName.trimMiddle(maxFolderNameLength);
-
- var folderPathElement = pathElement.createChild("span");
- folderPathElement.textContent = folderPath;
-
- var nameElement = pathElement.createChild("span", "file-system-path-name");
- nameElement.textContent = folderName;
- },
-
- /**
- * @param {!WebInspector.Event} event
- */
- _fileSystemRemovedfromList: function(event)
- {
- var id = /** @type{?string} */ (event.data);
- if (!id)
- return;
- WebInspector.isolatedFileSystemManager.removeFileSystem(id);
- },
-
- _addFileSystemClicked: function()
- {
- WebInspector.isolatedFileSystemManager.addFileSystem();
- },
-
- _fileSystemAdded: function(event)
- {
- var fileSystem = /** @type {!WebInspector.IsolatedFileSystem} */ (event.data);
- if (!this._fileSystemsList)
- this._reset();
- else
- this._fileSystemsList.addItem(fileSystem.path());
- },
-
- _fileSystemRemoved: function(event)
- {
- var fileSystem = /** @type {!WebInspector.IsolatedFileSystem} */ (event.data);
- var selectedFileSystemPath = this._selectedFileSystemPath();
- if (this._fileSystemsList.itemForId(fileSystem.path()))
- this._fileSystemsList.removeItem(fileSystem.path());
- if (!this._fileSystemsList.itemIds().length)
- this._reset();
- this._updateEditFileSystemButtonState();
- },
-
- _selectedFileSystemPath: function()
- {
- return this._fileSystemsList ? this._fileSystemsList.selectedId() : null;
- },
-
- __proto__: WebInspector.SettingsTab.prototype
-}
-
-
-/**
- * @constructor
- * @extends {WebInspector.SettingsTab}
- */
-WebInspector.ExperimentsSettingsTab = function()
-{
- WebInspector.SettingsTab.call(this, WebInspector.UIString("Experiments"), "experiments-tab-content");
-
- var experiments = WebInspector.experimentsSettings.experiments;
- if (experiments.length) {
- var experimentsSection = this._appendSection();
- experimentsSection.appendChild(this._createExperimentsWarningSubsection());
- for (var i = 0; i < experiments.length; ++i)
- experimentsSection.appendChild(this._createExperimentCheckbox(experiments[i]));
- }
-}
-
-WebInspector.ExperimentsSettingsTab.prototype = {
- /**
- * @return {!Element} element
- */
- _createExperimentsWarningSubsection: function()
- {
- var subsection = document.createElement("div");
- var warning = subsection.createChild("span", "settings-experiments-warning-subsection-warning");
- warning.textContent = WebInspector.UIString("WARNING:");
- subsection.appendChild(document.createTextNode(" "));
- var message = subsection.createChild("span", "settings-experiments-warning-subsection-message");
- message.textContent = WebInspector.UIString("These experiments could be dangerous and may require restart.");
- return subsection;
- },
-
- _createExperimentCheckbox: function(experiment)
- {
- var input = document.createElement("input");
- input.type = "checkbox";
- input.name = experiment.name;
- input.checked = experiment.isEnabled();
- function listener()
- {
- experiment.setEnabled(input.checked);
- }
- input.addEventListener("click", listener, false);
-
- var p = document.createElement("p");
- p.className = experiment.hidden && !experiment.isEnabled() ? "settings-experiment-hidden" : "";
- var label = p.createChild("label");
- label.appendChild(input);
- label.appendChild(document.createTextNode(WebInspector.UIString(experiment.title)));
- p.appendChild(label);
- return p;
- },
-
- __proto__: WebInspector.SettingsTab.prototype
-}
-
-/**
- * @constructor
- */
-WebInspector.SettingsController = function()
-{
- this._statusBarButton = new WebInspector.StatusBarButton(WebInspector.UIString("Settings"), "settings-status-bar-item");
- this._statusBarButton.element.addEventListener("mouseup", this._mouseUp.bind(this), false);
-
- /** @type {?WebInspector.SettingsScreen} */
- this._settingsScreen;
-}
-
-WebInspector.SettingsController.prototype =
-{
- /**
- * @return {!Element}
- */
- get statusBarItem()
- {
- return this._statusBarButton.element;
- },
-
- _mouseUp: function()
- {
- this.showSettingsScreen();
- },
-
- _onHideSettingsScreen: function()
- {
- delete this._settingsScreenVisible;
- },
-
- /**
- * @param {string=} tabId
- */
- showSettingsScreen: function(tabId)
- {
- if (!this._settingsScreen)
- this._settingsScreen = new WebInspector.SettingsScreen(this._onHideSettingsScreen.bind(this));
-
- if (tabId)
- this._settingsScreen.selectTab(tabId);
-
- this._settingsScreen.showModal();
- this._settingsScreenVisible = true;
- },
-
- resize: function()
- {
- if (this._settingsScreen && this._settingsScreen.isShowing())
- this._settingsScreen.doResize();
- }
-}
-
-/**
- * @constructor
- * @implements {WebInspector.ActionDelegate}
- */
-WebInspector.SettingsController.SettingsScreenActionDelegate = function() { }
-
-WebInspector.SettingsController.SettingsScreenActionDelegate.prototype = {
- /**
- * @return {boolean}
- */
- handleAction: function()
- {
- WebInspector.settingsController.showSettingsScreen(WebInspector.SettingsScreen.Tabs.General);
- return true;
- }
-}
-
-/**
- * @constructor
- * @extends {WebInspector.Object}
- * @param {function(!Element, string, ?string)} itemRenderer
- */
-WebInspector.SettingsList = function(columns, itemRenderer)
-{
- this.element = document.createElement("div");
- this.element.classList.add("settings-list");
- this.element.tabIndex = -1;
- this._itemRenderer = itemRenderer;
- this._listItems = {};
- this._ids = [];
- this._columns = columns;
-}
-
-WebInspector.SettingsList.Events = {
- Selected: "Selected",
- Removed: "Removed",
- DoubleClicked: "DoubleClicked",
-}
-
-WebInspector.SettingsList.prototype = {
- /**
- * @param {?string} itemId
- * @param {?string=} beforeId
- * @return {!Element}
- */
- addItem: function(itemId, beforeId)
- {
- var listItem = document.createElement("div");
- listItem._id = itemId;
- listItem.classList.add("settings-list-item");
- if (typeof beforeId !== undefined)
- this.element.insertBefore(listItem, this._listItems[beforeId]);
- else
- this.element.appendChild(listItem);
-
- var listItemContents = listItem.createChild("div", "settings-list-item-contents");
- var listItemColumnsElement = listItemContents.createChild("div", "settings-list-item-columns");
-
- listItem.columnElements = {};
- for (var i = 0; i < this._columns.length; ++i) {
- var columnElement = listItemColumnsElement.createChild("div", "list-column");
- var columnId = this._columns[i];
- listItem.columnElements[columnId] = columnElement;
- this._itemRenderer(columnElement, columnId, itemId);
- }
- var removeItemButton = this._createRemoveButton(removeItemClicked.bind(this));
- listItemContents.addEventListener("click", this.selectItem.bind(this, itemId), false);
- listItemContents.addEventListener("dblclick", this._onDoubleClick.bind(this, itemId), false);
- listItemContents.appendChild(removeItemButton);
-
- this._listItems[itemId] = listItem;
- if (typeof beforeId !== undefined)
- this._ids.splice(this._ids.indexOf(beforeId), 0, itemId);
- else
- this._ids.push(itemId);
-
- /**
- * @param {?Event} event
- * @this {WebInspector.SettingsList}
- */
- function removeItemClicked(event)
- {
- removeItemButton.disabled = true;
- this.removeItem(itemId);
- this.dispatchEventToListeners(WebInspector.SettingsList.Events.Removed, itemId);
- event.consume();
- }
-
- return listItem;
- },
-
- /**
- * @param {?string} id
- */
- removeItem: function(id)
- {
- this._listItems[id].remove();
- delete this._listItems[id];
- this._ids.remove(id);
- if (id === this._selectedId) {
- delete this._selectedId;
- if (this._ids.length)
- this.selectItem(this._ids[0]);
- }
- },
-
- /**
- * @return {!Array.<?string>}
- */
- itemIds: function()
- {
- return this._ids.slice();
- },
-
- /**
- * @return {!Array.<string>}
- */
- columns: function()
- {
- return this._columns.slice();
- },
-
- /**
- * @return {?string}
- */
- selectedId: function()
- {
- return this._selectedId;
- },
-
- /**
- * @return {!Element}
- */
- selectedItem: function()
- {
- return this._selectedId ? this._listItems[this._selectedId] : null;
- },
-
- /**
- * @param {string} itemId
- * @return {!Element}
- */
- itemForId: function(itemId)
- {
- return this._listItems[itemId];
- },
-
- /**
- * @param {?string} id
- * @param {!Event=} event
- */
- _onDoubleClick: function(id, event)
- {
- this.dispatchEventToListeners(WebInspector.SettingsList.Events.DoubleClicked, id);
- },
-
- /**
- * @param {?string} id
- * @param {!Event=} event
- */
- selectItem: function(id, event)
- {
- if (typeof this._selectedId !== "undefined") {
- this._listItems[this._selectedId].classList.remove("selected");
- }
-
- this._selectedId = id;
- if (typeof this._selectedId !== "undefined") {
- this._listItems[this._selectedId].classList.add("selected");
- }
- this.dispatchEventToListeners(WebInspector.SettingsList.Events.Selected, id);
- if (event)
- event.consume();
- },
-
- /**
- * @param {function(?Event)} handler
- * @return {!Element}
- */
- _createRemoveButton: function(handler)
- {
- var removeButton = document.createElement("button");
- removeButton.classList.add("remove-item-button");
- removeButton.value = WebInspector.UIString("Remove");
- removeButton.addEventListener("click", handler, false);
- return removeButton;
- },
-
- __proto__: WebInspector.Object.prototype
-}
-
-/**
- * @constructor
- * @extends {WebInspector.SettingsList}
- * @param {function(?string, !Object)} validateHandler
- * @param {function(?string, !Object)} editHandler
- */
-WebInspector.EditableSettingsList = function(columns, valuesProvider, validateHandler, editHandler)
-{
- WebInspector.SettingsList.call(this, columns, this._renderColumn.bind(this));
- this._validateHandler = validateHandler;
- this._editHandler = editHandler;
- this._valuesProvider = valuesProvider;
- /** @type {!Object.<string, !HTMLInputElement>} */
- this._addInputElements = {};
- /** @type {!Object.<string, !Object.<string, !HTMLInputElement>>} */
- this._editInputElements = {};
- /** @type {!Object.<string, !Object.<string, !HTMLSpanElement>>} */
- this._textElements = {};
-
- this._addMappingItem = this.addItem(null);
- this._addMappingItem.classList.add("item-editing");
- this._addMappingItem.classList.add("add-list-item");
-}
-
-WebInspector.EditableSettingsList.prototype = {
- /**
- * @param {?string} itemId
- * @param {?string=} beforeId
- * @return {!Element}
- */
- addItem: function(itemId, beforeId)
- {
- var listItem = WebInspector.SettingsList.prototype.addItem.call(this, itemId, beforeId);
- listItem.classList.add("editable");
- return listItem;
- },
-
- /**
- * @param {!Element} columnElement
- * @param {string} columnId
- * @param {?string} itemId
- */
- _renderColumn: function(columnElement, columnId, itemId)
- {
- columnElement.classList.add("settings-list-column-" + columnId);
- var placeholder = (columnId === "url") ? WebInspector.UIString("URL prefix") : WebInspector.UIString("Folder path");
- if (itemId === null) {
- var inputElement = columnElement.createChild("input", "list-column-editor");
- inputElement.placeholder = placeholder;
- inputElement.addEventListener("blur", this._onAddMappingInputBlur.bind(this));
- inputElement.addEventListener("input", this._validateEdit.bind(this, itemId));
- this._addInputElements[columnId] = inputElement;
- return;
- }
- var validItemId = itemId;
-
- if (!this._editInputElements[itemId])
- this._editInputElements[itemId] = {};
- if (!this._textElements[itemId])
- this._textElements[itemId] = {};
-
- var value = this._valuesProvider(itemId, columnId);
-
- var textElement = columnElement.createChild("span", "list-column-text");
- textElement.textContent = value;
- textElement.title = value;
- columnElement.addEventListener("click", rowClicked.bind(this), false);
- this._textElements[itemId][columnId] = textElement;
-
- var inputElement = columnElement.createChild("input", "list-column-editor");
- inputElement.value = value;
- inputElement.addEventListener("blur", this._editMappingBlur.bind(this, itemId));
- inputElement.addEventListener("input", this._validateEdit.bind(this, itemId));
- columnElement.inputElement = inputElement;
- this._editInputElements[itemId][columnId] = inputElement;
-
- /**
- * @param {?Event} event
- * @this {WebInspector.EditableSettingsList}
- */
- function rowClicked(event)
- {
- if (itemId === this._editingId)
- return;
- event.consume();
- console.assert(!this._editingId);
- this._editingId = validItemId;
- var listItem = this.itemForId(validItemId);
- listItem.classList.add("item-editing");
- var inputElement = event.target.inputElement || this._editInputElements[validItemId][this.columns()[0]];
- inputElement.focus();
- inputElement.select();
- }
- },
-
- /**
- * @param {?string} itemId
- * @return {!Object}
- */
- _data: function(itemId)
- {
- var inputElements = this._inputElements(itemId);
- var data = {};
- var columns = this.columns();
- for (var i = 0; i < columns.length; ++i)
- data[columns[i]] = inputElements[columns[i]].value;
- return data;
- },
-
- /**
- * @param {?string} itemId
- * @return {?Object.<string, !HTMLInputElement>}
- */
- _inputElements: function(itemId)
- {
- if (!itemId)
- return this._addInputElements;
- return this._editInputElements[itemId] || null;
- },
-
- /**
- * @param {?string} itemId
- * @return {boolean}
- */
- _validateEdit: function(itemId)
- {
- var errorColumns = this._validateHandler(itemId, this._data(itemId));
- var hasChanges = this._hasChanges(itemId);
- var columns = this.columns();
- for (var i = 0; i < columns.length; ++i) {
- var columnId = columns[i];
- var inputElement = this._inputElements(itemId)[columnId];
- if (hasChanges && errorColumns.indexOf(columnId) !== -1)
- inputElement.classList.add("editable-item-error");
- else
- inputElement.classList.remove("editable-item-error");
- }
- return !errorColumns.length;
- },
-
- /**
- * @param {?string} itemId
- * @return {boolean}
- */
- _hasChanges: function(itemId)
- {
- var hasChanges = false;
- var columns = this.columns();
- for (var i = 0; i < columns.length; ++i) {
- var columnId = columns[i];
- var oldValue = itemId ? this._textElements[itemId][columnId].textContent : "";
- var newValue = this._inputElements(itemId)[columnId].value;
- if (oldValue !== newValue) {
- hasChanges = true;
- break;
- }
- }
- return hasChanges;
- },
-
- /**
- * @param {string} itemId
- */
- _editMappingBlur: function(itemId, event)
- {
- var inputElements = Object.values(this._editInputElements[itemId]);
- if (inputElements.indexOf(event.relatedTarget) !== -1)
- return;
-
- var listItem = this.itemForId(itemId);
- listItem.classList.remove("item-editing");
- delete this._editingId;
-
- if (!this._hasChanges(itemId))
- return;
-
- if (!this._validateEdit(itemId)) {
- var columns = this.columns();
- for (var i = 0; i < columns.length; ++i) {
- var columnId = columns[i];
- var inputElement = this._editInputElements[itemId][columnId];
- inputElement.value = this._textElements[itemId][columnId].textContent;
- inputElement.classList.remove("editable-item-error");
- }
- return;
- }
- this._editHandler(itemId, this._data(itemId));
- },
-
- _onAddMappingInputBlur: function(event)
- {
- var inputElements = Object.values(this._addInputElements);
- if (inputElements.indexOf(event.relatedTarget) !== -1)
- return;
-
- if (!this._hasChanges(null))
- return;
-
- if (!this._validateEdit(null))
- return;
-
- this._editHandler(null, this._data(null));
- var columns = this.columns();
- for (var i = 0; i < columns.length; ++i) {
- var columnId = columns[i];
- var inputElement = this._addInputElements[columnId];
- inputElement.value = "";
- }
- },
-
- __proto__: WebInspector.SettingsList.prototype
-}
-
-/** @type {!WebInspector.SettingsController} */
-WebInspector.settingsController;

Powered by Google App Engine
This is Rietveld 408576698