Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
protected attachWidget(index: number, widget: Widget): void {
// Create and add a new layout item for the widget.
ArrayExt.insert(this._items, index, new LayoutItem(widget));
// Create and add a new sizer for the widget.
ArrayExt.insert(this._sizers, index, new BoxSizer());
// Send a `'before-attach'` message if the parent is attached.
if (this.parent!.isAttached) {
MessageLoop.sendMessage(widget, Widget.Msg.BeforeAttach);
}
// Add the widget's node to the parent.
this.parent!.node.appendChild(widget.node);
// Send an `'after-attach'` message if the parent is attached.
if (this.parent!.isAttached) {
MessageLoop.sendMessage(widget, Widget.Msg.AfterAttach);
}
// Post a fit request for the parent widget.
this.parent!.fit();
widget: Widget,
options?: DocumentRegistry.IOpenOptions
): void {
if (!widget.id) {
console.error('Widgets added to app shell must have unique id property.');
return;
}
options = options || {};
const dock = this._dockPanel;
const mode = options.mode || 'tab-after';
let ref: Widget | null = this.currentWidget;
if (options.ref) {
ref = find(dock.widgets(), value => value.id === options!.ref!) || null;
}
// Add widget ID to tab so that we can get a handle on the tab's widget
// (for context menu support)
widget.title.dataset = { ...widget.title.dataset, id: widget.id };
dock.addWidget(widget, { mode, ref });
// The dock panel doesn't account for placement information while
// in single document mode, so upon rehydrating any widgets that were
// added will not be in the correct place. Cache the placement information
// here so that we can later rehydrate correctly.
if (dock.mode === 'single-document') {
this._mainOptionsCache.set(widget, options);
}
return new DisposableDelegate(() => {
// Remove the binding from the array.
ArrayExt.removeFirstOf(this._keyBindings, binding);
// Emit the `bindingChanged` signal.
this._keyBindingChanged.emit({ binding, type: 'removed' });
});
}
protected moveWidget(fromIndex: number, toIndex: number, widget: Widget): void {
// Move the item, sizer, and handle for the widget.
ArrayExt.move(this._items, fromIndex, toIndex);
ArrayExt.move(this._sizers, fromIndex, toIndex);
ArrayExt.move(this._handles, fromIndex, toIndex);
// Post a fit request to the parent to show/hide last handle.
this.parent!.fit();
}
protected moveWidget(fromIndex: number, toIndex: number, widget: Widget): void {
// Move the item, sizer, and handle for the widget.
ArrayExt.move(this._items, fromIndex, toIndex);
ArrayExt.move(this._sizers, fromIndex, toIndex);
ArrayExt.move(this._handles, fromIndex, toIndex);
// Post a fit request to the parent to show/hide last handle.
this.parent!.fit();
}
protected moveWidget(fromIndex: number, toIndex: number, widget: Widget): void {
// Move the item, sizer, and handle for the widget.
ArrayExt.move(this._items, fromIndex, toIndex);
ArrayExt.move(this._sizers, fromIndex, toIndex);
ArrayExt.move(this._handles, fromIndex, toIndex);
// Post a fit request to the parent to show/hide last handle.
this.parent!.fit();
}
let {storeId, patch} = transaction;
try {
this._initTransaction(
transaction.id,
Math.max(this._context.version, transaction.version)
);
} catch (e) {
// Already in a transaction. Put the transaction in the queue to apply
// later.
this._queueTransaction(transaction, type);
return;
}
let change: Datastore.MutableChange = {};
try {
each(iterItems(patch), ([schemaId, tablePatch]) => {
let table = this._tables.get(schemaId, Private.recordIdCmp);
if (table === undefined) {
console.warn(
`Missing table for schema id '${
schemaId
}' in transaction '${transaction.id}'`);
this._finalizeTransaction();
return;
}
if ( type === 'transaction' || type === 'redo') {
let count = this._cemetery[transaction.id];
if (count === undefined) {
this._cemetery[transaction.id] = 1;
change[schemaId] = Table.patch(table, tablePatch);
return;
}
function realizeTabAreaConfig(config: DockLayout.ITabAreaConfig, renderer: DockLayout.IRenderer): TabLayoutNode {
// Create the tab bar for the layout node.
let tabBar = renderer.createTabBar();
// Hide each widget and add it to the tab bar.
each(config.widgets, widget => {
widget.hide();
tabBar.addTab(widget.title);
});
// Set the current index of the tab bar.
tabBar.currentIndex = config.currentIndex;
// Return the new tab layout node.
return new TabLayoutNode(tabBar);
}
// Bail early if there are no items to match.
if (this._items.length === 0) {
return false;
}
// Find the matching items for the event.
let items = Private.matchItems(this._items, event);
// Bail if there are no matching items.
if (!items || items.length === 0) {
return false;
}
// Add the filtered items to the menu.
each(items, item => { this.menu.addItem(item); });
// Open the context menu at the current mouse position.
this.menu.open(event.clientX, event.clientY);
// Indicate success.
return true;
}
function normalizeTabAreaConfig(config: DockLayout.ITabAreaConfig, widgetSet: Set): DockLayout.ITabAreaConfig | null {
// Bail early if there is no content.
if (config.widgets.length === 0) {
return null;
}
// Setup the filtered widgets array.
let widgets: Widget[] = [];
// Filter the config for unique widgets.
each(config.widgets, widget => {
if (!widgetSet.has(widget)) {
widgetSet.add(widget);
widgets.push(widget);
}
});
// Bail if there are no effective widgets.
if (widgets.length === 0) {
return null;
}
// Normalize the current index.
let index = config.currentIndex;
if (index !== -1 && (index < 0 || index >= widgets.length)) {
index = 0;
}