com.google.jstestdriver.idea.ui.CapturedBrowsersPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.google.jstestdriver.idea.ui.CapturedBrowsersPanel.java

Source

/*
 * 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;
        }
    }
}