blob: a27ff1f62d8f4a06b2eb9f85800d1cee970b17ca [file] [log] [blame]
/* ==========================================================================
* Copyright 2006 Mevenide Team
*
* 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 org.jetbrains.idea.maven.project;
import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
import com.intellij.openapi.ui.LabeledComponent;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.DocumentAdapter;
import com.intellij.ui.PanelWithAnchor;
import com.intellij.ui.components.JBLabel;
import com.intellij.util.Alarm;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.utils.MavenUtil;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
public class MavenEnvironmentForm implements PanelWithAnchor {
private JPanel panel;
private LabeledComponent<TextFieldWithBrowseButton> mavenHomeComponent;
private LabeledComponent<TextFieldWithBrowseButton> settingsFileComponent;
private LabeledComponent<TextFieldWithBrowseButton> localRepositoryComponent;
private JCheckBox mavenHomeOverrideCheckBox;
private JCheckBox settingsOverrideCheckBox;
private JCheckBox localRepositoryOverrideCheckBox;
private JBLabel myFakeLabel;
private JComponent anchor;
private final PathOverrider mavenHomeOverrider;
private final PathOverrider userSettingsFileOverrider;
private final PathOverrider localRepositoryOverrider;
private boolean isUpdating = false;
private final Alarm myUpdateAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD);
public MavenEnvironmentForm() {
DocumentAdapter listener = new DocumentAdapter() {
@Override
protected void textChanged(DocumentEvent e) {
UIUtil.invokeLaterIfNeeded(new Runnable() {
@Override
public void run() {
if (isUpdating) return;
if (!panel.isShowing()) return;
myUpdateAlarm.cancelAllRequests();
myUpdateAlarm.addRequest(new Runnable() {
@Override
public void run() {
isUpdating = true;
mavenHomeOverrider.updateDefault();
userSettingsFileOverrider.updateDefault();
localRepositoryOverrider.updateDefault();
isUpdating = false;
}
}, 100);
}
});
}
};
mavenHomeOverrider = new PathOverrider(mavenHomeComponent, mavenHomeOverrideCheckBox, listener, new PathProvider() {
@Nullable
protected File getFile() {
return MavenUtil.resolveMavenHomeDirectory("");
}
});
userSettingsFileOverrider =
new PathOverrider(settingsFileComponent, settingsOverrideCheckBox, listener, new PathProvider() {
@Nullable
protected File getFile() {
return MavenUtil.resolveUserSettingsFile("");
}
});
localRepositoryOverrider =
new PathOverrider(localRepositoryComponent, localRepositoryOverrideCheckBox, listener, new PathProvider() {
@Nullable
protected File getFile() {
return MavenUtil.resolveLocalRepository("",
mavenHomeComponent.getComponent().getText(),
settingsFileComponent.getComponent().getText());
}
});
setAnchor(mavenHomeComponent.getLabel());
}
public boolean isModified(MavenGeneralSettings data) {
MavenGeneralSettings formData = new MavenGeneralSettings();
setData(formData);
return !formData.equals(data);
}
public void setData(MavenGeneralSettings data) {
data.setMavenHome(mavenHomeOverrider.getResult());
data.setUserSettingsFile(userSettingsFileOverrider.getResult());
data.setLocalRepository(localRepositoryOverrider.getResult());
}
public void getData(MavenGeneralSettings data) {
mavenHomeOverrider.reset(data.getMavenHome());
userSettingsFileOverrider.reset(data.getUserSettingsFile());
localRepositoryOverrider.reset(data.getLocalRepository());
}
@NotNull
public String getMavenHome() {
return mavenHomeOverrider.getResult();
}
public JComponent createComponent() {
// all listeners will be removed when dialog is closed
mavenHomeComponent.getComponent().addBrowseFolderListener(ProjectBundle.message("maven.select.maven.home.directory"), "", null,
FileChooserDescriptorFactory.createSingleFolderDescriptor());
settingsFileComponent.getComponent().addBrowseFolderListener(ProjectBundle.message("maven.select.maven.settings.file"), "", null,
FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor());
localRepositoryComponent.getComponent().addBrowseFolderListener(ProjectBundle.message("maven.select.local.repository"), "", null,
FileChooserDescriptorFactory.createSingleFolderDescriptor());
return panel;
}
@Override
public JComponent getAnchor() {
return anchor;
}
@Override
public void setAnchor(JComponent anchor) {
this.anchor = anchor;
mavenHomeComponent.setAnchor(anchor);
settingsFileComponent.setAnchor(anchor);
localRepositoryComponent.setAnchor(anchor);
myFakeLabel.setAnchor(anchor);
}
private static abstract class PathProvider {
public String getPath() {
final File file = getFile();
return file == null ? "" : file.getPath();
}
@Nullable
abstract protected File getFile();
}
private static class PathOverrider {
private final TextFieldWithBrowseButton component;
private final JCheckBox checkBox;
private final PathProvider pathProvider;
private Boolean isOverridden;
private String overrideText;
public PathOverrider(final LabeledComponent<TextFieldWithBrowseButton> component,
final JCheckBox checkBox,
DocumentListener docListener,
PathProvider pathProvider) {
this.component = component.getComponent();
this.component.getTextField().getDocument().addDocumentListener(docListener);
this.checkBox = checkBox;
this.pathProvider = pathProvider;
checkBox.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
update();
}
});
}
private void update() {
final boolean override = checkBox.isSelected();
if (Comparing.equal(isOverridden, override)) return;
isOverridden = override;
component.setEditable(override);
component.setEnabled(override && checkBox.isEnabled());
if (override) {
if (overrideText != null) component.setText(overrideText);
}
else {
if (!StringUtil.isEmptyOrSpaces(component.getText())) overrideText = component.getText();
component.setText(pathProvider.getPath());
}
}
private void updateDefault() {
if (!checkBox.isSelected()) {
component.setText(pathProvider.getPath());
}
}
public void reset(String text) {
isOverridden = null;
checkBox.setSelected(!StringUtil.isEmptyOrSpaces(text));
overrideText = StringUtil.isEmptyOrSpaces(text) ? null : text;
update();
}
public String getResult() {
return checkBox.isSelected() ? component.getText().trim() : "";
}
}
}