// ============================================================================ // // Copyright (C) 2006-2012 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.core.ui.context; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.jdt.internal.ui.workingsets.WorkingSetMessages; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.ui.dialogs.SelectionDialog; /** * A dialog that configure the object value sets. * * @param <B> */ public abstract class ObjectSelectionDialog<B> extends SelectionDialog { private LabelProvider labelProvider = null; private List<B> data; private List removeDataIter; protected TableViewer fTableViewer; private Button fNewButton; private Button fEditButton; protected Button fRemoveButton; private Button fUpButton; private Button fDownButton; protected Button fSelectAll; protected Button fDeselectAll; private Label msgLabel; private int nextButtonId = IDialogConstants.CLIENT_ID + 1; @SuppressWarnings("restriction") public ObjectSelectionDialog(Shell parentShell, String title, String message, LabelProvider labelProvider) { super(parentShell); setTitle(title); setMessage(message); this.labelProvider = labelProvider; setShellStyle(getShellStyle() | SWT.RESIZE); } public void setLabelProvider(LabelProvider labelProvider) { this.labelProvider = labelProvider; } public void setData(List<B> data) { this.data = data; } /** * {@inheritDoc} */ @Override protected Control createContents(Composite parent) { Control control = super.createContents(parent); updateButtonAvailability(); return control; } /** * {@inheritDoc} */ @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); composite.setFont(parent.getFont()); msgLabel = createMessageArea(composite); // createRemoveArea(composite); Composite inner = new Composite(composite, SWT.NONE); inner.setFont(composite.getFont()); inner.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 0; layout.marginWidth = 0; inner.setLayout(layout); createTableViewer(inner); createOrderButtons(inner); createModifyButtons(composite); initTableInput(); return composite; } protected void initTableInput() { fTableViewer.setInput(data); } protected void createTableViewer(Composite parent) { fTableViewer = new TableViewer(parent); initTableViewer(parent); } /** * DOC chuang Comment method "initTableViewer". * * @param parent */ protected void initTableViewer(Composite parent) { fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { updateButtonAvailability(); } }); GridData data = new GridData(GridData.FILL_BOTH); data.heightHint = convertHeightInCharsToPixels(20); data.widthHint = convertWidthInCharsToPixels(50); fTableViewer.getTable().setLayoutData(data); fTableViewer.getTable().setFont(parent.getFont()); fTableViewer.setLabelProvider(labelProvider); fTableViewer.setContentProvider(new ArrayContentProvider()); } private void createModifyButtons(Composite composite) { Composite buttonComposite = new Composite(composite, SWT.RIGHT); GridLayout layout = new GridLayout(); layout.numColumns = 2; buttonComposite.setLayout(layout); GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.GRAB_HORIZONTAL); data.grabExcessHorizontalSpace = true; composite.setData(data); fNewButton = createButton(buttonComposite, nextButtonId++, WorkingSetMessages.WorkingSetConfigurationDialog_new_label, false); fNewButton.setFont(composite.getFont()); fNewButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { createElement(); } }); fEditButton = createButton(buttonComposite, nextButtonId++, WorkingSetMessages.WorkingSetConfigurationDialog_edit_label, false); fEditButton.setFont(composite.getFont()); fEditButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { editSelectedElement(); } }); fRemoveButton = createButton(buttonComposite, nextButtonId++, WorkingSetMessages.WorkingSetConfigurationDialog_remove_label, false); fRemoveButton.setFont(composite.getFont()); fRemoveButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { removeSelectedContexts(); } }); } protected void createOrderButtons(Composite parent) { Composite buttons = new Composite(parent, SWT.NONE); buttons.setFont(parent.getFont()); buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL)); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; buttons.setLayout(layout); fUpButton = new Button(buttons, SWT.PUSH); fUpButton.setText(WorkingSetMessages.WorkingSetConfigurationDialog_up_label); fUpButton.setFont(parent.getFont()); setButtonLayoutData(fUpButton); fUpButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { moveUp(((IStructuredSelection) fTableViewer.getSelection()).toList()); } }); fDownButton = new Button(buttons, SWT.PUSH); fDownButton.setText(WorkingSetMessages.WorkingSetConfigurationDialog_down_label); fDownButton.setFont(parent.getFont()); setButtonLayoutData(fDownButton); fDownButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { moveDown(((IStructuredSelection) fTableViewer.getSelection()).toList()); } }); fSelectAll = new Button(buttons, SWT.PUSH); fSelectAll.setText(WorkingSetMessages.WorkingSetConfigurationDialog_selectAll_label); fSelectAll.setFont(parent.getFont()); setButtonLayoutData(fSelectAll); fSelectAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { selectAll(); } }); fDeselectAll = new Button(buttons, SWT.PUSH); fDeselectAll.setText(WorkingSetMessages.WorkingSetConfigurationDialog_deselectAll_label); fDeselectAll.setFont(parent.getFont()); setButtonLayoutData(fDeselectAll); fDeselectAll.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { deselectAll(); } }); } /** * {@inheritDoc} */ @Override protected void okPressed() { List<B> newResult = getData(); setResult(newResult); super.okPressed(); } public List<B> getData() { return data; } public IStructuredSelection getSelection() { return ((IStructuredSelection) fTableViewer.getSelection()); } public List getRemoveData() { return this.removeDataIter; } protected abstract void createElement(); protected abstract void editSelectedElement(); /** * Removes the selected working sets from the workbench. */ protected void removeSelectedContexts() { ISelection selection = fTableViewer.getSelection(); if (selection instanceof IStructuredSelection) { Iterator<B> iter = ((IStructuredSelection) selection).iterator(); removeDataIter = new ArrayList(); while (iter.hasNext()) { Object obj = iter.next(); data.remove(obj); removeDataIter.add(obj); } } refreshViewer(); } /** * bqian Comment method "refreshViewer". */ public void refreshViewer() { fTableViewer.refresh(); } /** * Updates the modify buttons' enabled state based on the current seleciton. */ protected void updateButtonAvailability() { IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection(); boolean hasSelection = !selection.isEmpty(); boolean hasSingleSelection = selection.size() == 1; fEditButton.setEnabled(hasSingleSelection); if (fUpButton != null) { fUpButton.setEnabled(canMoveUp()); } if (fDownButton != null) { fDownButton.setEnabled(canMoveDown()); } fRemoveButton.setEnabled(hasSelection); } protected void setDisplayMessage(String msg) { msgLabel.setText(msg); } private void moveUp(List toMoveUp) { if (toMoveUp.size() > 0) { setElements(moveUp(data, toMoveUp)); fTableViewer.reveal(toMoveUp.get(0)); } } private void moveDown(List toMoveDown) { if (toMoveDown.size() > 0) { setElements(reverse(moveUp(reverse(data), toMoveDown))); fTableViewer.reveal(toMoveDown.get(toMoveDown.size() - 1)); } } private void setElements(List elements) { data = elements; fTableViewer.setInput(data); updateButtonAvailability(); } private List moveUp(List elements, List move) { int nElements = elements.size(); List res = new ArrayList(nElements); Object floating = null; for (int i = 0; i < nElements; i++) { Object curr = elements.get(i); if (move.contains(curr)) { res.add(curr); } else { if (floating != null) { res.add(floating); } floating = curr; } } if (floating != null) { res.add(floating); } return res; } private List reverse(List p) { List reverse = new ArrayList(p.size()); for (int i = p.size() - 1; i >= 0; i--) { reverse.add(p.get(i)); } return reverse; } private boolean canMoveUp() { int[] indc = fTableViewer.getTable().getSelectionIndices(); for (int i = 0; i < indc.length; i++) { if (indc[i] != i) { return true; } } return false; } private boolean canMoveDown() { int[] indc = fTableViewer.getTable().getSelectionIndices(); int k = data.size() - 1; for (int i = indc.length - 1; i >= 0; i--, k--) { if (indc[i] != k) { return true; } } return false; } // ---- select / deselect -------------------------------------------------- private void selectAll() { fTableViewer.setSelection(new StructuredSelection(data)); } private void deselectAll() { fTableViewer.setSelection(StructuredSelection.EMPTY); } }