com.isotrol.impe3.pms.gui.client.widget.portalmanagement.PortalLeftMenu.java Source code

Java tutorial

Introduction

Here is the source code for com.isotrol.impe3.pms.gui.client.widget.portalmanagement.PortalLeftMenu.java

Source

/**
 * This file is part of Port@l
 * Port@l 3.0 - Portal Engine and Management System
 * Copyright (C) 2010  Isotrol, SA.  http://www.isotrol.com
 *
 * Port@l is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Port@l 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Port@l.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.isotrol.impe3.pms.gui.client.widget.portalmanagement;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.Style.SelectionMode;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.ListViewEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.ListView;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.button.IconButton;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.inject.Inject;
import com.isotrol.impe3.gui.common.data.MenuItemModelData;
import com.isotrol.impe3.gui.common.widget.IframePanel;
import com.isotrol.impe3.pms.api.page.PageDeviceDTO;
import com.isotrol.impe3.pms.api.portal.PortalCacheDTO;
import com.isotrol.impe3.pms.api.portal.PortalNameDTO;
import com.isotrol.impe3.pms.api.portal.PortalTemplateDTO;
import com.isotrol.impe3.pms.api.portal.PortalURLsDTO;
import com.isotrol.impe3.pms.gui.api.service.IPagesServiceAsync;
import com.isotrol.impe3.pms.gui.api.service.IPortalsServiceAsync;
import com.isotrol.impe3.pms.gui.client.data.impl.PageDeviceModelData;
import com.isotrol.impe3.pms.gui.client.error.PortalsServiceErrorMessageResolver;
import com.isotrol.impe3.pms.gui.client.error.ServiceErrorsProcessor;
import com.isotrol.impe3.pms.gui.client.ioc.IPmsFactory;
import com.isotrol.impe3.pms.gui.client.ioc.PmsFactory;
import com.isotrol.impe3.pms.gui.client.util.PmsConstants;
import com.isotrol.impe3.pms.gui.client.widget.ALeftPanel;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.basicproperties.PortalEditionPropertiesPanel;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.cache.PortalCachePanel;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.collection.CollectionsManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.component.AOwnComponentManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.component.InheritedComponentManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.configurations.PortalConfigurationsManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.device.PortalDevicesManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.names.PortalNameEditionPanel;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.pages.master.CategoryPagesManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.pages.master.ContentPagesManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.pages.master.ContentTypePagesManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.pages.master.DefaultPagesManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.pages.master.ErrorPagesManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.pages.master.SpecialPagesManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.pages.master.TemplatePagesManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.parent.ParentPortalManagement;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.properties.AvailableBasesWidget;
import com.isotrol.impe3.pms.gui.client.widget.portalmanagement.properties.AvailablePropertiesWidget;

/**
 * Portals left panel
 * 
 * @author Manuel Ruiz
 * 
 */
public class PortalLeftMenu extends ALeftPanel {

    /** "Default widget" item ID */
    private static final String ID_START_PAGE = "star-page";

    /** "Names - locales" item ID.<br/> */
    private static final String ID_NAMES = "names-locales";

    /** "General management" item ID.<br/> */
    private static final String ID_GENERAL_MNT = "general-mnt";

    /** "Bases" item ID.<br/> */
    private static final String ID_BASES = "bases";

    /** "Properties" item ID.<br/> */
    private static final String ID_PROPERTIES = "properties";

    /** "Parent portal" item ID.<br/> */
    private static final String ID_PARENT_PORTAL = "parent-portal";

    /** "Collections" item ID.<br/> */
    private static final String ID_COLLECTIONS = "collections";

    /** "Portal devices" item ID.<br/> */
    private static final String ID_PORTAL_DEVICES = "portal-devices";

    /** "Portal devices" item ID.<br/> */
    private static final String ID_PORTAL_CACHE = "portal-cache";

    /** "Display offline" item ID.<br/> */
    private static final String ID_OFFLINE = "offline";

    /** "Display online" item ID.<br/> */
    private static final String ID_ONLINE = "online";

    /** "Own components" item ID.<br/> */
    private static final String ID_OWN_COMP = "own-comp";

    /** "Inherited components" item ID.<br/> */
    private static final String ID_INH_COMP = "inh-comp";

    /** "Default pages" item ID.<br/> */
    private static final String ID_DEFAULT_PAGES = "default-pages";

    /** "Templates" item ID.<br/> */
    private static final String ID_TEMPLATES = "templates";

