/*******************************************************************************
* Copyright (c) 2012 Pivotal Software, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pivotal Software, Inc. - initial API and implementation
*******************************************************************************/
package com.vmware.vfabric.ide.eclipse.tcserver.internal.ui;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.forms.IFormColors;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.wst.server.ui.editor.ServerEditorSection;
import com.vmware.vfabric.ide.eclipse.tcserver.internal.core.TcServer;
/**
* Server configuration editor section for configuring tc Server Deployer MBean
* properties.
* @author Steffen Pingel
*/
public class DeployerEditorSection extends ServerEditorSection {
private class PropertyModifyListener implements ModifyListener {
private final String property;
public PropertyModifyListener(String property) {
this.property = property;
}
public void modifyText(ModifyEvent e) {
if (updating) {
return;
}
try {
updating = true;
execute(new ModifyDeployerPropertyCommand(serverInstance, property, ((Text) e.widget).getText()));
}
finally {
updating = false;
}
}
}
private TcServer serverInstance;
private PropertyChangeListener listener;
private Text userText;
protected boolean updating;
private Text passwordText;
private Text portText;
private Text serviceText;
private Text hostText;
public DeployerEditorSection() {
}
protected void addChangeListener() {
listener = new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
update(event.getPropertyName());
}
};
serverInstance.getServerWorkingCopy().addPropertyChangeListener(listener);
}
protected Label createLabel(FormToolkit toolkit, Composite parent, String text) {
Label label = toolkit.createLabel(parent, text);
label.setForeground(toolkit.getColors().getColor(IFormColors.TITLE));
return label;
}
@Override
public void createSection(Composite parent) {
super.createSection(parent);
FormToolkit toolkit = getFormToolkit(parent.getDisplay());
Section section = toolkit.createSection(parent, ExpandableComposite.TWISTIE | ExpandableComposite.TITLE_BAR
| Section.DESCRIPTION | ExpandableComposite.FOCUS_TITLE | ExpandableComposite.EXPANDED);
section.setText("Deployment");
section.setDescription("Specify settings for deployment.");
section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL));
Composite composite = toolkit.createComposite(section);
GridLayout layout = new GridLayout(2, false);
layout.marginHeight = 8;
layout.marginWidth = 8;
composite.setLayout(layout);
toolkit.paintBordersFor(composite);
section.setClient(composite);
createLabel(toolkit, composite, "Port:");
portText = toolkit.createText(composite, "");
portText.addModifyListener(new PropertyModifyListener(TcServer.PROPERTY_JMX_PORT));
portText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
createLabel(toolkit, composite, "Username:");
userText = toolkit.createText(composite, "");
userText.addModifyListener(new PropertyModifyListener(TcServer.PROPERTY_JMX_USER));
userText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
createLabel(toolkit, composite, "Password:");
passwordText = toolkit.createText(composite, "", SWT.PASSWORD);
passwordText.addModifyListener(new PropertyModifyListener(TcServer.PROPERTY_JMX_PASSWORD));
passwordText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// spacer
GridDataFactory.fillDefaults().span(2, 1).applyTo(createLabel(toolkit, composite, ""));
createLabel(toolkit, composite, "Service:");
serviceText = toolkit.createText(composite, "");
serviceText.addModifyListener(new PropertyModifyListener(TcServer.PROPERTY_DEPLOYER_SERVICE));
serviceText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
createLabel(toolkit, composite, "Host:");
hostText = toolkit.createText(composite, "");
hostText.addModifyListener(new PropertyModifyListener(TcServer.PROPERTY_DEPLOYER_HOST));
hostText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
initialize();
}
@Override
public void dispose() {
if (serverInstance != null) {
serverInstance.getServerWorkingCopy().removePropertyChangeListener(listener);
}
}
@Override
public void init(IEditorSite site, IEditorInput input) {
super.init(site, input);
serverInstance = (TcServer) server.loadAdapter(TcServer.class, null);
addChangeListener();
initialize();
}
/**
* Initialize the fields in this editor.
*/
protected void initialize() {
update(null);
}
private void update(String property) {
if (updating || userText == null || userText.isDisposed()) {
return;
}
try {
updating = true;
updateText(TcServer.PROPERTY_JMX_USER, userText, property);
updateText(TcServer.PROPERTY_JMX_PASSWORD, passwordText, property);
updateText(TcServer.PROPERTY_JMX_PORT, portText, property);
updateText(TcServer.PROPERTY_DEPLOYER_SERVICE, serviceText, property);
updateText(TcServer.PROPERTY_DEPLOYER_HOST, hostText, property);
}
finally {
updating = false;
}
}
private void updateText(String property, Text text, String changedProperty) {
if (property.equals(changedProperty) || changedProperty == null) {
String value = serverInstance.getDeployerProperty(property);
text.setText((value != null) ? value : "");
}
}
}