blob: d4b48281f7ca95f514716f95e29f379b88b26d2a [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.history;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.FixedSizeButton;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.NullableFunction;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.svn.branchConfig.SvnBranchMapperManager;
import org.jetbrains.idea.svn.SvnBundle;
import org.jetbrains.idea.svn.SvnUtil;
import org.jetbrains.idea.svn.branchConfig.SelectBranchPopup;
import org.jetbrains.idea.svn.branchConfig.SvnBranchConfigurationNew;
import org.jetbrains.idea.svn.dialogs.WCInfoWithBranches;
import org.jetbrains.idea.svn.integrate.IntegratedSelectedOptionsDialog;
import org.jetbrains.idea.svn.integrate.WorkingCopyInfo;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.util.SVNPathUtil;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
public class SvnMergeInfoRootPanelManual {
private JCheckBox myInclude;
private JLabel myHereLabel;
private JLabel myThereLabel;
private TextFieldWithBrowseButton myBranchField;
private FixedSizeButton myFixedSelectLocal;
private JPanel myContentPanel;
private JTextArea myUrlText;
private JTextArea myLocalArea;
private JTextArea myMixedRevisions;
private final Project myProject;
private final NullableFunction<WCInfoWithBranches, WCInfoWithBranches> myRefresher;
private final Runnable myListener;
private boolean myOnlyOneRoot;
private WCInfoWithBranches myInfo;
private final Map<String, String> myBranchToLocal;
private WCInfoWithBranches.Branch mySelectedBranch;
public SvnMergeInfoRootPanelManual(final Project project, final NullableFunction<WCInfoWithBranches, WCInfoWithBranches> refresher,
final Runnable listener,
final boolean onlyOneRoot,
final WCInfoWithBranches info) {
myOnlyOneRoot = onlyOneRoot;
myInfo = info;
myProject = project;
myRefresher = refresher;
myListener = listener;
myBranchToLocal = new HashMap<String, String>();
init();
myInclude.setVisible(! onlyOneRoot);
initWithData();
}
private void initWithData() {
myInclude.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
myListener.run();
}
});
final String path = myInfo.getPath();
final String urlString = myInfo.getUrl().toString();
myUrlText.setText(urlString);
myFixedSelectLocal.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if (mySelectedBranch != null) {
final Pair<WorkingCopyInfo,SVNURL> info =
IntegratedSelectedOptionsDialog.selectWorkingCopy(myProject, myInfo.getUrl(), mySelectedBranch.getUrl(), false, null,
null);
if (info != null) {
final String local = info.getFirst().getLocalPath();
calculateBranchPathByBranch(mySelectedBranch.getUrl(), local);
}
myListener.run();
}
}
});
myBranchField.getTextField().setEditable(false);
myBranchField.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
final VirtualFile vf = SvnUtil.getVirtualFile(myInfo.getPath());
if (vf != null) {
SelectBranchPopup.show(myProject, vf, new SelectBranchPopup.BranchSelectedCallback() {
public void branchSelected(final Project project, final SvnBranchConfigurationNew configuration, final String url, final long revision) {
refreshSelectedBranch(url);
calculateBranchPathByBranch(mySelectedBranch.getUrl(), null);
myListener.run();
}
}, SvnBundle.message("select.branch.popup.general.title"));
}
}
});
if (myInfo.getBranches().isEmpty()) {
calculateBranchPathByBranch(null, null);
} else {
final WCInfoWithBranches.Branch branch = myInfo.getBranches().get(0);
refreshSelectedBranch(branch.getUrl());
calculateBranchPathByBranch(mySelectedBranch.getUrl(), null);
}
}
private void init() {
myContentPanel = new JPanel(new GridBagLayout()) {
@Override
public void setBounds(final Rectangle r) {
super.setBounds(r);
}
};
myContentPanel.setMinimumSize(new Dimension(200, 100));
final GridBagConstraints gb =
new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(1, 1, 1, 1), 0, 0);
myInclude = new JCheckBox();
gb.fill = GridBagConstraints.NONE;
gb.weightx = 0;
myContentPanel.add(myInclude, gb);
// newline
myHereLabel = new JLabel("From:");
++ gb.gridy;
gb.gridx = 0;
myContentPanel.add(myHereLabel, gb);
myUrlText = new JTextArea();
myUrlText.setLineWrap(true);
myUrlText.setBackground(UIUtil.getLabelBackground());
myUrlText.setWrapStyleWord(true);
gb.weightx = 1;
++ gb.gridx;
gb.gridwidth = 2;
gb.fill = GridBagConstraints.HORIZONTAL;
myContentPanel.add(myUrlText, gb);
// newline
gb.fill = GridBagConstraints.NONE;
myThereLabel = new JLabel("To:");
gb.weightx = 0;
gb.gridwidth = 1;
++ gb.gridy;
gb.gridx = 0;
myContentPanel.add(myThereLabel, gb);
myBranchField = new TextFieldWithBrowseButton();
gb.weightx = 1;
++ gb.gridx;
gb.gridwidth = 2;
gb.fill = GridBagConstraints.HORIZONTAL;
myContentPanel.add(myBranchField, gb);
// newline
gb.gridx = 1;
++ gb.gridy;
gb.gridwidth = 1;
myLocalArea = new JTextArea();
myLocalArea.setBackground(UIUtil.getLabelBackground());
myLocalArea.setLineWrap(true);
myLocalArea.setWrapStyleWord(true);
myContentPanel.add(myLocalArea, gb);
++ gb.gridx;
gb.weightx = 0;
gb.fill = GridBagConstraints.NONE;
myFixedSelectLocal = new FixedSizeButton(20);
myContentPanel.add(myFixedSelectLocal, gb);
++ gb.gridy;
gb.gridx = 0;
gb.gridwidth = 2;
myMixedRevisions = new JTextArea("Mixed Revision Working Copy");
myMixedRevisions.setForeground(Color.red);
myMixedRevisions.setBackground(myContentPanel.getBackground());
myContentPanel.add(myMixedRevisions, gb);
myMixedRevisions.setVisible(false);
}
public void setMixedRevisions(final boolean value) {
myMixedRevisions.setVisible(value);
}
@Nullable
private String getLocal(@NotNull final String url, @Nullable final String localPath) {
final Set<String> paths = SvnBranchMapperManager.getInstance().get(url);
if (paths != null && (! paths.isEmpty())) {
if (localPath != null) {
// check whether it is still actual
for (String path : paths) {
if (path.equals(localPath)) {
return path;
}
}
} else {
final java.util.List<String> list = new ArrayList<String>(paths);
Collections.sort(list);
return list.get(0);
}
}
return null;
}
// always assign to local area here
private void calculateBranchPathByBranch(final String url, final String localPath) {
final String local = url == null ? null : getLocal(url, localPath == null ? myBranchToLocal.get(url) : localPath);
if (local == null) {
myLocalArea.setForeground(Color.red);
myLocalArea.setText(SvnBundle.message("tab.repository.merge.panel.root.panel.select.local"));
} else {
myLocalArea.setForeground(UIUtil.getInactiveTextColor());
myLocalArea.setText(local);
myBranchToLocal.put(url, local);
}
}
// always assign to selected branch here
private void refreshSelectedBranch(final String url) {
final String branch = SVNPathUtil.tail(url);
myBranchField.setText(branch);
if (initSelectedBranch(url)) return;
myInfo = myRefresher.fun(myInfo);
initSelectedBranch(url);
}
private boolean initSelectedBranch(final String branch) {
for (WCInfoWithBranches.Branch item : myInfo.getBranches()) {
if (item.getUrl().equals(branch)) {
mySelectedBranch = item;
return true;
}
}
return false;
}
public void setDirection(final boolean fromHere) {
if (fromHere) {
myHereLabel.setText(SvnBundle.message("tab.repository.merge.panel.root.panel.from"));
myThereLabel.setText(SvnBundle.message("tab.repository.merge.panel.root.panel.to"));
} else {
myThereLabel.setText(SvnBundle.message("tab.repository.merge.panel.root.panel.from"));
myHereLabel.setText(SvnBundle.message("tab.repository.merge.panel.root.panel.to"));
}
}
public void setOnlyOneRoot(final boolean onlyOneRoot) {
myOnlyOneRoot = onlyOneRoot;
myInclude.setEnabled(! myOnlyOneRoot);
myInclude.setSelected(true);
}
public void selectCheckbox(final boolean select) {
myInclude.setSelected(select);
}
public JPanel getContentPanel() {
return myContentPanel;
}
private void createUIComponents() {
myFixedSelectLocal = new FixedSizeButton(20);
}
public InfoHolder getInfo() {
return new InfoHolder(mySelectedBranch, getLocalBranch(), myInclude.isSelected());
}
public void initSelection(final InfoHolder holder) {
myInclude.setSelected(holder.isEnabled());
if (holder.getBranch() != null) {
refreshSelectedBranch(holder.getBranch().getUrl());
calculateBranchPathByBranch(mySelectedBranch.getUrl(), holder.getLocal());
}
}
public static class InfoHolder {
private final WCInfoWithBranches.Branch myBranch;
private final String myLocal;
private final boolean myEnabled;
public InfoHolder(final WCInfoWithBranches.Branch branch, final String local, final boolean enabled) {
myBranch = branch;
myLocal = local;
myEnabled = enabled;
}
public WCInfoWithBranches.Branch getBranch() {
return myBranch;
}
public String getLocal() {
return myLocal;
}
public boolean isEnabled() {
return myEnabled;
}
}
public WCInfoWithBranches getWcInfo() {
return myInfo;
}
public WCInfoWithBranches.Branch getBranch() {
return mySelectedBranch;
}
public String getLocalBranch() {
if (mySelectedBranch != null) {
return myBranchToLocal.get(mySelectedBranch.getUrl());
}
return null;
}
public boolean isEnabled() {
return myOnlyOneRoot || myInclude.isSelected();
}
}