package org.ovirt.engine.ui.userportal.client.components;
import java.util.HashMap;
import java.util.Map;
import org.ovirt.engine.core.compat.Event;
import org.ovirt.engine.core.compat.EventArgs;
import org.ovirt.engine.core.compat.IEventListener;
import org.ovirt.engine.core.compat.PropertyChangedEventArgs;
import org.ovirt.engine.ui.uicommon.models.Model;
import org.ovirt.engine.ui.userportal.client.common.Severity;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.BkgndRepeat;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Dialog;
import com.smartgwt.client.widgets.Img;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.events.CloseClickHandler;
import com.smartgwt.client.widgets.events.CloseClientEvent;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
public class NonDraggableModalPanel extends Dialog {
protected HLayout footerLayout = new HLayout(5);
protected HLayout headerLayout = new HLayout();
protected VLayout contextArea = new VLayout();
protected ProgressPanel progressPanel;
protected Model model;
final private static Map<Severity,String> CONTEXT_LAYOUT_FRAME_COLORS = new HashMap<Severity, String>() {{
put(Severity.ERROR, "#FF3300");
put(Severity.WARNING, "#FF9900");
put(Severity.INFO, "#CED8DF");
}};
public NonDraggableModalPanel(int width, int height, String title) {
this(width, height, title, Severity.INFO, 5);
}
public NonDraggableModalPanel(int width, int height, String title, Severity severity) {
this(width, height, title, Severity.INFO, 5);
}
public NonDraggableModalPanel(int width, int height, String title, int inPanelPadding) {
this(width, height, title, Severity.INFO, inPanelPadding);
}
public NonDraggableModalPanel(int width, int height, String title, Severity severity, int inPanelPadding) {
setToolbarButtons(footerLayout);
setIsModal(true);
setShowModalMask(true);
setWidth(width);
setHeight(height);
setShowMinimizeButton(false);
setShowCloseButton(false);
setAttribute("edgeTop", 14, false);
setAttribute("edgeBottom", 14, false);
setShowTitle(false);
setShowHeader(false);
setEdgeImage("dialogs/dialog_edge.png");
setEdgeSize(14);
setShowEdges(true);
setFooterHeight(0);
setEdgeOffset(4);
setMargin(-2);
setShowResizeBar(false);
setShowResizer(false);
setCanDrag(false);
setCanDragResize(false);
setCanDragReposition(false);
centerInPage();
setDismissOnEscape(true);
headerLayout.setWidth100();
headerLayout.setHeight(27);
addCloseClickHandler(new CloseClickHandler() {
@Override
public void onCloseClick(CloseClientEvent event) {
onClose();
}
});
HLayout headerLeft = new HLayout();
Img headerLeftImage = new Img("dialogs/" + severity.toString() + ".png", 27, 27);
headerLeft.setWidth(27);
headerLeft.addMember(headerLeftImage);
HLayout headerRight= new HLayout();
Img headerRightImage = new Img("dialogs/dialog_header_right.png", 118, 27);
headerRight.setWidth(118);
headerRight.addMember(headerRightImage);
headerRight.setAlign(Alignment.RIGHT);
HLayout headerCenter= new HLayout();
headerCenter.setWidth100();
headerCenter.setHeight(27);
headerCenter.setBackgroundImage("dialogs/dialog_header_background.png");
headerCenter.setBackgroundRepeat(BkgndRepeat.REPEAT_X);
Label dialogTitle = new Label(title);
dialogTitle.setStyleName("dialog-header-title");
dialogTitle.setAutoFit(true);
headerCenter.addMember(dialogTitle);
headerLayout.setMembers(headerLeft, headerCenter, headerRight);
headerLayout.setStyleName("dialog-header");
super.addItem(headerLayout);
contextArea.setHeight100();
contextArea.setWidth100();
contextArea.setBorder("solid 1px " + CONTEXT_LAYOUT_FRAME_COLORS.get(severity));
contextArea.setMargin(2);
contextArea.setPadding(inPanelPadding);
super.addItem(contextArea);
}
@Override
protected void onDraw() {
// get body auto-child
Canvas body = getById(getID() + "_body");
// disable SmartClient custom scrollbars (#656384, #698988)
// this is required because the custom scrollbars feature catches arrow key events also inside text fields.
body.setShowCustomScrollbars(false);
}
@Override
public void addItem(Canvas component) {
contextArea.addMember(component);
}
public HLayout getFooterLayout() {
return footerLayout;
}
public HLayout getHeaderLayout() {
return headerLayout;
}
public VLayout getContextArea() {
return contextArea;
}
public void setFooterButtons(Alignment alignment, Canvas... buttons) {
footerLayout.setAlign(alignment);
footerLayout.setMembers(buttons);
}
public void onClose() {
}
@Override
public void destroy() {
if (model != null) {
model.getPropertyChangedEvent().getListeners().clear();
progressPanel.destroy();
}
super.destroy();
}
protected void subscribeProgressChangedEvent(final Model model, final FormItem focusedItem, final Canvas innerCanvas) {
this.model = model;
if (model == null) {
return;
}
progressPanel = new ProgressPanel(getWidth(), getHeight());
progressPanel.setVisible(false);
progressPanel.setLeft(-2);
addChild(progressPanel);
model.getPropertyChangedEvent().addListener(new IEventListener() {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
String propertyName = ((PropertyChangedEventArgs) args).PropertyName;
if (propertyName.equals("Progress")) {
boolean inProgress = model.getProgress() != null;
innerCanvas.setDisabled(inProgress);
if (inProgress) {
progressPanel.show();
} else {
progressPanel.hide();
if (focusedItem != null) {
focusedItem.focusInItem();
}
}
}
}
});
model.getPropertyChangedEvent().raise(this, new PropertyChangedEventArgs("Progress"));
}
}