    /** "Special pages" item ID.<br/> */
    private static final String ID_SPECIAL_PAGES = "special-pages";

    /** "Category pages" item ID.<br/> */
    private static final String ID_CATEGORY_PAGES = "category-pages";

    /** "Categories pages" item ID.<br/> */
    private static final String ID_CONFIGURATIONS_PAGES = "portal-configurations-pages";

    /** "Content pages" item ID.<br/> */
    private static final String ID_CONTENT_PAGES = "content-pages";

    /** "Content list pages" item ID.<br/> */
    private static final String ID_CONTENT_LIST_PAGES = "content-list-pages";

    /** "Error pages" item ID.<br/> */
    private static final String ID_ERROR_PAGES = "error-pages";

    /** "Watch handbook" item ID.<br/> */
    private static final String ID_WATCH_HELP = "watch-help";

    /** "Open handbook" item ID.<br/> */
    private static final String ID_OPEN_HELP = "open-help";

    /** portal name dto */
    private PortalNameDTO portalName = null;

    private PortalTabItemManager tabItemManager = null;

    private ListView<MenuItemModelData> adminMenulist = null;

    private MenuItemModelData iAdmin = null;

    private MenuItemModelData iDefault = null;

    private MenuItemLevelOnePanel adminPanel = null;

    /**
     * ComboBox with the devices for the current portal
     */
    private ComboBox<PageDeviceModelData> cbDevices = null;

    /**
     * Page device selected in combo
     */
    private PageDeviceModelData currentDevice = null;

    /**
     * The service error processor
     */
    private ServiceErrorsProcessor errorProcessor = null;

    /**
     * The Portals async service proxy.<br/>
     */
    private IPortalsServiceAsync portalsService = null;

    /**
     * The Pages async service proxy.<br/>
     */
    private IPagesServiceAsync pagesService = null;

    /**
     * Portals service error message resolver.<br/>
     */
    private PortalsServiceErrorMessageResolver errorMessageResolver = null;

    /** Portal default panel */
    private PortalDefaultPanel portalDefaultPanel = null;

    private List<ListView<MenuItemModelData>> menusList = null;

    /**
     * Error Message Resolver for Portals.<br/>
     */
    private PortalsServiceErrorMessageResolver emrPortals = null;

    @Override
    protected void configMenuPanel(LayoutContainer container) {

        portalName = PmsFactory.getInstance().getPortalViewport().getPortalName();
        menusList = new ArrayList<ListView<MenuItemModelData>>();

        addGeneralAdminItemMenu(container);
        // addDisplayItemMenu(container);
        addComponentsItemMenu(container);
        addPagesItemMenu(container);
        addHelpItemMenu(container);

        // show init widget for portals:
        showInitWidget();
    }

    private void addGeneralAdminItemMenu(LayoutContainer container) {
        adminPanel = new MenuItemLevelOnePanel();
        adminPanel.setHeadingText(getPmsMessages().menuItem1GeneralManagement());
        adminPanel.setIconStyle(getPmsStyles().iconPortalManagement());
        container.add(adminPanel);

        adminMenulist = new ListView<MenuItemModelData>();
        adminMenulist.setBorders(false);
        adminMenulist.setStore(new ListStore<MenuItemModelData>());
        adminMenulist.setSimpleTemplate(getSettings().tplListView());
        adminMenulist.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);

        List<MenuItemModelData> lModels = new LinkedList<MenuItemModelData>();

        // item: Initial widget
        iDefault = new MenuItemModelData(getPmsMessages().menuItem2StartPage(),
                getPmsStyles().iconPortalManagement(), ID_START_PAGE);
        lModels.add(iDefault);

        // item: name and locales
        MenuItemModelData iNames = new MenuItemModelData(getPmsMessages().menuItem2Names(),
                getPmsStyles().iconLocale(), ID_NAMES);
        lModels.add(iNames);

        // item: Portal bases
        MenuItemModelData iBases = new MenuItemModelData(getPmsMessages().labelEditBases(),
                getPmsStyles().iconBases(), ID_BASES);
        lModels.add(iBases);

        // item: Portal properties
        MenuItemModelData iProperties = new MenuItemModelData(getPmsMessages().labelEditProperties(),
                getPmsStyles().iconProperties(), ID_PROPERTIES);
        lModels.add(iProperties);

