org.nuxeo.opensocial.container.client.presenter.ContainerPresenter.java Source code

Java tutorial

Introduction

Here is the source code for org.nuxeo.opensocial.container.client.presenter.ContainerPresenter.java

Source

/*
 * (C) Copyright 2011 Nuxeo SA (http://nuxeo.com/) and contributors.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser General Public License
 * (LGPL) version 2.1 which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl.html
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * Contributors:
 *     Stphane Fourrier
 */

package org.nuxeo.opensocial.container.client.presenter;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.nuxeo.opensocial.container.client.AppInfoMessages;
import org.nuxeo.opensocial.container.client.Container;
import org.nuxeo.opensocial.container.client.ContainerConfiguration;
import org.nuxeo.opensocial.container.client.event.priv.app.HideMessageEvent;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.ClosePortletEvent;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.ClosePortletEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.CollapsePortletEvent;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.CollapsePortletEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.MaximizePortletEvent;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.MaximizePortletEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.MinimizePortletEvent;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.MinimizePortletEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.SetPreferencesPortletEvent;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.SetPreferencesPortletEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.UncollapsePortletEvent;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.UncollapsePortletEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.WebContentUpdatedEvent;
import org.nuxeo.opensocial.container.client.event.priv.app.portlet.WebContentUpdatedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.model.ContainerSizeChangedEvent;
import org.nuxeo.opensocial.container.client.event.priv.model.ContainerSizeChangedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.model.FooterSelectedEvent;
import org.nuxeo.opensocial.container.client.event.priv.model.FooterSelectedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.model.HeaderSelectedEvent;
import org.nuxeo.opensocial.container.client.event.priv.model.HeaderSelectedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.model.SideBarChangedEvent;
import org.nuxeo.opensocial.container.client.event.priv.model.SideBarChangedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.model.WebContentAddedEvent;
import org.nuxeo.opensocial.container.client.event.priv.model.WebContentAddedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.model.WebContentIdChangedEvent;
import org.nuxeo.opensocial.container.client.event.priv.model.WebContentIdChangedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.model.WebContentMovedEvent;
import org.nuxeo.opensocial.container.client.event.priv.model.WebContentMovedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.model.WebContentRemovedEvent;
import org.nuxeo.opensocial.container.client.event.priv.model.WebContentRemovedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.model.ZoneAddedEvent;
import org.nuxeo.opensocial.container.client.event.priv.model.ZoneAddedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.model.ZoneDeletedEvent;
import org.nuxeo.opensocial.container.client.event.priv.model.ZoneRowDeletedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.model.ZoneUpdatedEvent;
import org.nuxeo.opensocial.container.client.event.priv.model.ZoneUpdatedEventHandler;
import org.nuxeo.opensocial.container.client.event.priv.service.WebContentsLoadedEvent;
import org.nuxeo.opensocial.container.client.event.priv.service.WebContentsLoadedEventHandler;
import org.nuxeo.opensocial.container.client.external.opensocial.OpenSocialPresenter;
import org.nuxeo.opensocial.container.client.model.AppModel;
import org.nuxeo.opensocial.container.client.model.adapter.GwtWebContentAdapter;
import org.nuxeo.opensocial.container.client.ui.api.HasId;
import org.nuxeo.opensocial.container.client.ui.api.HasUnits;
import org.nuxeo.opensocial.container.client.ui.api.HasWebContents;
import org.nuxeo.opensocial.container.client.view.PreferencesWidget;
import org.nuxeo.opensocial.container.shared.PermissionsConstants;
import org.nuxeo.opensocial.container.shared.layout.api.YUIBodySize;
import org.nuxeo.opensocial.container.shared.layout.api.YUIComponent;
import org.nuxeo.opensocial.container.shared.layout.api.YUIUnit;
import org.nuxeo.opensocial.container.shared.layout.enume.YUISideBarStyle;
import org.nuxeo.opensocial.container.shared.layout.impl.YUIAbstractComponent;
import org.nuxeo.opensocial.container.shared.layout.impl.YUIComponentZoneImpl;
import org.nuxeo.opensocial.container.shared.layout.impl.YUICustomBodySize;
import org.nuxeo.opensocial.container.shared.layout.impl.YUIFixedBodySize;
import org.nuxeo.opensocial.container.shared.layout.impl.YUIUnitImpl;
import org.nuxeo.opensocial.container.shared.webcontent.WebContentData;

