package com.ts3client.ui; import com.formdev.flatlaf.util.UIScale; import com.ts3client.net.HostButton; import com.ts3client.net.PictureDownloads; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.SwingUtilities; import java.awt.Image; import java.io.File; import java.util.Objects; /** * The server's host button in the toolbar's corner: its own picture, fitted to the * toolbar's height, or TeamSpeak's host button icon while there is none (yet). */ final class HostButtonView extends JButton { /** Keeps a banner-shaped picture from crowding out the rest of the toolbar. */ private static final int MAX_ASPECT = 6; private final PictureDownloads pictures; private final Runnable onPictureLoaded = () -> SwingUtilities.invokeLater(this::refreshIcon); private HostButton shown; HostButtonView(PictureDownloads pictures) { this.pictures = pictures; setVisible(false); addActionListener(e -> { if (shown != null && !shown.url().isEmpty()) Links.open(shown.url(), this); }); } /** @param button the selected server's, or {@code null} to hide it */ void show(HostButton button) { if (Objects.equals(button, shown)) return; shown = button; setVisible(button != null); if (button == null) return; setToolTipText(!button.tooltip().isEmpty() ? button.tooltip() : button.url().isEmpty() ? null : button.url()); refreshIcon(); } @Override public void addNotify() { super.addNotify(); pictures.addListener(onPictureLoaded); } @Override public void removeNotify() { pictures.removeListener(onPictureLoaded); super.removeNotify(); } private void refreshIcon() { if (shown == null) return; ImageIcon picture = shown.gfxUrl().isEmpty() ? null : picture(pictures.get(shown.gfxUrl())); setIcon(picture != null ? picture : Icons.of("HOSTER_BUTTON", UIScale.scale(IconTheme.TOOLBAR_SIZE))); } private static ImageIcon picture(File file) { if (file == null) return null; ImageIcon icon = new ImageIcon(file.getPath()); int w = icon.getIconWidth(); int h = icon.getIconHeight(); if (w <= 0 || h <= 0) return null; int height = UIScale.scale(IconTheme.TOOLBAR_SIZE); int width = Math.min(Math.max(1, Math.round((float) w * height / h)), height * MAX_ASPECT); if (w == width && h == height) return icon; return new ImageIcon(icon.getImage().getScaledInstance(width, height, Image.SCALE_SMOOTH)); } }