Package org.eclipse.jst.pagedesigner.ui.dialogfields

Source Code of org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper

/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. and others.
*
* 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:
*     Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.ui.dialogfields;

import org.eclipse.core.runtime.Assert;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
import org.eclipse.jst.pagedesigner.meta.IBindingHandler;
import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;

/**
* This is a wrapper to a dialog field, by adding a small image button at the
* end. The caller is responsible to provide the image and the button click
* handler.
*
* @author mengbo
* @version 1.5
* @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper
*/
// NOTE: currently this class is dedicated to page designer by using the
// IElementContextable interface.
// It should be very easy to make it standard alone and reused in other places.
@SuppressWarnings("deprecation")
public class DialogFieldWrapper implements DialogField, ISupportTextValue,
    IElementContextable {
  private DialogField _wrapped;

  private IDOMNode _ancester;

  private IDOMElement _element;

  private Button _databindingButton;

  private boolean _databindingEnabled;

  private Image _image;

  private Image _disabledImage;

  private IStringButtonAdapter _adapter;

  private String _uri;

  private String _tagName;

    private IAttributeDescriptor _attr;

    private IBindingHandler _handler;

  private IPropertyPageDescriptor _pdattr;

  /**
   * @param field
   * @param image
   * @param disabledImage
   * @param uri
   * @param tagName
   * @param attr
   * @param handler
   *
   */
    public DialogFieldWrapper(DialogField field, Image image,
      Image disabledImage, String uri, String tagName,
      IAttributeDescriptor attr, IBindingHandler handler) {
    super();
    if (!(field instanceof ISupportTextValue)) {
      throw new IllegalArgumentException(
          "Field must be ISupportTextValue"); //$NON-NLS-1$
    }
    _wrapped = field;
    this._image = image;
    this._disabledImage = disabledImage;
    this._uri = uri;
    this._tagName = tagName;
    this._attr = attr;
    this._handler = handler;

    setDatabindingPressedHandler(new IStringButtonAdapter() {
      /*
       * (non-Javadoc)
       *
       * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
       */
            public void changeControlPressed(DialogField field1) {
        Shell shell = field1.getLabelControl(null, null).getShell();
        DialogFieldWrapper wrapper = (DialogFieldWrapper) field1;
        String result = _handler
            .handleBinding(shell, wrapper.getAncester(), wrapper
                .getElement(), wrapper.getText());
        if (result != null) {
          wrapper.setText(result);
        }
      }
    });
  }
 
  /**
   * @param field
   * @param image
   * @param disabledImage
   * @param uri
   * @param tagName
   * @param attr
   * @param handler
   *
   */
    public DialogFieldWrapper(DialogField field, Image image,
      Image disabledImage, String uri, String tagName,
      IPropertyPageDescriptor attr, IBindingHandler handler) {
    super();
    if (!(field instanceof ISupportTextValue)) {
      throw new IllegalArgumentException(
          "Field must be ISupportTextValue"); //$NON-NLS-1$
    }
    _wrapped = field;
    this._image = image;
    this._disabledImage = disabledImage;
    this._uri = uri;
    this._tagName = tagName;
    this._pdattr = attr;
    this._handler = handler;

    setDatabindingPressedHandler(new IStringButtonAdapter() {
      /*
       * (non-Javadoc)
       *
       * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
       */
      public void changeControlPressed(DialogField field1) {
        Shell shell = field1.getLabelControl(null, null).getShell();
        DialogFieldWrapper wrapper = (DialogFieldWrapper) field1;
        String result = _handler
            .handleBinding(shell, wrapper.getAncester(), wrapper
                .getElement(), wrapper.getText());
        if (result != null) {
          wrapper.setText(result);
        }
      }
    });
  }

  private void setDatabindingPressedHandler(IStringButtonAdapter adapter) {
    this._adapter = adapter;
    this.updateDatabindingControl();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#setTextWithoutUpdate(java.lang.String)
   */
  public void setTextWithoutUpdate(String value) {
    ((ISupportTextValue) _wrapped).setTextWithoutUpdate(value);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#getText()
   */
  public String getText() {
    return ((ISupportTextValue) _wrapped).getText();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#setText(java.lang.String)
   */
  public void setText(String value) {
    ((ISupportTextValue) _wrapped).setText(value);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable#setElementContext(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
   *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
   */
    public void setElementContext(IDOMNode ancester, IDOMElement element) {
    if (_wrapped instanceof IElementContextable) {
      ((IElementContextable) _wrapped).setElementContext(ancester,
          element);
    }
    this._ancester = ancester;
    this._element = element;

    boolean bindingEnabled = false;
   
    if (_attr != null)
      bindingEnabled = _handler.isEnabled(_ancester, _element, _uri,
        _tagName, _attr);
    else if (_pdattr != null)
      bindingEnabled = false;//_handler.isEnabled(_ancester, _element, _pdattr);
   
    this.setDatabindingEnabled(bindingEnabled);
  }

  // --------------------------------------------------------------------------------------------
  // wrapped method to add the data binding browse button
  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#doFillIntoGrid(org.eclipse.ui.forms.widgets.FormToolkit,
   *      org.eclipse.swt.widgets.Composite, int)
   */
  public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
      int nColumns) {
    Control[] wrappedControls = _wrapped.doFillIntoGrid(toolkit, parent,
        nColumns - 1);
    Control[] result = new Control[wrappedControls.length];

    Control button = getDatabingingButton(toolkit, parent);
    button.setLayoutData(gridDataForDatabindingButton(1));
    button.setVisible(false);

    System.arraycopy(wrappedControls, 0, result, 0, wrappedControls.length);
    result[result.length - 1] = _databindingButton;
    return result;
  }

  /**
   * @param span
   * @return
   */
  private GridData gridDataForDatabindingButton(int span) {
    GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
    gd.horizontalSpan = span;
    gd.widthHint = gd.heightHint = 18;
    return gd;
  }

  /**
   * @param toolkit
   * @param parent
   * @return
   */
  private Control getDatabingingButton(FormToolkit toolkit, Composite parent) {
    if (_databindingButton == null || _databindingButton.isDisposed()) {
      Assert.isNotNull(parent,
          "uncreated control requested with composite null"); //$NON-NLS-1$
      if (toolkit != null) {
        _databindingButton = toolkit.createButton(parent, "", SWT.PUSH); //$NON-NLS-1$
        _databindingButton.setImage(getImage());
      } else {
        _databindingButton = new Button(parent, SWT.PUSH);
        _databindingButton.setImage(getImage());
      }
      _databindingButton.addPaintListener(new PaintListener() {
        public void paintControl(PaintEvent e) {
          if (!_databindingButton.isEnabled()
              && getDisabledImage() != null) {
            Rectangle buttonBounds = _databindingButton.getBounds();
            Rectangle imageBounds = getDisabledImage().getBounds();
            e.gc.drawImage(getDisabledImage(),
                (buttonBounds.width - imageBounds.width) / 2,
                (buttonBounds.height - imageBounds.height) / 2);
          }
        }
      });
      _databindingButton.setEnabled(isEnabled() && _databindingEnabled);
      _databindingButton.addSelectionListener(new SelectionListener() {
        public void widgetDefaultSelected(SelectionEvent e) {
          databindingControlPressed();
        }

        public void widgetSelected(SelectionEvent e) {
          databindingControlPressed();
        }
      });

    }
    return _databindingButton;
  }

  /**
   * @return
   */
  private Image getImage() {
    return _image;
  }

  private Image getDisabledImage() {
    return _disabledImage;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#getLabelControl(org.eclipse.ui.forms.widgets.FormToolkit,
   *      org.eclipse.swt.widgets.Composite)
   */
  public Control getLabelControl(FormToolkit _formToolkit, Composite parent) {
    return _wrapped.getLabelControl(_formToolkit, parent);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setHyperLink(org.eclipse.ui.forms.events.IHyperlinkListener)
   */
  public void setHyperLink(IHyperlinkListener listener) {
    _wrapped.setHyperLink(listener);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setLabelText(java.lang.String)
   */
  public void setLabelText(String labeltext) {
    _wrapped.setLabelText(labeltext);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setDialogFieldChangeListener(org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener)
   */
  public void setDialogFieldChangeListener(IDialogFieldChangeListener listener) {
    _wrapped.setDialogFieldChangeListener(listener);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setDialogFieldApplyListener(org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener)
   */
  public void setDialogFieldApplyListener(IDialogFieldApplyListener listener) {
    _wrapped.setDialogFieldApplyListener(listener);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setFocus()
   */
  public boolean setFocus() {
    return _wrapped.setFocus();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#getNumberOfControls()
   */
  public int getNumberOfControls() {
    return _wrapped.getNumberOfControls() + 1;
  }

  /**
   * @param enabled
   */
  public void setDatabindingEnabled(boolean enabled) {
    this._databindingEnabled = enabled;
    updateDatabindingControl();
  }


  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setEnabled(boolean)
   */
  public void setEnabled(boolean enabled) {
    _wrapped.setEnabled(enabled);
    updateDatabindingControl();
  }

  /**
   *
   */
  private void updateDatabindingControl() {
    if (this._databindingButton != null && !_databindingButton.isDisposed()) {
      this._databindingButton.setEnabled(this.isEnabled()
          && _databindingEnabled && _adapter != null);
      _databindingButton.redraw();
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#isEnabled()
   */
  public boolean isEnabled() {
    return _wrapped.isEnabled();
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#getAttachedData(java.lang.Object)
   */
  public Object getAttachedData(Object key) {
    return _wrapped.getAttachedData(key);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#putAttachedData(java.lang.Object,
   *      java.lang.Object)
   */
  public void putAttachedData(Object key, Object value) {
    _wrapped.putAttachedData(key, value);
  }

  private void databindingControlPressed() {
    if (_adapter != null) {
      _adapter.changeControlPressed(this);
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
   */
  public void handleGrabHorizontal() {
    _wrapped.handleGrabHorizontal();
  }

  private IDOMNode getAncester() {
    return _ancester;
  }

  private IDOMElement getElement() {
    return _element;
  }

  /**
   * @return the wrapped field
   */
  public DialogField getWrappedDialogField() {
    return _wrapped;
  }

  public boolean isRequired() {
    return _wrapped.isRequired();
  }

  public void setToolTip(String toolTip) {
    _wrapped.setToolTip(toolTip);
  }

  public Shell getShell() {
    return _wrapped.getShell();
  }
}
TOP

Related Classes of org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper

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.