Package org.eclipse.php.internal.ui.wizards

Source Code of org.eclipse.php.internal.ui.wizards.NewGenericFileTemplatesWizardPage$TemplateContentProvider

/*******************************************************************************
* Copyright (c) 2009 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
*     Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.ui.wizards;

import org.eclipse.core.resources.IProject;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.jface.text.templates.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.php.internal.core.documentModel.provisional.contenttype.ContentTypeIdForPHP;
import org.eclipse.php.internal.ui.IPHPHelpContextIds;
import org.eclipse.php.internal.ui.editor.configuration.PHPStructuredTextViewerConfiguration;
import org.eclipse.php.internal.ui.preferences.PHPTemplateStore;
import org.eclipse.php.internal.ui.preferences.PHPTemplateStore.CompiledTemplate;
import org.eclipse.php.internal.ui.preferences.PreferenceConstants;
import org.eclipse.php.internal.ui.viewsupport.ProjectTemplateStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;

/**
* Templates page in new file wizard. Allows users to select a new file template
* to be applied in new file.
*
*/
public abstract class NewGenericFileTemplatesWizardPage extends WizardPage {

  /**
   * Content provider for templates
   */
  private class TemplateContentProvider implements IStructuredContentProvider {
    /** The template store. */
    private ProjectTemplateStore fStore;

    /*
     * @see IContentProvider#dispose()
     */
    public void dispose() {
      fStore = null;
    }

    /*
     * @see IStructuredContentProvider#getElements(Object)
     */
    public Object[] getElements(Object input) {
      return fStore.getTemplates(NewGenericFileTemplatesWizardPage.this
          .getTemplateContextTypeId());
    }

