blob: 9c1bad123f8b839db736434d5bb5960b12b1e54d [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.jetbrains.idea.svn.dialogs;
import com.intellij.openapi.actionSystem.ActionManager;
import com.intellij.openapi.actionSystem.ActionPopupMenu;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.hash.HashSet;
import org.jetbrains.annotations.NotNull;
import org.tmatesoft.svn.core.internal.util.SVNPathUtil;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import java.awt.*;
import java.awt.event.*;
import java.util.Set;
/**
* Created with IntelliJ IDEA.
* User: Irina.Chernushina
* Date: 7/6/12
* Time: 7:53 PM
*/
public class SelectCreateExternalTargetDialog extends RepositoryBrowserDialog {
private String mySelectedURL;
private boolean myCheckout;
private JTextField myFolderName;
private boolean myFollowRemoteTarget;
// light check for same file existence - check before
private final Set<String> myUsedNames;
public SelectCreateExternalTargetDialog(Project project, final VirtualFile below) {
super(project, true, "Point to repository location");
final VirtualFile[] children = below.getChildren();
myUsedNames = new HashSet<String>();
int maxCnt = 1000; // maybe not take it too seriously ?
for (VirtualFile child : children) {
myUsedNames.add(child.getName());
-- maxCnt;
if (maxCnt <= 0) break;
}
}
@Override
protected void init() {
super.init();
myFollowRemoteTarget = true;
setTitle("Select Target For External");
setOKButtonText("Select");
getRepositoryBrowser().addChangeListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
if (getOKAction() != null) {
final String selectedURL = getRepositoryBrowser().getSelectedURL();
if (myFollowRemoteTarget && selectedURL != null) {
myFolderName.setText(SVNPathUtil.tail(selectedURL));
}
checkEnabled();
}
}
});
getOKAction().setEnabled(getRepositoryBrowser().getSelectedURL() != null);
}
private void checkEnabled() {
final String selectedURL = getRepositoryBrowser().getSelectedURL();
final String text = myFolderName.getText();
final boolean contains = myUsedNames.contains(text);
final boolean enabled = selectedURL != null && !StringUtil.isEmptyOrSpaces(text) && !contains;
if (contains) {
setErrorText("Target File Already Exists");
} else {
setErrorText(null);
}
getOKAction().setEnabled(enabled);
}
@NotNull
protected Action[] createActions() {
return new Action[] {getOKAction(), getCancelAction()};
}
@Override
protected void doOKAction() {
mySelectedURL = getRepositoryBrowser().getSelectedURL();
super.doOKAction();
}
public String getSelectedURL() {
return mySelectedURL;
}
protected JPopupMenu createPopup(boolean toolWindow) {
DefaultActionGroup group = new DefaultActionGroup();
DefaultActionGroup newGroup = new DefaultActionGroup("_New", true);
final RepositoryBrowserComponent browser = getRepositoryBrowser();
newGroup.add(new AddLocationAction(browser));
newGroup.add(new MkDirAction(browser));
group.add(newGroup);
group.addSeparator();
group.add(new RefreshAction(browser));
group.add(new DiscardLocationAction(browser));
ActionPopupMenu menu = ActionManager.getInstance().createActionPopupMenu("", group);
return menu.getComponent();
}
@Override
public JComponent createCenterPanel() {
final JComponent repositoryPanel = super.createCenterPanel();
final JPanel wrapper = new JPanel(new GridBagLayout());
final GridBagConstraints gb = new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(1, 1, 1, 1), 0, 0);
gb.weightx = 1;
gb.weighty = 1;
gb.gridwidth = 2;
wrapper.add(repositoryPanel, gb);
++ gb.gridy;
gb.fill = GridBagConstraints.NONE;
gb.weightx = 0;
gb.weighty = 0;
gb.gridwidth = 1;
myFolderName = new JTextField();
gb.insets.top = 5;
gb.anchor = GridBagConstraints.WEST;
wrapper.add(new JLabel("Local Target:"), gb);
++ gb.gridx;
gb.weightx = 1;
gb.fill = GridBagConstraints.HORIZONTAL;
wrapper.add(myFolderName, gb);
gb.insets.top = 1;
gb.weightx = 0;
gb.fill = GridBagConstraints.NONE;
gb.gridx = 0;
++ gb.gridy;
myFolderName.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
myFollowRemoteTarget = false;
myFolderName.removeFocusListener(this);
}
});
myFolderName.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
checkEnabled();
}
});
myFolderName.addInputMethodListener(new InputMethodListener() {
@Override
public void inputMethodTextChanged(InputMethodEvent event) {
checkEnabled();
}
@Override
public void caretPositionChanged(InputMethodEvent event) {
}
});
final JCheckBox checkout = new JCheckBox("Checkout");
checkout.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myCheckout = checkout.isSelected();
}
});
wrapper.add(checkout, gb);
return wrapper;
}
public boolean isCheckout() {
return myCheckout;
}
public String getLocalTarget() {
return myFolderName.getText();
}
}