/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.gwt.widgets.client.buttons; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.NativeEvent; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.DomEvent; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.Widget; import org.pentaho.gwt.widgets.client.utils.ElementUtils; import java.util.ArrayList; import java.util.List; @SuppressWarnings( "deprecation" ) public class RoundedButton extends Widget implements HasClickHandlers { private String text = ""; //$NON-NLS-1$ private String baseStyleName = "roundedbutton"; //$NON-NLS-1$ private Label label = new Label(); private SimplePanel leftPanel = new SimplePanel(); private SimplePanel rightPanel = new SimplePanel(); private boolean enabled = true; protected List<ClickListener> listeners = new ArrayList<ClickListener>(); protected Command command; public RoundedButton() { createElement(); this.setStylePrimaryName( baseStyleName ); sinkEvents( Event.MOUSEEVENTS ); sinkEvents( Event.ONDBLCLICK ); } public RoundedButton( final String text ) { this(); setText( text ); } public RoundedButton( final String text, Command command ) { this( text ); this.command = command; } private void createElement() { HorizontalPanel hbox = new HorizontalPanel(); this.setElement( hbox.getElement() ); hbox.setStyleName( baseStyleName ); super.setStylePrimaryName( baseStyleName ); // Add in placeholder simplepanels leftPanel.setStylePrimaryName( this.getStylePrimaryName() ); leftPanel.addStyleDependentName( "left" ); //$NON-NLS-1$ hbox.add( leftPanel ); hbox.add( label ); rightPanel.setStylePrimaryName( this.getStylePrimaryName() ); rightPanel.addStyleDependentName( "right" ); //$NON-NLS-1$ hbox.add( rightPanel ); // Set styles leftPanel.setStylePrimaryName( this.getStylePrimaryName() ); rightPanel.setStylePrimaryName( this.getStylePrimaryName() ); label.getElement().getParentElement().setClassName( this.getStylePrimaryName() + "-slice" ); //$NON-NLS-1$ label.setStylePrimaryName( this.getStylePrimaryName() ); label.addStyleDependentName( "label" ); //$NON-NLS-1$ // prevent double-click from selecting text ElementUtils.preventTextSelection( label.getElement() ); } @Override public void setStylePrimaryName( String style ) { super.setStylePrimaryName( style ); baseStyleName = style; label.setStylePrimaryName( style + "-label" ); //$NON-NLS-1$ rightPanel.setStylePrimaryName( style + "-right" ); //$NON-NLS-1$ leftPanel.setStylePrimaryName( style + "-left" ); //$NON-NLS-1$ label.getElement().getParentElement().setClassName( style + "-slice" ); //$NON-NLS-1$ } @Override public void addStyleDependentName( String style ) { super.addStyleDependentName( style ); label.addStyleDependentName( style ); rightPanel.addStyleDependentName( style ); leftPanel.addStyleDependentName( style ); label.getElement().getParentElement().setClassName( this.getStylePrimaryName() + "-slice-" + style ); //$NON-NLS-1$ } @Override public void removeStyleDependentName( String style ) { super.removeStyleDependentName( style ); label.removeStyleDependentName( style ); rightPanel.removeStyleDependentName( style ); leftPanel.removeStyleDependentName( style ); label.getElement().getParentElement().setClassName( this.getStylePrimaryName() + "-slice" ); //$NON-NLS-1$ } public String getText() { return text; } public void setText( String text ) { this.text = text; label.setText( text ); } public void setEnabled( boolean enabled ) { boolean prevVal = this.enabled; this.enabled = enabled; if ( prevVal && enabled ) { return; } else if ( !enabled ) { this.addStyleDependentName( "disabled" ); //$NON-NLS-1$ } else if ( enabled ) { this.removeStyleDependentName( "disabled" ); //$NON-NLS-1$ } } public boolean isEnabled() { return enabled; } public void onBrowserEvent( Event event ) { switch ( event.getTypeInt() ) { case Event.ONMOUSEUP: if ( RoundedButton.this.isEnabled() ) { fireClicked(); if ( command != null ) { command.execute(); } removeStyleDependentName( "over" ); //$NON-NLS-1$ event.cancelBubble( true ); event.preventDefault(); } break; case Event.ONDBLCLICK: event.cancelBubble( true ); event.preventDefault(); break; case Event.ONMOUSEOVER: if ( RoundedButton.this.isEnabled() ) { RoundedButton.this.addStyleDependentName( "over" ); //$NON-NLS-1$ } break; case Event.ONMOUSEOUT: if ( RoundedButton.this.isEnabled() ) { RoundedButton.this.removeStyleDependentName( "over" ); //$NON-NLS-1$ } break; } } public HandlerRegistration addClickHandler( ClickHandler handler ) { return addDomHandler( handler, ClickEvent.getType() ); } private void fireClicked() { // Deprecated interface for ( ClickListener listener : listeners ) { listener.onClick( this ); } // New 1.6 style events NativeEvent evt = Document.get().createClickEvent( 0, 0, 0, 0, 0, false, false, false, false ); DomEvent.fireNativeEvent( evt, this ); } @Deprecated public void addClickListener( ClickListener listener ) { listeners.add( listener ); } @Deprecated public void removeClickListener( ClickListener listener ) { listeners.remove( listener ); } public void setFocus( boolean focus ) { this.setFocus( focus ); } }