blob: 0a66ab726d41f2ae0c2fa491a0d1056b8b163036 [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 org.zmlx.hg4idea.ui;
import com.intellij.openapi.fileChooser.FileChooser;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.vcsUtil.VcsUtil;
import org.jetbrains.annotations.Nullable;
import org.zmlx.hg4idea.HgVcsMessages;
import org.zmlx.hg4idea.util.HgUtil;
import javax.swing.*;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* The HgInitDialog appears when user wants to create new Mercurial repository, in response to the
* {@link org.zmlx.hg4idea.action.HgInit} action.
* It provides two options - create repository for the whole project or select a directory for the repository.
* Also if the project directory already is a mercurial root, then no options are provided.
* Instead a file chooser appears to select directory for the repository.
*
* @see org.zmlx.hg4idea.action.HgInit
* @author Kirill Likhodedov
*/
public class HgInitDialog extends DialogWrapper {
private JPanel contentPane;
private JRadioButton myCreateRepositoryForTheRadioButton;
private JRadioButton mySelectWhereToCreateRadioButton;
private TextFieldWithBrowseButton myTextFieldBrowser;
@Nullable private final Project myProject;
private final boolean myShowDialog; // basing on this field, show options or invoke file chooser at once
private final FileChooserDescriptor myFileDescriptor;
private VirtualFile mySelectedDir;
public HgInitDialog(@Nullable Project project) {
super(project);
myProject = project;
// a file chooser instead of dialog will be shown immediately if there is no current project or if current project is already an hg root
myShowDialog = (myProject != null && (! myProject.isDefault()) && !HgUtil.isHgRoot(myProject.getBaseDir()));
myFileDescriptor = new FileChooserDescriptor(false, true, false, false, false, false) {
public void validateSelectedFiles(VirtualFile[] files) throws Exception {
if (HgUtil.isHgRoot(files[0])) {
throw new ConfigurationException(HgVcsMessages.message("hg4idea.init.this.is.hg.root", files[0].getPresentableUrl()));
}
updateEverything();
}
};
myFileDescriptor.setHideIgnored(false);
init();
}
@Override
protected void init() {
super.init();
setTitle(HgVcsMessages.message("hg4idea.init.dialog.title"));
if (myProject != null && (! myProject.isDefault())) {
mySelectedDir = myProject.getBaseDir();
}
mySelectWhereToCreateRadioButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myTextFieldBrowser.setEnabled(true);
updateEverything();
}
});
myCreateRepositoryForTheRadioButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
myTextFieldBrowser.setEnabled(false);
updateEverything();
}
});
myTextFieldBrowser.getTextField().addCaretListener(new CaretListener() {
public void caretUpdate(CaretEvent e) {
updateEverything();
}
});
myTextFieldBrowser.addBrowseFolderListener(HgVcsMessages.message("hg4idea.init.destination.directory.title"),
HgVcsMessages.message("hg4idea.init.destination.directory.description"),
myProject, myFileDescriptor);
}
/**
* Show the dialog OR show a FileChooser to select target directory.
*/
@Override
public void show() {
if (myShowDialog) {
super.show();
}
else {
mySelectedDir = FileChooser.chooseFile(myFileDescriptor, myProject, null);
}
}
@Override
public boolean isOK() {
return myShowDialog ? super.isOK() : mySelectedDir != null;
}
@Override
protected String getHelpId() {
return "reference.mercurial.create.mercurial.repository";
}
@Nullable
public VirtualFile getSelectedFolder() {
return mySelectedDir;
}
@Override
protected JComponent createCenterPanel() {
return contentPane;
}
/**
* Based on the selected option and entered path to the target directory,
* enable/disable the 'OK' button, show error text and update mySelectedDir.
*/
private void updateEverything() {
if (myShowDialog && myCreateRepositoryForTheRadioButton.isSelected()) {
enableOKAction();
mySelectedDir = myProject.getBaseDir();
} else {
final VirtualFile vf = VcsUtil.getVirtualFile(myTextFieldBrowser.getText());
if (vf == null) {
disableOKAction();
mySelectedDir = null;
return;
}
vf.refresh(false, false);
if (vf.exists() && vf.isValid() && vf.isDirectory()) {
enableOKAction();
mySelectedDir = vf;
} else {
disableOKAction();
mySelectedDir = null;
}
}
}
private void enableOKAction() {
setErrorText(null);
setOKActionEnabled(true);
}
private void disableOKAction() {
setErrorText(HgVcsMessages.message("hg4idea.init.dialog.incorrect.path"));
setOKActionEnabled(false);
}
}