blob: 213f8204a8f7e3e59e14555be04dd0b93a179ac1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 BestSolution.at 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:
* Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
******************************************************************************/
package org.eclipse.e4.demo.simpleide.handlers;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import javax.inject.Named;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.e4.core.di.annotations.Execute;
import org.eclipse.e4.core.services.log.Logger;
import org.eclipse.e4.core.services.statusreporter.StatusReporter;
import org.eclipse.e4.demo.simpleide.internal.ServiceRegistryComponent;
import org.eclipse.e4.demo.simpleide.services.INLSLookupFactoryService;
import org.eclipse.e4.demo.simpleide.services.IProjectService;
import org.eclipse.e4.ui.services.IServiceConstants;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class NewProjectDialogHandler {
private Map<IProjectService, Image> images = new HashMap<IProjectService, Image>();
private String projectName = ""; //$NON-NLS-1$
private IProjectService creator;
@Execute
public void openNewProjectDialog(
@Named(IServiceConstants.ACTIVE_SHELL) Shell parentShell,
IWorkspace workspace, IProgressMonitor monitor,
final ServiceRegistryComponent serviceRegistry,
StatusReporter reporter, Logger logger,
final INLSLookupFactoryService nlsFactory) {
TitleAreaDialog dialog = new TitleAreaDialog(parentShell) {
private Text projectName;
private TableViewer projectType;
private Messages messages = nlsFactory
.createNLSLookup(Messages.class);
@Override
protected int getShellStyle() {
return super.getShellStyle() | SWT.SHEET;
}
@Override
protected Control createDialogArea(Composite parent) {
Composite comp = (Composite) super.createDialogArea(parent);
getShell().setText(messages.NewProjectDialogHandler_ShellTitle());
setTitle(messages.NewProjectDialogHandler_Title());
setMessage(messages.NewProjectDialogHandler_Message());
final Image titleImage = new Image(parent.getDisplay(),
getClass().getClassLoader().getResourceAsStream(
"/icons/wizard/newprj_wiz.png"));
setTitleImage(titleImage);
final Image shellImg = new Image(parent.getDisplay(),
getClass().getClassLoader().getResourceAsStream(
"/icons/newprj_wiz.gif"));
getShell().setImage(shellImg);
getShell().addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
shellImg.dispose();
titleImage.dispose();
}
});
Composite container = new Composite(comp, SWT.NONE);
container.setLayoutData(new GridData(GridData.FILL_BOTH));
container.setLayout(new GridLayout(2, false));
Label l = new Label(container, SWT.NONE);
l.setText(messages.NewProjectDialogHandler_Name());
projectName = new Text(container, SWT.BORDER);
projectName
.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
l = new Label(container, SWT.NONE);
l.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
l.setText(messages.NewProjectDialogHandler_Type());
projectType = new TableViewer(container);
projectType.setContentProvider(new ArrayContentProvider());
projectType.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
IProjectService el = (IProjectService) element;
return el.getLabel();
}
@Override
public Image getImage(Object element) {
IProjectService el = (IProjectService) element;
Image img = images.get(el);
if (img == null) {
URL url;
InputStream in = null;
try {
url = FileLocator.find(new URL(el.getIconURI()));
in = url.openStream();
img = new Image(getShell().getDisplay(), in);
images.put(el, img);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
}
return img;
}
});
Vector<IProjectService> creators = serviceRegistry
.getCreators();
projectType.setInput(creators);
if (creators.size() > 0) {
projectType.setSelection(new StructuredSelection(creators
.get(0)));
}
projectType.getControl().setLayoutData(
new GridData(GridData.FILL_BOTH));
getShell().addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
for (Image img : images.values()) {
img.dispose();
}
images.clear();
}
});
return comp;
}
@Override
protected void okPressed() {
if (projectType.getSelection().isEmpty()) {
setMessage("Please select a project type",
IMessageProvider.ERROR);
return;
}
if (projectName.getText().trim().length() == 0) {
setMessage("Please enter a projectname",
IMessageProvider.ERROR);
return;
}
NewProjectDialogHandler.this.creator = (IProjectService) ((IStructuredSelection) projectType
.getSelection()).getFirstElement();
NewProjectDialogHandler.this.projectName = projectName
.getText();
super.okPressed();
}
};
if (dialog.open() == IDialogConstants.OK_ID) {
creator.createProject(parentShell, workspace, reporter, logger,
monitor, projectName);
}
}
}