mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-06 07:45:50 +02:00
Initial commit of UI and Freemarker plugins.
This commit is contained in:
parent
4a479d68fb
commit
e419c4bd0a
29 changed files with 1346 additions and 0 deletions
1
bundles/.gitignore
vendored
Normal file
1
bundles/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
*/bin/
|
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
1
bundles/org.eclipse.tools.templates.freemarker/.gitignore
vendored
Normal file
1
bundles/org.eclipse.tools.templates.freemarker/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/bin/
|
28
bundles/org.eclipse.tools.templates.freemarker/.project
Normal file
28
bundles/org.eclipse.tools.templates.freemarker/.project
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.eclipse.tools.templates.freemarker</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.pde.ManifestBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.pde.SchemaBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.pde.PluginNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,7 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.8
|
|
@ -0,0 +1,12 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Bundle-ManifestVersion: 2
|
||||||
|
Bundle-Name: Eclipse Tools
|
||||||
|
Bundle-SymbolicName: org.eclipse.tools.templates.freemarker
|
||||||
|
Bundle-Version: 1.0.0.qualifier
|
||||||
|
Bundle-Activator: org.eclipse.tools.templates.freemarker.internal.Activator
|
||||||
|
Require-Bundle: org.eclipse.core.runtime,
|
||||||
|
org.eclipse.core.resources,
|
||||||
|
org.freemarker
|
||||||
|
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||||
|
Bundle-ActivationPolicy: lazy
|
||||||
|
Export-Package: org.eclipse.tools.templates.freemarker
|
24
bundles/org.eclipse.tools.templates.freemarker/about.html
Normal file
24
bundles/org.eclipse.tools.templates.freemarker/about.html
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml"><head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>About</title></head>
|
||||||
|
|
||||||
|
<body lang="EN-US">
|
||||||
|
<h2>About This Content</h2>
|
||||||
|
|
||||||
|
<p>June 22, 2007</p>
|
||||||
|
<h3>License</h3>
|
||||||
|
|
||||||
|
<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
|
||||||
|
indicated below, the Content is provided to you under the terms and conditions of the
|
||||||
|
Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
|
||||||
|
at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
|
||||||
|
For purposes of the EPL, "Program" will mean the Content.</p>
|
||||||
|
|
||||||
|
<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
|
||||||
|
being redistributed by another party ("Redistributor") and different terms and conditions may
|
||||||
|
apply to your use of any object code in the Content. Check the Redistributor's license that was
|
||||||
|
provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
|
||||||
|
indicated below, the terms and conditions of the EPL still apply to any source code in the Content
|
||||||
|
and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
|
||||||
|
|
||||||
|
</body></html>
|
|
@ -0,0 +1,5 @@
|
||||||
|
source.. = src/
|
||||||
|
output.. = bin/
|
||||||
|
bin.includes = META-INF/,\
|
||||||
|
.,\
|
||||||
|
about.html
|
|
@ -0,0 +1,210 @@
|
||||||
|
package org.eclipse.tools.templates.freemarker;
|
||||||
|
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.io.StringReader;
|
||||||
|
import java.io.StringWriter;
|
||||||
|
import java.io.Writer;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.xml.bind.JAXBContext;
|
||||||
|
import javax.xml.bind.JAXBException;
|
||||||
|
import javax.xml.bind.Unmarshaller;
|
||||||
|
|
||||||
|
import org.eclipse.core.resources.IContainer;
|
||||||
|
import org.eclipse.core.resources.IFile;
|
||||||
|
import org.eclipse.core.resources.IFolder;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IResource;
|
||||||
|
import org.eclipse.core.resources.IWorkspaceRoot;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.FileLocator;
|
||||||
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.tools.templates.freemarker.internal.Activator;
|
||||||
|
import org.osgi.framework.Bundle;
|
||||||
|
|
||||||
|
import freemarker.cache.TemplateLoader;
|
||||||
|
import freemarker.template.Configuration;
|
||||||
|
import freemarker.template.Template;
|
||||||
|
import freemarker.template.TemplateException;
|
||||||
|
|
||||||
|
public abstract class FMGenerator implements TemplateLoader {
|
||||||
|
|
||||||
|
private final Configuration templateConfig;
|
||||||
|
private Bundle bundle;
|
||||||
|
private String manifestPath;
|
||||||
|
private TemplateManifest manifest;
|
||||||
|
private List<IFile> filesToOpen = new ArrayList<>();
|
||||||
|
|
||||||
|
protected FMGenerator() {
|
||||||
|
templateConfig = new Configuration(Configuration.VERSION_2_3_22);
|
||||||
|
templateConfig.setTemplateLoader(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBundle(Bundle bundle) {
|
||||||
|
this.bundle = bundle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTemplateManifestPath(String manifestPath) {
|
||||||
|
this.manifestPath = manifestPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TemplateManifest getManifest() {
|
||||||
|
return manifest;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Class<? extends TemplateManifest> getManifestClass() {
|
||||||
|
return TemplateManifest.class;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void generate(Map<String, Object> model, IProgressMonitor monitor) throws CoreException {
|
||||||
|
manifest = null;
|
||||||
|
try {
|
||||||
|
// load manifest file
|
||||||
|
StringWriter writer = new StringWriter();
|
||||||
|
loadFile(manifestPath, model, writer); // $NON-NLS-1$
|
||||||
|
JAXBContext xmlContext = JAXBContext.newInstance(getManifestClass());
|
||||||
|
Unmarshaller unmarshaller = xmlContext.createUnmarshaller();
|
||||||
|
manifest = (TemplateManifest) unmarshaller.unmarshal(new StringReader(writer.toString()));
|
||||||
|
} catch (JAXBException e) {
|
||||||
|
throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Loading template manifest", e));
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate files
|
||||||
|
if (manifest != null) {
|
||||||
|
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
|
||||||
|
IFile fileToShow = null;
|
||||||
|
for (FileTemplate fileTemplate : manifest.getFiles()) {
|
||||||
|
IPath destPath = new Path(fileTemplate.getDest());
|
||||||
|
IProject project = root.getProject(destPath.segment(0));
|
||||||
|
IFile file = project.getFile(destPath.removeFirstSegments(1));
|
||||||
|
if (!fileTemplate.isCopy()) {
|
||||||
|
generateFile(fileTemplate.getSrc(), model, file, monitor);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
URL url = FileLocator.find(bundle, new Path(fileTemplate.getSrc()), null);
|
||||||
|
try (InputStream in = url.openStream()) {
|
||||||
|
createParent(file, monitor);
|
||||||
|
if (file.exists()) {
|
||||||
|
file.setContents(in, true, true, monitor);
|
||||||
|
} else {
|
||||||
|
file.create(in, true, monitor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new CoreException(new Status(IStatus.ERROR, Activator.getId(),
|
||||||
|
"Reading file " + fileTemplate.getSrc(), e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileTemplate.isOpen()) {
|
||||||
|
if (fileTemplate.isShow()) {
|
||||||
|
if (fileToShow != null) {
|
||||||
|
filesToOpen.add(fileToShow);
|
||||||
|
}
|
||||||
|
fileToShow = file;
|
||||||
|
} else {
|
||||||
|
filesToOpen.add(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fileToShow != null) {
|
||||||
|
filesToOpen.add(fileToShow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadFile(String templateFile, Object model, Writer out) throws CoreException {
|
||||||
|
try {
|
||||||
|
Template template = templateConfig.getTemplate(templateFile);
|
||||||
|
template.process(model, out);
|
||||||
|
} catch (IOException | TemplateException e) {
|
||||||
|
throw new CoreException(
|
||||||
|
new Status(IStatus.ERROR, Activator.getId(), "Processing template " + templateFile, e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void generateFile(String templateFile, final Object model, final IFile outputFile, IProgressMonitor monitor)
|
||||||
|
throws CoreException {
|
||||||
|
try (StringWriter writer = new StringWriter()) {
|
||||||
|
loadFile(templateFile, model, writer);
|
||||||
|
try (ByteArrayInputStream in = new ByteArrayInputStream(
|
||||||
|
writer.getBuffer().toString().getBytes(StandardCharsets.UTF_8))) {
|
||||||
|
createParent(outputFile, monitor);
|
||||||
|
if (outputFile.exists()) {
|
||||||
|
outputFile.setContents(in, true, true, monitor);
|
||||||
|
} else {
|
||||||
|
outputFile.create(in, true, monitor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Generating file " + templateFile, e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void createParent(IResource child, IProgressMonitor monitor) throws CoreException {
|
||||||
|
if (child == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
IContainer container = child.getParent();
|
||||||
|
if (container.exists()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
IFolder parent = container.getAdapter(IFolder.class);
|
||||||
|
createParent(parent, monitor);
|
||||||
|
parent.create(true, true, monitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IFile[] getFilesToOpen() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object findTemplateSource(String name) throws IOException {
|
||||||
|
return FileLocator.find(bundle, new Path(name), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getLastModified(Object source) {
|
||||||
|
try {
|
||||||
|
URL url = (URL) source;
|
||||||
|
if (url.getProtocol().equals("file")) { //$NON-NLS-1$
|
||||||
|
File file = new File(url.toURI());
|
||||||
|
return file.lastModified();
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} catch (URISyntaxException e) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Reader getReader(Object source, String encoding) throws IOException {
|
||||||
|
URL url = (URL) source;
|
||||||
|
return new InputStreamReader(url.openStream(), encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void closeTemplateSource(Object arg0) throws IOException {
|
||||||
|
// Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,70 @@
|
||||||
|
package org.eclipse.tools.templates.freemarker;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
|
import org.eclipse.core.resources.IProjectDescription;
|
||||||
|
import org.eclipse.core.resources.IWorkspace;
|
||||||
|
import org.eclipse.core.resources.ResourcesPlugin;
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
|
||||||
|
public abstract class FMProjectGenerator extends FMGenerator {
|
||||||
|
|
||||||
|
private String projectName;
|
||||||
|
private URI locationURI;
|
||||||
|
private IProject[] referencedProjects;
|
||||||
|
|
||||||
|
private IProject project;
|
||||||
|
|
||||||
|
protected abstract String[] getProjectNatures();
|
||||||
|
|
||||||
|
public void setProjectName(String projectName) {
|
||||||
|
this.projectName = projectName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocationURI(URI locationURI) {
|
||||||
|
this.locationURI = locationURI;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setReferencedProjects(IProject[] referencedProjects) {
|
||||||
|
this.referencedProjects = referencedProjects;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IProject getProject() {
|
||||||
|
return project;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void generate(Map<String, Object> model, IProgressMonitor monitor) throws CoreException {
|
||||||
|
// Make sure project name is in model
|
||||||
|
model.put("projectName", projectName); //$NON-NLS-1$
|
||||||
|
|
||||||
|
// Create the project
|
||||||
|
createProject(monitor);
|
||||||
|
|
||||||
|
// Generate the files
|
||||||
|
super.generate(model, monitor);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void createProject(IProgressMonitor monitor) throws CoreException {
|
||||||
|
IWorkspace workspace = ResourcesPlugin.getWorkspace();
|
||||||
|
|
||||||
|
project = workspace.getRoot().getProject(projectName);
|
||||||
|
if (!project.exists()) {
|
||||||
|
IProjectDescription description = workspace.newProjectDescription(projectName);
|
||||||
|
description.setLocationURI(locationURI);
|
||||||
|
if (referencedProjects != null) {
|
||||||
|
description.setReferencedProjects(referencedProjects);
|
||||||
|
}
|
||||||
|
description.setNatureIds(getProjectNatures());
|
||||||
|
project.create(description, monitor);
|
||||||
|
project.open(monitor);
|
||||||
|
} else {
|
||||||
|
// TODO make sure it's got all our settings or is this an error
|
||||||
|
// condition?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,57 @@
|
||||||
|
package org.eclipse.tools.templates.freemarker;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
|
||||||
|
public class FileTemplate {
|
||||||
|
private String src;
|
||||||
|
private String dest;
|
||||||
|
private boolean open;
|
||||||
|
private boolean show;
|
||||||
|
private boolean copy;
|
||||||
|
|
||||||
|
@XmlAttribute(name = "src")
|
||||||
|
public String getSrc() {
|
||||||
|
return src;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSrc(String src) {
|
||||||
|
this.src = src;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlAttribute(name = "dest")
|
||||||
|
public String getDest() {
|
||||||
|
return dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDest(String dest) {
|
||||||
|
this.dest = dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlAttribute(name = "open")
|
||||||
|
public boolean isOpen() {
|
||||||
|
return open;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOpen(boolean open) {
|
||||||
|
this.open = open;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlAttribute(name = "show")
|
||||||
|
public boolean isShow() {
|
||||||
|
return show;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setShow(boolean show) {
|
||||||
|
this.show = show;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlAttribute(name = "copy")
|
||||||
|
public boolean isCopy() {
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCopy(boolean copy) {
|
||||||
|
this.copy = copy;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package org.eclipse.tools.templates.freemarker;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
|
||||||
|
public class SourceRoot {
|
||||||
|
|
||||||
|
private String dir;
|
||||||
|
|
||||||
|
@XmlAttribute(name = "dir")
|
||||||
|
public String getDir() {
|
||||||
|
return dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDir(String dir) {
|
||||||
|
this.dir = dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2016 QNX Software Systems 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
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tools.templates.freemarker;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlRootElement;
|
||||||
|
|
||||||
|
@XmlRootElement
|
||||||
|
public class TemplateManifest {
|
||||||
|
|
||||||
|
private List<FileTemplate> files;
|
||||||
|
private List<SourceRoot> srcRoots;
|
||||||
|
|
||||||
|
@XmlElement(name = "file")
|
||||||
|
public List<FileTemplate> getFiles() {
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFiles(List<FileTemplate> files) {
|
||||||
|
this.files = files;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement(name = "srcRoot")
|
||||||
|
public List<SourceRoot> getSrcRoots() {
|
||||||
|
return srcRoots;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSrcRoots(List<SourceRoot> srcRoots) {
|
||||||
|
this.srcRoots = srcRoots;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*******************************************************************************
|
||||||
|
* Copyright (c) 2016 QNX Software Systems 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
|
||||||
|
*******************************************************************************/
|
||||||
|
package org.eclipse.tools.templates.freemarker.internal;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.Plugin;
|
||||||
|
import org.osgi.framework.BundleContext;
|
||||||
|
|
||||||
|
public class Activator extends Plugin {
|
||||||
|
|
||||||
|
private static Activator plugin;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start(BundleContext bundleContext) throws Exception {
|
||||||
|
super.start(bundleContext);
|
||||||
|
plugin = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stop(BundleContext bundleContext) throws Exception {
|
||||||
|
super.stop(bundleContext);
|
||||||
|
plugin = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getId() {
|
||||||
|
return plugin.getBundle().getSymbolicName();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
7
bundles/org.eclipse.tools.templates.ui/.classpath
Normal file
7
bundles/org.eclipse.tools.templates.ui/.classpath
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
28
bundles/org.eclipse.tools.templates.ui/.project
Normal file
28
bundles/org.eclipse.tools.templates.ui/.project
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>org.eclipse.tools.templates.ui</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.pde.ManifestBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.pde.SchemaBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.pde.PluginNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
|
@ -0,0 +1,7 @@
|
||||||
|
eclipse.preferences.version=1
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
|
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.8
|
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
|
||||||
|
org.eclipse.jdt.core.compiler.source=1.8
|
13
bundles/org.eclipse.tools.templates.ui/META-INF/MANIFEST.MF
Normal file
13
bundles/org.eclipse.tools.templates.ui/META-INF/MANIFEST.MF
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
Manifest-Version: 1.0
|
||||||
|
Bundle-ManifestVersion: 2
|
||||||
|
Bundle-Name: Ui
|
||||||
|
Bundle-SymbolicName: org.eclipse.tools.templates.ui;singleton:=true
|
||||||
|
Bundle-Version: 1.0.0.qualifier
|
||||||
|
Bundle-Activator: org.eclipse.tools.templates.ui.internal.Activator
|
||||||
|
Require-Bundle: org.eclipse.ui,
|
||||||
|
org.eclipse.core.runtime,
|
||||||
|
org.eclipse.ui.ide,
|
||||||
|
org.eclipse.core.resources
|
||||||
|
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||||
|
Bundle-ActivationPolicy: lazy
|
||||||
|
Export-Package: org.eclipse.tools.templates.ui
|
24
bundles/org.eclipse.tools.templates.ui/about.html
Normal file
24
bundles/org.eclipse.tools.templates.ui/about.html
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml"><head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>About</title></head>
|
||||||
|
|
||||||
|
<body lang="EN-US">
|
||||||
|
<h2>About This Content</h2>
|
||||||
|
|
||||||
|
<p>June 22, 2007</p>
|
||||||
|
<h3>License</h3>
|
||||||
|
|
||||||
|
<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless otherwise
|
||||||
|
indicated below, the Content is provided to you under the terms and conditions of the
|
||||||
|
Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is available
|
||||||
|
at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
|
||||||
|
For purposes of the EPL, "Program" will mean the Content.</p>
|
||||||
|
|
||||||
|
<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
|
||||||
|
being redistributed by another party ("Redistributor") and different terms and conditions may
|
||||||
|
apply to your use of any object code in the Content. Check the Redistributor's license that was
|
||||||
|
provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
|
||||||
|
indicated below, the terms and conditions of the EPL still apply to any source code in the Content
|
||||||
|
and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
|
||||||
|
|
||||||
|
</body></html>
|
6
bundles/org.eclipse.tools.templates.ui/build.properties
Normal file
6
bundles/org.eclipse.tools.templates.ui/build.properties
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
source.. = src/
|
||||||
|
output.. = bin/
|
||||||
|
bin.includes = META-INF/,\
|
||||||
|
.,\
|
||||||
|
about.html,\
|
||||||
|
plugin.xml
|
6
bundles/org.eclipse.tools.templates.ui/plugin.xml
Normal file
6
bundles/org.eclipse.tools.templates.ui/plugin.xml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<?eclipse version="3.4"?>
|
||||||
|
<plugin>
|
||||||
|
<extension-point id="templates" name="New Element Templates" schema="schema/templates.exsd"/>
|
||||||
|
|
||||||
|
</plugin>
|
187
bundles/org.eclipse.tools.templates.ui/schema/templates.exsd
Normal file
187
bundles/org.eclipse.tools.templates.ui/schema/templates.exsd
Normal file
|
@ -0,0 +1,187 @@
|
||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<!-- Schema file written by PDE -->
|
||||||
|
<schema targetNamespace="org.eclipse.tools.templates.ui" xmlns="http://www.w3.org/2001/XMLSchema">
|
||||||
|
<annotation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.schema plugin="org.eclipse.tools.templates.ui" id="templates" name="Templates"/>
|
||||||
|
</appinfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter description of this extension point.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<element name="extension">
|
||||||
|
<annotation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.element />
|
||||||
|
</appinfo>
|
||||||
|
</annotation>
|
||||||
|
<complexType>
|
||||||
|
<sequence>
|
||||||
|
<element ref="tag" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<element ref="template" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
<element ref="templateExtension" minOccurs="0" maxOccurs="unbounded"/>
|
||||||
|
</sequence>
|
||||||
|
<attribute name="point" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="id" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="name" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.attribute translatable="true"/>
|
||||||
|
</appinfo>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name="template">
|
||||||
|
<complexType>
|
||||||
|
<sequence>
|
||||||
|
<element ref="tagReference" minOccurs="1" maxOccurs="unbounded"/>
|
||||||
|
<element ref="description"/>
|
||||||
|
</sequence>
|
||||||
|
<attribute name="id" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="label" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="icon" type="string">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.attribute kind="resource"/>
|
||||||
|
</appinfo>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="wizard" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.attribute kind="java" basedOn=":org.eclipse.ui.INewWizard"/>
|
||||||
|
</appinfo>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name="description" type="string">
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name="tag">
|
||||||
|
<complexType>
|
||||||
|
<attribute name="id" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="label" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name="tagReference">
|
||||||
|
<complexType>
|
||||||
|
<attribute name="id" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.attribute kind="identifier" basedOn="org.eclipse.tools.templates.ui.templates/tag/@id"/>
|
||||||
|
</appinfo>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<element name="templateExtension">
|
||||||
|
<complexType>
|
||||||
|
<sequence>
|
||||||
|
<element ref="tagReference" minOccurs="1" maxOccurs="unbounded"/>
|
||||||
|
</sequence>
|
||||||
|
<attribute name="templateId" type="string" use="required">
|
||||||
|
<annotation>
|
||||||
|
<documentation>
|
||||||
|
|
||||||
|
</documentation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.attribute kind="identifier" basedOn="org.eclipse.tools.templates.ui.templates/template/@id"/>
|
||||||
|
</appinfo>
|
||||||
|
</annotation>
|
||||||
|
</attribute>
|
||||||
|
</complexType>
|
||||||
|
</element>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.section type="since"/>
|
||||||
|
</appinfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter the first release in which this extension point appears.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.section type="examples"/>
|
||||||
|
</appinfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter extension point usage example here.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.section type="apiinfo"/>
|
||||||
|
</appinfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter API information here.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
<annotation>
|
||||||
|
<appinfo>
|
||||||
|
<meta.section type="implementation"/>
|
||||||
|
</appinfo>
|
||||||
|
<documentation>
|
||||||
|
[Enter information about supplied implementation of this extension point.]
|
||||||
|
</documentation>
|
||||||
|
</annotation>
|
||||||
|
|
||||||
|
|
||||||
|
</schema>
|
|
@ -0,0 +1,103 @@
|
||||||
|
package org.eclipse.tools.templates.ui;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.jface.viewers.ISelectionChangedListener;
|
||||||
|
import org.eclipse.jface.viewers.ListViewer;
|
||||||
|
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;
|
||||||
|
import org.eclipse.ui.IWorkbenchWizard;
|
||||||
|
|
||||||
|
public class TemplateSelectionPage extends WizardPage {
|
||||||
|
|
||||||
|
private final String[] requestedTags;
|
||||||
|
|
||||||
|
private ListViewer tagList;
|
||||||
|
private TemplateTable templateTable;
|
||||||
|
|
||||||
|
public TemplateSelectionPage(String pageName, String... tags) {
|
||||||
|
super(pageName);
|
||||||
|
this.requestedTags = tags;
|
||||||
|
}
|
||||||
|
|
||||||
|
@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) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
templateTable = new TemplateTable(form, SWT.V_SCROLL | SWT.SINGLE | SWT.BORDER);
|
||||||
|
templateTable.getTable().addSelectionListener(new SelectionAdapter() {
|
||||||
|
@Override
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
setPageComplete(templateTable.getSelectedTemplate() != null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void widgetDefaultSelected(SelectionEvent e) {
|
||||||
|
widgetSelected(e);
|
||||||
|
getContainer().showPage(getNextPage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
TemplateExtension templateExtension = Activator.getTemplateExtension();
|
||||||
|
List<Template> templates = new ArrayList<>();
|
||||||
|
for (Template template : templateExtension.getTemplates()) {
|
||||||
|
for (String requestedTag : requestedTags) {
|
||||||
|
if (template.hasTag(requestedTag)) {
|
||||||
|
templates.add(template);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<Tag> tags = new HashSet<>();
|
||||||
|
for (Template template : templates) {
|
||||||
|
tags.addAll(template.getTags());
|
||||||
|
}
|
||||||
|
|
||||||
|
templateTable.setTemplates(templates);
|
||||||
|
tagList.setInput(tags);
|
||||||
|
tagList.getList().select(0);
|
||||||
|
|
||||||
|
form.setWeights(new int[] { 20, 80 });
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IWizardPage getNextPage() {
|
||||||
|
Template template = templateTable.getSelectedTemplate();
|
||||||
|
if (template != null) {
|
||||||
|
try {
|
||||||
|
IWorkbenchWizard nextWizard = template.getWizard();
|
||||||
|
nextWizard.addPages();
|
||||||
|
return nextWizard.getPages()[0];
|
||||||
|
} catch (CoreException e) {
|
||||||
|
Activator.log(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super.getNextPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package org.eclipse.tools.templates.ui.internal;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.ui.plugin.AbstractUIPlugin;
|
||||||
|
import org.osgi.framework.BundleContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The activator class controls the plug-in life cycle
|
||||||
|
*/
|
||||||
|
public class Activator extends AbstractUIPlugin {
|
||||||
|
|
||||||
|
private static Activator plugin;
|
||||||
|
|
||||||
|
private TemplateExtension templateExtension;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start(BundleContext context) throws Exception {
|
||||||
|
super.start(context);
|
||||||
|
plugin = this;
|
||||||
|
|
||||||
|
templateExtension = new TemplateExtension();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stop(BundleContext context) throws Exception {
|
||||||
|
plugin = null;
|
||||||
|
super.stop(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getId() {
|
||||||
|
return plugin.getBundle().getSymbolicName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static TemplateExtension getTemplateExtension() {
|
||||||
|
return plugin.templateExtension;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void log(Exception e) {
|
||||||
|
if (e instanceof CoreException) {
|
||||||
|
plugin.getLog().log(((CoreException) e).getStatus());
|
||||||
|
} else {
|
||||||
|
plugin.getLog().log(new Status(IStatus.ERROR, getId(), e.getLocalizedMessage(), e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package org.eclipse.tools.templates.ui.internal;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
|
|
||||||
|
public class Tag {
|
||||||
|
|
||||||
|
public static final String ALL_ID = "all"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public String id;
|
||||||
|
public String label;
|
||||||
|
|
||||||
|
public Tag(IConfigurationElement element) {
|
||||||
|
id = element.getAttribute("id"); //$NON-NLS-1$
|
||||||
|
label = element.getAttribute("label"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
public Tag(String id, String label) {
|
||||||
|
this.id = id;
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLabel() {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return id.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (obj instanceof Tag) {
|
||||||
|
return id.equals(((Tag) obj).id);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package org.eclipse.tools.templates.ui.internal;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
import org.eclipse.jface.viewers.IStructuredContentProvider;
|
||||||
|
import org.eclipse.jface.viewers.LabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.ListViewer;
|
||||||
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
|
||||||
|
public class TagListViewer extends ListViewer {
|
||||||
|
|
||||||
|
public TagListViewer(Composite parent, int style) {
|
||||||
|
super(parent, style);
|
||||||
|
|
||||||
|
setLabelProvider(new LabelProvider() {
|
||||||
|
@Override
|
||||||
|
public String getText(Object element) {
|
||||||
|
if (element instanceof Tag) {
|
||||||
|
return ((Tag) element).getLabel();
|
||||||
|
} else {
|
||||||
|
return super.getText(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
setContentProvider(new IStructuredContentProvider() {
|
||||||
|
private Tag[] tags;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
|
||||||
|
if (newInput != null) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Collection<Tag> tagsList = (Collection<Tag>) newInput;
|
||||||
|
tags = tagsList.toArray(new Tag[tagsList.size()]);
|
||||||
|
Arrays.sort(tags, new Comparator<Tag>() {
|
||||||
|
@Override
|
||||||
|
public int compare(Tag o1, Tag o2) {
|
||||||
|
// Keep all at the top
|
||||||
|
if (o1.getId().equals(Tag.ALL_ID)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (o2.getId().equals(Tag.ALL_ID)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return o1.getLabel().compareTo(o2.getLabel());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispose() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object[] getElements(Object inputElement) {
|
||||||
|
return tags;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
package org.eclipse.tools.templates.ui.internal;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
|
import org.eclipse.jface.resource.ImageDescriptor;
|
||||||
|
import org.eclipse.ui.IWorkbenchWizard;
|
||||||
|
import org.eclipse.ui.plugin.AbstractUIPlugin;
|
||||||
|
|
||||||
|
public class Template {
|
||||||
|
|
||||||
|
private final TemplateExtension parent;
|
||||||
|
private final IConfigurationElement element;
|
||||||
|
private Map<String, Tag> tags;
|
||||||
|
|
||||||
|
public Template(TemplateExtension parent, IConfigurationElement element) {
|
||||||
|
this.parent = parent;
|
||||||
|
this.element = element;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return element.getAttribute("id"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLabel() {
|
||||||
|
return element.getAttribute("label"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
IConfigurationElement[] descs = element.getChildren("description"); //$NON-NLS-1$
|
||||||
|
return descs.length > 0 ? descs[0].getValue() : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImageDescriptor getIcon() {
|
||||||
|
String iconPath = element.getAttribute("icon"); //$NON-NLS-1$
|
||||||
|
return AbstractUIPlugin.imageDescriptorFromPlugin(element.getNamespaceIdentifier(), iconPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initTags() {
|
||||||
|
if (tags == null) {
|
||||||
|
tags = new HashMap<>();
|
||||||
|
for (IConfigurationElement ref : element.getChildren("tagReference")) { //$NON-NLS-1$
|
||||||
|
String id = ref.getAttribute("id"); //$NON-NLS-1$
|
||||||
|
Tag tag = parent.getTag(id);
|
||||||
|
if (tag != null) {
|
||||||
|
tags.put(tag.getId(), tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addTag(Tag tag) {
|
||||||
|
initTags();
|
||||||
|
tags.put(tag.getId(), tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasTag(String tagId) {
|
||||||
|
initTags();
|
||||||
|
return tags.containsKey(tagId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<Tag> getTags() {
|
||||||
|
return tags.values();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IWorkbenchWizard getWizard() throws CoreException {
|
||||||
|
return (IWorkbenchWizard) element.createExecutableExtension("wizard"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
package org.eclipse.tools.templates.ui.internal;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.eclipse.core.runtime.IConfigurationElement;
|
||||||
|
import org.eclipse.core.runtime.IExtensionPoint;
|
||||||
|
import org.eclipse.core.runtime.IExtensionRegistry;
|
||||||
|
import org.eclipse.core.runtime.Platform;
|
||||||
|
|
||||||
|
public class TemplateExtension {
|
||||||
|
|
||||||
|
private Map<String, Template> templates;
|
||||||
|
private Map<String, Tag> tags;
|
||||||
|
|
||||||
|
private void init() {
|
||||||
|
if (templates != null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
templates = new HashMap<>();
|
||||||
|
tags = new HashMap<>();
|
||||||
|
|
||||||
|
IExtensionRegistry registry = Platform.getExtensionRegistry();
|
||||||
|
IExtensionPoint point = registry.getExtensionPoint(Activator.getId(), "templates"); //$NON-NLS-1$
|
||||||
|
|
||||||
|
// tags
|
||||||
|
Tag allTag = new Tag(Tag.ALL_ID, "All");
|
||||||
|
tags.put(allTag.getId(), allTag);
|
||||||
|
|
||||||
|
for (IConfigurationElement element : point.getConfigurationElements()) {
|
||||||
|
if (element.getName().equals("tag")) { //$NON-NLS-1$
|
||||||
|
Tag tag = new Tag(element);
|
||||||
|
tags.put(tag.getId(), tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// templates
|
||||||
|
for (IConfigurationElement element : point.getConfigurationElements()) {
|
||||||
|
if (element.getName().equals("template")) { //$NON-NLS-1$
|
||||||
|
Template template = new Template(this, element);
|
||||||
|
templates.put(template.getId(), template);
|
||||||
|
template.addTag(allTag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// template extensions
|
||||||
|
for (IConfigurationElement element : point.getConfigurationElements()) {
|
||||||
|
if (element.getName().equals("templateExtension")) { //$NON-NLS-1$
|
||||||
|
String templateId = element.getAttribute("templateId"); //$NON-NLS-1$
|
||||||
|
Template template = templates.get(templateId);
|
||||||
|
if (template != null) {
|
||||||
|
for (IConfigurationElement tagRef : element.getChildren("tagReference")) { //$NON-NLS-1$
|
||||||
|
String tagId = tagRef.getAttribute("id"); //$NON-NLS-1$
|
||||||
|
Tag tag = tags.get(tagId);
|
||||||
|
if (tag != null) {
|
||||||
|
template.addTag(tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<Template> getTemplates() {
|
||||||
|
init();
|
||||||
|
return templates.values();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Tag getTag(String id) {
|
||||||
|
init();
|
||||||
|
return tags.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
package org.eclipse.tools.templates.ui.internal;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.eclipse.jface.resource.ImageDescriptor;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.graphics.Font;
|
||||||
|
import org.eclipse.swt.graphics.FontData;
|
||||||
|
import org.eclipse.swt.graphics.FontMetrics;
|
||||||
|
import org.eclipse.swt.graphics.GC;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.swt.graphics.Point;
|
||||||
|
import org.eclipse.swt.graphics.Rectangle;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Event;
|
||||||
|
import org.eclipse.swt.widgets.Listener;
|
||||||
|
import org.eclipse.swt.widgets.Table;
|
||||||
|
import org.eclipse.swt.widgets.TableItem;
|
||||||
|
import org.eclipse.swt.widgets.Widget;
|
||||||
|
|
||||||
|
public class TemplateTable implements Listener {
|
||||||
|
|
||||||
|
private final Table table;
|
||||||
|
private Font fontBold;
|
||||||
|
private Font fontDefault;
|
||||||
|
private Map<ImageDescriptor, Image> images = new HashMap<>();
|
||||||
|
|
||||||
|
private static final Rectangle EMPTY_IMAGE_BOUNDS = new Rectangle(0, 0, 48, 48);
|
||||||
|
|
||||||
|
public TemplateTable(Composite parent, int style) {
|
||||||
|
table = new Table(parent, style);
|
||||||
|
table.addListener(SWT.MeasureItem, this);
|
||||||
|
table.addListener(SWT.EraseItem, this);
|
||||||
|
table.addListener(SWT.PaintItem, this);
|
||||||
|
table.addListener(SWT.Dispose, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Table getTable() {
|
||||||
|
return table;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTemplates(Collection<Template> templates) {
|
||||||
|
table.clearAll();
|
||||||
|
for (Template template : templates) {
|
||||||
|
TableItem item = new TableItem(table, SWT.NONE);
|
||||||
|
item.setData(template);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Template getSelectedTemplate() {
|
||||||
|
TableItem[] items = table.getSelection();
|
||||||
|
if (items.length > 0) {
|
||||||
|
return (Template) items[0].getData();
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleEvent(Event event) {
|
||||||
|
switch (event.type) {
|
||||||
|
case SWT.MeasureItem:
|
||||||
|
computeItemArea(event);
|
||||||
|
break;
|
||||||
|
case SWT.PaintItem:
|
||||||
|
paintItem(event);
|
||||||
|
break;
|
||||||
|
case SWT.EraseItem:
|
||||||
|
computeItemArea(event);
|
||||||
|
break;
|
||||||
|
case SWT.Dispose:
|
||||||
|
for (Image image : images.values()) {
|
||||||
|
image.dispose();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void computeItemArea(Event event) {
|
||||||
|
event.width = table.getClientArea().width - event.x;
|
||||||
|
event.height = 56; // 48 for icon, 8 buffer
|
||||||
|
}
|
||||||
|
|
||||||
|
private void paintItem(Event event) {
|
||||||
|
Widget w = event.item;
|
||||||
|
GC gc = event.gc;
|
||||||
|
if (fontDefault == null) {
|
||||||
|
Font font = gc.getFont();
|
||||||
|
FontData[] data = font.getFontData();
|
||||||
|
if (data.length > 0) {
|
||||||
|
FontData d = data[0];
|
||||||
|
FontData normal = new FontData(d.getName(), d.getHeight(), // Math.round(d.getHeight()
|
||||||
|
// *
|
||||||
|
// .85F),
|
||||||
|
d.getStyle() | SWT.ITALIC);
|
||||||
|
fontDefault = new Font(event.display, normal);
|
||||||
|
FontData bold = new FontData(d.getName(), Math.round(d.getHeight() * 1.15F), d.getStyle() | SWT.BOLD);
|
||||||
|
fontBold = new Font(event.display, bold);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (w instanceof TableItem) {
|
||||||
|
TableItem item = (TableItem) w;
|
||||||
|
Template template = (Template) item.getData();
|
||||||
|
ImageDescriptor imageDesc = template.getIcon();
|
||||||
|
Image image = images.get(imageDesc);
|
||||||
|
if (image == null) {
|
||||||
|
image = imageDesc.createImage();
|
||||||
|
images.put(imageDesc, image);
|
||||||
|
}
|
||||||
|
Rectangle rect = EMPTY_IMAGE_BOUNDS;
|
||||||
|
int y = 0;
|
||||||
|
if (image != null) {
|
||||||
|
rect = image.getBounds();
|
||||||
|
y = event.y + Math.max(0, (event.height - rect.height) / 2);
|
||||||
|
gc.drawImage(image, event.x + 4, y);
|
||||||
|
}
|
||||||
|
gc.setFont(fontBold);
|
||||||
|
String name = template.getLabel();
|
||||||
|
Point nameExtent = gc.textExtent(name, SWT.DRAW_TRANSPARENT);
|
||||||
|
int iconMargin = 10;
|
||||||
|
gc.drawText(name, rect.x + rect.width + iconMargin, y, SWT.DRAW_TRANSPARENT);
|
||||||
|
gc.setFont(fontDefault);
|
||||||
|
int flags = SWT.DRAW_TRANSPARENT | SWT.DRAW_DELIMITER;
|
||||||
|
String description = template.getDescription();
|
||||||
|
int width = table.getClientArea().width;
|
||||||
|
if (description != null) {
|
||||||
|
Point descExt = gc.textExtent(description, flags);
|
||||||
|
int descWidth = width - (rect.x + rect.width + iconMargin);
|
||||||
|
if (descExt.x > descWidth) {
|
||||||
|
FontMetrics fm = gc.getFontMetrics();
|
||||||
|
int averageCharWidth = fm.getAverageCharWidth();
|
||||||
|
int charsMaxNumberInRow = descWidth / averageCharWidth;
|
||||||
|
if (description.length() > charsMaxNumberInRow) {
|
||||||
|
String firstLine = description.substring(0, charsMaxNumberInRow);
|
||||||
|
int lastWS = firstLine.lastIndexOf(' ');
|
||||||
|
int endIndex = lastWS + 1 + charsMaxNumberInRow;
|
||||||
|
description = firstLine.substring(0, lastWS) + '\n'
|
||||||
|
+ description.substring(lastWS + 1, Math.min(endIndex, description.length()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gc.drawText(description, rect.x + rect.width + iconMargin, y + nameExtent.y + 2, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue