| /* |
| * 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.component.pesudo; |
| |
| import android.support.annotation.Nullable; |
| import android.support.v4.util.ArrayMap; |
| |
| import com.taobao.weex.common.Constants; |
| |
| import java.util.Map; |
| |
| /** |
| * Created by sospartan on 05/01/2017. |
| */ |
| |
| public class PesudoStatus { |
| |
| /** |
| * See {@link Constants.PSEUDO} |
| */ |
| private int[] mStatuses = new int[4]; |
| |
| private static final int UNSET = 0; |
| private static final int SET = 1; |
| |
| static final int CLASS_ACTIVE = 0; |
| static final int CLASS_FOCUS = 1; |
| static final int CLASS_ENABLED = 2; |
| static final int CLASS_DISABLED = 3; |
| |
| public PesudoStatus(){ |
| for (int i = 0; i < mStatuses.length; i++) { |
| mStatuses[i] = UNSET; |
| } |
| } |
| |
| /** |
| * |
| * @param clzName See {@link Constants.PSEUDO} |
| * @param status |
| */ |
| public void setStatus(String clzName,boolean status){ |
| switch (clzName){ |
| case Constants.PSEUDO.ACTIVE: |
| setStatus(PesudoStatus.CLASS_ACTIVE,status); |
| break; |
| case Constants.PSEUDO.DISABLED: |
| setStatus(PesudoStatus.CLASS_DISABLED,status); |
| break; |
| case Constants.PSEUDO.ENABLED: |
| setStatus(PesudoStatus.CLASS_ENABLED,status); |
| break; |
| case Constants.PSEUDO.FOCUS: |
| setStatus(PesudoStatus.CLASS_FOCUS,status); |
| break; |
| } |
| } |
| |
| void setStatus(int clz,boolean status){ |
| mStatuses[clz] = status?SET:UNSET; |
| } |
| |
| public boolean isSet(int clz){ |
| return mStatuses[clz] == SET; |
| } |
| |
| public @Nullable String getStatuses(){ |
| StringBuilder sb = new StringBuilder(); |
| if(isSet(CLASS_ACTIVE)){ |
| sb.append(Constants.PSEUDO.ACTIVE); |
| } |
| if(isSet(CLASS_DISABLED)){ |
| sb.append(Constants.PSEUDO.DISABLED); |
| } |
| //enabled is ignored |
| |
| if(isSet(CLASS_FOCUS) && !isSet(CLASS_DISABLED)){ |
| sb.append(Constants.PSEUDO.FOCUS); |
| } |
| return sb.length()==0?null:sb.toString(); |
| } |
| |
| public Map<String,Object> updateStatusAndGetUpdateStyles(String clzName, |
| boolean status, |
| Map<String, Map<String,Object>> pesudoStyles, |
| Map<String,Object> originalStyles){ |
| String prevStatusesStr = getStatuses();//before change |
| setStatus(clzName,status); |
| String statusesStr = getStatuses();//after change |
| |
| Map<String,Object> updateStyles = pesudoStyles.get(statusesStr); |
| Map<String,Object> prevUpdateStyles = pesudoStyles.get(prevStatusesStr); |
| |
| /** |
| * NEW INSTANCE, DO NOT USE MAP OBJECT FROM pesudoStyles |
| */ |
| Map<String,Object> resultStyles = new ArrayMap<>(); |
| if(prevUpdateStyles != null){ |
| resultStyles.putAll(prevUpdateStyles); |
| } |
| |
| //reset |
| for (String key : resultStyles.keySet()) { |
| resultStyles.put(key, originalStyles.containsKey(key) ? originalStyles.get(key) : ""); |
| } |
| |
| //apply new update |
| if(updateStyles != null) { |
| for (Map.Entry<String, Object> entry : updateStyles.entrySet()) { |
| resultStyles.put(entry.getKey(), entry.getValue()); |
| } |
| } |
| return resultStyles; |
| } |
| } |