/*
* Copyright 2003-2012 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.idea.core.facet;
import com.intellij.ide.util.BrowseFilesListener;
import com.intellij.ide.util.frameworkSupport.FrameworkSupportConfigurableBase;
import com.intellij.ide.util.frameworkSupport.FrameworkSupportModel;
import com.intellij.ide.util.frameworkSupport.FrameworkSupportProviderBase;
import com.intellij.ide.util.frameworkSupport.FrameworkVersion;
import com.intellij.ide.util.newProjectWizard.impl.FrameworkSupportModelBase;
import com.intellij.ide.util.projectWizard.JavaModuleBuilder;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.FieldPanel;
import com.intellij.uiDesigner.core.GridConstraints;
import com.intellij.uiDesigner.core.GridLayoutManager;
import com.intellij.util.ui.UIUtil;
import jetbrains.mps.idea.core.MPSBundle;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.List;
/**
* User: shatalin
* Date: 2/11/12
*/
public class MPSFrameworkSupportConfigurable extends FrameworkSupportConfigurableBase {
private JTextField myModelDirectoryName;
@Override
public JComponent getComponent() {
JComponent versionComponent = super.getComponent();
if (versionComponent != null) {
JPanel panel = new JPanel();
panel.setLayout(new GridLayoutManager(2, 1));
panel.add(versionComponent,
new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_NORTHWEST, GridConstraints.FILL_HORIZONTAL,
GridConstraints.SIZEPOLICY_CAN_GROW | GridConstraints.SIZEPOLICY_CAN_SHRINK, GridConstraints.SIZEPOLICY_FIXED, null, null, null));
panel.add(createUIComponents(),
new GridConstraints(1, 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 panel;
}
return createUIComponents();
}
public MPSFrameworkSupportConfigurable(FrameworkSupportProviderBase frameworkSupportProvider, FrameworkSupportModel model, @NotNull List<FrameworkVersion> versions, @Nullable String versionLabelText) {
super(frameworkSupportProvider, model, versions, versionLabelText);
}
private JPanel createUIComponents() {
JPanel panel = new JPanel(new GridLayoutManager(3, 1));
JTextPane textPane = new JTextPane();
textPane.setEditable(false);
textPane.setText(MPSBundle.message("framework.support.configurable.specify.model.root.prompt"));
textPane.setBackground(UIUtil.getLabelBackground());
GridConstraints gridConstraints = new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_NORTHWEST, GridConstraints.FILL_HORIZONTAL,
GridConstraints.SIZEPOLICY_CAN_GROW | GridConstraints.SIZEPOLICY_CAN_SHRINK, GridConstraints.SIZEPOLICY_FIXED, null, null, null);
panel.add(textPane, gridConstraints);
final JLabel srcPathLabel = new JLabel(MPSBundle.message("framework.support.configurable.enter.relative.path.to.model", File.separator));
gridConstraints.setRow(1);
panel.add(srcPathLabel, gridConstraints);
myModelDirectoryName = new JTextField(getDefaultModelDirectoryName());
final FileChooserDescriptor chooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor();
chooserDescriptor.withTreeRootVisible(true);
final FieldPanel fieldPanel = new FieldPanel(myModelDirectoryName, null, null, new BrowsePathListener(myModelDirectoryName, chooserDescriptor), null);
fieldPanel.getFieldLabel().setFont(UIUtil.getLabelFont().deriveFont(Font.BOLD));
gridConstraints.setRow(2);
panel.add(fieldPanel, gridConstraints);
return panel;
}
@NonNls
private String getDefaultModelDirectoryName() {
if(myFrameworkSupportModel.getModuleBuilder() instanceof JavaModuleBuilder) {
JavaModuleBuilder moduleBuilder = (JavaModuleBuilder)myFrameworkSupportModel.getModuleBuilder();
List<Pair<String, String>> sourcePaths = moduleBuilder.getSourcePaths();
if (!sourcePaths.isEmpty()) {
// first source path is: moduleBuilder.getContentEntryPath() + File.separator + "src"
return sourcePaths.get(0).first.replace(moduleBuilder.getContentEntryPath() + File.separator, "");
}
}
return "models";
}
public String getModelDirectoryPath() {
final String contentEntryPath = getContentRootPath();
final String dirName = myModelDirectoryName.getText().trim().replace(File.separatorChar, '/');
if (contentEntryPath != null) {
return dirName.length() > 0 ? contentEntryPath + "/" + dirName : contentEntryPath;
}
return null;
}
private String getContentRootPath() {
return ((FrameworkSupportModelBase) myFrameworkSupportModel).getBaseDirectoryForLibrariesPath();
}
// Originally was copied from: com.intellij.ide.util.newProjectWizard.SourcePathsStep.BrowsePathListener
private class BrowsePathListener extends BrowseFilesListener {
private final JTextField myField;
public BrowsePathListener(JTextField textField, final FileChooserDescriptor chooserDescriptor) {
super(textField, MPSBundle.message("framework.support.configurable.path.browser.title"), "", chooserDescriptor);
myField = textField;
}
@Override
protected VirtualFile getFileToSelect() {
VirtualFile contentEntryDir = getContentEntryDir();
assert contentEntryDir != null;
return contentEntryDir;
}
@Nullable
private VirtualFile getContentEntryDir() {
final String contentEntryPath = getContentRootPath();
if (contentEntryPath != null) {
return ApplicationManager.getApplication().runWriteAction(new Computable<VirtualFile>() {
public VirtualFile compute() {
return LocalFileSystem.getInstance().refreshAndFindFileByPath(contentEntryPath);
}
});
}
return null;
}
public void actionPerformed(ActionEvent e) {
VirtualFile contentEntryDir = getContentEntryDir();
if (contentEntryDir == null) {
return;
}
super.actionPerformed(e);
if (!SystemInfo.isMac) {
updateFieldText(myField.getText(), contentEntryDir);
}
}
private void updateFieldText(String path, @NotNull VirtualFile contentEntryDir) {
final String fullPath = path.trim().replace(File.separatorChar, '/');
final VirtualFile fileByPath = LocalFileSystem.getInstance().findFileByPath(fullPath);
assert fileByPath != null;
myField.setText(VfsUtilCore.getRelativePath(fileByPath, contentEntryDir, File.separatorChar));
}
@Override
protected void doSetText(@NotNull String path) {
if (SystemInfo.isMac) {
VirtualFile contentEntryDir = getContentEntryDir();
assert contentEntryDir != null;
updateFieldText(path, contentEntryDir);
} else {
super.doSetText(path);
}
}
}
}