org.opencms.ade.containerpage.client.CmsContainerpageEditor.java Source code

Java tutorial

Introduction

Here is the source code for org.opencms.ade.containerpage.client.CmsContainerpageEditor.java

Source

/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com)
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * 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.
 *
 * For further information about Alkacon Software, please see the
 * company website: http://www.alkacon.com
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.opencms.ade.containerpage.client;

import org.opencms.ade.containerpage.client.ui.CmsAddToFavoritesButton;
import org.opencms.ade.containerpage.client.ui.CmsContainerPageElementPanel;
import org.opencms.ade.containerpage.client.ui.CmsToolbarClipboardMenu;
import org.opencms.ade.containerpage.client.ui.CmsToolbarEditButton;
import org.opencms.ade.containerpage.client.ui.CmsToolbarGalleryMenu;
import org.opencms.ade.containerpage.client.ui.CmsToolbarMoveButton;
import org.opencms.ade.containerpage.client.ui.CmsToolbarPublishButton;
import org.opencms.ade.containerpage.client.ui.CmsToolbarRemoveButton;
import org.opencms.ade.containerpage.client.ui.CmsToolbarResetButton;
import org.opencms.ade.containerpage.client.ui.CmsToolbarSaveButton;
import org.opencms.ade.containerpage.client.ui.CmsToolbarSelectionButton;
import org.opencms.ade.containerpage.client.ui.CmsToolbarSettingsButton;
import org.opencms.ade.containerpage.client.ui.CmsToolbarSitemapButton;
import org.opencms.ade.containerpage.client.ui.css.I_CmsLayoutBundle;
import org.opencms.gwt.client.A_CmsEntryPoint;
import org.opencms.gwt.client.CmsCoreProvider;
import org.opencms.gwt.client.CmsPingTimer;
import org.opencms.gwt.client.dnd.CmsDNDHandler;
import org.opencms.gwt.client.ui.CmsPopup;
import org.opencms.gwt.client.ui.CmsPushButton;
import org.opencms.gwt.client.ui.CmsToolbar;
import org.opencms.gwt.client.ui.CmsToolbarContextButton;
import org.opencms.gwt.client.ui.I_CmsButton.ButtonStyle;
import org.opencms.gwt.client.ui.I_CmsButton.Size;
import org.opencms.gwt.client.ui.I_CmsToolbarButton;
import org.opencms.gwt.client.ui.contextmenu.I_CmsContextMenuCommand;
import org.opencms.gwt.client.ui.contextmenu.I_CmsContextMenuCommandInitializer;
import org.opencms.gwt.client.ui.css.I_CmsImageBundle;
import org.opencms.gwt.client.util.CmsDebugLog;
import org.opencms.gwt.client.util.CmsDomUtil;
import org.opencms.gwt.client.util.CmsStyleVariable;
import org.opencms.util.CmsStringUtil;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.RepeatingCommand;
import com.google.gwt.dom.client.Style.Overflow;
import com.google.gwt.dom.client.Style.Position;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;

/**
 * The container page editor.<p>
 * 
 * @since 8.0.0
 */
public class CmsContainerpageEditor extends A_CmsEntryPoint {

    /** Margin-top added to the document body element when the tool-bar is shown. */
    //    private int m_bodyMarginTop;

    /** The Z index manager. */
    private static final I_CmsContainerZIndexManager Z_INDEX_MANAGER = GWT
            .create(I_CmsContainerZIndexManager.class);

    /** Style to toggle toolbar visibility. */
    protected CmsStyleVariable m_toolbarVisibility;

    /** Add menu. */
    private CmsToolbarGalleryMenu m_add;

    /** Add to favorites button. */
    private CmsAddToFavoritesButton m_addToFavorites;

    /** Clip-board menu. */
    private CmsToolbarClipboardMenu m_clipboard;

    /** The Button for the context menu. */
    private CmsToolbarContextButton m_context;

    /** The available context menu commands. */
    private Map<String, I_CmsContextMenuCommand> m_contextMenuCommands;

    /** Edit button. */
    private CmsToolbarEditButton m_edit;

    /** Move button. */
    private CmsToolbarMoveButton m_move;