        // item: Portal management
        iAdmin = new MenuItemModelData(getPmsMessages().menuItem2Parametros(), getStyles().iEdit(), ID_GENERAL_MNT);
        lModels.add(iAdmin);

        // item: Portal 
        MenuItemModelData iconfigurations = new MenuItemModelData(getPmsMessages().menuItem2Configurations(),
                getPmsStyles().iconAdmin(), ID_CONFIGURATIONS_PAGES);
        lModels.add(iconfigurations);

        // item: Parent Portal
        MenuItemModelData iParent = new MenuItemModelData(getPmsMessages().menuItem2ParentPortal(),
                getPmsStyles().iconPortalParent(), ID_PARENT_PORTAL);
        lModels.add(iParent);

        // item: Collections
        MenuItemModelData iCollection = new MenuItemModelData(getPmsMessages().menuItem2Collections(),
                getPmsStyles().iconCollections(), ID_COLLECTIONS);
        lModels.add(iCollection);

        // item: Portal Cache
        MenuItemModelData iCache = new MenuItemModelData(getPmsMessages().menuItem2Cache(),
                getPmsStyles().iconCache(), ID_PORTAL_CACHE);
        lModels.add(iCache);

        // item: Portal Devices
        MenuItemModelData iDevices = new MenuItemModelData(getPmsMessages().menuItem2Devices(),
                getPmsStyles().menuIconDevices(), ID_PORTAL_DEVICES);
        lModels.add(iDevices);

        adminMenulist.getStore().add(lModels);

        adminMenulist.addListener(Events.OnClick, new Listener<ListViewEvent<MenuItemModelData>>() {
            /**
             * <br/>
             * @param be
             */
            public void handleEvent(ListViewEvent<MenuItemModelData> be) {
                if (!be.getListView().getSelectionModel().getSelectedItems().isEmpty()) {
                    String itemId = be.getListView().getSelectionModel().getSelectedItem()
                            .get(MenuItemModelData.PROPERTY_ID);
                    IPmsFactory factory = PmsFactory.getInstance();
                    if (itemId.equals(ID_GENERAL_MNT)) {
                        tryGetPortalTemplate(portalName.getId());
                    } else if (itemId.equals(ID_BASES)) {
                        AvailableBasesWidget widget = factory.getAvailableBasesWidget();
                        widget.init(portalName);
                        tabItemManager.addTabItem(widget, getPmsMessages().headerBasesManagement());
                    } else if (itemId.equals(ID_CONFIGURATIONS_PAGES)) {
                        PortalConfigurationsManagement widget = factory.getPortalConfigurationsManagement();

                        widget.init(portalName);
                        tabItemManager.addTabItem(widget, getPmsMessages().headerPortalConfigurationsTab());
                    } else if (itemId.equals(ID_PROPERTIES)) {
                        AvailablePropertiesWidget widget = factory.getAvailablePropertiesWidget();

                        widget.init(portalName);
                        tabItemManager.addTabItem(widget, getPmsMessages().headerPropertiesManagement());
                    } else if (itemId.equals(ID_START_PAGE)) {
                        showInitWidget();
                    } else if (itemId.equals(ID_NAMES)) {
                        tryGetPortalNames();
                    } else if (itemId.equals(ID_PARENT_PORTAL)) {
                        ParentPortalManagement widget = factory.getParentPortalManagement();
                        widget.init(portalName.getId());
                        tabItemManager.addTabItem(widget, getPmsMessages().menuItem2ParentPortal());
                    } else if (itemId.equals(ID_COLLECTIONS)) {
                        CollectionsManagement widget = factory.getCollectionsManagement();
                        widget.setPortalId(portalName.getId());
                        tabItemManager.addTabItem(widget, getPmsMessages().menuItem2Collections());
                    } else if (itemId.equals(ID_PORTAL_DEVICES)) {
                        PortalDevicesManagement widget = factory.getPortalDevicesManagement();
                        widget.setPortalId(portalName.getId());
                        tabItemManager.addTabItem(widget, getPmsMessages().menuItem2Devices());
                    } else if (itemId.equals(ID_PORTAL_CACHE)) {
                        tryGetPortalCacheInfo();
                    }
                    deselectOthersMenus(adminMenulist);
                }
            }
        });

