/*******************************************************************************
* Copyright (c) 2010, 2015 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.eclipse.e4.ui.css.swt.properties.css2;
import org.eclipse.e4.ui.css.core.dom.properties.css2.AbstractCSSPropertyMarginHandler;
import org.eclipse.e4.ui.css.core.dom.properties.css2.ICSSPropertyMarginHandler;
import org.eclipse.e4.ui.css.core.engine.CSSEngine;
import org.eclipse.e4.ui.css.swt.CSSSWTConstants;
import org.eclipse.e4.ui.css.swt.helpers.SWTElementHelpers;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Widget;
import org.w3c.css.sac.CSSException;
import org.w3c.dom.css.CSSPrimitiveValue;
import org.w3c.dom.css.CSSValue;
import org.w3c.dom.css.CSSValueList;
public class CSSPropertyMarginSWTHandler extends
AbstractCSSPropertyMarginHandler {
public final static ICSSPropertyMarginHandler INSTANCE = new CSSPropertyMarginSWTHandler();
private final static int TOP = 0;
private final static int RIGHT = 1;
private final static int BOTTOM = 2;
private final static int LEFT = 3;
@Override
public boolean applyCSSProperty(Object element, String property,
CSSValue value, String pseudo, CSSEngine engine) throws Exception {
super.applyCSSProperty(element, property, value, pseudo, engine);
return true;
}
@Override
public void applyCSSPropertyMargin(Object element, CSSValue value,
String pseudo, CSSEngine engine) throws Exception {
// If single value then assigned to all four margins
if(value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
setMargin(element, TOP, value, pseudo);
setMargin(element, RIGHT, value, pseudo);
setMargin(element, BOTTOM, value, pseudo);
setMargin(element, LEFT, value, pseudo);
return;
}
if(value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
CSSValueList valueList = (CSSValueList) value;
int length = valueList.getLength();
if(length < 2 || length > 4) {
throw new CSSException("Invalid margin property list length");
}
switch (length) {
case 4:
// If four values then assigned top/right/bottom/left
setMargin(element, TOP, valueList.item(0), pseudo);
setMargin(element, RIGHT, valueList.item(1), pseudo);
setMargin(element, BOTTOM, valueList.item(2), pseudo);
setMargin(element, LEFT, valueList.item(3), pseudo);
break;
case 3:
// If three values then assigned top=v1, left=v2, right=v2, bottom=v3
setMargin(element, TOP, valueList.item(0), pseudo);
setMargin(element, RIGHT, valueList.item(1), pseudo);
setMargin(element, BOTTOM, valueList.item(2), pseudo);
setMargin(element, LEFT, valueList.item(1), pseudo);
case 2:
// If two values then assigned top/bottom=v1, left/right=v2
setMargin(element, TOP, valueList.item(0), pseudo);
setMargin(element, RIGHT, valueList.item(1), pseudo);
setMargin(element, BOTTOM, valueList.item(0), pseudo);
setMargin(element, LEFT, valueList.item(1), pseudo);
}
} else {
throw new CSSException("Invalid margin property value");
}
}
@Override
public void applyCSSPropertyMarginTop(Object element, CSSValue value,
String pseudo, CSSEngine engine) throws Exception {
setMargin(element, TOP, value, pseudo);
}
@Override
public void applyCSSPropertyMarginRight(Object element, CSSValue value,
String pseudo, CSSEngine engine) throws Exception {
setMargin(element, RIGHT, value, pseudo);
}
@Override
public void applyCSSPropertyMarginBottom(Object element, CSSValue value,
String pseudo, CSSEngine engine) throws Exception {
setMargin(element, BOTTOM, value, pseudo);
}
@Override
public void applyCSSPropertyMarginLeft(Object element, CSSValue value,
String pseudo, CSSEngine engine) throws Exception {
setMargin(element, LEFT, value, pseudo);
}
@Override
public String retrieveCSSPropertyMargin(Object element, String pseudo,
CSSEngine engine) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public String retrieveCSSPropertyMarginTop(Object element, String pseudo,
CSSEngine engine) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public String retrieveCSSPropertyMarginRight(Object element, String pseudo,
CSSEngine engine) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public String retrieveCSSPropertyMarginBottom(Object element,
String pseudo, CSSEngine engine) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public String retrieveCSSPropertyMarginLeft(Object element, String pseudo,
CSSEngine engine) throws Exception {
// TODO Auto-generated method stub
return null;
}
private GridLayout getLayout(Control control) {
if (control == null) {
return null;
}
Composite parent = control.getParent();
if (parent == null) {
return null;
}
if(parent.getData(CSSSWTConstants.MARGIN_WRAPPER_KEY) == null) {
return null;
}
Layout layout = parent.getLayout();
if (layout == null || ! (layout instanceof GridLayout)) {
return null;
}
return (GridLayout) layout;
}
private void setMargin(Object element, int side, CSSValue value, String pseudo) {
if(value.getCssValueType() != CSSValue.CSS_PRIMITIVE_VALUE) {
return;
}
int pixelValue = (int) ((CSSPrimitiveValue) value).getFloatValue(CSSPrimitiveValue.CSS_PX);
Widget widget = SWTElementHelpers.getWidget(element);
if(! (widget instanceof Control)) {
return;
}
GridLayout layout = getLayout((Control) widget);
if(layout == null) {
return;
}
switch (side) {
case TOP:
layout.marginTop = pixelValue;
break;
case RIGHT:
layout.marginRight = pixelValue;
break;
case BOTTOM:
layout.marginBottom = pixelValue;
break;
case LEFT:
layout.marginLeft = pixelValue;
break;
}
}
}