/** * <copyright> * * Copyright (c) 2016 Thales Global Services S.A.S. * 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: * Thales Global Services S.A.S. - initial API and implementation * * </copyright> */ package org.eclipse.emf.diffmerge.ui.viewers; import org.eclipse.emf.diffmerge.ui.Messages; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Shell; /** * A dialog for setting up difference categories. * @author Olivier Constant */ public class CategoryDialog extends MessageDialog { /** The non-null input */ protected final CategoryViewer.Input _input; /** The initially null reset button */ protected Button _resetButton; /** * Constructor * @param parentShell_p a non-null shell * @param node_p a non-null diff node */ public CategoryDialog(Shell parentShell_p, EMFDiffNode node_p) { super(parentShell_p, Messages.CategoryDialog_Header, null, Messages.CategoryDialog_Description, MessageDialog.NONE, new String[] { Messages.CategoryDialog_ApplyLabel, IDialogConstants.OK_LABEL, IDialogConstants.CANCEL_LABEL }, 1); _input = new CategoryViewer.Input(node_p); _resetButton = null; setShellStyle(SWT.CLOSE | SWT.MODELESS | SWT.BORDER | SWT.TITLE | SWT.RESIZE); setBlockOnOpen(false); } /** * @see org.eclipse.jface.dialogs.MessageDialog#buttonPressed(int) */ @Override protected void buttonPressed(int buttonId_p) { switch (buttonId_p) { case 0: // Apply button: Do not close dialog _input.applyChanges(); break; case 1: // OK button: Apply and close _input.applyChanges(); //$FALL-THROUGH$ default: super.buttonPressed(buttonId_p); } } /** * @see org.eclipse.jface.dialogs.IconAndMessageDialog#createButtonBar(org.eclipse.swt.widgets.Composite) */ @Override protected Control createButtonBar(Composite parent_p) { Control result = super.createButtonBar(parent_p); getCustomOKButton().setEnabled(false); getCustomApplyButton().setEnabled(false); // Sizing the reset button according to the other buttons GridData resetButtonData = (GridData)_resetButton.getLayoutData(); Object okButtonDataRaw = getCustomOKButton().getLayoutData(); if (okButtonDataRaw instanceof GridData) { GridData okButtonData = (GridData)okButtonDataRaw; resetButtonData.widthHint = okButtonData.widthHint; _resetButton.getParent().layout(); } return result; } /** * @see MessageDialog#createCustomArea(Composite) */ @Override protected Control createCustomArea(Composite parent_p) { // Main viewer CategoryViewer viewer = new CategoryViewer(parent_p); _input.addPropertyChangeListener(new IPropertyChangeListener() { /** * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent) */ public void propertyChange(PropertyChangeEvent event_p) { if (CategoryViewer.Input.PROPERTY_HAS_CHANGES.equals(event_p.getProperty())) { // Update buttons according to the current changes boolean unappliedChanges = ((Boolean)event_p.getNewValue()).booleanValue(); getCustomOKButton().setEnabled(unappliedChanges); getCustomApplyButton().setEnabled(unappliedChanges); } } }); Control result = viewer.getControl(); result.addDisposeListener(new DisposeListener() { /** * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent) */ public void widgetDisposed(DisposeEvent e_p) { _input.removePropertyChangeListeners(); } }); // Reset button _resetButton = new Button(parent_p, SWT.PUSH); _resetButton.setText(Messages.CategoryDialog_ResetButton); GridData resetButtonData = new GridData(SWT.RIGHT, SWT.CENTER, false, false); _resetButton.setLayoutData(resetButtonData); _resetButton.addSelectionListener(new SelectionAdapter() { /** * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent) */ @Override public void widgetSelected(SelectionEvent e_p) { _input.resetToDefault(); } }); viewer.setInput(_input); return result; } /** * Return the Apply button, given its specific location in this dialog */ protected Button getCustomApplyButton() { return getButton(0); } /** * Return the OK button, given its specific location in this dialog */ protected Button getCustomOKButton() { return getButton(1); } }