import com.allen_sauer.gwt.dnd.client.DragEndEvent;
import com.allen_sauer.gwt.dnd.client.DragHandler;
import com.allen_sauer.gwt.dnd.client.DragStartEvent;
import com.allen_sauer.gwt.dnd.client.PickupDragController;
import com.allen_sauer.gwt.dnd.client.VetoDragException;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;

import net.customware.gwt.presenter.client.EventBus;
import net.customware.gwt.presenter.client.Presenter;
import net.customware.gwt.presenter.client.place.Place;
import net.customware.gwt.presenter.client.place.PlaceRequest;
import net.customware.gwt.presenter.client.widget.WidgetDisplay;
import net.customware.gwt.presenter.client.widget.WidgetPresenter;

/**
 * @author Stphane Fourrier
 */
public class ContainerPresenter extends WidgetPresenter<ContainerPresenter.Display> {

    private static final String CANVAS_VIEW = "canvas";

    protected static final String DEFAULT_VIEW = "default";

    public interface Display extends WidgetDisplay {
        void setContainerHeader(boolean headerEnabled, String headerId);

        HasId getContainerHeader();

        HasId getContainerFooter();

        HasId getContainerSideBar();

        void setContainerCustomSize(String cssStyle, long size);

        void setContainerFixedSize(String cssStyle);

        void setContainerSideBar(boolean hasSideBar, String cssStyle, String string);

        void setContainerFooter(boolean footerEnabled, String footerId);

        void setData();

        void addZone(String cssStyle);

        void removeZone(int zoneIndex);

        HasUnits getZone(int index);

        void updateZoneTemplate(int zoneIndex, String zoneClass);

        void addUnit(int zoneIndex, String unitClass, String unitId);

        void removeUnit(int zoneIndex, int unitIndex);

        HasWebContents getUnit(String unitId);

        HasWebContents getUnit(int zoneIndex, int unitIndex);

        void removeWebContent(String webContentId);

        WidgetDisplay getWebContent(String webContentId);

        void moveWebContents(int fromZoneIndex, int fromUnitIndex, int toZoneIndex, int toUnitIndex);

        void moveWebContent(String fromUnitId, int fromWebContentPosition, String toUnitId,
                int toWebContentPosition);

        void maximizeWebContent(Widget widget);

        void minimizeWebContent(Widget widget, String unitId, long position);
    }

    public static final Place PLACE = new Place("Container");

    public static AppInfoMessages infos = AppPresenter.infos;

    private AppModel model;

    private Map<String, YUIFlowPanelDropController> dropControllerList;

    private Map<String, Presenter> webContentPresenters;

    private PickupDragController dragController;

    public boolean isMaximized = false;

    @Inject
    public ContainerPresenter(Display display, EventBus eventBus, AppModel model) {
        super(display, eventBus);
        this.model = model;
        this.dropControllerList = new HashMap<String, YUIFlowPanelDropController>();
        this.webContentPresenters = new HashMap<String, Presenter>();

        fetchLayoutContent();
    }

    private void fetchLayoutContent() {
        dragController = new PickupDragController(Container.rootPanel, false);
        Container.rootPanel.getElement().getStyle().setPosition(Position.RELATIVE);
        registerDragAndDropEvent();
        dragController.setBehaviorConstrainedToBoundaryPanel(false);
        dragController.setBehaviorMultipleSelection(false);
        dragController.setBehaviorDragStartSensitivity(0);

        if (model.getLayout() != null) {
            setContainerSize();
            setLayoutZonesAndUnits();

            setContainerHeader();
            setContainerFooter();
            setContainerSideBar();

            if (!model.getLayout().getSidebarStyle().equals(YUISideBarStyle.YUI_SB_NO_COLUMN)) {
                addDropControllerFor(model.getLayout().getSideBar());
            }

            for (YUIComponent zone : model.getLayout().getContent().getComponents()) {
                for (YUIComponent unit : zone.getComponents()) {
                    addDropControllerFor((YUIUnit) unit);
                }
            }

            display.setData();
        }
    }

