/*******************************************************************************
* Copyright (c) 2007-2009 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.hibernate.eclipse.jdt.ui.wizards;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jdt.internal.ui.viewsupport.ImageDescriptorRegistry;
import org.eclipse.jdt.ui.JavaElementImageDescriptor;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.CheckboxCellEditor;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.ide.IDE;
import org.hibernate.eclipse.console.HibernateConsolePlugin;
import org.hibernate.eclipse.jdt.ui.internal.JdtUiMessages;
import org.hibernate.eclipse.jdt.ui.internal.jpa.common.EntityInfo;
/**
* @author Dmitry Geraskov
*
*/
@SuppressWarnings("restriction")
public class NewHibernateMappingFilePage extends WizardPage {
private final Point IMAGE_SIZE = new Point(16, 16);
private TableViewer viewer;
private boolean hideFilename;
private final ImageDescriptorRegistry registry = JavaPlugin.getImageDescriptorRegistry();
private final Image hibMapping = HibernateConsolePlugin.getImageDescriptor("icons/images/hibernate_mapping.gif").createImage(); //$NON-NLS-1$
/**
* @param pageName
*/
protected NewHibernateMappingFilePage(boolean hideFilename) {
super(""); //$NON-NLS-1$
this.hideFilename = hideFilename;
}
public void createControl(Composite parent) {
final ScrolledComposite sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
sc.setExpandHorizontal(true);
sc.setExpandVertical(true);
sc.pack(false);
Composite container = new Composite(sc, SWT.NULL);
sc.setContent(container);
Layout layout = new FillLayout();
container.setLayout(layout);
Table table = new Table(container, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION );
table.setHeaderVisible(true);
table.setLinesVisible(true);
table.pack(false);
createTableColumns(table);
viewer = createTableViewer(table);
viewer.setInput(null);
sc.setMinSize(container.computeSize(SWT.DEFAULT, SWT.DEFAULT));
setControl(sc);
}
public void setInput(Map<IJavaProject, Collection<EntityInfo>> project_infos){
viewer.setInput(project_infos);
//Hide "project" column if only 1 project's CUs selected
if (project_infos.size() == 1){
viewer.getTable().getColumn(3).setWidth(0);
} else {
viewer.getTable().getColumn(3).setWidth(120);
viewer.getTable().getColumn(3).pack();
}
viewer.getTable().getColumn(1).pack();
if (!hideFilename){
viewer.getTable().getColumn(2).pack();
}
}
private void createTableColumns(Table table){
int coulmnIndex = 0;
TableColumn column = new TableColumn(table, SWT.CENTER, coulmnIndex++);
column.setText("!"); //$NON-NLS-1$
/* Hide the column while JBIDE-4269 is not implemented.
* (Filtering generated elements)
*/
//if (hideFilename)
column.setWidth(0);
column.setResizable(false);
column = new TableColumn(table, SWT.LEFT, coulmnIndex++);
column.setText(JdtUiMessages.NewHibernateMappingFilePage_class_name_column);
column.setImage(registry.get(
new JavaElementImageDescriptor(JavaPluginImages.DESC_OBJS_CLASS, 0, IMAGE_SIZE)));
column.setWidth(200);
if (!hideFilename) {
column = new TableColumn(table, SWT.LEFT, coulmnIndex++);
column.setText(JdtUiMessages.NewHibernateMappingFilePage_file_name_column);
column.setWidth(150);
column.setImage(hibMapping);
}
column = new TableColumn(table, SWT.LEFT, coulmnIndex++);
column.setText(JdtUiMessages.NewHibernateMappingFilePage_project_name_column);
column.setImage(registry.get(new JavaElementImageDescriptor(
JavaPlugin.getDefault().getWorkbench().getSharedImages()
.getImageDescriptor(IDE.SharedImages.IMG_OBJ_PROJECT), 0, IMAGE_SIZE)));
column.setWidth(120);
}
private TableViewer createTableViewer(Table table) {
TableViewer result = new TableViewer( table );
result.setUseHashlookup( true );
result.setColumnProperties( new String[] {Columns.CREATE.toString(),
Columns.CLASS.toString(), Columns.FILE.toString(), Columns.PROJECT.toString(),} );
CellEditor[] editors = new CellEditor[result.getColumnProperties().length];
int coulmnIndex = 0;
editors[coulmnIndex++] = new CheckboxCellEditor( result.getTable() );
editors[coulmnIndex++] = new TextCellEditor( result.getTable() );
editors[coulmnIndex++] = new TextCellEditor( result.getTable() );
if (!hideFilename) {
editors[coulmnIndex++] = new TextCellEditor( result.getTable() );
}
result.setCellEditors( editors );
result.setCellModifier( new TableCellModifier(result) );
result.setLabelProvider(new TableLableProvider(result));
result.setContentProvider( new TableContentProvider() );
return result;
}
@Override
public void dispose() {
hibMapping.dispose();
super.dispose();
}
private class TableLine {
public String className;
public String fileName;
public IProject project;
public Boolean isCreate = true;
public TableLine(IProject iProject, String className){
this(iProject, className, className + ".hbm.xml",true); //$NON-NLS-1$
}
public TableLine(IProject iProject, String className, String fileName, boolean isCreate){
this.className = className;
this.fileName = fileName;
this.isCreate = isCreate;
this.project = iProject;
}
@Override
public String toString() {
return "TableLine [className=" + className + ", projectName=" //$NON-NLS-1$ //$NON-NLS-2$
+ project.getName() + "]"; //$NON-NLS-1$
}
}
private enum Columns {
PROJECT,
CLASS,
FILE,
CREATE
}
private class TableContentProvider implements IStructuredContentProvider {
@SuppressWarnings("unchecked")
public Object[] getElements(Object inputElement) {
if (inputElement instanceof Map) {
List<TableLine> result = new ArrayList<TableLine>();
Map<IJavaProject, Collection<EntityInfo>> configs = (Map<IJavaProject, Collection<EntityInfo>>)inputElement;
for (Entry<IJavaProject, Collection<EntityInfo>> entry : configs.entrySet()) {
Iterator<EntityInfo> iter = entry.getValue().iterator();
while (iter.hasNext()) {
EntityInfo ei = iter.next();
result.add(new TableLine(entry.getKey().getProject(), ei.getName()));
}
}
return result.toArray();
}
return new Object[0];
}
public void dispose() {}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { }
}
private class TableLableProvider extends LabelProvider implements ITableLabelProvider {
private final TableViewer tv;
public TableLableProvider(TableViewer tv) {
this.tv = tv;
}
public Image getColumnImage(Object element, int columnIndex) {
/*String property = (String) tv.getColumnProperties()[columnIndex];
TableLine tl = (TableLine) element;
if(Columns.CREATE.toString().equals(property)) {
String key = tl.isCreate ? null : ImageConstants.CLOSE ; // TODO: find a better image
return EclipseImages.getImage(key);
} else if (Columns.CLASS.toString().equals(property)){
return registry.get(
new JavaElementImageDescriptor(JavaPluginImages.DESC_OBJS_CLASS, 0, IMAGE_SIZE));
} else if (Columns.FILE.toString().equals(property)){
IFile file = tl.project.getFile(tl.fileName);
IWorkbenchAdapter wbAdapter= (IWorkbenchAdapter) file.getAdapter(IWorkbenchAdapter.class);
if (wbAdapter != null) {
ImageDescriptor descriptor= wbAdapter.getImageDescriptor(file);
if (descriptor != null) {
return registry.get(
new JavaElementImageDescriptor(descriptor, 0, IMAGE_SIZE));
}
}
} else if (Columns.PROJECT.toString().equals(property)){
if (DESC_OBJ_PROJECT == null) {
ISharedImages images= JavaPlugin.getDefault().getWorkbench().getSharedImages();
DESC_OBJ_PROJECT= images.getImageDescriptor(IDE.SharedImages.IMG_OBJ_PROJECT);
}
return registry.get(new JavaElementImageDescriptor(DESC_OBJ_PROJECT, 0, IMAGE_SIZE));
}*/
return null;
}
public String getColumnText(Object element, int columnIndex) {
String property = (String) tv.getColumnProperties()[columnIndex];
TableLine tl = (TableLine) element;
if (Columns.CLASS.toString().equals(property)){
return tl.className;
} else if (Columns.PROJECT.toString().equals(property)){
return tl.project.getName();
} else if (Columns.FILE.toString().equals(property)){
return tl.fileName;
} else {
return "";//$NON-NLS-1$
}
}
}
private class TableCellModifier implements ICellModifier {
private final TableViewer tv;
public TableCellModifier(TableViewer tv) {
this.tv = tv;
}
public boolean canModify(Object element, String property) {
return false/*TODO "file".equals(property) || "create".equals(property)*/;
}
public Object getValue(Object element, String property) {
if (Columns.CLASS.toString().equals(property)){
return ((TableLine)element).className;
} else if (Columns.PROJECT.toString().equals(property)){
return ((TableLine)element).project.getName();
} else if (Columns.FILE.toString().equals(property)){
return ((TableLine)element).fileName;
} else if (Columns.CREATE.toString().equals(property)){
return ((TableLine)element).isCreate;
}
return null;
}
public void modify(Object element, String property, Object value) {
TableLine tl = (TableLine)((TableItem)element).getData();
if (Columns.FILE.toString().equals(property)){
tl.fileName = (String)value;
} else if (Columns.CREATE.toString().equals(property)){
tl.isCreate = (Boolean)value;
}
tv.update(new Object[] { tl }, new String[] { property });
}
}
}