    /** Properties button. */
    private CmsToolbarSettingsButton m_properties;

    /** Publish button. */
    private CmsToolbarPublishButton m_publish;

    /** Remove button. */
    private CmsToolbarRemoveButton m_remove;

    /** Reset button. */
    private CmsToolbarResetButton m_reset;

    /** Save button. */
    private CmsToolbarSaveButton m_save;

    /** Selection button. */
    private CmsToolbarSelectionButton m_selection;

    /** Sitemap button. */
    private CmsToolbarSitemapButton m_sitemap;

    /** The tool-bar. */
    private CmsToolbar m_toolbar;

    /** 
     * Returns the Z index manager for the container page editor.<p> 
     * 
     * @return the Z index manager
     **/
    public static I_CmsContainerZIndexManager getZIndexManager() {

        return Z_INDEX_MANAGER;
    }

    private static void openMessageDialog(String title, String displayHtmlContent) {

        HTMLPanel content = new HTMLPanel(displayHtmlContent);
        content.getElement().getStyle().setOverflow(Overflow.AUTO);
        content.getElement().getStyle().setPosition(Position.RELATIVE);
        CmsPopup dialog = new CmsPopup(title, content);
        content.getElement().getStyle().setProperty("maxHeight", dialog.getAvailableHeight(100), Unit.PX);
        dialog.setWidth(-1);
        dialog.addDialogClose(null);
        dialog.centerHorizontally(100);
    }

    /**
     * Disables the edit functionality.<p>
     * 
     * @param reason the text stating the reason why the edit functionality was disabled 
     */
    public void disableEditing(String reason) {

        reinitializeButtons();
        m_save.disable(reason);
    }

    /**
     * Returns the add gallery menu.<p>
     *
     * @return the add gallery menu
     */
    public CmsToolbarGalleryMenu getAdd() {

        return m_add;
    }

    /**
     * Returns the clip-board menu.<p>
     *
     * @return the clip-board menu
     */
    public CmsToolbarClipboardMenu getClipboard() {

        return m_clipboard;
    }

    /**
     * Returns the context menu.<p>
     *
     * @return the context menu
     */
    public CmsToolbarContextButton getContext() {

        return m_context;
    }

    /**
     * Returns the available context menu commands as a map by class name.<p>
     * 
     * @return the available context menu commands as a map by class name
     */
    public Map<String, I_CmsContextMenuCommand> getContextMenuCommands() {

        if (m_contextMenuCommands == null) {
            I_CmsContextMenuCommandInitializer initializer = GWT.create(I_CmsContextMenuCommandInitializer.class);
            m_contextMenuCommands = initializer.initCommands();
        }
        return m_contextMenuCommands;
    }

    /**
     * Returns the publish.<p>
     *
     * @return the publish
     */
    public CmsToolbarPublishButton getPublish() {

        return m_publish;
    }

    /**
     * Returns the reset button.<p>
     *
     * @return the reset button
     */
    public CmsToolbarResetButton getReset() {

        return m_reset;
    }

    /**
     * Returns the save button.<p>
     *
     * @return the save button
     */
    public CmsToolbarSaveButton getSave() {

        return m_save;
    }

    /**
     * Returns the selection button.<p>
     *
     * @return the selection button
     */
    public CmsToolbarSelectionButton getSelection() {

        return m_selection;
    }

    /**
     * Returns the tool-bar widget.<p>
     * 
     * @return the tool-bar widget
     */
    public CmsToolbar getToolbar() {

        return m_toolbar;
    }

    /**
     * Returns if the tool-bar is visible.<p>
     * 
     * @return <code>true</code> if the tool-bar is visible
     */
    public boolean isToolbarVisible() {

        return !org.opencms.gwt.client.ui.css.I_CmsLayoutBundle.INSTANCE.toolbarCss().toolbarHide()
                .equals(m_toolbarVisibility.getValue());
    }

