blob: c5360f18ed3ffbf11339d309ae5ec934de6e137a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 QNX Software Systems and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tools.templates.ui;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.tools.templates.ui.internal.Activator;
import org.eclipse.tools.templates.ui.internal.Tag;
import org.eclipse.tools.templates.ui.internal.TagListViewer;
import org.eclipse.tools.templates.ui.internal.Template;
import org.eclipse.tools.templates.ui.internal.TemplateExtension;
import org.eclipse.tools.templates.ui.internal.TemplateTable;
public class TemplateSelectionPage extends WizardPage {
private final String[] requestedTags;
private final List<Template> templates;
private TagListViewer tagList;
private TemplateTable templateTable;
public TemplateSelectionPage(String pageName, String... tags) {
super(pageName);
this.requestedTags = tags;
TemplateExtension templateExtension = Activator.getTemplateExtension();
templates = new ArrayList<>();
for (Template template : templateExtension.getTemplates()) {
for (String requestedTag : requestedTags) {
if (template.hasTag(requestedTag)) {
templates.add(template);
break;
}
}
}
}
@Override
public void createControl(Composite parent) {
SashForm form = new SashForm(parent, SWT.HORIZONTAL);
setControl(form);
tagList = new TagListViewer(form, SWT.BORDER);
tagList.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
Collection<Tag> selectedTags = tagList.getSelectedTags();
List<Template> selectedTemplates = new ArrayList<>();
for (Template template : templates) {
for (Tag tag : selectedTags) {
if (template.hasTag(tag.getId())) {
selectedTemplates.add(template);
break;
}
}
}
Template selected = templateTable.getSelectedTemplate();
templateTable.setTemplates(selectedTemplates);
templateTable.selectTemplate(selected);
updateButtons();
}
});
templateTable = new TemplateTable(form, SWT.V_SCROLL | SWT.SINGLE | SWT.BORDER);
templateTable.getTable().addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updateButtons();
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
getContainer().showPage(getNextPage());
}
});
Set<Tag> tags = new HashSet<>();
for (Template template : templates) {
tags.addAll(template.getTags());
}
if (requestedTags.length == 1) {
// Implies that the requested tag is actually the same as All.
// We can safely remove it.
for (Tag tag : tags) {
if (tag.getId().equals(requestedTags[0])) {
tags.remove(tag);
break;
}
}
}
templateTable.setTemplates(templates);
tagList.setInput(tags);
tagList.getList().select(0); // All
form.setWeights(new int[] { 20, 80 });
}
public void selectTemplate(String id) {
if (templateTable != null) {
for (Template template : templates) {
if (template.getId().equals(id)) {
templateTable.selectTemplate(template);
updateButtons();
break;
}
}
}
}
private void updateButtons() {
setPageComplete(templateTable.getSelectedTemplate() != null);
getContainer().updateButtons();
}
@Override
public IWizardPage getNextPage() {
Template template = templateTable.getSelectedTemplate();
if (template != null) {
try {
NewWizard oldWizard = (NewWizard) getWizard();
TemplateWizard nextWizard = (TemplateWizard) template.getWizard();
oldWizard.initialize(nextWizard);
nextWizard.addPages();
return nextWizard.getPages()[0];
} catch (CoreException e) {
Platform.getLog(getClass()).log(e.getStatus());
}
}
return super.getNextPage();
}
}