void () { myProperties.clear(); if (mySelection.size() > 0) { collectProperties(mySelection.get(0), myProperties); for(int propIndex=myProperties.size()-1; propIndex >= 0; propIndex--) { if (!myProperties.get(propIndex).appliesToSelection(mySelection)) { myProperties.remove(propIndex); } } for(int i=1; i<mySelection.size(); i++) { ArrayList<Property> otherProperties = new ArrayList<>(); collectProperties(mySelection.get(i), otherProperties); for(int propIndex=myProperties.size()-1; propIndex >= 0; propIndex--) { final Property prop = myProperties.get(propIndex); int otherPropIndex = findPropertyByName(otherProperties, prop.getName()); if (otherPropIndex < 0) { myProperties.remove(propIndex); continue; } final Property otherProp = otherProperties.get(otherPropIndex); if (!otherProp.getClass().equals(prop.getClass())) { myProperties.remove(propIndex); continue; } Property[] children = prop.getChildren(mySelection.get(0)); Property[] otherChildren = otherProp.getChildren(mySelection.get(i)); if (children.length != otherChildren.length) { myProperties.remove(propIndex); continue; } for(int childIndex=0; childIndex<children.length; childIndex++) { if (!Objects.equals(children[childIndex].getName(), otherChildren[childIndex].getName())) { myProperties.remove(propIndex); break; } } } } } }