private void hookListener(final ColumnViewer viewer) {
		Listener listener = new Listener() {

			public void handleEvent(Event event) {
				switch (event.type) {
				case SWT.MouseDown:
					handleMouseDown(event);
					break;
				case SWT.KeyDown:
					handleKeyDown(event);
					break;
				case SWT.Selection:
					handleSelection(event);
					break;
				case SWT.FocusIn:
					handleFocusIn(event);
					break;
				}
			}
		};

		viewer.getControl().addListener(SWT.MouseDown, listener);
		viewer.getControl().addListener(SWT.KeyDown, listener);
		viewer.getControl().addListener(SWT.Selection, listener);
		viewer.addSelectionChangedListener(new ISelectionChangedListener() {

			public void selectionChanged(SelectionChangedEvent event) {
				if( event.selection.isEmpty() ) {
					setFocusCell(null);
				}
			}

		});
		viewer.getControl().addListener(SWT.FocusIn, listener);
		viewer.getControl().getAccessible().addAccessibleListener(
				new AccessibleAdapter() {
					public void getName(AccessibleEvent event) {
						ViewerCell cell = getFocusCell();
						if (cell == null)
							return;
						
						ViewerRow row = cell.getViewerRow();
						if (row == null)
							return;
						
						ViewerColumn viewPart = viewer.getViewerColumn(cell
								.getColumnIndex());
						
						if (viewPart == null)
							return;
						
						CellLabelProvider labelProvider = viewPart
								.getLabelProvider();
						
						if (labelProvider == null)
							return;
						labelProvider.update(cell);
						event.result = cell.getText();
					}
				});

	}