org.opencms.ade.publish.client.CmsPublishDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.opencms.ade.publish.client.CmsPublishDialog.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.publish.client;

import org.opencms.ade.publish.shared.CmsPublishData;
import org.opencms.ade.publish.shared.CmsPublishGroup;
import org.opencms.ade.publish.shared.CmsPublishOptions;
import org.opencms.ade.publish.shared.CmsPublishResource;
import org.opencms.ade.publish.shared.rpc.I_CmsPublishService;
import org.opencms.ade.publish.shared.rpc.I_CmsPublishServiceAsync;
import org.opencms.gwt.client.CmsCoreProvider;
import org.opencms.gwt.client.rpc.CmsRpcAction;
import org.opencms.gwt.client.ui.CmsPopup;
import org.opencms.gwt.client.ui.CmsPushButton;
import org.opencms.util.CmsUUID;

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

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.DeckPanel;
import com.google.gwt.user.client.ui.PopupPanel;

/**
 * 
 * Main class for the publish dialog.<p>
 * 
 * This class is mostly responsible for the control flow and RPC calls of the publish dialog.
 * It delegates most of the actual GUI work to the {@link CmsPublishSelectPanel} and {@link CmsBrokenLinksPanel} classes.
 * 
 * @since 8.0.0
 * 
 */
public class CmsPublishDialog extends CmsPopup {

    /**
     * The action for publishing and/or removing resources from the publish list.<p>
     */
    private class CmsPublishAction extends CmsRpcAction<List<CmsPublishResource>> {

        /** If true, try to ignore broken links when publishing. */
        private boolean m_force;

        /** Creates a new instance of this action. 
         * 
         * @param force if true, try to ignore broken links when publishing
         */
        public CmsPublishAction(boolean force) {

            m_force = force;
        }

        /**
         * @see org.opencms.gwt.client.rpc.CmsRpcAction#execute()
         */
        @Override
        public void execute() {

            setLoadingMessage(Messages.get().key(Messages.GUI_PUBLISHING_0));
            start(0, true);
            List<CmsUUID> resourcesToPublish = new ArrayList<CmsUUID>(m_publishSelectPanel.getResourcesToPublish());
            List<CmsUUID> resourcesToRemove = new ArrayList<CmsUUID>(m_publishSelectPanel.getResourcesToRemove());
            getService().publishResources(resourcesToPublish, resourcesToRemove, m_force, this);
        }

        /**
         * @see org.opencms.gwt.client.rpc.CmsRpcAction#onResponse(java.lang.Object)
         */
        @Override
        protected void onResponse(List<CmsPublishResource> result) {

            onReceiveStatus(result);
            stop(true);
        }
    }

    /**
     * The action for loading the publish list.<p>
     */
    private class CmsPublishListAction extends CmsRpcAction<List<CmsPublishGroup>> {

        /** The publish list options which should be used. */
        private CmsPublishOptions m_options;

        /**
         * Creates a new publish list action.<p>
         * 
         * @param options the publish list options which should be used 
         */
        public CmsPublishListAction(CmsPublishOptions options) {

            m_options = options;
        }

        /**
         * @see org.opencms.gwt.client.rpc.CmsRpcAction#execute()
         */
        @Override
        public void execute() {

            start(0, true);
            getService().getPublishGroups(m_options, this);
        }

        /**
         * @see org.opencms.gwt.client.rpc.CmsRpcAction#onResponse(java.lang.Object)
         */
        @Override
        protected void onResponse(List<CmsPublishGroup> result) {

            onReceivePublishList(result);
            stop(false);
        }
    }

    /** The dialog width in pixels. */
    public static final int DIALOG_WIDTH = 766;

    /** The project map used by showPublishDialog. */
    public static Map<String, String> m_staticProjects;

    /** The CSS bundle used for this widget. */
    private static final I_CmsPublishCss CSS = I_CmsPublishLayoutBundle.INSTANCE.publishCss();

    /** The index of the "broken links" panel. */
    private static final int PANEL_BROKEN_LINKS = 1;

    /** The index of the publish selection panel. */
    private static final int PANEL_SELECT = 0;

    /** The publish service instance. */
    private static I_CmsPublishServiceAsync SERVICE;

    /** The panel for selecting the resources to publish or remove from the publish list. */
    protected CmsPublishSelectPanel m_publishSelectPanel;

    /** The panel for showing the links that would be broken by publishing. */
    private CmsBrokenLinksPanel m_brokenLinksPanel;

    /** The root panel of this dialog which contains both the selection panel and the panel for displaying broken links. */
    private DeckPanel m_panel = new DeckPanel();

