RSS news reader; initially copied from "all the news"
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.quantum.sql / src / com / quantum / actions / ExecuteAction.java
index f8c4418..26f869c 100644 (file)
 package com.quantum.actions;
 
+import java.io.IOException;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Vector;
 
+import com.quantum.ImageStore;
 import com.quantum.Messages;
 import com.quantum.QuantumPlugin;
 import com.quantum.model.Bookmark;
-import com.quantum.sql.MultiSQLServer;
-import com.quantum.sql.SQLParser;
-import com.quantum.sql.SQLResults;
-import com.quantum.view.LogProxy;
+import com.quantum.model.BookmarkCollection;
+import com.quantum.model.DisplayableComparator;
+import com.quantum.sql.parser.SQLParser;
 import com.quantum.view.SQLQueryView;
-import com.quantum.view.bookmark.BookmarkNode;
-import com.quantum.view.bookmark.BookmarkView;
-import com.quantum.view.tableview.DefaultSizes;
-import com.quantum.view.tableview.TableView;
 
-import org.eclipse.jface.action.IAction;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.events.MenuAdapter;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
 import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
 
 /**
- * @author panic
+ * Executes a query from the QueryView
  *
- *     Executes a query from the QueryView
+ * @author panic
  */
-public class ExecuteAction extends BaseSQLAction implements IViewActionDelegate {
-       SQLQueryView view;
-       boolean flag = false;
-       String execute1 = Messages.getString("ExecuteAction.Executing_Query3"); //$NON-NLS-1$
-       String execute2 = Messages.getString("ExecuteAction.Executing_Query2"); //$NON-NLS-1$
-    
-       public ExecuteAction() {
+public class ExecuteAction extends BaseExecuteAction implements IMenuCreator {
+       
+private static final String LAST_USED_BOOKMARK_PREFERENCE = ExecuteAction.class.getName() + ".bookmark";
+       private SQLQueryView view;
+       
+       public ExecuteAction(SQLQueryView view) {
+               this.view = view;
                setActionDefinitionId("com.quantum.actions.ExecuteAction");
+               setImageDescriptor(ImageStore.getImageDescriptor(ImageStore.PLAY));
+               initTextAndToolTip();
+               setMenuCreator(this);
        }
-    
-       public void init(IViewPart view) {
-               this.view = (SQLQueryView) view;
+
+       /**
+        * 
+        */
+       private void initTextAndToolTip() {
+               Bookmark lastUsedBookmark = getLastUsedBookmark();
+               if (lastUsedBookmark == null) {
+                       setText(Messages.getString(ExecuteAction.class, "textNoBookmark"));
+                       setToolTipText(Messages.getString(ExecuteAction.class, "textNoBookmark"));
+               } else {
+                       Object[] parameters = new Object[] { lastUsedBookmark.getName() };
+                       setText(Messages.getString(ExecuteAction.class, "text", parameters));
+                       setToolTipText(Messages.getString(ExecuteAction.class, "text", parameters));
+               }
        }
 
-       public void run(IAction action) {
-               run();
+       protected Bookmark getBookmark() {
+               Bookmark lastUsedBookmark = getLastUsedBookmark();
+               return lastUsedBookmark == null ? super.getBookmark() : lastUsedBookmark;
        }
-    
-       public void run() {
-               BookmarkNode current = BookmarkView.getInstance().getCurrentBookmark();
-               if (current == null)
-               {
-                        MessageDialog.openInformation(
-                          view.getSite().getShell(),"Sorry","Please select a bookmark to use as connection.");
-                        return;
-               }                  
-               Connection con = getConnection();
-               view.setStatus(execute1);
-               MultiSQLServer server = MultiSQLServer.getInstance();
-               view.setStatus(Messages.getString("ExecuteAction.Parsing_sql_script3")); //$NON-NLS-1$
-               Vector queries = new Vector();
-               String viewQuery = view.getQuery();
-               // We parse the executable units to send to the JDBC driver
-               queries = SQLParser.parse(viewQuery);
-               for (int i = 0; i < queries.size(); i++) {
-                       String query = (String) queries.elementAt(i);
-                       System.out.println(query);
-               }
-               int resultCount = 0;
-               int resultUpdateCount = 0;
-               int errorCount = 0;
-               int resultsDisplayed = 0;
-               double startTime = 0.0; // stores the time when query is started
-               double queryDuration= 0.0; // stores query's execution time
+       protected void execute(Bookmark bookmark, Connection connection) 
+                       throws IOException, CoreException, SQLException {
                
-               for (int i = 0; i < queries.size(); i++) {
-                       if (flag) {
-                               view.setStatus(execute1);
-                       } else {
-                               view.setStatus(execute2);
+               try {
+                       boolean autoCommitPreference = this.view.isAutoCommitPreference();
+                       boolean changed = false;
+                       if (connection.getAutoCommit() != autoCommitPreference) {
+                               connection.setAutoCommit(autoCommitPreference);
+                               changed = true;
                        }
-                  
-                  String query = (String) queries.elementAt(i);
-                  System.out.println(">" + query + "<"); //$NON-NLS-1$ //$NON-NLS-2$
-                  if (con != null && !query.equals("")) { //$NON-NLS-1$
-       
-                       SQLResults results;
-                       try {
-                               startTime = System.currentTimeMillis(); // Start the measure of execution time
-                               results = server.execute(con, query, 1, DefaultSizes.PAGE_SIZE, DefaultSizes.MAX_COLUMN_SIZE);
-                               queryDuration = (System.currentTimeMillis() - startTime)/1000; // calculate the execution time (in seconds)                              
-                               current.getBookmark().addQuery(query);
-                       } catch (SQLException e) {
-                                errorCount++;
-                               LogProxy log = LogProxy.getInstance();
-                               log.addText(
-                                       LogProxy.ERROR,
-                                       "Error Executing: " + query + ":" + e.toString(), e); //$NON-NLS-1$ //$NON-NLS-2$
-                               MessageDialog.openConfirm(view.getSite().getShell(), "Database returned error", e.getLocalizedMessage());  //$NON-NLS-1$ 
-                               continue;
+                       
+                       super.execute(bookmark, connection);
+                       
+                       if (changed) {
+                               MessageDialog.openInformation(getShell(), 
+                                               Messages.getString(ExecuteAction.class, "autocommitTitle"), 
+                                               Messages.getString(ExecuteAction.class, "autocommitMessage", 
+                                                               new Object[] { bookmark.getName() }));
                        }
-                          resultCount++;
-                          if (results.isResultSet()) {
-                                TableView.getInstance().loadQuery(current.getBookmark(), results);
-                                resultsDisplayed++;
-                          } else {
-                                int count = results.getUpdateCount();
-                                if (count > 0) {
-                                       resultUpdateCount += results.getUpdateCount();
-                                }
-                          }
-                  }
-                  flag = !flag;
-                  view.setProgress(i + 1, queries.size());
+               } finally {
+                       QuantumPlugin.getDefault().getPreferenceStore().setValue(
+                                       LAST_USED_BOOKMARK_PREFERENCE, bookmark.getName());
+                       initTextAndToolTip();
                }
-               Image statImage = QuantumPlugin.getImage((errorCount > 0) ? "stop.gif" : "success.gif"); //$NON-NLS-1$ //$NON-NLS-2$
-               view.setStatus(statImage, Messages.getString("ExecuteAction.Done") + "(" + //$NON-NLS-1$ //$NON-NLS-2$
-                                               resultCount + Messages.getString("ExecuteAction.QueriesExecuted") +  //$NON-NLS-1$
-                                               resultUpdateCount + Messages.getString("ExecuteAction.RowsUpdated") +  //$NON-NLS-1$
-                                               resultsDisplayed + Messages.getString("ExecuteAction.ResultsDisplayed") +  //$NON-NLS-1$
-                                               errorCount + Messages.getString("ExecuteAction.Errors") +  //$NON-NLS-1$
-                                               queryDuration  + Messages.getString("ExecutAction.TimeExec") + ")"); //$NON-NLS-1$ //$NON-NLS-2$
-
-               view.setProgress(0, 1);
        }
-
-       public void selectionChanged(IAction action, ISelection selection) {
-       }
-       protected Bookmark getBookmark() {
-               BookmarkNode current = BookmarkView.getInstance().getCurrentBookmark();
-               return current.getBookmark();
+       /**
+        * @return
+        */
+       protected List getQueries() {
+               getStatusLineManager().setMessage(
+                               Messages.getString(ExecuteAction.class, "parsing")); //$NON-NLS-1$
+               Vector queries = SQLParser.parse(view.getQuery());
+               return queries;
        }
 
-       /* (non-Javadoc)
-        * @see com.quantum.actions.BaseSQLAction#getShell()
+       /**
+        * @return
         */
+       protected IStatusLineManager getStatusLineManager() {
+               return this.view.getViewSite().getActionBars().getStatusLineManager();
+       }
+
        protected Shell getShell() {
                return this.view.getViewSite().getShell();
        }
+
+       public void dispose() {
+       }
+
+       public Menu getMenu(Control parent) {
+               Menu menu = new Menu(parent);
+               /**
+                * Add listener to repopulate the menu each time
+                * it is shown because the list of bookmarks may have changed.
+                */
+               menu.addMenuListener(new MenuAdapter() {
+                       public void menuShown(MenuEvent e) {
+                               Menu menu = (Menu)e.widget;
+                               MenuItem[] items = menu.getItems();
+                               for (int i=0; i < items.length; i++) {
+                                       items[i].dispose();
+                               }
+                               fillMenu(menu);
+                       }
+               });
+               return menu;
+       }
+
+       public Menu getMenu(Menu parent) {
+               // never called...
+               return null;
+       }
+
+       protected void fillMenu(Menu menu) {
+               Bookmark lastUsedBookmark = getLastUsedBookmark();
+               
+               if (lastUsedBookmark != null) {
+                       createSubAction(menu, lastUsedBookmark);
+                       Separator separator = new Separator();
+                       separator.fill(menu, -1);
+               }
+               
+               Bookmark[] bookmarks = BookmarkCollection.getInstance().getBookmarks();
+               Arrays.sort(bookmarks, new DisplayableComparator());
+               for (int i = 0, length = bookmarks == null ? 0 : bookmarks.length; i < length; i++) {
+                       final Bookmark bookmark = bookmarks[i];
+                       createSubAction(menu, bookmark);
+               }
+       }
+
+
+
+       /**
+        * @return
+        */
+       private Bookmark getLastUsedBookmark() {
+               String lastUsedName = QuantumPlugin.getDefault().getPreferenceStore().getString(
+                               LAST_USED_BOOKMARK_PREFERENCE);
+               Bookmark lastUsedBookmark = lastUsedName == null 
+                               ? null 
+                               : BookmarkCollection.getInstance().find(lastUsedName);
+               return lastUsedBookmark;
+       }
+
+
+
+       /**
+        * @param menu
+        * @param bookmark
+        */
+       private void createSubAction(Menu menu, final Bookmark bookmark) {
+               Action action = new Action() {
+                       public void run() {
+                               ExecuteAction.this.execute(bookmark);
+                       }
+               };
+               action.setImageDescriptor(ImageStore.getImageDescriptor(ImageStore.BOOKMARK));
+               
+               // The last '@' sign is treated specially, so if the 
+               // bookmark name contains an '@', then add an extra one to the end
+               if (bookmark.getName().indexOf('@') >= 0) {
+                       action.setText(bookmark.getName() + '@');
+               } else {
+                       action.setText(bookmark.getName());
+               }
+               ActionContributionItem item = new ActionContributionItem(action);
+               item.fill(menu, -1);
+       }
 }