/*******************************************************************************
* Copyright (c) 2009, 2010 Progress Software Corporation.
* 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
******************************************************************************/
// Copyright (c) 2009 Progress Software Corporation.
package org.fusesource.tools.messaging.ui.dialogs;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.Text;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.ui.ServerUIUtil;
import org.fusesource.tools.messaging.IConstants;
import org.fusesource.tools.messaging.core.IDestination;
import org.fusesource.tools.messaging.core.IDestinationType;
import org.fusesource.tools.messaging.core.IProvider;
import org.fusesource.tools.messaging.server.MessagingServersUtil;
import org.fusesource.tools.messaging.ui.DefaultMessageTableViewer;
import org.fusesource.tools.messaging.ui.DestinationCellModifier;
import org.fusesource.tools.messaging.ui.DestinationTableContentProvider;
import org.fusesource.tools.messaging.ui.DestinationTableLabelProvider;
import org.fusesource.tools.messaging.ui.DestinationUtil;
public abstract class DestinationDialog extends TitleAreaDialog {
private TableViewer tableViewer = null;
private static String NAME_PROPERTY = "name";
private static String VALUE_PROPERTY = "value";
private static String COLUMN_HEADERS_STRING = "Name;Value";
public static String DESTINATION_UI_EXT_PT = "org.fusesource.tools.messaging.DestinationUI";
public static String ISENDER_ATTRIBUTE = "Sender";
public static String ILISTENER_ATTRIBUTE = "Listener";
protected Map<String, Object> senderProperties = new HashMap<String, Object>();
protected Map<String, Object> listenerProperties = new HashMap<String, Object>();
private Map<String, String> msgServersNameIdMap = Collections.emptyMap();
private Map<String, IDestinationType> destTypeMap = new HashMap<String, IDestinationType>();
private Object source;// TODO source is an IFile for now...
private String destType;
private String destName;
protected Combo serversCombo;
protected Combo destTypesCombo;
private Text destNameText;
private String selectedServerName;
private static final String CLOSED_ADVANCED = "Advanced >>";
private static final String OPENED_ADVANCED = "<< Advanced";
private Button advancedButton;
private Composite advancedComposite;
protected Composite panel = null;
protected Button newServerButton = null;
private boolean deployed = false;
protected IDestination createdDestination;
protected IProvider provider = null;
public DestinationDialog() {
super(Display.getCurrent().getActiveShell());
}
@Override
public void create() {
super.create();
Shell shell = getShell();
shell.setText(getDialogTitle());
setTitle(getTitle());
setMessage(getMessage());
validate();
}
protected abstract String getMessage();
protected abstract String getTitle();
protected abstract boolean hasAdvanceSection();
protected String getDialogTitle() {
return "Add Destination";
}
@Override
protected Control createDialogArea(Composite parent) {
Control control = super.createDialogArea(parent);
panel = new Composite((Composite) control, SWT.NONE);
GridData data = new GridData();
data.horizontalAlignment = SWT.FILL;
data.grabExcessHorizontalSpace = true;
panel.setLayout(new GridLayout());
panel.setLayoutData(data);
createUI();
return panel;
}
protected void createUI() {
Group destGroup = new Group(panel, SWT.NONE);
destGroup.setText("Destination Details");
GridLayout layout = new GridLayout();
layout.numColumns = 3;
destGroup.setLayout(layout);
GridData gridData = new GridData();
gridData.horizontalAlignment = SWT.FILL;
gridData.grabExcessHorizontalSpace = true;
destGroup.setLayoutData(gridData);
gridData = new GridData();
Label name = new Label(destGroup, SWT.NONE);
name.setText("Server:");
name.setLayoutData(gridData);
gridData = new GridData();
gridData.horizontalAlignment = SWT.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalSpan = 1;
serversCombo = new Combo(destGroup, SWT.READ_ONLY);
serversCombo.setLayoutData(gridData);
gridData = new GridData();
gridData.horizontalSpan = 1;
newServerButton = new Button(destGroup, SWT.PUSH);
newServerButton.setText("New Server...");
newServerButton.setLayoutData(gridData);
newServerButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent arg0) {
}
public void widgetSelected(SelectionEvent arg0) {
boolean isServerCreated = ServerUIUtil.showNewServerWizard(Display.getDefault().getActiveShell(),
IConstants.MSG_PRJ_MODULE_ID, null, null);
if (isServerCreated) {
populateServerNames(true, false);
// TODO optimize here, to get the newly added server only...
if (serversCombo.getItemCount() > 0) {
serversCombo.select(0);// Default selection
}
}
}
});
gridData = new GridData();
Label destTypeLabel = new Label(destGroup, SWT.NONE);
destTypeLabel.setText("Destination Type:");
destTypeLabel.setLayoutData(gridData);
gridData = new GridData();
gridData.horizontalAlignment = SWT.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalSpan = 2;
destTypesCombo = new Combo(destGroup, SWT.READ_ONLY);
destTypesCombo.setLayoutData(gridData);
gridData = new GridData();
Label destNameLabel = new Label(destGroup, SWT.NONE);
destNameLabel.setText("Destination Name:");
destNameLabel.setLayoutData(gridData);
gridData = new GridData();
gridData.horizontalAlignment = SWT.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.horizontalSpan = 2;
destNameText = new Text(destGroup, SWT.BORDER);
destNameText.setLayoutData(gridData);
if (hasAdvanceSection()) {
showAdvanceSection(destGroup);
}
addListeners();
populateServerNames(false, false);
populateDestinationTypes();
destNameText.setFocus();
validate();
}
private void addListeners() {
serversCombo.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent arg0) {
}
public void widgetSelected(SelectionEvent arg0) {
initServersComboData();
}
});
serversCombo.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
initServersComboData();
}
});
destNameText.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validate();
}
});
destTypesCombo.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent arg0) {
}
public void widgetSelected(SelectionEvent arg0) {
validate();
}
});
}
protected void createAdvancedUI(Composite composite) {
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 1;
composite.setLayout(gridLayout);
GridData data = new GridData();
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = SWT.FILL;
Group messageDeliveryOption = new Group(composite, SWT.NONE);
messageDeliveryOption.setText(getAdvTitle());
messageDeliveryOption.setLayout(new FillLayout());
messageDeliveryOption.setLayoutData(data);
tableViewer = new DefaultMessageTableViewer(messageDeliveryOption, SWT.FULL_SELECTION, "");
((DefaultMessageTableViewer) tableViewer).refreshTable(COLUMN_HEADERS_STRING);
Table table = tableViewer.getTable();
table.setLinesVisible(true);
CellEditor[] editors = new CellEditor[2];
editors[0] = new TextCellEditor(table);
editors[1] = new TextCellEditor(table);
tableViewer.setCellEditors(editors);
tableViewer.setCellModifier(new DestinationCellModifier(tableViewer, senderProperties));// sender
// props??
tableViewer.setColumnProperties(new String[] { NAME_PROPERTY, VALUE_PROPERTY });
tableViewer.setContentProvider(new DestinationTableContentProvider());
tableViewer.setLabelProvider(new DestinationTableLabelProvider());
tableViewer.setInput(senderProperties);// sender props??
tableViewer.refresh();
}
protected String getAdvTitle() {
return "Destination Properties";
}
private void initServersComboData() {
int selectionIndex = serversCombo.getSelectionIndex();
if (selectionIndex != -1) {
setSelectedServerName(serversCombo.getItem(selectionIndex));
populateDestinationTypes();
validate();
}
}
private void showAdvanceSection(Composite destGroup) {
if (hasAdvanceSection()) {
GridData data = new GridData();
data.horizontalSpan = 3;
data.horizontalAlignment = SWT.END;
data.grabExcessHorizontalSpace = true;
advancedButton = new Button(destGroup, SWT.PUSH);
advancedButton.setText(CLOSED_ADVANCED);
advancedButton.setLayoutData(data);
advancedButton.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
handleAdvancedButtonSelect();
}
public void widgetDefaultSelected(SelectionEvent e) {
handleAdvancedButtonSelect();
}
});
}
}
protected void handleAdvancedButtonSelect() {
Shell shell = getShell();
Point shellSize = shell.getSize();
Composite composite = (Composite) getContents();
if (advancedButton.getText().equalsIgnoreCase(CLOSED_ADVANCED)) {
advancedComposite = new Composite(panel, SWT.NONE);
GridData data = new GridData();
data.horizontalAlignment = SWT.FILL;
data.grabExcessHorizontalSpace = true;
advancedComposite.setLayoutData(data);
createAdvancedUI(advancedComposite);
panel.layout();
composite.layout();
Point advComSize = advancedComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
shell.setSize(shellSize.x, shellSize.y += advComSize.y);
advancedButton.setText(OPENED_ADVANCED);
} else if (advancedButton.getText().equalsIgnoreCase(OPENED_ADVANCED)) {
Point advComSize = advancedComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
shell.setSize(shellSize.x, shellSize.y -= advComSize.y);
composite.layout();
advancedButton.setText(CLOSED_ADVANCED);
}
}
protected void populateServerNames(boolean updateMap, boolean deployed) {
if (msgServersNameIdMap.isEmpty() || updateMap) {
msgServersNameIdMap = getServersMap();
}
// populateDestinationTypes();
serversCombo.setItems(msgServersNameIdMap.keySet().toArray(new String[] {}));
if (deployed) {
newServerButton.setEnabled(false);
serversCombo.select(0);
serversCombo.setEnabled(false);
populateDestinationTypes();
setSelectedServerName(serversCombo.getItem(serversCombo.getSelectionIndex()));
}
// Expecting only one or none.
IServer deployedServer = MessagingServersUtil.getDeployedServer(((IFile) getSource()).getProject());
if (deployedServer == null) {
this.deployed = false;
return;
}
String serverToSelect = deployedServer.getName();
int indexOf = serversCombo.indexOf(serverToSelect);
serversCombo.select(indexOf);
this.deployed = true;
}
private Map<String, String> getServersMap() {
return MessagingServersUtil.getMsgServersNameIdMap();
}
protected void populateDestinationTypes() {
if (getSelectedServerName() == null) {
return;
}
try {
if (getProvider() == null || getProvider().getDestinationTypes() == null) {
destTypeMap.clear();
return;
}
} catch (Exception e) {
// ignore...
destTypeMap.clear();
return;
}
List<IDestinationType> destinationTypes = getProvider().getDestinationTypes();
List<String> typesList = new ArrayList<String>();
destTypeMap.clear();
for (IDestinationType destinationType : destinationTypes) {
destTypeMap.put(destinationType.getType(), destinationType);
typesList.add(destinationType.getType());
}
destTypesCombo.setItems(typesList.toArray(new String[] {}));
if (destTypesCombo.getItemCount() > 0) {
destTypesCombo.select(0);
}
}
protected void updateData() {
setDestType(destTypesCombo.getItem(destTypesCombo.getSelectionIndex()));
setDestName(destNameText.getText());
setSelectedServerName(serversCombo.getItem(serversCombo.getSelectionIndex()));
}
@Override
protected void okPressed() {
updateData();
super.okPressed();
try {
if (!deployed) {
MessagingServersUtil.deployModule(((IFile) getSource()).getProject(), selectedServerName);
}
createdDestination = DestinationUtil.createDestination(getDestinationType(), getDestName(), getProvider());
} catch (Exception e) {
e.printStackTrace();
}
}
private void updateServerControls() {
serversCombo.setEnabled(!deployed);
newServerButton.setEnabled(!deployed);
}
protected void validate() {
String errorMessage = null;
if (serversCombo.getSelectionIndex() == -1) {
errorMessage = "Please choose a server";
} else if (destTypesCombo.getSelectionIndex() == -1) {
errorMessage = "Please choose a destination type";
} else if (destNameText.getText().trim().length() == 0) {
errorMessage = "Please enter a destination name";
}
if (errorMessage != null) {
setErrorMessage(errorMessage);
} else {
setErrorMessage(null);
setMessage(getMessage());
}
updateServerControls();
updateUIControls(errorMessage != null ? false : true);
}
protected void updateUIControls(boolean canEnable) {
if (hasAdvanceSection()) {
advancedButton.setEnabled(canEnable);
}
}
@Override
public void setErrorMessage(String newErrorMessage) {
super.setErrorMessage(newErrorMessage);
Button button = getButton(IDialogConstants.OK_ID);
if (button != null) {
if (newErrorMessage != null) {
button.setEnabled(false);
} else {
button.setEnabled(true);
}
}
}
public String getSelectedServerName() {
return selectedServerName;
}
public void setSelectedServerName(String serverName) {
this.selectedServerName = serverName;
}
public String getDestName() {
return destName;
}
public void setDestName(String destName) {
this.destName = destName;
}
public IDestinationType getDestinationType() {
return destTypeMap.get(getDestType());
}
public IDestination getCreatedDestination() {
return createdDestination;
}
public String getDestType() {
return destType;
}
public void setDestType(String destType) {
this.destType = destType;
}
public Object getSource() {
return source;
}
public void setSource(Object source) {
this.source = source;
}
public IProvider getProvider() {
if (provider == null) {
try {
provider = DestinationUtil.getProvider(getSelectedServerName());
} catch (Exception e) {
e.printStackTrace();
}
}
return provider;
}
}