package org.bndtools.templating.jgit.ui;
import java.net.URISyntaxException;
import org.bndtools.templating.jgit.GitCloneTemplateParams;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jgit.transport.URIish;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import aQute.bnd.header.Attrs;
import aQute.libg.tuple.Pair;
public class GitCloneURLDialog extends AbstractNewEntryDialog {
private final String title;
private String cloneUri = null;
private String name = null;
private String branch = null;
private Text txtRepository;
private Text txtBranch;
private Text txtName;
public GitCloneURLDialog(Shell parentShell, String title) {
super(parentShell);
this.title = title;
setShellStyle(getShellStyle() | SWT.RESIZE);
}
@Override
protected Control createDialogArea(Composite parent) {
setTitle(title);
Composite area = (Composite) super.createDialogArea(parent);
Composite container = new Composite(area, SWT.NONE);
container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
container.setLayout(new GridLayout(2, false));
Label lblRepo = new Label(container, SWT.NONE);
lblRepo.setText("Clone URL:");
txtRepository = new Text(container, SWT.BORDER);
txtRepository.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
if (cloneUri != null)
txtRepository.setText(cloneUri.toString());
Label lblName = new Label(container, SWT.NONE);
lblName.setText("Name:");
txtName = new Text(container, SWT.BORDER);
txtName.setMessage("optional");
txtName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
if (name != null)
txtName.setText(name);
new Label(container, SWT.NONE).setText("Branch:");
txtBranch = new Text(container, SWT.BORDER);
txtBranch.setMessage("default: " + GitCloneTemplateParams.DEFAULT_BRANCH);
txtBranch.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
if (branch != null)
txtBranch.setText(branch);
ControlDecoration branchDecor = new ControlDecoration(txtBranch, SWT.LEFT, container);
branchDecor.setDescriptionText("Specify the branch, tag or commit ID you would like to clone from the\nrepository. The default is 'origin/master'.");
branchDecor.setImage(FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION).getImage());
branchDecor.setShowHover(true);
ModifyListener modifyListener = new ModifyListener() {
@Override
public void modifyText(ModifyEvent ev) {
updateFromInput();
updateButtons();
}
};
txtRepository.addModifyListener(modifyListener);
txtName.addModifyListener(modifyListener);
txtBranch.addModifyListener(modifyListener);
return area;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
super.createButtonsForButtonBar(parent);
Button ok = getButton(OK);
ok.setText("Save");
ok.setEnabled(cloneUri != null);
}
private void updateFromInput() {
try {
cloneUri = txtRepository.getText().trim();
name = txtName.getText().trim();
branch = txtBranch.getText().trim();
setErrorMessage(null);
@SuppressWarnings("unused") // for validation
URIish uriish = new URIish(cloneUri);
} catch (URISyntaxException e) {
setErrorMessage(e.getMessage());
}
}
private void updateButtons() {
getButton(OK).setEnabled(cloneUri != null);
}
@Override
public void setEntry(Pair<String,Attrs> entry) {
cloneUri = entry.getFirst();
name = entry.getSecond().get("name");
branch = entry.getSecond().get("branch");
if (txtRepository != null && !txtRepository.isDisposed())
txtRepository.setText(cloneUri);
if (txtName != null && !txtName.isDisposed())
txtName.setText(name);
if (txtBranch != null && !txtBranch.isDisposed())
txtBranch.setText(branch);
}
@Override
public Pair<String,Attrs> getEntry() {
Attrs attrs = new Attrs();
if (name != null && !name.isEmpty())
attrs.put("name", name);
if (branch != null && !branch.isEmpty())
attrs.put("branch", branch);
return cloneUri != null ? new Pair<>(cloneUri.toString(), attrs) : null;
}
}