protected Map handleAttributes(Map attributes) {
   Map undo = super.handleAttributes(attributes);
   if (attributes != null) {
     if (undo == null) undo = new Hashtable();
     Iterator it = attributes.entrySet().iterator();
     while (it.hasNext()) {
       Map.Entry entry = (Map.Entry) it.next();
       Object cell = entry.getKey();
       Map properties = (Map) entry.getValue();
       if (cell instanceof JGraphBusinessObject) {
         JGraphBusinessObject bo = (JGraphBusinessObject) cell;
         Map deltaOld = new Hashtable();
         Iterator it2 = properties.entrySet().iterator();
         while (it2.hasNext()) {
           Map.Entry property = (Map.Entry) it2.next();
           Object key = property.getKey();
           Object oldValue = bo.putProperty(key, property.getValue());
           if (oldValue != null) deltaOld.put(key, oldValue);
         }
         undo.put(cell, deltaOld);
       }
     }
   }
   return undo;
 }
 public void addProperty(Object cell, Object key, Object value) {
   if (key != null && value != null) {
     Object userObj = getValue(cell);
     JGraphBusinessObject bo = (JGraphBusinessObject) userObj;
     bo.putProperty(key, value);
     cellsChanged(new Object[] {cell});
   }
 }
 public Object valueForCellChanged(Object cell, Object newValue) {
   Object userObject = getValue(cell);
   if (userObject instanceof JGraphBusinessObject && newValue instanceof String) {
     JGraphBusinessObject user = (JGraphBusinessObject) userObject;
     Object oldLabel = user.getValue();
     user.setValue(newValue);
     return oldLabel;
   } else return super.valueForCellChanged(cell, newValue);
 }