001/* 002 * This library is part of OpenCms - 003 * the Open Source Content Management System 004 * 005 * Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com) 006 * 007 * This library is free software; you can redistribute it and/or 008 * modify it under the terms of the GNU Lesser General Public 009 * License as published by the Free Software Foundation; either 010 * version 2.1 of the License, or (at your option) any later version. 011 * 012 * This library is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * Lesser General Public License for more details. 016 * 017 * For further information about Alkacon Software, please see the 018 * company website: http://www.alkacon.com 019 * 020 * For further information about OpenCms, please see the 021 * project website: http://www.opencms.org 022 * 023 * You should have received a copy of the GNU Lesser General Public 024 * License along with this library; if not, write to the Free Software 025 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 026 */ 027 028package org.opencms.ade.containerpage.client; 029 030import org.opencms.ade.containerpage.client.ui.CmsAddToFavoritesButton; 031import org.opencms.ade.containerpage.client.ui.CmsToolbarAllGalleriesMenu; 032import org.opencms.ade.containerpage.client.ui.CmsToolbarClipboardMenu; 033import org.opencms.ade.containerpage.client.ui.CmsToolbarEditButton; 034import org.opencms.ade.containerpage.client.ui.CmsToolbarElementInfoButton; 035import org.opencms.ade.containerpage.client.ui.CmsToolbarFavLocationButton; 036import org.opencms.ade.containerpage.client.ui.CmsToolbarGalleryMenu; 037import org.opencms.ade.containerpage.client.ui.CmsToolbarInfoButton; 038import org.opencms.ade.containerpage.client.ui.CmsToolbarListAddButton; 039import org.opencms.ade.containerpage.client.ui.CmsToolbarListManagerButton; 040import org.opencms.ade.containerpage.client.ui.CmsToolbarMoveButton; 041import org.opencms.ade.containerpage.client.ui.CmsToolbarPublishButton; 042import org.opencms.ade.containerpage.client.ui.CmsToolbarRemoveButton; 043import org.opencms.ade.containerpage.client.ui.CmsToolbarSelectionButton; 044import org.opencms.ade.containerpage.client.ui.CmsToolbarSettingsButton; 045import org.opencms.ade.containerpage.client.ui.css.I_CmsLayoutBundle; 046import org.opencms.gwt.client.A_CmsEntryPoint; 047import org.opencms.gwt.client.CmsBroadcastTimer; 048import org.opencms.gwt.client.CmsCoreProvider; 049import org.opencms.gwt.client.CmsRpcContext; 050import org.opencms.gwt.client.dnd.CmsCompositeDNDController; 051import org.opencms.gwt.client.dnd.CmsDNDHandler; 052import org.opencms.gwt.client.dnd.CmsDNDHandler.AnimationType; 053import org.opencms.gwt.client.ui.CmsErrorDialog; 054import org.opencms.gwt.client.ui.CmsPushButton; 055import org.opencms.gwt.client.ui.CmsQuickLauncher.A_QuickLaunchHandler; 056import org.opencms.gwt.client.ui.CmsToolbar; 057import org.opencms.gwt.client.ui.CmsToolbarContextButton; 058import org.opencms.gwt.client.ui.I_CmsToolbarButton; 059import org.opencms.gwt.client.ui.contextmenu.I_CmsContextMenuCommand; 060import org.opencms.gwt.client.ui.contextmenu.I_CmsContextMenuCommandInitializer; 061import org.opencms.gwt.client.util.CmsDomUtil; 062import org.opencms.gwt.client.util.CmsEmbeddedDialogFrame; 063import org.opencms.gwt.client.util.CmsStyleVariable; 064import org.opencms.gwt.shared.CmsGwtConstants; 065import org.opencms.gwt.shared.CmsGwtConstants.QuickLaunch; 066import org.opencms.gwt.shared.CmsQuickLaunchParams; 067import org.opencms.util.CmsStringUtil; 068 069import java.util.Map; 070 071import com.google.gwt.core.client.GWT; 072import com.google.gwt.core.client.JavaScriptObject; 073import com.google.gwt.event.dom.client.ClickEvent; 074import com.google.gwt.event.dom.client.ClickHandler; 075import com.google.gwt.event.logical.shared.CloseEvent; 076import com.google.gwt.event.logical.shared.CloseHandler; 077import com.google.gwt.user.client.Window; 078import com.google.gwt.user.client.ui.RootPanel; 079import com.google.gwt.user.client.ui.Widget; 080 081/** 082 * The container page editor.<p> 083 * 084 * @since 8.0.0 085 */ 086public class CmsContainerpageEditor extends A_CmsEntryPoint { 087 088 /** Margin-top added to the document body element when the tool-bar is shown. */ 089 // private int m_bodyMarginTop; 090 091 /** 092 * Quick launch handler for the page editor. 093 */ 094 public static class PageEditorQuickLaunchHandler extends A_QuickLaunchHandler { 095 096 /** 097 * @see org.opencms.gwt.client.ui.CmsQuickLauncher.I_QuickLaunchHandler#getParameters() 098 */ 099 public CmsQuickLaunchParams getParameters() { 100 101 return new CmsQuickLaunchParams( 102 QuickLaunch.CONTEXT_PAGE, 103 CmsCoreProvider.get().getStructureId(), 104 CmsContainerpageController.get().getData().getDetailId(), 105 null, 106 CmsCoreProvider.get().getUri(), 107 CmsCoreProvider.get().getLastPageId()); 108 } 109 110 } 111 112 /** Add menu. */ 113 private CmsToolbarGalleryMenu m_add; 114 115 /** Add to favorites button. */ 116 private CmsAddToFavoritesButton m_addToFavorites; 117 118 /** The button for the 'complete galleries' dialog. */ 119 private CmsToolbarAllGalleriesMenu m_allGalleries; 120 121 /** Clip-board menu. */ 122 private CmsToolbarClipboardMenu m_clipboard; 123 124 /** The Button for the context menu. */ 125 private CmsToolbarContextButton m_context; 126 127 /** The available context menu commands. */ 128 private Map<String, I_CmsContextMenuCommand> m_contextMenuCommands; 129 130 /** Edit button. */ 131 private CmsToolbarEditButton m_edit; 132 133 /** Button for the elements information. */ 134 private CmsToolbarElementInfoButton m_elementsInfo; 135 136 /** Info button. */ 137 private CmsToolbarInfoButton m_info; 138 139 /** Move button. */ 140 private CmsToolbarMoveButton m_move; 141 142 /** Properties button. */ 143 private CmsToolbarSettingsButton m_properties; 144 145 /** Publish button. */ 146 private CmsToolbarPublishButton m_publish; 147 148 /** Remove button. */ 149 private CmsToolbarRemoveButton m_remove; 150 151 /** Selection button. */ 152 private CmsToolbarSelectionButton m_selection; 153 154 /** The style variable for the display mode for small elements. */ 155 private CmsStyleVariable m_smallElementsStyle; 156 157 /** The tool-bar. */ 158 private CmsToolbar m_toolbar; 159 160 /** 161 * Opens a message dialog with the given content.<p> 162 * 163 * @param title the dialog title 164 * @param displayHtmlContent the dialog content 165 */ 166 private static void openMessageDialog(String title, String displayHtmlContent) { 167 168 new CmsErrorDialog(title, displayHtmlContent).center(); 169 } 170 171 /** 172 * Disables the edit functionality.<p> 173 * 174 * @param reason the text stating the reason why the edit functionality was disabled 175 */ 176 public void disableEditing(String reason) { 177 178 CmsContainerpageController.get().reinitializeButtons(); 179 m_add.disable(reason); 180 m_clipboard.disable(reason); 181 } 182 183 /** 184 * Deactivates all toolbar buttons.<p> 185 */ 186 public void disableToolbarButtons() { 187 188 for (Widget button : m_toolbar.getAll()) { 189 if (button instanceof I_CmsToolbarButton) { 190 ((I_CmsToolbarButton)button).setEnabled(false); 191 } 192 } 193 m_toolbar.setVisible(false); 194 } 195 196 /** 197 * Enables the toolbar buttons.<p> 198 * 199 * @param hasChanges if the page has changes 200 * @param noEditReason the no edit reason 201 */ 202 public void enableToolbarButtons(boolean hasChanges, String noEditReason) { 203 204 for (Widget button : m_toolbar.getAll()) { 205 // enable all buttons that are not equal save or reset or the page has changes 206 if (button instanceof I_CmsToolbarButton) { 207 ((I_CmsToolbarButton)button).setEnabled(true); 208 } 209 } 210 if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(noEditReason)) { 211 m_add.disable(noEditReason); 212 m_clipboard.disable(noEditReason); 213 } 214 215 m_toolbar.setVisible(true); 216 } 217 218 /** 219 * Returns the add gallery menu.<p> 220 * 221 * @return the add gallery menu 222 */ 223 public CmsToolbarGalleryMenu getAdd() { 224 225 return m_add; 226 } 227 228 /** 229 * Returns the clip-board menu.<p> 230 * 231 * @return the clip-board menu 232 */ 233 public CmsToolbarClipboardMenu getClipboard() { 234 235 return m_clipboard; 236 } 237 238 /** 239 * Returns the context menu.<p> 240 * 241 * @return the context menu 242 */ 243 public CmsToolbarContextButton getContext() { 244 245 return m_context; 246 } 247 248 /** 249 * Returns the available context menu commands as a map by class name.<p> 250 * 251 * @return the available context menu commands as a map by class name 252 */ 253 public Map<String, I_CmsContextMenuCommand> getContextMenuCommands() { 254 255 if (m_contextMenuCommands == null) { 256 I_CmsContextMenuCommandInitializer initializer = GWT.create(I_CmsContextMenuCommandInitializer.class); 257 m_contextMenuCommands = initializer.initCommands(); 258 } 259 return m_contextMenuCommands; 260 } 261 262 /** 263 * Returns the publish.<p> 264 * 265 * @return the publish 266 */ 267 public CmsToolbarPublishButton getPublish() { 268 269 return m_publish; 270 } 271 272 /** 273 * Returns the selection button.<p> 274 * 275 * @return the selection button 276 */ 277 public CmsToolbarSelectionButton getSelection() { 278 279 return m_selection; 280 } 281 282 /** 283 * Returns the tool-bar widget.<p> 284 * 285 * @return the tool-bar widget 286 */ 287 public CmsToolbar getToolbar() { 288 289 return m_toolbar; 290 } 291 292 /** 293 * @see com.google.gwt.core.client.EntryPoint#onModuleLoad() 294 */ 295 @Override 296 public void onModuleLoad() { 297 298 super.onModuleLoad(); 299 CmsRpcContext.get().put(CmsGwtConstants.RpcContext.PAGE_ID, "" + CmsCoreProvider.get().getStructureId()); 300 CmsBroadcastTimer.start(); 301 JavaScriptObject window = CmsDomUtil.getWindow(); 302 CmsDomUtil.setAttribute(window, "__hideEditorCloseButton", "true"); 303 304 I_CmsLayoutBundle.INSTANCE.containerpageCss().ensureInjected(); 305 I_CmsLayoutBundle.INSTANCE.dragdropCss().ensureInjected(); 306 307 I_CmsLayoutBundle.INSTANCE.groupcontainerCss().ensureInjected(); 308 org.opencms.gwt.client.ui.css.I_CmsLayoutBundle.INSTANCE.elementSettingsDialogCss().ensureInjected(); 309 org.opencms.gwt.client.ui.css.I_CmsLayoutBundle.INSTANCE.listAddCss().ensureInjected(); 310 311 final CmsContainerpageController controller = new CmsContainerpageController(); 312 final CmsContainerpageHandler containerpageHandler = new CmsContainerpageHandler(controller, this); 313 CmsContentEditorHandler contentEditorHandler = new CmsContentEditorHandler(containerpageHandler); 314 CmsCompositeDNDController dndController = new CmsCompositeDNDController(); 315 dndController.addController(new CmsContainerpageDNDController(controller)); 316 //dndController.addController(new CmsImageDndController(controller)); 317 controller.setDndController(dndController); 318 CmsDNDHandler dndHandler = new CmsDNDHandler(dndController); 319 dndHandler.setAnimationType(AnimationType.SPECIAL); 320 ClickHandler clickHandler = new ClickHandler() { 321 322 /** 323 * @see com.google.gwt.event.dom.client.ClickHandler#onClick(com.google.gwt.event.dom.client.ClickEvent) 324 */ 325 public void onClick(ClickEvent event) { 326 327 I_CmsToolbarButton source = (I_CmsToolbarButton)event.getSource(); 328 source.onToolbarClick(); 329 if (source instanceof CmsPushButton) { 330 ((CmsPushButton)source).clearHoverState(); 331 } 332 } 333 }; 334 335 // m_bodyMarginTop = CmsDomUtil.getCurrentStyleInt(Document.get().getBody(), Style.marginTop); 336 m_toolbar = new CmsToolbar(); 337 m_toolbar.setQuickLaunchHandler(new PageEditorQuickLaunchHandler()); 338 m_toolbar.getUserInfo().setHandler(containerpageHandler); 339 m_toolbar.getQuickLauncher().setHandler(containerpageHandler); 340 String title = controller.getData().getAppTitle(); 341 if (title == null) { 342 title = Messages.get().key(Messages.GUI_PAGE_EDITOR_TITLE_0); 343 } 344 m_toolbar.setAppTitle(title); 345 346 m_publish = new CmsToolbarPublishButton(containerpageHandler); 347 m_publish.addClickHandler(clickHandler); 348 m_toolbar.addLeft(m_publish); 349 350 m_move = new CmsToolbarMoveButton(containerpageHandler, dndHandler); 351 352 m_edit = new CmsToolbarEditButton(containerpageHandler); 353 354 m_addToFavorites = new CmsAddToFavoritesButton(containerpageHandler); 355 356 m_remove = new CmsToolbarRemoveButton(containerpageHandler); 357 358 m_properties = new CmsToolbarSettingsButton(containerpageHandler); 359 m_info = new CmsToolbarInfoButton(containerpageHandler); 360 361 m_clipboard = new CmsToolbarClipboardMenu(containerpageHandler); 362 m_clipboard.addClickHandler(clickHandler); 363 m_toolbar.addLeft(m_clipboard); 364 365 m_add = new CmsToolbarGalleryMenu(containerpageHandler, dndHandler); 366 m_add.addClickHandler(clickHandler); 367 m_toolbar.addLeft(m_add); 368 369 m_allGalleries = new CmsToolbarAllGalleriesMenu(containerpageHandler, dndHandler); 370 m_allGalleries.addClickHandler(clickHandler); 371 m_toolbar.addLeft(m_allGalleries); 372 373 m_elementsInfo = new CmsToolbarElementInfoButton(containerpageHandler, controller); 374 m_elementsInfo.addClickHandler(clickHandler); 375 m_toolbar.addLeft(m_elementsInfo); 376 377 m_selection = new CmsToolbarSelectionButton(containerpageHandler); 378 m_selection.addClickHandler(clickHandler); 379 m_toolbar.addLeft(m_selection); 380 381 m_context = new CmsToolbarContextButton(containerpageHandler); 382 m_context.addClickHandler(clickHandler); 383 m_toolbar.insertRight(m_context, 0); 384 385 CmsToolbarFavLocationButton favLocButton = new CmsToolbarFavLocationButton(containerpageHandler); 386 favLocButton.addClickHandler(clickHandler); 387 m_toolbar.insertRight(favLocButton, 1); 388 389 Window.addCloseHandler(new CloseHandler<Window>() { 390 391 public void onClose(CloseEvent<Window> event) { 392 393 controller.onWindowClose(); 394 } 395 396 }); 397 398 containerpageHandler.activateSelection(); 399 400 RootPanel root = RootPanel.get(); 401 root.add(m_toolbar); 402 CmsContainerpageUtil containerpageUtil = new CmsContainerpageUtil( 403 controller, 404 m_edit, 405 m_move, 406 new CmsToolbarListAddButton(containerpageHandler), 407 new CmsToolbarListManagerButton(containerpageHandler), 408 m_info, 409 m_properties, 410 m_addToFavorites, 411 m_remove); 412 CmsEmbeddedDialogFrame.get().preload(); 413 controller.init(containerpageHandler, dndHandler, contentEditorHandler, containerpageUtil); 414 415 // export open stack trace dialog function 416 exportMethods(controller); 417 } 418 419 /** 420 * Exports the __openMessageDialog and the __reinitializeEditButtons method to the page context.<p> 421 * 422 * @param controller the controller 423 */ 424 private native void exportMethods(CmsContainerpageController controller) /*-{ 425 var contr = controller; 426 $wnd.opencms = { 427 openStacktraceDialog : function(event) { 428 event = (event) ? event : ((window.event) ? window.event : ""); 429 var elem = (event.target) ? event.target : event.srcElement; 430 if (elem != null) { 431 var children = elem.getElementsByTagName("span"); 432 if (children.length > 0) { 433 var title = children[0].getAttribute("title"); 434 var content = children[0].innerHTML; 435 @org.opencms.ade.containerpage.client.CmsContainerpageEditor::openMessageDialog(Ljava/lang/String;Ljava/lang/String;)(title,content); 436 } 437 } 438 }, 439 reinitializeEditButtons : function() { 440 contr.@org.opencms.ade.containerpage.client.CmsContainerpageController::reinitializeButtons()(); 441 } 442 } 443 }-*/; 444}