Package melnorme.util.swt.components

Source Code of melnorme.util.swt.components.AbstractField

/*******************************************************************************
* Copyright (c) 2014, 2014 Bruno Medeiros and other Contributors.
* 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:
*     Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.util.swt.components;

import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;
import melnorme.util.swt.SWTUtil;

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.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.Text;

/**
* Field component with a field value that can be manipulated (get/set) even if the
* componented is not created.
*/
public abstract class AbstractField<VALUE> extends CommonFieldComponent<VALUE> {
 
  private VALUE value; // private to prevent direct modifications.
  protected boolean listenersNeedNotify;
 
  public AbstractField() {
    this.value = assertNotNull(getDefaultFieldValue());
  }
 
  public abstract VALUE getDefaultFieldValue();
 
  @Override
  public VALUE getFieldValue() {
    return assertNotNull(value);
  }
 
  @Override
  public void setFieldValue(VALUE value) {
    if(value == null) {
      value = getDefaultFieldValue();
    }
    doSetFieldValue(value, true);
  }
 
  /** Update the field value from a control modification. */
  protected void setFieldValueFromControl(VALUE newValue) {
    doSetFieldValue(newValue, false);
  }
 
  protected void doSetFieldValue(VALUE newValue, boolean needsUpdateControls) {
    this.value = newValue;
    this.listenersNeedNotify = true;
   
    if(needsUpdateControls) {
      updateComponentFromInput();
    }
    if(listenersNeedNotify) {
      fireFieldValueChanged();
    }
    listenersNeedNotify = false;
  }
 
  @Override
  public void updateComponentFromInput() {
    if(isCreated()) {
      doUpdateComponentFromValue();
    }
  }
 
  /** do Update component controls for given value.
   * Precondition: component is created.*/
  protected abstract void doUpdateComponentFromValue();
 
  @Override
  protected abstract void createContents(Composite topControl);
 
  /* -----------------  ----------------- */
 
  protected abstract Control getFieldControl();
 
  public boolean isCreated() {
    return SWTUtil.isOkToUse(getFieldControl());
  }
 
  /* ----------------- create helpers ----------------- */
 
  protected static Text createFieldText(final AbstractField<String> field, Composite parent, int style) {
    final Text text = new Text(parent, style);
    text.addModifyListener(new ModifyListener() {
      @Override
      public void modifyText(ModifyEvent e) {
        field.setFieldValueFromControl(text.getText());
      }
    });
    return text;
  }
 
  protected static Button createFieldCheckbox(final AbstractField<Boolean> field, Composite parent,
      int style) {
    final Button checkBox = new Button(parent, SWT.CHECK | style);
    checkBox.addSelectionListener(new SelectionAdapter() {
      @Override
      public void widgetSelected(SelectionEvent e) {
        field.setFieldValueFromControl(checkBox.getSelection());
      }
    });
    return checkBox;
  }
 
  protected static Spinner createFieldSpinner(final AbstractField<Integer> field, Composite parent,
      int style) {
    final Spinner spinner = new Spinner(parent, style);
    spinner.addModifyListener(new ModifyListener() {
      @Override
      public void modifyText(ModifyEvent e) {
        field.setFieldValueFromControl(spinner.getSelection());
      }
    });
    return spinner;
  }
 
  protected static Combo createFieldCombo(final AbstractField<Integer> field, Composite topControl, int style) {
    final Combo combo = new Combo(topControl, style);
    combo.addSelectionListener(new SelectionAdapter() {
      @Override
      public void widgetSelected(SelectionEvent e) {
        int selectionIndex = combo.getSelectionIndex();
        field.setFieldValueFromControl(selectionIndex);
      }
    });
    return combo;
  }
 
}
TOP

Related Classes of melnorme.util.swt.components.AbstractField

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.