package org.mobicents.servlet.management.client.router;
import org.mobicents.servlet.management.client.UserInterface;
import org.mobicents.servlet.management.client.dnd.NoInsertAtEndIndexedDropController;
import com.allen_sauer.gwt.dnd.client.PickupDragController;
import com.allen_sauer.gwt.dnd.client.drop.IndexedDropController;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
public final class RequestColumnsContainer extends AbsolutePanel {
private static final String[] COLUMNS = new String[] {"ALL", "INVITE", "REGISTER", "SUBSCRIBE", "OPTIONS", "MESSAGE", "NOTIFY", "PUBLISH", "REFER" };
private static final String CSS_SSM = "ssm";
private static final String CSS_SSM_COLUMN_COMPOSITE = "ssm-column-composite";
private static final String CSS_CONTAINER = "ssm-container";
private static final String CSS_HEADING = "ssm-heading";
private static final String CSS_WIDGET = "ssm-widget";
private static final String CSS_TITLE = "ssm-title-background";
private static final int SPACING = 0;
private VerticalPanel[] routeColumns;
public RequestColumnsContainer() {
init();
}
private Widget makeTitle(String text) {
Label title = new Label(text);
title.setPixelSize(221, 20);
title.addStyleName(CSS_HEADING);
return title;
}
private Widget buildTitles() {
HorizontalPanel titles = new HorizontalPanel();
titles.setStyleName(CSS_TITLE);
titles.setSpacing(SPACING);
Label spacerLabel = new Label("");
spacerLabel.setPixelSize(14, 7);
titles.add(spacerLabel);
for(int col=0; col<COLUMNS.length; col++) {
titles.add(makeTitle(COLUMNS[col]));
}
return titles;
}
private void populateRouterNodes(DARRoute[] routes) {
AbsolutePanel boundaryPanel = this;
boundaryPanel.add(buildTitles());
boundaryPanel.setSize(UserInterface.WIDTH, UserInterface.HEIGHT);
addStyleName(CSS_SSM);
routeColumns = new VerticalPanel[COLUMNS.length];
PickupDragController columnDragController = new PickupDragController(boundaryPanel, false);
columnDragController.setBehaviorMultipleSelection(false);
final PickupDragController widgetDragController = new PickupDragController(boundaryPanel, false);
widgetDragController.setBehaviorMultipleSelection(false);
HorizontalPanel horizontalPanel = new HorizontalPanel();
horizontalPanel.addStyleName(CSS_CONTAINER);
horizontalPanel.setSpacing(SPACING);
boundaryPanel.add(horizontalPanel);
IndexedDropController columnDropController = new IndexedDropController(horizontalPanel);
columnDragController.registerDropController(columnDropController);
for (int col = 0; col < COLUMNS.length; col++) {
VerticalPanel columnCompositePanel = new VerticalPanel();
columnCompositePanel.addStyleName(CSS_SSM_COLUMN_COMPOSITE);
final VerticalPanel verticalPanel = new VerticalPanel();
routeColumns[col] = verticalPanel;
verticalPanel.addStyleName(CSS_CONTAINER);
verticalPanel.setSpacing(SPACING);
horizontalPanel.add(columnCompositePanel);
NoInsertAtEndIndexedDropController widgetDropController = new NoInsertAtEndIndexedDropController(
verticalPanel);
widgetDragController.registerDropController(widgetDropController);
HTML groupDragHandle = new HTML("<div class='group-drag-handle'/>");
columnCompositePanel.add(groupDragHandle);
columnCompositePanel.add(verticalPanel);
columnDragController.makeDraggable(columnCompositePanel, groupDragHandle);
for(int q=0; q<routes.length; q++) {
if(COLUMNS[col].equals(routes[q].getRequest())) {
for(int w=0; w<routes[q].getNodes().length; w++) {
ApplicationRouteNodeEditor widget = new ApplicationRouteNodeEditor(routes[q].getNodes()[w]);
verticalPanel.add(widget);
widgetDragController.makeDraggable(widget, widget.getDragHandle());
}
}
}
Label spacerLabel = new Label("");
spacerLabel.setPixelSize(199, 50);
verticalPanel.add(spacerLabel);
Button addApplicationButton = new Button("Add application", new ButtonListenerAdapter() {
public void onClick(Button button, EventObject e) {
ApplicationRouteNodeEditor widget = new ApplicationRouteNodeEditor();
verticalPanel.insert(widget, verticalPanel.getWidgetCount()-1);
widgetDragController.makeDraggable(widget, widget.getDragHandle());
}
});
addApplicationButton.setWidth("100%");
columnCompositePanel.add(addApplicationButton);
}
}
public String getDARText() {
String source = "";
for(int col=0; col<routeColumns.length; col++) {
int count = routeColumns[col].getWidgetCount();
boolean empty = true;
String routeText = "";
for(int row=0; row<count; row++) {
Widget widget = routeColumns[col].getWidget(row);
if(widget instanceof ApplicationRouteNodeEditor) {
empty = false;
routeText += widget.toString() + ",";
}
}
if(!empty) {
routeText = routeText.substring(0, routeText.length() - 1);
source += COLUMNS[col] + ":" + routeText + "\n";
}
}
return source;
}
public VerticalPanel[] getColumns() {
return routeColumns;
}
private void init() {
DARConfigurationServiceAsync darConfigService = DARConfigurationService.Util.getInstance();
darConfigService.getConfiguration(new AsyncCallback() {
public void onFailure(Throwable arg0) {
Console.error("Failed to parse AR configuration");
}
public void onSuccess(Object configObj) {
DARRoute[] routes = (DARRoute[]) configObj;
populateRouterNodes(routes);
Console.info("AR configiuration parsed succesfully");
}
});
}
}