    private void setContainerHeader() {
        YUIUnit header = model.getLayout().getHeader();

        if (header == null) {
            String oldId = display.getContainerHeader().getId();
            display.setContainerHeader(false, "");
            removeDropControllerFor(oldId);
        } else {
            display.setContainerHeader(true, ((YUIComponent) header).getId());
            addDropControllerFor(header);
        }
    }

    private void setContainerFooter() {
        YUIUnit footer = model.getLayout().getFooter();
        if (footer == null) {
            String oldId = display.getContainerFooter().getId();
            display.setContainerFooter(false, "");
            removeDropControllerFor(oldId);
        } else {
            display.setContainerFooter(true, ((YUIComponent) footer).getId());
            addDropControllerFor(model.getLayout().getFooter());
        }
    }

    private void setLayoutZonesAndUnits() {
        int zoneIndex = 0;

        for (YUIComponent zoneComponent : model.getLayout().getContent().getComponents()) {
            display.addZone(zoneComponent.getCSS());
            for (YUIComponent unitComponent : zoneComponent.getComponents()) {
                display.addUnit(zoneIndex, unitComponent.getCSS(), unitComponent.getId());
                display.updateZoneTemplate(zoneIndex, zoneComponent.getCSS());
            }
            zoneIndex++;
        }
    }

    private void setContainerSize() {
        YUIBodySize bodySize = model.getLayout().getBodySize();

        if (bodySize instanceof YUICustomBodySize) {
            display.setContainerCustomSize(bodySize.getCSS(), bodySize.getSize());
        } else if (bodySize instanceof YUIFixedBodySize) {
            display.setContainerFixedSize(bodySize.getCSS());
        }
    }

    private void setContainerSideBar() {
        YUISideBarStyle sideBar = model.getLayout().getSidebarStyle();

        if (YUISideBarStyle.YUI_SB_NO_COLUMN.toString().equals(sideBar.toString())) {
            String oldId = display.getContainerSideBar().getId();
            display.setContainerSideBar(false, sideBar.getCSS(), "");
            removeDropControllerFor(oldId);
        } else {
            String sidebarId = ((YUIComponent) model.getLayout().getSideBar()).getId();
            display.setContainerSideBar(true, sideBar.getCSS(), sidebarId);
            addDropControllerFor(model.getLayout().getSideBar());
        }
    }

    @Override
    public Place getPlace() {
        return PLACE;
    }

    @Override
    protected void onBind() {
        registerBusEventSideBarChangement();
        registerBusEventHeaderSelection();
        registerBusEventFooterSelection();
        registerBusEventContainerSizeChangement();
        registerBusEventZoneAddition();
        registerBusEventZoneDeletion();
        registerBusEventZoneUpdate();
        registerBusEventWebContentAddition();
        registerBusEventWebContentRemoval();
        registerBusEventWebContentsLoad();
        registerBusEventWebContentMovement();
        registerBusEventWebContentIdChangement();
        registerBusEventPreferencesPortletSet();
        registerBusEventPorletCollapse();
        registerBusEventPorletUncollapse();
        registerBusEventWebContentPortletMaximization();
        registerBusEventWebContentPortletMinimization();
        registerBusEventWebContentPorletClose();
        registerBusEventWebContentPortletUpdate();
    }

    @Override
    protected void onPlaceRequest(PlaceRequest request) {
    }

    @Override
    protected void onUnbind() {
    }

    public void refreshDisplay() {
        fetchLayoutContent();
    }

    public void revealDisplay() {

    }

    private void registerBusEventSideBarChangement() {
        registerHandler(eventBus.addHandler(SideBarChangedEvent.TYPE, new SideBarChangedEventHandler() {
            public void onChangeSideBarPosition(SideBarChangedEvent event) {
                setContainerSideBar();
            }
        }));
    }

    private void registerBusEventHeaderSelection() {
        registerHandler(eventBus.addHandler(HeaderSelectedEvent.TYPE, new HeaderSelectedEventHandler() {
            public void onSelectHeader(HeaderSelectedEvent event) {
                setContainerHeader();
            }
        }));
    }

