blob: ce9d80d49b9a8b3bb09067378fc9ec811ea0755c [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.qpid.management.ui.actions;
import static org.apache.qpid.management.ui.Constants.ACTION_LOGIN;
import static org.apache.qpid.management.ui.Constants.CONSOLE_IMAGE;
import static org.apache.qpid.management.ui.Constants.INFO_PASSWORD;
import static org.apache.qpid.management.ui.Constants.INFO_USERNAME;
import static org.apache.qpid.management.ui.Constants.PASSWORD;
import static org.apache.qpid.management.ui.Constants.USERNAME;
import org.apache.qpid.management.ui.ApplicationRegistry;
import org.apache.qpid.management.ui.Constants;
import org.apache.qpid.management.ui.exceptions.InfoRequiredException;
import org.apache.qpid.management.ui.views.TreeObject;
import org.apache.qpid.management.ui.views.ViewUtility;
import org.eclipse.jface.action.IAction;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
public class ReconnectServer extends AbstractAction implements IWorkbenchWindowActionDelegate
{
private String _title;
private String _serverName;
private String _user;
private String _password;
private boolean _connect;
public void run(IAction action)
{
if(_window == null)
return;
try
{
reset();
// Check if a server node is selected to be reconnected.
TreeObject serverNode = getNavigationView().getSelectedServerNode();
_serverName = serverNode.getName();
_title = ACTION_LOGIN + " (" + _serverName + ")";
// Get the login details(username/password)
createLoginPopup();
if (_connect)
{
// Connect the server
getNavigationView().reconnect(_user, _password);
}
}
catch(InfoRequiredException ex)
{
ViewUtility.popupInfoMessage("Reconnect Qpid server", ex.getMessage());
}
catch (Exception ex)
{
handleException(ex, null, null);
}
}
private void reset()
{
_connect = false;
_user = null;
_password = null;
}
// Create the login popup fot th user to enter usernaem and password
private void createLoginPopup()
{
Display display = Display.getCurrent();
final Shell shell = new Shell(display, SWT.BORDER | SWT.CLOSE);
shell.setText(_title);
shell.setImage(ApplicationRegistry.getImage(CONSOLE_IMAGE));
shell.setLayout(new GridLayout());
createWidgets(shell);
shell.pack();
//get current size dialog, and screen size
int displayWidth = display.getBounds().width;
int displayHeight = display.getBounds().height;
int currentShellWidth = shell.getSize().x;
int currentShellHeight = shell.getSize().y;
//default sizes for the dialog
int minShellWidth = 350;
int minShellHeight= 200;
//ensure this is large enough, increase it if its not
int newShellWidth = currentShellWidth > minShellWidth ? currentShellWidth : minShellWidth;
int newShellHeight = currentShellHeight > minShellHeight ? currentShellHeight : minShellHeight;
//set the final size and centre the dialog
shell.setBounds((displayWidth - newShellWidth)/2 , (displayHeight - newShellHeight)/2, newShellWidth, newShellHeight);
shell.open();
_window.getShell().setEnabled(false);
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
// enable the main shell
_window.getShell().setEnabled(true);
_window.getShell().open();
}
// Creates the SWT widgets in the popup shell, to enter username and password.
// Adds listeners to the widgets to take appropriate action
private void createWidgets(final Shell shell)
{
Composite composite = new Composite(shell, SWT.NONE);
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
GridLayout layout = new GridLayout(2, false);
layout.horizontalSpacing = 10;
layout.verticalSpacing = 10;
layout.marginHeight = 20;
layout.marginWidth = 20;
composite.setLayout(layout);
Label user = new Label(composite, SWT.NONE);
user.setText(USERNAME);
user.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, false, false));
final Text textUser = new Text(composite, SWT.BORDER);
textUser.setText("");
textUser.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
// Put cursor on this field
textUser.setFocus();
Label password = new Label(composite, SWT.NONE);
password.setText(PASSWORD);
password.setLayoutData(new GridData(SWT.TRAIL, SWT.TOP, false, false));
final Text textPwd = new Text(composite, SWT.BORDER | SWT.SINGLE | SWT.PASSWORD);
textPwd.setText("");
textPwd.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
//Get the text widgets
Control[] widgets = composite.getChildren();
for (int i=0; i < widgets.length; i++)
{
widgets[i].addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent event)
{
if (event.character == SWT.ESC)
{
//Escape key acts as cancel on all widgets
shell.close();
}
}
});
}
Composite buttonsComposite = new Composite(composite, SWT.NONE);
buttonsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
buttonsComposite.setLayout(new GridLayout(2, true));
final Button connectButton = new Button(buttonsComposite, SWT.PUSH | SWT.CENTER);
connectButton.setText(Constants.BUTTON_CONNECT);
GridData gridData = new GridData (SWT.TRAIL, SWT.BOTTOM, true, true);
gridData.widthHint = 100;
connectButton.setLayoutData(gridData);
connectButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON));
connectButton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent event)
{
_user = textUser.getText();
if ((_user == null) || (_user.trim().length() == 0))
{
ViewUtility.popupInfoMessage(_title, INFO_USERNAME);
textUser.setText("");
textUser.setFocus();
return;
}
_password = textPwd.getText();
if (_password == null)
{
ViewUtility.popupInfoMessage(_title, INFO_PASSWORD);
textPwd.setText("");
textPwd.setFocus();
return;
}
_connect = true;
shell.dispose();
}
});
final Button cancelButton = new Button(buttonsComposite, SWT.PUSH);
cancelButton.setText(Constants.BUTTON_CANCEL);
gridData = new GridData (SWT.LEAD, SWT.BOTTOM, true, true);
gridData.widthHint = 100;
cancelButton.setLayoutData(gridData);
cancelButton.setFont(ApplicationRegistry.getFont(Constants.FONT_BUTTON));
cancelButton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent event)
{
shell.dispose();
}
});
//Get the ok/cancel button widgets and add a new key listener
widgets = buttonsComposite.getChildren();
for (int i=0; i < widgets.length; i++)
{
widgets[i].addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent event)
{
if (event.character == SWT.ESC)
{
//Escape key acts as cancel on all widgets
shell.close();
}
}
});
}
shell.setDefaultButton(connectButton);
}
}