Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,28 @@
*/
package org.netbeans.modules.subversion.ui.relocate;

import java.awt.Component;
import java.awt.Dialog;
import java.io.File;
import java.net.MalformedURLException;
import java.util.ResourceBundle;
import java.util.logging.Level;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;

import org.netbeans.modules.subversion.FileInformation;
import org.netbeans.modules.subversion.FileStatusCache;
import org.netbeans.modules.subversion.Subversion;
import org.netbeans.modules.subversion.SvnModuleConfig;
import org.netbeans.modules.subversion.client.SvnClient;
import org.netbeans.modules.subversion.client.SvnClientExceptionHandler;
import org.netbeans.modules.subversion.client.SvnProgressSupport;
import org.netbeans.modules.subversion.ui.actions.ContextAction;
import org.netbeans.modules.subversion.ui.repository.RepositoryConnection;
import org.netbeans.modules.subversion.util.Context;
import org.netbeans.modules.subversion.util.SvnUtils;
import org.openide.DialogDescriptor;
Expand Down Expand Up @@ -76,16 +83,31 @@ protected int getDirectoryEnabledStatus() {
& ~FileInformation.STATUS_NOTVERSIONED_EXCLUDED
& ~FileInformation.STATUS_NOTVERSIONED_NEWLOCALLY;
}