    private void registerBusEventFooterSelection() {
        registerHandler(eventBus.addHandler(FooterSelectedEvent.TYPE, new FooterSelectedEventHandler() {
            public void onSelectFooter(FooterSelectedEvent event) {
                setContainerFooter();
            }
        }));
    }

    private void registerBusEventContainerSizeChangement() {
        registerHandler(eventBus.addHandler(ContainerSizeChangedEvent.TYPE, new ContainerSizeChangedEventHandler() {
            public void onChangeContainerSize(ContainerSizeChangedEvent event) {
                setContainerSize();
            }
        }));
    }

    private void registerBusEventZoneAddition() {
        registerHandler(eventBus.addHandler(ZoneAddedEvent.TYPE, new ZoneAddedEventHandler() {
            public void onAddRow(ZoneAddedEvent event) {
                int zoneIndex = model.getLayout().getContent().getComponents().size() - 1;
                YUIComponentZoneImpl zoneComponent = (YUIComponentZoneImpl) model.getLayout().getContent()
                        .getComponents().get(zoneIndex);
                display.addZone(zoneComponent.getCSS());

                for (YUIComponent unitComponent : zoneComponent.getComponents()) {
                    String idRef = unitComponent.getId();

                    display.addUnit(zoneIndex, unitComponent.getCSS(), idRef);

                    addDropControllerFor((YUIUnit) unitComponent);
                }

                display.updateZoneTemplate(zoneIndex, zoneComponent.getCSS());
            }
        }));
    }

    private void registerBusEventZoneDeletion() {
        registerHandler(eventBus.addHandler(ZoneDeletedEvent.TYPE, new ZoneRowDeletedEventHandler() {
            public void onRowDeleted(ZoneDeletedEvent event) {
                for (int i = 0; i < display.getZone(event.getId()).getNumberOfUnits(); i++) {
                    removeDropControllerFor(((HasId) display.getUnit(event.getId(), i)).getId());
                }
                display.removeZone(event.getId());
            }
        }));
    }

    private void registerBusEventZoneUpdate() {
        registerHandler(eventBus.addHandler(ZoneUpdatedEvent.TYPE, new ZoneUpdatedEventHandler() {
            public void onUpdateRow(ZoneUpdatedEvent event) {
                YUIComponentZoneImpl zoneComponent = ((YUIComponentZoneImpl) model.getLayout().getContent()
                        .getComponents().get(event.getId()));

                HasUnits zone = display.getZone(event.getId());

                int actualNumberOfUnits = zone.getNumberOfUnits();
                int wantedNumberOfUnits = zoneComponent.getTemplate().getNumberOfComponents();

                if (actualNumberOfUnits < wantedNumberOfUnits) {
                    for (int i = actualNumberOfUnits; i < wantedNumberOfUnits; i++) {
                        YUIUnitImpl unit = (YUIUnitImpl) zoneComponent.getComponents().get(i);

                        display.addUnit(event.getId(), unit.getCSS(), unit.getId());

                        addDropControllerFor(unit);
                    }
                } else if (actualNumberOfUnits > wantedNumberOfUnits) {
                    for (int i = actualNumberOfUnits - 1; i > wantedNumberOfUnits - 1; i--) {
                        removeDropControllerFor(((HasId) display.getUnit(event.getId(), i)).getId());

                        display.removeUnit(event.getId(), i);
                    }
                }
                display.updateZoneTemplate(event.getId(), zoneComponent.getCSS());
            }
        }));
    }

    private void registerBusEventWebContentAddition() {
        registerHandler(eventBus.addHandler(WebContentAddedEvent.TYPE, new WebContentAddedEventHandler() {
            public void onAddWebContent(WebContentAddedEvent event) {
                GwtWebContentAdapter webContentAdapter = new GwtWebContentAdapter(event.getAbstractData(),
                        eventBus);

                Presenter webContentPresenter = webContentAdapter.getContainerPresenter();
                WidgetDisplay webContentView = (WidgetDisplay) webContentPresenter.getDisplay();
                WebContentData webContentData = event.getAbstractData();

                webContentPresenters.put(webContentData.getId(), webContentPresenter);

                webContentPresenter.bind();
                webContentPresenter.revealDisplay();

                HasWebContents unit = display.getUnit(webContentData.getUnitId());
                if (unit != null) {
                    unit.addWebContent(webContentView.asWidget());
                }

                if (webContentData.isInAPorlet()) {
                    makeDraggable(webContentData, webContentView);
                    if (ContainerConfiguration.showPreferencesAfterAddingGadget()) {
                        eventBus.fireEvent(new SetPreferencesPortletEvent(webContentData.getId()));
                    }
                }
            }
        }));
    }

