blob: 8d7f05cb3dafd3f52f877d54bbda8fb270b4ffb7 [file] [log] [blame]
/*
* Copyright 2000-2009 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.compiler.actions;
import com.intellij.compiler.HelpID;
import com.intellij.compiler.ModuleCompilerUtil;
import com.intellij.compiler.ant.BuildProperties;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.compiler.CompilerBundle;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.MultiLineLabelUI;
import com.intellij.openapi.util.Pair;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Chunk;
import com.intellij.util.ListWithSelection;
import com.intellij.util.ui.Table;
import com.intellij.util.ui.table.ComboBoxTableCellEditor;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* @author Eugene Zhuravlev
* Date: Mar 29, 2004
*/
public class GenerateAntBuildDialog extends DialogWrapper {
private JPanel myPanel;
private JRadioButton myRbGenerateSingleFileBuild;
private JRadioButton myRbGenerateMultipleFilesBuild;
private JCheckBox myCbEnableUIFormsCompilation;
private JRadioButton myRbBackupFiles;
private JRadioButton myRbOverwriteFiles;
private JCheckBox myCbForceTargetJdk;
private JCheckBox myCbInlineRuntimeClasspath;
private JPanel myChunksPanel;
private JCheckBox myGenerateIdeaHomeProperty;
private JTextField myOutputFileNameField;
private final Project myProject;
@NonNls private static final String SINGLE_FILE_PROPERTY = "GenerateAntBuildDialog.generateSingleFile";
@NonNls private static final String UI_FORM_PROPERTY = "GenerateAntBuildDialog.enableUiFormCompile";
@NonNls private static final String FORCE_TARGET_JDK_PROPERTY = "GenerateAntBuildDialog.forceTargetJdk";
@NonNls private static final String BACKUP_FILES_PROPERTY = "GenerateAntBuildDialog.backupFiles";
@NonNls private static final String INLINE_RUNTIME_CLASSPATH_PROPERTY = "GenerateAntBuildDialog.inclineRuntiemClasspath";
@NonNls private static final String GENERATE_IDEA_HOME_PROPERTY = "GenerateAntBuildDialog.generateIdeaHomeProperty";
@NonNls private static final String OUTPUT_FILE_NAME_PROPERTY = "GenerateAntBuildDialog.outputFileNameProperty";
private MyTableModel myTableModel;
private Table myTable;
public GenerateAntBuildDialog(Project project) {
super(project, false);
myProject = project;
setTitle(CompilerBundle.message("generate.ant.build.title"));
init();
loadSettings();
}
private List<Chunk<Module>> getCycleChunks() {
List<Chunk<Module>> chunks =
ModuleCompilerUtil.getSortedModuleChunks(myProject, Arrays.asList(ModuleManager.getInstance(myProject).getModules()));
for (Iterator<Chunk<Module>> it = chunks.iterator(); it.hasNext();) {
final Chunk<Module> chunk = it.next();
if (chunk.getNodes().size() == 1) {
it.remove();
}
}
return chunks;
}
private void loadSettings() {
final PropertiesComponent properties = PropertiesComponent.getInstance(myProject);
if (properties.isValueSet(SINGLE_FILE_PROPERTY)) {
final boolean singleFile = properties.isTrueValue(SINGLE_FILE_PROPERTY);
myRbGenerateSingleFileBuild.setSelected(singleFile);
myRbGenerateMultipleFilesBuild.setSelected(!singleFile);
}
if (properties.isValueSet(UI_FORM_PROPERTY)) {
myCbEnableUIFormsCompilation.setSelected(properties.isTrueValue(UI_FORM_PROPERTY));
}
if (properties.isValueSet(FORCE_TARGET_JDK_PROPERTY)) {
myCbForceTargetJdk.setSelected(properties.isTrueValue(FORCE_TARGET_JDK_PROPERTY));
}
if (properties.isValueSet(BACKUP_FILES_PROPERTY)) {
final boolean backup = properties.isTrueValue(BACKUP_FILES_PROPERTY);
myRbBackupFiles.setSelected(backup);
myRbOverwriteFiles.setSelected(!backup);
}
if (properties.isValueSet(INLINE_RUNTIME_CLASSPATH_PROPERTY)) {
myCbInlineRuntimeClasspath.setSelected(properties.isTrueValue(INLINE_RUNTIME_CLASSPATH_PROPERTY));
}
if (properties.isValueSet(GENERATE_IDEA_HOME_PROPERTY)) {
myGenerateIdeaHomeProperty.setSelected(properties.isTrueValue(GENERATE_IDEA_HOME_PROPERTY));
}
if (properties.isValueSet(OUTPUT_FILE_NAME_PROPERTY)) {
myOutputFileNameField.setText(properties.getValue(OUTPUT_FILE_NAME_PROPERTY));
}
else {
myOutputFileNameField.setText(BuildProperties.getProjectBuildFileName(myProject));
}
}
private void saveSettings() {
final PropertiesComponent properties = PropertiesComponent.getInstance(myProject);
properties.setValue(SINGLE_FILE_PROPERTY, Boolean.toString(myRbGenerateSingleFileBuild.isSelected()));
properties.setValue(UI_FORM_PROPERTY, Boolean.toString(myCbEnableUIFormsCompilation.isSelected()));
properties.setValue(FORCE_TARGET_JDK_PROPERTY, Boolean.toString(myCbForceTargetJdk.isSelected()));
properties.setValue(BACKUP_FILES_PROPERTY, Boolean.toString(myRbBackupFiles.isSelected()));
properties.setValue(INLINE_RUNTIME_CLASSPATH_PROPERTY, Boolean.toString(myCbInlineRuntimeClasspath.isSelected()));
properties.setValue(GENERATE_IDEA_HOME_PROPERTY, Boolean.toString(myGenerateIdeaHomeProperty.isSelected()));
final String outputFileName = getOutputFileName();
if (outputFileName.length() > 0) {
properties.setValue(OUTPUT_FILE_NAME_PROPERTY, outputFileName);
}
else {
properties.unsetValue(OUTPUT_FILE_NAME_PROPERTY);
}
}
public void dispose() {
saveSettings();
super.dispose();
}
protected JComponent createCenterPanel() {
final ButtonGroup group = new ButtonGroup();
group.add(myRbGenerateMultipleFilesBuild);
group.add(myRbGenerateSingleFileBuild);
final ButtonGroup group1 = new ButtonGroup();
group1.add(myRbBackupFiles);
group1.add(myRbOverwriteFiles);
myRbGenerateMultipleFilesBuild.setSelected(true);
myRbBackupFiles.setSelected(true);
myCbEnableUIFormsCompilation.setSelected(true);
myCbForceTargetJdk.setSelected(true);
myCbInlineRuntimeClasspath.setSelected(false);
initChunksPanel();
return myPanel;
}
private void initChunksPanel() {
List<Chunk<Module>> chunks = getCycleChunks();
if (chunks.isEmpty()) {
return;
}
myChunksPanel.setLayout(new BorderLayout());
myChunksPanel.setBorder(
IdeBorderFactory.createTitledBorder(CompilerBundle.message("generate.ant.build.dialog.cyclic.modules.table.title"),
true));
JLabel textLabel = new JLabel(CompilerBundle.message("generate.ant.build.dialog.cyclic.modules.table.description"));
textLabel.setUI(new MultiLineLabelUI());
textLabel.setBorder(IdeBorderFactory.createEmptyBorder(4, 4, 6, 4));
myChunksPanel.add(textLabel, BorderLayout.NORTH);
myTableModel = new MyTableModel(chunks);
myTable = new Table(myTableModel);
final MyTableCellRenderer cellRenderer = new MyTableCellRenderer();
final TableColumn nameColumn = myTable.getColumnModel().getColumn(MyTableModel.NAME_COLUMN);
nameColumn.setCellEditor(ComboBoxTableCellEditor.INSTANCE);
nameColumn.setCellRenderer(cellRenderer);
final TableColumn labelColumn = myTable.getColumnModel().getColumn(MyTableModel.NUMBER_COLUMN);
labelColumn.setCellRenderer(cellRenderer);
final Dimension preferredSize = new Dimension(myTable.getPreferredSize());
preferredSize.height = (myTableModel.getRowCount() + 2) * myTable.getRowHeight() + myTable.getTableHeader().getHeight();
final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myTable);
scrollPane.setPreferredSize(preferredSize);
myChunksPanel.add(scrollPane, BorderLayout.CENTER);
}
protected void doOKAction() {
if (myTable != null) {
TableCellEditor cellEditor = myTable.getCellEditor();
if (cellEditor != null) {
cellEditor.stopCellEditing();
}
}
super.doOKAction();
}
public boolean isGenerateSingleFileBuild() {
return myRbGenerateSingleFileBuild.isSelected();
}
public boolean isFormsCompilationEnabled() {
return myCbEnableUIFormsCompilation.isSelected();
}
public boolean isForceTargetJdk() {
return myCbForceTargetJdk.isSelected();
}
public boolean isBackupFiles() {
return myRbBackupFiles.isSelected();
}
public boolean isRuntimeClasspathInlined() {
return myCbInlineRuntimeClasspath.isSelected();
}
public String[] getRepresentativeModuleNames() {
return myTableModel != null ? myTableModel.getModuleRepresentatives() : ArrayUtil.EMPTY_STRING_ARRAY;
}
/**
* @return true if user has selected to generate IDEA_HOME property
*/
public boolean isIdeaHomeGenerated() {
return myGenerateIdeaHomeProperty.isSelected();
}
public String getOutputFileName() {
return myOutputFileNameField.getText().trim();
}
private static class MyTableModel extends AbstractTableModel {
private static final int NUMBER_COLUMN = 0;
private static final int NAME_COLUMN = 1;
private final List<Pair<String, ListWithSelection>> myItems = new ArrayList<Pair<String, ListWithSelection>>();
private MyTableModel(List<Chunk<Module>> chunks) {
for (final Chunk<Module> chunk : chunks) {
final ListWithSelection<String> item = new ListWithSelection<String>();
for (final Module module : chunk.getNodes()) {
item.add(module.getName());
}
item.selectFirst();
myItems.add(new Pair<String, ListWithSelection>(createCycleName(chunk), item));
}
}
private static String createCycleName(Chunk<Module> chunk) {
final StringBuilder buf = new StringBuilder();
for (Module module : chunk.getNodes()) {
if (buf.length() > 0) {
buf.append(", ");
}
buf.append(module.getName());
}
buf.insert(0, "[");
buf.append("]");
return buf.toString();
}
public String[] getModuleRepresentatives() {
final String[] names = new String[myItems.size()];
int index = 0;
for (final Pair<String, ListWithSelection> pair : myItems) {
names[index++] = (String)pair.getSecond().getSelection();
}
return names;
}
public int getColumnCount() {
return 2;
}
public int getRowCount() {
return myItems.size();
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 1;
}
public Class getColumnClass(int columnIndex) {
switch (columnIndex) {
case NUMBER_COLUMN:
return String.class;
case NAME_COLUMN:
return ListWithSelection.class;
default:
return super.getColumnClass(columnIndex);
}
}
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case NUMBER_COLUMN:
return myItems.get(rowIndex).getFirst();
case NAME_COLUMN:
return myItems.get(rowIndex).getSecond();
default:
return null;
}
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (columnIndex == NAME_COLUMN) {
myItems.get(rowIndex).getSecond().select(aValue);
}
}
public String getColumnName(int columnIndex) {
switch (columnIndex) {
case NUMBER_COLUMN:
return CompilerBundle.message("generate.ant.build.dialog.cyclic.modules.table.number.column.header");
case NAME_COLUMN:
return CompilerBundle.message("generate.ant.build.dialog.cyclic.modules.table.name.column.header");
}
return super.getColumnName(columnIndex);
}
}
private static class MyTableCellRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
if (value instanceof ListWithSelection) {
value = ((ListWithSelection)value).getSelection();
}
final JLabel component = (JLabel)super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
component.setHorizontalAlignment(SwingConstants.CENTER);
return component;
}
}
@NotNull
protected Action[] createActions() {
return new Action[]{getOKAction(), getCancelAction(), getHelpAction()};
}
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp(HelpID.GENERATE_ANT_BUILD);
}
}