/*******************************************************************************
* 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.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.CoolItem;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.wazaabi.engine.core.editparts.AbstractButtonEditPart;
import org.eclipse.wazaabi.engine.core.editparts.PushButtonEditPart;
import org.eclipse.wazaabi.engine.core.views.AbstractButtonView;
import org.eclipse.wazaabi.engine.swt.commons.editparts.stylerules.managers.ImageRuleManager;
import org.eclipse.wazaabi.mm.core.styles.BooleanRule;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
public abstract class AbstractSWTButtonView extends SWTControlView implements
AbstractButtonView {
private Image image = null;
private final Logger logger = LoggerFactory
.getLogger(AbstractSWTButtonView.class);
protected Widget createSWTWidget(Widget parent, int swtStyle, int index) {
return wrapForSpecificParent(
(Composite) parent,
createButton((Composite) parent,
computeSWTCreationStyle(getHost())));
}
protected Button createButton(Composite parent, int style) {
return new Button(parent, style);
}
protected void setText(StringRule rule) {
String currentText = ((Button) getSWTControl()).getText();
if (rule == null) {
if ("".equals(currentText)) //$NON-NLS-1$
return;
else {
((Button) getSWTControl()).setText(""); //$NON-NLS-1$
revalidate();
}
} else {
((Button) getSWTControl())
.setText(rule.getValue() == null ? "" : rule.getValue()); //$NON-NLS-1$
revalidate();
}
if (getSWTItem() != null) {
Point size = ((Button) getSWTControl()).computeSize(SWT.DEFAULT,
SWT.DEFAULT);
if (getSWTItem() instanceof ToolItem)
((ToolItem) getSWTItem()).setWidth(size.x);
if (getSWTItem() instanceof CoolItem)
((CoolItem) getSWTItem())
.setPreferredSize(((CoolItem) getSWTItem())
.computeSize(size.x, size.y));
}
}
protected void setImage(ImageRule rule) {
if (rule == null)
if (image == null)
return;
else {
logger.debug("disposing image of {}", 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 of {}", this);
image.dispose();
}
image = newImage;
}
((Button) getSWTControl()).setImage(image);
getSWTControl().update();
logger.debug("setImage {}", image);
revalidate();
}
@Override
public void updateStyleRule(StyleRule rule) {
if (rule == null)
return;
if (PushButtonEditPart.TEXT_PROPERTY_NAME
.equals(rule.getPropertyName()))
if (rule instanceof StringRule)
setText((StringRule) rule);
else
setText(null);
else if (PushButtonEditPart.IMAGE_PROPERTY_NAME.equals(rule
.getPropertyName()))
if (rule instanceof ImageRule)
setImage((ImageRule) rule);
else
setImage(null);
else
super.updateStyleRule(rule);
}
protected int computeSWTCreationStyle(StyleRule rule) {
final String propertyName = rule.getPropertyName();
if (AbstractButtonEditPart.FLAT_PROPERTY_NAME.equals(propertyName)
&& ((BooleanRule) rule).isValue())
return SWT.FLAT;
return super.computeSWTCreationStyle(rule);
}
@Override
protected boolean needReCreateWidgetView(StyleRule styleRule,
org.eclipse.swt.widgets.Widget widget) {
if (styleRule == null)
return false;
if (AbstractButtonEditPart.FLAT_PROPERTY_NAME.equals(styleRule
.getPropertyName()) && styleRule instanceof BooleanRule) {
return !(isStyleBitCorrectlySet(widget, org.eclipse.swt.SWT.FLAT,
((BooleanRule) styleRule).isValue()));
} else
return super.needReCreateWidgetView(styleRule, widget);
}
protected void widgetDisposed() {
super.widgetDisposed();
if (image != null && !image.isDisposed()) {
logger.debug("disposing image of {}", this);
image.dispose();
}
}
}