173 lines
6.5 KiB
JavaScript
173 lines
6.5 KiB
JavaScript
/*
|
|
* Copyright (C) 2017 Devin Rousso <webkit@devinrousso.com>. 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",
|
|
};
|