/* * 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); } } } }