Quantum version 2.4.1
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.quantum.sql / src / com / quantum / view / tableview / ResultSetViewer.java
diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/view/tableview/ResultSetViewer.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/view/tableview/ResultSetViewer.java
new file mode 100644 (file)
index 0000000..fccbc9c
--- /dev/null
@@ -0,0 +1,246 @@
+package com.quantum.view.tableview;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import com.quantum.ImageStore;
+import com.quantum.Messages;
+import com.quantum.sql.SQLResultSetResults;
+import com.quantum.sql.Scrollable;
+
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+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.TabItem;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+
+/**
+ * @author BC
+ */
+class ResultSetViewer implements PropertyChangeListener {
+       
+       class LabelProviderImpl implements ITableLabelProvider {
+               public Image getColumnImage(Object element, int columnIndex) {
+                       return null;
+               }
+               public String getColumnText(Object element, int columnIndex) {
+                       Object value = null;
+                       if (element instanceof SQLResultSetResults.Row) {
+                               value = ((SQLResultSetResults.Row) element).get(columnIndex+1);
+                       }
+                       return value == null ? "" : value.toString();
+               }
+               public void addListener(ILabelProviderListener listener) {
+               }
+               public void dispose() {
+               }
+               public boolean isLabelProperty(Object element, String property) {
+                       return false;
+               }
+               public void removeListener(ILabelProviderListener listener) {
+               }
+       }
+       
+       class ContentProviderImpl implements IStructuredContentProvider {
+               public Object[] getElements(Object inputElement) {
+                       if (inputElement instanceof SQLResultSetResults) {
+                               return ((SQLResultSetResults) inputElement).getRows();
+                       } else {
+                               return null;
+                       }
+               }
+
+               public void dispose() {
+               }
+
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+               }
+               
+       }
+       
+
+       private final SQLResultSetResults resultSet;
+       private TableViewer tableViewer;
+       private TabItem tabItem;
+       private final TableView tableView;
+       
+       public ResultSetViewer(TableView tableView, SQLResultSetResults resultSet) {
+               this.tableView = tableView;
+               this.resultSet = resultSet;
+               
+               createControl();
+               
+               this.resultSet.addPropertyChangeListener(this);
+       }
+       
+       protected TabItem getTabItem() {
+               return this.tabItem;
+       }
+       
+       public Table getTable() {
+               return this.tableViewer.getTable();
+       }
+       
+       protected void createControl() {
+       this.tabItem = new TabItem(this.tableView.tabs, SWT.NONE);
+       
+       int index = this.tableView.tabs.getItems().length;      
+       Composite composite = new Composite(this.tableView.tabs, SWT.NONE);
+               GridLayout layout = new GridLayout();
+               layout.marginWidth = 5;
+               layout.marginHeight = 5;
+               composite.setLayout(layout);
+               composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+               if (this.resultSet.getEntity() == null) {
+                       this.tabItem.setImage(ImageStore.getImage(ImageStore.SCRIPT));
+                       this.tabItem.setText(this.resultSet.getBookmark().getName());
+                       this.tabItem.setToolTipText(this.resultSet.getQuery());
+               } else if (this.resultSet.isMetaData()) {
+                       this.tabItem.setImage(ImageStore.getImage(ImageStore.TABLE_DETAILS));
+                       this.tabItem.setText(this.resultSet.getBookmark().getName() + ":" + 
+                                       this.resultSet.getEntity().getQualifiedName());
+                       tabItem.setToolTipText(this.resultSet.getEntity().getQualifiedName());
+               } else {
+                       this.tabItem.setImage(ImageStore.getImage(ImageStore.TABLE));
+                       this.tabItem.setText(this.resultSet.getBookmark().getName() + ":" + 
+                                       this.resultSet.getEntity().getQualifiedName());
+                       this.tabItem.setToolTipText(this.resultSet.getEntity().getQualifiedName());
+               }
+               
+               createTable(composite);
+               this.tabItem.setControl(composite);
+               initializePopUpMenu();
+
+               this.tableView.tabs.setSelection(index-1);
+       }
+
+
+       /**
+        * @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.resultSet);
+
+               packColumns(table);
+       }
+
+       /**
+        * @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);
+               int columnCount = this.resultSet.getColumnCount();
+               for (int i = 0; i < columnCount; i++) {
+                       TableColumn column = new TableColumn(table, SWT.NONE);
+                       column.setText(this.resultSet.getColumnName(i+1).toString());
+               }
+               return columnCount;
+       }
+
+       public void propertyChange(PropertyChangeEvent event) {
+               if ("rows".equals(event.getPropertyName())) {
+                       this.tableViewer.refresh();
+               } else if ("columns".equals(event.getPropertyName())) {
+                       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.resultSet);
+                       packColumns(table);
+                       table.layout();
+               }
+               updateStatusLine();
+       }
+       
+       public void dispose() {
+               this.resultSet.removePropertyChangeListener(this);
+               this.tabItem.dispose();
+       }
+
+       protected SQLResultSetResults getResultSet() {
+               return this.resultSet;
+       }
+       
+       private void initializePopUpMenu() {
+        MenuManager manager = new MenuManager();
+        manager.setRemoveAllWhenShown(true);
+        manager.addMenuListener(new IMenuListener() {
+            public void menuAboutToShow(IMenuManager menuManager) {
+                ResultSetViewer.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 void updateStatusLine() {
+               
+               if (this == this.tableView.getSelectedResultSetViewer()) {
+                       IStatusLineManager statusLine = this.tableView.getViewSite().getActionBars().getStatusLineManager();
+                       if (this.resultSet != null && this.resultSet instanceof Scrollable) {
+                               Scrollable scrollable = (Scrollable) this.resultSet;
+                               int start = scrollable.getStart();
+                               int end = scrollable.getEnd();
+                               int last = scrollable.getLast();
+                               
+                               statusLine.setMessage(
+                                               Messages.getString(getClass(), "position", 
+                                                               new String[] { 
+                                                                       String.valueOf(start), 
+                                                                       String.valueOf(end),
+                                                                       last < 0 
+                                                                               ? Messages.getString(getClass(), "unknown")
+                                                                               : String.valueOf(last)}));
+                       } else {
+                               statusLine.setMessage("");
+                       }
+               }
+       }
+       
+       protected ISelection getSelection() {
+               return this.tableViewer.getSelection();
+       }
+}