// ============================================================================
//
// Copyright (C) 2006-2012 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.designer.core.ui.editor.nodes;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.ui.PlatformUI;
import org.talend.commons.ui.utils.workbench.gef.SimpleHtmlCellEditorLocator;
import org.talend.commons.ui.utils.workbench.gef.SimpleHtmlFigure;
import org.talend.commons.ui.utils.workbench.gef.SimpleHtmlTextEditManager;
import org.talend.core.GlobalServiceRegister;
import org.talend.core.ui.ISQLBuilderService;
import org.talend.designer.core.model.components.EParameterName;
import org.talend.designer.core.ui.editor.process.ProcessPart;
import org.talend.designer.core.ui.editor.subjobcontainer.SubjobContainerPart;
import org.talend.designer.core.ui.views.properties.ComponentSettingsView;
/**
* Graphical part of the node label of Gef. <br/>
*
* $Id: NodeLabelEditPart.java 77219 2012-01-24 01:14:15Z mhirt $
*
*/
public class NodeLabelEditPart extends AbstractGraphicalEditPart implements PropertyChangeListener {
SimpleHtmlTextEditManager manager = null;
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#activate()
*/
@Override
public void activate() {
if (!isActive()) {
super.activate();
((NodeLabel) getModel()).addPropertyChangeListener(this);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getAdapter(java.lang.Class)
*/
@Override
public Object getAdapter(final Class key) {
return super.getAdapter(key);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#deactivate()
*/
@Override
public void deactivate() {
if (isActive()) {
super.deactivate();
((NodeLabel) getModel()).removePropertyChangeListener(this);
manager = null;
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
*/
@Override
public IFigure createFigure() {
String text = ((NodeLabel) getModel()).getLabelText();
SimpleHtmlFigure htmlFig = new SimpleHtmlFigure();
htmlFig.setText(text);
if (((NodeLabel) getModel()).isActivate()) {
(htmlFig).setAlpha(-1);
} else {
(htmlFig).setAlpha(NodeLabel.ALPHA_VALUE);
}
((NodeLabel) getModel()).setLabelSize(htmlFig.getPreferredSize());
return htmlFig;
}
/*
* (non-Javadoc)
*
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
public void propertyChange(final PropertyChangeEvent evt) {
String request = evt.getPropertyName();
if (request.equals(NodeLabel.OFFSET_CHANGE)) { //$NON-NLS-1$ //$NON-NLS-2$
refreshVisuals();
getParent().refresh();
}
if (request.equals(NodeLabel.TEXT_CHANGE)) {
refreshVisuals();
// set the new size to update the node container
((NodeLabel) getModel()).setLabelSize(((SimpleHtmlFigure) figure).getPreferredSize());
NodeLabel label = (NodeLabel) getModel();
if (GlobalServiceRegister.getDefault().isServiceRegistered(ISQLBuilderService.class)) {
ISQLBuilderService service = (ISQLBuilderService) GlobalServiceRegister.getDefault().getService(
ISQLBuilderService.class);
service.updateSqlBuilderDialogTitle(label.getLabelText(), label.getNode().getProcess().getName(), label.getNode()
.getUniqueName());
}
getParent().refresh();
// refresh the title of component setting view.
ComponentSettingsView viewer = (ComponentSettingsView) PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().findView(ComponentSettingsView.ID);
if (viewer != null) {
viewer.updatePropertiesViewerTitle();
}
}
if (request.equals(NodeLabel.LOCATION)) { //$NON-NLS-1$
refreshVisuals();
getParent().refresh();
}
if (request.equals(EParameterName.ACTIVATE.getName())) {
if (((NodeLabel) getModel()).isActivate()) {
((SimpleHtmlFigure) figure).setAlpha(-1);
((SimpleHtmlFigure) figure).repaint();
refreshVisuals();
} else {
((SimpleHtmlFigure) figure).setAlpha(Node.ALPHA_VALUE);
((SimpleHtmlFigure) figure).repaint();
refreshVisuals();
}
}
EditPart editPart = getParent();
if (editPart != null) {
while ((!(editPart instanceof ProcessPart)) && (!(editPart instanceof SubjobContainerPart))) {
editPart = editPart.getParent();
}
if (editPart instanceof SubjobContainerPart) {
editPart.refresh();
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
*/
@Override
public void createEditPolicies() {
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new NodeTextEditPolicy());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getDragTracker(org.eclipse.gef.Request)
*/
@Override
public DragTracker getDragTracker(final Request request) {
return new NodeTextTracker(this, this.getParent());
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals()
*/
@Override
protected void refreshVisuals() {
Node node = ((NodeLabel) getModel()).getNode();
// Node node = ((NodeContainer) ((NodeContainerPart) getParent()).getModel()).getNode();
String text = ((NodeLabel) getModel()).getLabelText();
SimpleHtmlFigure htmlFig = (SimpleHtmlFigure) this.getFigure();
htmlFig.setText(text);
Point loc = node.getLocation().getCopy();
Point offset = ((NodeLabel) getModel()).getOffset();
Point textOffset = new Point();
Dimension size = htmlFig.getPreferredSize();
textOffset.y = node.getSize().height;
textOffset.x = (node.getSize().width - size.width) / 2;
((NodeLabel) getModel()).setTextOffset(textOffset);
loc.translate(textOffset.x + offset.x, textOffset.y + offset.y);
Rectangle rectangle = new Rectangle(loc, size);
((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), rectangle);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#performRequest(org.eclipse.gef.Request)
*/
@Override
public void performRequest(final Request request) {
if (request.getType() == RequestConstants.REQ_DIRECT_EDIT) {
performDirectEdit();
}
}
/**
* Start the manager to edit the label.
*/
private void performDirectEdit() {
if (manager == null) {
manager = new SimpleHtmlTextEditManager(this, TextCellEditor.class, new SimpleHtmlCellEditorLocator(
(SimpleHtmlFigure) this.getFigure()));
}
String label = (String) ((NodeLabel) getModel()).getPropertyValue(EParameterName.LABEL.getName());
manager.setLabelText(label);
manager.show();
}
/**
* yzhang Comment method "getDirectEditManager".
*
* @return
*/
public SimpleHtmlTextEditManager getDirectEditManager() {
return this.manager;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.editparts.AbstractEditPart#setSelected(int)
*/
@Override
@SuppressWarnings("unchecked")//$NON-NLS-1$
public void setSelected(final int value) {
if (value != SELECTED_NONE) {
List<EditPart> listEditParts = this.getViewer().getSelectedEditParts();
if (listEditParts.size() != 1) {
// getParent().removeEditPolicy(EditPolicy.LAYOUT_ROLE);
} else {
// getParent().installEditPolicy(EditPolicy.LAYOUT_ROLE, new NodeContainerLayoutEditPolicy());
super.setSelected(value);
}
} else {
getParent().removeEditPolicy(EditPolicy.LAYOUT_ROLE);
super.setSelected(value);
}
}
@Override
public boolean isSelectable() {
return (!((NodeLabel) getModel()).getNode().isReadOnly()) || (this.getViewer().getSelection().isEmpty());
}
}