/*
* Copyright (C) 2007 SQL Explorer Development Team http://sourceforge.net/projects/eclipsesql
*
* This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
* Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package net.sourceforge.sqlexplorer.sqleditor.actions;
import java.util.HashMap;
import net.sourceforge.sqlexplorer.Messages;
import net.sourceforge.sqlexplorer.connections.ConnectionsView;
import net.sourceforge.sqlexplorer.connections.SessionEstablishedListener;
import net.sourceforge.sqlexplorer.dbproduct.Alias;
import net.sourceforge.sqlexplorer.dbproduct.ConnectionJob;
import net.sourceforge.sqlexplorer.dbproduct.ConnectionListener;
import net.sourceforge.sqlexplorer.dbproduct.Session;
import net.sourceforge.sqlexplorer.dbproduct.User;
import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin;
import net.sourceforge.sqlexplorer.plugin.editors.SwitchableSessionEditor;
import org.eclipse.jface.action.ControlContribution;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
public class SQLEditorSessionSwitcher extends ControlContribution implements ConnectionListener, SessionEstablishedListener {
private SwitchableSessionEditor _editor;
private Combo _sessionCombo;
private HashMap<Integer, User> sessionIndexes = new HashMap<Integer, User>();
/**
* @param editor SQLEditor to which this session switcher belongs
*/
public SQLEditorSessionSwitcher(SwitchableSessionEditor editor) {
super("net.sourceforge.sqlexplorer.sessionswitcher");
_editor = editor;
}
@Override
protected Control createControl(Composite parent) {
SQLExplorerPlugin.getDefault().getAliasManager().addListener(this);
_sessionCombo = new Combo(parent, SWT.READ_ONLY);
_sessionCombo.setToolTipText(Messages.getString("SQLEditor.Actions.ChooseSession.ToolTip"));
_sessionCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent event) {
// change session for this editor
User user = null;
int selIndex = _sessionCombo.getSelectionIndex();
if (selIndex != 0) {
user = sessionIndexes.get(selIndex - 1);
}
// Nothing to do?
if (user != null && _editor.getSession() != null && _editor.getSession().getUser() == user) {
return;
}
// Disconnect from the current session while we try to connect
_editor.setSession(null);
_sessionCombo.deselectAll();
_editor.refreshToolbars();
if (user == null) {
return;
}
// Start the connection job
ConnectionJob.createSession(user.getAlias(), user, SQLEditorSessionSwitcher.this, false);
}
});
setSessionOptions();
if (_sessionCombo.getItemCount() == 1) {
MessageDialog.openInformation(parent.getShell(),
Messages.getString("SQLEditor.Actions.ChooseSession.NoConnections.Title"),
Messages.getString("SQLEditor.Actions.ChooseSession.NoConnections.Message"));
}
return _sessionCombo;
}
@Override
public void dispose() {
SQLExplorerPlugin.getDefault().getAliasManager().removeListener(this);
super.dispose();
}
private void setSessionOptions() {
if (_sessionCombo.isDisposed()) {
return;
}
_sessionCombo.removeAll();
_sessionCombo.add("");
int index = 0;
User currentUser = null;
if (_editor.getSession() != null) {
currentUser = _editor.getSession().getUser();
}
for (Alias alias : SQLExplorerPlugin.getDefault().getAliasManager().getAliases()) {
for (User user : alias.getUsers()) {
_sessionCombo.add(user.getDescription());
sessionIndexes.put(new Integer(index++), user);
// MOD msjian TDQ-5927 2013-5-24: set the item identify by the username, url and connection name
if (currentUser != null) {
boolean isMatched = currentUser.getUserName().equals(user.getUserName())
&& currentUser.getAlias().getUrl().equals(alias.getUrl());
if (currentUser.getDatabaseConnection() != null) {
isMatched = isMatched && currentUser.getDatabaseConnection().getName().equals(alias.getName());
}
if (isMatched) {
_sessionCombo.select(_sessionCombo.getItemCount() - 1);
}
}
}
}
}
@Override
public void modelChanged() {
if (_sessionCombo != null && !_sessionCombo.isDisposed()) {
_editor.getSite().getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
setSessionOptions();
}
});
}
}
@Override
public void cannotEstablishSession(User user) {
if (_sessionCombo.isDisposed()) {
return;
}
_editor.getSite().getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
_sessionCombo.deselectAll();
_editor.refreshToolbars();
}
});
}
@Override
public void sessionEstablished(final Session session) {
if (_sessionCombo.isDisposed()) {
return;
}
_editor.getSite().getShell().getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
_editor.setSession(session);
setSessionOptions();
ConnectionsView connectionsView = SQLExplorerPlugin.getDefault().getConnectionsView();
if (connectionsView != null) {
connectionsView.setDefaultUser(session.getUser());
}
_editor.refreshToolbars();
}
});
}
}