blob: ad58d519b7c613e35a7f6bbd5d7351a3ad1c84a8 [file] [log] [blame]
/*
* Copyright 2000-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 com.intellij.packaging.impl.ui.properties;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packaging.impl.elements.CompositeElementWithManifest;
import com.intellij.packaging.impl.elements.ManifestFileUtil;
import com.intellij.packaging.ui.ArtifactEditorContext;
import com.intellij.packaging.ui.ManifestFileConfiguration;
import com.intellij.packaging.ui.PackagingElementPropertiesPanel;
import com.intellij.ui.DocumentAdapter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
/**
* @author nik
*/
public abstract class ElementWithManifestPropertiesPanel<E extends CompositeElementWithManifest<?>> extends PackagingElementPropertiesPanel {
private final E myElement;
private final ArtifactEditorContext myContext;
private JPanel myMainPanel;
private TextFieldWithBrowseButton myMainClassField;
private TextFieldWithBrowseButton myClasspathField;
private JLabel myTitleLabel;
private JButton myCreateManifestButton;
private JButton myUseExistingManifestButton;
private JPanel myPropertiesPanel;
private JTextField myManifestPathField;
private JLabel myManifestNotFoundLabel;
private ManifestFileConfiguration myManifestFileConfiguration;
public ElementWithManifestPropertiesPanel(E element, final ArtifactEditorContext context) {
myElement = element;
myContext = context;
ManifestFileUtil.setupMainClassField(context.getProject(), myMainClassField);
myClasspathField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Messages.showTextAreaDialog(myClasspathField.getTextField(), "Edit Classpath", "classpath-attribute-editor");
}
});
myClasspathField.getTextField().getDocument().addDocumentListener(new DocumentAdapter() {
@Override
protected void textChanged(DocumentEvent e) {
myContext.queueValidation();
}
});
myUseExistingManifestButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
chooseManifest();
}
});
myCreateManifestButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
createManifest();
}
});
}
private void createManifest() {
final VirtualFile file = ManifestFileUtil.showDialogAndCreateManifest(myContext, myElement);
if (file == null) {
return;
}
ManifestFileUtil.addManifestFileToLayout(file.getPath(), myContext, myElement);
updateManifest();
myContext.getThisArtifactEditor().updateLayoutTree();
}
private void chooseManifest() {
final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false) {
@Override
public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) {
return super.isFileVisible(file, showHiddenFiles) && (file.isDirectory() ||
file.getName().equalsIgnoreCase(ManifestFileUtil.MANIFEST_FILE_NAME));
}
};
descriptor.setTitle("Specify Path to MANIFEST.MF file");
final VirtualFile file = FileChooser.chooseFile(descriptor, myContext.getProject(), null);
if (file == null) return;
ManifestFileUtil.addManifestFileToLayout(file.getPath(), myContext, myElement);
updateManifest();
myContext.getThisArtifactEditor().updateLayoutTree();
}
private void updateManifest() {
myManifestFileConfiguration = myContext.getManifestFile(myElement, myContext.getArtifactType());
final String card;
if (myManifestFileConfiguration != null) {
card = "properties";
myManifestPathField.setText(FileUtil.toSystemDependentName(myManifestFileConfiguration.getManifestFilePath()));
myMainClassField.setText(StringUtil.notNullize(myManifestFileConfiguration.getMainClass()));
myMainClassField.setEnabled(myManifestFileConfiguration.isWritable());
myClasspathField.setText(StringUtil.join(myManifestFileConfiguration.getClasspath(), " "));
myClasspathField.setEnabled(myManifestFileConfiguration.isWritable());
}
else {
card = "buttons";
myManifestPathField.setText("");
}
((CardLayout)myPropertiesPanel.getLayout()).show(myPropertiesPanel, card);
}
public void reset() {
myTitleLabel.setText("'" + myElement.getName() + "' manifest properties:");
myManifestNotFoundLabel.setText("META-INF/MANIFEST.MF file not found in '" + myElement.getName() + "'");
updateManifest();
}
public boolean isModified() {
return myManifestFileConfiguration != null && (!myManifestFileConfiguration.getClasspath().equals(getConfiguredClasspath())
|| !Comparing.equal(myManifestFileConfiguration.getMainClass(), getConfiguredMainClass())
|| !Comparing.equal(myManifestFileConfiguration.getManifestFilePath(), getConfiguredManifestPath()));
}
@Nullable
private String getConfiguredManifestPath() {
final String path = myManifestPathField.getText();
return path.length() != 0 ? FileUtil.toSystemIndependentName(path) : null;
}
@Override
public void apply() {
if (myManifestFileConfiguration != null) {
myManifestFileConfiguration.setMainClass(getConfiguredMainClass());
myManifestFileConfiguration.setClasspath(getConfiguredClasspath());
myManifestFileConfiguration.setManifestFilePath(getConfiguredManifestPath());
}
}
private List<String> getConfiguredClasspath() {
return StringUtil.split(myClasspathField.getText(), " ");
}
@NotNull
public JComponent createComponent() {
return myMainPanel;
}
@Nullable
private String getConfiguredMainClass() {
final String className = myMainClassField.getText();
return className.length() != 0 ? className : null;
}
}