blob: 0e8180a1913433877e1ffbce340c2accc56df4e3 [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 org.apache.weex.ui.component.richtext;
import android.content.Context;
import android.support.annotation.NonNull;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.SpannedString;
import android.text.TextUtils;
import org.apache.weex.WXSDKInstance;
import org.apache.weex.layout.measurefunc.TextContentBoxMeasurement;
import org.apache.weex.ui.ComponentCreator;
import org.apache.weex.ui.action.BasicComponentData;
import org.apache.weex.ui.component.WXComponent;
import org.apache.weex.ui.component.WXText;
import org.apache.weex.ui.component.WXVContainer;
import org.apache.weex.ui.component.richtext.node.RichTextNode;
import org.apache.weex.ui.component.richtext.node.RichTextNodeManager;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class WXRichText extends WXText {
private List<RichTextNode> nodes = new LinkedList<>();
static class RichTextContentBoxMeasurement extends TextContentBoxMeasurement {
public RichTextContentBoxMeasurement(WXComponent component) {
super(component);
}
@NonNull
@Override
protected Spanned createSpanned(String text) {
if(!TextUtils.isEmpty(text)) {
if (mComponent.getInstance() != null & mComponent.getInstance().getUIContext() != null &&
!TextUtils.isEmpty(mComponent.getInstanceId())) {
Spannable spannable = RichTextNode.parse(
mComponent.getInstance().getUIContext(),
mComponent.getInstanceId(),
mComponent.getRef(),
text);
updateSpannable(spannable, RichTextNode.createSpanFlag(0));
return spannable;
} else {
return new SpannedString("");
}
}
else {
Spannable spannable = ((WXRichText)mComponent).toSpan();
updateSpannable(spannable, RichTextNode.createSpanFlag(0));
return spannable;
}
}
}
public static class Creator implements ComponentCreator {
public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException {
return new WXRichText(instance, parent, basicComponentData);
}
}
public WXRichText(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) {
super(instance, parent, basicComponentData);
setContentBoxMeasurement(new RichTextContentBoxMeasurement(this));
}
public void AddChildNode(String ref, String nodeType,String parentRef, Map<String,String> styles,Map<String,String> attrs) {
if(getInstance() != null && getInstance().getUIContext() != null && !TextUtils.isEmpty(getInstanceId()) &&
!TextUtils.isEmpty(ref) && !TextUtils.isEmpty(nodeType)) {
RichTextNode child = RichTextNodeManager.createRichTextNode(getInstance().getUIContext(), getInstanceId(), getRef(), ref, nodeType, styles, attrs);
if (TextUtils.isEmpty(parentRef)) {
nodes.add(child);
} else {
RichTextNode parent = findRichNode(parentRef);
if (parent != null) {
parent.addChildNode(child);
}
}
}
}
private Spannable toSpan(){
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
if(nodes != null && !nodes.isEmpty()){
for(RichTextNode node:nodes){
spannableStringBuilder.append(node.toSpan(1));
}
}
return spannableStringBuilder;
}
public void removeChildNode(String parentRef,String ref) {
if (nodes != null && !nodes.isEmpty()) {
if (parentRef.equals("")) {
for (RichTextNode node : nodes) {
if (TextUtils.equals(node.getRef(), ref)) {
nodes.remove(node);
}
}
} else {
RichTextNode parent = findRichNode(parentRef);
if (parent != null) {
parent.removeChildNode(ref);
}
}
}
}
public void updateChildNodeStyles(String ref,Map<String,Object> styles){
RichTextNode node = findRichNode(ref);
if(node != null){
node.updateStyles(styles);
}
}
public void updateChildNodeAttrs(String ref,Map<String,Object> attrs){
RichTextNode node = findRichNode(ref);
if(node != null){
node.updateAttrs(attrs);
}
}
private RichTextNode findRichNode(String ref){
if(!TextUtils.isEmpty(ref)) {
RichTextNode theNode;
if (nodes != null && !nodes.isEmpty()) {
for (RichTextNode node : nodes) {
if ((theNode = node.findRichNode(ref)) != null)
return theNode;
}
}
}
return null;
}
@Override
protected WXRichTextView initComponentHostView(@NonNull Context context) {
return new WXRichTextView(context);
}
}