blob: f2a58a0bd2da630635850720a92c1d85adc9ff9c [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 org.jetbrains.idea.svn.dialogs;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.help.HelpManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.ui.DocumentAdapter;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.SvnBundle;
import org.jetbrains.idea.svn.SvnPropertyKeys;
import org.jetbrains.idea.svn.SvnVcs;
import org.jetbrains.idea.svn.api.Depth;
import org.jetbrains.idea.svn.properties.PropertyClient;
import org.jetbrains.idea.svn.properties.PropertyConsumer;
import org.jetbrains.idea.svn.properties.PropertyData;
import org.jetbrains.idea.svn.properties.PropertyValue;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc2.SvnTarget;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.Collection;
import java.util.TreeSet;
/**
* @author alex
*/
public class SetPropertyDialog extends DialogWrapper {
private static final Logger LOG = Logger.getInstance("org.jetbrains.idea.svn.dialogs.SetPropertyDialog");
private final String myPropertyName;
private final File[] myFiles;
private JComboBox myPropertyNameBox;
private JRadioButton mySetPropertyButton;
private JTextArea myValueText;
private JRadioButton myDeletePropertyButton;
private JCheckBox myRecursiveButton;
private final boolean myIsRecursionAllowed;
private final SvnVcs myVCS;
@NonNls private static final String HELP_ID = "vcs.subversion.property";
private JPanel myMainPanel;
public SetPropertyDialog(Project project, File[] files, String name, boolean allowRecursion) {
super(project, true);
myFiles = files;
myPropertyName = name;
myIsRecursionAllowed = allowRecursion;
myVCS = SvnVcs.getInstance(project);
setResizable(true);
setTitle(SvnBundle.message("dialog.title.set.property"));
getHelpAction().setEnabled(true);
init();
}
protected void doHelpAction() {
HelpManager.getInstance().invokeHelp(HELP_ID);
}
@NotNull
protected Action[] createActions() {
return new Action[]{getOKAction(), getCancelAction(), getHelpAction()};
}
public JComponent getPreferredFocusedComponent() {
return myPropertyNameBox;
}
public String getPropertyName() {
return (String)myPropertyNameBox.getEditor().getItem();
}
public String getPropertyValue() {
if (myDeletePropertyButton.isSelected()) {
return null;
}
return myValueText.getText();
}
public boolean isRecursive() {
return myRecursiveButton.isSelected();
}
public boolean shouldCloseOnCross() {
return true;
}
protected String getDimensionServiceKey() {
return "svn.propertyDialog";
}
protected void init() {
super.init();
if (myPropertyName != null) {
updatePropertyValue(myPropertyName);
}
else {
myPropertyNameBox.getEditor().setItem("");
}
myPropertyNameBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
String name = getPropertyName();
updatePropertyValue(name);
getOKAction().setEnabled(name != null && !"".equals(name.trim()));
}
}
});
Component editor = myPropertyNameBox.getEditor().getEditorComponent();
if (editor instanceof JTextField) {
JTextField jTextField = (JTextField)editor;
jTextField.getDocument().addDocumentListener(new DocumentAdapter() {
protected void textChanged(DocumentEvent e) {
String name = getPropertyName();
updatePropertyValue(name);
getOKAction().setEnabled(name != null && !"".equals(name.trim()));
}
});
}
getOKAction().setEnabled(myPropertyName != null && !"".equals(myPropertyName.trim()));
}
private void updatePropertyValue(String name) {
if (myFiles.length == 0 || myFiles.length > 1) {
return;
}
File file = myFiles[0];
PropertyValue property = !StringUtil.isEmpty(name) ? getProperty(file, name) : null;
if (property != null) {
myValueText.setText(property.toString());
myValueText.selectAll();
}
else {
myValueText.setText("");
}
}
@Nullable
private PropertyValue getProperty(@NotNull File file, @NotNull String name) {
PropertyValue result;
try {
PropertyClient client = myVCS.getFactory(file).createPropertyClient();
result = client.getProperty(SvnTarget.fromFile(file, SVNRevision.WORKING), name, false, SVNRevision.WORKING);
}
catch (VcsException e) {
LOG.info(e);
result = null;
}
return result;
}
protected JComponent createCenterPanel() {
fillPropertyNames(myFiles);
if (myPropertyName != null) {
myPropertyNameBox.getEditor().setItem(myPropertyName);
myPropertyNameBox.getEditor().selectAll();
}
mySetPropertyButton.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
if (mySetPropertyButton.isSelected()) {
myValueText.setEnabled(true);
}
else {
myValueText.setEnabled(false);
}
}
});
myRecursiveButton.setEnabled(myIsRecursionAllowed);
return myMainPanel;
}
private void fillPropertyNames(File[] files) {
final Collection<String> names = new TreeSet<String>();
if (files.length == 1) {
File file = files[0];
try {
PropertyConsumer handler = new PropertyConsumer() {
public void handleProperty(File path, PropertyData property) {
String name = property.getName();
if (name != null) {
names.add(name);
}
}
public void handleProperty(SVNURL url, PropertyData property) {
}
public void handleProperty(long revision, PropertyData property) {
}
};
PropertyClient client = myVCS.getFactory(file).createPropertyClient();
client.list(SvnTarget.fromFile(file, SVNRevision.WORKING), SVNRevision.WORKING, Depth.EMPTY, handler);
}
catch (VcsException e) {
LOG.info(e);
}
}
fillProperties(names);
for (final String name : names) {
myPropertyNameBox.addItem(name);
}
}
@SuppressWarnings({"HardCodedStringLiteral"})
private static void fillProperties(final Collection<String> names) {
names.add(SvnPropertyKeys.SVN_EOL_STYLE);
names.add(SvnPropertyKeys.SVN_KEYWORDS);
names.add(SvnPropertyKeys.SVN_NEEDS_LOCK);
names.add(SvnPropertyKeys.SVN_MIME_TYPE);
names.add(SvnPropertyKeys.SVN_EXECUTABLE);
names.add(SvnPropertyKeys.SVN_IGNORE);
names.add(SvnPropertyKeys.SVN_EXTERNALS);
}
}