/*******************************************************************************
 * Copyright (c) 2002, 2012 Innoopract Informationssysteme GmbH.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Innoopract Informationssysteme GmbH - initial API and implementation
 *    EclipseSource - ongoing development
 ******************************************************************************/
package org.eclipse.rap.demo.controls;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;


public class SpinnerTab extends ExampleTab {

  private Spinner spinner;
  private Spinner modifySpinner;
  private int minimum;
  private int maximum;
  private int digits;
  private int increment;
  private int pageIncrement;
  private int selection;

  public SpinnerTab() {
    super( "Spinner" );
    minimum = 0;
    maximum = 100;
    digits = 0;
    increment = 1;
    pageIncrement = 10;
    selection = 0;
  }

  @Override
  protected void createStyleControls( final Composite parent ) {
    createStyleButton( "BORDER", SWT.BORDER );
    createStyleButton( "READ_ONLY", SWT.READ_ONLY );
    createStyleButton( "WRAP", SWT.WRAP );
    createVisibilityButton();
    createEnablementButton();
    createRangeControls( parent );
    createFgColorButton();
    createBgColorButton();
    createFontChooser();
    createCursorCombo();
  }

  @Override
  protected void createExampleControls( final Composite parent ) {
    GridLayout gridLayout = new GridLayout( 2, false );
    parent.setLayout( gridLayout );
    Label label = new Label( parent, SWT.NONE );
    label.setText( "Simple Spinner" );
    spinner = new Spinner( parent, getStyle() );
    label = new Label( parent, SWT.NONE );
    label.setText( "Spinner with ModifyListener" );
    modifySpinner = new Spinner( parent, getStyle() );
    label = new Label( parent, SWT.NONE );
    label.setText( "Current value" );
    final Label lblSpinnerValue = new Label( parent, SWT.NONE );
    lblSpinnerValue.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, false ) );
    lblSpinnerValue.setText( String.valueOf( modifySpinner.getSelection() ) );
    modifySpinner.addModifyListener( new ModifyListener() {

      public void modifyText( final ModifyEvent event ) {
        String value = String.valueOf( modifySpinner.getSelection() );
        lblSpinnerValue.setText( value );
      }
    } );
    updateSpinners();
    registerControl( spinner );
    registerControl( modifySpinner );
  }

  private void createRangeControls( final Composite parent ) {
    Group group = new Group( parent, SWT.NONE );
    group.setText( "Settings" );
    group.setLayout( new GridLayout( 2, false ) );

    final Text txtMin
      = createLabeledText( group, "Minimum", String.valueOf( minimum ) );
    final Text txtMax
      = createLabeledText( group, "Maximum", String.valueOf( maximum ) );
    final Spinner spnDigits
      = createLabeledSpinner( group, "Digits", digits );
    final Text txtInc
      = createLabeledText( group, "Increment", String.valueOf( increment ) );
    final Text txtPageInc = createLabeledText( group,
                                               "PageIncrement",
                                               String.valueOf( pageIncrement ) );
    final Text txtSelection
      = createLabeledText( group, "Selection", String.valueOf( selection ) );
    Button btnApply = new Button( group, SWT.PUSH );
    btnApply.setText( "Apply" );
    GridData btnApplyData = new GridData( GridData.HORIZONTAL_ALIGN_END );
    btnApplyData.horizontalSpan = 2;
    btnApply.setLayoutData( btnApplyData );
    btnApply.addSelectionListener( new SelectionAdapter() {

      @Override
      public void widgetSelected( final SelectionEvent event ) {
        minimum = parseInt( txtMin, spinner.getMinimum() );
        maximum = parseInt( txtMax, spinner.getMaximum() );
        digits = spnDigits.getSelection();
        increment = parseInt( txtInc, spinner.getIncrement() );
        pageIncrement = parseInt( txtPageInc, spinner.getPageIncrement() );
        selection = parseInt( txtSelection, spinner.getSelection() );
        updateSpinners();
      }
    } );
  }

  private Text createLabeledText( final Composite parent,
                                  final String text,
                                  final String value )
  {
    final Label label = new Label( parent, SWT.NONE );
    label.setText( text );
    final Text result = new Text( parent, SWT.BORDER );
    result.setText( value );
    result.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
    return result;
  }

  private Spinner createLabeledSpinner( final Composite parent,
                                        final String text,
                                        final int value )
  {
    final Label label = new Label( parent, SWT.NONE );
    label.setText( text );
    final Spinner result = new Spinner( parent, SWT.BORDER );
    result.setSelection( value );
    result.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
    return result;
  }

  private void updateSpinners() {
    spinner.setValues( selection,
                       minimum,
                       maximum,
                       digits,
                       increment,
                       pageIncrement );
    modifySpinner.setValues( selection,
                             minimum,
                             maximum,
                             digits,
                             increment,
                             pageIncrement );
  }

  private int parseInt( final Text text, final int oldValue ) {
    int result;
    try {
      result = Integer.parseInt( text.getText() );
    } catch( NumberFormatException e ) {
      text.setText( String.valueOf( oldValue ) );
      result = oldValue;
    }
    return result;
  }
}
