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