Source: session/trade/TradeDialogBarterPanel.js

/**
 * This class owns the BarterButtonManager and the accessory elements for bartering.
 */
TradeDialog.prototype.BarterPanel = class
{
	constructor()
	{
		this.barterResources = Engine.GetGUIObjectByName("barterResources");

		let isAvailable = BarterButtonManager.IsAvailable(this.barterResources);
		if (isAvailable)
			this.barterButtonManager = new BarterButtonManager(this.barterResources);

		Engine.GetGUIObjectByName("tradeDialogPanelBarter").hidden = !isAvailable;

		this.barterNoMarketsMessage = Engine.GetGUIObjectByName("barterNoMarketsMessage");
		this.barterHelp = Engine.GetGUIObjectByName("barterHelp");
	}

	update()
	{
		let playerState = GetSimState().players[g_ViewedPlayer];
		const canBarter = playerState && playerState.canBarter || false;

		this.barterButtonManager.setViewedPlayer(g_ViewedPlayer);
		this.barterButtonManager.update();
		this.barterNoMarketsMessage.hidden = canBarter;
		this.barterResources.hidden = !canBarter;
		this.barterHelp.hidden = !canBarter;
		this.barterHelp.tooltip = sprintf(
			translate(this.InstructionsTooltip), {
				"quantity": this.barterButtonManager.getSelectedButton().BarterResourceSellQuantity,
				"hotkey": colorizeHotkey("%(hotkey)s", "session.massbarter"),
				"multiplier": this.barterButtonManager.getSelectedButton().Multiplier
			});
	}
};

TradeDialog.prototype.BarterPanel.getWidthOffset = function()
{
	return BarterButton.getWidth(Engine.GetGUIObjectByName("barterResources")) * g_ResourceData.GetBarterableCodes().length;
};

TradeDialog.prototype.BarterPanel.prototype.InstructionsTooltip =
	markForTranslation("Start by selecting the resource you wish to sell from the upper row. For each time the lower buttons are pressed, %(quantity)s of the upper resource will be sold for the displayed quantity of the lower. Press and hold %(hotkey)s to temporarily multiply the traded amount by %(multiplier)s.");