        adminPanel.add(adminMenulist);
        menusList.add(adminMenulist);
    }

    private void tryGetPortalCacheInfo() {

        getUtil().mask(getPmsMessages().mskPortalCache());

        AsyncCallback<PortalCacheDTO> callback = new AsyncCallback<PortalCacheDTO>() {

            public void onSuccess(PortalCacheDTO result) {
                getUtil().unmask();
                PortalCachePanel widget = PmsFactory.getInstance().getPortalCachePanel();
                widget.initWidget(result);
                widget.show();
            }

            public void onFailure(Throwable caught) {
                getUtil().unmask();
                getUtil().error(getPmsMessages().msgErrorGetPortalCache());
            }
        };
        portalsService.getPortalCache(portalName.getId(), callback);
    }

    /**
     * Shows the portal's init widget. This is the offline preview (if ready) or the default portal widget
     */
    protected void showInitWidget() {

        getUtil().mask(getPmsMessages().mskOfflinePreview());

        AsyncCallback<PortalURLsDTO> callback = new AsyncCallback<PortalURLsDTO>() {
            public void onSuccess(PortalURLsDTO result) {
                PortalPreviewPanel portalPreview = PmsFactory.getInstance().getPortalPreviewWidget();
                portalPreview.setPortalName(portalName);
                portalPreview.setPortalURLs(result);
                tabItemManager.addTabItem(portalPreview, portalName.getName().getDisplayName());
                getUtil().unmask();
            }

            public void onFailure(Throwable caught) {
                tabItemManager.addTabItem(portalDefaultPanel, portalName.getName().getDisplayName());
                getUtil().unmask();
            }
        };
        portalsService.getURLs(portalName.getId(), callback);

        adminMenulist.getSelectionModel().select(iDefault, false);
        deselectOthersMenus(adminMenulist);
        adminPanel.expand();
    }

    /**
     * Calls getNames method from portal service and show names / locales window if success
     */
    private void tryGetPortalNames() {
        getUtil().mask(getPmsMessages().mskPortalNames());
        AsyncCallback<PortalNameDTO> callback = new AsyncCallback<PortalNameDTO>() {

            public void onSuccess(PortalNameDTO result) {
                getUtil().unmask();
                portalName = result;
                PortalNameEditionPanel portalNamePanel = PmsFactory.getInstance().getPortalNameEditionPanel();
                portalNamePanel.initWidget(result);
                portalNamePanel.show();
            }

            public void onFailure(Throwable caught) {
                getUtil().unmask();
                getUtil().error(getPmsMessages().msgErrorRetrievePortalNames());
            }
        };
        portalsService.getName(portalName.getId(), callback);
    }

    @SuppressWarnings("unused")
    private void addDisplayItemMenu(LayoutContainer container) {
        MenuItemLevelOnePanel panel = new MenuItemLevelOnePanel();
        panel.setHeadingText(getPmsMessages().menuItem1Display());
        panel.setIconStyle(getStyles().iPreview());
        container.add(panel);

        final ListView<MenuItemModelData> list = new ListView<MenuItemModelData>();
        list.setBorders(false);
        list.setStore(new ListStore<MenuItemModelData>());
        list.setSimpleTemplate(getSettings().tplListView());
        list.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);

        List<MenuItemModelData> lModels = new LinkedList<MenuItemModelData>();
        // item: display offline
        MenuItemModelData iOffline = new MenuItemModelData(getPmsMessages().menuItem2Offline(),
                getPmsStyles().viewOffline(), ID_OFFLINE);
        lModels.add(iOffline);

        // item: display online
        MenuItemModelData iOnline = new MenuItemModelData(getPmsMessages().menuItem2Online(),
                getPmsStyles().viewOnline(), ID_ONLINE);
        lModels.add(iOnline);

        list.getStore().add(lModels);

        list.addListener(Events.OnClick, new Listener<ListViewEvent<MenuItemModelData>>() {
            /**
             * <br/>
             * @param be
             */
            public void handleEvent(ListViewEvent<MenuItemModelData> be) {
                if (!be.getListView().getSelectionModel().getSelectedItems().isEmpty()) {
                    String itemId = be.getListView().getSelectionModel().getSelectedItem()
                            .get(MenuItemModelData.PROPERTY_ID);
                    if (itemId.equals(ID_OFFLINE)) {
                        tryGetOfflineUrl(portalName.getId(), portalName.getName().getDisplayName());
                    } else if (itemId.equals(ID_ONLINE)) {
                        tryGetOnlineUrl(portalName.getId(), portalName.getName().getDisplayName());
                    }
                    deselectOthersMenus(list);
                }
            }
        });

        panel.add(list);
        menusList.add(list);
    }

    private void addComponentsItemMenu(LayoutContainer container) {

        MenuItemLevelOnePanel panel = new MenuItemLevelOnePanel();
        panel.setHeadingText(getPmsMessages().headerComponentsManagement());
        panel.setIconStyle(getPmsStyles().menuIconComponentsPackages());
        container.add(panel);

        final ListView<MenuItemModelData> list = new ListView<MenuItemModelData>();
        list.setBorders(false);
        list.setStore(new ListStore<MenuItemModelData>());
        list.setSimpleTemplate(getSettings().tplListView());
        list.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);

        List<MenuItemModelData> lModels = new LinkedList<MenuItemModelData>();
        // item: own components
        MenuItemModelData iOwn = new MenuItemModelData(getPmsMessages().menuItem2OwnComponents(),
                getPmsStyles().menuIconGenericPackage(), ID_OWN_COMP);
        lModels.add(iOwn);

        // item: inherited components
        MenuItemModelData iInherited = new MenuItemModelData(getPmsMessages().menuItem2InheritedComponentes(),
                getPmsStyles().menuIconGenericPackage(), ID_INH_COMP);
        lModels.add(iInherited);

        list.getStore().add(lModels);

        list.addListener(Events.OnClick, new Listener<ListViewEvent<MenuItemModelData>>() {
            /**
             * <br/>
             * @param be
             */
            public void handleEvent(ListViewEvent<MenuItemModelData> be) {
                if (!be.getListView().getSelectionModel().getSelectedItems().isEmpty()) {
                    String itemId = be.getListView().getSelectionModel().getSelectedItem()
                            .get(MenuItemModelData.PROPERTY_ID);
                    IPmsFactory factory = PmsFactory.getInstance();
                    if (itemId.equals(ID_OWN_COMP)) {
                        AOwnComponentManagement aoc = factory.getAllOwnComponentManagement();
                        aoc.setPortalNameDTO(portalName);
                        TabItem item = tabItemManager.addTabItem(aoc, getPmsMessages().headerOwnComponentsTab());

                        AOwnComponentManagement eoc = factory.getErrorOwnComponentManagement();
                        eoc.setPortalNameDTO(portalName);
                        tabItemManager.addTabItem(eoc, getPmsMessages().headerErrorComponentsTab(), false);

                        AOwnComponentManagement woc = factory.getWarningOwnComponentManagement();
                        woc.setPortalNameDTO(portalName);
                        tabItemManager.addTabItem(woc, getPmsMessages().headerWarnComponentsTab(), false);

                        AOwnComponentManagement voc = factory.getValidOwnComponentManagement();
                        voc.setPortalNameDTO(portalName);
                        tabItemManager.addTabItem(voc, getPmsMessages().headerValidComponentsTab(), false);

                        tabItemManager.setSelection(item);

                    } else if (itemId.equals(ID_INH_COMP)) {
                        InheritedComponentManagement widget = factory.getInheritedComponentManagement();
                        widget.init(portalName);
                        tabItemManager.addTabItem(widget, getPmsMessages().headerInheritedComponentsTab());
                    }

                    deselectOthersMenus(list);
                }
            }
        });

        panel.add(list);
        menusList.add(list);
    }

    private void addPagesItemMenu(LayoutContainer container) {

        MenuItemLevelOnePanel panel = new MenuItemLevelOnePanel();
        panel.setHeadingText(getPmsMessages().menuItem1Pages());
        panel.setIconStyle(getPmsStyles().iconPage());
        container.add(panel);

        ToolBar pagesToolBar = new ToolBar();
        pagesToolBar.setAlignment(HorizontalAlignment.CENTER);
        panel.setTopComponent(pagesToolBar);
        // create the combo with the page devices
        createPagesDeviceCombo(pagesToolBar);

        // retrieve pages devices when menu is expanded
        panel.addListener(Events.BeforeExpand, new Listener<BaseEvent>() {
            public void handleEvent(BaseEvent be) {
                tryGetPageDevices();
            }
        });

        final ListView<MenuItemModelData> list = new ListView<MenuItemModelData>();
        list.setBorders(false);
        list.setStore(new ListStore<MenuItemModelData>());
        list.setSimpleTemplate(getSettings().tplListView());
        list.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);

        List<MenuItemModelData> lModels = new LinkedList<MenuItemModelData>();
        // item: default pages
        MenuItemModelData iDefaultPages = new MenuItemModelData(getPmsMessages().headerDefaultPagesManagement(),
                getPmsStyles().iconGenericPage(), ID_DEFAULT_PAGES);
        lModels.add(iDefaultPages);

        // item: templates
        MenuItemModelData iTemplates = new MenuItemModelData(getPmsMessages().headerTemplatePagesManagement(),
                getPmsStyles().iconGenericPage(), ID_TEMPLATES);
        lModels.add(iTemplates);

        // item: special pages
        MenuItemModelData iSpecialPages = new MenuItemModelData(getPmsMessages().headerSpecialPagesManagement(),
                getPmsStyles().iconGenericPage(), ID_SPECIAL_PAGES);
        lModels.add(iSpecialPages);

        // item: category pages
        MenuItemModelData iCategoryPages = new MenuItemModelData(getPmsMessages().headerCategoryPagesManagement(),
                getPmsStyles().iconGenericPage(), ID_CATEGORY_PAGES);
        lModels.add(iCategoryPages);

        // item: content pages
        MenuItemModelData iContentPages = new MenuItemModelData(getPmsMessages().headerContentPagesManagement(),
                getPmsStyles().iconGenericPage(), ID_CONTENT_PAGES);
        lModels.add(iContentPages);

        // item: content list pages
        MenuItemModelData iContentListPages = new MenuItemModelData(
                getPmsMessages().headerContentTypePagesManagement(), getPmsStyles().iconGenericPage(),
                ID_CONTENT_LIST_PAGES);
        lModels.add(iContentListPages);

        // item: error pages
        MenuItemModelData iErrorPages = new MenuItemModelData(getPmsMessages().headerErrorPagesManagement(),
                getPmsStyles().iconGenericPage(), ID_ERROR_PAGES);
        lModels.add(iErrorPages);

        list.getStore().add(lModels);

        list.addListener(Events.OnClick, new Listener<ListViewEvent<MenuItemModelData>>() {
            /**
             * <br/>
             * @param be
             */
            public void handleEvent(ListViewEvent<MenuItemModelData> be) {
                if (!be.getListView().getSelectionModel().getSelectedItems().isEmpty()) {
                    String itemId = be.getListView().getSelectionModel().getSelectedItem()
                            .get(MenuItemModelData.PROPERTY_ID);
                    IPmsFactory factory = PmsFactory.getInstance();
                    if (itemId.equals(ID_DEFAULT_PAGES)) {
                        DefaultPagesManagement widget = factory.getDefaultPagesManagement();
                        widget.init(portalName, currentDevice);
                        tabItemManager.addTabItem(widget, getPmsMessages().headerDefaultPagesManagement());

                    } else if (itemId.equals(ID_TEMPLATES)) {
                        TemplatePagesManagement widget = factory.getTemplatePagesManagement();
                        widget.init(portalName, currentDevice);
                        tabItemManager.addTabItem(widget, getPmsMessages().headerTemplatePagesManagement());

                    } else if (itemId.equals(ID_SPECIAL_PAGES)) {
                        SpecialPagesManagement widget = factory.getSpecialPagesManagement();
                        widget.init(portalName, currentDevice);
                        tabItemManager.addTabItem(widget, getPmsMessages().headerSpecialPagesManagement());

                    } else if (itemId.equals(ID_CATEGORY_PAGES)) {
                        CategoryPagesManagement widget = factory.getCategoryPagesManagement();
                        widget.init(portalName, currentDevice);
                        tabItemManager.addTabItem(widget, getPmsMessages().headerCategoryPagesManagement());

                    } else if (itemId.equals(ID_CONTENT_PAGES)) {
                        ContentPagesManagement widget = factory.getContentPagesManagement();
                        widget.init(portalName, currentDevice);
                        tabItemManager.addTabItem(widget, getPmsMessages().headerContentPagesManagement());

                    } else if (itemId.equals(ID_CONTENT_LIST_PAGES)) {
                        ContentTypePagesManagement widget = factory.getContentTypePagesManagement();
                        widget.init(portalName, currentDevice);
                        tabItemManager.addTabItem(widget, getPmsMessages().headerContentTypePagesManagement());

                    } else if (itemId.equals(ID_ERROR_PAGES)) {
                        ErrorPagesManagement widget = factory.getErrorPagesManagement();
                        widget.init(portalName, currentDevice);
                        tabItemManager.addTabItem(widget, getPmsMessages().headerErrorPagesManagement());
                    }
                    deselectOthersMenus(list);
                }
            }
        });

        panel.add(list);
        menusList.add(list);
    }

    private void addHelpItemMenu(LayoutContainer container) {

        MenuItemLevelOnePanel panel = new MenuItemLevelOnePanel();
        panel.setHeadingText(getPmsMessages().menuItem1Help());
        panel.setIconStyle(getPmsStyles().menuIconHelp());
        container.add(panel);

        final ListView<MenuItemModelData> list = new ListView<MenuItemModelData>();
        list.setBorders(false);
        list.setStore(new ListStore<MenuItemModelData>());
        list.setSimpleTemplate(getSettings().tplListView());
        list.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);

        List<MenuItemModelData> lModels = new LinkedList<MenuItemModelData>();
        // item: watch handbook in an iframe
        MenuItemModelData iWatchHelp = new MenuItemModelData(getPmsMessages().menuItem2WatchHandbook(),
                getPmsStyles().menuIconHelp(), ID_WATCH_HELP);
        lModels.add(iWatchHelp);

        // item: open handbook in a new window
        MenuItemModelData iOpenHelp = new MenuItemModelData(getPmsMessages().menuItem2OpenHandbook(),
                getPmsStyles().menuIconHelp(), ID_OPEN_HELP);
        lModels.add(iOpenHelp);

        list.getStore().add(lModels);

        list.addListener(Events.OnClick, new Listener<ListViewEvent<MenuItemModelData>>() {
            /**
             * <br/>
             * @param be
             */
            public void handleEvent(ListViewEvent<MenuItemModelData> be) {
                if (!be.getListView().getSelectionModel().getSelectedItems().isEmpty()) {
                    String itemId = be.getListView().getSelectionModel().getSelectedItem()
                            .get(MenuItemModelData.PROPERTY_ID);
                    IPmsFactory factory = PmsFactory.getInstance();
                    if (itemId.equals(ID_WATCH_HELP)) {
                        // open tab panel with the Pms portals handbook in a iframe
                        IframePanel iframe = factory.getIframePanel();
                        iframe.setIframeUrl(getSettings().pmsPortalsAdminManualUrl());
                        tabItemManager.addTabItem(iframe, getPmsMessages().headerPmsHandbook());
                    } else if (itemId.equals(ID_OPEN_HELP)) {
                        // open Pms handbook in a new window
                        Window.open(getSettings().pmsPortalsAdminManualUrl(), getPmsMessages().headerPmsHandbook(),
                                PmsConstants.NEW_WINDOW_FEATURES);
                    }

                    deselectOthersMenus(list);
                }
            }
        });

        panel.add(list);
        menusList.add(list);
    }

    /**
     * Creates the combo with the page devices
     * @param pagesToolBar
     * @return the ComboBox with the pages devices
     */
    private void createPagesDeviceCombo(ToolBar pagesToolBar) {
        cbDevices = new ComboBox<PageDeviceModelData>();
        cbDevices.setTriggerAction(TriggerAction.ALL);
        cbDevices.setEditable(false);
        IconButton filterBtn = new IconButton(getPmsStyles().menuIconDevices());
        filterBtn.setWidth(20);
        cbDevices.setDisplayField(PageDeviceModelData.PROPERTY_DISPLAY_NAME);
        ListStore<PageDeviceModelData> stPageDevices = new ListStore<PageDeviceModelData>();
        cbDevices.setStore(stPageDevices);

        cbDevices.addSelectionChangedListener(new SelectionChangedListener<PageDeviceModelData>() {
            @Override
            public void selectionChanged(SelectionChangedEvent<PageDeviceModelData> se) {
                PageDeviceModelData device = se.getSelectedItem();
                if (device != null) {
                    currentDevice = device;
                }
            }
        });

        pagesToolBar.add(filterBtn);
        pagesToolBar.add(cbDevices);
    }

    /**
     * Preview the portal in offline mode
     * @param portalId
     * @param name
     */
    private void tryGetOfflineUrl(String portalId, final String name) {

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable arg0) {
                errorProcessor.processError(arg0, errorMessageResolver,
                        getPmsMessages().msgErrorGetPortalOfflineUrl(name));
            }

            public void onSuccess(String arg0) {
                Window.open(arg0, name, PmsConstants.NEW_WINDOW_FEATURES);
            }
        };

        portalsService.getOfflineURL(portalId, callback);
    }

    /**
     * Preview the portal in online mode
     * @param portalId
     * @param name
     */
    private void tryGetOnlineUrl(String portalId, final String name) {

        AsyncCallback<String> callback = new AsyncCallback<String>() {
            public void onFailure(Throwable arg0) {
                errorProcessor.processError(arg0, errorMessageResolver,
                        getPmsMessages().msgErrorGetPortalOnlineUrl(name));
            }

            public void onSuccess(String arg0) {
                Window.open(arg0, name, PmsConstants.NEW_WINDOW_FEATURES);
            }
        };

        portalsService.getOnlineURL(portalId, callback);
    }

    private void deselectOthersMenus(ListView<MenuItemModelData> list) {
        for (ListView<MenuItemModelData> l : menusList) {
            if (!l.equals(list)) {
                l.getSelectionModel().deselectAll();
            }
        }
    }

    private void tryGetPortalTemplate(String portalId) {

        // retrieve the portal template:
        AsyncCallback<PortalTemplateDTO> portalCallback = new AsyncCallback<PortalTemplateDTO>() {
            public void onFailure(Throwable arg0) {
                MessageBox
                        .alert(getMessages().headerErrorWindow(),
                                emrPortals.getMessage(arg0, getPmsMessages().msgErrorGetPortal()), null)
                        .setModal(true);
            }

            public void onSuccess(PortalTemplateDTO arg0) {
                PortalEditionPropertiesPanel widget = PmsFactory.getInstance().getPortalEditionPropertiesPanel();
                widget.init(arg0, portalName.getName().getDisplayName());
                widget.show();
            }
        };
        portalsService.get(portalId, portalCallback);
    }

    /**
     * Tries to get the pages device for this portal and stores them in a ComboBox
     */
    private void tryGetPageDevices() {

        final ListStore<PageDeviceModelData> stPageDevices = cbDevices.getStore();
        stPageDevices.removeAll();

        AsyncCallback<List<PageDeviceDTO>> callback = new AsyncCallback<List<PageDeviceDTO>>() {

            public void onSuccess(List<PageDeviceDTO> result) {
                List<PageDeviceModelData> models = new ArrayList<PageDeviceModelData>();
                for (PageDeviceDTO device : result) {
                    models.add(new PageDeviceModelData(device));
                }
                stPageDevices.add(models);
                PageDeviceModelData defaultDevice = stPageDevices.findModel(PageDeviceModelData.PROPERTY_DEFAULT,
                        true);
                cbDevices.setValue(defaultDevice);
                currentDevice = defaultDevice;
            }

            public void onFailure(Throwable caught) {
                getUtil().error(getPmsMessages().msgErrorRetrieveDevices());
            }
        };
        pagesService.getPageDevices(portalName.getId(), callback);
    }

    public boolean isInitialized() {
        return false;
    }

    /**
     * @param tabItemManager the tabItemManager to set
     */
    @Inject
    public void setTabItemManager(PortalTabItemManager tabItemManager) {
        this.tabItemManager = tabItemManager;
    }

    /**
     * @param errorProcessor the errorProcessor to set
     */
    @Inject
    public void setErrorProcessor(ServiceErrorsProcessor errorProcessor) {
        this.errorProcessor = errorProcessor;
    }

    /**
     * @param portalsService the portalsService to set
     */
    @Inject
    public void setPortalsService(IPortalsServiceAsync portalsService) {
        this.portalsService = portalsService;
    }

    /**
     * @param errorMessageResolver the errorMessageResolver to set
     */
    @Inject
    public void setErrorMessageResolver(PortalsServiceErrorMessageResolver errorMessageResolver) {
        this.errorMessageResolver = errorMessageResolver;
    }

    /**
     * @param portalName the portalName to set
     */
    public void setPortalName(PortalNameDTO portalName) {
        this.portalName = portalName;
    }

    /**
     * @param portalDefaultPanel the portalDefaultPanel to set
     */
    @Inject
    public void setPortalDefaultPanel(PortalDefaultPanel portalDefaultPanel) {
        this.portalDefaultPanel = portalDefaultPanel;
    }

    /**
     * Injects the Error Message Resolver for Portals service.
     * @param emrPortals the emrPortals to set
     */
    @Inject
    public void setEmrPortals(PortalsServiceErrorMessageResolver emrPortals) {
        this.emrPortals = emrPortals;
    }

    /**
     * @param pagesService the pagesService to set
     */
    @Inject
    public void setPagesService(IPagesServiceAsync pagesService) {
        this.pagesService = pagesService;
    }
}