| /*******************************************************************************
|
| * Copyright (c) 2011, 2019 Mia-Software and others.
|
| * All rights reserved. This program and the accompanying materials
|
| * are made available under the terms of the Eclipse Public License v2.0
|
| * which accompanies this distribution, and is available at
|
| * http://www.eclipse.org/legal/epl-v20.html
|
| *
|
| * Contributors:
|
| * Nicolas Bros (Mia-Software) - initial API and implementation
|
| * Nicolas Guyomar (Mia-Software) - Bug 334546 - [celleditors] no border on Text field
|
| * Nicolas Bros (Mia-Software) - Bug 339664 - org.eclipse.modisco.facet.widgets.celleditors API cleaning
|
| * Nicolas Bros (Mia-Software) - Bug 334539 - [celleditors] change listener
|
| *******************************************************************************/ |
| package org.eclipse.modisco.facet.widgets.celleditors.internal.core.composite;
|
|
|
| import org.eclipse.core.resources.IResource;
|
| import org.eclipse.modisco.facet.widgets.celleditors.AbstractCellEditorComposite;
|
| import org.eclipse.swt.SWT;
|
| import org.eclipse.swt.events.DisposeEvent;
|
| import org.eclipse.swt.events.DisposeListener;
|
| import org.eclipse.swt.events.KeyAdapter;
|
| import org.eclipse.swt.events.KeyEvent;
|
| import org.eclipse.swt.events.ModifyEvent;
|
| import org.eclipse.swt.events.ModifyListener;
|
| 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.Display;
|
| import org.eclipse.swt.widgets.Event;
|
| import org.eclipse.swt.widgets.Listener;
|
| import org.eclipse.swt.widgets.Text;
|
|
|
| public abstract class AbstractIResourceComposite<T extends IResource> extends
|
| AbstractCellEditorComposite<T> {
|
|
|
| /** the control that is used to edit the contents of the cell */
|
| private final Button button;
|
| private Text text = null;
|
|
|
| private final Composite parentControl;
|
|
|
| public AbstractIResourceComposite(final Composite parent) {
|
| this(parent, SWT.NONE);
|
| }
|
|
|
| public AbstractIResourceComposite(final Composite parent, final int style) {
|
| super(parent);
|
| this.parentControl = parent;
|
|
|
| GridLayout gd = new GridLayout(2, false);
|
| gd.marginHeight = 0;
|
| gd.marginWidth = 0;
|
| gd.horizontalSpacing = 0;
|
| setLayout(gd);
|
|
|
| this.text = new Text(this, style);
|
| this.text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
|
| this.button = new Button(this, SWT.PUSH);
|
| this.button.setText("..."); //$NON-NLS-1$
|
| GridData data = new GridData(SWT.FILL, SWT.FILL, false, true);
|
| this.button.setLayoutData(data);
|
|
|
| this.button.addSelectionListener(new SelectionAdapter() {
|
| @Override
|
| public void widgetSelected(final SelectionEvent e) {
|
| browseResource();
|
| }
|
| });
|
|
|
| // commit the cell editor when the mouse is clicked
|
| // anywhere outside the text field
|
| final Listener clickListener = new Listener() {
|
| public void handleEvent(final Event event) {
|
| if (event.widget instanceof Control) {
|
| Control control = (Control) event.widget;
|
| if (control.getShell() == getParentControl().getShell()) {
|
| if (event.widget != getButton() && event.widget != getText()) {
|
| fireCommit();
|
| }
|
| }
|
| }
|
| }
|
| };
|
| Display.getDefault().addFilter(SWT.MouseDown, clickListener);
|
|
|
| // this listener is only here to remove
|
| // the other listener from the Display
|
| this.text.addDisposeListener(new DisposeListener() {
|
| public void widgetDisposed(final DisposeEvent e) {
|
| Display.getDefault().removeFilter(SWT.MouseDown, clickListener);
|
| }
|
| });
|
|
|
| this.text.addKeyListener(new KeyAdapter() {
|
| @Override
|
| public void keyPressed(final KeyEvent event) {
|
| // Enter key pressed
|
| if ((event.keyCode == SWT.CR && event.stateMask == 0)
|
| || (event.keyCode == SWT.KEYPAD_CR && event.stateMask == 0)) {
|
| fireCommit();
|
| } else if (event.keyCode == SWT.ESC && event.stateMask == 0) {
|
| // Escape key pressed
|
| close();
|
| }
|
| }
|
| });
|
|
|
| this.text.addModifyListener(new ModifyListener() {
|
| public void modifyText(final ModifyEvent e) {
|
| fireChanged();
|
| }
|
| });
|
|
|
| this.text.forceFocus();
|
| }
|
|
|
| protected Button getButton() {
|
| return this.button;
|
| }
|
|
|
| protected Text getText() {
|
| return this.text;
|
| }
|
|
|
| protected void commit() {
|
| fireCommit();
|
| }
|
|
|
| protected Composite getParentControl() {
|
| return this.parentControl;
|
| }
|
|
|
| public void setValue(final IResource value) {
|
| if (value != null) {
|
| this.text.setText(value.getFullPath().toString());
|
| } else {
|
| this.text.setText(""); //$NON-NLS-1$
|
| }
|
| }
|
|
|
| public abstract T getValue();
|
|
|
| protected abstract void browseResource();
|
|
|
| }
|