blob: 9db445ce7313c619176ecef956cff4e7927a677a [file] [log] [blame]
package org.jetbrains.plugins.gradle.config;
import com.intellij.openapi.actionSystem.ActionGroup;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.ActionToolbar;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.SimpleToolWindowPanel;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.SideBorder;
import com.intellij.util.messages.MessageBusConnection;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.gradle.settings.GradleSettings;
import org.jetbrains.plugins.gradle.settings.GradleSettingsListener;
import org.jetbrains.plugins.gradle.ui.RichTextControlBuilder;
import org.jetbrains.plugins.gradle.util.GradleBundle;
import javax.swing.*;
import java.awt.*;
import java.util.Collections;
import java.util.List;
/**
* Base class for high-level Gradle GUI controls used at the Gradle tool window. The basic idea is to encapsulate the same features in
* this class and allow to extend it via <code>Template Method</code> pattern. The shared features are listed below:
* <pre>
* <ul>
* <li>provide common actions at the toolbar;</li>
* <li>show info control when no gradle project is linked to the current IntelliJ IDEA project;</li>
* </ul>
* </pre>
* <p/>
* Not thread-safe.
*
* @author Denis Zhdanov
* @since 12/26/11 5:19 PM
*/
public abstract class GradleToolWindowPanel extends SimpleToolWindowPanel {
private static final String NON_LINKED_CARD_NAME = "NON_LINKED";
private static final String CONTENT_CARD_NAME = "CONTENT";
private static final String TOOL_WINDOW_TOOLBAR_ID = "Gradle.ChangeActionsToolbar";
/** Show info control when no gradle project is linked, using {@link CardLayout} for that. */
private final CardLayout myLayout = new CardLayout();
/** Top-level container, managed by the card layout. */
private final JPanel myContent = new JPanel(myLayout);
private final Project myProject;
private final String myPlace;
protected GradleToolWindowPanel(@NotNull Project project, @NotNull String place) {
super(true);
myProject = project;
myPlace = place;
setContent(myContent);
MessageBusConnection connection = project.getMessageBus().connect(project);
connection.subscribe(GradleSettingsListener.TOPIC, new GradleSettingsListenerAdapter() {
// TODO den implement
// @Override public void onLinkedProjectConfigChange(@Nullable String oldPath, @Nullable String newPath) {
// if (StringUtil.isEmpty(newPath)) {
// myLayout.show(myContent, NON_LINKED_CARD_NAME);
// return;
// }
// if (StringUtil.isEmpty(oldPath) && !StringUtil.isEmpty(newPath)) {
// myLayout.show(myContent, CONTENT_CARD_NAME);
// }
// }
});
}
public void initContent() {
final ActionManager actionManager = ActionManager.getInstance();
final ActionGroup actionGroup = (ActionGroup)actionManager.getAction(TOOL_WINDOW_TOOLBAR_ID);
ActionToolbar actionToolbar = actionManager.createActionToolbar(myPlace, actionGroup, true);
JPanel toolbarControl = new JPanel(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridwidth = GridBagConstraints.REMAINDER;
constraints.weightx = 1;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.anchor = GridBagConstraints.WEST;
toolbarControl.add(actionToolbar.getComponent(), constraints);
for (JComponent component : getToolbarControls()) {
component.setBorder(IdeBorderFactory.createBorder(SideBorder.TOP));
toolbarControl.add(component, constraints);
}
setToolbar(toolbarControl);
final JComponent payloadControl = buildContent();
JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(payloadControl);
JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
scrollBar.setUnitIncrement(scrollBar.getUnitIncrement() * 7);
myContent.add(scrollPane, CONTENT_CARD_NAME);
RichTextControlBuilder builder = new RichTextControlBuilder();
builder.setBackgroundColor(payloadControl.getBackground());
builder.setForegroundColor(UIUtil.getInactiveTextColor());
builder.setFont(payloadControl.getFont());
builder.setText(GradleBundle.message("gradle.toolwindow.text.no.linked.project"));
final JComponent noLinkedProjectControl = builder.build();
myContent.add(noLinkedProjectControl, NON_LINKED_CARD_NAME);
update();
}
/**
* @return list of UI controls to be displayed vertically at the toolbar
*/
@NotNull
protected List<JComponent> getToolbarControls() {
return Collections.emptyList();
}
/**
* Asks current control to update its state.
*/
public void update() {
final GradleSettings settings = GradleSettings.getInstance(myProject);
// TODO den implement
String cardToShow = "sf";
// String cardToShow = StringUtil.isEmpty(settings.getLinkedExternalProjectPath()) ? NON_LINKED_CARD_NAME : CONTENT_CARD_NAME;
myLayout.show(myContent, cardToShow);
boolean showToolbar = cardToShow != NON_LINKED_CARD_NAME;
for (JComponent component : getToolbarControls()) {
component.setVisible(showToolbar);
}
}
@NotNull
public Project getProject() {
return myProject;
}
/**
* @return GUI control to be displayed at the current tab
*/
@NotNull
protected abstract JComponent buildContent();
/**
* Callback for asking content control to update its state.
*/
protected abstract void updateContent();
}