Package org.eclipse.jst.pagedesigner.properties.internal

Source Code of org.eclipse.jst.pagedesigner.properties.internal.AttributeGroup

/*******************************************************************************
* 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.properties.internal;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jst.jsf.common.metadata.Entity;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataDomainContext;
import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryContextFactory;
import org.eclipse.jst.jsf.common.metadata.query.internal.MetaDataQueryFactory;
import org.eclipse.jst.jsf.common.metadata.query.internal.taglib.ITaglibDomainMetaDataQuery;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
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.ISupportTextValue;
import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
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;

/**
* @author mengbo
* @version 1.5
*
* TODO: cleanup up constructors
*/
public class AttributeGroup extends DialogFieldGroup {
  private static final Object KEY_ATTR = "KEY_ATTR"; //$NON-NLS-1$

//  private String _helpContextId;

  private List<DialogField> _dialogFields = null//consider using Map
  private IDOMElement _ownerElement;
  private Entity _tagEntity;
  private List<String> _attrNames;
  private List<IPropertyPageDescriptor> _attrPDs;
  private IStructuredDocumentContext _sdContext;

  private String _uri;
  private String _tagName;
 
  /**
   * Constructor
   * @param tagEntity - may not be null
   * @param attrNames - may not be null.  Attribute names must be valid for the tag, and have attribute-value-runtime-type trait info
   */
  public AttributeGroup(Entity tagEntity, List<String> attrNames) {
    _tagEntity = tagEntity;
    _attrNames = attrNames;   
  }
 
  /**
   * Constructor where tagEntity is determined later or set later
   * @param uri - may be null
   * @param tagName - may be null
   * @param attributeNames - may not be null.  Attribute names must be valid for the tag, and have attribute-value-runtime-type trait info
   */
  public AttributeGroup(String uri,
      String tagName, String[] attributeNames) {
    _uri = uri;
    _tagName = tagName;
    if (attributeNames != null)
      _attrNames = Arrays.asList(attributeNames);
    else
      _attrNames = new ArrayList();
  }
 
  private List<IPropertyPageDescriptor> prepareDescriptors(Entity tagEntity,
      List<String> names) {
   
    List pds = new ArrayList();
    for (String attrName : names) {
      IPropertyPageDescriptor pd = getPD(tagEntity, attrName);
      if (pd != null)
        pds.add(pd);
    }
    return pds;
  }

  private IPropertyPageDescriptor getPD(Entity tagEntity, String attrName) {   
    IPropertyPageDescriptor pd = null;
    Entity attrEntity = getAttributeEntity(tagEntity, attrName);
    if (attrEntity != null){
      List pds = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
              IPropertyPageDescriptor.class, getStructuredDocumentContext(), attrEntity);         
      if (pds != null && !pds.isEmpty())
        pd = (IPropertyPageDescriptor)pds.get(0);
      else
        pd = new DefaultPropertyPageDescriptor(tagEntity, attrEntity);
    }
    return pd;
  }

    //we don't have enough context to use a query.   Must look at childEntities.
  private Entity getAttributeEntity(final Entity tagEntity, final String attrName) {
    for (final Entity attr : tagEntity.getChildEntities()) {
      if (attr.getId().equals(attrName))
        return attr;
    }
    return null;
  }

  private void resetStructuredDocumentContext() {
    _sdContext = null;
    getStructuredDocumentContext();   
  }

  private IStructuredDocumentContext getStructuredDocumentContext() {
    if (_sdContext == null) {
      if (_ownerElement != null) {
        _sdContext = IStructuredDocumentContextFactory.INSTANCE.getContext(_ownerElement.getStructuredDocument(), _ownerElement);       
       
      } else {
        IEditorPart edPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
        if (edPart != null && edPart instanceof HTMLEditor) {//edPart will always be the WPE, but checking just to be safe
          _sdContext = IStructuredDocumentContextFactory.INSTANCE.getContext(((HTMLEditor)edPart).getDocument(), 0);
        }
      }
    }
    return _sdContext;
  }

  /**
   * @return tag entity for this attribute group
   */
  protected Entity getTagEntity() {
    if (_tagEntity == null) {
      if (_ownerElement != null){
        IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(_ownerElement.getStructuredDocument(), 0);
        if (context != null){
          String uri = _uri != null ? _uri : IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(context).getNode().getBaseURI();
          String tagName = _tagName != null ? _tagName :  IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(context).getNode().getNodeName();
          if (uri != null){
            IFile file = (IFile)IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context).getResource();
            IMetaDataDomainContext mdcontext = MetaDataQueryContextFactory.getInstance().createTaglibDomainModelContext(file);
            ITaglibDomainMetaDataQuery _query = MetaDataQueryFactory.getInstance().createQuery(mdcontext);
            _tagEntity = _query.getQueryHelper().getEntity(uri, tagName);
          }
        }
      }
    }
    return _tagEntity;
  }
  /**
   * @return tag name
   */
  public String getTagName() {
    if (getTagEntity() == null)
      return _tagName;
    return getTagEntity().getId();
  }

  /**
   * @return tag URI
   */
  public String getURI() {
    if (getTagEntity() == null)
      return _uri;
    return getTagEntity().getModel().getId();
  }


  /**
   * Empty implementation. Subclasses should override to override default dialogField creation
   * @param ppd
   * @return DialogField
   */
  protected DialogField createDialogField(IPropertyPageDescriptor ppd) {
    return null;
  }
 
