@Override
	public void renameProductContainer(ProductContainerData renamedContainer, String newName, 
										int newIndex) {
		
		boolean disabledEvents = disableEvents();
		try {
			ProductContainerTreeNode renamedNode = _productContainers.get(renamedContainer);
			assert renamedNode != null;
			
			if (renamedNode != null) {
		
				ProductContainerTreeNode parentNode = 
					(ProductContainerTreeNode)renamedNode.getParent();
				assert parentNode != null;
				
				if (parentNode != null) {
					
					ProductContainerData parentContainer = 
						parentNode.getProductContainer();
					parentContainer.renameChild(renamedContainer, newName, newIndex);
					
					TreePath renamedPath = new TreePath(renamedNode.getPath());
		
					// remember which descendant nodes were expanded so they
					// can be re-expanded after the tree is updated
					ArrayList<TreePath> expandedList = null;
					Enumeration<TreePath> expandedEnum = 
						_productContainerTree.getExpandedDescendants(renamedPath);
					if (expandedEnum != null) {
						expandedList = new ArrayList<TreePath>();
						while (expandedEnum.hasMoreElements()) {
							TreePath path = expandedEnum.nextElement();
							expandedList.add(path);
						}
					}
			
					// update the tree
					_productContainerTreeModel.removeNodeFromParent(renamedNode);
					_productContainerTreeModel.insertNodeInto(renamedNode, parentNode, newIndex);
					
					// re-expand descendant nodes that were expanded before the update
					if (expandedList != null) {
						for (TreePath path : expandedList) {
							_productContainerTree.expandPath(path);
						}
					}
				}
			}
		}
		finally {
			if (disabledEvents) {
				enableEvents();
			}
		}
	}