protected boolean select(Set set, Object cell) {
		AttributeMap attrs = graph.getAttributes(cell);
		if (!isCellSelected(cell)
				&& graph.getGraphLayoutCache().isVisible(cell)
				&& (attrs == null || GraphConstants.isSelectable(attrs))) {
			GraphModel model = graph.getModel();
			// Deselect and Update All Parents
			Object parent = model.getParent(cell);
			while (parent != null) {
				int count = getSelectedChildCount(parent);
				// Deselect Selected Parents
				if (count == SELECTED)
					count = 0;
				// Increase Child Count
				count++;
				setSelectedChildCount(parent, count);
				// Remove From Selection
				selection.remove(parent);
				// Next Parent
				parent = model.getParent(parent);
			}
			// Deselect All Children
			Object[] tmp = new Object[] { cell };
			List childs = DefaultGraphModel.getDescendants(model, tmp);
			// Remove Current Cell From Flat-View
			// TODO check performance of next line
			childs.remove(cell);
			Iterator it = childs.iterator();
			while (it.hasNext()) {
				Object child = it.next();
				if (child != null && !model.isPort(child)) {
					// Remove Child From Selection
					selection.remove(child);
					// Remove Child State
					cellStates.remove(child);
				}
			}
			// Set Selected State for Current
			setSelectedChildCount(cell, SELECTED);
			// Add Current To HashSet and Return
			return set.add(cell);
		}
		return false;
	}