Source: session/chat/ChatWindow.js

/**
 * This class is concerned with opening, closing the chat page, and
 * resizing it depending on whether the chat history is shown.
 */
class ChatWindow
{
	constructor()
	{
		this.chatInput = Engine.GetGUIObjectByName("chatInput");
		this.closeChat = Engine.GetGUIObjectByName("closeChat");

		this.extendedChat = Engine.GetGUIObjectByName("extendedChat");
		this.chatHistoryText = Engine.GetGUIObjectByName("chatHistoryText");
		this.chatHistoryPage = Engine.GetGUIObjectByName("chatHistoryPage");

		this.chatDialogPanel = Engine.GetGUIObjectByName("chatDialogPanel");
		this.chatDialogPanelSmallSize = Engine.GetGUIObjectByName("chatDialogPanelSmall").size;
		this.chatDialogPanelLargeSize = Engine.GetGUIObjectByName("chatDialogPanelLarge").size;

		// Adjust the width so that the chat history is in the golden ratio
		this.aspectRatio = (1 + Math.sqrt(5)) / 2;

		this.initPage();
	}

	initPage()
	{
		this.closeChat.onPress = this.closePage.bind(this);

		this.extendedChat.onPress = () => {
			Engine.ConfigDB_CreateAndWriteValueToFile("user", "chat.session.extended", String(this.isExtended()), "config/user.cfg");
			this.resizeChatWindow();
			this.chatInput.focus();
		};

		this.extendedChat.checked = Engine.ConfigDB_GetValue("user", "chat.session.extended") == "true";

		this.chatDialogPanel.onWindowResized = this.resizeChatWindow.bind(this);
		this.resizeChatWindow();
	}

	/**
	 * Called if the addressee or history filter selection changed.
	 */
	onSelectionChange()
	{
		if (this.isOpen())
			this.chatInput.focus();
	}

	isOpen()
	{
		return !this.chatDialogPanel.hidden;
	}

	isExtended()
	{
		return this.extendedChat.checked;
	}

	openPage(command)
	{
		this.chatInput.focus();
		this.chatDialogPanel.hidden = false;
	}

	closePage()
	{
		this.chatInput.caption = "";
		this.chatInput.blur();
		this.chatDialogPanel.hidden = true;
	}

	resizeChatWindow()
	{
		// Hide/show the panel
		this.chatHistoryPage.hidden = !this.isExtended();

		// Resize the window
		if (this.isExtended())
		{
			this.chatDialogPanel.size = this.chatDialogPanelLargeSize;

			let chatHistoryTextSize = this.chatHistoryText.getComputedSize();
			let width = this.aspectRatio * (chatHistoryTextSize.bottom - chatHistoryTextSize.top);

			let size = this.chatDialogPanel.size;
			size.left = -width / 2 - this.chatHistoryText.size.left;
			size.right = width / 2 + this.chatHistoryText.size.left;
			this.chatDialogPanel.size = size;
		}
		else
			this.chatDialogPanel.size = this.chatDialogPanelSmallSize;
	}
}