/*******************************************************************************
* Copyright © 2011, 2013 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.edt.ide.ui.internal.wizards;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.edt.ide.ui.internal.IUIHelpConstants;
import org.eclipse.edt.ide.ui.templates.ITemplate;
import org.eclipse.edt.ide.ui.templates.TemplateManager;
import org.eclipse.edt.ide.ui.templates.wizards.TemplateWizardNode;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.IWizard;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledFormText;
public abstract class EGLTemplateWizardPage extends EGLPartWizardPage
implements ISelectionChangedListener, IDoubleClickListener{
protected TableViewer templateViewer;
protected ScrolledFormText descriptionText;
public EGLTemplateWizardPage(String pageName) {
super(pageName);
}
protected abstract String getTemplateID();
public String getSelectedCodeTemplateId(){
Object o = ((IStructuredSelection) templateViewer.getSelection()).getFirstElement();
if (o instanceof ITemplate) {
ITemplate template = (ITemplate) o;
return template.getCodeTemplateId();
}
return null;
}
protected void createTemplateArea(Composite container, int nColumns) {
PlatformUI.getWorkbench().getHelpSystem().setHelp(container, IUIHelpConstants.EGL_NEW_RECORD_TEMPLATE_SELECTION_PAGE);
Composite ownerInfo = new Composite(container, SWT.NONE);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = nColumns;
gridLayout.marginWidth = 0;
ownerInfo.setLayout(gridLayout);
GridData gridData = new GridData(GridData.FILL_BOTH);
gridData.horizontalSpan = nColumns;
ownerInfo.setLayoutData(gridData);
int templateCol = nColumns % 2;
int descriptionCol = nColumns - templateCol;
Label label = new Label(ownerInfo, 0);
label.setText(NewWizardMessages.TemplateSelectionPage_selectTemplate);
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan= nColumns;
label.setLayoutData(gd);
templateViewer = new TableViewer(ownerInfo, SWT.BORDER);
Table control = templateViewer.getTable();
GridData data = new GridData(GridData.FILL_BOTH);
data.heightHint = 250;
data.widthHint = 200;
data.horizontalSpan= templateCol;
control.setLayoutData(data);
String templateID = getTemplateID();
ITemplate[] templates = TemplateManager.getInstance().getTemplates(templateID);
templateViewer.setContentProvider(new TreeContentProvider());
templateViewer.setLabelProvider(new TreeLabelProvider());
templateViewer.addSelectionChangedListener(this);
templateViewer.setInput(templates);
templateViewer.addDoubleClickListener(this);
FormToolkit toolkit = new FormToolkit(container.getDisplay());
descriptionText = new ScrolledFormText(ownerInfo, SWT.V_SCROLL | SWT.H_SCROLL, false);
int borderStyle = toolkit.getBorderStyle() == SWT.BORDER ? SWT.NULL : SWT.BORDER;
if (borderStyle == SWT.NULL) {
descriptionText.setData(FormToolkit.KEY_DRAW_BORDER,
FormToolkit.TREE_BORDER);
toolkit.paintBordersFor(ownerInfo);
}
FormText ftext = toolkit.createFormText(descriptionText, false);
descriptionText.setFormText(ftext);
descriptionText.setExpandHorizontal(false);
descriptionText.setExpandVertical(false);
descriptionText.setBackground(toolkit.getColors().getBackground());
descriptionText.setForeground(toolkit.getColors().getForeground());
ftext.marginWidth = 2;
ftext.marginHeight = 2;
data = new GridData(GridData.FILL_BOTH);
data.widthHint = 200;
data.horizontalSpan= descriptionCol;
descriptionText.setLayoutData(data);
if (templates != null) {
for (int i = 0; i < templates.length; i++) {
if (templates[i].isDefault()) {
templateViewer.setSelection(new StructuredSelection(new Object[] { templates[i] }), true);
}
}
}
}
public void selectionChanged(SelectionChangedEvent event) {
Object o = ((IStructuredSelection) event.getSelection()).getFirstElement();
if (o instanceof ITemplate) {
handleSelectedTemplate();
setTemplateDescription(((ITemplate) o).getDescription());
}
validateTemplatePage();
}
protected boolean isValidTemplateToCompletePage(){
boolean res = false;
Object o = ((IStructuredSelection) templateViewer.getSelection()).getFirstElement();
if (o instanceof ITemplate) {
ITemplate template = (ITemplate) o;
TemplateWizardNode wizNode = (TemplateWizardNode) template.getWizardNode();
String templateID = ((ITemplate) o).getCodeTemplateId();
res = (wizNode != null && wizNode.isContentCreated() && wizNode.getWizard() != null && wizNode.getWizard().canFinish())
|| (templateID != null );
}
return res;
}
protected void validateTemplatePage() {
Object o = ((IStructuredSelection) templateViewer.getSelection()).getFirstElement();
if (o instanceof ITemplate) {
ITemplate template = (ITemplate) o;
handleSelectedTemplate();
boolean b = isValidTemplateToCompletePage();
if(template.hasWizard()) {
b = b && isPageComplete();
} else {
b = b && validateEGLPartName();
}
setPageComplete(b);
} else {
setPageComplete(false);
}
}
public boolean isPageComplete(){
return super.isPageComplete() && validateEGLPartName() && isValidTemplateToCompletePage() && isValidPage();
}
/**
* Sets the wizard node, etc, based on the selected template
*
*/
protected void handleSelectedTemplate() {
Object o = ((IStructuredSelection) templateViewer.getSelection()).getFirstElement();
if (o instanceof ITemplate) {
ITemplate template = (ITemplate) o;
TemplateWizardNode wizNode = (TemplateWizardNode) template.getWizardNode();
if (wizNode != null) {
wizNode.setParentWizard(getWizard());
setSelectedNode(wizNode);
} else {
setSelectedNode(null);
}
}
}
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
validateTemplatePage();
/**Make Name field the focus since we combine the two page.*/
//templateViewer.getTable().setFocus();
}
}
private void setTemplateDescription(String text) {
try {
descriptionText.setText(text != null ? text : "");
} catch (Exception ex) {
descriptionText.setText("");
}
}
@Override
public boolean canFlipToNextPage() {
return super.canFlipToNextPage() && validateEGLPartName() && isValidPage();
}
private boolean validateEGLPartName() {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IStatus status = workspace.validateName(getFileConfiguration().getFileName(), IResource.FILE);
return status.isOK() ? true : false;
}
@Override
public void doubleClick(DoubleClickEvent event) {
if (event.getSource() == templateViewer && validatePage(false)) {
if (getSelectedNode() != null ) {
IWizard wiz = getWizard();
WizardDialog d =(WizardDialog)wiz.getContainer();
d.showPage(getNextPage());
} else if (getWizard().canFinish()) {
if (getWizard().performFinish()) {
getWizard().getContainer().getShell().close();
}
}
}
}
private class TreeContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object input) {
return (ITemplate[]) input;
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
public class TreeLabelProvider implements ILabelProvider {
public Image getImage(Object element) {
if (element instanceof ITemplate) {
if (((ITemplate) element).getIcon() != null) {
return ((ITemplate) element).getIcon().createImage();
}
}
return null;
}
public String getText(Object element) {
if (element instanceof ITemplate) {
return ((ITemplate) element).getName();
} else {
return null;
}
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
} //class TreeLabelProvider
}