/*
* Copyright (c) 2008 Stiftung Deutsches Elektronen-Synchrotron, Member of the Helmholtz
* Association, (DESY), HAMBURG, GERMANY. THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN
* "../AS IS" BASIS. WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO
* EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
* THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE IN
* ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS
* DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY SOFTWARE IS
* AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
* SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. THE FULL LICENSE SPECIFYING FOR THE SOFTWARE
* THE REDISTRIBUTION, MODIFICATION, USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE
* DISTRIBUTION OF THIS PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY
* FIND A COPY AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
*/
package org.csstudio.sds.components.ui.internal.editparts;
import org.csstudio.sds.components.ui.internal.figures.RefreshableLabelFigure;
import org.csstudio.sds.model.AbstractWidgetModel;
import org.csstudio.sds.model.LabelModel;
import org.csstudio.sds.model.commands.SetPropertyCommand;
import org.csstudio.sds.ui.editparts.ExecutionMode;
import org.csstudio.sds.ui.editparts.IWidgetPropertyChangeHandler;
import org.csstudio.sds.ui.figures.ITextFigure;
import org.csstudio.ui.util.CustomMediaFactory;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
/**
* EditPart controller for the label widget.
*
* @author jbercic
*/
public final class LabelEditPart extends AbstractTextTypeWidgetEditPart {
/**
* Returns the casted model. This is just for convenience.
*
* @return the casted {@link LabelModel}
*/
@Override
protected LabelModel getCastedModel() {
return (LabelModel) getModel();
}
/**
* {@inheritDoc}
*/
@Override
protected IFigure doCreateFigure() {
LabelModel model = getCastedModel();
// create AND initialize the view properly
final RefreshableLabelFigure refreshableFigure = new RefreshableLabelFigure();
refreshableFigure.setFont(getModelFont(LabelModel.PROP_FONT));
refreshableFigure.setTextAlignment(model.getTextAlignment());
refreshableFigure.setTransparent(model.getTransparent());
refreshableFigure.setRotation(model.getRotation());
refreshableFigure.setXOff(model.getXOff());
refreshableFigure.setYOff(model.getYOff());
refreshableFigure.setTextValue(determineLabel(null));
return refreshableFigure;
}
/**
* {@inheritDoc}
*/
@Override
protected void registerPropertyChangeHandlers() {
super.registerPropertyChangeHandlers();
registerTextvaluePropertyChangeHandlers();
registerFontPropertyChangeHandlers();
registerTextAlignPropertyChangeHandlers();
registerTextTransparentPropertyChangeHandlers();
registerTextRotationPropertyChangeHandlers();
registerXOffPropertyChangeHandlers();
registerYOffPropertyChangeHandlers();
}
private void registerYOffPropertyChangeHandlers() {
// changes to the y offset property
IWidgetPropertyChangeHandler handle = new IWidgetPropertyChangeHandler() {
@Override
public boolean handleChange(final Object oldValue,
final Object newValue,
final IFigure refreshableFigure) {
RefreshableLabelFigure labelFigure = (RefreshableLabelFigure) refreshableFigure;
labelFigure.setYOff((Integer) newValue);
return true;
}
};
setPropertyChangeHandler(LabelModel.PROP_YOFF, handle);
}
private void registerXOffPropertyChangeHandlers() {
// changes to the x offset property
IWidgetPropertyChangeHandler handle = new IWidgetPropertyChangeHandler() {
@Override
public boolean handleChange(final Object oldValue,
final Object newValue,
final IFigure refreshableFigure) {
RefreshableLabelFigure labelFigure = (RefreshableLabelFigure) refreshableFigure;
labelFigure.setXOff((Integer) newValue);
return true;
}
};
setPropertyChangeHandler(LabelModel.PROP_XOFF, handle);
}
/**
*
*/
private void registerTextRotationPropertyChangeHandlers() {
// changes to the text rotation property
IWidgetPropertyChangeHandler handle = new IWidgetPropertyChangeHandler() {
@Override
public boolean handleChange(final Object oldValue,
final Object newValue,
final IFigure refreshableFigure) {
RefreshableLabelFigure labelFigure = (RefreshableLabelFigure) refreshableFigure;
labelFigure.setRotation((Double) newValue);
return true;
}
};
setPropertyChangeHandler(LabelModel.PROP_TEXT_ROTATION, handle);
}
private void registerTextTransparentPropertyChangeHandlers() {
// changes to the transparency property
IWidgetPropertyChangeHandler handle = new IWidgetPropertyChangeHandler() {
@Override
public boolean handleChange(final Object oldValue,
final Object newValue,
final IFigure refreshableFigure) {
RefreshableLabelFigure labelFigure = (RefreshableLabelFigure) refreshableFigure;
labelFigure.setTransparent((Boolean) newValue);
return true;
}
};
setPropertyChangeHandler(LabelModel.PROP_TRANSPARENT, handle);
}
private void registerTextAlignPropertyChangeHandlers() {
// changes to the text alignment property
IWidgetPropertyChangeHandler handle = new IWidgetPropertyChangeHandler() {
@Override
public boolean handleChange(final Object oldValue,
final Object newValue,
final IFigure refreshableFigure) {
RefreshableLabelFigure labelFigure = (RefreshableLabelFigure) refreshableFigure;
labelFigure.setTextAlignment((Integer) newValue);
return true;
}
};
setPropertyChangeHandler(LabelModel.PROP_TEXT_ALIGN, handle);
}
private void registerFontPropertyChangeHandlers() {
// changes to the font property
setPropertyChangeHandler(LabelModel.PROP_FONT,
new FontChangeHandler<RefreshableLabelFigure>() {
@Override
protected void doHandle(final RefreshableLabelFigure refreshableFigure,
final Font font) {
refreshableFigure.setFont(font);
}
});
}
private void registerTextvaluePropertyChangeHandlers() {
// Text
IWidgetPropertyChangeHandler labelHandler = new IWidgetPropertyChangeHandler() {
@Override
public boolean handleChange(final Object oldValue,
final Object newValue, final IFigure refreshableFigure) {
ITextFigure textFigure = (ITextFigure) refreshableFigure;
textFigure.setTextValue(determineLabel(null));
return true;
}
};
setPropertyChangeHandler(LabelModel.PROP_TEXTVALUE, labelHandler);
setPropertyChangeHandler(LabelModel.PROP_TEXT_UNIT, labelHandler);
}
/**
* {@inheritDoc}
*/
@Override
public void performRequest(final Request req) {
Object type = req.getType();
// entering a value is only allowed in run mode and when the widget is
// enabled
if ( (type != null)
&& (type.equals(RequestConstants.REQ_OPEN) || type
.equals(RequestConstants.REQ_DIRECT_EDIT))) {
if ( (getExecutionMode() == ExecutionMode.RUN_MODE) && getCastedModel().isAccesible()) {
super.performRequest(req);
} else if (getExecutionMode() == ExecutionMode.EDIT_MODE) {
performEditTextValue();
}
}
}
private void performEditTextValue() {
CellEditor cellEditor = createCellEditor2();
locateCellEditor(cellEditor);
cellEditor.activate();
cellEditor.setFocus();
}
private CellEditor createCellEditor2() {
final CellEditor result = new TextCellEditor((Composite) getViewer().getControl());
// init cell editor...
String currentValue = "N/A"; //$NON-NLS-1$
currentValue = getWidgetModel().getStringProperty(LabelModel.PROP_TEXTVALUE);
result.setValue(currentValue);
final Text text = (Text) result.getControl();
// input text
text.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(final KeyEvent e) {
if ( (e.keyCode == SWT.CR) || (e.keyCode == SWT.KEYPAD_CR)) {
SetPropertyCommand setPropertyCommand = new SetPropertyCommand(getWidgetModel(), LabelModel.PROP_TEXTVALUE, text.getText());
getViewer().getEditDomain().getCommandStack().execute(setPropertyCommand);
} else if (e.keyCode == SWT.ESC) {
result.deactivate();
}
}
});
text.setForeground(getModelColor(AbstractWidgetModel.PROP_COLOR_FOREGROUND));
text.setFont(getModelFont(LabelModel.PROP_FONT));
// calculate the chosen background color
RGB backgroundRgb = getModelColor(AbstractWidgetModel.PROP_COLOR_BACKGROUND).getRGB();
int red = Math.min(backgroundRgb.red + INPUT_FIELD_BRIGHTNESS, 255);
int green = Math.min(backgroundRgb.green + INPUT_FIELD_BRIGHTNESS, 255);
int blue = Math.min(backgroundRgb.blue + INPUT_FIELD_BRIGHTNESS, 255);
Color backgroundColor = CustomMediaFactory.getInstance()
.getColor(new RGB(red, green, blue));
text.setBackground(backgroundColor);
text.selectAll();
return result;
}
/**
* Locate the given cell editor .
*
* @param cellEditor A cell editor.
*/
private void locateCellEditor(final CellEditor cellEditor) {
Rectangle rect = LabelEditPart.this.figure.getBounds().getCopy();
rect.x = rect.x + FRAME_WIDTH;
rect.y = rect.y + FRAME_WIDTH;
rect.height = rect.height - (FRAME_WIDTH * 1);
rect.width = rect.width - (FRAME_WIDTH * 1);
getFigure().translateToAbsolute(rect);
cellEditor.getControl().setBounds(rect.x, rect.y, rect.width, rect.height);
cellEditor.getControl().setLayoutData(new GridData(SWT.CENTER));
cellEditor.getControl().setVisible(true);
}
/**
* {@inheritDoc}
*/
@Override
protected String determineLabel(final String updatedPropertyId) {
String determineLabel = super.determineLabel(updatedPropertyId);
LabelModel model = getCastedModel();
String egu = handleText(updatedPropertyId, model, model.getStringProperty(LabelModel.PROP_TEXT_UNIT), "");
if((determineLabel!=null)&&!determineLabel.isEmpty()&&(egu!=null)&&!egu.isEmpty()) {
return determineLabel+" "+egu;
}
return determineLabel+egu;
}
}