/****************************************************************************** * Copyright (c) 2002, 2004 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation ****************************************************************************/ package org.yakindu.base.xtext.utils.gmf.viewers; import org.yakindu.base.xtext.utils.jface.viewers.XtextStyledTextCellEditor; import org.yakindu.base.xtext.utils.jface.viewers.context.IXtextFakeContextResourcesProvider; import com.google.inject.Injector; /** * This is a copy of TextCellEditorEx, only the super class has been changed to * {@link XtextStyledTextCellEditor} * * @author andreas muelder * */ public class XtextStyledTextCellEditorEx extends XtextStyledTextCellEditor { private Object originalValue; private boolean deactivationLock = false; public XtextStyledTextCellEditorEx(int style, Injector injector, IXtextFakeContextResourcesProvider contextResourcesProvider) { super(style, injector, contextResourcesProvider); } public XtextStyledTextCellEditorEx(int style, Injector injector) { super(style, injector); } /** * This will be used when an edit has occurred by a ModifyEvent has been * been send. Will call #setValue(Object) but will also call * editOccured(null) to make sure that the dirty flag is set probably and * that any listeners are informed about the changed. * * @param value * Value to set the cell editor to. * * Note: This happens address defect RATLC00522324. For our * topgraphical edit parts we delagate the direct edit request to * a primary edit part and set focus on that. The issue is that * if the user has typed in an initial character when setting * focus to the edit part, which typically is a * TextCompartmentEditPart then setting that intial value does * not fire the necessary change events that need to occur in * order for that value to be recongnized. If you don't use this * method then the result is that if you just type in the initial * character and that is it then the text compartment loses focus * then the value will not be saved. This is because setting the * value of the cell doesn't think its value has changed since * the first character is not recongized as a change. */ public void setValueAndProcessEditOccured(Object value) { setValue(value); // do the processing to ensure if we exit the cell then // value will be applied. editOccured(null); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.CellEditor#doSetValue(java.lang.Object) */ @Override protected void doSetValue(Object value) { if (originalValue == null) originalValue = value; super.doSetValue(value); } /** * @return boolean value specifying whether or not the value has been * changed */ public boolean hasValueChanged() { if (getValue() == null) return originalValue != null; return !getValue().equals(originalValue); } /* * Runs super deactivate unless it has been locked and otherwise unlocks * deactivation * * @see org.eclipse.jface.viewers.CellEditor#deactivate() */ @Override public void deactivate() { if (!isDeactivationLocked()) super.deactivate(); setDeactivationLock(false); } /** * Returns true if deactivation has been locked * * @return */ public boolean isDeactivationLocked() { return deactivationLock; } /** * Sets deactivation lock so that the cell editor does not perform * deactivate * * @param deactivationLock */ public void setDeactivationLock(boolean deactivationLock) { this.deactivationLock = deactivationLock; } }