    /*
     * @see IContentProvider#inputChanged(Viewer, Object, Object)
     */
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
      fStore = (ProjectTemplateStore) newInput;
    }
  }

  /**
   * Label provider for templates.
   */
  private class TemplateLabelProvider extends LabelProvider implements
      ITableLabelProvider {

    /*
     * @see
     * org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java
     * .lang.Object, int)
     */
    public Image getColumnImage(Object element, int columnIndex) {
      return null;
    }

    /*
     * @see
     * org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.
     * lang.Object, int)
     */
    public String getColumnText(Object element, int columnIndex) {
      Template template = (Template) element;

      switch (columnIndex) {
      case 0:
        return template.getName();
      case 1:
        return template.getDescription();
      default:
        return ""; //$NON-NLS-1$
      }
    }
  }

  /** Last selected template name */
  protected String fLastSelectedTemplateName;
  /** The viewer displays the pattern of selected template. */
  private SourceViewer fPatternViewer;
  /** The table presenting the templates. */
  private TableViewer fTableViewer;
  /** Template store used by this wizard page */
  private ProjectTemplateStore fTemplateStore;
  /** Checkbox for using templates. */
  protected Button fUseTemplateButton;
  private IProject fProject;

  public NewGenericFileTemplatesWizardPage(String title, String description) {
    super("NewGenericTemplatesWizardPage", title, null); //$NON-NLS-1$
    setDescription(description);
  }

  /**
   * Correctly resizes the table so no phantom columns appear
   *
   * @param parent
   *            the parent control
   * @param buttons
   *            the buttons
   * @param table
   *            the table
   * @param column1
   *            the first column
   * @param column2
   *            the second column
   * @param column3
   *            the third column
   */
  private void configureTableResizing(final Composite parent,
      final Table table, final TableColumn column1,
      final TableColumn column2) {
    parent.addControlListener(new ControlAdapter() {
      @Override
      public void controlResized(ControlEvent e) {
        Rectangle area = parent.getClientArea();
        Point preferredSize = table.computeSize(SWT.DEFAULT,
            SWT.DEFAULT);
        int width = area.width - 2 * table.getBorderWidth();
        if (preferredSize.y > area.height) {
          // Subtract the scrollbar width from the total column
          // width
          // if a vertical scrollbar will be required
          Point vBarSize = table.getVerticalBar().getSize();
          width -= vBarSize.x;
        }

        Point oldSize = table.getSize();
        if (oldSize.x > width) {
          // table is getting smaller so make the columns
          // smaller first and then resize the table to
          // match the client area width
          column1.setWidth(width / 2);
          column2.setWidth(width / 2);
          table.setSize(width, area.height);
        } else {
          // table is getting bigger so make the table
          // bigger first and then make the columns wider
          // to match the client area width
          table.setSize(width, area.height);
          column1.setWidth(width / 2);
          column2.setWidth(width / 2);
        }
      }
    });
  }

  public void createControl(Composite ancestor) {
    Composite parent = new Composite(ancestor, SWT.NONE);
    GridLayout layout = new GridLayout();
    layout.numColumns = 2;
    parent.setLayout(layout);

    // create checkbox for user to use HTML Template
    fUseTemplateButton = new Button(parent, SWT.CHECK);
    fUseTemplateButton.setText(this.getUseTemplateMessage());
    GridData data = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
    fUseTemplateButton.setLayoutData(data);
    fUseTemplateButton.addSelectionListener(new SelectionAdapter() {
      @Override
      public void widgetSelected(SelectionEvent e) {
        enableTemplates();
      }
    });

    // create composite for Templates table
    Composite innerParent = new Composite(parent, SWT.NONE);
    GridLayout innerLayout = new GridLayout();
    innerLayout.numColumns = 2;
    innerLayout.marginHeight = 0;
    innerLayout.marginWidth = 0;
    innerParent.setLayout(innerLayout);
    GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
    innerParent.setLayoutData(gd);

    // Create linked text to just to templates preference page
    Link link = new Link(innerParent, SWT.NONE);
    link.setText(getTemplatesLocationMessage());
    data = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
    link.setLayoutData(data);
    link.addSelectionListener(new SelectionAdapter() {
      @Override
      public void widgetSelected(SelectionEvent e) {
        linkClicked();
      }
    });

    // create table that displays templates
    Table table = new Table(innerParent, SWT.BORDER | SWT.FULL_SELECTION);

    data = new GridData(GridData.FILL_BOTH);
    data.widthHint = convertWidthInCharsToPixels(2);
    data.heightHint = convertHeightInCharsToPixels(10);
    data.horizontalSpan = 2;
    table.setLayoutData(data);
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
    TableLayout tableLayout = new TableLayout();
    table.setLayout(tableLayout);

    TableColumn column1 = new TableColumn(table, SWT.NONE);
    column1.setText(Messages.NewGenericFileTemplatesWizardPage_0);

    TableColumn column2 = new TableColumn(table, SWT.NONE);
    column2.setText(Messages.NewGenericFileTemplatesWizardPage_1);

    fTableViewer = new TableViewer(table);
    fTableViewer.setLabelProvider(new TemplateLabelProvider());
    fTableViewer.setContentProvider(new TemplateContentProvider());

    fTableViewer.setSorter(new ViewerSorter() {
      @Override
      public int compare(Viewer viewer, Object object1, Object object2) {
        if (object1 instanceof Template && object2 instanceof Template) {
          Template left = (Template) object1;
          Template right = (Template) object2;
          int result = left.getName().compareToIgnoreCase(
              right.getName());
          if (result != 0)
            return result;
          return left.getDescription().compareToIgnoreCase(
              right.getDescription());
        }
        return super.compare(viewer, object1, object2);
      }

      @Override
      public boolean isSorterProperty(Object element, String property) {
        return true;
      }
    });

    fTableViewer
        .addSelectionChangedListener(new ISelectionChangedListener() {
          public void selectionChanged(SelectionChangedEvent e) {
            updateViewerInput();
          }
        });

    // create viewer that displays currently selected template's contents
    fPatternViewer = doCreateViewer(parent);

    configureTableResizing(innerParent, table, column1, column2);

    String helpId = getNewFileWizardTemplatePageHelpId();
    if (helpId != null) {
      PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, helpId);
    }
    resetTableViewerInput();
    Dialog.applyDialogFont(parent);
    PlatformUI.getWorkbench().getHelpSystem()
        .setHelp(parent, IPHPHelpContextIds.NEW);
    setControl(parent);
  }

  public void resetTableViewerInput() {
    IProject newProject = getProject();
    if ((fProject == null && fProject != newProject)
        || (fProject != null && !fProject.equals(newProject))) {
      fProject = newProject;
      fTemplateStore = getTemplateStore();
      fTableViewer.setInput(fTemplateStore);
      loadLastSavedPreferences();
    }
  }

  @Override
  public void setVisible(boolean visible) {
    if (visible) {
      resetTableViewerInput();
    }
    super.setVisible(visible);
  }

  protected abstract ProjectTemplateStore getTemplateStore();

  protected abstract String getNewFileWizardTemplatePageHelpId();

  /**
   * Creates, configures and returns a source viewer to present the template
   * pattern on the preference page. Clients may override to provide a custom
   * source viewer featuring e.g. syntax coloring.
   *
   * @param parent
   *            the parent control
   * @return a configured source viewer
   */
  private SourceViewer createViewer(Composite parent) {
    SourceViewerConfiguration sourceViewerConfiguration = new StructuredTextViewerConfiguration() {
      StructuredTextViewerConfiguration baseConfiguration = new PHPStructuredTextViewerConfiguration();

      @Override
      public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
        return baseConfiguration
            .getConfiguredContentTypes(sourceViewer);
      }

      @Override
      public LineStyleProvider[] getLineStyleProviders(
          ISourceViewer sourceViewer, String partitionType) {
        return baseConfiguration.getLineStyleProviders(sourceViewer,
            partitionType);
      }
    };
    SourceViewer viewer = new StructuredTextViewer(parent, null, null,
        false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
    ((StructuredTextViewer) viewer).getTextWidget().setFont(
        JFaceResources.getFont("org.eclipse.wst.sse.ui.textfont")); //$NON-NLS-1$
    IStructuredModel scratchModel = StructuredModelManager
        .getModelManager().createUnManagedStructuredModelFor(
            ContentTypeIdForPHP.ContentTypeID_PHP);
    IDocument document = scratchModel.getStructuredDocument();
    viewer.configure(sourceViewerConfiguration);
    viewer.setDocument(document);
    return viewer;
  }

  private SourceViewer doCreateViewer(Composite parent) {
    Label label = new Label(parent, SWT.NONE);
    label.setText(Messages.NewGenericFileTemplatesWizardPage_2);
    GridData data = new GridData();
    data.horizontalSpan = 2;
    label.setLayoutData(data);

    SourceViewer viewer = createViewer(parent);
    viewer.setEditable(false);

    Control control = viewer.getControl();
    data = new GridData(GridData.FILL_BOTH);
    data.horizontalSpan = 2;
    data.heightHint = convertHeightInCharsToPixels(5);
    control.setLayoutData(data);

    return viewer;
  }

  /**
   * Enable/disable controls in page based on fUseTemplateButton's current
   * state.
   */
  protected void enableTemplates() {
    boolean enabled = fUseTemplateButton.getSelection();

    if (!enabled) {
      // save last selected template
      Template template = getSelectedTemplate();
      if (template != null)
        fLastSelectedTemplateName = template.getName();
      else
        fLastSelectedTemplateName = ""; //$NON-NLS-1$

      fTableViewer.setSelection(null);
    } else {
      setSelectedTemplate(fLastSelectedTemplateName);
    }

    fTableViewer.getControl().setEnabled(enabled);
    fPatternViewer.getControl().setEnabled(enabled);
  }

  /**
   * Return the template preference page id
   *
   * @return
   */
  protected abstract String getPreferencePageId();

  /**
   * Get the currently selected template.
   *
   * @return
   */
  private Template getSelectedTemplate() {
    Template template = null;
    IStructuredSelection selection = (IStructuredSelection) fTableViewer
        .getSelection();

    if (selection.size() == 1) {
      template = (Template) selection.getFirstElement();
    }
    return template;
  }

  /**
   * Returns template string to insert.
   *
   * @return String to insert or null if none is to be inserted
   */
  public CompiledTemplate compileTemplate() {
    Template template = getSelectedTemplate();
    return PHPTemplateStore.compileTemplate(
        getTemplatesContextTypeRegistry(), template);
  }

  public CompiledTemplate compileTemplate(String containerName,
      String fileName) {
    Template template = getSelectedTemplate();
    return PHPTemplateStore.compileTemplate(
        getTemplatesContextTypeRegistry(), template, containerName,
        fileName);
  }

  public CompiledTemplate compileTemplate(String containerName,
      String fileName, String lineDelimiter) {
    Template template = getSelectedTemplate();
    return PHPTemplateStore.compileTemplate(
        getTemplatesContextTypeRegistry(), template, containerName,
        fileName, lineDelimiter);
  }

  public TemplateProposal createTemplateProposal() {
    TemplateProposal proposal = null;
    Template template = getSelectedTemplate();
    if (template != null) {
      TemplateContextType contextType = getTemplatesContextTypeRegistry()
          .getContextType(getTemplateContextTypeId());
      TemplateContext context = new DocumentTemplateContext(contextType,
          new Document(), 0, 0);
      proposal = new TemplateProposal(template, context,
          new Region(0, 0), null);
    }

    return proposal;
  }

  void linkClicked() {
    String pageId = getPreferencePageId();
    PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(
        getShell(), pageId, new String[] { pageId }, null);
    dialog.open();
    fTableViewer.refresh();
  }

  /**
   * Load the last template name used in New HTML File wizard.
   */
  protected void loadLastSavedPreferences() {
    String templateName = getPreferenceStore().getString(
        PreferenceConstants.NEW_PHP_FILE_TEMPLATE);
    if (templateName == null || templateName.length() == 0) {
      fLastSelectedTemplateName = ""; //$NON-NLS-1$
      fUseTemplateButton.setSelection(false);
    } else {
      fLastSelectedTemplateName = templateName;
      fUseTemplateButton.setSelection(true);
    }
    enableTemplates();
  }

  protected IProject getProject() {
    IWizard wizard = getWizard();
    IProject project = null;
    if (wizard instanceof PHPFileCreationWizard) {
      project = ((PHPFileCreationWizard) wizard).getProject();
    }
    return project;
  }

  protected abstract IPreferenceStore getPreferenceStore();

  /**
   * Save template name used for next call to New HTML File wizard.
   */
  void saveLastSavedPreferences() {
    String templateName = ""; //$NON-NLS-1$

    Template template = getSelectedTemplate();
    if (template != null) {
      templateName = template.getName();
    }

    getPreferenceStore().setValue(
        PreferenceConstants.NEW_PHP_FILE_TEMPLATE, templateName);
  }

  /**
   * Select a template in the table viewer given the template name. If
   * template name cannot be found or templateName is null, just select first
   * item in table. If no items in table select nothing.
   *
   * @param templateName
   */
  private void setSelectedTemplate(String templateName) {
    Object template = null;

    if (templateName != null && templateName.length() > 0) {
      // pick the last used template
      template = fTemplateStore.findTemplate(templateName,
          getTemplateContextTypeId());
    }

    // no record of last used template so just pick first element
    if (template == null) {
      // just pick first element
      template = fTableViewer.getElementAt(0);
    }

    if (template != null) {
      IStructuredSelection selection = new StructuredSelection(template);
      fTableViewer.setSelection(selection, true);
    }
  }

  /**
   * Updates the pattern viewer.
   */
  void updateViewerInput() {
    Template template = getSelectedTemplate();
    if (template != null) {
      fPatternViewer.getDocument().set(template.getPattern());
    }
  }

  protected abstract String getTemplateContextTypeId();

  protected abstract String getUseTemplateMessage();

  protected abstract String getTemplatesLocationMessage();

  protected abstract ContextTypeRegistry getTemplatesContextTypeRegistry();
}
TOP

Related Classes of org.eclipse.php.internal.ui.wizards.NewGenericFileTemplatesWizardPage$TemplateContentProvider

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.