public void createControl(Composite parent) {
    fViewerContainer = new Composite(parent, SWT.NULL);
    fViewerContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
    fViewerContainer.setSize(100, 100);
    fViewerContainer.setLayout(new FillLayout());

    fTreeViewer = new TreeViewer(fViewerContainer, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);

    fTreeViewer.setContentProvider(
        new ITreeContentProvider() {

          public void dispose() {}

          public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            viewer.refresh();
          }

          public Object[] getChildren(Object parentElement) {
            return new Object[0];
          }

          public Object getParent(Object element) {
            return null;
          }

          public boolean hasChildren(Object element) {
            return false;
          }

          public Object[] getElements(Object inputElement) {

            if (fQuery == null) return new Object[0];
            else {
              return ((MemorySearchResult) fQuery.getSearchResult()).getMatches();
            }
          }
        });

    fTreeViewer.setInput(new Object());
    fTreeViewer.addSelectionChangedListener(
        new ISelectionChangedListener() {

          public void selectionChanged(final SelectionChangedEvent event) {
            if (event.getSelection() instanceof StructuredSelection) {
              IMemoryRenderingContainer containers[] =
                  ((IMemorySearchQuery) fQuery).getMemoryView().getMemoryRenderingContainers();
              MemoryMatch match =
                  (MemoryMatch) ((StructuredSelection) event.getSelection()).getFirstElement();
              if (match != null) {
                for (int i = 0; i < containers.length; i++) {
                  IMemoryRendering rendering = containers[i].getActiveRendering();
                  if (rendering instanceof IRepositionableMemoryRendering) {
                    try {
                      ((IRepositionableMemoryRendering) rendering)
                          .goToAddress(match.getStartAddress());
                    } catch (DebugException e) {
                      MemorySearchPlugin.logError(
                          Messages.getString(
                              "MemorySearchResultsPage.RepositioningMemoryViewFailed"),
                          e); //$NON-NLS-1$
                    }
                  }

                  if (rendering != null) {
                    // Temporary, until platform accepts/adds new interface for setting the
                    // selection
                    try {
                      Method m =
                          rendering
                              .getClass()
                              .getMethod(
                                  "setSelection",
                                  new Class[] {BigInteger.class, BigInteger.class}); // $NON-NLS-1$
                      if (m != null)
                        m.invoke(rendering, match.getStartAddress(), match.getEndAddress());
                    } catch (Exception e) {
                      // do nothing
                    }
                  }
                }
              }
            }
          }
        });

    fTreeViewer.setLabelProvider(
        new ILabelProvider() {

          public String getText(Object element) {
            if (element instanceof MemoryMatch)
              return "0x" + ((MemoryMatch) element).getStartAddress().toString(16); // $NON-NLS-1$

            return element.toString();
          }

          public Image getImage(Object element) {
            return null;
          }

          public void addListener(ILabelProviderListener listener) {}

          public void dispose() {}

          public boolean isLabelProperty(Object element, String property) {
            return false;
          }

          public void removeListener(ILabelProviderListener listener) {}
        });

    fQueryListener = createQueryListener();

    NewSearchUI.addQueryListener(fQueryListener);
  }