/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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 GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.hibernate.eclipse.launch;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogPage;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.AbstractTableViewer;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.IPropertySourceProvider;
import org.eclipse.ui.views.properties.PropertySheetEntry;
import org.eclipse.ui.views.properties.PropertySheetPage;
import org.hibernate.console.ImageConstants;
import org.hibernate.eclipse.console.ExtensionManager;
import org.hibernate.eclipse.console.HibernateConsoleMessages;
import org.hibernate.eclipse.console.HibernateConsolePlugin;
import org.hibernate.eclipse.console.model.impl.ExporterFactoryStrings;
import org.hibernate.eclipse.console.model.impl.ExporterDefinition;
import org.hibernate.eclipse.console.model.impl.ExporterFactory;
import org.hibernate.eclipse.console.utils.EclipseImages;
import org.hibernate.eclipse.console.wizards.UpDownListComposite;
public class ExporterSettingsTab extends AbstractLaunchConfigurationTab {
public static final String EXPORTERS_PROPERTIES_COLUMN_PROPERTY_WIDTH = "hibernateCodeGenerationConfigurations.exporters.properties.column.property.Width"; //$NON-NLS-1$
public static final String EXPORTERS_PROPERTIES_COLUMN_VALUE_WIDTH = "hibernateCodeGenerationConfigurations.exporters.properties.column.value.Width"; //$NON-NLS-1$
private Button enableEJB3annotations;
private Button enableJDK5;
private Set<ExporterFactory> selectedExporters;
private Set<String> deletedExporterIds;
//private CheckboxTableViewer exporterTable;
private Button selectAll;
private Button deselectAll;
private PropertySheetPage propertySheet;
private Button add;
private Button remove;
private Button edit;
/**
* Constructor for SampleNewWizardPage.
*
* @param pageName
*/
public ExporterSettingsTab() {
super();
}
/**
* @see IDialogPage#createControl(Composite)
*/
public void createControl(Composite parent) {
selectedExporters = new HashSet<ExporterFactory>();
deletedExporterIds = new HashSet<String>();
final ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
Composite container = new Composite( sc, SWT.NONE );
sc.setContent(container);
GridData controlData = new GridData( GridData.FILL_BOTH );
container.setLayoutData( controlData );
GridLayout layout = new GridLayout();
layout.marginHeight = 5;
layout.marginWidth = 5;
layout.verticalSpacing = 1;
container.setLayout( layout );
createGeneralSettings( container );
createExporterTable( container );
createExporterProperties( container );
sc.setMinSize(container.computeSize(SWT.DEFAULT, SWT.DEFAULT));
dialogChanged();
setControl(sc);
}
private void createExporterProperties(Composite parent) {
Composite exportersComposite = createComposite( parent, HibernateConsoleMessages.ExporterSettingsTab_properties );
exportersComposite.setLayout( new GridLayout( 2, false ) );
GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true );
gd.minimumHeight = 100;
exportersComposite.setLayoutData( gd );
Group gr = new Group(exportersComposite, SWT.NONE);
GridLayout gridLayout = new GridLayout();
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gr.setLayout( gridLayout );
gd = new GridData( SWT.FILL, SWT.FILL, true, true );
gd.verticalSpan = 3;
gr.setLayoutData( gd );
Control sheet = createPropertySheet( gr );
gd = new GridData( SWT.FILL, SWT.FILL, true, true );
sheet.setLayoutData( gd );
add = new Button( exportersComposite, SWT.PUSH );
add.setEnabled( false );
add.setText( HibernateConsoleMessages.ExporterSettingsTab_add );
gd = new GridData( GridData.HORIZONTAL_ALIGN_FILL
| GridData.VERTICAL_ALIGN_BEGINNING );
gd.horizontalIndent = 5;
add.setLayoutData( gd );
add.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IStructuredSelection ss = (IStructuredSelection) getExporterTable().getSelection();
ExporterFactory ef = (ExporterFactory) ss.getFirstElement();
if(ef!=null) {
AddPropertyDialog dialog = new AddPropertyDialog(getShell(), ef, null, false);
if(dialog.open()==Dialog.OK) {
ef.setProperty( dialog.getPropertyName(), dialog.getPropertyValue() );
dialogChanged();
refreshPropertySheet();
}
}
}
} );
remove = new Button( exportersComposite, SWT.PUSH );
remove.setText( HibernateConsoleMessages.ExporterSettingsTab_remove );
remove.setEnabled( false );
remove.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if(currentDescriptor!=null) {
IStructuredSelection ss = (IStructuredSelection) getExporterTable().getSelection();
ExporterFactory ef = (ExporterFactory) ss.getFirstElement();
ef.removeProperty( (String) currentDescriptor.getId() );
dialogChanged();
refreshPropertySheet();
}
}
} );
gd = new GridData( GridData.HORIZONTAL_ALIGN_FILL
| GridData.VERTICAL_ALIGN_BEGINNING );
gd.horizontalIndent = 5;
remove.setLayoutData( gd );
edit = new Button( exportersComposite, SWT.PUSH );
edit.setEnabled( false );
edit.setText( HibernateConsoleMessages.ExporterSettingsTab_edit );
gd = new GridData( GridData.HORIZONTAL_ALIGN_FILL
| GridData.VERTICAL_ALIGN_BEGINNING );
gd.horizontalIndent = 5;
edit.setLayoutData( gd );
edit.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IStructuredSelection ss = (IStructuredSelection) getExporterTable().getSelection();
ExporterFactory ef = (ExporterFactory) ss.getFirstElement();
if(ef!=null) {
String selectedPropertyId = null;
if(currentDescriptor!=null) {
selectedPropertyId = (String) currentDescriptor.getId();
}
AddPropertyDialog dialog =
new AddPropertyDialog(getShell(), ef, selectedPropertyId, true);
if(dialog.open()==Dialog.OK) {
ef.setProperty( dialog.getPropertyName(), dialog.getPropertyValue() );
dialogChanged();
refreshPropertySheet();
}
}
}
} );
}
public class MyPropertySheetEntry extends PropertySheetEntry {
public IPropertyDescriptor getMyDescriptor() {
return super.getDescriptor();
}
protected PropertySheetEntry createChildEntry() {
return new MyPropertySheetEntry();
}
}
// currently selected in the propertysheet
private IPropertyDescriptor currentDescriptor;
private UpDownListComposite exporterUpDown;
private ObservableFactoryList observableFactoryList;
protected void updateCurrentDescriptor(IPropertyDescriptor propertyDescriptor) {
currentDescriptor = propertyDescriptor;
boolean hasSelection = false;
if (currentDescriptor != null) {
hasSelection = true;
}
if (remove != null) remove.setEnabled(hasSelection);
if (edit != null) edit.setEnabled(hasSelection);
}
private Control createPropertySheet(Composite exportersComposite) {
propertySheet = new PropertySheetPage() {
public void handleEntrySelection(ISelection selection) {
super.handleEntrySelection( selection );
IStructuredSelection iss = (IStructuredSelection) selection;
IPropertyDescriptor propertyDescriptor = null;
if(!iss.isEmpty()) {
MyPropertySheetEntry mse = (MyPropertySheetEntry)iss.getFirstElement();
propertyDescriptor = mse.getMyDescriptor();
}
updateCurrentDescriptor(propertyDescriptor);
}
};
propertySheet.createControl( exportersComposite );
final PropertySheetEntry propertySheetEntry = new MyPropertySheetEntry();
propertySheetEntry
.setPropertySourceProvider( new IPropertySourceProvider() {
public IPropertySource getPropertySource(Object object) {
if ( object instanceof ExporterFactory ) {
return new ExporterFactoryPropertySource(
(ExporterFactory) object ) {
public void setPropertyValue(Object id, Object value) {
super.setPropertyValue( id, value );
dialogChanged();
}
};
}
else {
return null;
}
}
} );
propertySheet.setRootEntry( propertySheetEntry );
// propertySheetEntry.setValues( new Object[] { this });
getExporterTable()
.addSelectionChangedListener( new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection s = (IStructuredSelection) event
.getSelection();
if(s.isEmpty()) {
if(add!=null) add.setEnabled( false );
if(remove!=null) remove.setEnabled( false );
if(edit!=null) edit.setEnabled( false );
propertySheetEntry.setValues(new Object[0]);
} else {
if(add!=null) add.setEnabled( true );
boolean hasSelection = false;
if(currentDescriptor!=null) {
hasSelection = true;
}
if(remove!=null) remove.setEnabled( hasSelection );
if(edit!=null) edit.setEnabled( hasSelection );
ExporterFactory ep = (ExporterFactory) s
.getFirstElement();
propertySheetEntry.setValues( new Object[] { ep } );
// if(ep.isEnabled( configuration ))
}
}
} );
Control control = propertySheet.getControl();
if (control instanceof Tree && !control.isDisposed()) {
Tree tree = (Tree)control;
tree.addSelectionListener( new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
IPropertyDescriptor propertyDescriptor = null;
if (e.item != null && e.item.getData() != null) {
MyPropertySheetEntry mse = (MyPropertySheetEntry)e.item.getData();
propertyDescriptor = mse.getMyDescriptor();
}
updateCurrentDescriptor(propertyDescriptor);
}
} );
}
return control;
}
private void createExporterTable(Composite parent) {
exporterUpDown = new UpDownListComposite(parent, SWT.NONE, HibernateConsoleMessages.ExporterSettingsTab_exporters, true, new ExporterLabelProvider(), new ExporterContentProvider()) {
protected Object[] handleAdd(int idx) {
switch (idx) {
case 0:
Object[] selectExporters = selectExporters(getShell(), HibernateConsoleMessages.ExporterSettingsTab_add_exporter, HibernateConsoleMessages.ExporterSettingsTab_select_exporter_you_want_to_add);
for (int i = 0; i < selectExporters.length; i++) {
ExporterDefinition exporterDefinition = (ExporterDefinition) selectExporters[i];
addDef(exporterDefinition);
}
return new Object[0];// { exporterFactory };
case 1:
getExporterTable().setAllChecked( true );
selectedExporters.clear();
observableFactoryList.copyUnderlyingList(selectedExporters);
dialogChanged();
break;
case 2:
getExporterTable().setAllChecked( false );
selectedExporters.clear();
dialogChanged();
break;
default:
break;
}
return null;
}
private void addDef(ExporterDefinition expDef) {
int initialCount = getTable().getItemCount();
boolean duplicate = false;
do {
duplicate = false;
initialCount++;
for (ExporterFactory def : observableFactoryList.getList()) {
if(def.getId().equals(""+initialCount)) { //$NON-NLS-1$
duplicate = true;
}
}
} while(duplicate);
String initialName = "" + initialCount; //$NON-NLS-1$
ExporterFactory exporterFactory = new ExporterFactory( expDef, initialName );
observableFactoryList.add(exporterFactory);
selectedExporters.add(exporterFactory);
((CheckboxTableViewer)getTableViewer()).setChecked(exporterFactory, true);
}
@SuppressWarnings("unchecked")
protected void handleRemove() {
IStructuredSelection selection = (IStructuredSelection) getTableViewer().getSelection();
if (selection != null) {
Iterator<Object> iterator= selection.iterator();
while (iterator.hasNext() ) {
Object item= iterator.next();
observableFactoryList.remove((ExporterFactory)item);
deletedExporterIds.add(((ExporterFactory)item).getId());
}
//getTableViewer().setSelection(StructuredSelection.EMPTY);
listChanged();
}
}
protected void moveSelectionDown() {
Table table = getTableViewer().getTable();
int indices[]= table.getSelectionIndices();
if (indices.length < 1) {
return;
}
int newSelection[]= new int[indices.length];
int max= table.getItemCount() - 1;
for (int i = indices.length - 1; i >= 0; i--) {
int index= indices[i];
if (index < max) {
ExporterFactory data = (ExporterFactory) getTableViewer().getElementAt(index);
observableFactoryList.moveTo(index + 1, data);
newSelection[i]= index + 1;
}
}
table.setSelection(newSelection);
listChanged();
}
protected void moveSelectionUp() {
Table table = getTableViewer().getTable();
int indices[]= table.getSelectionIndices();
int newSelection[]= new int[indices.length];
for (int i = 0; i < indices.length; i++) {
int index= indices[i];
if (index > 0) {
ExporterFactory data = (ExporterFactory) getTableViewer().getElementAt(index);
observableFactoryList.moveTo(index - 1, data);
newSelection[i]= index - 1;
}
}
table.setSelection(newSelection);
listChanged();
}
protected String[] getAddButtonLabels() {
return new String[] { HibernateConsoleMessages.ExporterSettingsTab_add, HibernateConsoleMessages.ExporterSettingsTab_select_all, HibernateConsoleMessages.ExporterSettingsTab_deselect_all };
}
protected void listChanged() {
dialogChanged();
}
};
getExporterTable().addCheckStateListener( new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
ExporterFactory factory = (ExporterFactory) event.getElement();
if ( !event.getChecked()
&& selectedExporters.contains( factory ) ) {
selectedExporters.remove( factory );
}
else if ( event.getChecked()
&& !selectedExporters.contains( factory ) ) {
selectedExporters.add( factory );
}
dialogChanged();
}
} );
GridData gd = new GridData();
gd.grabExcessHorizontalSpace = true;
gd.grabExcessVerticalSpace = true;
gd.verticalAlignment = GridData.FILL;
gd.horizontalAlignment = GridData.FILL;
exporterUpDown.setLayoutData( gd );
}
// currently unused functionality
@SuppressWarnings("unused")
private void createOldExporterTable(Composite parent) {
Composite exporterOptions = createComposite( parent, HibernateConsoleMessages.ExporterSettingsTab_exporters );
GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true );
gd.minimumHeight = 100;
exporterOptions.setLayoutData( gd );
exporterOptions.setLayout( new GridLayout( 2, false ) );
Table table = new Table( exporterOptions, SWT.CHECK | SWT.BORDER
| SWT.V_SCROLL );
//setExporterTable(new CheckboxTableViewer( table ));
getExporterTable().setContentProvider( new ExporterContentProvider() );
getExporterTable().setLabelProvider( new ExporterLabelProvider() );
// exporterTable.getControl().setLayoutData(
// new GridData( SWT.FILL, SWT.FILL, true, true ) );
getExporterTable().setColumnProperties( new String[] { "", HibernateConsoleMessages.ExporterSettingsTab_description } ); //$NON-NLS-1$
getExporterTable().addCheckStateListener( new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
ExporterFactory factory = (ExporterFactory) event.getElement();
if ( !event.getChecked()
&& selectedExporters.contains( factory ) ) {
selectedExporters.remove( factory );
}
else if ( event.getChecked()
&& !selectedExporters.contains( factory ) ) {
selectedExporters.add( factory );
}
dialogChanged();
}
} );
gd = new GridData( SWT.FILL, SWT.FILL, true, true );
gd.verticalSpan = 2;
gd.horizontalSpan = 1;
table.setLayoutData( gd );
selectAll = new Button( exporterOptions, SWT.PUSH );
selectAll.setText( HibernateConsoleMessages.ExporterSettingsTab_select_all );
selectAll.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
getExporterTable().setAllChecked( true );
dialogChanged();
}
} );
gd = new GridData( GridData.HORIZONTAL_ALIGN_FILL
| GridData.VERTICAL_ALIGN_BEGINNING );
gd.horizontalIndent = 5;
selectAll.setLayoutData( gd );
deselectAll = new Button( exporterOptions, SWT.PUSH );
deselectAll.setText( HibernateConsoleMessages.ExporterSettingsTab_deselect_all );
deselectAll.addSelectionListener( new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
getExporterTable().setAllChecked( false );
dialogChanged();
}
} );
gd = new GridData( GridData.HORIZONTAL_ALIGN_FILL
| GridData.VERTICAL_ALIGN_BEGINNING );
gd.horizontalIndent = 5;
deselectAll.setLayoutData( gd );
}
private void createGeneralSettings(Composite parent) {
SelectionListener fieldlistener = new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected( e );
}
public void widgetSelected(SelectionEvent e) {
dialogChanged();
}
};
Composite generalSettingsComposite = createComposite( parent,
HibernateConsoleMessages.ExporterSettingsTab_general_settings );
generalSettingsComposite.setLayoutData( new GridData( SWT.BEGINNING,
SWT.BEGINNING, false, false ) );
enableJDK5 = new Button( generalSettingsComposite, SWT.CHECK );
enableJDK5.setText( HibernateConsoleMessages.ExporterSettingsTab_use_java5_syntax );
enableJDK5.addSelectionListener( fieldlistener );
enableEJB3annotations = new Button( generalSettingsComposite, SWT.CHECK );
enableEJB3annotations.setText( HibernateConsoleMessages.ExporterSettingsTab_generate_ejb3annotations );
enableEJB3annotations.addSelectionListener( fieldlistener );
}
static private class ExporterContentProvider implements IStructuredContentProvider, PropertyChangeListener {
private AbstractTableViewer viewer;
public Object[] getElements(Object inputElement) {
return ((ObservableFactoryList) inputElement ).getList().toArray();
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.viewer = (AbstractTableViewer) viewer;
ObservableFactoryList ol = (ObservableFactoryList) oldInput;
ObservableFactoryList newList = (ObservableFactoryList) newInput;
if(ol!=null) {
ol.removePropertyChangeListener(this);
}
if(newList!=null) {
newList.addPropertyChangeListener(this);
}
}
public void propertyChange(PropertyChangeEvent evt) {
if("addElement".equals(evt.getPropertyName())) { //$NON-NLS-1$
viewer.add(evt.getNewValue());
}
if("removeElement".equals(evt.getPropertyName())) { //$NON-NLS-1$
viewer.remove(evt.getOldValue());
}
if("insertElement".equals(evt.getPropertyName())) { //$NON-NLS-1$
viewer.insert(evt.getNewValue(), ((Integer)evt.getOldValue()).intValue());
}
}
}
// Complete hack to get table to work with arbitrary exporters quickly.
static private class ObservableFactoryList {
List<ExporterFactory> underlyingList = new ArrayList<ExporterFactory>();
PropertyChangeSupport pcs = new PropertyChangeSupport(this);
public ObservableFactoryList(List<ExporterFactory> exporterFactories) {
underlyingList = exporterFactories;
}
public void copyUnderlyingList(Set<ExporterFactory> list) {
list.addAll(underlyingList);
}
public void moveTo(int i, ExporterFactory data) {
underlyingList.remove(data);
remove(data);
underlyingList.add(i, data);
pcs.firePropertyChange("insertElement", Integer.valueOf(i), data); //$NON-NLS-1$
}
void addPropertyChangeListener(PropertyChangeListener pcl) {
pcs.addPropertyChangeListener(pcl);
}
public List<ExporterFactory> getList() {
return Collections.unmodifiableList(underlyingList);
}
void removePropertyChangeListener(PropertyChangeListener pcl) {
pcs.removePropertyChangeListener(pcl);
}
boolean add(ExporterFactory o) {
boolean changed = underlyingList.add(o);
pcs.firePropertyChange("addElement", null, o); //$NON-NLS-1$
return changed;
}
boolean remove(ExporterFactory o) {
boolean changed = underlyingList.remove(o);
pcs.firePropertyChange("removeElement", o, null); //$NON-NLS-1$
return changed;
}
}
static private class ExporterLabelProvider implements ITableLabelProvider, ILabelProvider {
Map<String, Image> exp2img = new HashMap<String, Image>(); // not the most optimized but better
// than having a finalize method.
public Image getColumnImage(Object element, int columnIndex) {
ExporterDefinition definition = getExporterDefinition(element);
Image image = exp2img.get( definition.getId() );
if ( image == null ) {
image = definition.getIconDescriptor().createImage();
exp2img.put( definition.getId(), image );
}
return image;
}
private ExporterDefinition getExporterDefinition(Object element) {
if(element instanceof ExporterFactory) {
ExporterFactory ef = (ExporterFactory) element;
return ef.getExporterDefinition();
} else {
return (ExporterDefinition) element;
}
}
public String getColumnText(Object element, int columnIndex) {
ExporterDefinition definition = getExporterDefinition(element);
return definition.getDescription();
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
for (Image img : exp2img.values()) {
if (img != null) {
img.dispose();
}
}
}
public boolean isLabelProperty(Object element, String property) {
return true;
}
public void removeListener(ILabelProviderListener listener) {
}
public Image getImage(Object element) {
return getColumnImage(element, 0);
}
public String getText(Object element) {
return getColumnText(element, 0);
}
}
private Composite createComposite(Composite parent, String name) {
new Label( parent, SWT.NONE ).setText( name );
Composite client = new Composite( parent, SWT.NONE );
client.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
client.setLayout( new GridLayout() );
// client.setBackground( ColorConstants.cyan );
return client;
}
private void dialogChanged() {
boolean configSelected = true; // TODO: only active if configname in
// settings
// ...getConfigurationName().length()==0;
if ( !configSelected ) {
updateStatus( HibernateConsoleMessages.ExporterSettingsTab_console_configuration_must_be_specified );
return;
}
if ( selectedExporters.size() == 0 ) {
updateStatus( HibernateConsoleMessages.ExporterSettingsTab_at_least_one_exporter_option_must_be_selected );
return;
}
String msg = null;
// hard-coded checks: this should be delegated to extension point that knows about the different exporters.
//Iterator iterator = observableFactoryList.getList().iterator(); // check all exporters
for (ExporterFactory ef : selectedExporters) {// check only selected exporters
String str = ef.getProperties().get(ExporterFactoryStrings.OUTPUTDIR);
if (str != null) {
msg = PathHelper.checkDirectory(str, HibernateConsoleMessages.ExporterSettingsTab_output_directory_for + " " + ef.getExporterDefinition().getDescription(), true); //$NON-NLS-1$
if (msg != null) {
break;
}
}
str = ef.getProperties().get(ExporterFactoryStrings.TEMPLATE_PATH);
if (str != null) {
msg = PathHelper.checkDirectory(str, HibernateConsoleMessages.ExporterSettingsTab_template_directory_for + " " + ef.getExporterDefinition().getDescription(), true); //$NON-NLS-1$
if (msg != null) {
break;
}
}
str = ef.getProperties().get(ExporterFactoryStrings.QUERY_STRING);
if (str != null) {
str = str.trim();
if (str.length() == 0) {
msg = NLS.bind(HibernateConsoleMessages.ExporterSettingsTab_query_should_have_not_empty_value, ef.getExporterDefinition().getDescription());
break;
}
}
}
updateStatus(msg);
}
protected String checkDirectory(IPath path, String name) {
IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(
path );
if ( res != null ) {
int resType = res.getType();
if ( resType == IResource.PROJECT || resType == IResource.FOLDER ) {
IProject proj = res.getProject();
if ( !proj.isOpen() ) {
String out = NLS.bind(HibernateConsoleMessages.ExporterSettingsTab_project_for_is_closed, name);
return out;
}
}
else {
return NLS.bind(HibernateConsoleMessages.ExporterSettingsTab_has_to_be_folder_or_project, name);
}
}
else {
return NLS.bind(HibernateConsoleMessages.ExporterSettingsTab_does_not_exist, name);
}
return null;
}
protected String checkFile(IPath path, String name) {
IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(
path );
if ( res != null ) {
int resType = res.getType();
if ( resType == IResource.FILE ) {
return null;
}
else {
return NLS.bind(HibernateConsoleMessages.ExporterSettingsTab_must_be_file, name);
}
}
else {
return NLS.bind(HibernateConsoleMessages.ExporterSettingsTab_does_not_exist, name);
}
}
public boolean isValid(ILaunchConfiguration launchConfig) {
if (getErrorMessage() == null) {
return true;
}
return false;
}
private void updateStatus(String message) {
setErrorMessage( message );
updateLaunchConfigurationDialog();
}
// currently unused functionality
@SuppressWarnings("unused")
private Path pathOrNull(String p) {
if ( p == null || p.trim().length() == 0 ) {
return null;
}
else {
return new Path( p );
}
}
public void setDefaults(ILaunchConfigurationWorkingCopy configuration) {
// ExporterAttributes tmpAttrs = new ExporterAttributes();
// tmpAttrs.setEnableAllExporters(true);
// tmpAttrs.save(configuration);
}
public void initializeFrom(ILaunchConfiguration configuration) {
try {
ExporterAttributes attributes = new ExporterAttributes(
configuration );
selectedExporters.clear();
enableEJB3annotations.setSelection( attributes.isEJB3Enabled() );
enableJDK5.setSelection( attributes.isJDK5Enabled() );
List<ExporterFactory> exporterFactories = attributes.getExporterFactories();
observableFactoryList = new ObservableFactoryList(exporterFactories);
getExporterTable().setInput( observableFactoryList );
for (ExporterFactory exporterFactory : exporterFactories) {
if ( exporterFactory.isEnabled() ) {
getExporterTable().setChecked( exporterFactory, true );
selectedExporters.add( exporterFactory );
}
else {
getExporterTable().setChecked( exporterFactory, false );
}
}
refreshPropertySheet();
dialogChanged();
}
catch (CoreException ce) {
HibernateConsolePlugin
.getDefault()
.logErrorMessage(
HibernateConsoleMessages.ExporterSettingsTab_problem_when_reading_hibernate_tools_launch_configuration,
ce );
}
}
public void setupPropertyColumsWidth() {
Control control = propertySheet.getControl();
if (control instanceof Tree && !control.isDisposed()) {
Tree tree = (Tree)control;
TreeColumn[] columns = tree.getColumns();
IPreferenceStore preferenceStore = HibernateConsolePlugin.getDefault().getPreferenceStore();
int colWidth_0 = preferenceStore.getInt(EXPORTERS_PROPERTIES_COLUMN_PROPERTY_WIDTH);
int colWidth_1 = preferenceStore.getInt(EXPORTERS_PROPERTIES_COLUMN_VALUE_WIDTH);
if (colWidth_0 > 0 && colWidth_1 > 0) {
columns[0].setWidth(colWidth_0);
columns[1].setWidth(colWidth_1);
}
else {
Rectangle area = tree.getClientArea();
if (area.width > 0) {
int width = area.width * 40 / 100;
if (width < 2) {
width = 2;
}
columns[0].setWidth(width);
width = area.width - columns[0].getWidth() - 4;
if (width < 2) {
width = 2;
}
columns[1].setWidth(width);
}
}
}
}
public void storePropertyColumsWidth() {
if (propertySheet == null) {
return;
}
Control control = propertySheet.getControl();
if (control != null) {
if (control instanceof Tree && !control.isDisposed()) {
Tree tree = (Tree)control;
IPreferenceStore preferenceStore = HibernateConsolePlugin.getDefault().getPreferenceStore();
TreeColumn[] columns = tree.getColumns();
preferenceStore.setValue(EXPORTERS_PROPERTIES_COLUMN_PROPERTY_WIDTH, columns[0].getWidth());
preferenceStore.setValue(EXPORTERS_PROPERTIES_COLUMN_VALUE_WIDTH, columns[1].getWidth());
}
}
}
public void activated(ILaunchConfigurationWorkingCopy workingCopy) {
super.activated(workingCopy);
setupPropertyColumsWidth();
}
public void dispose() {
storePropertyColumsWidth();
super.dispose();
}
public void deactivated(ILaunchConfigurationWorkingCopy workingCopy) {
storePropertyColumsWidth();
super.deactivated(workingCopy);
}
private void refreshPropertySheet() {
getExporterTable().setSelection( getExporterTable().getSelection() ); // here to make sure the dependent propertysheet actually will reread what ever the selection is.
}
public void performApply(ILaunchConfigurationWorkingCopy configuration) {
configuration.setAttribute(
HibernateLaunchConstants.ATTR_ENABLE_EJB3_ANNOTATIONS,
enableEJB3annotations.getSelection() );
configuration.setAttribute( HibernateLaunchConstants.ATTR_ENABLE_JDK5,
enableJDK5.getSelection() );
List<ExporterFactory> exporterFactories = ((ObservableFactoryList)getExporterTable().getInput()).getList();
ExporterAttributes.saveExporterFactories(configuration, exporterFactories, selectedExporters, deletedExporterIds);
deletedExporterIds.clear();
}
public String getName() {
return HibernateConsoleMessages.ExporterSettingsTab_exporters_2;
}
public Image getImage() {
return EclipseImages.getImage( ImageConstants.MINI_HIBERNATE );
}
private CheckboxTableViewer getExporterTable() {
return (CheckboxTableViewer) exporterUpDown.getTableViewer();
}
public static Object[] selectExporters(Shell shell, String title, String description) {
ILabelProvider labelProvider= new ExporterLabelProvider();
ElementListSelectionDialog dialog= new ElementListSelectionDialog(shell, labelProvider);
dialog.setTitle(title);
dialog.setMessage(description);
dialog.setElements(ExtensionManager.findExporterDefinitionsAsMap().values().toArray());
dialog.setMultipleSelection(true);
if (dialog.open() == Window.OK) {
return dialog.getResult();
} else {
return new ExporterDefinition[0];
}
}
}