SchemaFormPage.java :  » IDE-Eclipse » Eclipse-plug-in-development » org » eclipse » pde » internal » ui » editor » schema » Java Open Source

Java Open Source » IDE Eclipse » Eclipse plug in development 
Eclipse plug in development » org » eclipse » pde » internal » ui » editor » schema » SchemaFormPage.java
/*******************************************************************************
 * Copyright (c) 2000, 2007 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.pde.internal.ui.editor.schema;
import org.eclipse.jface.action.ControlContribution;
import org.eclipse.pde.core.IModelChangedEvent;
import org.eclipse.pde.core.IModelChangedListener;
import org.eclipse.pde.internal.core.ischema.IMetaAttribute;
import org.eclipse.pde.internal.core.ischema.ISchema;
import org.eclipse.pde.internal.core.ischema.ISchemaAttribute;
import org.eclipse.pde.internal.core.ischema.ISchemaCompositor;
import org.eclipse.pde.internal.core.ischema.ISchemaElement;
import org.eclipse.pde.internal.core.ischema.ISchemaObject;
import org.eclipse.pde.internal.core.ischema.ISchemaObjectReference;
import org.eclipse.pde.internal.core.ischema.ISchemaRootElement;
import org.eclipse.pde.internal.ui.IHelpContextIds;
import org.eclipse.pde.internal.ui.IPDEUIConstants;
import org.eclipse.pde.internal.ui.PDEUIMessages;
import org.eclipse.pde.internal.ui.editor.PDEFormEditor;
import org.eclipse.pde.internal.ui.editor.PDEFormPage;
import org.eclipse.pde.internal.ui.editor.PDEMasterDetailsBlock;
import org.eclipse.pde.internal.ui.editor.PDESection;
import org.eclipse.pde.internal.ui.search.ShowDescriptionAction;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.DetailsPart;
import org.eclipse.ui.forms.IDetailsPage;
import org.eclipse.ui.forms.IDetailsPageProvider;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.events.IHyperlinkListener;
import org.eclipse.ui.forms.widgets.ImageHyperlink;
import org.eclipse.ui.forms.widgets.ScrolledForm;

public class SchemaFormPage extends PDEFormPage implements IModelChangedListener {
  public static final String PAGE_ID = "form"; //$NON-NLS-1$
  private ElementSection fSection;
  private SchemaBlock fBlock;
  private DetailsPart fDetailsPart;
  private ImageHyperlink fImageHyperlinkPreviewRefDoc;
  private ShowDescriptionAction fPreviewAction;

  public class SchemaBlock extends PDEMasterDetailsBlock implements IDetailsPageProvider {
    
    public SchemaBlock() {
      super(SchemaFormPage.this);
    }
    protected PDESection createMasterSection(IManagedForm managedForm, Composite parent) {
      fSection = new ElementSection(getPage(), parent);
      return fSection;
    }
    protected void registerPages(DetailsPart detailsPart) {
      fDetailsPart = detailsPart;
      detailsPart.setPageLimit(5);
      detailsPart.registerPage(ISchemaObjectReference.class, new SchemaElementReferenceDetails(fSection));
      detailsPart.registerPage(ISchemaRootElement.class, new SchemaRootElementDetails(fSection));
      detailsPart.registerPage(ISchemaElement.class, new SchemaElementDetails(fSection));
      detailsPart.registerPage(ISchemaCompositor.class, new SchemaCompositorDetails(fSection));
      detailsPart.registerPage(SchemaStringAttributeDetails.class, new SchemaStringAttributeDetails(fSection));
      detailsPart.registerPage(SchemaJavaAttributeDetails.class, new SchemaJavaAttributeDetails(fSection));
      detailsPart.registerPage(SchemaOtherAttributeDetails.class, new SchemaOtherAttributeDetails(fSection));
      detailsPart.setPageProvider(this);
    }
    public Object getPageKey(Object object) {
      if (object instanceof ISchemaObjectReference)
        return ISchemaObjectReference.class;
      else if (object instanceof ISchemaRootElement)
        return ISchemaRootElement.class;
      else if (object instanceof ISchemaElement)
        return ISchemaElement.class;
      else if (object instanceof ISchemaCompositor)
        return ISchemaCompositor.class;
      else if (object instanceof ISchemaAttribute) {
        ISchemaAttribute att = (ISchemaAttribute) object;
        int kind = att.getKind();
        switch (kind) {
          case IMetaAttribute.JAVA :
            return SchemaJavaAttributeDetails.class;
          case IMetaAttribute.STRING :
            if (att.getType().getName().equals(ISchemaAttribute.TYPES[ISchemaAttribute.STR_IND]))
              return SchemaStringAttributeDetails.class;
        }
        return SchemaOtherAttributeDetails.class;
      }
      else
        return null;
    }
    
    public IDetailsPage getPage(Object object) {
      return null;
    }
  }
  
  public SchemaFormPage(PDEFormEditor editor) {
    super(editor, PAGE_ID, PDEUIMessages.SchemaEditor_FormPage_title);
    fBlock = new SchemaBlock();
  }
   
  /* (non-Javadoc)
   * @see org.eclipse.pde.internal.ui.editor.PDEFormPage#getHelpResource()
   */
  protected String getHelpResource() {
    return IPDEUIConstants.PLUGIN_DOC_ROOT + "guide/tools/editors/schema_editor/definition.htm"; //$NON-NLS-1$
  }
  
  protected void createFormContent(IManagedForm managedForm) {
    ScrolledForm form = managedForm.getForm();   
    ISchema schema = (ISchema)((SchemaEditor)getEditor()).getAggregateModel();

    if (schema.isEditable()) {
       form.getToolBarManager().add(createUIControlConPreviewRefDoc());
       form.getToolBarManager().update(true);
    }

    super.createFormContent(managedForm);
    fBlock.createContent(managedForm);
    PlatformUI.getWorkbench().getHelpSystem().setHelp(form.getBody(), IHelpContextIds.SCHEMA_EDITOR_MAIN);
    initialize();
  }
  
  /**
   * @return
   */
  private ControlContribution createUIControlConPreviewRefDoc() {
    return new ControlContribution("Preview") { //$NON-NLS-1$
      protected Control createControl(Composite parent) {
        // Create UI
        createUIImageHyperlinkPreviewRefDoc(parent);
        // Create Listener
        createUIListenerImageHyperlinkPreviewRefDoc();
        return fImageHyperlinkPreviewRefDoc;
      }
    };      
  }

  /**
   * @param parent
   */
  private void createUIImageHyperlinkPreviewRefDoc(Composite parent) {
    fImageHyperlinkPreviewRefDoc = new ImageHyperlink(parent, SWT.NONE);
    fImageHyperlinkPreviewRefDoc.setText(
        PDEUIMessages.SchemaEditor_previewLink);
    fImageHyperlinkPreviewRefDoc.setUnderlined(true);
    fImageHyperlinkPreviewRefDoc.setForeground(
        getManagedForm().getToolkit().getHyperlinkGroup().getForeground());
  }

  /**
   * 
   */
  private void createUIListenerImageHyperlinkPreviewRefDoc() {
    fImageHyperlinkPreviewRefDoc.addHyperlinkListener(new IHyperlinkListener() {
      public void linkActivated(HyperlinkEvent e) {
        handleLinkActivatedPreviewRefDoc();
      }
      public void linkEntered(HyperlinkEvent e) {
        handleLinkEnteredPreviewRefDoc(e.getLabel());
      }
      public void linkExited(HyperlinkEvent e) {
        handleLinkExitedPreviewRefDoc();
      }
    });  
  }
  
  /**
   * @param message
   */
  private void handleLinkEnteredPreviewRefDoc(String message) {
    // Update colour
    fImageHyperlinkPreviewRefDoc.setForeground(
        getManagedForm().getToolkit().getHyperlinkGroup().getActiveForeground());
    // Update IDE status line
    getEditor().getEditorSite().getActionBars().getStatusLineManager().setMessage(message);
  }  
  
  /**
   *
   */
  private void handleLinkExitedPreviewRefDoc() {
    // Update colour
    fImageHyperlinkPreviewRefDoc.setForeground(
        getManagedForm().getToolkit().getHyperlinkGroup().getForeground());
    // Update IDE status line
    getEditor().getEditorSite().getActionBars().getStatusLineManager().setMessage(null);
  }    
  
  /**
   * 
   */
  private void handleLinkActivatedPreviewRefDoc() {
    ISchema schema = (ISchema)((SchemaEditor)getEditor()).getAggregateModel();
    if(fPreviewAction == null)
    {  fPreviewAction = new ShowDescriptionAction(schema);
    }
    else
    {  fPreviewAction.setSchema(schema);
    }
    
    fPreviewAction.run();
  }  
   
  public void initialize() {
    ISchema schema = (ISchema)getModel();
    getManagedForm().getForm().setText(schema.getName());
    schema.addModelChangedListener(this);
  }
  public void dispose() {
    ISchema schema = (ISchema) getModel();
    if (schema != null) schema.removeModelChangedListener(this);
    super.dispose();
  }

  public void modelChanged(IModelChangedEvent event) {
    if (event.getChangeType() == IModelChangedEvent.CHANGE) {
      String changeProperty = event.getChangedProperty();
      if (changeProperty != null && changeProperty.equals(ISchemaObject.P_NAME)) {
        Object[] change = event.getChangedObjects();
        if (change.length > 0 && change[0] instanceof ISchema)
          getManagedForm().getForm().setText(((ISchema)change[0]).getName());
      }
    } else if (event.getChangeType() == IModelChangedEvent.WORLD_CHANGED) {
      handleModelEventWorldChanged(event);
    }
    // Update master section
    if (fSection != null) {
      fSection.handleModelChanged(event);
    }
    // Update details section
    IDetailsPage page = fDetailsPart.getCurrentPage();
    if (page instanceof IModelChangedListener) {
      ((IModelChangedListener)page).modelChanged(event);
    }
  }
  
  /**
   * @param event
   */
  private void handleModelEventWorldChanged(IModelChangedEvent event) {
    // Note:  Cannot use event.  There are no changed objects within it
    // This method acts like a refresh
    ISchema schema = (ISchema)getModel();
    getManagedForm().getForm().setText(schema.getName());
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.