/* * Copyright (C) 2017 Devin Rousso . All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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. */ WI.SVGImageResourceClusterContentView = class SVGImageResourceClusterContentView extends WI.ClusterContentView { constructor(resource) { super(resource); this._resource = resource; let createPathComponent = (displayName, className, identifier) => { const textOnly = false; const showSelectorArrows = true; let pathComponent = new WI.HierarchicalPathComponent(displayName, className, identifier, textOnly, showSelectorArrows); pathComponent.addEventListener(WI.HierarchicalPathComponent.Event.SiblingWasSelected, this._pathComponentSelected, this); pathComponent.comparisonData = resource; return pathComponent; }; this._imagePathComponent = createPathComponent(WI.UIString("Image"), "image-icon", WI.SVGImageResourceClusterContentView.Identifier.Image); this._sourcePathComponent = createPathComponent(WI.UIString("Source"), "source-icon", WI.SVGImageResourceClusterContentView.Identifier.Source); this._imagePathComponent.nextSibling = this._sourcePathComponent; this._sourcePathComponent.previousSibling = this._imagePathComponent; this._currentContentViewSetting = new WI.Setting("svg-image-resource-cluster-current-view-" + this._resource.url.hash, WI.SVGImageResourceClusterContentView.Identifier.Image); } // Public get resource() { return this._resource; } get selectionPathComponents() { let currentContentView = this._contentViewContainer.currentContentView; if (!currentContentView) return []; // Append the current view's path components to the path component representing the current view. let components = [this._pathComponentForContentView(currentContentView)]; return components.concat(currentContentView.selectionPathComponents); } // Protected shown() { super.shown(); if (this._shownInitialContent) return; this._showContentViewForIdentifier(this._currentContentViewSetting.value); } closed() { super.closed(); this._shownInitialContent = false; } saveToCookie(cookie) { cookie[WI.SVGImageResourceClusterContentView.ContentViewIdentifierCookieKey] = this._currentContentViewSetting.value; } restoreFromCookie(cookie) { let contentView = this._showContentViewForIdentifier(cookie[WI.SVGImageResourceClusterContentView.ContentViewIdentifierCookieKey]); if (typeof contentView.revealPosition === "function" && "lineNumber" in cookie && "columnNumber" in cookie) contentView.revealPosition(new WI.SourceCodePosition(cookie.lineNumber, cookie.columnNumber)); } // Private _pathComponentForContentView(contentView) { console.assert(contentView); if (!contentView) return null; if (contentView instanceof WI.ImageResourceContentView) return this._imagePathComponent; if (contentView instanceof WI.TextContentView) return this._sourcePathComponent; console.error("Unknown contentView."); return null; } _identifierForContentView(contentView) { console.assert(contentView); if (!contentView) return null; if (contentView instanceof WI.ImageResourceContentView) return WI.SVGImageResourceClusterContentView.Identifier.Image; if (contentView instanceof WI.TextContentView) return WI.SVGImageResourceClusterContentView.Identifier.Source; console.error("Unknown contentView."); return null; } _showContentViewForIdentifier(identifier) { let contentViewToShow = null; switch (identifier) { case WI.SVGImageResourceClusterContentView.Identifier.Image: contentViewToShow = new WI.ImageResourceContentView(this._resource); break; case WI.SVGImageResourceClusterContentView.Identifier.Source: contentViewToShow = new WI.TextContentView("", this._resource.mimeType); this._resource.requestContent().then((result) => { if (typeof result.content === "string") { contentViewToShow.textEditor.string = result.content; return; } blobAsText(result.content, (text) => { contentViewToShow.textEditor.string = text; }); }); break; default: // Default to showing the image. contentViewToShow = new WI.ImageResourceContentView(this._resource); break; } this._currentContentViewSetting.value = this._identifierForContentView(contentViewToShow); return this.contentViewContainer.showContentView(contentViewToShow); } _pathComponentSelected(event) { this._showContentViewForIdentifier(event.data.pathComponent.representedObject); } }; WI.SVGImageResourceClusterContentView.ContentViewIdentifierCookieKey = "svg-image-resource-cluster-content-view-identifier"; WI.SVGImageResourceClusterContentView.Identifier = { Image: "image", Source: "source", };