    /**
     * Constructs a new publish dialog.<p>
     * 
     * @param initData the initial data 
     */
    public CmsPublishDialog(CmsPublishData initData) {

        super(Messages.get().key(Messages.GUI_PUBLISH_DIALOG_TITLE_0), 800);
        setGlassEnabled(true);
        setAutoHideEnabled(false);
        setModal(true);
        addStyleName(CSS.publishDialog());

        m_publishSelectPanel = new CmsPublishSelectPanel(this, initData.getProjects(), initData.getOptions());
        m_brokenLinksPanel = new CmsBrokenLinksPanel(this, initData.isCanPublishBrokenRelations());

        addDialogClose(null);

        m_panel = new DeckPanel();
        m_panel.add(m_publishSelectPanel);
        m_panel.add(m_brokenLinksPanel);
        setMainContent(m_panel);

        setPanel(PANEL_SELECT);
        onReceivePublishList(initData.getGroups());
    }

    /**
     * Convenience method which opens a publish dialog.<p>
     */
    public static void showPublishDialog() {

        showPublishDialog(null);
    }

    /**
     * Convenience method which opens a publish dialog.<p>
     * 
     * @param handler the close handler
     */
    public static void showPublishDialog(final CloseHandler<PopupPanel> handler) {

        (new CmsRpcAction<CmsPublishData>() {

            /**
             * @see org.opencms.gwt.client.rpc.CmsRpcAction#execute()
             */
            @Override
            public void execute() {

                start(0, true);
                getService().getInitData(this);
            }

            /**
             * @see org.opencms.gwt.client.rpc.CmsRpcAction#onResponse(java.lang.Object)
             */
            @Override
            protected void onResponse(final CmsPublishData result) {

                CmsPublishDialog publishDialog = new CmsPublishDialog(result);
                if (handler != null) {
                    publishDialog.addCloseHandler(handler);
                }
                stop(false);
                publishDialog.centerHorizontally(100);
                // replace current notification widget by overlay
                publishDialog.catchNotifications();
            }
        }).execute();
    }

    /**
     * Returns the publish service instance.<p>
     * 
     * @return the publish service instance
     */
    protected static I_CmsPublishServiceAsync getService() {

        if (SERVICE == null) {
            SERVICE = GWT.create(I_CmsPublishService.class);
            String serviceUrl = CmsCoreProvider.get().link("org.opencms.ade.publish.CmsPublishService.gwt");
            ((ServiceDefTarget) SERVICE).setServiceEntryPoint(serviceUrl);
        }
        return SERVICE;
    }

    /**
     * Ensures all style sheets are loaded.<p>
     */
    public void initCss() {

        I_CmsPublishLayoutBundle.INSTANCE.publishCss().ensureInjected();
    }

    /**
     * Method which is called when the cancel button is pressed.<p>
     */
    public void onCancel() {

        hide();
    }

    /**
     * Method which is called when the publish options are changed.<p>
     */
    public void onChangeOptions() {

        CmsPublishOptions options = m_publishSelectPanel.getPublishOptions();
        (new CmsPublishListAction(options)).execute();
    }

    /**
     * Method which is  called when the back button is pressed.<p>
     */
    public void onGoBack() {

        setPanel(PANEL_SELECT);
    }

    /**
     * Method which is called after the publish list has been received from the server.<p>
     * 
     * @param groups the groups of the publish list
     */
    public void onReceivePublishList(List<CmsPublishGroup> groups) {

        m_publishSelectPanel.setGroups(groups, true);
        setPanel(PANEL_SELECT);
        if (!isVisible()) {
            center();
        }
    }

    /**
     * Method which is called after the status from a publish action has arrived.<p>
     * 
     * @param brokenResources the list of broken resources
     */
    public void onReceiveStatus(List<CmsPublishResource> brokenResources) {

        if (brokenResources.isEmpty()) {
            hide();
        } else {
            m_brokenLinksPanel.setEntries(brokenResources);
            setPanel(PANEL_BROKEN_LINKS);
        }
    }

    /**
     * Method which is called when the "force publish" button is pressed.<p>    
     */
    public void onRequestForcePublish() {

        (new CmsPublishAction(true)).execute();
    }

    /**
     * Method which is called when the publish button is pressed.<p>     
     */
    public void onRequestPublish() {

        (new CmsPublishAction(false)).execute();
    }

    /**
     * Changes the currently active panel.<p>
     * 
     * @param panelId the number of the panel to show
     */
    public void setPanel(int panelId) {

        m_panel.showWidget(panelId);
        removeAllButtons();
        if (panelId == PANEL_SELECT) {
            for (CmsPushButton button : m_publishSelectPanel.getButtons()) {
                addButton(button);
            }
        } else if (panelId == PANEL_BROKEN_LINKS) {
            for (CmsPushButton button : m_brokenLinksPanel.getButtons()) {
                addButton(button);
            }
        }
    }
}