1 package com.quantum.view.tableview;
3 import java.util.Vector;
5 import org.eclipse.jface.action.Action;
6 import org.eclipse.jface.action.IMenuListener;
7 import org.eclipse.jface.action.MenuManager;
8 import org.eclipse.jface.viewers.ISelection;
9 import org.eclipse.swt.SWT;
10 import org.eclipse.swt.events.SelectionEvent;
11 import org.eclipse.swt.events.SelectionListener;
12 import org.eclipse.swt.layout.GridData;
13 import org.eclipse.swt.layout.GridLayout;
14 import org.eclipse.swt.widgets.Composite;
15 import org.eclipse.swt.widgets.Label;
16 import org.eclipse.swt.widgets.Menu;
17 import org.eclipse.swt.widgets.TabFolder;
18 import org.eclipse.swt.widgets.TabItem;
19 import org.eclipse.swt.widgets.Table;
20 import org.eclipse.swt.widgets.ToolBar;
21 import org.eclipse.ui.ISelectionListener;
22 import org.eclipse.ui.IWorkbenchPart;
23 import org.eclipse.ui.WorkbenchException;
24 import org.eclipse.ui.part.ViewPart;
26 import com.quantum.Messages;
27 import com.quantum.QuantumPlugin;
28 import com.quantum.extensions.ProcessServiceMembers;
29 import com.quantum.model.Bookmark;
30 import com.quantum.model.Entity;
31 import com.quantum.model.NotConnectedException;
32 import com.quantum.sql.SQLResults;
33 import com.quantum.ui.dialog.ExceptionDisplayDialog;
34 import com.quantum.view.LogProxy;
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 static TableView instance = null;
52 private TabFolder tabs = null;
53 private Composite parent;
54 private Vector extensionVector;
63 public void setFocus() {
68 * Gets the instance of the TableView. This view can appear on multiple
69 * perspectives, but tabs within the view are shared no matter which perspective
72 * @return the TableView instance.
74 public static TableView getInstance() {
75 return (TableView) QuantumPlugin.getDefault().getView("com.quantum.view.tableview.TableView");
79 * Close the current tab, disposing of it
81 public void closeCurrent() {
82 if (tabs == null) return;
84 if (tabs.getSelectionIndex() >= 0) {
86 TabItem item = tabs.getItem(tabs.getSelectionIndex());
88 } catch (Throwable e) {
89 LogProxy.getInstance().addText(LogProxy.ERROR, "Error Closing Current: " + e.toString()); //$NON-NLS-1$
93 if (tabs.getItemCount() == 0) {
94 setTitle(Messages.getString("tableview.QuantumTableViewName")); //$NON-NLS-1$
99 * Reload table or query data into the selected tab
101 public void refreshCurrent() {
102 TabItem item = tabs.getItem(tabs.getSelectionIndex());
103 TableAdapter adapter = (TableAdapter) item.getData();
104 Bookmark bookmark = adapter.getBookmark();
105 String table = adapter.getTable();
107 loadTable(bookmark, item, null, null, true, true);
109 loadTable(bookmark, item, null, null, true, true);
111 String title = Messages.getString("tableview.QuantumTableViewName"); //$NON-NLS-1$
112 if (bookmark != null)
113 title = bookmark.getName() + Messages.getString("tableview.ViewNameInitialDecoration") + title + Messages.getString("tableview.ViewNameFinalDecoration"); //$NON-NLS-1$ //$NON-NLS-2$
117 public void loadQuery(Bookmark bookmark, SQLResults results) {
118 loadTable(bookmark, null, null, results, true, false);
120 public void loadTable(Entity entity) {
121 loadTable(entity.getBookmark(), null, entity, null, false, true);
123 public void loadTable(Bookmark bookmark, TabItem tabItem, Entity entity, SQLResults results, boolean query, boolean reload) {
125 TableAdapter adapter;
126 // If no TabItem is given we have to create a new one, with the info of the table or view.
127 if (tabItem == null) {
128 tabItem = new TabItem(tabs, SWT.NONE);
129 // Data is stored in a TableAdapter object
131 adapter = TableAdapter.createFromQuery(bookmark, results);
133 adapter = TableAdapter.createFromTable(entity);
135 // That is stored in the tabItem, so it won't get lost
136 tabItem.setData(adapter);
137 // This does not really belong here, but it'll fail if done before the creation of the
138 // first TabItem, so it remains here till a better place found.
139 // We set a function to change the Title of the window depending on the selected tab.
140 tabs.addSelectionListener(new SelectionListener() {
141 public void widgetDefaultSelected(SelectionEvent e) {
143 public void widgetSelected(SelectionEvent e) {
148 // If there is already a TabItem, we take its TableAdapter object
149 adapter = (TableAdapter) tabItem.getData();
152 // We create a Composite widget (main) to display our data, with a GridLayout
153 Composite main = new Composite(tabs, SWT.NONE);
154 GridLayout layout = new GridLayout(1, false);
155 layout.horizontalSpacing = 0;
156 layout.verticalSpacing = 0;
157 main.setLayout(layout);
160 // load widgets, the order of loading them determines the appearance in screen
161 ToolBar widgetToolBar = new ToolBar(main, SWT.HORIZONTAL);
162 // We fill up our Composite widget, the main table display, etc.
163 final Table table = new Table(main, SWT.FULL_SELECTION | SWT.MULTI);
164 final Label label = new Label(main, SWT.NULL);
165 TableViewToolBar toolBar = new TableViewToolBar(this, widgetToolBar, table, adapter, label);
170 adapter.resetOffset();
173 // Load the table data from the adapter into the widget
174 adapter.loadTable(table);
175 // Experimental, won't make it into 2.2
176 // final TableViewer viewer = adapter.addTableViewer(table);
178 String tableName = adapter.getTable();
179 if (tableName != null) {
180 tabItem.setText(bookmark.getName() + ":" + tableName);
182 tabItem.setText(bookmark.getName() + ":" + adapter.getQuery());
185 toolBar.getPrevious().setEnabled(adapter.hasPreviousPage());
186 toolBar.getNext().setEnabled(adapter.hasNextPage());
187 label.setText(adapter.getStatusString());
189 GridData gridData = new GridData();
190 gridData.horizontalAlignment = GridData.FILL;
191 gridData.verticalAlignment = GridData.FILL;
192 gridData.grabExcessHorizontalSpace = true;
193 gridData.grabExcessVerticalSpace = true;
194 table.setLayoutData(gridData);
196 gridData = new GridData();
197 gridData.horizontalAlignment = GridData.FILL;
198 label.setLayoutData(gridData);
201 toolBar.setColumns(this, adapter, table);
202 final TableAdapter ta = adapter;
203 final Action defaultEncodingAction = new DefaultEncodingAction(ta);
204 defaultEncodingAction.setText(Messages.getString("tableview.defaultEncoding")); //$NON-NLS-1$
205 final Action UTF8EncodingAction = new Action() {
207 ta.setEncoding(TableAdapter.UTF_8);
210 UTF8EncodingAction.setText(Messages.getString("tableview.UTF8Encoding")); //$NON-NLS-1$
211 final Action UTF16EncodingAction = new Action() {
213 ta.setEncoding(TableAdapter.UTF_16);
216 UTF16EncodingAction.setText(Messages.getString("tableview.UTF16Encoding")); //$NON-NLS-1$
218 IMenuListener menuListener = new TableViewMenuListener(this, table, UTF16EncodingAction, ta, defaultEncodingAction, UTF8EncodingAction, extensionVector);
221 MenuManager manager = new MenuManager();
222 manager.setRemoveAllWhenShown(true);
223 Menu fTextContextMenu = manager.createContextMenu(table);
224 table.setMenu(fTextContextMenu);
225 table.setLinesVisible(true);
226 manager.addMenuListener(menuListener);
228 tabItem.setControl(main);
229 tabs.setSelection(tabs.indexOf(tabItem));
232 } catch (NotConnectedException e) {
235 } catch (Exception e) {
240 protected void handleException(Exception e) {
241 ExceptionDisplayDialog.openError(getSite().getShell(), null, null, e);
248 * Sets the title of the window to the text of the selected tab
250 private void setQualifiedTitle() {
251 if (tabs.getSelectionIndex() < 0) return;
252 TabItem item = tabs.getItem(tabs.getSelectionIndex());
253 String defTitle = Messages.getString("tableview.QuantumTableViewName"); //$NON-NLS-1$
254 String title = item.getText();
255 int ind = title.indexOf(Messages.getString("tableview.BookmarkSeparator")); //$NON-NLS-1$
256 if (ind > 0) defTitle = title.substring(0,ind)
257 + Messages.getString("tableview.ViewNameInitialDecoration") //$NON-NLS-1$
259 + Messages.getString("tableview.ViewNameFinalDecoration"); //$NON-NLS-1$
263 public void createPartControl(Composite parent) {
265 this.parent = parent;
267 tabs = new TabFolder(parent, SWT.NONE);
270 public void initActions() {
271 extensionVector = new Vector();
273 ProcessServiceMembers.process(this, extensionVector);
274 } catch (WorkbenchException e) {
280 public void selectionChanged(IWorkbenchPart part, ISelection selection) {