Java tutorial
/******************************************************************************* * Copyright (c) 2008, 2010 Chase Technology Ltd - http://www.chasetechnology.co.uk * 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: * Doug Satchwell (Chase Technology Ltd) - initial API and implementation * David Carver (bug 271916) STAR - externalize strings for New XSL. * Jesper Steen Moller - bug 289799 - React to the 'cursor' variable in the template *******************************************************************************/ package org.eclipse.wst.xsl.ui.internal.wizards; 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.TemplateVariable; import org.eclipse.jface.text.templates.persistence.TemplateStore; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; 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.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.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; import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML; import org.eclipse.wst.xsl.ui.internal.Messages; import org.eclipse.wst.xsl.ui.internal.StructuredTextViewerConfigurationXSL; import org.eclipse.wst.xsl.ui.internal.XSLUIConstants; import org.eclipse.wst.xsl.ui.internal.XSLUIPlugin; public class NewXSLFileTemplatesWizardPage extends WizardPage { private static final String XSL_UI_TEMPLATE_PREFERENCE_PAGE = "org.eclipse.wst.xsl.ui.template.preferencePage"; //$NON-NLS-1$ private static final String NEW_STYLESHEET_TEMPLATES_WIZARD_PAGE = "NewStylesheetTemplatesWizardPage"; //$NON-NLS-1$ private String fLastSelectedTemplateName; private SourceViewer fPatternViewer; private TableViewer fTableViewer; private TemplateStore fTemplateStore; private Button fUseTemplateButton; public NewXSLFileTemplatesWizardPage() { super(NEW_STYLESHEET_TEMPLATES_WIZARD_PAGE, Messages.NewXSLSelectTemplate, null); setDescription(Messages.NewXSLTemplateDescription); } 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 JSP Template fUseTemplateButton = new Button(parent, SWT.CHECK); fUseTemplateButton.setText(Messages.NewXSLUseTemplateButtonText); 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(Messages.NewXSLLinkPreferencePage); 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.NewXSLColumnTemplateName); TableColumn column2 = new TableColumn(table, SWT.NONE); column2.setText(Messages.NewXSLColumnTemplateDescription); 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); fTemplateStore = XSLUIPlugin.getDefault().getTemplateStore(); fTableViewer.setInput(fTemplateStore); configureTableResizing(innerParent, table, column1, column2); loadLastSavedPreferences(); // PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IHelpContextIds.JSP_NEWWIZARD_TEMPLATE_HELPID); Dialog.applyDialogFont(parent); setControl(parent); } private SourceViewer createViewer(Composite parent) { SourceViewerConfiguration sourceViewerConfiguration = new StructuredTextViewerConfiguration() { StructuredTextViewerConfiguration baseConfiguration = new StructuredTextViewerConfigurationXSL(); @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); viewer.getTextWidget().setFont(JFaceResources.getFont("org.eclipse.wst.sse.ui.textfont")); //$NON-NLS-1$ IStructuredModel scratchModel = StructuredModelManager.getModelManager() .createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML); 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.NewXSLTemplatePreviewTitle); 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; } void enableTemplates() { boolean enabled = fUseTemplateButton.getSelection(); if (enabled) { setSelectedTemplate(fLastSelectedTemplateName); } else { // save last selected template Template template = getSelectedTemplate(); if (template != null) fLastSelectedTemplateName = template.getName(); else fLastSelectedTemplateName = ""; //$NON-NLS-1$ fTableViewer.setSelection(null); } fTableViewer.getControl().setEnabled(enabled); fPatternViewer.getControl().setEnabled(enabled); } private Template getSelectedTemplate() { Template template = null; IStructuredSelection selection = (IStructuredSelection) fTableViewer.getSelection(); if (selection.size() == 1) { template = (Template) selection.getFirstElement(); } return template; } String getTemplateString(int[] offset) { String templateString = null; offset[0] = 0; Template template = getSelectedTemplate(); if (template != null) { TemplateContextType contextType = XSLUIPlugin.getDefault().getTemplateContextRegistry() .getContextType(XSLUIConstants.TEMPLATE_CONTEXT_XSL_NEW); IDocument document = new Document(); TemplateContext context = new DocumentTemplateContext(contextType, document, 0, 0); try { TemplateBuffer buffer = context.evaluate(template); templateString = buffer.getString(); for (TemplateVariable t : buffer.getVariables()) { if (t.getName().equals(org.eclipse.jface.text.templates.GlobalTemplateVariables.Cursor.NAME)) { if (t.getOffsets().length > 0) offset[0] = t.getOffsets()[0]; } } } catch (Exception e) { XSLUIPlugin.log(e); } } return templateString; } void linkClicked() { String pageId = XSL_UI_TEMPLATE_PREFERENCE_PAGE; PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(getShell(), pageId, new String[] { pageId }, null); dialog.open(); fTableViewer.refresh(); } private void loadLastSavedPreferences() { String templateName = XSLUIPlugin.getDefault().getPreferenceStore() .getString(XSLUIConstants.NEW_FILE_TEMPLATE_NAME); if (templateName == null || templateName.length() == 0) { fLastSelectedTemplateName = ""; //$NON-NLS-1$ fUseTemplateButton.setSelection(false); } else { fLastSelectedTemplateName = templateName; fUseTemplateButton.setSelection(true); } enableTemplates(); } void saveLastSavedPreferences() { String templateName = ""; //$NON-NLS-1$ Template template = getSelectedTemplate(); if (template != null) { templateName = template.getName(); } XSLUIPlugin.getDefault().getPreferenceStore().setValue(XSLUIConstants.NEW_FILE_TEMPLATE_NAME, templateName); XSLUIPlugin.getDefault().savePluginPreferences(); } private void setSelectedTemplate(String templateName) { Object template = null; if (templateName != null && templateName.length() > 0) { // pick the last used template template = fTemplateStore.findTemplate(templateName, XSLUIConstants.TEMPLATE_CONTEXT_XSL_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); } } void updateViewerInput() { Template template = getSelectedTemplate(); if (template != null) { fPatternViewer.getDocument().set(template.getPattern()); } else { fPatternViewer.getDocument().set(""); //$NON-NLS-1$ } } }