import { Memory } from "../../core/runtime/Memory";
import { listenTo, MessageResponses, messageResponse, Message } from "../../util/observe";
import { CPPObject } from "../../core/runtime/objects";
import { CPP_ANIMATIONS } from "../constructs/common";
import { OutletCustomizations, SLIDE_DURATION } from "../simOutlets";
import { createMemoryObjectOutlet } from "./MemoryObjectOutlets";
import { MemoryOutlet } from "./MemoryOutlet";
import { TemporaryObjectsCustomization } from "./StackFrameOutlet";
export class TemporaryObjectsOutlet {
private readonly element: JQuery;
private readonly memoryOutlet: MemoryOutlet;
private readonly objectsElem: JQuery;
private objectElems: { [index: number]: JQuery; } = {};
public readonly memory: Memory;
private readonly customizations: TemporaryObjectsCustomization;
public _act!: MessageResponses;
public constructor(element: JQuery, memory: Memory, memoryOutlet: MemoryOutlet) {
this.element = element.addClass("code-memoryTemporaryObjects");
this.memory = memory;
this.memoryOutlet = memoryOutlet;
this.customizations = OutletCustomizations.temporaryObjects;
let header = $("
");
this.element.append(header);
this.objectsElem = $("");
this.element.append(this.objectsElem);
let minimizeButton = $("");
if (this.customizations.minimize === "show") {
minimizeButton.html("hide");
}
else {
minimizeButton.html("show");
this.objectsElem.css("display", "none");
}
minimizeButton.click(() => {
this.objectsElem.slideToggle();
if (minimizeButton.html() === "hide") {
minimizeButton.html("show");
this.customizations.minimize = "hide";
}
else {
minimizeButton.html("hide");
this.customizations.minimize = "show";
}
});
header.append(minimizeButton);
listenTo(this, memory);
this.objectElems = {};
return this;
}
@messageResponse("temporaryObjectAllocated")
private temporaryObjectAllocated(msg: Message) {
var obj = msg.data;
var elem = $("");
createMemoryObjectOutlet(elem, obj, this.memoryOutlet);
this.objectElems[obj.address] = elem;
this.objectsElem.prepend(elem);
if (CPP_ANIMATIONS) {
elem.slideDown(SLIDE_DURATION);
}
else {
elem.css({ display: "block" });
}
}
@messageResponse("temporaryObjectDeallocated")
private temporaryObjectDeallocated(msg: Message) {
var addr = msg.data.address;
if (this.objectElems[addr]) {
this.objectElems[addr].fadeOut(function () {
$(this).remove();
});
delete this.objectElems[addr];
}
}
@messageResponse("reset")
private reset() {
this.objectElems = {};
this.objectsElem.children().remove();
}
}