package com.opcoach.genmodeladdon.ui.dialog; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.Map; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.window.ToolTip; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; 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.Shell; import org.eclipse.swt.widgets.Table; import org.osgi.framework.Bundle; import org.osgi.framework.FrameworkUtil; /** A specific dialog to select the files that should be overridden */ public class ConfirmFileSelectionDialog extends MessageDialog { private Map<String, Object> filesNotYetGenerated; private Collection<String> filesToBeGenerated; private CheckboxTableViewer tv; private String relativeDir; private ImageRegistry registry; private static final String IMG_CHECKBOX_SELECTED = "icons/checkbox_selected.gif"; private static final String IMG_CHECKBOX_UNSELECTED = "icons/checkbox_unselected.gif"; public ConfirmFileSelectionDialog(Shell parentShell, Map<String, Object> filesNotGenerated, String pRelativeDir) { super(parentShell, "Overriding existing file(s)", null, "Some files already exist.\nSelect the files you want to override.\nA tooltip will display the content of the file if it is kept for generation", MessageDialog.CONFIRM, new String[] { IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL }, 0); filesNotYetGenerated = filesNotGenerated; relativeDir = pRelativeDir + File.separator; filesToBeGenerated = new ArrayList<String>(); setShellStyle(getShellStyle() | SWT.RESIZE); } @Override protected Control createCustomArea(Composite parent) { Composite root = new Composite(parent, SWT.NONE); root.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); root.setLayout(new GridLayout(2, false)); ScrolledComposite tableParent = new ScrolledComposite(root, SWT.V_SCROLL | SWT.H_SCROLL); tableParent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); tableParent.setLayout(new FillLayout()); tv = CheckboxTableViewer.newCheckList(tableParent, SWT.BORDER); final Table cTable = tv.getTable(); cTable.setLinesVisible(true); tableParent.setContent(tv.getControl()); tableParent.setExpandHorizontal(true); tableParent.setExpandVertical(true); tableParent.setAlwaysShowScrollBars(false); // sort elements tv.setSorter(new ViewerSorter() { @Override public int compare(Viewer viewer, Object e1, Object e2) { String f1 = getText(e1); String f2 = getText(e2); int pos1 = f1.lastIndexOf('/'); int pos2 = f2.lastIndexOf('/'); int pathComp = String.CASE_INSENSITIVE_ORDER.compare(f1.substring(0, pos1), f2.substring(0, pos2)); return (pathComp != 0) ? pathComp : String.CASE_INSENSITIVE_ORDER.compare(f1.substring(pos1 + 1, f1.length()), f2.substring(pos2 + 1, f2.length())); } private String getText(Object element) { String absName = element.toString(); int pos = absName.indexOf(relativeDir); return absName.substring(pos).replace('\\', '/'); } }); TableViewerColumn filenameCol = new TableViewerColumn(tv, SWT.LEAD); filenameCol.getColumn().setWidth(400); filenameCol.getColumn().setText("Filename"); filenameCol.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { String absName = element.toString(); int pos = absName.indexOf(relativeDir); return element.toString().substring(pos).replace('\\', '/'); } @Override public String getToolTipText(Object element) { return "This content will be generated: \n-----------------------------------\n" + filesNotYetGenerated.get(element); } }); ColumnViewerToolTipSupport.enableFor(tv, ToolTip.NO_RECREATE); tv.setContentProvider(ArrayContentProvider.getInstance()); tv.setInput(filesNotYetGenerated.keySet()); filenameCol.getColumn().pack(); tv.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { if (event.getChecked()) { filesToBeGenerated.add((String) event.getElement()); } else { filesToBeGenerated.remove(event.getElement()); } } }); Composite selectComposite = new Composite(root, SWT.NONE); selectComposite.setLayout(new GridLayout(1, false)); Button selectAll = new Button(selectComposite, SWT.PUSH); selectAll.setImage(getLocalImage(IMG_CHECKBOX_SELECTED)); selectAll.setToolTipText("Select all"); selectAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { tv.setAllChecked(true); filesToBeGenerated.addAll(filesNotYetGenerated.keySet()); } }); Button deselectAll = new Button(selectComposite, SWT.PUSH); deselectAll.setImage(getLocalImage(IMG_CHECKBOX_UNSELECTED)); deselectAll.setToolTipText("Unselect all"); deselectAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { tv.setAllChecked(false); filesToBeGenerated.clear(); } }); return root; } private Image getLocalImage(String key) { if (registry == null) { Bundle b = FrameworkUtil.getBundle(getClass()); registry = new ImageRegistry(); registry.put(IMG_CHECKBOX_SELECTED, ImageDescriptor.createFromURL(b.getEntry(IMG_CHECKBOX_SELECTED))); registry.put(IMG_CHECKBOX_UNSELECTED, ImageDescriptor.createFromURL(b.getEntry(IMG_CHECKBOX_UNSELECTED))); } return registry.get(key); } public Collection<String> getFilesToBeGenerated() { return filesToBeGenerated; } }