public void validate(RelocatePanel panel, JButton btnOk) {

@SuppressWarnings("ResultOfObjectAllocationIgnored")
public static void validate(RelocatePanel panel, JButton btnOk) {
String urlString = getNewUrl(panel);
if (urlString.isEmpty() || urlString.equals(panel.getCurrentURL().getText().trim())) {
btnOk.setEnabled(false);
return;
}
try {
new SVNUrl(panel.getNewURL().getText());
new SVNUrl(urlString);
btnOk.setEnabled(true);
} catch (MalformedURLException e) {
btnOk.setEnabled(false);
}
}

private static String getNewUrl(RelocatePanel panel) {
Component editor = panel.getNewURL().getEditor().getEditorComponent();
if (editor instanceof JTextComponent jTextComponent) {
return jTextComponent.getText().trim();
}
Object item = panel.getNewURL().getEditor().getItem();
return item != null ? item.toString().trim() : "";
}

@Override
protected String getBaseName(Node[] activatedNodes) {
return "CTL_Relocate_Title";
Expand Down Expand Up @@ -114,7 +136,7 @@ protected void performContextAction(Node[] nodes) {
// the action will affect the whole working copy
final File root = roots[0];

SVNUrl repositoryUrl = null;
SVNUrl repositoryUrl;
try {
repositoryUrl = SvnUtils.getRepositoryRootUrl(root);
} catch (SVNClientException ex) {
Expand All @@ -128,27 +150,40 @@ protected void performContextAction(Node[] nodes) {
final String wc = root.getAbsolutePath();
panel.getCurrentURL().setText(repositoryUrl.toString());
panel.getWorkingCopy().setText(wc);


DefaultComboBoxModel<String> model = new DefaultComboBoxModel<>();
SvnUtils.getKnownRepositoryUrls().forEach(model::addElement);
panel.getNewURL().setModel(model);
panel.getNewURL().setSelectedItem("");
Component editor = panel.getNewURL().getEditor().getEditorComponent();
if (editor instanceof JTextComponent jTextComponent) {
jTextComponent.setText("");
}

final JButton btnRelocate = new JButton(loc.getString("CTL_Relocate_Action_Name"));
btnRelocate.setEnabled(false);
btnRelocate.setToolTipText(loc.getString("TT_Relocate_Action"));

panel.getNewURL().getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent event) {
validate(panel, btnRelocate);
}

@Override
public void removeUpdate(DocumentEvent event) {
validate(panel, btnRelocate);
}
if (editor instanceof JTextComponent jTextComponent) {
jTextComponent.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
validate(panel, btnRelocate);
}

@Override
public void removeUpdate(DocumentEvent e) {
validate(panel, btnRelocate);
}

@Override
public void changedUpdate(DocumentEvent e) {
validate(panel, btnRelocate);
}
});
}
panel.getNewURL().addActionListener(e -> validate(panel, btnRelocate));

@Override
public void changedUpdate(DocumentEvent event) {
validate(panel, btnRelocate);
}
});
JButton btnCancel = new JButton(loc.getString("CTL_Relocate_Action_Cancel"));
btnCancel.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(RelocateAction.class, "ACSD_Relocate_Action_Cancel")); // NOI18N
DialogDescriptor descriptor = new DialogDescriptor(panel, loc.getString("CTL_Relocate_Dialog_Title"), true, new Object [] {btnRelocate, btnCancel}, btnRelocate, DialogDescriptor.BOTTOM_ALIGN, null, null);
Expand All @@ -161,18 +196,29 @@ public void changedUpdate(DocumentEvent event) {
if (descriptor.getValue() != btnRelocate)
return;

final String newUrl = panel.getNewURL().getText();

RequestProcessor rp = Subversion.getInstance().getRequestProcessor(repositoryUrl);
final SVNUrl url = repositoryUrl;
final String newUrl = getNewUrl(panel);
final SVNUrl newSvnUrl;
try {
newSvnUrl = new SVNUrl(newUrl);
} catch (MalformedURLException ex) {
// shouldn't happen since newUrl has been validated
return;
}

RequestProcessor rp = Subversion.getInstance().getRequestProcessor(newSvnUrl);
final SVNUrl fromUrl = repositoryUrl;
SvnProgressSupport support = new SvnProgressSupport() {
SvnClient client = null;
@Override
protected void perform() {
try {
client = Subversion.getInstance().getClient(url);
client.relocate(url.toString(), newUrl, wc, true);
SvnClient client = Subversion.getInstance().getClient(newSvnUrl, this);
client.relocate(fromUrl.toString(), newUrl, wc, true);
patchCache();
RepositoryConnection rc = SvnModuleConfig.getDefault().getRepositoryConnection(newSvnUrl.toString());
if (rc == null) {
rc = new RepositoryConnection(newUrl);
}
SvnModuleConfig.getDefault().insertRecentUrl(rc);
} catch (SVNClientException ex) {
annotate(ex);
}
Expand All @@ -191,6 +237,6 @@ private void patchCache () {
}
}
};
support.start(rp, repositoryUrl, loc.getString("LBL_Relocate_Progress"));
support.start(rp, newSvnUrl, loc.getString("LBL_Relocate_Progress"));
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.1" encoding="UTF-8" ?>
<?xml version="1.0" encoding="UTF-8" ?>

<!--

Expand Down Expand Up @@ -148,7 +148,10 @@
</Property>
</AccessibilityProperties>
</Component>
<Component class="javax.swing.JTextField" name="tfNewURL">
<Component class="javax.swing.JComboBox" name="tfNewURL">
<Properties>
<Property name="editable" type="boolean" value="true"/>
</Properties>
<AccessibilityProperties>
<Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
<ResourceString bundle="org/netbeans/modules/subversion/ui/relocate/Bundle.properties" key="RelocatePanel.tfNewURL.AccessibleContext.accessibleName" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
Expand All @@ -157,6 +160,9 @@
<ResourceString bundle="org/netbeans/modules/subversion/ui/relocate/Bundle.properties" key="RelocatePanel.tfNewURL.AccessibleContext.accessibleDescription" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
</Property>
</AccessibilityProperties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_TypeParameters" type="java.lang.String" value="&lt;String&gt;"/>
</AuxValues>
</Component>
</SubComponents>
</Form>
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

package org.netbeans.modules.subversion.ui.relocate;

import javax.swing.JComboBox;
import javax.swing.JTextField;

/**
Expand All @@ -50,7 +51,7 @@ private void initComponents() {
jLabel2 = new javax.swing.JLabel();
tfCurrentURL = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
tfNewURL = new javax.swing.JTextField();
tfNewURL = new javax.swing.JComboBox<>();

jLabel1.setLabelFor(tfWorkingCopy);
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(RelocatePanel.class, "RelocatePanel.jLabel1.text")); // NOI18N
Expand All @@ -65,6 +66,8 @@ private void initComponents() {
jLabel3.setLabelFor(tfNewURL);
org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(RelocatePanel.class, "RelocatePanel.jLabel3.text")); // NOI18N

tfNewURL.setEditable(true);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
Expand All @@ -79,7 +82,7 @@ private void initComponents() {
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(tfCurrentURL, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
.addComponent(tfWorkingCopy, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
.addComponent(tfNewURL, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE))
.addComponent(tfNewURL, 0, 380, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
Expand Down Expand Up @@ -117,7 +120,7 @@ private void initComponents() {
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JTextField tfCurrentURL;
private javax.swing.JTextField tfNewURL;
private javax.swing.JComboBox<String> tfNewURL;
private javax.swing.JTextField tfWorkingCopy;
// End of variables declaration//GEN-END:variables

Expand All @@ -129,7 +132,7 @@ public JTextField getCurrentURL() {
return tfCurrentURL;
}

public JTextField getNewURL() {
public JComboBox<String> getNewURL() {
return tfNewURL;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,14 @@
import java.awt.event.ItemListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
Expand All @@ -51,19 +49,16 @@
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ui.OpenProjects;

import org.netbeans.modules.subversion.Subversion;
import org.netbeans.modules.subversion.SvnModuleConfig;
import org.netbeans.modules.subversion.client.SvnClientFactory;
import org.netbeans.modules.subversion.util.SvnUtils;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.filesystems.FileUtil;
import org.openide.util.HelpCtx;
import org.openide.util.Mutex;
import org.openide.util.NbBundle;
import org.tigris.subversion.svnclientadapter.SVNClientException;
import org.tigris.subversion.svnclientadapter.SVNRevision;
import org.tigris.subversion.svnclientadapter.SVNUrl;

Expand Down Expand Up @@ -218,10 +213,7 @@ public final void refreshUrlHistory() {
Runnable notInAWT = new Runnable() {
@Override
public void run() {
List<RepositoryConnection> recentUrls = SvnModuleConfig.getDefault().getRecentUrls();
final Set<RepositoryConnection> recentRoots = new LinkedHashSet<RepositoryConnection>();
recentRoots.addAll(recentUrls);
addProjects(recentRoots);
final Set<RepositoryConnection> recentRoots = SvnUtils.getKnownRepositoryRoots();
if (repositoryPanel.urlComboBox.isEditable()) {
// templates for supported connection methods
recentRoots.add(new RepositoryConnection("file:///")); // NOI18N
Expand Down Expand Up @@ -251,25 +243,6 @@ public void run() {
}
});
}

private void addProjects (final Set<RepositoryConnection> recentRoots) {
for (Project p : OpenProjects.getDefault().getOpenProjects()) {
File projectFolder = FileUtil.toFile(p.getProjectDirectory());
if (projectFolder != null && SvnUtils.isManaged(projectFolder)) {
try {
SVNUrl repositoryUrl = SvnUtils.getRepositoryRootUrl(projectFolder);
if (repositoryUrl != null) {
RepositoryConnection rc = new RepositoryConnection(repositoryUrl.toString());
if (!recentRoots.contains(rc)) {
recentRoots.add(rc);
}
}
} catch (SVNClientException ex) {
Logger.getLogger(Repository.class.getName()).log(Level.FINE, null, ex);
}
}
}
}
};
if (EventQueue.isDispatchThread()) {
Subversion.getInstance().getRequestProcessor().post(notInAWT);
Expand Down
Loading
Loading