    private void makeDraggable(WebContentData webContentData, WidgetDisplay display) {
        String spaceId = model.getContainerContext().getSpaceId();
        if (webContentData.isInAPorlet() && model.hasPermission(spaceId, PermissionsConstants.EVERYTHING)) {
            dragController.makeDraggable(display.asWidget(), ((PortletPresenter.Display) display).getHeader());
        }
    }

    private void makeNotDraggable(WebContentData webContentData, WidgetDisplay display) {
        String spaceId = model.getContainerContext().getSpaceId();
        if (webContentData.isInAPorlet() && model.hasPermission(spaceId, PermissionsConstants.EVERYTHING)) {
            dragController.makeNotDraggable(display.asWidget());
        }
    }

    private void registerBusEventWebContentRemoval() {
        registerHandler(eventBus.addHandler(WebContentRemovedEvent.TYPE, new WebContentRemovedEventHandler() {
            public void onWebContentRemoved(WebContentRemovedEvent event) {
                webContentPresenters.get(event.getWebContentId()).unbind();
            }
        }));
    }

    private void registerBusEventWebContentsLoad() {
        registerHandler(eventBus.addHandler(WebContentsLoadedEvent.TYPE, new WebContentsLoadedEventHandler() {
            public void onWebContentsLoaded(WebContentsLoadedEvent event) {
                for (Entry<String, List<WebContentData>> webContents : model.getWebContents().entrySet()) {
                    for (WebContentData webContent : webContents.getValue()) {
                        GwtWebContentAdapter webContentAdapter = new GwtWebContentAdapter(webContent, eventBus);

                        Presenter webContentPresenter = webContentAdapter.getContainerPresenter();
                        WidgetDisplay webContentView = (WidgetDisplay) webContentPresenter.getDisplay();

                        webContentPresenters.put(webContent.getId(), webContentPresenter);

                        makeDraggable(webContent, webContentView);

                        webContentPresenter.bind();
                        webContentPresenter.revealDisplay();

                        HasWebContents unit = display.getUnit(webContent.getUnitId());
                        if (unit != null) {

                            unit.addWebContent(webContentView.asWidget());
                        }
                    }
                }

                eventBus.fireEvent(new HideMessageEvent());
            }
        }));
    }

    private void registerBusEventWebContentMovement() {
        registerHandler(eventBus.addHandler(WebContentMovedEvent.TYPE, new WebContentMovedEventHandler() {
            public void onWebContentHasMoved(WebContentMovedEvent event) {
                display.moveWebContent(event.getFromUnitName(), event.getFromWebContentPosition(),
                        event.getToUnitName(), event.getToWebContentPosition());
            }
        }));
    }

    private void registerBusEventWebContentIdChangement() {
        registerHandler(eventBus.addHandler(WebContentIdChangedEvent.TYPE, new WebContentIdChangedEventHandler() {
            public void onWebContentIdChange(WebContentIdChangedEvent event) {
                ((HasId) display.getWebContent(event.getOldWebContentId())).setId(event.getNewWebContentId());
                webContentPresenters.put(event.getNewWebContentId(),

                        webContentPresenters.remove(event.getOldWebContentId()));
            }
        }));
    }

    private void registerBusEventPreferencesPortletSet() {
        eventBus.addHandler(SetPreferencesPortletEvent.TYPE, new SetPreferencesPortletEventHandler() {
            public void onSetPreferences(SetPreferencesPortletEvent event) {
                PreferencesWidget preferencesWidget = new PreferencesWidget();

                PreferencesPresenter preferencesPresenter = new PreferencesPresenter(preferencesWidget, eventBus,
                        (PortletPresenter) webContentPresenters.get(event.getId()), model);

                preferencesPresenter.bind();
                preferencesPresenter.revealDisplay();
            }
        });
    }

