synchronized from quantum plugin
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.quantum.sql / src / com / quantum / view / tableview / TableView.java
1 package com.quantum.view.tableview;
2
3 import java.util.Vector;
4
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;
25
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;
35
36 /**
37  * The Table View. Displays tables and Queries.
38  */
39 public class TableView extends ViewPart implements ISelectionListener {
40
41         private class DefaultEncodingAction extends Action {
42         private final TableAdapter ta;
43         private DefaultEncodingAction(TableAdapter ta) {
44             super();
45             this.ta = ta;
46         }
47         public void run() {
48                 ta.setEncoding(TableAdapter.DEFAULT);
49         }
50     }
51     private static TableView instance = null;
52         private TabFolder tabs = null;
53         private Composite parent;
54         private Vector extensionVector;
55  
56         /**
57          * Generic contructor
58          */
59         public TableView() {
60         }
61
62
63         public void setFocus() {
64                 setQualifiedTitle();
65         }
66         
67     /**
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
70      * is open.
71      * 
72      * @return the TableView instance.
73      */
74         public static TableView getInstance() {
75                 return (TableView) QuantumPlugin.getDefault().getView("com.quantum.view.tableview.TableView");
76         }
77         
78         /**
79          * Close the current tab, disposing of it
80          */
81         public void closeCurrent() {
82                 if (tabs == null) return;
83                 
84                 if (tabs.getSelectionIndex() >= 0) {
85                         try {
86                                 TabItem item = tabs.getItem(tabs.getSelectionIndex());
87                                 item.dispose();
88                         } catch (Throwable e) {
89                                 LogProxy.getInstance().addText(LogProxy.ERROR, "Error Closing Current: " + e.toString()); //$NON-NLS-1$
90                                 e.printStackTrace();
91                         }
92                 } 
93                 if (tabs.getItemCount() == 0) {
94                         setTitle(Messages.getString("tableview.QuantumTableViewName")); //$NON-NLS-1$
95                 }
96         }
97         
98         /**
99          * Reload table or query data into the selected tab
100          */
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();
106                 if (table == null) {
107                         loadTable(bookmark, item, null, null, true, true);
108                 } else {
109                         loadTable(bookmark, item, null, null, true, true);
110                 }
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$
114                 setTitle(title);
115         }
116         
117     public void loadQuery(Bookmark bookmark, SQLResults results) {
118         loadTable(bookmark, null, null, results, true, false);
119     }
120         public void loadTable(Entity entity) {
121                 loadTable(entity.getBookmark(), null, entity, null, false, true);
122         }
123         public void loadTable(Bookmark bookmark, TabItem tabItem, Entity entity, SQLResults results, boolean query, boolean reload) {
124         try {
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
130                         if (query) {
131                                 adapter = TableAdapter.createFromQuery(bookmark, results);
132                         } else {
133                                 adapter = TableAdapter.createFromTable(entity);
134                         }
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) {
142                                 }
143                                 public void widgetSelected(SelectionEvent e) {
144                                         setQualifiedTitle();
145                                 }
146                         });
147                 } else {
148                         // If there is already a TabItem, we take its TableAdapter object
149                         adapter = (TableAdapter) tabItem.getData();
150                 }
151                 
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);
158     
159                 
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);
166                 
167         
168                 // load table
169                 if (reload) {
170                         adapter.resetOffset();
171                         adapter.loadData();
172                 }
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);
177                 
178                 String tableName = adapter.getTable();
179                 if (tableName != null) {
180                         tabItem.setText(bookmark.getName() + ":" + tableName);
181                 } else {
182                         tabItem.setText(bookmark.getName() + ":" + adapter.getQuery());
183                 }
184     
185                 toolBar.getPrevious().setEnabled(adapter.hasPreviousPage());
186                 toolBar.getNext().setEnabled(adapter.hasNextPage());
187                 label.setText(adapter.getStatusString());
188                 
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);
195     
196                 gridData = new GridData();
197                 gridData.horizontalAlignment = GridData.FILL;
198                 label.setLayoutData(gridData);
199     
200                 
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() {
206                         public void run() {
207                                 ta.setEncoding(TableAdapter.UTF_8);
208                         }
209                 };
210                 UTF8EncodingAction.setText(Messages.getString("tableview.UTF8Encoding")); //$NON-NLS-1$
211                 final Action UTF16EncodingAction = new Action() {
212                         public void run() {
213                                 ta.setEncoding(TableAdapter.UTF_16);
214                         }
215                 };
216                 UTF16EncodingAction.setText(Messages.getString("tableview.UTF16Encoding")); //$NON-NLS-1$
217     
218                 IMenuListener menuListener = new TableViewMenuListener(this, table, UTF16EncodingAction, ta, defaultEncodingAction, UTF8EncodingAction, extensionVector);
219     
220                 // final setup
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);
227                 
228                 tabItem.setControl(main);
229                 tabs.setSelection(tabs.indexOf(tabItem));
230     
231                 setQualifiedTitle();            
232         } catch (NotConnectedException e) {
233             e.printStackTrace();
234             handleException(e);
235         } catch (Exception e) {
236             e.printStackTrace();
237         }
238         }
239     
240     protected void handleException(Exception e) {
241         ExceptionDisplayDialog.openError(getSite().getShell(), null, null, e);
242     }
243
244         /**
245          * @return
246          */
247         /**
248          * Sets the title of the window to the text of the selected tab
249          */
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$
258                                                                 + defTitle 
259                                                                 + Messages.getString("tableview.ViewNameFinalDecoration"); //$NON-NLS-1$
260                 setTitle(defTitle);
261         }
262
263         public void createPartControl(Composite parent) {
264                 instance = this;
265                 this.parent = parent;
266                 initActions();
267                 tabs = new TabFolder(parent, SWT.NONE);
268         }
269         
270         public void initActions() {
271                 extensionVector = new Vector();
272                 try {
273                         ProcessServiceMembers.process(this, extensionVector);
274                 } catch (WorkbenchException e) {
275                         e.printStackTrace();
276                 }
277
278         }
279
280         public void selectionChanged(IWorkbenchPart part, ISelection selection) {
281
282         }
283 }