//  protected DialogField createDialogField(String uri, String tag,
//      String attr) {
//   
//    return null;
//  }
 
  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#initialize()
   */
  public void initialize() {
    if (_dialogFields == null) {
      _dialogFields = new ArrayList();

      for (IPropertyPageDescriptor pd : getAttributePDs()) {
        DialogField field;     
        field = createDialogField(pd);
       
        if (field == null) {
          field = pd.getDialogFieldEditor();
        }

        field.putAttachedData(KEY_ATTR, pd);//descriptors[i]);

        IDialogFieldApplyListener applyListener = getDialogFieldApplyListener(pd);
//            getURI(), getTagName(), pd.getAttributeName());//descriptors[i]);
        if (applyListener == null) {
          applyListener = getDefaultApplyListener();
        }
        field.setDialogFieldApplyListener(applyListener);

        IDialogFieldChangeListener changeListener = getDialogFieldChangeListener(pd);
//            getURI(), getTagName(), pd.getAttributeName());//descriptors[i]);
        if (changeListener == null) {
          changeListener = getDefaultChangeListener();
        }
        field.setDialogFieldChangeListener(changeListener);
        _dialogFields.add(field);
      }
    }
  }

  private List<IPropertyPageDescriptor> getAttributePDs() {
    if (_attrPDs == null){
      _attrPDs = prepareDescriptors(getTagEntity(), _attrNames);
    }
    return _attrPDs;
  }

  /**
   * Child class can override the method to provide listener implementation
   *
   * @param ppd
   * @return IDialogFieldApplyListener
   */
  protected IDialogFieldApplyListener getDialogFieldApplyListener(IPropertyPageDescriptor ppd) {
    return null;
  }

  /**
   * Child class can override the method to provide listener implementation
   *
   * @param ppd
   * @return IDialogFieldChangeListener
   */
  protected IDialogFieldChangeListener getDialogFieldChangeListener(IPropertyPageDescriptor ppd){
      return null;
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#refreshData()
   */
  public void refreshData() {
    if (_ownerElement == null) {
      return;
    }
    initialize();
    for (int i = 0, size = _dialogFields.size(); i < size; i++) {
      DialogField field = _dialogFields.get(i);

      ISupportTextValue textValue = (ISupportTextValue) field;
      IPropertyPageDescriptor attr = (IPropertyPageDescriptor) field
          .getAttachedData(KEY_ATTR);
      String attrName = attr.getAttributeName();
      String attrValue = _ownerElement.getAttribute(attrName);
      textValue.setTextWithoutUpdate(attrValue);
    }
  }

  /**
   * @return IDOMElement
   */
  public IDOMElement getElement() {
    return _ownerElement;
  }

  /**
   * Sets the context in each of the dialogFields in the Group
   * @param context
   * @param owner
   */
  public void setElementContext(IDOMNode context, IDOMElement owner) {
    this._ownerElement = owner;
    resetStructuredDocumentContext();
    initialize();
    if (context != null) {
      for (int i = 0, size = _dialogFields.size(); i < size; i++) {
        DialogField field = _dialogFields.get(i);
        if (field instanceof IElementContextable) {
          ((IElementContextable) field).setElementContext(context,
              owner);
        }
      }
    }
    refreshData();
  }

  public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
    Composite top;
    if (toolkit == null) {//when being displayed by DialogFieldGroupPage  (wizard)
      top = new Composite(parent, SWT.NONE);
      FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
      parent.setLayout(fillLayout);
    } else {
      top = toolkit.createComposite(parent, SWT.NONE);
    }
//    FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
//    parent.setLayout(fillLayout);

//    if (this._helpContextId != null && this._helpContextId.length() > 0) {
//      PlatformUI.getWorkbench().getHelpSystem().setHelp(top,
//          _helpContextId);
//    }

    GridLayout layout = new GridLayout();
    int numColumns = getNumColumns();
    layout.numColumns = numColumns;
    top.setLayout(layout);
//    top.setLayoutData(new RowData());
   
    initialize();
    for (int i = 0, size = _dialogFields.size(); i < size; i++) {
      DialogField field = _dialogFields.get(i);
      field.doFillIntoGrid(toolkit, top, numColumns);
    }

    DialogField maxColumnField = null;
    int maxColumn = 0;
    for (int i = 0, size = _dialogFields.size(); i < size; i++) {
      DialogField field = _dialogFields.get(i);
      int c = field.getNumberOfControls();
      if (c > maxColumn) {
        maxColumn = c;
        maxColumnField = field;
      }
    }
    if (maxColumnField != null) {
      maxColumnField.handleGrabHorizontal();
    }
  }

  /**
   * @return number of columns in for composite grid layout
   */
  public int getNumColumns() {
    int columns = 1;
    initialize();
    for (int i = 0, size = _dialogFields.size(); i < size; i++) {
      DialogField field = _dialogFields.get(i);
      columns = Math.max(columns, field.getNumberOfControls());
    }
    return columns;
  }
 
  @Override
  public IStatus[] validateDialogFields() {
    return null;
  }

  /**
   * @return DialogField[]
   */
  public DialogField[] getDialogFields() {
    initialize();
    DialogField[] ret = new DialogField[_dialogFields.size()];
    _dialogFields.toArray(ret);
    return ret;
  }

  /**
   * get the dialogfield for the corresponding attribute.
   *
   * @param attrName
   *            case sensitive attribute name.
   * @return null if fail to find.
   */
  public DialogField getDialogField(String attrName) {
    initialize();
    for (int i = 0, size = _dialogFields.size(); i < size; i++) {
      DialogField field = _dialogFields.get(i);
      IPropertyPageDescriptor attr = this.getPropertyDescriptor(field);
      if (attr != null && attr.getAttributeName().equals(attrName)) {
        return field;
      }
    }
    return null;
  }
 
  /**
   * @param field
   * @return IPropertyPageDescriptor
   */
  public IPropertyPageDescriptor getPropertyDescriptor(DialogField field) {
    Object obj = field.getAttachedData(KEY_ATTR);
    if (obj instanceof IPropertyPageDescriptor) {
      return (IPropertyPageDescriptor) obj;
    }
      return null;
  }
 
  @Override
  public void reset(){
    if (_dialogFields != null){
      for (DialogField field : _dialogFields){
        field.setDialogFieldApplyListener(null);
        field.setDialogFieldChangeListener(null);
      }
      _dialogFields = null;
    }
  }

  /**
   * Set the tag entity
   * @param tagEntity
   */
  /*package*/ void setTagEntity(Entity tagEntity) {
    _tagEntity = tagEntity;   
  }

  public String toString(){
    StringBuffer buf = new StringBuffer("AttributeGroup: uri="); //$NON-NLS-1$
    buf.append("\r\r").append(getURI()).append("\r\rtag=").append(getTagName()); //$NON-NLS-1$ //$NON-NLS-2$
    buf.append("\r\rAttrs: "); //$NON-NLS-1$
    for (int i=0;i<_attrNames.size();i++) {
      String attr = _attrNames.get(i);
      buf.append(attr);
      if (i<_attrNames.size())
        buf.append(", "); //$NON-NLS-1$
    }
    return buf.toString();
  }
 

}
TOP

Related Classes of org.eclipse.jst.pagedesigner.properties.internal.AttributeGroup

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.