    private void registerBusEventPorletCollapse() {
        eventBus.addHandler(CollapsePortletEvent.TYPE, new CollapsePortletEventHandler() {
            public void onCollapsePortlet(CollapsePortletEvent event) {
                PortletPresenter gadget = (PortletPresenter) webContentPresenters.get(event.getId());
                gadget.collapse();
                model.getWebContent(event.getId()).setIsCollapsed(true);
                model.updateWebContent(event.getId(), null);
            }
        });
    }

    private void registerBusEventPorletUncollapse() {
        eventBus.addHandler(UncollapsePortletEvent.TYPE, new UncollapsePortletEventHandler() {
            public void onUncollapsePortlet(UncollapsePortletEvent event) {
                PortletPresenter gadget = (PortletPresenter) webContentPresenters.get(event.getId());
                gadget.uncollapse();
                model.getWebContent(event.getId()).setIsCollapsed(false);
                model.updateWebContent(event.getId(), null);
            }
        });
    }

    private void registerBusEventWebContentPortletMaximization() {
        eventBus.addHandler(MaximizePortletEvent.TYPE, new MaximizePortletEventHandler() {
            @SuppressWarnings("unchecked")
            public void onMaximizeWebContent(MaximizePortletEvent event) {
                if (!isMaximized) {
                    // TODO We have to handle the different view for the
                    // gadget. For the time, it is only handle by the
                    // OpenSocialPresenter !
                    WidgetPresenter presenter = (WidgetPresenter) webContentPresenters.get(event.getId());
                    if (presenter instanceof PortletPresenter) {
                        WidgetPresenter contentPresenter = (WidgetPresenter) ((PortletPresenter) presenter)
                                .getContentPresenter();
                        if (contentPresenter instanceof OpenSocialPresenter) {
                            ((OpenSocialPresenter) contentPresenter).setView(CANVAS_VIEW);
                        }
                    }

                    WidgetDisplay gadgetView = (WidgetDisplay) presenter.getDisplay();

                    WebContentData webContent = model.getWebContent(event.getId());
                    makeNotDraggable(webContent, gadgetView);

                    display.setContainerSideBar(false,

                            YUISideBarStyle.YUI_SB_NO_COLUMN.getCSS(), "");
                    YUIUnit header = model.getLayout().getHeader();
                    YUIUnit footer = model.getLayout().getFooter();
                    if (header != null) {
                        display.setContainerHeader(false, ((YUIComponent) model.getLayout().getHeader()).getId());
                    }
                    if (footer != null) {
                        display.setContainerFooter(false, ((YUIComponent) model.getLayout().getFooter()).getId());
                    }

                    display.maximizeWebContent(gadgetView.asWidget());
                    isMaximized = true;
                }
            }
        });
    }

    private void registerBusEventWebContentPortletMinimization() {
        eventBus.addHandler(MinimizePortletEvent.TYPE, new MinimizePortletEventHandler() {
            @SuppressWarnings("unchecked")
            public void onMinimizeWebContent(MinimizePortletEvent event) {
                if (isMaximized) {
                    // TODO We have to handle the different view for the
                    // gadget. For the time, it is only handle by the
                    // OpenSocialPresenter !
                    WidgetPresenter presenter = (WidgetPresenter) webContentPresenters.get(event.getId());
                    if (presenter instanceof PortletPresenter) {
                        WidgetPresenter contentPresenter = (WidgetPresenter) ((PortletPresenter) presenter)
                                .getContentPresenter();
                        if (contentPresenter instanceof OpenSocialPresenter) {
                            ((OpenSocialPresenter) contentPresenter).setView(DEFAULT_VIEW);
                        }
                    }

                    WidgetDisplay gadgetView = ((WidgetDisplay) webContentPresenters.get(event.getId())
                            .getDisplay());

                    WebContentData webContent = model.getWebContent(event.getId());
                    makeDraggable(webContent, gadgetView);

                    setContainerSideBar();
                    YUIUnit header = model.getLayout().getHeader();
                    YUIUnit footer = model.getLayout().getFooter();
                    if (header != null) {
                        display.setContainerHeader(true, ((YUIComponent) header).getId());
                    }
                    if (footer != null) {
                        display.setContainerFooter(true, ((YUIComponent) footer).getId());
                    }

                    display.minimizeWebContent(gadgetView.asWidget(), webContent.getUnitId(),
                            webContent.getPosition());
                    isMaximized = false;
                }
            }
        });
    }

