package org.ovirt.engine.ui.webadmin.section.main.view;
import javax.inject.Inject;
import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.ui.common.idhandler.ElementIdHandler;
import org.ovirt.engine.ui.common.idhandler.WithElementId;
import org.ovirt.engine.ui.common.system.ClientStorage;
import org.ovirt.engine.ui.common.view.AbstractView;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
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.uicommon.model.AlertModelProvider;
import org.ovirt.engine.ui.webadmin.uicommon.model.BookmarkModelProvider;
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.uicommon.model.TaskModelProvider;
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.main.TabbedSplitLayoutPanel;
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.Scheduler;
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.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.IsWidget;
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.SplitLayoutPanel;
import com.google.gwt.user.client.ui.StackLayoutPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.name.Named;
public class MainSectionView extends AbstractView implements MainSectionPresenter.ViewDef {
private static final int TREE_INDEX = 0;
private static final int BOOKMARK_INDEX = 1;
private static final int TAG_INDEX = 2;
private static final int SPLITTER_THICKNESS = 4;
private static final int SECTION_HEADER_HEIGHT = 30;
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
SimplePanel headerPanel;
@UiField(provided = true)
final StackLayoutPanel westStackPanel;
@UiField
LayoutPanel mainContentPanel;
@UiField
SimplePanel alertEventFooterPanel;
@UiField(provided = true)
SplitLayoutPanel verticalSplitLayoutPanel;
@UiField(provided = true)
SplitLayoutPanel horizontalSplitLayoutPanel;
@WithElementId
Label treeHeader;
@WithElementId
Label bookmarksHeader;
@WithElementId
Label tagsHeader;
private static final ApplicationConstants constants = AssetProvider.getConstants();
@Inject
public MainSectionView(SystemTreeModelProvider treeModelProvider,
BookmarkModelProvider bookmarkModelProvider,
TagModelProvider tagModelProvider,
AlertModelProvider alertModelProvider,
@Named("footer") EventModelProvider eventModelProvider,
TaskModelProvider taskModelProvider,
EventBus eventBus,
ClientStorage clientStorage) {
westStackPanel = createWestStackPanel(treeModelProvider, bookmarkModelProvider, tagModelProvider);
verticalSplitLayoutPanel = new SplitLayoutPanel(SPLITTER_THICKNESS);
horizontalSplitLayoutPanel = new TabbedSplitLayoutPanel(SPLITTER_THICKNESS, clientStorage);
initWidget(ViewUiBinder.uiBinder.createAndBindUi(this));
initHeaders();
ViewIdHandler.idHandler.generateAndSetIds(this);
addContentToWestPanel(treeModelProvider, bookmarkModelProvider, tagModelProvider, westStackPanel);
initAlertEventFooterPanel(alertModelProvider,
eventModelProvider,
taskModelProvider,
eventBus,
clientStorage);
headerPanel.getElement().getParentElement().getStyle().setOverflow(Overflow.VISIBLE);
//Enable double clicking to collapse/expand the stack panel (with the treeview).
horizontalSplitLayoutPanel.setWidgetToggleDisplayAllowed(westStackPanel, true);
Scheduler.get().scheduleDeferred(() -> {
//Manually call onResize() so the tabs at the top are positioned correctly. For some reason
//doing setWidgetSize doesn't trigger the onResize event. Also this need to be deferred
//otherwise the handlers haven't been added yet, and the resize won't do anything.
westStackPanel.onResize();
});
}
private void initHeaders() {
treeHeader = new Label(constants.systemMainSection());
bookmarksHeader = new Label(constants.bookmarksMainSection());
tagsHeader = new Label(constants.tagsMainSection());
}
StackLayoutPanel createWestStackPanel(final SystemTreeModelProvider treeModelProvider,
final BookmarkModelProvider bookmarkModelProvider, final TagModelProvider tagModelProvider) {
final StackLayoutPanel panel = new StackLayoutPanel(Unit.PX) {
@Override
public void onResize() {
super.onResize();
Double westStackWidth = horizontalSplitLayoutPanel.getWidgetSize(westStackPanel);
if (uiHandlers != null && westStackWidth != null) {
uiHandlers.setMainTabBarOffset(westStackWidth.intValue());
}
}
};
panel.addSelectionHandler(event -> {
if (event == null) {
return;
}
treeModelProvider.getModel().setSearchString(StringUtils.EMPTY);
treeModelProvider.getModel().refresh();
switch(event.getSelectedItem()) {
case TREE_INDEX:
bookmarkModelProvider.getModel().stopRefresh();
tagModelProvider.getModel().stopRefresh();
// Reset system tree to the root item.
treeModelProvider.getModel().getResetCommand().execute();
break;
case BOOKMARK_INDEX:
treeModelProvider.getModel().stopRefresh();
tagModelProvider.getModel().stopRefresh();
bookmarkModelProvider.getModel().executeBookmarksSearch();
break;
case TAG_INDEX:
treeModelProvider.getModel().stopRefresh();
bookmarkModelProvider.getModel().stopRefresh();
break;
}
});
return panel;
}
private void addContentToWestPanel(SystemTreeModelProvider treeModelProvider,
BookmarkModelProvider bookmarkModelProvider,
TagModelProvider tagModelProvider,
final StackLayoutPanel panel) {
panel.insert(new SystemTree(treeModelProvider), treeHeader, SECTION_HEADER_HEIGHT, panel.getWidgetCount());
panel.insert(new BookmarkList(bookmarkModelProvider), bookmarksHeader, SECTION_HEADER_HEIGHT, panel.getWidgetCount());
panel.insert(new TagList(tagModelProvider), tagsHeader, SECTION_HEADER_HEIGHT, panel.getWidgetCount());
}
void initAlertEventFooterPanel(AlertModelProvider alertModelProvider,
EventModelProvider eventModelProvider,
TaskModelProvider taskModelProvider,
EventBus eventBus,
ClientStorage clientStorage) {
alertEventFooterPanel.add(new AlertsEventsFooterView(alertModelProvider, eventModelProvider, taskModelProvider,
eventBus, clientStorage));
}
@Override
public void setInSlot(Object slot, IsWidget 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;
}
}