/*
* Copyright 2003-2011 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.ui;
import com.intellij.facet.ui.FacetEditorContext;
import com.intellij.ide.util.BrowseFilesListener;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.fileChooser.FileChooserFactory;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.SourceFolder;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.FieldPanel;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.InsertPathAction;
import jetbrains.mps.idea.core.MPSBundle;
import jetbrains.mps.idea.core.facet.MPSConfigurationBean;
import jetbrains.mps.idea.core.ui.SModuleConfigurationTab;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MPSFacetPathsTab implements SModuleConfigurationTab {
private JPanel myRootPanel;
private JRadioButton myUseTransientOutputFolder;
private JRadioButton myUseModuleSourceFolderRadioButton;
private JRadioButton myUseCustomFolderRadioButton;
private JComboBox myModuleReferenceCombo;
private JLabel mySourceFolderLabel;
private JLabel myOutputFolderLabel;
private CommitableFieldPanel myFieldPanel;
private JPanel myGeneratorOutputPathPanel;
private FacetEditorContext myContext;
public MPSFacetPathsTab(FacetEditorContext context) {
ActionListener radioButtonHandler = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myModuleReferenceCombo.setEnabled(isUseModuleSourceFolder());
mySourceFolderLabel.setEnabled(isUseModuleSourceFolder());
myFieldPanel.setEnabled(!isUseModuleSourceFolder() && !isUseTransientOutputFolder());
myOutputFolderLabel.setEnabled(!isUseModuleSourceFolder() && !isUseTransientOutputFolder());
}
};
myUseTransientOutputFolder.addActionListener(radioButtonHandler);
myUseModuleSourceFolderRadioButton.addActionListener(radioButtonHandler);
myUseCustomFolderRadioButton.addActionListener(radioButtonHandler);
myContext = context;
}
private boolean isUseTransientOutputFolder() {
return myUseTransientOutputFolder.isSelected();
}
private boolean isUseModuleSourceFolder() {
return myUseModuleSourceFolderRadioButton.isSelected();
}
private String getGeneratorOutputPath() {
return isUseModuleSourceFolder() && myModuleReferenceCombo.getItemCount() > 0 ? (String) myModuleReferenceCombo.getSelectedItem() : myFieldPanel.getText();
}
public JPanel getRootPanel() {
return myRootPanel;
}
public void reset(MPSConfigurationBean data) {
if (data.isUseTransientOutputFolder()) {
myUseTransientOutputFolder.doClick();
} else if (data.isUseModuleSourceFolder()) {
myUseModuleSourceFolderRadioButton.doClick();
} else {
myUseCustomFolderRadioButton.doClick();
}
myFieldPanel.setText(data.getGeneratorOutputPath());
}
public void apply(MPSConfigurationBean data) {
data.setUseTransientOutputFolder(isUseTransientOutputFolder());
data.setUseModuleSourceFolder(isUseModuleSourceFolder());
data.setGeneratorOutputPath(getGeneratorOutputPath());
}
public boolean isModified(MPSConfigurationBean data) {
if (data.isUseTransientOutputFolder() != isUseTransientOutputFolder()) {
return true;
}
if (data.isUseModuleSourceFolder() != isUseModuleSourceFolder()) {
return true;
}
if (!data.getGeneratorOutputPath().equals(getGeneratorOutputPath())) {
return true;
}
return false;
}
public void onTabEntering() {
String oldSelection = null;
if (isUseModuleSourceFolder()) {
oldSelection = myModuleReferenceCombo.getItemCount() == 0 ? myFieldPanel.getText() : (String) myModuleReferenceCombo.getSelectedItem();
}
boolean hasOldItem = false;
myModuleReferenceCombo.removeAllItems();
for (ContentEntry entry : myContext.getRootModel().getContentEntries()) {
for (SourceFolder sourceFolder : entry.getSourceFolders()) {
if (sourceFolder.getFile() == null) {
continue;
}
String path = sourceFolder.getFile().getPath();
myModuleReferenceCombo.addItem(path);
if (path.equals(oldSelection)) {
hasOldItem = true;
}
}
}
limitWidth(myModuleReferenceCombo);
if (oldSelection != null) {
if (hasOldItem) {
myModuleReferenceCombo.setSelectedItem(oldSelection);
} else {
myUseCustomFolderRadioButton.doClick();
myFieldPanel.setText(oldSelection);
}
}
}
private void limitWidth(JComponent component) {
Dimension preferredSize = component.getPreferredSize();
if (preferredSize.getWidth() > 250) {
preferredSize.setSize(250, preferredSize.getHeight());
component.setPreferredSize(preferredSize);
}
}
private void createUIComponents() {
initGeneratorOutputPathPanel();
initFieldPanel();
}
private void initFieldPanel() {
final JTextField textField = new JTextField();
final FileChooserDescriptor outputPathsChooserDescriptor = FileChooserDescriptorFactory.createSingleFolderDescriptor();
outputPathsChooserDescriptor.setHideIgnored(false);
InsertPathAction.addTo(textField, outputPathsChooserDescriptor);
FileChooserFactory.getInstance().installFileCompletion(textField, outputPathsChooserDescriptor, true, null);
final Runnable commitRunnable = new Runnable() {
public void run() {
// if (!getModel().isWritable()) {
// return;
// }
// final String path = textField.getText().trim();
// if (path.length() == 0) {
// commitPathRunnable.saveUrl(null);
// }
// else {
// // should set only absolute paths
// String canonicalPath;
// try {
// canonicalPath = FileUtil.resolveShortWindowsName(path);
// }
// catch (IOException e) {
// canonicalPath = path;
// }
// commitPathRunnable.saveUrl(VfsUtil.pathToUrl(FileUtil.toSystemIndependentName(canonicalPath)));
// }
}
};
textField.getDocument().addDocumentListener(new DocumentAdapter() {
protected void textChanged(DocumentEvent e) {
commitRunnable.run();
}
});
myFieldPanel = new CommitableFieldPanel(textField, null, null, new BrowseFilesListener(textField, MPSBundle.message("facet.paths.tab.generator.output.select.generator.output.folder"), "", outputPathsChooserDescriptor) {
public void actionPerformed(ActionEvent e) {
super.actionPerformed(e);
commitRunnable.run();
}
}, null, commitRunnable);
}
private void initGeneratorOutputPathPanel() {
myGeneratorOutputPathPanel = new JPanel();
myGeneratorOutputPathPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4), IdeBorderFactory.createTitledBorder(MPSBundle.message("facet.paths.tab.generator.output.title"))));
}
public static class CommitableFieldPanel extends FieldPanel {
private final Runnable myCommitRunnable;
public CommitableFieldPanel(final JTextField textField,
String labelText,
final String viewerDialogTitle,
ActionListener browseButtonActionListener,
final Runnable documentListener,
final Runnable commitPathRunnable) {
super(textField, labelText, viewerDialogTitle, browseButtonActionListener, documentListener);
myCommitRunnable = commitPathRunnable;
}
public void commit() {
myCommitRunnable.run();
}
}
}