/** * */ package fr.lteconsulting.hexa.client.ui.Ribbon; import java.util.ArrayList; import com.google.gwt.dom.client.Element; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.SimplePanel; //import com.google.gwt.user.client.ui.TabBar; import com.google.gwt.user.client.ui.Widget; /** * @author Arnaud * */ public class Ribbon extends Composite implements RibbonView { public interface RibbonCallback { void onRibbonChange( Object obj ); } RibbonCallback callback; ArrayList<Widget> m_tabs; SimplePanel m_tabPanel; TabBar m_tabBar; RibbonDef m_conf; public Ribbon( RibbonDef conf, final RibbonCallback callback ) { this.callback = callback; m_conf = conf; FlowPanel panel = new FlowPanel(); m_tabBar = new TabBar( new TabBar.Callback() { @Override public void onSelection( int index ) { m_tabPanel.setWidget( m_tabs.get( index ) ); } } ); panel.add( m_tabBar ); m_tabPanel = new SimplePanel(); panel.add( m_tabPanel ); /* * Definition of the Ribbon */ m_tabs = new ArrayList<Widget>(); for( int i = 0; i < conf.tabs.size(); i++ ) { m_tabBar.addTab( conf.tabs.get( i ).name ); final ButtonBar bar = new ButtonBar(); for( int j = 0; j < conf.tabs.get( i ).buttons.size(); j++ ) { final Object obj = conf.tabs.get( i ).buttons.get( j ).obj; Button button = new Button( conf.tabs.get( i ).buttons.get( j ).name, new ClickHandler() { @Override public void onClick( ClickEvent event ) { callback.onRibbonChange( obj ); } } ); bar.addButton( button, obj ); } m_tabs.add( bar ); } initWidget( panel ); panel.setSize( "100%", "100%" ); setStyleName( "Ribbon" ); m_tabPanel.setStyleName( "RibbonPanel" ); if( m_tabBar.getTabCount() > 0 ) m_tabBar.selectTab( 0 ); } public void setEnabled( Object obj, boolean fEnabled ) { for( int i = 0; i < m_conf.tabs.size(); i++ ) { ButtonBar bar = (ButtonBar) m_tabs.get( i ); bar.setEnabled( obj, fEnabled ); } } @Override public void selectButton( Object obj ) { for( int i = 0; i < m_conf.tabs.size(); i++ ) { ButtonBar bar = (ButtonBar) m_tabs.get( i ); bar.selectButton( obj ); for( int j = 0; j < m_conf.tabs.get( i ).buttons.size(); j++ ) { if( m_conf.tabs.get( i ).buttons.get( j ).obj == obj ) { m_tabBar.selectTab( i ); } } } } @Override public void setTabText( String id, String text ) { int index = -1; for( int i = 0; i < m_conf.tabs.size(); i++ ) if( m_conf.tabs.get( i ).id.equals( id ) ) { index = i; break; } if( index < 0 ) return; m_tabBar.setTabText( index, text ); } @Override public void setButtonText( Object obj, String text ) { for( int i = 0; i < m_conf.tabs.size(); i++ ) { ButtonBar bar = (ButtonBar) m_tabs.get( i ); bar.setButtonText( obj, text ); } } } class TabBar extends Widget { private Callback callback = null; private Element selected = null; private Element clear = null; interface Callback { void onSelection( int index ); } public TabBar( Callback callback ) { this.callback = callback; Element div = DOM.createDiv(); setElement( div ); setStylePrimaryName( "RibbonTab" ); clear = DOM.createDiv(); clear.getStyle().setProperty( "clear", "both" ); div.appendChild( clear ); addDomHandler( new ClickHandler() { @Override public void onClick( ClickEvent event ) { Element tgt = event.getNativeEvent().getEventTarget().cast(); if( tgt.getParentElement() != getElement() ) return; int index = DOM.getChildIndex( getElement(), tgt ); if( index >= getTabCount() ) return; selectTab( index ); } }, ClickEvent.getType() ); } public void addTab( String text ) { Element button = DOM.createDiv(); button.setClassName( getStylePrimaryName() + "-Item" ); button.setInnerText( text ); getElement().insertBefore( button, clear ); } public void setTabText( int index, String text ) { Element tab = getTab( index ); if( tab == null ) return; tab.setInnerText( text ); } public String getTabText( int index ) { Element tab = getTab( index ); if( tab == null ) return null; return tab.getInnerText(); } public int getTabCount() { return getElement().getChildCount() - 1; } public void selectTab( int index ) { selectTab( index, true ); } public void selectTab( int index, boolean fFireEvent ) { Element toSelect = getTab( index ); if( selected == toSelect ) return; if( selected != null ) selected.removeClassName( getStylePrimaryName() + "-Item-selected" ); if( toSelect != null ) toSelect.addClassName( getStylePrimaryName() + "-Item-selected" ); selected = toSelect; if( fFireEvent ) callback.onSelection( index ); } private Element getTab( int index ) { if( index >= getElement().getChildCount() - 1 ) return null; return Element.as( getElement().getChild( index ) ).cast(); } } class ButtonBar extends Composite { FlowPanel panel = new FlowPanel(); public ButtonBar() { initWidget( panel ); } public void addButton( Button button, Object obj ) { button.getElement().setPropertyObject( "object", obj ); panel.add( button ); } public void setEnabled( Object obj, boolean fEnabled ) { for( int i = 0; i < panel.getWidgetCount(); i++ ) { Button b = (Button) panel.getWidget( i ); if( b.getElement().getPropertyObject( "object" ) == obj ) b.setEnabled( fEnabled ); } } public void selectButton( Object obj ) { for( int i = 0; i < panel.getWidgetCount(); i++ ) { Button b = (Button) panel.getWidget( i ); if( b.getElement().getPropertyObject( "object" ) == obj ) b.addStyleName( "Ribbon-selected" ); else b.removeStyleName( "Ribbon-selected" ); } } public void setButtonText( Object obj, String text ) { for( int i = 0; i < panel.getWidgetCount(); i++ ) { Button b = (Button) panel.getWidget( i ); if( b.getElement().getPropertyObject( "object" ) == obj ) b.setText( text ); } } public String getButtonText( Object obj ) { for( int i = 0; i < panel.getWidgetCount(); i++ ) { Button b = (Button) panel.getWidget( i ); if( b.getElement().getPropertyObject( "object" ) == obj ) return b.getText(); } return null; } }