    /**
     * @see com.google.gwt.core.client.EntryPoint#onModuleLoad()
     */
    @Override
    public void onModuleLoad() {

        super.onModuleLoad();
        if (!checkBuildId("org.opencms.ade.containerpage")) {
            return;
        }
        CmsPingTimer.start();
        JavaScriptObject window = CmsDomUtil.getWindow();
        CmsDomUtil.setAttribute(window, "__hideEditorCloseButton", "true");
        I_CmsLayoutBundle.INSTANCE.containerpageCss().ensureInjected();
        I_CmsLayoutBundle.INSTANCE.dragdropCss().ensureInjected();
        I_CmsLayoutBundle.INSTANCE.groupcontainerCss().ensureInjected();

        final CmsContainerpageController controller = new CmsContainerpageController();
        final CmsContainerpageHandler containerpageHandler = new CmsContainerpageHandler(controller, this);
        CmsContentEditorHandler contentEditorHandler = new CmsContentEditorHandler(containerpageHandler);
        CmsContainerpageDNDController dndController = new CmsContainerpageDNDController(controller);
        CmsDNDHandler dndHandler = new CmsDNDHandler(dndController);

        ClickHandler clickHandler = new ClickHandler() {

            /**
             * @see com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event.dom.client.ClickEvent)
             */
            public void onClick(ClickEvent event) {

                I_CmsToolbarButton source = (I_CmsToolbarButton) event.getSource();
                source.onToolbarClick();
            }
        };

        //        m_bodyMarginTop = CmsDomUtil.getCurrentStyleInt(Document.get().getBody(), Style.marginTop);
        m_toolbar = new CmsToolbar();
        RootPanel root = RootPanel.get();
        root.add(m_toolbar);
        CmsPushButton toggleToolbarButton = new CmsPushButton();
        toggleToolbarButton.setButtonStyle(ButtonStyle.TEXT, null);
        toggleToolbarButton.setSize(Size.small);
        toggleToolbarButton.setImageClass(I_CmsImageBundle.INSTANCE.style().opencmsSymbol());
        toggleToolbarButton.removeStyleName(
                org.opencms.gwt.client.ui.css.I_CmsLayoutBundle.INSTANCE.generalCss().buttonCornerAll());
        toggleToolbarButton
                .addStyleName(org.opencms.gwt.client.ui.css.I_CmsLayoutBundle.INSTANCE.generalCss().cornerAll());
        root.add(toggleToolbarButton);
        toggleToolbarButton.addClickHandler(new ClickHandler() {

            /**
             * @see com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event.dom.client.ClickEvent)
             */
            public void onClick(ClickEvent event) {

                containerpageHandler.toggleToolbar();
            }

        });
        toggleToolbarButton.addStyleName(I_CmsLayoutBundle.INSTANCE.containerpageCss().toolbarToggle());

        m_save = new CmsToolbarSaveButton(containerpageHandler);
        m_save.addClickHandler(clickHandler);
        m_toolbar.addLeft(m_save);

        m_publish = new CmsToolbarPublishButton(containerpageHandler);
        m_publish.addClickHandler(clickHandler);
        m_toolbar.addLeft(m_publish);

        m_move = new CmsToolbarMoveButton(containerpageHandler, dndHandler);

        m_edit = new CmsToolbarEditButton(containerpageHandler);

        m_addToFavorites = new CmsAddToFavoritesButton(containerpageHandler);

        m_remove = new CmsToolbarRemoveButton(containerpageHandler);

        m_properties = new CmsToolbarSettingsButton(containerpageHandler);

        m_clipboard = new CmsToolbarClipboardMenu(containerpageHandler);
        m_clipboard.addClickHandler(clickHandler);
        m_toolbar.addLeft(m_clipboard);

        m_add = new CmsToolbarGalleryMenu(containerpageHandler, dndHandler);
        m_add.addClickHandler(clickHandler);
        m_toolbar.addLeft(m_add);

        m_selection = new CmsToolbarSelectionButton(containerpageHandler);
        m_selection.addClickHandler(clickHandler);
        m_toolbar.addLeft(m_selection);

        m_context = new CmsToolbarContextButton(containerpageHandler);
        m_context.addClickHandler(clickHandler);
        m_toolbar.addRight(m_context);

        m_sitemap = new CmsToolbarSitemapButton(containerpageHandler);
        m_sitemap.addClickHandler(clickHandler);
        m_toolbar.addRight(m_sitemap);

        if (CmsStringUtil.isEmptyOrWhitespaceOnly(controller.getData().getSitemapUri())) {
            m_sitemap.setEnabled(false);
        }

        m_reset = new CmsToolbarResetButton(containerpageHandler);
        m_reset.addClickHandler(clickHandler);
        m_toolbar.addRight(m_reset);
        containerpageHandler.enableSaveReset(false);
        m_toolbarVisibility = new CmsStyleVariable(root);
        m_toolbarVisibility
                .setValue(org.opencms.gwt.client.ui.css.I_CmsLayoutBundle.INSTANCE.toolbarCss().toolbarHide());
        if (CmsCoreProvider.get().isToolbarVisible()) {
            showToolbar(true);
            containerpageHandler.activateSelection();
        }

        CmsContainerpageUtil containerpageUtil = new CmsContainerpageUtil(controller, m_selection, m_move, m_edit,
                m_remove, m_properties, m_addToFavorites);
        controller.init(containerpageHandler, dndHandler, contentEditorHandler, containerpageUtil);

        // export open stack trace dialog function
        exportStacktraceDialogMethod();
        Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {

            public boolean execute() {

                updateAllElements();
                return true;
            }
        }, 1000);
    }

    /**
     * Reinitializes the buttons in the container element menus.<p>
     */
    public void reinitializeButtons() {

        List<CmsContainerPageElementPanel> elemWidgets = getAllContainerPageElements();
        for (CmsContainerPageElementPanel elemWidget : elemWidgets) {
            CmsContainerpageController.get().getContainerpageUtil().addOptionBar(elemWidget);
        }
    }

    /**
     * Shows the tool-bar.<p>
     * 
     * @param show if <code>true</code> the tool-bar will be shown
     */
    public void showToolbar(boolean show) {

        CmsToolbar.showToolbar(m_toolbar, show, m_toolbarVisibility);
    }

    /**
     * Perform layout corrections for the current container elements.<p>
     */
    public void updateAllElements() {

        List<CmsContainerPageElementPanel> pageElements = getAllContainerPageElements();
        for (CmsContainerPageElementPanel pageElement : pageElements) {
            pageElement.update();
        }
    }

    /**
     * Helper method to get all current container page elements.<p>
     * 
     * @return the list of current container page elements 
     */
    protected List<CmsContainerPageElementPanel> getAllContainerPageElements() {

        List<CmsContainerPageElementPanel> elemWidgets = new ArrayList<CmsContainerPageElementPanel>();
        for (Entry<String, org.opencms.ade.containerpage.client.ui.CmsContainerPageContainer> entry : CmsContainerpageController
                .get().getContainerTargets().entrySet()) {
            Iterator<Widget> elIt = entry.getValue().iterator();
            while (elIt.hasNext()) {
                try {
                    org.opencms.ade.containerpage.client.ui.CmsContainerPageElementPanel elementWidget = (org.opencms.ade.containerpage.client.ui.CmsContainerPageElementPanel) elIt
                            .next();
                    elemWidgets.add(elementWidget);
                } catch (ClassCastException e) {
                    // no proper container element, skip it (this should never happen!)
                    CmsDebugLog.getInstance()
                            .printLine("WARNING: there is an inappropriate element within a container");
                }
            }
        }
        return elemWidgets;
    }

    private native void exportStacktraceDialogMethod() /*-{
                                                       $wnd.__openStacktraceDialog = function(event) {
                                                       event = (event) ? event : ((window.event) ? window.event : "");
                                                       var elem = (event.target) ? event.target : event.srcElement;
                                                       if (elem != null) {
                                                       var children = elem.getElementsByTagName("span");
                                                       if (children.length > 0) {
                                                       var title = children[0].getAttribute("title");
                                                       var content = children[0].innerHTML;
                                                       @org.opencms.ade.containerpage.client.CmsContainerpageEditor::openMessageDialog(Ljava/lang/String;Ljava/lang/String;)(title,content);
                                                       }
                                                       }
                                                       }
                                                       }-*/;

}