    private void registerBusEventWebContentPortletUpdate() {
        eventBus.addHandler(WebContentUpdatedEvent.TYPE, new WebContentUpdatedEventHandler() {
            public void onWebContentUpdated(WebContentUpdatedEvent event) {
                Presenter presenter = webContentPresenters.get(event.getWebContentId());
                presenter.refreshDisplay();
            }
        });
    }

    private void registerBusEventWebContentPorletClose() {
        eventBus.addHandler(ClosePortletEvent.TYPE, new ClosePortletEventHandler() {
            public void onCloseWebContent(ClosePortletEvent event) {
                if (Window.confirm(infos.isSureToDeleteGadget())) {
                    model.removeWebContent(event.getId());
                }
            }
        });
    }

    private void addDropControllerFor(YUIUnit unit) {
        String spaceId = model.getContainerContext().getSpaceId();
        if (unit != null && model.hasPermission(spaceId, PermissionsConstants.EVERYTHING)) {
            String idRef = ((YUIAbstractComponent) unit).getId();
            FlowPanel unitWidget = (FlowPanel) display.getUnit(idRef);
            YUIFlowPanelDropController dropController = new YUIFlowPanelDropController(unitWidget);

            dragController.registerDropController(dropController);
            dropControllerList.put(idRef, dropController);
        }
    }

    private void removeDropControllerFor(String idRef) {
        YUIFlowPanelDropController dropController = dropControllerList.get(idRef);
        String spaceId = model.getContainerContext().getSpaceId();
        if (dropController != null && model.hasPermission(spaceId, PermissionsConstants.EVERYTHING)) {
            dragController.unregisterDropController(dropController);
            dropControllerList.remove(idRef);
        }
    }

    private void registerDragAndDropEvent() {
        dragController.addDragHandler(new DragHandler() {
            private int webContentPositionBeforeDragging;

            private String webContentUnitIdBeforeDragging;

            public void onPreviewDragStart(DragStartEvent event) throws VetoDragException {
            }

            public void onPreviewDragEnd(DragEndEvent event) throws VetoDragException {
            }

            public void onDragStart(DragStartEvent event) {
                PortletPresenter.Display webContentView = (PortletPresenter.Display) event.getSource();
                webContentUnitIdBeforeDragging = webContentView.getParentId();
                int i = 0;
                for (WebContentData webContent : model.getWebContents().get(webContentUnitIdBeforeDragging)) {
                    String webContentId = webContentView.getId();
                    if (webContent.getId().equals(webContentId)) {
                        webContentPositionBeforeDragging = i;
                    }

                    i++;
                }

                highLightUnits();
                ((PortletPresenter) webContentPresenters.get(webContentView.getId())).hideContent();
            }

            public void onDragEnd(DragEndEvent event) {
                PortletPresenter.Display webContentView = (PortletPresenter.Display) event.getSource();
                String webContentUnitIdAfterDragging = webContentView.getParentId();
                int webContentPositionAfterDragging = display.getUnit(webContentUnitIdAfterDragging)
                        .getWebContentPosition(webContentView.asWidget());

                model.webContentMoved(webContentUnitIdBeforeDragging, webContentPositionBeforeDragging,
                        webContentUnitIdAfterDragging, webContentPositionAfterDragging);

                unHighLightUnits();

                ((PortletPresenter) webContentPresenters.get(webContentView.getId())).showContent();
            }

            private native void highLightUnits() /*-{
                                                 $wnd.jQuery('.yui-unit').addClass('highLight');
                                                 }-*/;

            private native void unHighLightUnits() /*-{
                                                   $wnd.jQuery('.yui-unit').removeClass('highLight');
                                                   }-*/;
        });
    }
}