package jetbrains.mps.workbench.dialogs.project.properties.project;
/*Generated by MPS */
import com.intellij.ui.components.JBPanel;
import org.jetbrains.mps.openapi.ui.Modifiable;
import jetbrains.mps.project.StandaloneMPSProject;
import com.intellij.openapi.project.Project;
import jetbrains.mps.project.MPSProject;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.uiDesigner.core.GridConstraints;
import javax.swing.JComponent;
import com.intellij.ui.components.JBList;
import jetbrains.mps.workbench.dialogs.project.components.parts.renderers.PathRenderer;
import javax.swing.ListSelectionModel;
import com.intellij.ui.ToolbarDecorator;
import com.intellij.ui.AnActionButtonRunnable;
import com.intellij.ui.AnActionButton;
import jetbrains.mps.ide.ui.filechoosers.treefilechooser.TreeFileChooser;
import jetbrains.mps.project.MPSExtentions;
import jetbrains.mps.ide.vfs.VirtualFileUtils;
import jetbrains.mps.vfs.IFile;
import jetbrains.mps.project.structure.project.ModulePath;
import java.awt.Dimension;
import javax.swing.JPanel;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.uiDesigner.core.GridLayoutManager;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import javax.swing.AbstractListModel;
import java.util.List;
public class ProjectPropertiesComponent extends JBPanel implements Modifiable {
private final StandaloneMPSProject myProject;
private final ProjectProperties myProperties = new ProjectProperties();
private final ProjectPrefsExtraPanel[] myExtraPanels;
public ProjectPropertiesComponent(Project project, ProjectPrefsExtraPanel[] extraPanels) {
super(true);
myProject = (StandaloneMPSProject) project.getComponent(MPSProject.class);
myExtraPanels = (extraPanels != null ? extraPanels : new ProjectPrefsExtraPanel[0]);
myProperties.loadFrom(myProject);
init();
}
public ProjectPropertiesComponent(Project project) {
this(project, Extensions.getExtensions(ProjectPrefsExtraPanel.EP_NAME, project));
}
private Object getGridConstraints(int row, boolean fill) {
if (fill) {
return new GridConstraints(row, 0, 1, 1, GridConstraints.ANCHOR_NORTHWEST, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_GROW | GridConstraints.SIZEPOLICY_CAN_SHRINK, GridConstraints.SIZEPOLICY_CAN_GROW | GridConstraints.SIZEPOLICY_CAN_SHRINK, null, null, null);
}
return new GridConstraints(row, 0, 1, 1, GridConstraints.ANCHOR_NORTHWEST, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_GROW | GridConstraints.SIZEPOLICY_CAN_SHRINK, GridConstraints.SIZEPOLICY_FIXED, null, null, null);
}
private JComponent createProjectModulesList() {
final JBList list = new JBList(new ProjectPropertiesComponent.PathsListModel());
list.setCellRenderer(new PathRenderer());
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
ToolbarDecorator decorator = ToolbarDecorator.createDecorator(list);
decorator.setAddAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
final TreeFileChooser chooser = new TreeFileChooser();
chooser.setExtensionFileFilter(MPSExtentions.DOT_LANGUAGE, MPSExtentions.DOT_SOLUTION, MPSExtentions.DOT_LIBRARY, MPSExtentions.DOT_DEVKIT);
chooser.setInitialFile(VirtualFileUtils.toIFile(myProject.getProject().getBaseDir()));
final IFile file = chooser.showDialog();
if (file == null) {
return;
}
ModulePath path = new ModulePath(file.getPath(), null);
for (ModulePath p : ((ProjectPropertiesComponent.PathsListModel) list.getModel()).getPaths()) {
if (p.getPath().equals(path.getPath())) {
list.setSelectedValue(p, true);
return;
}
}
((ProjectPropertiesComponent.PathsListModel) list.getModel()).addPath(path);
}
}).setRemoveAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
((ProjectPropertiesComponent.PathsListModel) list.getModel()).removePath(list.getSelectedValue());
}
}).disableUpAction().disableDownAction();
decorator.setPreferredSize(new Dimension(500, 150));
JPanel panel = decorator.createPanel();
panel.setBorder(IdeBorderFactory.createTitledBorder("Modules", false));
return panel;
}
@Override
public void init() {
int rowCount = 2 + ((myExtraPanels == null ? 0 : myExtraPanels.length));
int rowIndex = 0;
this.setLayout(new GridLayoutManager(rowCount, 1));
this.setAutoscrolls(false);
this.add(createProjectModulesList(), getGridConstraints(rowIndex++, true));
for (ProjectPrefsExtraPanel extraPanel : myExtraPanels) {
this.add(extraPanel.getComponent(), getGridConstraints(rowIndex++, false));
}
}
@Override
public boolean isModified() {
return !(myProperties.isSame(myProject.getProjectDescriptor())) || Sequence.fromIterable(Sequence.fromArray(myExtraPanels)).any(new IWhereFilter<ProjectPrefsExtraPanel>() {
public boolean accept(ProjectPrefsExtraPanel ep) {
return ep.isModified();
}
});
}
@Override
public void apply() {
myProject.getModelAccess().runWriteAction(new Runnable() {
@Override
public void run() {
myProperties.saveTo(myProject);
}
});
for (ProjectPrefsExtraPanel ep : myExtraPanels) {
ep.apply();
}
}
public void reset() {
myProperties.loadFrom(myProject);
for (ProjectPrefsExtraPanel ep : myExtraPanels) {
ep.reset();
}
}
private class PathsListModel extends AbstractListModel {
public PathsListModel() {
}
@Override
public int getSize() {
return myProperties.getModules().size();
}
@Override
public Object getElementAt(int i) {
return myProperties.getModules().get(i);
}
public List<ModulePath> getPaths() {
return myProperties.getModules();
}
public void addPath(ModulePath path) {
int i = myProperties.add(path);
fireIntervalAdded(this, i, i);
}
public void removePath(Object path) {
int i = myProperties.remove((ModulePath) path);
fireIntervalRemoved(this, i, i);
}
}
}