blob: 5f8fd346ea07128bb420f28986905b950c4d8860 [file] [log] [blame]
/*
* Copyright (C) 2019 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.atest.toolWindow;
import com.android.atest.AtestUtils;
import com.android.atest.Constants;
import com.android.atest.commandAdapter.CommandRunner;
import com.android.atest.dialog.MessageDialog;
import com.android.atest.widget.AtestFastInputController;
import com.android.atest.widget.AtestNotification;
import com.intellij.notification.Notifications;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.openapi.wm.ex.ToolWindowEx;
import com.intellij.openapi.wm.impl.ToolWindowImpl;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
/** UI content of Atest tool window. */
public class AtestToolWindow {
private static final int INITIAL_WIDTH = 1000;
private static final Logger LOG = Logger.getInstance(AtestToolWindow.class);
private static AtestToolWindow atestToolWindowInstance;
private JPanel mAtestToolWindowPanel;
private JScrollPane mScorll;
private JTextArea mAtestOutput;
private JLabel mAtestlabel;
private JTextField mLunchTarget;
private JCheckBox mRunOnHost;
private JCheckBox mTestMapping;
private JCheckBox mSkipBuild;
private JButton mRunButton;
private JComboBox mTestTarget;
/**
* Initializes AtestToolWindow with ToolWindow and Project.
*
* @param toolWindow a child window of the IDE used to display information.
* @param basePath a string that represents current project's base path.
*/
private AtestToolWindow(ToolWindow toolWindow, String basePath) {
setInitialWidth((ToolWindowEx) toolWindow);
setRunButton(basePath);
initTestTarget(basePath);
AtestFastInputController fastInputController =
new AtestFastInputController(mTestTarget, mRunOnHost, mTestMapping, mSkipBuild);
fastInputController.linkCheckBoxWithTestTarget();
mAtestOutput.setMargin(new Insets(0, 10, 0, 0));
}
/**
* Initializes AtestToolWindow instance.
*
* <p>Because the AtestToolWindow should be modified when the project is changed. It can't be
* singleton. This initializer is used by the ToolWindowFactory. We use IntelliJ's mechanism to
* make sure AtestToolWindow's instance can always follow the project.
*
* @param toolWindow a child window of the IDE used to display information.
* @param basePath a string that represents current project's base path.
* @return the AtestToolWindow instance.
*/
@NotNull
public static AtestToolWindow initAtestToolWindow(ToolWindow toolWindow, String basePath) {
atestToolWindowInstance = new AtestToolWindow(toolWindow, basePath);
return atestToolWindowInstance;
}
/**
* Gets AtestToolWindow instance by project.
*
* <p>When using ToolWindowManager to get atest tool window, it will initialize the
* AtestToolWindow by {@link AtestToolWindowFactory} asynchronously. We use
* ensureContentInitialized from ToolWindowImpl to ensure the AtestToolWindow has been
* initialized.
*
* @param project the current intelliJ project.
* @return the AtestToolWindow instance.
*/
@NotNull
public static AtestToolWindow getInstance(@NotNull Project project) {
ToolWindow AtestTW =
ToolWindowManager.getInstance(project).getToolWindow(Constants.ATEST_TOOL_WINDOW);
if (AtestTW instanceof ToolWindowImpl) {
((ToolWindowImpl) AtestTW).ensureContentInitialized();
}
if (atestToolWindowInstance == null) {
LOG.error("AtestToolWindowInstance is null when getting instance by project");
Notifications.Bus.notify(new AtestNotification(Constants.ATEST_WINDOW_FAIL));
}
return atestToolWindowInstance;
}
/**
* Initializes mTestTarget.
*
* @param basePath a string that represents current project's base path.
*/
private void initTestTarget(String basePath) {
mTestTarget.setEditable(true);
if (AtestUtils.hasTestMapping(basePath)) {
mTestTarget.setSelectedItem(basePath);
}
}
/**
* Sets the initial width of the tool window.
*
* @param toolWindowEx a toolWindow which has more methods.
*/
private void setInitialWidth(@NotNull ToolWindowEx toolWindowEx) {
int width = toolWindowEx.getComponent().getWidth();
if (width < INITIAL_WIDTH) {
toolWindowEx.stretchWidth(INITIAL_WIDTH - width);
}
}
/**
* Sets the Atest running output to the output area.
*
* @param text the output string.
*/
public void setAtestOutput(String text) {
mAtestOutput.setText(text);
}
/** Initializes the run button. */
private void setRunButton(String basePath) {
// When command running, the run button will be set to disable, then the focus will set to
// next object. Set run button not focusable to prevent it.
mRunButton.setFocusable(false);
mRunButton.addActionListener(
e -> {
String lunchTarget = mLunchTarget.getText();
String testTarget = mTestTarget.getEditor().getItem().toString();
String workPath = AtestUtils.getAndroidRoot(basePath);
try {
CommandRunner runner =
new CommandRunner(
lunchTarget, testTarget, workPath, AtestToolWindow.this);
runner.run();
} catch (IllegalArgumentException exception) {
String errorMessage =
AtestUtils.checkError(lunchTarget, testTarget, workPath);
MessageDialog.showMessageDialog(errorMessage);
}
});
}
/** Scrolls the output window scroll bar to the bottom. */
public void scrollToEnd() {
JScrollBar vertical = mScorll.getVerticalScrollBar();
vertical.setValue(vertical.getMaximum());
}
/**
* Enables (or disables) the run button.
*
* @param isEnable true to enable the run button, otherwise disable it.
*/
public void setRunEnable(boolean isEnable) {
mRunButton.setEnabled(isEnable);
}
/**
* Gets the UI panel of Atest tool window.
*
* @return the JPanel of Atest tool window.
*/
public JPanel getContent() {
return mAtestToolWindowPanel;
}
/**
* Sets the test target of Atest tool window.
*
* @target the test target of Atest tool window.
*/
public void setTestTarget(@NotNull String target) {
mTestTarget.setSelectedItem(target);
}
/**
* Sets the lunch target of Atest tool window.
*
* @target the lunch target of Atest tool window.
*/
public void setLunchTarget(@NotNull String target) {
mLunchTarget.setText(target);
}
}