/* Copyright (C) 2009 Mobile Sorcery AB
This program is free software; you can redistribute it and/or modify it
under the terms of the Eclipse Public License v1.0.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License v1.0 for
more details.
You should have received a copy of the Eclipse Public License v1.0 along
with this program. It is also available at http://www.eclipse.org/legal/epl-v10.html
*/
package com.mobilesorcery.sdk.wizards.internal;
import java.util.ArrayList;
import java.util.HashMap;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.TableColumn;
import org.eclipse.swt.widgets.Text;
import com.mobilesorcery.sdk.core.templates.IProjectTemplateExtension;
import com.mobilesorcery.sdk.core.templates.ProjectTemplate;
import com.mobilesorcery.sdk.core.templates.TemplateManager;
import com.mobilesorcery.sdk.ui.MosyncUIPlugin;
import com.mobilesorcery.sdk.ui.UIUtils;
import com.mobilesorcery.sdk.wizards.Activator;
public class TemplateWizardPage extends WizardPage {
private final class TemplateCategoryLabelProvider extends LabelProvider {
private final HashMap<String, Image> cachedImages = new HashMap<String, Image>();
@Override
public Image getImage(Object element) {
if (element instanceof IProjectTemplateExtension) {
String name = ((IProjectTemplateExtension) element).getName();
Image image = cachedImages.get(name);
if (!cachedImages.containsKey(name)) {
ImageDescriptor imageDesc = ((IProjectTemplateExtension) element).getImage();
image = imageDesc == null ? null : imageDesc.createImage();
image = MosyncUIPlugin.resize(image, 32, 32, true, true);
cachedImages.put(name, image);
}
return image;
}
return null;
}
@Override
public void dispose() {
for (Image cachedImage : cachedImages.values()) {
if (cachedImage != null) {
cachedImage.dispose();
}
}
}
@Override
public String getText(Object element) {
if (element instanceof IProjectTemplateExtension) {
return ((IProjectTemplateExtension) element).getName();
}
return "";
}
}
private final class ProjectTemplateLabelProvider extends CellLabelProvider {
public String getText(Object o) {
if (o instanceof ProjectTemplate) {
return ((ProjectTemplate)o).getName();
}
return "?";
}
@Override
public String getToolTipText(Object element) {
if (element instanceof ProjectTemplate) {
String desc = ((ProjectTemplate) element).getDescription();
if (desc != null) {
return desc;
}
}
return "";
}
@Override
public void update(ViewerCell cell) {
Object element = cell.getElement();
cell.setText(getText(element));
}
}
private final class InnerSelectionListener implements SelectionListener {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
@Override
public void widgetSelected(SelectionEvent e) {
if (!templateTable.getControl().isDisposed()) {
//descriptionText.setVisible(useTemplate.getSelection());
//templateTable.getControl().setEnabled(useTemplate.getSelection());
updatePageComplete();
}
}
}
protected TemplateWizardPage() {
super("SelectTemplate");
setTitle("MoSync Project Template");
setDescription("Select a project template");
setImageDescriptor(ImageDescriptor.createFromFile(this.getClass(), "/icons/wizardimg.png"));
}
//private Button useTemplate;
private TableViewer templateTable;
private Text descriptionText;
private TableViewer categoryTable;
public ProjectTemplate getProjectTemplate() {
IStructuredSelection selection = (IStructuredSelection) templateTable.getSelection();
return (ProjectTemplate) selection.getFirstElement();
//return useTemplate.getSelection() ? (ProjectTemplate) selection.getFirstElement() : null;
}
@Override
public void createControl(Composite parent) {
Composite control = new Composite(parent, SWT.NONE);
control.setLayout(new GridLayout(2, false));
setPageComplete(false);
categoryTable = new TableViewer(control);
categoryTable.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
if (templateTable.getTable().getItemCount() > 0) {
templateTable.getTable().select(0);
}
updateUI();
}
});
TableColumn column1 = new TableColumn(categoryTable.getTable(), SWT.NONE);
column1.setWidth(UIUtils.getDefaultFieldSize());
categoryTable.getControl().setLayoutData(new GridData(UIUtils.getDefaultFieldSize(), SWT.FILL, false, true));
categoryTable.setLabelProvider(new TemplateCategoryLabelProvider());
categoryTable.setContentProvider(new ArrayContentProvider());
categoryTable.setInput(getTemplateExtensions());
templateTable = new TableViewer(control);
templateTable.setLabelProvider(new ProjectTemplateLabelProvider());
templateTable.setContentProvider(new ArrayContentProvider());
templateTable.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
SelectionListener listener = new InnerSelectionListener();
templateTable.getTable().addSelectionListener(listener);
templateTable.addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
if (getWizard().canFinish()) { // Kind of ugly...
if (getWizard().performFinish()) {
getWizard().getContainer().getShell().dispose();
}
}
}
});
ColumnViewerToolTipSupport.enableFor(templateTable, SWT.NONE);
descriptionText = new Text(control, SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL | SWT.BORDER);
GridData descriptionTextData = new GridData(GridData.FILL_HORIZONTAL);
descriptionTextData.horizontalSpan = 2;
descriptionTextData.heightHint = UIUtils.getRowHeight(3);
descriptionText.setLayoutData(descriptionTextData);
updateDescriptionText(null);
/* useTemplate = new Button(control, SWT.CHECK);
useTemplate.setText("Use template");
useTemplate.setSelection(true);
useTemplate.setLayoutData(new GridData(SWT.DEFAULT, SWT.DEFAULT, true, false, 2, 1));
useTemplate.addSelectionListener(listener);*/
templateTable.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
ProjectTemplate template = (ProjectTemplate) selection.getFirstElement();
updateDescriptionText(template);
}
});
setControl(control);
updateUI();
}
protected void updateUI() {
IStructuredSelection selection = (IStructuredSelection) categoryTable.getSelection();
IProjectTemplateExtension selected = (IProjectTemplateExtension) selection.getFirstElement();
if (selected != null) {
templateTable.setInput(getTemplates(selected.getType()));
}
updatePageComplete();
}
private void updatePageComplete() {
setPageComplete(/*!useTemplate.getSelection() || */!templateTable.getSelection().isEmpty());
}
private ProjectTemplate[] getTemplates(String type) {
return TemplateManager.getDefault().getProjectTemplates(type).toArray(new ProjectTemplate[0]);
}
private IProjectTemplateExtension[] getTemplateExtensions() {
ArrayList<IProjectTemplateExtension> result = new ArrayList<IProjectTemplateExtension>();
for (String type : TemplateManager.getDefault().getTemplateTypes()) {
IProjectTemplateExtension ext = TemplateManager.getDefault().getExtensionForType(type);
if (ext != null) {
result.add(ext);
}
}
return result.toArray(new IProjectTemplateExtension[0]);
}
private void updateDescriptionText(ProjectTemplate template) {
String description = "";
if (template != null && template.getDescription() != null) {
description = template.getDescription();
}
descriptionText.setText(description);
}
}