blob: 9d124504b23bf1234441d8e2d7df4a4e7b50a2f0 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.taobao.weex.ui.action;
import android.support.annotation.NonNull;
import android.view.View;
import com.taobao.weex.common.Constants;
import com.taobao.weex.dom.CSSShorthand;
import com.taobao.weex.dom.WXAttr;
import com.taobao.weex.dom.WXEvent;
import com.taobao.weex.dom.WXStyle;
import com.taobao.weex.ui.component.list.template.jni.NativeRenderObjectUtils;
import com.taobao.weex.utils.WXUtils;
import java.util.Map;
import java.util.Set;
public class BasicComponentData<T extends View> {
public String mRef;
public String mComponentType;
public String mParentRef;
private WXStyle mStyles;
private WXAttr mAttributes;
private WXEvent mEvents;
private CSSShorthand mMargins;
private CSSShorthand mPaddings;
private CSSShorthand mBorders;
private long renderObjectPr = 0;
public BasicComponentData(String ref, String componentType, String parentRef) {
this.mRef = ref;
this.mComponentType = componentType;
this.mParentRef = parentRef;
}
public void addStyle(Map<String, Object> styles) {
addStyle(styles, false);
}
public final void addStyle(Map<String, Object> styles, boolean byPesudo) {
if (styles == null || styles.isEmpty()) {
return;
}
if (mStyles == null) {
mStyles = new WXStyle(styles);
}
else {
mStyles.putAll(styles, byPesudo);
}
}
public final void addAttr(Map<String, Object> attrs) {
if (attrs == null || attrs.isEmpty()) {
return;
}
if (mAttributes == null) {
mAttributes = new WXAttr(attrs, 0);
}
else {
mAttributes.putAll(attrs);
}
}
public final void addEvent(Set<String> events) {
if (events == null || events.isEmpty()) {
return;
}
if (mEvents == null) {
mEvents = new WXEvent();
}
mEvents.addAll(events);
}
public final void addShorthand(float[] shorthand, CSSShorthand.TYPE type) {
if (shorthand == null) {
shorthand = new float[] {0, 0, 0, 0};
}
if (shorthand.length == 4) {
switch (type) {
case MARGIN:
if (mMargins == null) {
mMargins = new CSSShorthand(shorthand);
} else {
mMargins.replace(shorthand);
}
break;
case PADDING:
if (mPaddings == null) {
mPaddings = new CSSShorthand(shorthand);
} else {
mPaddings.replace(shorthand);
}
break;
case BORDER:
if (mBorders == null) {
mBorders = new CSSShorthand(shorthand);
} else {
mBorders.replace(shorthand);
}
break;
default:
break;
}
}
}
public final void addShorthand(Map<String, String> shorthand) {
if (shorthand != null && !shorthand.isEmpty()) {
for (Map.Entry<String, String> item : shorthand.entrySet()) {
String key = item.getKey();
switch (key) {
case Constants.Name.MARGIN:
addMargin(CSSShorthand.EDGE.ALL, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.MARGIN_LEFT:
addMargin(CSSShorthand.EDGE.LEFT, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.MARGIN_TOP:
addMargin(CSSShorthand.EDGE.TOP, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.MARGIN_RIGHT:
addMargin(CSSShorthand.EDGE.RIGHT, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.MARGIN_BOTTOM:
addMargin(CSSShorthand.EDGE.BOTTOM,WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.BORDER_WIDTH:
addBorder(CSSShorthand.EDGE.ALL, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.BORDER_TOP_WIDTH:
addBorder(CSSShorthand.EDGE.TOP, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.BORDER_RIGHT_WIDTH:
addBorder(CSSShorthand.EDGE.RIGHT, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.BORDER_BOTTOM_WIDTH:
addBorder(CSSShorthand.EDGE.BOTTOM, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.BORDER_LEFT_WIDTH:
addBorder(CSSShorthand.EDGE.LEFT, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.PADDING:
addPadding(CSSShorthand.EDGE.ALL, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.PADDING_LEFT:
addPadding(CSSShorthand.EDGE.LEFT, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.PADDING_TOP:
addPadding(CSSShorthand.EDGE.TOP, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.PADDING_RIGHT:
addPadding(CSSShorthand.EDGE.RIGHT, WXUtils.fastGetFloat(shorthand.get(key)));
break;
case Constants.Name.PADDING_BOTTOM:
addPadding(CSSShorthand.EDGE.BOTTOM, WXUtils.fastGetFloat(shorthand.get(key)));
break;
}
}
}
}
private void addMargin(CSSShorthand.EDGE spacingType, float margin) {
if (mMargins == null) {
mMargins = new CSSShorthand();
}
mMargins.set(spacingType, margin);
}
private void addPadding(CSSShorthand.EDGE spacingType, float padding) {
if (mPaddings == null) {
mPaddings = new CSSShorthand();
}
mPaddings.set(spacingType, padding);
}
private void addBorder(CSSShorthand.EDGE spacingType, float border) {
if (mBorders == null) {
mBorders = new CSSShorthand();
}
mBorders.set(spacingType, border);
}
public final @NonNull
WXStyle getStyles() {
if (mStyles == null) {
mStyles = new WXStyle();
}
return mStyles;
}
public final @NonNull
WXAttr getAttrs() {
if (mAttributes == null) {
mAttributes = new WXAttr();
}
return mAttributes;
}
public final @NonNull
WXEvent getEvents() {
if (mEvents == null) {
mEvents = new WXEvent();
}
return mEvents;
}
/**
* Get this node's margin, as defined by cssstyle + default margin.
*/
public final @NonNull
CSSShorthand getMargin() {
if (mMargins == null) {
mMargins = new CSSShorthand();
}
return mMargins;
}
/**
* Get this node's padding, as defined by cssstyle + default padding.
*/
public final @NonNull
CSSShorthand getPadding() {
if (mPaddings == null) {
mPaddings = new CSSShorthand();
}
return mPaddings;
}
/**
* Get this node's border, as defined by cssstyle.
*/
public @NonNull
CSSShorthand getBorder() {
if (mBorders == null) {
mBorders = new CSSShorthand();
}
return mBorders;
}
public final void setMargins(@NonNull CSSShorthand mMargins) {
this.mMargins = mMargins;
}
public final void setPaddings(@NonNull CSSShorthand mPaddings) {
this.mPaddings = mPaddings;
}
public final void setBorders(@NonNull CSSShorthand mBorders) {
this.mBorders = mBorders;
}
@Override
public BasicComponentData clone() throws CloneNotSupportedException {
BasicComponentData basicComponentData = new BasicComponentData(mRef, mComponentType, mParentRef);
basicComponentData.setBorders(getBorder().clone());
basicComponentData.setMargins(getMargin().clone());
basicComponentData.setPaddings(getPadding().clone());
if(mAttributes != null){
basicComponentData.mAttributes = mAttributes.clone();
}
if(mStyles != null){
basicComponentData.mStyles = mStyles.clone();
}
if(mEvents != null){
basicComponentData.mEvents = mEvents.clone();
}
if(renderObjectPr != 0){
basicComponentData.setRenderObjectPr(NativeRenderObjectUtils.nativeCopyRenderObject(renderObjectPr));
}
return basicComponentData;
}
public long getRenderObjectPr() {
return renderObjectPr;
}
public boolean isRenderPtrEmpty(){
return renderObjectPr == 0;
}
public synchronized void setRenderObjectPr(long renderObjectPr) {
if(this.renderObjectPr != renderObjectPr){
if(this.renderObjectPr != 0){
throw new RuntimeException("RenderObjectPr has " + renderObjectPr + " old renderObjectPtr " + this.renderObjectPr);
}
this.renderObjectPr = renderObjectPr;
}
}
}