/* * Copyright 2009 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.jstestdriver.idea.ui; import com.google.common.collect.Maps; import com.google.jstestdriver.BrowserInfo; import com.google.jstestdriver.browser.BrowserCaptureEvent; import com.google.jstestdriver.hooks.ServerListener; import com.google.jstestdriver.idea.PluginResources.BrowserIcon; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.io.IOException; import java.util.Collection; import java.util.Map; /** * @author alexeagle@google.com (Alex Eagle) */ @SuppressWarnings("serial") public class CapturedBrowsersPanel extends JPanel implements ServerListener { private static final Logger log = Logger.getInstance(CapturedBrowsersPanel.class); private final Map<String, BrowserLabel> myBrowserLabelByNameMap; public CapturedBrowsersPanel() { try { myBrowserLabelByNameMap = Maps.newLinkedHashMap(); // order is important addBrowser("Chrome", "Chrome.png"); addBrowser("Microsoft Internet Explorer", "IE.png"); addBrowser("Firefox", "Firefox.png"); addBrowser("Opera", "Opera.png"); addBrowser("Safari", "Safari.png"); } catch (IOException e) { throw new RuntimeException(); } setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); Collection<BrowserLabel> browserLabels = myBrowserLabelByNameMap.values(); for (BrowserLabel browserLabel : browserLabels) { add(browserLabel); } Icon icon = browserLabels.iterator().next().getBrowserIcon().getColorIcon(); Dimension minimumSize = new Dimension(icon.getIconWidth() * browserLabels.size(), icon.getIconHeight()); setMinimumSize(minimumSize); setPreferredSize(minimumSize); } private void addBrowser(String browserName, String iconPath) throws IOException { String lowerCasedName = browserName.toLowerCase(); if (myBrowserLabelByNameMap.containsKey(lowerCasedName)) { throw new RuntimeException("Attempt to duplicate browser '" + browserName + "'!"); } BrowserLabel browserLabel = new BrowserLabel(BrowserIcon.buildFromResource(iconPath)); myBrowserLabelByNameMap.put(lowerCasedName, browserLabel); } @Nullable private BrowserLabel getBrowserLabelByName(@NotNull String browserName) { return myBrowserLabelByNameMap.get(browserName.toLowerCase()); } @Override public void serverStarted() { batchChangeBrowserState(BrowserCaptureEvent.Event.DISCONNECTED); } @Override public void serverStopped() { batchChangeBrowserState(BrowserCaptureEvent.Event.DISCONNECTED); } private void batchChangeBrowserState(@NotNull final BrowserCaptureEvent.Event event) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { for (BrowserLabel browserLabel : myBrowserLabelByNameMap.values()) { Icon icon = browserLabel.getBrowserIcon().getIconForEvent(event); browserLabel.setIcon(icon); } } }); } @Override public void browserCaptured(BrowserInfo info) { browserStateChanged(info, BrowserCaptureEvent.Event.CONNECTED); } @Override public void browserPanicked(BrowserInfo info) { browserStateChanged(info, BrowserCaptureEvent.Event.DISCONNECTED); } private void browserStateChanged(@NotNull final BrowserInfo info, final BrowserCaptureEvent.Event event) { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { BrowserLabel browserLabel = getBrowserLabelByName(info.getName()); if (browserLabel != null) { browserLabel.setIcon(browserLabel.getBrowserIcon().getIconForEvent(event)); } else { log.warn("Unregistered browser '" + info.getName() + "' BrowserCaptureEvent has been received. " + info + ", type: " + event); } } }); } private static class BrowserLabel extends JLabel { private final BrowserIcon myBrowserIcon; BrowserLabel(BrowserIcon browserIcon) { super(browserIcon.getGreyscaleIcon()); myBrowserIcon = browserIcon; } public BrowserIcon getBrowserIcon() { return myBrowserIcon; } } }