Author: mareshkau
Date: 2010-04-08 10:45:03 -0400 (Thu, 08 Apr 2010)
New Revision: 21349
Added:
trunk/jsf/plugins/org.jboss.tools.jsf.ui/src/org/jboss/tools/jsf/ui/wizard/newfile/NewXHTMLTemplatesWizardPage.java
Log:
https://jira.jboss.org/jira/browse/JBIDE-5946 ,
https://jira.jboss.org/jira/browse/JBIDE-6131
Added:
trunk/jsf/plugins/org.jboss.tools.jsf.ui/src/org/jboss/tools/jsf/ui/wizard/newfile/NewXHTMLTemplatesWizardPage.java
===================================================================
---
trunk/jsf/plugins/org.jboss.tools.jsf.ui/src/org/jboss/tools/jsf/ui/wizard/newfile/NewXHTMLTemplatesWizardPage.java
(rev 0)
+++
trunk/jsf/plugins/org.jboss.tools.jsf.ui/src/org/jboss/tools/jsf/ui/wizard/newfile/NewXHTMLTemplatesWizardPage.java 2010-04-08
14:45:03 UTC (rev 21349)
@@ -0,0 +1,512 @@
+/*******************************************************************************
+ * Copyright (c) 2007-2010 Red Hat, Inc.
+ * Distributed under license by Red Hat, Inc. All rights reserved.
+ * This program is 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
+ *
+ * Contributor:
+ * Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/
+package org.jboss.tools.jsf.ui.wizard.newfile;
+
+import org.eclipse.jface.dialogs.Dialog;
+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.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.text.templates.DocumentTemplateContext;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateBuffer;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.jface.wizard.WizardPage;
+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.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.wst.html.ui.StructuredTextViewerConfigurationHTML;
+import org.eclipse.wst.html.ui.internal.editor.IHelpContextIds;
+import org.eclipse.wst.html.ui.internal.preferences.HTMLUIPreferenceNames;
+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;
+import org.jboss.tools.jsf.ui.JsfUIMessages;
+import org.jboss.tools.jsf.ui.JsfUiPlugin;
+import org.jboss.tools.jsf.ui.editor.pref.template.TemplateContextTypeIdsXHTML;
+
+/**
+ * Copied from NewHTMLTemplatesWizardPage, because the class is internal and not provide
possibility
+ * to inherit from this
+ *
+ *
+ * @author mareshkau
+ *
+ */
+public class NewXHTMLTemplatesWizardPage extends WizardPage {
+ /**
+ * Content provider for templates
+ */
+ private class TemplateContentProvider implements IStructuredContentProvider {
+ /** The template store. */
+ private TemplateStore fStore;
+
+ /*
+ * @see IContentProvider#dispose()
+ */
+ public void dispose() {
+ this.fStore = null;
+ }
+
+ /*
+ * @see IStructuredContentProvider#getElements(Object)
+ */
+ public Object[] getElements(Object input) {
+ return this.fStore.getTemplates(TemplateContextTypeIdsXHTML.NEW);
+ }
+
+ /*
+ * @see IContentProvider#inputChanged(Viewer, Object, Object)
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ this.fStore = (TemplateStore) 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 */
+ private 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 TemplateStore fTemplateStore;
+ /** Checkbox for using templates. */
+ private Button fUseTemplateButton;
+
+ public NewXHTMLTemplatesWizardPage() {
+ super("NewXHTMLTemplatesWizardPage",
JsfUIMessages.NewXHTMLTemplatesWizardPage_0, null); //$NON-NLS-1$
+ setDescription(JsfUIMessages.NewXHTMLTemplatesWizardPage_0);
+ }
+
+ /**
+ * 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() {
+ 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(JsfUIMessages.NewXHTMLTemplatesWizardPage_4);
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+ fUseTemplateButton.setLayoutData(data);
+ fUseTemplateButton.addSelectionListener(new SelectionAdapter() {
+ 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);
+
+ Label label = new Label(innerParent, SWT.NONE);
+ label.setText(JsfUIMessages.NewXHTMLTemplatesWizardPage_7);
+ data = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
+ label.setLayoutData(data);
+
+ // 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(JsfUIMessages.NewXHTMLTemplatesWizardPage_2);
+
+ TableColumn column2 = new TableColumn(table, SWT.NONE);
+ column2.setText(JsfUIMessages.NewXHTMLTemplatesWizardPage_3);
+
+ fTableViewer = new TableViewer(table);
+ fTableViewer.setLabelProvider(new TemplateLabelProvider());
+ fTableViewer.setContentProvider(new TemplateContentProvider());
+
+ fTableViewer.setSorter(new ViewerSorter() {
+ 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);
+ }
+
+ 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);
+
+ fTemplateStore = JsfUiPlugin.getDefault().getTemplateStore();
+ fTableViewer.setInput(fTemplateStore);
+
+ // Create linked text to just to templates preference page
+ Link link = new Link(parent, SWT.NONE);
+ link.setText(JsfUIMessages.NewXHTMLTemplatesWizardPage_6);
+ data = new GridData(SWT.END, SWT.FILL, true, false, 2, 1);
+ link.setLayoutData(data);
+ link.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ linkClicked();
+ }
+ });
+
+ configureTableResizing(innerParent, table, column1, column2);
+ loadLastSavedPreferences();
+
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(parent,
IHelpContextIds.HTML_NEWWIZARD_TEMPLATE_HELPID);
+ Dialog.applyDialogFont(parent);
+ setControl(parent);
+ }
+
+ /**
+ * 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
StructuredTextViewerConfigurationHTML();
+
+ public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+ return baseConfiguration.getConfiguredContentTypes(sourceViewer);
+ }
+
+ 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("org.eclipse.wst.html.core.htmlsource");
+ 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(JsfUIMessages.NewXHTMLTemplatesWizardPage_5);
+ 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);
+ // [261274] - source viewer was growing to fit the max line width of the template
+ data.widthHint = convertWidthInCharsToPixels(2);
+ control.setLayoutData(data);
+
+ return viewer;
+ }
+
+ /**
+ * Enable/disable controls in page based on fUseTemplateButton's current
+ * state.
+ */
+ 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
+ */
+ private String getPreferencePageId() {
+ return "org.jboss.tools.jsf.ui.editor.pref.template"; //$NON-NLS-1$
+ }
+
+ /**
+ * 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
+ */
+ String getTemplateString() {
+ String templateString = null;
+
+ Template template = getSelectedTemplate();
+ if (template != null) {
+ TemplateContextType contextType =
JsfUiPlugin.getDefault().getTemplateContextRegistry().getContextType(TemplateContextTypeIdsXHTML.NEW);
+ IDocument document = new Document();
+ TemplateContext context = new DocumentTemplateContext(contextType, document, 0, 0);
+ try {
+ TemplateBuffer buffer = context.evaluate(template);
+ templateString = buffer.getString();
+ }
+ catch (Exception e) {
+ JsfUiPlugin.getDefault().logWarning("Could not create template for new
html", e); //$NON-NLS-1$
+ }
+ }
+
+ return templateString;
+ }
+
+ 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.
+ */
+ private void loadLastSavedPreferences() {
+ String templateName =
JsfUiPlugin.getDefault().getPreferenceStore().getString(HTMLUIPreferenceNames.NEW_FILE_TEMPLATE_NAME);
+ if (templateName == null || templateName.length() == 0) {
+ fLastSelectedTemplateName = ""; //$NON-NLS-1$
+ fUseTemplateButton.setSelection(false);
+ }
+ else {
+ fLastSelectedTemplateName = templateName;
+ fUseTemplateButton.setSelection(true);
+ }
+ enableTemplates();
+ }
+
+ /**
+ * 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();
+ }
+
+ JsfUiPlugin.getDefault().getPreferenceStore().setValue(HTMLUIPreferenceNames.NEW_FILE_TEMPLATE_NAME,
templateName);
+ JsfUiPlugin.getDefault().savePluginPreferences();
+ }
+
+ /**
+ * 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,
TemplateContextTypeIdsXHTML.NEW);
+ }
+
+ // 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());
+ }
+ else {
+ fPatternViewer.getDocument().set(""); //$NON-NLS-1$
+ }
+ }
+}