com.android.tools.idea.editors.gfxtrace.GfxTraceViewPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.android.tools.idea.editors.gfxtrace.GfxTraceViewPanel.java

Source

/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * 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.android.tools.idea.editors.gfxtrace;

import com.android.tools.idea.editors.gfxtrace.controllers.FrameBufferController;
import com.intellij.execution.ui.layout.impl.JBRunnerTabs;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.ComboBox;
import com.intellij.openapi.ui.ThreeComponentsSplitter;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.ui.JBColor;
import com.intellij.ui.JBSplitter;
import com.intellij.ui.components.JBList;
import com.intellij.ui.components.JBPanel;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.ui.components.panels.Wrapper;
import com.intellij.ui.tabs.TabInfo;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.HierarchyBoundsAdapter;
import java.awt.event.HierarchyEvent;

public class GfxTraceViewPanel implements Disposable {
    private JPanel mainPanel;
    private JBPanel myColorBuffer;
    private JBPanel myDepthBuffer;
    private JPanel myMemoryPanel;
    private JPanel myImagePanel;
    private JBList myScrubberList;
    private JBScrollPane myStateScrollPane;
    private JBScrollPane myScrubberScrollPane;
    private ThreeComponentsSplitter myThreePanes;
    private JPanel myHiddenComponents;
    private JBScrollPane myAtomScrollPane;
    private ComboBox myDeviceList;
    private ComboBox myCapturesList;
    private JBPanel myTopPanel;
    private ComboBox myGfxContextList;
    private JBScrollPane myColorScrollPane;
    private JBScrollPane myWireframeScrollPane;
    private JBScrollPane myDepthScrollPane;
    private JBScrollPane myStencilScrollPane;
    private JBPanel myDocsPanel;
    private JBScrollPane myDocsScrollPane;
    private JTextPane myDocsPane;
    private JBPanel myWireframeBuffer;
    private JBRunnerTabs myBufferTabs;

    @NotNull
    public JPanel getRootComponent() {
        return mainPanel;
    }

    public JPanel getImagePanel() {
        return myImagePanel;
    }

    public JPanel getMemoryPanel() {
        return myMemoryPanel;
    }

    public JBScrollPane getAtomScrollPane() {
        return myAtomScrollPane;
    }

    public JBList getScrubberList() {
        return myScrubberList;
    }

    public JBScrollPane getStateScrollPane() {
        return myStateScrollPane;
    }

    public ThreeComponentsSplitter getThreePanes() {
        return myThreePanes;
    }

    public JPanel getHiddenComponents() {
        return myHiddenComponents;
    }

    private void setHiddenComponents(@Nullable JPanel hiddenComponents) {
        //noinspection BoundFieldAssignment
        myHiddenComponents = hiddenComponents;
    }

    public JBRunnerTabs getBufferTabs() {
        return myBufferTabs;
    }

    public void setBufferTabs(@NotNull JBRunnerTabs bufferTabs) {
        myBufferTabs = bufferTabs;
    }

    public JBScrollPane getScrubberScrollPane() {
        return myScrubberScrollPane;
    }

    public ComboBox getDeviceList() {
        return myDeviceList;
    }

    public ComboBox getCapturesList() {
        return myCapturesList;
    }

    public JBPanel getTopPanel() {
        return myTopPanel;
    }

    public ComboBox getGfxContextList() {
        return myGfxContextList;
    }

    public JBScrollPane getColorScrollPane() {
        return myColorScrollPane;
    }

    public JBScrollPane getWireframeScrollPane() {
        return myWireframeScrollPane;
    }

    public JBScrollPane getDepthScrollPane() {
        return myDepthScrollPane;
    }

    public JBScrollPane getStencilScrollPane() {
        return myStencilScrollPane;
    }

    public JBScrollPane getDocsScrollPane() {
        return myDocsScrollPane;
    }

    public JBPanel getDocsPanel() {
        return myDocsPanel;
    }

    public JTextPane getDocsPane() {
        return myDocsPane;
    }

    @Override
    public void dispose() {
    }

