/* * Copyright (C) 2010-2016 JPEXS, All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ package com.jpexs.decompiler.flash.action.fastactionlist; import com.jpexs.decompiler.flash.action.Action; import java.util.HashSet; import java.util.List; import java.util.Set; /** * * @author JPEXS */ public class ActionItem { public Action action; public ActionItem prev; public ActionItem next; private ActionItem jumpTarget; public Set<ActionItem> jumpsHere; public Set<ActionItem> lastActionOf; private List<ActionItem> containerLastActions; // 1 means reachable, 2 means reachable and processed int reachable; public boolean excluded; public ActionItem(Action action) { this.action = action; } public boolean isJumpTarget() { return jumpsHere != null && !jumpsHere.isEmpty(); } public int jumpsHereSize() { return jumpsHere == null ? 0 : jumpsHere.size(); } public boolean isContainerLastAction() { return lastActionOf != null && !lastActionOf.isEmpty(); } public void removeJumpTarget() { if (jumpTarget == null) { return; } if (jumpTarget.jumpsHere != null) { jumpTarget.jumpsHere.remove(this); } jumpTarget = null; } public ActionItem getJumpTarget() { return jumpTarget; } public Action getJumpTargetAction() { return jumpTarget == null ? null : jumpTarget.action; } public void setJumpTarget(ActionItem item) { removeJumpTarget(); if (item == null) { return; } if (item.jumpsHere == null) { item.jumpsHere = new HashSet<>(); } item.jumpsHere.add(this); jumpTarget = item; } public List<ActionItem> getContainerLastActions() { return containerLastActions; } public void removeContainerLastActions() { if (containerLastActions == null) { return; } for (ActionItem lastAction : containerLastActions) { if (lastAction.lastActionOf != null) { lastAction.lastActionOf.remove(this); } } containerLastActions = null; } public void replaceContainerLastAction(ActionItem oldItem, ActionItem newItem) { if (containerLastActions == null) { return; } for (int i = 0; i < containerLastActions.size(); i++) { if (containerLastActions.get(i) == oldItem) { containerLastActions.set(i, newItem); if (oldItem.lastActionOf != null) { oldItem.lastActionOf.remove(this); } newItem.ensureLastActionOf().add(this); } } } public void setContainerLastActions(List<ActionItem> lastActions) { removeContainerLastActions(); for (ActionItem lastAction : lastActions) { lastAction.ensureLastActionOf().add(this); } containerLastActions = lastActions; } private Set<ActionItem> ensureLastActionOf() { if (lastActionOf == null) { lastActionOf = new HashSet<>(); } return lastActionOf; } public boolean isExcluded() { return excluded; } }