All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.kie.uberfire.client.common.UberBreadcrumbs Maven / Gradle / Ivy

The newest version!
package org.kie.uberfire.client.common;

import java.util.ArrayList;
import java.util.List;

import com.github.gwtbootstrap.client.ui.Dropdown;
import com.github.gwtbootstrap.client.ui.NavWidget;
import com.github.gwtbootstrap.client.ui.base.ComplexWidget;
import com.github.gwtbootstrap.client.ui.base.ListItem;
import com.github.gwtbootstrap.client.ui.base.UnorderedList;
import com.github.gwtbootstrap.client.ui.constants.Constants;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.WidgetCollection;

public class UberBreadcrumbs extends UnorderedList {

    private WidgetCollection children = new WidgetCollection( this );

    private List dividerList = new ArrayList();

    private String divider = "/";

    private static class Divider extends ComplexWidget {

        public Divider( String divider ) {
            super( "span" );
            setStyleName( Constants.DIVIDER );
            setDivider( divider );
        }

        public void setDivider( String divider ) {
            getElement().setInnerText( divider );
        }
    }

    /**
     * Create a empty Breadcrumbs
     */
    public UberBreadcrumbs() {
        setStyleName( Constants.BREADCRUMB );
    }

    /**
     * Create Breadcrumbs with widgets
     * @param widgets widgets
     */
    public UberBreadcrumbs( Widget... widgets ) {
        this();

        for ( Widget widget : widgets ) {
            this.add( widget );
        }
    }

    /**
     * Create Breadcrumbs with setting divider character
     * @param divider separate char (ex : ">")
     */
    public UberBreadcrumbs( String divider ) {
        this();
        this.setDivider( divider );
    }

    /**
     * Set separater character
     * @param divider separater character
     */
    public void setDivider( String divider ) {
        if ( divider == null || divider.isEmpty() ) {
            this.divider = "/";
        } else {
            this.divider = divider;
        }

        for ( Divider dividerWidget : dividerList ) {
            dividerWidget.setDivider( this.divider );
        }

    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected void onAttach() {

        if ( !isOrWasAttached() && children.size() > 0 ) {

            Widget lastWidget = children.get( children.size() - 1 );

            for ( final Widget w : children ) {
                Widget item = lastWidget.equals( w ) ? w : getOrCreateListItem( w );
                if (item != null){
                    super.add( item );
                }
            }
        }

        super.onAttach();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void add( Widget w ) {

        w.removeStyleName( Constants.ACTIVE );

        if ( !isOrWasAttached() ) {

            children.add( w );

            return;
        }

        if ( children.size() > 0 ) {
            //Change last widget 2 Link

            //pygical remove
            super.remove( getWidget( getWidgetCount() - 1 ) );

            ComplexWidget item = getOrCreateListItem( children.get( children.size() - 1 ) );

            if (item != null){
                super.add( item );
            }
        }

        super.add( w );

        children.add( w );
    }

    private ComplexWidget getOrCreateListItem( final Widget lastWidget ) {
        ListItem item = null;

        final Divider dividerWidget = new Divider( divider );
        if ( lastWidget instanceof NavWidget ) {
            NavWidget w = (NavWidget) lastWidget;

            if ( hasDivier( w ) ) {

                return w;
            } else {
                dividerList.add( dividerWidget );
                w.addWidget( dividerWidget );
                return w;
            }
        } else if ( lastWidget instanceof Dropdown ) {
            final Dropdown w = (Dropdown) lastWidget;

            if ( hasDivier( w ) ) {
                return w;
            } else {
                dividerList.add( dividerWidget );
                super.add( w );
                super.add( dividerWidget );
                return null;
            }
        } else if ( lastWidget instanceof ListItem ) {
            item = (ListItem) lastWidget;
        } else {
            item = new ListItem( lastWidget );
        }

        if ( hasDivier( item ) ) {
            return item;
        }

        item.add( dividerWidget );
        dividerList.add( dividerWidget );

        return item;
    }

    private boolean hasDivier( final ComplexWidget item ) {

        for ( Widget w : item ) {
            if ( w instanceof Divider ) {
                return true;
            }
        }
        return false;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean remove( Widget w ) {

        if ( !isOrWasAttached() && children.contains( w ) ) {
            children.remove( w );
            return true;
        }

        if ( getWidgetIndex( w ) < 0 && !children.contains( w ) ) {
            return false;
        }

        if ( getWidgetIndex( w ) >= 0 && children.contains( w ) ) {
            children.remove( w );
            super.remove( w );
        } else if ( getWidgetIndex( w ) >= 0 && !children.contains( w ) ) {
            children.remove( getWidgetIndex( w ) );
            super.remove( w );
        } else if ( getWidgetIndex( w ) < 0 && children.contains( w ) ) {
            return remove( getWidget( children.indexOf( w ) ) );
        } else {
            return false;
        }

        return true;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void clear() {
        super.clear();
        children = new WidgetCollection( this );
        dividerList.clear();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy