/*
* Copyright 2003-2015 JetBrains s.r.o.
*
* 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 jetbrains.mps.ide.datatransfer;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.ui.components.JBList;
import jetbrains.mps.ide.icons.IconManager;
import jetbrains.mps.ide.icons.IdeIcons;
import jetbrains.mps.ide.project.ProjectHelper;
import jetbrains.mps.project.Project;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.mps.openapi.language.SLanguage;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SModelReference;
import org.jetbrains.mps.openapi.module.SModuleReference;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.ListCellRenderer;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
/**
* evgeny, 11/15/11
*/
public class AddRequiredImportsDialog extends DialogWrapper {
@NotNull
private final Project myProject;
private final SModelReference[] myRequiredImports;
private final SLanguage[] myRequiredLanguages;
private JList myModelsList;
private JList myLanguagesList;
private SModelReference[] mySelectedImports;
private SLanguage[] mySelectedLanguages;
public AddRequiredImportsDialog(@NotNull final Project project, @NotNull SModelReference[] requiredImports, @NotNull SLanguage[] requiredLanguages) {
super(ProjectHelper.toIdeaProject(project), true);
myProject = project;
myRequiredImports = requiredImports;
myRequiredLanguages = requiredLanguages;
if (requiredImports.length == 0) {
setTitle("Select languages to import");
} else if (requiredLanguages.length == 0) {
setTitle("Select models to import");
} else {
setTitle("Select models and languages to import");
}
init();
if (myModelsList != null) {
myModelsList.setSelectionInterval(0, myRequiredImports.length - 1);
}
if (myLanguagesList != null) {
myLanguagesList.setSelectionInterval(0, myRequiredLanguages.length - 1);
}
}
@Override
protected void doOKAction() {
Object[] values;
if (myModelsList != null) {
values = myModelsList.getSelectedValues();
mySelectedImports = new SModelReference[values.length];
System.arraycopy(values, 0, mySelectedImports, 0, values.length);
}
if (myLanguagesList != null) {
values = myLanguagesList.getSelectedValues();
mySelectedLanguages = new SLanguage[values.length];
System.arraycopy(values, 0, mySelectedLanguages, 0, values.length);
}
super.doOKAction();
}
@Override
protected JComponent createCenterPanel() {
final JPanel panel = new JPanel(new BorderLayout());
JTextArea area = new JTextArea(
"The code fragment which you have pasted requires model imports\n" +
"and languages that are not accessible in the new context.");
area.setEditable(false);
area.setBackground(this.getContentPane().getBackground());
area.setBorder(BorderFactory.createEmptyBorder(5, 5, 3, 5));
panel.add(area, BorderLayout.NORTH);
JPanel center = new JPanel(new GridBagLayout());
if (myRequiredImports.length > 0) {
JTextArea label = new JTextArea("Select models that you want to import:");
label.setEditable(false);
label.setBackground(this.getContentPane().getBackground());
label.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
center.add(label, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
myModelsList = new JBList((Object[]) myRequiredImports);
myModelsList.setCellRenderer(new MyCellRenderer(myProject));
myModelsList.setBorder(BorderFactory.createEtchedBorder());
center.add(ScrollPaneFactory.createScrollPane(myModelsList), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
}
if (myRequiredLanguages.length > 0) {
JTextArea label = new JTextArea("Use languages:");
label.setEditable(false);
label.setBackground(this.getContentPane().getBackground());
label.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
center.add(label, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(myRequiredImports.length > 0 ? 5 : 0, 0, 0, 0), 0, 0));
myLanguagesList = new JBList((Object[]) myRequiredLanguages);
myLanguagesList.setCellRenderer(new MyCellRenderer(myProject));
myLanguagesList.setBorder(BorderFactory.createEtchedBorder());
center.add(ScrollPaneFactory.createScrollPane(myLanguagesList), new GridBagConstraints(0, GridBagConstraints.RELATIVE, 2, 1, 1.0, 1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
}
panel.add(center, BorderLayout.CENTER);
panel.setPreferredSize(new Dimension(500, 400));
return panel;
}
@Override
protected String getDimensionServiceKey() {
return "#jetbrains.mps.workbench.dialogs.project.utildialogs.addmodelimport.AddRequiredModelImportsDialog2";
}
@NotNull
public SModelReference[] getSelectedImports() {
return mySelectedImports != null ? mySelectedImports : new SModelReference[0];
}
@NotNull
public SLanguage[] getSelectedLanguages() {
return mySelectedLanguages != null ? mySelectedLanguages : new SLanguage[0];
}
private static class MyCellRenderer extends SimpleColoredComponent implements ListCellRenderer {
private final Font FONT;
private final Project myProject;
public MyCellRenderer(Project mpsProject) {
myProject = mpsProject;
EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme();
FONT = new Font(scheme.getEditorFontName(), Font.PLAIN, scheme.getEditorFontSize());
setOpaque(true);
}
@Override
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
clear();
if (value instanceof SModelReference) {
final SModelReference ref = (SModelReference) value;
// FIXME likely, IconManager shall take project argument
myProject.getModelAccess().runReadAction(new Runnable() {
@Override
public void run() {
SModel model = ref.resolve(myProject.getRepository());
setIcon(IconManager.getIconFor(model));
}
});
append(ref.getModelName(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
SModuleReference module = ref.getModuleReference();
String moduleName = module == null ? null : module.getModuleName();
if (moduleName != null && !moduleName.isEmpty()) {
append(" (" + moduleName + ")", SimpleTextAttributes.GRAY_ATTRIBUTES);
}
} else if (value instanceof SLanguage) {
setIcon(IdeIcons.LANGUAGE_ICON);
append(((SLanguage) value).getQualifiedName(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
} else {
setIcon(IdeIcons.DEFAULT_ICON);
append("unknown", SimpleTextAttributes.REGULAR_ATTRIBUTES);
}
setFont(FONT);
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
return this;
}
}
}