1 package com.quantum.view.tableview;
3 import java.util.Vector;
5 import com.quantum.Messages;
6 import com.quantum.QuantumPlugin;
7 import com.quantum.extensions.ProcessServiceMembers;
8 import com.quantum.model.Bookmark;
9 import com.quantum.model.Entity;
10 import com.quantum.model.NotConnectedException;
11 import com.quantum.sql.SQLResults;
12 import com.quantum.ui.dialog.ExceptionDisplayDialog;
13 import com.quantum.view.LogProxy;
15 import org.eclipse.jface.action.Action;
16 import org.eclipse.jface.action.IMenuListener;
17 import org.eclipse.jface.action.MenuManager;
18 import org.eclipse.jface.viewers.ISelection;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.events.SelectionEvent;
21 import org.eclipse.swt.events.SelectionListener;
22 import org.eclipse.swt.layout.GridData;
23 import org.eclipse.swt.layout.GridLayout;
24 import org.eclipse.swt.widgets.Composite;
25 import org.eclipse.swt.widgets.Label;
26 import org.eclipse.swt.widgets.Menu;
27 import org.eclipse.swt.widgets.TabFolder;
28 import org.eclipse.swt.widgets.TabItem;
29 import org.eclipse.swt.widgets.Table;
30 import org.eclipse.swt.widgets.ToolBar;
31 import org.eclipse.ui.ISelectionListener;
32 import org.eclipse.ui.IWorkbenchPart;
33 import org.eclipse.ui.WorkbenchException;
34 import org.eclipse.ui.part.ViewPart;
37 * The Table View. Displays tables and Queries.
39 public class TableView extends ViewPart implements ISelectionListener {
41 private class DefaultEncodingAction extends Action {
42 private final TableAdapter ta;
43 private DefaultEncodingAction(TableAdapter ta) {
48 ta.setEncoding(TableAdapter.DEFAULT);
51 private TabFolder tabs = null;
52 private Composite parent;
53 private Vector extensionVector;
62 public void setFocus() {
67 * Gets the instance of the TableView. This view can appear on multiple
68 * perspectives, but tabs within the view are shared no matter which perspective
71 * @return the TableView instance.
73 public static TableView getInstance() {
74 return (TableView) QuantumPlugin.getDefault().getView("com.quantum.view.tableview.TableView");
78 * Close the current tab, disposing of it
80 public void closeCurrent() {
81 if (tabs == null) return;
83 if (tabs.getSelectionIndex() >= 0) {
85 TabItem item = tabs.getItem(tabs.getSelectionIndex());
87 } catch (Throwable e) {
88 LogProxy.getInstance().addText(LogProxy.ERROR, "Error Closing Current: " + e.toString()); //$NON-NLS-1$
92 if (tabs.getItemCount() == 0) {
93 setTitle(Messages.getString("tableview.QuantumTableViewName")); //$NON-NLS-1$
98 * Reload table or query data into the selected tab
100 public void refreshCurrent() {
101 System.out.println("Refresh?");
102 if (tabs.getSelectionIndex() >= 0) {
103 System.out.println("Refresh!");
104 TabItem item = tabs.getItem(tabs.getSelectionIndex());
105 TableAdapter adapter = (TableAdapter) item.getData();
106 Bookmark bookmark = adapter.getBookmark();
107 String table = adapter.getTable();
109 loadTable(bookmark, item, null, null, true, true);
111 loadTable(bookmark, item, null, null, true, true);
113 String title = Messages.getString("tableview.QuantumTableViewName"); //$NON-NLS-1$
114 if (bookmark != null)
115 title = bookmark.getName() + Messages.getString("tableview.ViewNameInitialDecoration") + title + Messages.getString("tableview.ViewNameFinalDecoration"); //$NON-NLS-1$ //$NON-NLS-2$
120 public void loadQuery(Bookmark bookmark, SQLResults results) {
121 loadTable(bookmark, null, null, results, true, false);
123 public void loadTable(Entity entity) {
124 loadTable(entity.getBookmark(), null, entity, null, false, true);
126 public void loadTable(Bookmark bookmark, TabItem tabItem, Entity entity, SQLResults results, boolean query, boolean reload) {
128 TableAdapter adapter;
129 // If no TabItem is given we have to create a new one, with the info of the table or view.
130 if (tabItem == null) {
131 tabItem = new TabItem(tabs, SWT.NONE);
132 // Data is stored in a TableAdapter object
134 adapter = TableAdapter.createFromQuery(bookmark, results);
136 adapter = TableAdapter.createFromTable(entity);
138 // That is stored in the tabItem, so it won't get lost
139 tabItem.setData(adapter);
140 // This does not really belong here, but it'll fail if done before the creation of the
141 // first TabItem, so it remains here till a better place found.
142 // We set a function to change the Title of the window depending on the selected tab.
143 tabs.addSelectionListener(new SelectionListener() {
144 public void widgetDefaultSelected(SelectionEvent e) {
146 public void widgetSelected(SelectionEvent e) {
151 // If there is already a TabItem, we take its TableAdapter object
152 adapter = (TableAdapter) tabItem.getData();
155 // We create a Composite widget (main) to display our data, with a GridLayout
156 Composite main = new Composite(tabs, SWT.NONE);
157 GridLayout layout = new GridLayout(1, false);
158 layout.horizontalSpacing = 0;
159 layout.verticalSpacing = 0;
160 main.setLayout(layout);
163 // load widgets, the order of loading them determines the appearance in screen
164 ToolBar widgetToolBar = new ToolBar(main, SWT.HORIZONTAL);
165 // We fill up our Composite widget, the main table display, etc.
166 final Table table = new Table(main, SWT.FULL_SELECTION | SWT.MULTI);
167 final Label label = new Label(main, SWT.NULL);
168 TableViewToolBar toolBar = new TableViewToolBar(this, widgetToolBar, table, adapter, label);
173 adapter.resetOffset();
176 // Load the table data from the adapter into the widget
177 adapter.loadTable(table);
178 // Experimental, won't make it into 2.2
179 // final TableViewer viewer = adapter.addTableViewer(table);
181 String tableName = adapter.getTable();
182 if (tableName != null) {
183 tabItem.setText(bookmark.getName() + ":" + tableName);
185 tabItem.setText(bookmark.getName() + ": SQL");
186 tabItem.setToolTipText(bookmark.getName() + ":\n" + adapter.getQuery());
189 toolBar.getPrevious().setEnabled(adapter.hasPreviousPage());
190 toolBar.getNext().setEnabled(adapter.hasNextPage());
191 label.setText(adapter.getStatusString());
193 GridData gridData = new GridData();
194 gridData.horizontalAlignment = GridData.FILL;
195 gridData.verticalAlignment = GridData.FILL;
196 gridData.grabExcessHorizontalSpace = true;
197 gridData.grabExcessVerticalSpace = true;
198 table.setLayoutData(gridData);
200 gridData = new GridData();
201 gridData.horizontalAlignment = GridData.FILL;
202 label.setLayoutData(gridData);
205 toolBar.setColumns(this, adapter, table);
206 final TableAdapter ta = adapter;
207 final Action defaultEncodingAction = new DefaultEncodingAction(ta);
208 defaultEncodingAction.setText(Messages.getString("tableview.defaultEncoding")); //$NON-NLS-1$
209 final Action UTF8EncodingAction = new Action() {
211 ta.setEncoding(TableAdapter.UTF_8);
214 UTF8EncodingAction.setText(Messages.getString("tableview.UTF8Encoding")); //$NON-NLS-1$
215 final Action UTF16EncodingAction = new Action() {
217 ta.setEncoding(TableAdapter.UTF_16);
220 UTF16EncodingAction.setText(Messages.getString("tableview.UTF16Encoding")); //$NON-NLS-1$
222 IMenuListener menuListener = new TableViewMenuListener(this, table, UTF16EncodingAction, ta, defaultEncodingAction, UTF8EncodingAction, extensionVector);
225 MenuManager manager = new MenuManager();
226 manager.setRemoveAllWhenShown(true);
227 Menu fTextContextMenu = manager.createContextMenu(table);
228 table.setMenu(fTextContextMenu);
229 table.setLinesVisible(true);
230 manager.addMenuListener(menuListener);
232 tabItem.setControl(main);
233 tabs.setSelection(tabs.indexOf(tabItem));
236 } catch (NotConnectedException e) {
239 } catch (Exception e) {
244 protected void handleException(Exception e) {
245 ExceptionDisplayDialog.openError(getSite().getShell(), null, null, e);
252 * Sets the title of the window to the text of the selected tab
254 private void setQualifiedTitle() {
255 if (tabs.getSelectionIndex() < 0) return;
256 TabItem item = tabs.getItem(tabs.getSelectionIndex());
257 String defTitle = Messages.getString("tableview.QuantumTableViewName"); //$NON-NLS-1$
258 String title = item.getText();
259 int ind = title.indexOf(Messages.getString("tableview.BookmarkSeparator")); //$NON-NLS-1$
260 if (ind > 0) defTitle = title.substring(0,ind)
261 + Messages.getString("tableview.ViewNameInitialDecoration") //$NON-NLS-1$
263 + Messages.getString("tableview.ViewNameFinalDecoration"); //$NON-NLS-1$
267 public void createPartControl(Composite parent) {
268 this.parent = parent;
270 tabs = new TabFolder(parent, SWT.NONE);
273 public void initActions() {
274 extensionVector = new Vector();
276 ProcessServiceMembers.process(this, extensionVector);
277 } catch (WorkbenchException e) {
283 public void selectionChanged(IWorkbenchPart part, ISelection selection) {