001 /****************************************************************************** 002 * Copyright (C) MActor Developers. All rights reserved. * 003 * ---------------------------------------------------------------------------* 004 * This file is part of MActor. * 005 * * 006 * MActor is free software; you can redistribute it and/or modify * 007 * it under the terms of the GNU General Public License as published by * 008 * the Free Software Foundation; either version 2 of the License, or * 009 * (at your option) any later version. * 010 * * 011 * MActor is distributed in the hope that it will be useful, * 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 014 * GNU General Public License for more details. * 015 * * 016 * You should have received a copy of the GNU General Public License * 017 * along with MActor; if not, write to the Free Software * 018 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * 019 ******************************************************************************/ 020 package org.mactor.ui.gui.project; 021 022 import java.util.HashMap; 023 import java.util.HashSet; 024 import java.util.Map; 025 import java.util.Set; 026 027 public class DropAcceptRules { 028 private static Map<ProjectNodeType, Set<ProjectNodeType>> rulesMap = buildAcceptInfoMap(); 029 private static Map<ProjectNodeType, Set<ProjectNodeType>> buildAcceptInfoMap() { 030 Map<ProjectNodeType, Set<ProjectNodeType>> map = new HashMap<ProjectNodeType, Set<ProjectNodeType>>(); 031 // Global config 032 map.put(ProjectNodeType.PROJECT_GLOBAL_CONFIG, toSet(new ProjectNodeType[] { ProjectNodeType.G_GLOBAL_CONFIG })); 033 map.put(ProjectNodeType.G_GLOBAL_CONFIG, toSet(new ProjectNodeType[] { ProjectNodeType.G_GROUP, ProjectNodeType.VALUE })); 034 map.put(ProjectNodeType.G_GROUP, toSet(new ProjectNodeType[] { ProjectNodeType.VALUE })); 035 // Message broker config 036 map.put(ProjectNodeType.PROJECT_MESSAGE_BROKER_CONFIG, toSet(new ProjectNodeType[] { ProjectNodeType.MBC_MESSAGE_BROKERS })); 037 map.put(ProjectNodeType.MBC_MESSAGE_BROKERS, toSet(new ProjectNodeType[] { ProjectNodeType.MBC_MESSAGE_BROKER })); 038 map.put(ProjectNodeType.MBC_MESSAGE_BROKER, toSet(new ProjectNodeType[] { ProjectNodeType.MBC_CHANNEL, ProjectNodeType.VALUE })); 039 map.put(ProjectNodeType.MBC_CHANNEL, toSet(new ProjectNodeType[] { ProjectNodeType.VALUE })); 040 // Test 041 map.put(ProjectNodeType.PROJECT_TEST, toSet(new ProjectNodeType[] { ProjectNodeType.T_TEST })); 042 Set<ProjectNodeType> testContainerNode = toSet(new ProjectNodeType[] { ProjectNodeType.T_ACTION, ProjectNodeType.T_CONDITION, ProjectNodeType.T_EVENT_CHOICE, ProjectNodeType.T_LOOP, 043 ProjectNodeType.T_MESSAGE_PUBLISH, ProjectNodeType.T_MESSAGE_RECEIVE, ProjectNodeType.T_MESSAGE_SUBSCRIBE, ProjectNodeType.T_VALUE }); 044 map.put(ProjectNodeType.T_TEST, testContainerNode); 045 map.put(ProjectNodeType.T_CONDITION, testContainerNode); 046 // map.put(ProjectNodeType.T_EVENT_CHOICE_BRANCH, testContainerNode); 047 map.put(ProjectNodeType.T_LOOP, testContainerNode); 048 Set<ProjectNodeType> mrSet = new HashSet<ProjectNodeType>(testContainerNode); 049 mrSet.add(ProjectNodeType.T_MESSAGE_RESPOND); 050 map.put(ProjectNodeType.T_MESSAGE_RECEIVE, mrSet); 051 // map.put(ProjectNodeType.T_EVENT_CHOICE, toSet(new ProjectNodeType[] { 052 // ProjectNodeType.T_EVENT_CHOICE_BRANCH })); 053 // Mock Battery 054 map.put(ProjectNodeType.PROJECT_MOCK_BATTERY, toSet(new ProjectNodeType[] { ProjectNodeType.TM_MOCK_BATTERY })); 055 map.put(ProjectNodeType.TM_MOCK_BATTERY, toSet(new ProjectNodeType[] { ProjectNodeType.TM_TEST })); 056 // Test Data 057 map.put(ProjectNodeType.PROJECT_TEST_RUN, toSet(new ProjectNodeType[] { ProjectNodeType.TR_TEST_RUN })); 058 map.put(ProjectNodeType.TR_TEST_RUN, toSet(new ProjectNodeType[] {})); 059 return map; 060 } 061 private static Set<ProjectNodeType> toSet(ProjectNodeType[] types) { 062 Set<ProjectNodeType> s = new HashSet<ProjectNodeType>(); 063 for (ProjectNodeType t : types) 064 s.add(t); 065 return s; 066 } 067 public static DropAcceptInfo getDropAcceptInfo(ProjectTreeNode node, ProjectNodeType nodeTypeToDrop) { 068 DropAcceptInfo dai = new DropAcceptInfo(); 069 if (nodeTypeToDrop != null && node != null) { 070 if (node.getParentNode() != null) { 071 dai.acceptCopyAside = rulesMap.containsKey(node.getParentNode().getNodeType()) && rulesMap.get(node.getParentNode().getNodeType()).contains(nodeTypeToDrop); 072 // special rule for file nodes: 073 dai.acceptMoveAside = dai.acceptCopyAside && !(node.getParentNode() instanceof OrganizationProjectTreeNode); 074 } 075 dai.acceptCopyInto = rulesMap.containsKey(node.getNodeType()) && rulesMap.get(node.getNodeType()).contains(nodeTypeToDrop); 076 dai.acceptMoveInto = dai.acceptCopyInto && !(node instanceof OrganizationProjectTreeNode); 077 } 078 return dai; 079 } 080 public static DropAcceptInfo getDropAcceptInfo(ProjectTreeNode node, ProjectTreeNode nodeToDrop) { 081 DropAcceptInfo dai = new DropAcceptInfo(); 082 if (nodeToDrop != null && node != null) { 083 if (node.getParentNode() != null) { 084 dai.acceptCopyAside = rulesMap.containsKey(node.getParentNode().getNodeType()) && rulesMap.get(node.getParentNode().getNodeType()).contains(nodeToDrop.getNodeType()); 085 // special rule for file nodes: 086 dai.acceptMoveAside = dai.acceptCopyAside && !(node.getParentNode() instanceof OrganizationProjectTreeNode); 087 } 088 dai.acceptCopyInto = rulesMap.containsKey(node.getNodeType()) && rulesMap.get(node.getNodeType()).contains(nodeToDrop.getNodeType()); 089 dai.acceptMoveInto = dai.acceptCopyInto && !(node instanceof OrganizationProjectTreeNode); 090 if (dai.acceptCopyInto || dai.acceptCopyAside) { 091 if (isRecursive(node, nodeToDrop)) { 092 dai.acceptCopyInto = false; 093 dai.acceptCopyAside = false; 094 dai.acceptMoveInto = false; 095 dai.acceptMoveAside = false; 096 } 097 } 098 } 099 return dai; 100 } 101 private static boolean isRecursive(ProjectTreeNode node, ProjectTreeNode nodeToDrop) { 102 if (node == nodeToDrop) 103 return true; 104 ProjectTreeNode parent = node.parentNode; 105 while (parent != null && !(parent instanceof OrganizationProjectTreeNode)) { 106 if (parent == nodeToDrop) 107 return true; 108 parent = parent.getParentNode(); 109 } 110 return false; 111 } 112 public static class DropAcceptInfo { 113 private boolean acceptCopyInto; 114 private boolean acceptCopyAside; 115 private boolean acceptMoveInto; 116 private boolean acceptMoveAside; 117 public boolean isSomethingAccepted() { 118 return acceptCopyInto || acceptCopyAside || acceptMoveInto || acceptMoveAside; 119 } 120 public boolean isCopyAccepted() { 121 return acceptCopyAside || acceptCopyInto; 122 } 123 public boolean isMoveAccepted() { 124 return acceptMoveAside || acceptMoveInto; 125 } 126 public boolean isCopyIntoAccepted() { 127 return acceptCopyInto; 128 } 129 public boolean isMoveIntoAccepted() { 130 return acceptMoveInto; 131 } 132 public boolean isCopyAsideAccepted() { 133 return acceptCopyAside; 134 } 135 public boolean isMoveAsideAccepted() { 136 return acceptMoveAside; 137 } 138 } 139 }