/* * 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.console.views; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.List; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; 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.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabItem; 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.Menu; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.hibernate.console.QueryPage; import org.hibernate.eclipse.console.HibernateConsoleMessages; import org.hibernate.eclipse.console.HibernateConsolePlugin; /** * @author max * */ public class QueryPageViewer { static public class LabelProviderImpl implements ITableLabelProvider { public Image getColumnImage(Object element, int columnIndex) { return null; } public String getColumnText(Object element, int columnIndex) { try { Object value = element; //TODO: should just be a columnprovider per querypage.... if (element instanceof QueryPage) { value = ( (QueryPage) element).getList().get(columnIndex); } if (value == null) { return ""; //$NON-NLS-1$ } if (value.getClass().isArray() ) { Object[] arr = (Object[]) value; if (columnIndex > arr.length - 1) { return HibernateConsoleMessages.QueryPageViewer_unknown_value; } return "" + arr[columnIndex]; //$NON-NLS-1$ } else { if(columnIndex!=0) { return "?"; //$NON-NLS-1$ } else { return value.toString(); } } } catch (RuntimeException e) { String out = NLS.bind(HibernateConsoleMessages.QueryPageViewer_error, e.getMessage()); return out; } } public void addListener(ILabelProviderListener listener) { } public void dispose() { } public boolean isLabelProperty(Object element, String property) { return false; } public void removeListener(ILabelProviderListener listener) { } } public static final Object NULL_VALUE = new Object() { public String toString() { return "<null>"; //$NON-NLS-1$ } }; // should map to our table model instead static class ContentProviderImpl implements IStructuredContentProvider { public Object[] getElements(Object inputElement) { if (inputElement instanceof QueryPage) { QueryPage qp = ( (QueryPage) inputElement); Object[] objects = qp.getList().toArray(); if(qp.getExceptions().isEmpty() ) { return ensureNotNull(objects); } else { Throwable[] throwables = qp.getExceptions().toArray(new Throwable[0]); HibernateConsolePlugin.getDefault().logErrorMessage(HibernateConsoleMessages.QueryPageViewer_exception_while_executing_hql_query, throwables); return throwables; // TODO: provide actual error page } } else { return null; } } private Object[] ensureNotNull(Object[] objects) { for (int i = 0; i < objects.length; i++) { if(objects[i]==null) { objects[i] = NULL_VALUE; } } return objects; } public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } } private final QueryPage queryPage; private TableViewer tableViewer; private CTabItem tabItem; private final QueryPageTabView qrView; public QueryPageViewer(QueryPageTabView qrView, QueryPage queryPage) { this.qrView = qrView; this.queryPage = queryPage; createControl(); } protected CTabItem getTabItem() { return this.tabItem; } public Table getTable() { return this.tableViewer.getTable(); } protected void createControl() { this.tabItem = new CTabItem(this.qrView.tabs, SWT.NONE); this.tabItem.setData( this.queryPage ); int index = this.qrView.tabs.getItems().length; Composite composite = new Composite(this.qrView.tabs, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginWidth = 5; layout.marginHeight = 5; composite.setLayout(layout); composite.setLayoutData(new GridData(GridData.FILL_BOTH) ); this.tabItem.setText(this.queryPage.getTabName()); this.tabItem.setToolTipText(this.queryPage.getQueryString()); /* different icon dependent on java/hql etc. if (this.queryPage.getEntity() == null) { this.tabItem.setImage(ImageStore.getImage(ImageStore.SCRIPT) ); this.tabItem.setText(this.queryPage.getBookmark().getName() ); this.tabItem.setToolTipText(this.queryPage.getQuery() ); } else if (this.queryPage.isMetaData() ) { this.tabItem.setImage(ImageStore.getImage(ImageStore.TABLE_DETAILS) ); this.tabItem.setText(this.queryPage.getBookmark().getName() + ":" + this.queryPage.getEntity().getQualifiedName() ); tabItem.setToolTipText(this.queryPage.getEntity().getQualifiedName() ); } else { this.tabItem.setImage(ImageStore.getImage(ImageStore.TABLE) ); this.tabItem.setText(this.queryPage.getBookmark().getName() + ":" + this.queryPage.getEntity().getQualifiedName() ); this.tabItem.setToolTipText(this.queryPage.getEntity().getQualifiedName() ); }*/ createTable(composite); this.tabItem.setControl(composite); initializePopUpMenu(); this.qrView.tabs.setSelection(index-1); this.queryPage.addPropertyChangeListener(queryPagePropChangeListener); } /** * @param tabItem * @param composite */ private void createTable(Composite composite) { final Table table = new Table(composite, SWT.FULL_SELECTION | SWT.MULTI | SWT.BORDER); table.setLayout(new GridLayout() ); table.setLayoutData(new GridData(GridData.FILL_BOTH) ); addColumnsToTable(table); this.tableViewer = new TableViewer(table); this.tableViewer.setLabelProvider(new LabelProviderImpl() ); this.tableViewer.setContentProvider(new ContentProviderImpl() ); this.tableViewer.setInput(this.queryPage); this.tableViewer.addDoubleClickListener(new IDoubleClickListener () { public void doubleClick(DoubleClickEvent event) { tableDoubleClicked(); } }); this.tableViewer.addSelectionChangedListener(new ISelectionChangedListener () { public void selectionChanged(SelectionChangedEvent event) { tableDoubleClicked(); } }); packColumns(table); } private void tableDoubleClicked () { ISelection selection = tableViewer.getSelection(); if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection) { qrView.fireSelectionChangedEvent(selection); } } /** * @param table */ private void packColumns(final Table table) { for (int i = 0; i < table.getColumnCount(); i++) { table.getColumn(i).pack(); } } /** * @param table * @return */ private int addColumnsToTable(final Table table) { table.setHeaderVisible(true); table.setLinesVisible(true); List<String> columns = this.queryPage.getPathNames(); int columnCount = columns.size(); for (int i = 0; i < columnCount; i++) { TableColumn column = new TableColumn(table, SWT.NONE); String text = columns.get(i) == null ? "" : columns.get(i); //$NON-NLS-1$ column.setText(text); } return columnCount; } protected PropertyChangeListener queryPagePropChangeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if ("tabName".equals(event.getPropertyName() )) { //$NON-NLS-1$ tabItem.setText(queryPage.getTabName()); } } }; public void propertyChange(PropertyChangeEvent event) { if ("rows".equals(event.getPropertyName() ) ) { //$NON-NLS-1$ this.tableViewer.refresh(); } else if ("columns".equals(event.getPropertyName() ) ) { //$NON-NLS-1$ Table table = this.tableViewer.getTable(); TableColumn[] columns = table.getColumns(); for (int i = 0, length = columns == null ? 0 : columns.length; i < length; i++) { columns[i].dispose(); } addColumnsToTable(table); this.tableViewer.setInput(this.queryPage); packColumns(table); table.layout(); } // updateStatusLine(); } public void dispose() { //this.queryPage.removePropertyChangeListener(this); this.queryPage.removePropertyChangeListener(queryPagePropChangeListener); this.tabItem.dispose(); } protected QueryPage getQueryPage() { return this.queryPage; } private void initializePopUpMenu() { MenuManager manager = new MenuManager(); manager.setRemoveAllWhenShown(true); manager.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager menuManager) { //QueryPageViewer.this.tableView.actionGroup.fillContextMenu(menuManager); } }); Menu contextMenu = manager.createContextMenu(this.tableViewer.getControl() ); this.tableViewer.getControl().setMenu(contextMenu); // register the menu to the site so that we can allow // actions to be plugged in //this.tableView.getSite().registerContextMenu(manager, this.tableView); } protected ISelection getSelection() { return this.tableViewer.getSelection(); } }