public void setDestinationTarget(Destination destination) {

        if (documentView == null || documentViewModel == null) {
            return;
        }

        if (destination == null) {
            return;
        }

        // get the page number associated with the destination
        int pageNumber = getPageTree().getPageNumber(destination.getPageReference());
        if (pageNumber < 0) {
            return;
        }

        // ready our view port for manipulation
        JViewport documentViewport = (documentViewScrollPane != null) ?
                documentViewScrollPane.getViewport() : null;

        if (documentViewport != null) {

            // get location of page in document view
            Rectangle pageBounds = documentViewModel.getPageBounds(pageNumber);

            // Only apply destination if rotation is 0
            // todo: implement rotation calculation for destination offset
            if (documentViewModel.getViewRotation() == 0 && pageBounds != null) {

                setCurrentPageIndex(pageNumber);

                // apply zoom, from destination
                if (destination.getZoom() != null &&
                        destination.getZoom() > 0.0f) {
                    setZoom(destination.getZoom(), null, false);
                }
                Point newViewPosition = new Point(pageBounds.getLocation());
                float zoom = getZoom();

                // Process top destination coordinate
                Rectangle viewportBounds = documentView.getBounds();
                Rectangle viewportRect = documentViewport.getViewRect();
//                System.out.println("viewPort bounds " + viewportBounds);
//                System.out.println("viewPort rect " + viewportRect);
//                System.out.println("page bounds " + pageBounds);
//                System.out.println("page " + pageNumber);
//                System.out.println("top/left " + destination.getTop() + " " + destination.getLeft());
                if (destination.getTop() != null && destination.getTop() != 0) {
                    // calculate potential new y value
                    newViewPosition.y = pageBounds.y + pageBounds.height - (int) (destination.getTop() * zoom);
                }
                if ((newViewPosition.y + viewportRect.height) > viewportBounds.height) {
                    newViewPosition.y = viewportBounds.height - viewportRect.height;
                }

                // Process left destination coordinate
                if (destination.getLeft() != null && destination.getLeft() != 0) {
                    // calculate potential new y value
                    newViewPosition.x = pageBounds.x + (int) (destination.getLeft() * zoom);
                }
                if ((newViewPosition.x + viewportRect.width) > viewportBounds.width) {
                    newViewPosition.x = viewportBounds.width - viewportRect.width;
                }

                // make sure documentViewport is not negative
                if (newViewPosition.x < 0)
                    newViewPosition.x = 0;
                if (newViewPosition.y < 0)
                    newViewPosition.y = 0;

                // finally apply the documentViewport position
                documentViewport.setViewPosition(newViewPosition);
                int oldPageIndex = documentViewModel.getViewCurrentPageIndex();
                documentViewModel.setViewCurrentPageIndex(pageNumber);
                firePropertyChange(PropertyConstants.DOCUMENT_CURRENT_PAGE,
                        oldPageIndex, pageNumber);
            }
            // Otherwise go to the indented page number with out applying
            // destination coordinates.
            else {
                setCurrentPageIndex(pageNumber);
            }

            viewerController.updateDocumentView();
        }
    }