/******************************************************************************* * Copyright (c) 2008 Olivier Moises * * 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: * Olivier Moises- initial API and implementation *******************************************************************************/ package org.eclipse.wazaabi.engine.swt.commons.views; import org.eclipse.emf.ecore.EClass; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.CoolItem; import org.eclipse.swt.widgets.ExpandItem; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.wazaabi.engine.core.editparts.LabelEditPart; import org.eclipse.wazaabi.engine.core.views.LabelView; import org.eclipse.wazaabi.engine.swt.commons.editparts.stylerules.managers.ImageRuleManager; import org.eclipse.wazaabi.mm.core.styles.BlankRule; import org.eclipse.wazaabi.mm.core.styles.HyperlinkRule; import org.eclipse.wazaabi.mm.core.styles.ImageRule; import org.eclipse.wazaabi.mm.core.styles.StringRule; import org.eclipse.wazaabi.mm.core.styles.StyleRule; import org.eclipse.wazaabi.mm.core.styles.StyledElement; import org.eclipse.wazaabi.mm.swt.descriptors.SWTDescriptorsPackage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SWTLabelView extends SWTControlView implements LabelView { private final Logger logger = LoggerFactory.getLogger(SWTLabelView.class); private Image image = null; public EClass getWidgetViewEClass() { return SWTDescriptorsPackage.Literals.LABEL; } protected Widget createSWTWidget(Widget parent, int swtStyle, int index) { StyleRule lookandfeel = ((StyledElement) getHost().getModel()) .getFirstStyleRule(LabelEditPart.LOOKANDFEEL_PROPERTY_NAME, null); Control label = null; if (lookandfeel instanceof HyperlinkRule) label = createLink((Composite) parent, computeSWTCreationStyle(getHost())); else label = createLabel((Composite) parent, computeSWTCreationStyle(getHost())); return wrapForSpecificParent((Composite) parent, label); } protected Control createLabel(Composite parent, int style) { return new Label((Composite) parent, style); } protected Control createLink(Composite parent, int style) { return new Link((Composite) parent, style); } public void setText(StringRule rule) { if (getSWTWidget() instanceof Label) setLabelText(rule, (Label) getSWTWidget()); else if (getSWTWidget() instanceof Link) setLinkText(rule, (Link) getSWTWidget()); } protected void setLabelText(StringRule rule, Label label) { if (label.isDisposed()) return; String currentText = label.getText(); if (rule == null) { if ("".equals(currentText)) //$NON-NLS-1$ return; else { label.setText(""); //$NON-NLS-1$ revalidate(); } } else { label.setText(rule.getValue() == null ? "" : rule.getValue()); //$NON-NLS-1$ revalidate(); } Item item = getSWTItem(); if (item != null) { Point size = label.computeSize(SWT.DEFAULT, SWT.DEFAULT); if (item instanceof ToolItem) ((ToolItem) item).setWidth(size.x); if (item instanceof CoolItem) ((CoolItem) item).setPreferredSize(((CoolItem) item) .computeSize(size.x, size.y)); if (item instanceof ExpandItem) ((ExpandItem) item).setHeight(label.computeSize(SWT.DEFAULT, SWT.DEFAULT).y); } } protected void setLinkText(StringRule rule, Link link) { if (link.isDisposed()) return; String currentText = link.getText(); if (rule == null) { if ("".equals(currentText)) //$NON-NLS-1$ return; else { link.setText(""); //$NON-NLS-1$ revalidate(); } } else { link.setText(rule.getValue() == null ? "" : rule.getValue()); //$NON-NLS-1$ revalidate(); } Item item = getSWTItem(); if (item != null) { Point size = link.computeSize(SWT.DEFAULT, SWT.DEFAULT); if (item instanceof ToolItem) ((ToolItem) item).setWidth(size.x); if (item instanceof CoolItem) ((CoolItem) item).setPreferredSize(((CoolItem) item) .computeSize(size.x, size.y)); if (item instanceof ExpandItem) ((ExpandItem) item).setHeight(link.computeSize(SWT.DEFAULT, SWT.DEFAULT).y); } } protected void setImage(ImageRule rule) { if (rule == null) if (image == null) return; else { logger.debug("disposing image from {}", System.identityHashCode(this)); image.dispose(); image = null; } else { Image newImage = ImageRuleManager.convertToPlatformSpecificObject( this, rule); if (image != null) { if (newImage != null && image.getImageData().equals(newImage.getImageData())) return; logger.debug("disposing image from {}", System.identityHashCode(this)); image.dispose(); } image = newImage; } ((Label) getSWTControl()).setImage(image); getSWTControl().update(); Item item = getSWTItem(); if (item != null) { Point size = ((Label) getSWTControl()).computeSize(SWT.DEFAULT, SWT.DEFAULT); if (item instanceof ToolItem) ((ToolItem) item).setWidth(size.x); if (item instanceof CoolItem) ((CoolItem) item).setPreferredSize(((CoolItem) item) .computeSize(size.x, size.y)); if (item instanceof ExpandItem) ((ExpandItem) item).setHeight(getSWTControl().computeSize( SWT.DEFAULT, SWT.DEFAULT).y); } logger.debug("set Image {}", image); revalidate(); } @Override public void updateStyleRule(StyleRule rule) { if (rule == null) return; if (LabelEditPart.TEXT_PROPERTY_NAME.equals(rule.getPropertyName())) { if (rule instanceof StringRule) setText((StringRule) rule); else if (rule instanceof BlankRule) setText(null); } else if (LabelEditPart.IMAGE_PROPERTY_NAME.equals(rule .getPropertyName())) { if (getSWTControl() instanceof Label) { if (rule instanceof ImageRule) setImage((ImageRule) rule); else setImage(null); } } else super.updateStyleRule(rule); } protected void widgetDisposed() { super.widgetDisposed(); if (image != null && !image.isDisposed()) { logger.debug("disposing image from {}", System.identityHashCode(this)); image.dispose(); } } @Override protected boolean needReCreateWidgetView(StyleRule rule, Widget widget) { if (rule == null) { return false; } if (LabelEditPart.LOOKANDFEEL_PROPERTY_NAME.equals(rule .getPropertyName())) { if (rule instanceof HyperlinkRule) { return true; } } return super.needReCreateWidgetView(rule, widget); } }