/******************************************************************************
* Copyright (C) 2013 Fabio Zadrozny
*
* 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:
* Fabio Zadrozny <fabiofz@gmail.com> - initial API and implementation
******************************************************************************/
package org.python.pydev.ui.wizards.files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.TreeMap;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
import org.eclipse.jface.text.templates.persistence.TemplateStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.python.pydev.editor.templates.PyContextType;
import org.python.pydev.editor.templates.TemplateHelper;
import org.python.pydev.plugin.PydevPlugin;
public class TemplateSelectDialog extends SelectionDialog {
private Label label;
private Table templateList;
private TreeMap<String, TemplatePersistenceData> nameToTemplateData;
private IDialogSettings fDialogSettings;
protected TemplateSelectDialog(Shell parentShell) {
super(parentShell);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite topLevel = (Composite) super.createDialogArea(parent);
createTemplateOptions(topLevel);
return topLevel;
}
@Override
protected Control createContents(Composite parent) {
Control ret = super.createContents(parent);
org.python.pydev.plugin.PydevPlugin.setCssId(parent, "py-template-select-dialog", true);
return ret;
}
private void createTemplateOptions(Composite topLevel) {
final TemplateStore templateStore = TemplateHelper.getTemplateStore();
if (templateStore != null) {
TemplatePersistenceData[] templateData = templateStore.getTemplateData(false);
if (templateData != null && templateData.length > 0) {
//create the template selection
label = new Label(topLevel, SWT.NONE);
label.setText("Template");
templateList = new Table(topLevel, SWT.SINGLE | SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
fillTemplateOptions(templateData, templateList);
templateList.addMouseListener(new MouseListener() {
@Override
public void mouseUp(MouseEvent e) {
}
@Override
public void mouseDown(MouseEvent e) {
}
@Override
public void mouseDoubleClick(MouseEvent e) {
okPressed();
}
});
Link link = new Link(topLevel, SWT.NONE);
link.setText("<a>Config available templates...</a>");
link.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(null,
"org.python.pydev.prefs.template", null, null);
dialog.open();
//Fill it after having the settings edited.
TemplatePersistenceData[] templateData = templateStore.getTemplateData(false);
if (templateData != null && templateData.length > 0) {
fillTemplateOptions(templateData, templateList);
} else {
fillTemplateOptions(new TemplatePersistenceData[0], templateList);
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
}
});
setLayout(label, templateList, link);
}
}
}
private static final String DIALOG_HEIGHT = "DIALOG_HEIGHT"; //$NON-NLS-1$
private static final String DIALOG_WIDTH = "DIALOG_WIDTH"; //$NON-NLS-1$
private static final String DIALOG_BOUNDS_SETTINGS = "DialogBoundsSettings"; //$NON-NLS-1$
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.window.Dialog#getDialogBoundsSettings()
*/
@Override
protected IDialogSettings getDialogBoundsSettings() {
IDialogSettings settings = getDialogSettings();
IDialogSettings section = settings.getSection(DIALOG_BOUNDS_SETTINGS);
if (section == null) {
section = settings.addNewSection(DIALOG_BOUNDS_SETTINGS);
section.put(DIALOG_HEIGHT, 500);
section.put(DIALOG_WIDTH, 600);
}
return section;
}
/**
* Returns the dialog settings. Returned object can't be null.
*
* @return return dialog settings for this dialog
*/
protected IDialogSettings getDialogSettings() {
IDialogSettings settings = PydevPlugin.getDefault().getDialogSettings();
fDialogSettings = settings.getSection(TemplateSelectDialog.class.getName());
if (fDialogSettings == null) {
fDialogSettings = settings.addNewSection(TemplateSelectDialog.class.getName());
}
return fDialogSettings;
}
/**
* Sets the template options in the passed list (swt)
*/
private void fillTemplateOptions(TemplatePersistenceData[] templateData, Table list) {
nameToTemplateData = new TreeMap<String, TemplatePersistenceData>();
for (TemplatePersistenceData data : templateData) {
if (PyContextType.PY_MODULES_CONTEXT_TYPE.equals(data.getTemplate().getContextTypeId())) {
String name = data.getTemplate().getName();
nameToTemplateData.put(name, data);
}
}
ArrayList<String> lst = new ArrayList<String>(nameToTemplateData.keySet());
for (String string : lst) {
new TableItem(list, SWT.NONE).setText(string);
}
list.setSelection(0);
}
@Override
protected void okPressed() {
TemplatePersistenceData selectedTemplate = getCurr();
setResult(Arrays.asList(selectedTemplate));
super.okPressed();
}
/**
* @return the data for the selected template or null if not available.
*/
private TemplatePersistenceData getCurr() {
if (templateList != null && nameToTemplateData != null) {
TableItem[] sel = templateList.getSelection();
if (sel != null && sel.length > 0) {
return nameToTemplateData.get(sel[0].getText(0));
}
}
return null;
}
public TemplatePersistenceData getSelectedTemplate() {
Object[] r = this.getResult();
if (r != null && r.length > 0) {
return (TemplatePersistenceData) r[0];
}
return null;
}
private void setLayout(Label label, Control control, Control link) {
GridData data;
if (label != null) {
data = new GridData();
data.grabExcessHorizontalSpace = false;
label.setLayoutData(data);
}
if (control != null) {
data = new GridData(GridData.FILL_BOTH);
data.grabExcessHorizontalSpace = true;
data.grabExcessVerticalSpace = true;
control.setLayoutData(data);
}
if (link != null) {
data = new GridData();
link.setLayoutData(data);
}
}
}