public void saveChanges() {
   TreeModel model = tree.getModel();
   Object root = model.getRoot();
   ClassPropertiesInfo classInfo;
   int classCount = model.getChildCount(root);
   for (int c = 0; c < classCount; c++) {
     classInfo =
         (ClassPropertiesInfo) ((DefaultMutableTreeNode) model.getChild(root, c)).getUserObject();
     PropertySheetPanel propertiesPanel = classInfo.getPropertiesPanel();
     if (propertiesPanel != null) {
       // to exit edit mode and retrieve the value
       propertiesPanel.getTable().commitEditing();
       setProperties(classInfo);
     }
   }
   GeneralPreferences.saveProperties();
 }
 private HashMap<String, Property[]> extractProperties(TreeModel model) {
   HashMap<String, Property[]> props = new HashMap<>();
   DefaultMutableTreeNode classNode;
   Object root = model.getRoot();
   ClassPropertiesInfo classInfo;
   int classCount = model.getChildCount(root);
   Property[] classProperties;
   for (int c = 0; c < classCount; c++) {
     classNode = (DefaultMutableTreeNode) model.getChild(root, c);
     classInfo = (ClassPropertiesInfo) classNode.getUserObject();
     PropertySheetPanel propertiesPanel = classInfo.getPropertiesPanel();
     if (propertiesPanel != null) {
       // force out of edit mode
       propertiesPanel.getTable().commitEditing();
       classProperties = propertiesPanel.getProperties();
       props.put(classInfo.getName(), classProperties.clone());
     }
   }
   return props;
 }