/******************************************************************************* * Copyright (c) 2006 CEA List. * 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: * CEA List - initial API and implementation *******************************************************************************/ package org.eclipse.papyrus.extensionpoints.editors.ui; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.DocumentEvent; import org.eclipse.jface.text.IDocumentListener; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.jface.text.source.SourceViewer; import org.eclipse.papyrus.extensionpoints.editors.configuration.IDirectEditorConfiguration; import org.eclipse.papyrus.extensionpoints.editors.configuration.IDirectEditorConfiguration.Selection; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.custom.VerifyKeyListener; import org.eclipse.swt.events.VerifyEvent; import org.eclipse.swt.layout.FillLayout; 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.Group; import org.eclipse.swt.widgets.Shell; /** * Dialog used in for direct edition, when an extension is provided */ public class ExtendedDirectEditionDialog extends LabelEditorDialog { /** Title of the Dialog */ final private static String TITLE = "Edit Label"; /** Edited object */ protected Object editedObject; /** Document used by the dialog */ protected Document document; /** initial text value */ protected String value; /** extension configuration */ protected IDirectEditorConfiguration configuration; /** * Creates a new ExtendedDirectEditionDialog * * @param parentShell * the parent shell * @param parameter * the editedObject * @param initialValue * the initial text value */ public ExtendedDirectEditionDialog(Shell parentShell, Object object, String initialValue, IDirectEditorConfiguration configuration) { super(parentShell, TITLE, initialValue, configuration.getInputValidator()); this.editedObject = object; this.value = initialValue; this.configuration = configuration; } /** * {@inheritDoc} */ @Override protected Control createDialogArea(Composite parent) { Group composite = new Group(parent, SWT.RESIZE); composite.setText("Specification"); GridLayout layout = new GridLayout(); layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); composite.setLayout(layout); composite.setLayoutData(new GridData(GridData.FILL_BOTH)); Composite viewerGroup = new Composite(composite, SWT.RESIZE); FillLayout viewerLayout = new FillLayout(); viewerGroup.setLayout(viewerLayout); GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER); data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH); viewerGroup.setLayoutData(data); viewer = new SourceViewer(viewerGroup, null, SWT.BORDER | SWT.FILL_EVEN_ODD); // configure source viewer document = new Document(); document.set(value); // add completion processor key listener (ctrl+space keys) viewer.appendVerifyKeyListener(new LabelKeyListener(viewer)); document.addDocumentListener(new DocumentListener()); viewer.configure(configuration.getSourceViewerConfiguration()); viewer.setDocument(document); Selection selection = configuration.getTextSelection(value, editedObject); viewer.setSelectedRange(selection.getStart(), selection.getLentgh()); Composite extendedArea = configuration.createExtendedDialogArea(viewerGroup); if (extendedArea != null) { extendedArea.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); } errorMessageText = new CLabel(composite, SWT.READ_ONLY | SWT.SHADOW_NONE); errorMessageText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL)); errorMessageText.setBackground(errorMessageText.getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); // Set the error message text // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=66292 setErrorMessage(errorMessage); applyDialogFont(composite); return composite; } /** * */ private class LabelKeyListener implements VerifyKeyListener { /** * */ SourceViewer viewer; /** * Default constructor. * * @param viewer */ public LabelKeyListener(SourceViewer viewer) { this.viewer = viewer; } /* * (non-Javadoc) * * @see * org.eclipse.swt.custom.VerifyKeyListener#verifyKey(org.eclipse.swt.events.VerifyEvent) */ /** * * * @param event */ public void verifyKey(VerifyEvent event) { if ((event.stateMask == SWT.CTRL) && (event.character == ' ')) { if (viewer.canDoOperation(ISourceViewer.CONTENTASSIST_PROPOSALS)) { viewer.doOperation(ISourceViewer.CONTENTASSIST_PROPOSALS); } event.doit = false; } else if (event.character == SWT.CR) { event.doit = false; } } } /** * */ private class DocumentListener implements IDocumentListener { /** * * * @param event */ public void documentAboutToBeChanged(DocumentEvent event) { } /** * * * @param event */ public void documentChanged(DocumentEvent event) { validateInput(); } } }