/* * Copyright 2013-2016 consulo.io * * 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 consulo.ide.newProject; import com.intellij.ide.impl.ProjectUtil; import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.LabeledComponent; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.ui.VerticalFlowLayout; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.platform.LocationNameFieldsBinding; import com.intellij.ui.CollectionListModel; import com.intellij.ui.ColoredListCellRenderer; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.SeparatorComponent; import com.intellij.ui.components.JBLabel; import com.intellij.ui.components.JBList; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import consulo.annotations.RequiredDispatchThread; import consulo.ide.welcomeScreen.BaseWelcomeScreenPanel; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; /** * @author VISTALL * @since 14-Sep-16 */ public abstract class NewProjectPanel extends BaseWelcomeScreenPanel<VirtualFile> { private JPanel myRightPanel; private JTextField myNameField; private TextFieldWithBrowseButton myLocationField; private JComponent myConfigurationPanel; private NewModuleBuilderProcessor myProcessor; @Nullable private Project myProject; private JBList<Object> myList; @RequiredDispatchThread public NewProjectPanel(@NotNull Disposable parentDisposable, @Nullable Project project, @Nullable VirtualFile virtualFile) { super(parentDisposable, virtualFile); myProject = project; } @NotNull public String getLocationText() { return myLocationField.getText(); } @Nullable public String getNameText() { return myNameField.getText(); } public NewModuleBuilderProcessor getProcessor() { return myProcessor; } public JComponent getConfigurationPanel() { return myConfigurationPanel; } public boolean isModuleCreation() { return myParam != null; } protected abstract JComponent createSouthPanel(); public abstract void setOKActionEnabled(boolean enabled); @NotNull @Override protected JComponent createLeftComponent(@NotNull Disposable parentDisposable, VirtualFile param) { NewModuleContext context = new NewModuleContext(); NewModuleBuilder.EP_NAME.composite().setupContext(context); CollectionListModel<Object> model = new CollectionListModel<>(); myList = new JBList<>(model); myList.setCellRenderer(new ColoredListCellRenderer<Object>() { @Override protected void customizeCellRenderer(@NotNull JList list, Object value, int index, boolean selected, boolean hasFocus) { setFont(UIUtil.getFont(UIUtil.FontSize.BIGGER, null)); if (value instanceof NewModuleContext.Group) { setSeparator(StringUtil.nullize(((NewModuleContext.Group)value).getName())); } else if (value instanceof NewModuleContext.Item) { setIcon(((NewModuleContext.Item)value).getIcon()); append(((NewModuleContext.Item)value).getName()); } } @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { Component component = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); Dimension preferredSize = component.getPreferredSize(); component.setPreferredSize(new Dimension(preferredSize.width, JBUI.scale(25))); return component; } }); NewModuleContext.Group[] groups = context.getGroups(); for (NewModuleContext.Group group : groups) { // do not add simple line if (!(groups.length == 1 && group.getId().equals(NewModuleContext.UGROUPED))) { model.add(group); } for (NewModuleContext.Item item : group.getItems()) { model.add(item); } } return ScrollPaneFactory.createScrollPane(myList, true); } @RequiredDispatchThread @NotNull @Override protected JComponent createRightComponent(VirtualFile param) { final JPanel panel = new JPanel(new VerticalFlowLayout()); myNameField = new JTextField(); myLocationField = new TextFieldWithBrowseButton(); panel.add(LabeledComponent.left(myNameField, "Name")); if (myParam != null) { myNameField.setText(myParam.getName()); } else { panel.add(LabeledComponent.left(myLocationField, "Path")); new LocationNameFieldsBinding(myProject, myLocationField, myNameField, ProjectUtil.getBaseDir(), "Select Directory"); } panel.add(new SeparatorComponent()); final JPanel etcPanel = new JPanel(new BorderLayout()); panel.add(etcPanel); final JPanel nullPanel = new JPanel(new BorderLayout()); JBLabel nodeLabel = new JBLabel("Please select project type", UIUtil.ComponentStyle.SMALL, UIUtil.FontColor.BRIGHTER); nodeLabel.setHorizontalAlignment(SwingConstants.CENTER); nullPanel.add(nodeLabel, BorderLayout.CENTER); myRightPanel = new JPanel(new BorderLayout()); myRightPanel.add(nullPanel, BorderLayout.CENTER); myList.addListSelectionListener(e -> { Object selectedValue = myList.getSelectedValue(); myProcessor = selectedValue instanceof NewModuleContext.Item ? ((NewModuleContext.Item)selectedValue).getProcessor() : null; myConfigurationPanel = nullPanel; etcPanel.removeAll(); myRightPanel.removeAll(); if (selectedValue instanceof NewModuleContext.Item) { if (myProcessor != null) { myConfigurationPanel = myProcessor.createConfigurationPanel(); etcPanel.add(myConfigurationPanel, BorderLayout.NORTH); } myRightPanel.add(panel, BorderLayout.CENTER); } if (myRightPanel.getComponentCount() == 0) { myRightPanel.add(nullPanel, BorderLayout.CENTER); } myRightPanel.validate(); myRightPanel.repaint(); setOKActionEnabled(myProcessor != null); }); JPanel root = new JPanel(new BorderLayout()); root.add(myRightPanel, BorderLayout.CENTER); JComponent southPanel = createSouthPanel(); assert southPanel != nullPanel; southPanel.setBorder(JBUI.Borders.empty(DialogWrapper.ourDefaultBorderInsets)); root.add(southPanel, BorderLayout.SOUTH); return root; } }