/**
* Copyright 2005 Open Cloud Ltd.
*
* 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://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.mobicents.eclipslee.servicecreation.ui;
import java.util.HashMap;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TableItem;
import org.mobicents.eclipslee.servicecreation.ui.table.DataStore;
import org.mobicents.eclipslee.servicecreation.ui.table.DataStoreChangeListener;
import org.mobicents.eclipslee.servicecreation.ui.table.EditableTableViewer;
import org.mobicents.eclipslee.util.slee.xml.components.ComponentNotFoundException;
import org.mobicents.eclipslee.util.slee.xml.components.ProfileSpecXML;
import org.mobicents.eclipslee.xml.ProfileSpecJarXML;
/**
* @author cath
*/
public class SbbProfilePanel extends Composite implements SelectionListener, DataStoreChangeListener {
private static final String[] COLUMN_NAMES = { "Name", "Version", "Vendor", "Scoped Name" };
private static final int[] COLUMN_EDITORS = {
EditableTableViewer.EDITOR_NONE,
EditableTableViewer.EDITOR_NONE,
EditableTableViewer.EDITOR_NONE,
EditableTableViewer.EDITOR_TEXT
};
private Object[][] COLUMN_VALUES = {
{},
{},
{},
{}
};
public SbbProfilePanel(Composite parent, int style) {
super(parent, style);
GridLayout layout = new GridLayout();
layout.numColumns = 1;
setLayout(layout);
GridData data = new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL);
setLayoutData(data);
Label label = new Label(this, SWT.NONE);
label.setText("Available profile specifications:");
label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING ));
availableProfiles = new EditableTableViewer(this, SWT.V_SCROLL | SWT.BORDER | SWT.SINGLE,
new String[] { "Name", "Version", "Vendor" },
new int[] { EditableTableViewer.EDITOR_NONE, EditableTableViewer.EDITOR_NONE, EditableTableViewer.EDITOR_NONE },
new String[][] {{}, {}, {}});
data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.heightHint = availableProfiles.getTable().getItemHeight() * 1;
availableProfiles.getTable().setLayoutData(data);
// hbuttonbox
Composite buttonbox = new Composite(this, SWT.NONE);
buttonbox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.HORIZONTAL_ALIGN_CENTER));
RowLayout rlayout = new RowLayout();
rlayout.pack = false;
rlayout.spacing = 6;
rlayout.wrap = false;
buttonbox.setLayout(rlayout);
selectButton = new Button(buttonbox, SWT.NONE);
selectButton.setText("Select Profile");
selectButton.addSelectionListener(this);
deselectButton = new Button(buttonbox, SWT.NONE);
deselectButton.setText("Deselect Profile");
deselectButton.addSelectionListener(this);
label = new Label(this, SWT.NONE);
label.setText("Selected profile specifications:");
label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_BEGINNING ));
selectedProfiles = new EditableTableViewer(this, SWT.V_SCROLL | SWT.BORDER | SWT.SINGLE, COLUMN_NAMES, COLUMN_EDITORS, COLUMN_VALUES);
data = new GridData(SWT.FILL, SWT.FILL, true, true);
data.heightHint = selectedProfiles.getTable().getItemHeight() * 1;
selectedProfiles.getTable().setLayoutData(data);
buttonbox = new Composite(this, SWT.NONE);
buttonbox.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
rlayout = new RowLayout();
rlayout.pack = false;
rlayout.wrap = false;
rlayout.spacing = 6;
rlayout.justify = false;
buttonbox.setLayout(rlayout);
addressLabel = new Label(buttonbox, SWT.NONE);
addressLabel.setText("Address Profile Specification:");
addressLabel.setEnabled(false);
addressCombo = new Combo(buttonbox, SWT.NONE);
addressCombo.setEnabled(false);
addressCombo.setItems(new String[] { "None" });
addressCombo.select(0);
selectedProfiles.getStore().addChangeListener(this);
}
public void repack() {
availableProfiles.repack();
selectedProfiles.repack();
}
public void clearProfiles() {
availableProfiles.getStore().clear();
selectedProfiles.getStore().clear();
}
public void select(HashMap item) {
// The inputted item is not the same as the hashmap entry in available events.
// We have to find the item with a matching name, vendor and version and remove
// that from available, then add the new item to selected.
Object available[] = availableProfiles.getStore().getElements();
for (int i = 0; i < available.length; i++) {
HashMap old = (HashMap) available[i];
if (old.get("Name").equals(item.get("Name"))
&& old.get("Vendor").equals(item.get("Vendor"))
&& old.get("Version").equals(item.get("Version"))) {
availableProfiles.removeRow(old);
// Copy the XML reference from the available to the selected item.
Object xml = old.get("XML");
item.put("XML", xml);
setScopedName(item);
selectedProfiles.addRow(item);
return;
}
}
}
private void setScopedName(HashMap item) {
String scopedName = (String) item.get("Scoped Name");
// If no scoped name we generate a suggested name from the event data.
if (scopedName == null) {
try {
String name = (String) item.get("Name");
String vendor = (String) item.get("Vendor");
String version = (String) item.get("Version");
ProfileSpecJarXML xml = (ProfileSpecJarXML) item.get("XML");
ProfileSpecXML profile = xml.getProfileSpec(name, vendor, version);
String clazzName = profile.getCMPInterfaceName();
scopedName = clazzName.substring(clazzName.lastIndexOf('.') + 1);
if (scopedName.endsWith("CMP"))
scopedName = scopedName.substring(0, scopedName.lastIndexOf("CMP"));
} catch (ComponentNotFoundException e) {
scopedName = "Change Me";
}
item.put("Scoped Name", scopedName);
}
}
public void widgetDefaultSelected(SelectionEvent event) {
}
public void widgetSelected(SelectionEvent event) {
if (event.getSource().equals(selectButton)) {
int indices[] = availableProfiles.getTable().getSelectionIndices();
for (int i = 0; i < indices.length; i++) {
TableItem item = availableProfiles.getTable().getItem(indices[i]);
HashMap ev = (HashMap) item.getData();
setScopedName(ev); // Verify that this entry gets a scoped name
// Remove from the available events.
// Add to the selected events.
availableProfiles.removeRow(ev);
selectedProfiles.addRow(ev);
populateAddressCombo();
}
repack();
return;
}
if (event.getSource().equals(deselectButton)) {
int indices[] = selectedProfiles.getTable().getSelectionIndices();
for (int i = 0; i < indices.length; i++) {
TableItem item = selectedProfiles.getTable().getItem(indices[i]);
HashMap ev = (HashMap) item.getData();
// Remove from the selected events.
// Add to the available events.
selectedProfiles.removeRow(ev);
availableProfiles.addRow(ev);
populateAddressCombo();
}
repack();
return;
}
}
public void addAvailableProfile(ProfileSpecJarXML xml, ProfileSpecXML profile) {
HashMap map = new HashMap();
map.put("Name", profile.getName());
map.put("Vendor", profile.getVendor());
map.put("Version", profile.getVersion());
map.put("XML", xml);
availableProfiles.addRow(map);
}
public void selectProfile(ProfileSpecJarXML xml, ProfileSpecXML profile) {
DataStore store = availableProfiles.getStore();
Object data[] = store.getElements();
for (int i = 0; i < data.length; i++) {
HashMap map = (HashMap) data[i];
String name = (String) map.get("Name");
String vendor = (String) map.get("Vendor");
String version = (String) map.get("Version");
ProfileSpecJarXML storedXML = (ProfileSpecJarXML) map.get("XML");
if (name.equals(profile.getName())
&& vendor.equals(profile.getVendor())
&& version.equals(profile.getVersion())
&& xml.equals(storedXML)) {
store.remove(map);
setScopedName(map); // Verify that this entry gets a scoped name
selectedProfiles.getStore().add(map);
}
}
}
public HashMap[] getSelectedProfiles() {
Object profiles[] = selectedProfiles.getStore().getElements();
HashMap out[] = new HashMap[profiles.length];
for (int i = 0; i < profiles.length; i++)
out[i] = (HashMap) profiles[i];
return out;
}
public void setAddressProfileSpec(String addressSpec) {
String items[] = addressCombo.getItems();
for (int i = 0; i < items.length; i++) {
if (items[i].equals(addressSpec)) {
addressCombo.select(i);
return;
}
}
}
public void populateAddressCombo() {
// Store the original selection
int origIndex = addressCombo.getSelectionIndex();
String selection = null;
if (origIndex >= 0)
selection = addressCombo.getItem(origIndex);
else
selection = "None";
Object profiles[] = selectedProfiles.getStore().getElements();
String options[] = new String[profiles.length + 1];
int newIndex = 0;
options[0] = "None";
for (int i = 0; i < profiles.length; i++) {
// TODO: The profile must extend javax.slee.AddressProfile, or implement it.
HashMap profile = (HashMap) profiles[i];
String scopedName = (String) profile.get("Scoped Name");
if (scopedName == null) scopedName = "";
options[i+1] = scopedName;
if (options[i+1].equals(selection))
newIndex = i + 1;
}
addressCombo.setItems(options);
// Reselect the original selection
addressCombo.select(newIndex);
}
public void setHasInitialEvent(boolean initial) {
addressLabel.setEnabled(initial);
addressCombo.setEnabled(initial);
}
public String getAddressProfileSpec() {
if (addressCombo.getSelectionIndex() >= 0)
return addressCombo.getItem(addressCombo.getSelectionIndex());
return null;
}
public void onDataStoreItemAdded(Object item) { populateAddressCombo(); }
public void onDataStoreItemRemoved(Object item) { populateAddressCombo(); }
public void onDataStoreItemChanged(Object item) { populateAddressCombo(); }
private EditableTableViewer availableProfiles;
private EditableTableViewer selectedProfiles;
private Button selectButton;
private Button deselectButton;
private Label addressLabel;
private Combo addressCombo;
}