blob: 20e37b1345ed72abfb7c612b44cef31d13f6896c [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* 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.android.tools.idea.gradle.eclipse;
import com.google.common.collect.Maps;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.projectImport.ProjectImportWizardStep;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.table.JBTable;
import com.intellij.util.ui.EditableModel;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
import java.io.File;
import java.util.Arrays;
import java.util.Map;
class AdtWorkspaceForm extends ProjectImportWizardStep {
private JBTable myPathMapTable;
private TextFieldWithBrowseButton myWorkspaceField;
private JPanel myPanel;
private Map<String, File> myPathMap = Maps.newHashMap();
private boolean myIgnore;
AdtWorkspaceForm(WizardContext context) {
super(context);
myPathMapTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
myPathMapTable.setStriped(true);
myPathMapTable.setDefaultRenderer(File.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable var1, Object var2, boolean var3, boolean var4, int var5, int var6) {
Component component = super.getTableCellRendererComponent(var1, var2, var3, var4, var5, var6);
File file = (File)var2;
if (file == null || file.getPath().trim().isEmpty()) {
super.setValue("<click to edit>");
}
return component;
}
});
JTextField textField = new JTextField();
DefaultCellEditor cellEditor = new DefaultCellEditor(textField);
cellEditor.setClickCountToStart(1);
myPathMapTable.setDefaultEditor(String.class, cellEditor);
// TODO: Listen for invoking the button
myWorkspaceField.addBrowseFolderListener("Select Eclipse Workspace", null, null,
FileChooserDescriptorFactory.createSingleFolderDescriptor());
myWorkspaceField.getTextField().getDocument().addDocumentListener(new DocumentAdapter() {
@Override
protected void textChanged(DocumentEvent e) {
File workspace = new File(myWorkspaceField.getText());
boolean workspaceValid = GradleImport.isEclipseWorkspaceDir(workspace);
//setBackground(myAndroidHomeLocation, workspaceValid);
//myAndroidHomeError.setText(workspaceValid ? " " : "Please choose a valid Eclipse workspace directory.");
if (workspaceValid) {
AdtImportBuilder builder = AdtImportBuilder.getBuilder(getWizardContext());
if (builder != null) {
GradleImport importer = builder.getImporter();
if (importer != null) {
importer.setEclipseWorkspace(workspace);
builder.readProjects();
updateStep();
}
}
}
}
});
}
@Override
public JComponent getComponent() {
return myPanel;
}
@Override
public void updateStep() {
if (myIgnore) {
return;
}
super.updateStep();
GradleImport importer = AdtImportProvider.getImporter(getWizardContext());
if (importer != null) {
File eclipseWorkspace = importer.getEclipseWorkspace();
if (eclipseWorkspace != null && eclipseWorkspace.exists()) {
try {
myIgnore = true;
myWorkspaceField.setText(eclipseWorkspace.getPath());
} finally {
myIgnore = false;
}
}
Map<String,File> map = importer.getPathMap();
for (Map.Entry<String,File> entry : map.entrySet()) {
if (myPathMap.get(entry.getKey()) == null) {
myPathMap.put(entry.getKey(), entry.getValue());
}
}
PathMapModel model = new PathMapModel(myPathMap);
myPathMapTable.setModel(model);
}
}
@Override
public void updateDataModel() {
AdtImportBuilder builder = AdtImportBuilder.getBuilder(getWizardContext());
if (builder != null) {
GradleImport importer = builder.getImporter();
if (importer != null) {
File workspace = new File(myWorkspaceField.getText().trim());
if (workspace.exists()) {
importer.setEclipseWorkspace(workspace);
}
importer.getPathMap().putAll(myPathMap);
}
// Refresh read state in case reading the workspace paths updates the set of available warnings
builder.readProjects();
}
}
@Override
public boolean isStepVisible() {
GradleImport importer = AdtImportProvider.getImporter(getWizardContext());
return importer != null && !importer.getPathMap().isEmpty();
}
@Override
public boolean validate() throws ConfigurationException {
for (Map.Entry<String,File> entry : myPathMap.entrySet()) {
String path = entry.getKey();
File file = entry.getValue();
if (file == null || file.getPath().trim().isEmpty()) {
throw new ConfigurationException("Enter a value for workspace path " + path);
} else if (!file.exists()) {
throw new ConfigurationException(file.getPath() + " does not exist");
}
}
return super.validate();
}
@Override
public String getName() {
return "Eclipse Workspace Location";
}
@Override
public JComponent getPreferredFocusedComponent() {
return myWorkspaceField.getTextField();
}
private static final int WORKSPACE_PATH_COLUMN = 0;
private static final int FILE_COLUMN = 1;
private class PathMapModel extends AbstractTableModel implements EditableModel {
private Map<String, File> myPathMap;
private String[] myKeys;
public PathMapModel(Map<String, File> map) {
myKeys = map.keySet().toArray(new String[map.size()]);
Arrays.sort(myKeys);
myPathMap = map;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
return myKeys.length;
}
@Override
public Object getValueAt(int row, int col) {
String key = myKeys[row];
switch (col) {
case WORKSPACE_PATH_COLUMN:
return key;
case FILE_COLUMN:
default:
return myPathMap.get(key);
}
}
@Override
public String getColumnName(int column) {
switch (column) {
case WORKSPACE_PATH_COLUMN:
return "Workspace Path";
case FILE_COLUMN:
return "Actual Path";
default:
assert false : column;
return "";
}
}
@Override
public Class<?> getColumnClass(int col) {
switch (col) {
case FILE_COLUMN:
return File.class;
case WORKSPACE_PATH_COLUMN:
default:
return String.class;
}
}
@Override
public boolean isCellEditable(int row, int col) {
return col == FILE_COLUMN;
}
@Override
public void setValueAt(Object aValue , int row, int col) {
String string = aValue == null ? "" : aValue.toString();
myPathMap.put(myKeys[row], !string.isEmpty() ? new File(string) : null);
AdtImportBuilder builder = AdtImportBuilder.getBuilder(getWizardContext());
if (builder != null) {
builder.readProjects();
}
}
@Override
public void addRow() {
throw new UnsupportedOperationException();
}
@Override
public void removeRow(int index) {
throw new UnsupportedOperationException();
}
@Override
public boolean canExchangeRows(int oldIndex, int newIndex) {
return true;
}
@Override
public void exchangeRows(int oldIndex, int newIndex) {
String temp = myKeys[oldIndex];
myKeys[oldIndex] = myKeys[newIndex];
myKeys[newIndex] = temp;
}
}
}