@Override
	public boolean onReceievedAction(InterfaceController controller, EInterfaceAction binding, SimpleAutoCompleteEntry entry) {
		if(binding == EInterfaceAction.Bind_Undo) { 
			mDocument.undo();
			return true;
		} else if(binding == EInterfaceAction.Bind_Redo) { 
			mDocument.redo();
			return true;
		}
		
		if(binding == EInterfaceAction.Bind_DebugPrint) {
			mDocument.debugPrint();
			return true;
		}
		
		if(binding == EInterfaceAction.Bind_DuplicateToAdjacent) {
			ConstructEditor selectedEditor = controller.getSelectedEditor();
			ClojureConstruct parent = (ClojureConstruct) selectedEditor.construct.getParentForBinding(binding);
			if(parent == null || parent.canPerformAction(binding, selectedEditor.construct) == false) {
				// Consume event: no parent / action cannot be performed
				System.err.println("Cannot duplicate adjacent with " + selectedEditor.construct.type + " (parent " + parent.type + ")");
				return true;
			}
			
			Construct selected = controller.getSelectedEditor().construct;
			Construct created = ClojureConstructFactory.duplicate(selected.getClass(), selected.getDocument(), parent);
			
			if(created != null) { 
				// If the construct duplicated (certain forms only), create an editor
				// for it and then place the focus onto this new construct 
				int indexOfExisting = parent.getChildren().indexOf(selected);
				if(parent.addChild(indexOfExisting + 1, created)) { 
					ConstructEditor added = mDocument.editorsFromConstruct(created);
					controller.mConstructSelector.Select(SelectionCause.SelectedAfterDuplicatingSibling, added);
				} else { 
					System.err.println("TODO: Clojure/Bind_DuplicateToAdjacent, addChild failed");
				}
			}
		} else { 
			String error = handleInsert(controller, binding, entry);
			if(error != null) 
				System.err.println("Clojure HotKeyListener error: " + error);
		}
		
		return true;
	}