/*
* Copyright 2010-2012 Amazon Technologies, Inc.
*
* Licensed 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://aws.amazon.com/apache2.0
*
* This file 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 com.amazonaws.eclipse.elasticbeanstalk.server.ui.configEditor.basic;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.forms.widgets.Section;
import com.amazonaws.eclipse.ec2.ui.keypair.KeyPairComposite;
import com.amazonaws.eclipse.ec2.ui.keypair.KeyPairRefreshListener;
import com.amazonaws.eclipse.elasticbeanstalk.Environment;
import com.amazonaws.eclipse.elasticbeanstalk.server.ui.configEditor.EnvironmentConfigDataModel;
import com.amazonaws.services.ec2.model.KeyPairInfo;
import com.amazonaws.services.elasticbeanstalk.model.ConfigurationOptionDescription;
/**
* Environment config editor section for setting "Server" properties, roughly
* corresponding to the aws:autoscaling:launchconfiguration namespace.
*/
public class ServerConfigEditorSection extends HumanReadableConfigEditorSection {
private static final Map<String, String> humanReadableNames = new HashMap<String, String>();
static {
humanReadableNames.put("EC2KeyName", "Existing Key Pair");
humanReadableNames.put("SecurityGroups", "EC2 Security Groups");
humanReadableNames.put("InstanceType", "EC2 Instance Type");
humanReadableNames.put("MonitoringInterval", "Monitoring Interval");
humanReadableNames.put("ImageId", "Custom AMI ID");
}
private static final String[] fieldOrder = new String[] { "InstanceType", "SecurityGroups", "EC2KeyName",
"MonitoringInterval", "ImageId" };
public ServerConfigEditorSection(BasicEnvironmentConfigEditorPart basicEnvironmentConfigurationEditorPart,
EnvironmentConfigDataModel model, Environment environment, DataBindingContext bindingContext) {
super(basicEnvironmentConfigurationEditorPart, model, environment, bindingContext);
}
@Override
protected Map<String, String> getHumanReadableNames() {
return humanReadableNames;
}
@Override
protected String[] getFieldOrder() {
return fieldOrder;
}
@Override
protected String getSectionName() {
return "Server";
}
@Override
protected String getSectionDescription() {
return "These settings allow you to control your environment's servers and enable login.";
}
@Override
protected Section getSection(Composite parent) {
return toolkit.createSection(parent, Section.EXPANDED | Section.DESCRIPTION | Section.NO_TITLE);
}
@Override
protected void createSectionControls(Composite composite) {
for ( String field : getFieldOrder() ) {
for ( ConfigurationOptionDescription o : options ) {
if ( field.equals(o.getName()) ) {
if ( field.equals("EC2KeyName") ) {
createKeyPairControl(composite, o);
} else {
createOptionControl(composite, o);
}
}
}
}
}
/**
* Creates the controls to allow the user to select a key pair with a gui.
*/
private void createKeyPairControl(Composite parent, ConfigurationOptionDescription option) {
Label label = createLabel(toolkit, parent, option);
label.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
final KeyPairComposite keyPairWidget = new KeyPairComposite(parent, this.environment.getAccountId());
GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, false);
layoutData.widthHint = 200;
layoutData.heightHint = 200;
keyPairWidget.setLayoutData(layoutData);
final IObservableValue modelv = model.observeEntry(option);
final IChangeListener listener = new IChangeListener() {
public void handleChange(ChangeEvent event) {
for ( int i = 0; i < keyPairWidget.getViewer().getTree().getItemCount(); i++ ) {
KeyPairInfo keyPair = (KeyPairInfo) keyPairWidget.getViewer().getTree().getItem(i).getData();
if ( keyPair.getKeyName().equals(modelv.getValue()) ) {
keyPairWidget.getViewer().getTree().select(keyPairWidget.getViewer().getTree().getItem(i));
// Selection listeners aren't notified when we
// select like this, so fire an event.
keyPairWidget.getViewer().getTree().notifyListeners(SWT.Selection, null);
return;
}
}
keyPairWidget.getViewer().getTree().deselectAll();
}
};
modelv.addChangeListener(listener);
/*
* The table is initially empty, so we need to add a hook to fire our
* change listener when it gets refreshed in order to correctly select
* the current key pair.
*/
keyPairWidget.getKeyPairSelectionTable().addRefreshListener(new KeyPairRefreshListener() {
public void keyPairsRefreshed() {
listener.handleChange(null);
}
});
final IObservableValue keyPairSelection = new WritableValue();
keyPairWidget.getKeyPairSelectionTable().addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (keyPairWidget.getKeyPairSelectionTable().getSelectedKeyPair() == null)
keyPairSelection.setValue("");
else
keyPairSelection.setValue(keyPairWidget.getKeyPairSelectionTable().getSelectedKeyPair().getKeyName());
}
});
bindingContext.bindValue(keyPairSelection, modelv,
new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE),
new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE));
}
}