X-Git-Url: http://secure.phpeclipse.com

diff --git a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/actions/ExecuteAction.java b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/actions/ExecuteAction.java
index f8c4418..26f869c 100644
--- a/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/actions/ExecuteAction.java
+++ b/archive/net.sourceforge.phpeclipse.quantum.sql/src/com/quantum/actions/ExecuteAction.java
@@ -1,142 +1,198 @@
 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);
+	}
 }