Source: session/trade/BarterButtonManager.js

/**
 * This class provides barter buttons.
 * This is instantiated once for the selection panels and once for the trade dialog.
 */
class BarterButtonManager
{
	constructor(panel)
	{
		if (!BarterButtonManager.IsAvailable(panel))
			throw "BarterButtonManager instantiated with no barterable resources or too few buttons!";

		// The player may be the owner of the selected market
		this.viewedPlayer = -1;

		let resourceCodes = g_ResourceData.GetBarterableCodes();
		this.selectedResource = resourceCodes[0];
		this.buttons = resourceCodes.map((resourceCode, i) =>
			new BarterButton(this, resourceCode, i, panel));

		panel.onPress = this.update.bind(this);
		panel.onRelease = this.update.bind(this);
	}

	setViewedPlayer(viewedPlayer)
	{
		this.viewedPlayer = viewedPlayer;
	}

	setSelectedResource(resourceCode)
	{
		this.selectedResource = resourceCode;
		this.update();
	}

	getSelectedButton()
	{
		for (const button of this.buttons)
			if (!this.selectedResource || this.selectedResource == button.resourceCode)
				return button;
	}

	update()
	{
		for (const button of this.buttons)
			button.update(this.viewedPlayer);
	}
}

BarterButtonManager.IsAvailable = function(panel)
{
	let resourceCount = g_ResourceData.GetBarterableCodes().length;
	return resourceCount && resourceCount <= panel.children.length;
};