package org.ovirt.engine.ui.webadmin.section.main.view;
import javax.inject.Inject;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.ApplicationMessages;
import org.ovirt.engine.ui.webadmin.ApplicationResources;
import org.ovirt.engine.ui.webadmin.ApplicationTemplates;
import org.ovirt.engine.ui.webadmin.idhandler.ElementIdHandler;
import org.ovirt.engine.ui.webadmin.idhandler.WithElementId;
import org.ovirt.engine.ui.webadmin.section.main.presenter.MainSectionPresenter;
import org.ovirt.engine.ui.webadmin.section.main.presenter.MainTabBarOffsetUiHandlers;
import org.ovirt.engine.ui.webadmin.section.main.view.ApplicationFocusChangeEvent.ApplicationFocusChangeHandler;
import org.ovirt.engine.ui.webadmin.system.InternalConfiguration;
import org.ovirt.engine.ui.webadmin.uicommon.model.AlertFirstRowModelProvider;
import org.ovirt.engine.ui.webadmin.uicommon.model.AlertModelProvider;
import org.ovirt.engine.ui.webadmin.uicommon.model.BookmarkModelProvider;
import org.ovirt.engine.ui.webadmin.uicommon.model.EventFirstRowModelProvider;
import org.ovirt.engine.ui.webadmin.uicommon.model.EventModelProvider;
import org.ovirt.engine.ui.webadmin.uicommon.model.SystemTreeModelProvider;
import org.ovirt.engine.ui.webadmin.uicommon.model.TagModelProvider;
import org.ovirt.engine.ui.webadmin.view.AbstractView;
import org.ovirt.engine.ui.webadmin.widget.bookmark.BookmarkList;
import org.ovirt.engine.ui.webadmin.widget.footer.AlertsEventsFooterView;
import org.ovirt.engine.ui.webadmin.widget.tags.TagList;
import org.ovirt.engine.ui.webadmin.widget.tree.SystemTree;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.Style.Overflow;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.StackLayoutPanel;
import com.google.gwt.user.client.ui.Widget;
public class MainSectionView extends AbstractView implements MainSectionPresenter.ViewDef {
interface ViewUiBinder extends UiBinder<Widget, MainSectionView> {
ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
}
interface ViewIdHandler extends ElementIdHandler<MainSectionView> {
ViewIdHandler idHandler = GWT.create(ViewIdHandler.class);
}
private MainTabBarOffsetUiHandlers uiHandlers;
@UiField
DockLayoutPanel wrapperLayoutPanel;
@UiField
SimplePanel headerPanel;
@UiField(provided = true)
final StackLayoutPanel westStackPanel;
@UiField
LayoutPanel mainContentPanel;
@UiField
SimplePanel alertEventFooterPanel;
@UiField
Label footerMessage;
@WithElementId
Label treeHeader;
@WithElementId
Label bookmarksHeader;
@WithElementId
Label tagsHeader;
private final EventBus eventBus;
private final SystemTreeModelProvider treeModelProvider;
private final AlertModelProvider alertModelProvider;
private final EventModelProvider eventModelProvider;
@Inject
public MainSectionView(SystemTreeModelProvider treeModelProvider,
BookmarkModelProvider bookmarkModelProvider,
TagModelProvider tagModelProvider,
AlertModelProvider alertModelProvider,
AlertFirstRowModelProvider alertFirstRowModelProvider,
EventModelProvider eventModelProvider,
EventFirstRowModelProvider eventFirstRowModelProvider,
InternalConfiguration intConf,
ApplicationResources resources,
ApplicationTemplates templates,
ApplicationMessages messages,
ApplicationConstants constants,
EventBus eventBus) {
attachWindowFocusEvents();
this.eventBus = eventBus;
this.treeModelProvider = treeModelProvider;
this.alertModelProvider = alertModelProvider;
this.eventModelProvider = eventModelProvider;
this.westStackPanel = createWestStackPanel(treeModelProvider, bookmarkModelProvider, tagModelProvider);
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
initHeaders();
ViewIdHandler.idHandler.generateAndSetIds(this);
addContentToWestPanel(treeModelProvider, bookmarkModelProvider, tagModelProvider, westStackPanel, constants);
initAlertEventFooterPanel(alertModelProvider, alertFirstRowModelProvider,
eventModelProvider, eventFirstRowModelProvider, resources, templates);
headerPanel.getElement().getParentElement().getStyle().setOverflow(Overflow.VISIBLE);
if (!intConf.isCurrentBrowserSupported()) {
// Browser is not supported
footerMessage.setText(messages.browserNotSupportedVersion(
intConf.getCurrentBrowser(),
intConf.getCurrentBrowserVersion()));
} else {
// Remove footer message
wrapperLayoutPanel.remove(footerMessage);
}
}
private void initHeaders() {
treeHeader = new Label("Tree");
bookmarksHeader = new Label("Bookmarks");
tagsHeader = new Label("Tags");
}
StackLayoutPanel createWestStackPanel(SystemTreeModelProvider treeModelProvider,
BookmarkModelProvider bookmarkModelProvider, TagModelProvider tagModelProvider) {
final StackLayoutPanel panel = new StackLayoutPanel(Unit.PX) {
@Override
public void onResize() {
super.onResize();
if (uiHandlers != null) {
uiHandlers.setMainTabBarOffset(getOffsetWidth());
}
}
};
return panel;
}
private void addContentToWestPanel(SystemTreeModelProvider treeModelProvider,
BookmarkModelProvider bookmarkModelProvider,
TagModelProvider tagModelProvider,
final StackLayoutPanel panel, ApplicationConstants constants) {
panel.insert(new SystemTree(treeModelProvider, constants), treeHeader, 26, panel.getWidgetCount());
panel.insert(new BookmarkList(bookmarkModelProvider), bookmarksHeader, 26, panel.getWidgetCount());
panel.insert(new TagList(tagModelProvider), tagsHeader, 26, panel.getWidgetCount());
}
void initAlertEventFooterPanel(AlertModelProvider alertModelProvider,
AlertFirstRowModelProvider alertFirstRowModelProvider,
EventModelProvider eventModelProvider,
EventFirstRowModelProvider eventFirstRowModelProvider,
ApplicationResources resources,
ApplicationTemplates templates) {
alertEventFooterPanel.add(new AlertsEventsFooterView(
alertModelProvider, alertFirstRowModelProvider,
eventModelProvider, eventFirstRowModelProvider,
resources, templates));
lastEventWasBlur = false;
}
@Override
public void setInSlot(Object slot, Widget content) {
if (slot == MainSectionPresenter.TYPE_SetHeader) {
setPanelContent(headerPanel, content);
} else if (slot == MainSectionPresenter.TYPE_SetMainContent) {
setPanelContent(mainContentPanel, content);
} else {
super.setInSlot(slot, content);
}
}
@Override
public void setUiHandlers(MainTabBarOffsetUiHandlers uiHandlers) {
this.uiHandlers = uiHandlers;
}
@Override
public HandlerRegistration addApplicationFocusChangeHandler(ApplicationFocusChangeHandler handler) {
return eventBus.addHandler(ApplicationFocusChangeEvent.getType(), handler);
}
@Override
public void fireEvent(GwtEvent<?> event) {
eventBus.fireEvent(event);
}
private JavaScriptObject activeElement;
private boolean lastEventWasBlur;
public void onWindowFocus() {
GWT.log("onWindowFocus() called");
ApplicationFocusChangeEvent.fire(this, true);
alertModelProvider.getModel().toForground();
eventModelProvider.getModel().toForground();
treeModelProvider.getModel().toForground();
}
public void onWindowBlur() {
GWT.log("onWindowBlur() called");
ApplicationFocusChangeEvent.fire(this, false);
alertModelProvider.getModel().toBackground();
eventModelProvider.getModel().toBackground();
treeModelProvider.getModel().toBackground();
}
native void attachWindowFocusEvents() /*-{
var clientAgentType = @org.ovirt.engine.ui.webadmin.uicommon.ClientAgentType::new()();
var browser = clientAgentType.@org.ovirt.engine.ui.webadmin.uicommon.ClientAgentType::browser;
var isIE = browser.toLowerCase() == "explorer";
if (isIE) {
$doc.attachEvent("onfocusin", onFocus);
$doc.attachEvent("onfocusout", onBlur);
} else {
$wnd.addEventListener("focus", onFocus, false);
$wnd.addEventListener("blur", onBlur, false);
}
var context = this;
function onFocus() {
// only focus if previous event was a blur or we get lots of focus events (On IE)
if (context.@org.ovirt.engine.ui.webadmin.section.main.view.MainSectionView::lastEventWasBlur) {
context.@org.ovirt.engine.ui.webadmin.section.main.view.MainSectionView::lastEventWasBlur = false;
context.@org.ovirt.engine.ui.webadmin.section.main.view.MainSectionView::onWindowFocus()();
}
}
function onBlur() {
debugger;
if (context.@org.ovirt.engine.ui.webadmin.section.main.view.MainSectionView::activeElement != $doc.activeElement) {
context.@org.ovirt.engine.ui.webadmin.section.main.view.MainSectionView::activeElement = $doc.activeElement;
} else {
context.@org.ovirt.engine.ui.webadmin.section.main.view.MainSectionView::lastEventWasBlur = true;
context.@org.ovirt.engine.ui.webadmin.section.main.view.MainSectionView::onWindowBlur()();
}
}
}-*/;
}