/*******************************************************************************
* Copyright (c) 2012 Per Kr. Soreide.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Per Kr. Soreide - initial API and implementation
*******************************************************************************/
package bndtools.release.ui;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableItem;
import bndtools.release.Activator;
import bndtools.release.ProjectDiff;
import bndtools.release.ReleaseHelper;
import bndtools.release.ReleaseHelper.MacroInfo;
import bndtools.release.api.ReleaseOption;
import bndtools.release.nl.Messages;
public class WorkspaceReleaseDialog extends Dialog implements SelectionListener {
private List<ProjectDiff> projectDiffs;
private ProjectListControl projectListControl;
private BundleTree bundleRelease;
protected SashForm sashForm;
private final boolean showMessage;
private ReleaseOption releaseOption;
public WorkspaceReleaseDialog(Shell parentShell, List<ProjectDiff> projectDiffs, boolean showMessage) {
super(parentShell);
super.setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.MAX | SWT.MIN);
this.projectDiffs = projectDiffs;
this.showMessage = showMessage;
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(Messages.releaseDialogTitle);
newShell.setImage(Activator.getImageDescriptor("icons/lorry.png").createImage());
int width = 640, height = 480;
int top = -1, left = -1;
Shell parent = (Shell) newShell.getParent();
if (parent != null) {
Point parentSize = parent.getSize();
Point parentLocation = parent.getLocation();
width = Math.max(Double.valueOf(parentSize.x * 0.8).intValue(), 640);
height = Math.max(Double.valueOf(parentSize.y * 0.8).intValue(), 480);
top = parentLocation.y + ((parentSize.y - height) / 2);
left = parentLocation.x + ((parentSize.x - width) / 2);
}
newShell.setSize(width, height);
if (top != -1 && left != -1) {
newShell.setLocation(left, top);
}
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
GridData gridData = createFillGridData();
sashForm = new SashForm(composite, SWT.HORIZONTAL);
sashForm.setLayout(createGridLayout());
sashForm.setLayoutData(gridData);
Composite left = new Composite(sashForm, SWT.NONE);
left.setLayout(createGridLayout());
left.setLayoutData(createFillGridData());
Composite right = new Composite(sashForm, SWT.NONE);
right.setLayout(createGridLayout());
right.setLayoutData(createFillGridData());
String[] items = ReleaseHelper.getReleaseRepositories();
projectListControl = new ProjectListControl(this, items);
projectListControl.createControl(left);
bundleRelease = new BundleTree(right);
projectListControl.setInput(projectDiffs);
sashForm.setWeights(new int[] { 40, 60 });
sashForm.pack();
return sashForm;
}
public void setSelected(int index) {
ProjectDiff projectDiff = null;
if (projectDiffs.size() > 0) {
projectListControl.setSelected(index);
projectDiff = projectDiffs.get(index);
}
if (projectDiff != null) {
bundleRelease.setInput(projectDiff.getBaselines());
bundleRelease.setVisible(true);
} else {
bundleRelease.setVisible(false);
}
}
public void widgetSelected(SelectionEvent e) {
if (e.item == null || e.item.isDisposed()) {
return;
}
ProjectDiff projectDiff = (ProjectDiff) ((TableItem) e.item).getData();
if (projectDiff != null) {
if (e.detail > 0) {
int checkedIndex = -1;
TableItem[] items = projectListControl.getTable().getItems();
for (int i = 0; i < items.length; i++) {
if (items[i] == e.item) {
checkedIndex = i;
break;
}
}
TableItem ti = projectListControl.getTable().getItem(checkedIndex);
boolean checked = ti.getChecked();
projectDiff.setRelease(checked);
if (checkedIndex > -1) {
projectListControl.getTable().deselectAll();
projectListControl.setSelected(checkedIndex);
}
}
bundleRelease.setInput(projectDiff.getBaselines());
bundleRelease.setVisible(true);
} else {
bundleRelease.setVisible(false);
}
}
public void widgetDefaultSelected(SelectionEvent e) {
}
public ReleaseOption getReleaseOption() {
return releaseOption;
}
public boolean isShowMessage() {
return showMessage;
}
private static GridLayout createGridLayout() {
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
gridLayout.horizontalSpacing = 0;
gridLayout.verticalSpacing = 0;
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
return gridLayout;
}
private static GridData createFillGridData() {
return new GridData(GridData.FILL, GridData.FILL, true, true);
}
@Override
protected void okPressed() {
if (bundleRelease.getReleaseOption() == null) {
for (ProjectDiff diff : projectDiffs) {
if (diff.isRelease()) {
Activator.message(Messages.releaseOptionMustBeSpecified);
return;
}
}
}
// Find bundles with macros as Bundle-Version:
List<MacroInfo> bsns = ReleaseHelper.getBsnsWithBundleVersionMacro(projectDiffs);
if (bsns.size() > 0) {
StringBuilder sb = new StringBuilder();
sb.append(Messages.macrosWillBeOverwritten1);
sb.append("\n\n");
for (MacroInfo info : bsns) {
sb.append("\t");
sb.append(info.projectDiff.getProject().getName());
if (!info.projectDiff.getProject().getName().equals(info.bsn)) {
sb.append(" (");
sb.append(info.bsn);
sb.append(")");
}
sb.append(" ");
sb.append(info.macro);
sb.append("\n");
}
sb.append("\n");
sb.append(Messages.macrosWillBeOverwritten2);
if (!Activator.confirmationMessage(sb.toString())) {
return;
}
}
this.releaseOption = bundleRelease.getReleaseOption();
super.okPressed();
}
@Override
public boolean close() {
if (projectListControl != null) {
projectListControl.dispose();
}
return super.close();
}
}