private void activateDnD() {
        this.tagPanel.addStyleName( Resources.INSTANCE.style().tagEditable() ); //Change cursor on hover
        
        //DnD
        this.getElement().setDraggable( Element.DRAGGABLE_TRUE );
        this.dndHandlers.add( this.addDomHandler( new DragStartHandler() {
            @Override
            public void onDragStart( DragStartEvent event ) {
                event.setData( "text", "" );
                draggedElement = TagView.this;
                uiHandlers.onFocus();
            }
          }, DragStartEvent.getType() ) );
        
        
        this.dndHandlers.add( this.addDomHandler( new DragEnterHandler() {
            @Override
            public void onDragEnter( DragEnterEvent event ) {
                if( draggedElement.equals( TagView.this ) )
                    return;
                
                //Calculate the mouse's percentage X position relative to the drag over element
                //0 = left border; 100 = right border
                int percentagePositionX = ( event.getNativeEvent().getClientX() - getAbsoluteLeft() ) * 100 / getElement().getClientWidth(); 
                if( percentagePositionX < 50 ) {
                    tagPanel.addStyleName( Resources.INSTANCE.style().previewLeft() );
                    tagPanel.removeStyleName( Resources.INSTANCE.style().previewRight() );
                    
                } else {
                    tagPanel.addStyleName( Resources.INSTANCE.style().previewRight() );
                    tagPanel.removeStyleName( Resources.INSTANCE.style().previewLeft() );
                }
            }
        }, DragEnterEvent.getType() ) );
        
        this.dndHandlers.add( this.addDomHandler( new DragOverHandler() {
            @Override
            public void onDragOver( DragOverEvent event ) {
                if( draggedElement.equals( TagView.this ) )
                    return;
                
                //Calculate the mouse's percentage X position relative to the drag over element
                //0 = left border; 100 = right border
                int percentagePositionX = ( event.getNativeEvent().getClientX() - getAbsoluteLeft() ) * 100 / getElement().getClientWidth(); 
                if( percentagePositionX < 50 ) {
                    tagPanel.addStyleName( Resources.INSTANCE.style().previewLeft() );
                    tagPanel.removeStyleName( Resources.INSTANCE.style().previewRight() );
                    
                } else {
                    tagPanel.addStyleName( Resources.INSTANCE.style().previewRight() );
                    tagPanel.removeStyleName( Resources.INSTANCE.style().previewLeft() );
                }
            }
        }, DragOverEvent.getType() ) );
        
        this.dndHandlers.add( this.addDomHandler( new DragLeaveHandler() {
            @Override
            public void onDragLeave( DragLeaveEvent event ) {
                if( draggedElement.equals( TagView.this ) )
                    return;
                
                tagPanel.removeStyleName( Resources.INSTANCE.style().previewLeft() );
                tagPanel.removeStyleName( Resources.INSTANCE.style().previewRight() );
            }
        }, DragLeaveEvent.getType() ) );
        
        this.dndHandlers.add( this.addDomHandler( new DropHandler() {
            @Override
            public void onDrop( DropEvent event ) {
                if( draggedElement.equals( TagView.this ) )
                    return;
                
                event.preventDefault();
                uiHandlers.onRelocateTag( draggedElement, TagView.this,
                        tagPanel.getStyleName().contains( Resources.INSTANCE.style().previewLeft() ) ?
                                InsertionPoint.BEFORE : InsertionPoint.AFTER );
                tagPanel.removeStyleName( Resources.INSTANCE.style().previewLeft() );
                tagPanel.removeStyleName( Resources.INSTANCE.style().previewRight() );
            }
        }, DropEvent.getType() ) );
        
        this.dndHandlers.add( this.addDomHandler( new DragEndHandler() {
            @Override
            public void onDragEnd( DragEndEvent event ) {
                uiHandlers.onBlur();
            }
        }, DragEndEvent.getType() ) );
    }