private void fillProperties() {
    myProperties = new ArrayList<>();
    int size = myContainers.size();

    if (size > 0) {
      List<Property> rootProperties = new ArrayList<>();
      for (Property each : getProperties(myContainers.get(0))) {
        addIfNeeded(getCurrentComponent(), each, rootProperties);
      }
      sortPropertiesAndCreateGroups(rootProperties);

      for (Property property : rootProperties) {
        myProperties.add(property);
        addExpandedChildren(getCurrentComponent(), property, myProperties);
      }

      if (size > 1) {
        for (Iterator<Property> I = myProperties.iterator(); I.hasNext(); ) {
          if (!I.next().availableFor(myContainers)) {
            I.remove();
          }
        }

        for (int i = 1; i < size; i++) {
          List<Property> otherProperties = new ArrayList<>();
          fillProperties(myContainers.get(i), otherProperties);

          for (Iterator<Property> I = myProperties.iterator(); I.hasNext(); ) {
            Property addedProperty = I.next();

            int index = findFullPathProperty(otherProperties, addedProperty);
            if (index == -1) {
              I.remove();
              continue;
            }

            Property testProperty = otherProperties.get(index);
            if (!addedProperty.getClass().equals(testProperty.getClass())) {
              I.remove();
              continue;
            }

            List<Property> addedChildren = getChildren(addedProperty);
            List<Property> testChildren = getChildren(testProperty);
            int addedChildrenSize = addedChildren.size();

            if (addedChildrenSize != testChildren.size()) {
              I.remove();
              continue;
            }

            for (int j = 0; j < addedChildrenSize; j++) {
              if (!addedChildren.get(j).getName().equals(testChildren.get(j).getName())) {
                I.remove();
                break;
              }
            }
          }
        }
      }
    }
  }
private void fillProperties()