    public void setupViewHierarchy(@NotNull Project project) {
        JPanel rootPanel = getRootComponent();
        rootPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

        final ThreeComponentsSplitter threePane = getThreePanes();
        threePane.setDividerWidth(5);

        // Set some preferences on the scrubber.
        getTopPanel().setBorder(BorderFactory.createLineBorder(JBColor.border()));
        getScrubberScrollPane().setViewportView(getScrubberList());

        // Get rid of the hidden component and remove references to its children, since it's just a placeholder for us to use the UI designer.
        getHiddenComponents().removeAll();
        rootPanel.remove(getHiddenComponents());
        setHiddenComponents(null);

        // Configure the buffer views.
        final JBRunnerTabs bufferTabs = new JBRunnerTabs(project, ActionManager.getInstance(),
                IdeFocusManager.findInstance(), this);
        bufferTabs.setPaintBorder(0, 0, 0, 0).setTabSidePaintBorder(1)
                .setPaintFocus(UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF())
                .setAlwaysPaintSelectedTab(UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF());
        JBPanel[] frameBuffers = new JBPanel[] { myColorBuffer, myWireframeBuffer, myDepthBuffer };
        for (int i = 0; i < frameBuffers.length; ++i) {
            bufferTabs.addTab(
                    new TabInfo(frameBuffers[i]).setText(FrameBufferController.BufferType.values()[i].getName()));
        }
        bufferTabs.setBorder(new EmptyBorder(0, 2, 0, 0));
        setBufferTabs(bufferTabs);

        // Put the buffer views in a wrapper so a border can be drawn around it.
        Wrapper bufferWrapper = new Wrapper();
        bufferWrapper.setLayout(new BorderLayout());
        bufferWrapper.setBorder(BorderFactory.createLineBorder(JBColor.border()));
        bufferWrapper.setContent(bufferTabs);

        // Configure the Atom tree container.
        Wrapper atomTreeWrapper = new Wrapper();
        atomTreeWrapper.setBorder(BorderFactory.createLineBorder(JBColor.border()));
        atomTreeWrapper.setContent(myAtomScrollPane);

        // Now add the atom tree and buffer views to the middle pane in the main pane.
        final JBSplitter middleSplitter = new JBSplitter(false);
        middleSplitter.setMinimumSize(new Dimension(100, 10));
        middleSplitter.setFirstComponent(atomTreeWrapper);
        middleSplitter.setSecondComponent(bufferWrapper);
        threePane.setInnerComponent(middleSplitter);

        // Configure the miscellaneous tabs.
        JBRunnerTabs miscTabs = new JBRunnerTabs(project, ActionManager.getInstance(),
                IdeFocusManager.findInstance(), this);
        miscTabs.setPaintBorder(0, 0, 0, 0).setTabSidePaintBorder(1)
                .setPaintFocus(UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF())
                .setAlwaysPaintSelectedTab(UIUtil.isUnderDarcula() || UIUtil.isUnderIntelliJLaF());
        miscTabs.addTab(new TabInfo(getMemoryPanel()).setText("Memory"));
        miscTabs.addTab(new TabInfo(getImagePanel()).setText("Image"));
        miscTabs.addTab(new TabInfo(getDocsPanel()).setText("Docs"));
        miscTabs.setBorder(new EmptyBorder(0, 2, 0, 0));

        getDocsScrollPane().setViewportView(getDocsPane());

        // More borders for miscellaneous tabs.
        Wrapper miscWrapper = new Wrapper();
        miscWrapper.setBorder(BorderFactory.createLineBorder(JBColor.border()));
        miscWrapper.setContent(miscTabs);

        // Borders for the state tree as well.
        Wrapper stateWrapper = new Wrapper();
        stateWrapper.setContent(getStateScrollPane());
        stateWrapper.setBorder(BorderFactory.createLineBorder(JBColor.border()));

        // Configure the bottom splitter.
        final JBSplitter bottomSplitter = new JBSplitter(false);
        bottomSplitter.setMinimumSize(new Dimension(100, 10));
        bottomSplitter.setFirstComponent(stateWrapper);
        bottomSplitter.setSecondComponent(miscWrapper);
        threePane.setLastComponent(bottomSplitter);

        // Make sure the bottom splitter honors minimum sizes.
        threePane.setHonorComponentsMinimumSize(true);

        threePane.addHierarchyBoundsListener(new HierarchyBoundsAdapter() {
            @Override
            public void ancestorResized(HierarchyEvent hierarchyEvent) {
                super.ancestorResized(hierarchyEvent);
                resize();
            }
        });
    }

    public void resize() {
        ThreeComponentsSplitter threePane = getThreePanes();

        assert (threePane.getLastComponent() instanceof JBSplitter);
        JBSplitter bottomSplitter = (JBSplitter) threePane.getLastComponent();

        assert (threePane.getInnerComponent() instanceof JBSplitter);
        JBSplitter middleSplitter = (JBSplitter) threePane.getInnerComponent();

        int scrubberHeight = getScrubberScrollPane().getMinimumSize().height;
        if (threePane.getFirstSize() < scrubberHeight) {
            int totalHeight = threePane.getHeight();
            int residualHeightAfter = Math.max(0, totalHeight - scrubberHeight);

            threePane.setFirstSize(scrubberHeight);
            int middleSize = middleSplitter.getPreferredSize().height;
            int bottomSize = bottomSplitter.getPreferredSize().height;
            if (bottomSize + middleSize > 0) {
                threePane.setLastSize(residualHeightAfter * bottomSize / (bottomSize + middleSize)); // Split the middle and bottom panes evenly.
            } else {
                threePane.setLastSize(residualHeightAfter / 2);
            }
        }
    }
}