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.sitemap.client.hoverbar; 029 030import org.opencms.ade.sitemap.client.CmsSitemapView; 031import org.opencms.ade.sitemap.client.Messages; 032import org.opencms.ade.sitemap.client.control.CmsSitemapController; 033import org.opencms.ade.sitemap.client.edit.CmsEditEntryHandler; 034import org.opencms.ade.sitemap.client.edit.CmsNavModePropertyEditor; 035import org.opencms.ade.sitemap.shared.CmsClientSitemapEntry; 036import org.opencms.gwt.client.CmsCoreProvider; 037import org.opencms.gwt.client.property.A_CmsPropertyEditor; 038import org.opencms.gwt.client.property.CmsPropertySubmitHandler; 039import org.opencms.gwt.client.property.CmsVfsModePropertyEditor; 040import org.opencms.gwt.client.property.I_CmsPropertyEditorHandler; 041import org.opencms.gwt.client.property.definition.CmsPropertyDefinitionButton; 042import org.opencms.gwt.client.rpc.CmsRpcAction; 043import org.opencms.gwt.client.ui.input.form.CmsDialogFormHandler; 044import org.opencms.gwt.client.ui.input.form.CmsFormDialog; 045import org.opencms.gwt.client.ui.input.form.I_CmsFormSubmitHandler; 046import org.opencms.gwt.shared.CmsListInfoBean; 047import org.opencms.util.CmsUUID; 048import org.opencms.xml.content.CmsXmlContentProperty; 049 050import java.util.ArrayList; 051import java.util.HashSet; 052import java.util.LinkedHashMap; 053import java.util.List; 054import java.util.Map; 055import java.util.Set; 056 057import com.google.gwt.dom.client.Style; 058import com.google.gwt.user.client.rpc.AsyncCallback; 059 060/** 061 * Sitemap context menu edit entry.<p> 062 * 063 * @since 8.0.0 064 */ 065public class CmsEditMenuEntry extends A_CmsSitemapMenuEntry { 066 067 /** 068 * Constructor.<p> 069 * 070 * @param hoverbar the hoverbar 071 */ 072 public CmsEditMenuEntry(CmsSitemapHoverbar hoverbar) { 073 074 super(hoverbar); 075 setLabel(Messages.get().key(Messages.GUI_HOVERBAR_EDIT_0)); 076 setActive(true); 077 } 078 079 /** 080 * @see org.opencms.gwt.client.ui.contextmenu.I_CmsContextMenuEntry#execute() 081 */ 082 public void execute() { 083 084 final CmsSitemapController controller = getHoverbar().getController(); 085 final CmsClientSitemapEntry entry = getHoverbar().getEntry(); 086 controller.updateEntry(entry.getId(), new AsyncCallback<Void>() { 087 088 public void onFailure(Throwable caught) { 089 090 // TODO Auto-generated method stub 091 092 } 093 094 public void onSuccess(Void result) { 095 096 final CmsUUID infoId; 097 final CmsUUID defaultFileId; 098 099 infoId = entry.getId(); 100 if ((entry.getDefaultFileId() != null) && CmsSitemapView.getInstance().isNavigationMode()) { 101 defaultFileId = entry.getDefaultFileId(); 102 } else { 103 defaultFileId = entry.getId(); 104 } 105 Set<CmsUUID> idsForPropertyConfig = new HashSet<CmsUUID>(); 106 if (entry.getDefaultFileId() != null) { 107 idsForPropertyConfig.add(entry.getDefaultFileId()); 108 } 109 if (entry.getId() != null) { 110 idsForPropertyConfig.add(entry.getId()); 111 } 112 final List<CmsUUID> propertyConfigIds = new ArrayList<CmsUUID>(idsForPropertyConfig); 113 114 CmsRpcAction<CmsListInfoBean> action = new CmsRpcAction<CmsListInfoBean>() { 115 116 @Override 117 public void execute() { 118 119 start(0, true); 120 CmsCoreProvider.getVfsService().getPageInfo(infoId, this); 121 } 122 123 @Override 124 protected void onResponse(CmsListInfoBean infoResult) { 125 126 stop(false); 127 CmsRpcAction<CmsListInfoBean> defaultFileInfoAction = new CmsRpcAction<CmsListInfoBean>() { 128 129 @Override 130 public void execute() { 131 132 start(0, true); 133 CmsCoreProvider.getVfsService().getPageInfo(defaultFileId, this); 134 } 135 136 @Override 137 protected void onResponse(CmsListInfoBean defaultFileIdResult) { 138 139 stop(false); 140 final CmsEditEntryHandler handler = new CmsEditEntryHandler( 141 controller, 142 entry, 143 CmsSitemapView.getInstance().isNavigationMode()); 144 handler.setPageInfo(infoResult); 145 handler.setDefaultFilePath(defaultFileIdResult.getSubTitle()); 146 CmsRpcAction<Map<CmsUUID, Map<String, CmsXmlContentProperty>>> propertyAction = new CmsRpcAction<Map<CmsUUID, Map<String, CmsXmlContentProperty>>>() { 147 148 @Override 149 public void execute() { 150 151 start(0, true); 152 CmsCoreProvider.getVfsService().getDefaultProperties(propertyConfigIds, this); 153 } 154 155 @Override 156 protected void onResponse( 157 Map<CmsUUID, Map<String, CmsXmlContentProperty>> propertyResult) { 158 159 stop(false); 160 Map<String, CmsXmlContentProperty> propConfig = new LinkedHashMap<String, CmsXmlContentProperty>(); 161 for (Map<String, CmsXmlContentProperty> defaultProps : propertyResult.values()) { 162 propConfig.putAll(defaultProps); 163 } 164 propConfig.putAll( 165 CmsSitemapView.getInstance().getController().getData().getProperties()); 166 A_CmsPropertyEditor editor = createEntryEditor(handler, propConfig); 167 editor.setPropertyNames( 168 CmsSitemapView.getInstance().getController().getData().getAllPropertyNames()); 169 final CmsFormDialog dialog = new CmsFormDialog( 170 handler.getDialogTitle(), 171 editor.getForm()); 172 CmsPropertyDefinitionButton defButton = new CmsPropertyDefinitionButton() { 173 174 /** 175 * @see org.opencms.gwt.client.property.definition.CmsPropertyDefinitionButton#onBeforeEditPropertyDefinition() 176 */ 177 @Override 178 public void onBeforeEditPropertyDefinition() { 179 180 dialog.hide(); 181 } 182 183 }; 184 defButton.getElement().getStyle().setFloat(Style.Float.LEFT); 185 defButton.installOnDialog(dialog); 186 CmsDialogFormHandler formHandler = new CmsDialogFormHandler(); 187 formHandler.setDialog(dialog); 188 I_CmsFormSubmitHandler submitHandler = new CmsPropertySubmitHandler(handler); 189 formHandler.setSubmitHandler(submitHandler); 190 dialog.setFormHandler(formHandler); 191 editor.initializeWidgets(dialog); 192 dialog.centerHorizontally(50); 193 dialog.catchNotifications(); 194 String noEditReason = controller.getNoEditReason(entry, false); 195 if (noEditReason != null) { 196 editor.disableInput(noEditReason, false); 197 dialog.getOkButton().disable(noEditReason); 198 } else if (entry.hasBlockingLockedChildren()) { 199 editor.disableInput(null, true); 200 } 201 202 } 203 }; 204 propertyAction.execute(); 205 206 // TODO Auto-generated method stub 207 208 } 209 }; 210 defaultFileInfoAction.execute(); 211 212 } 213 214 }; 215 action.execute(); 216 217 } 218 }); 219 220 } 221 222 /** 223 * @see org.opencms.ade.sitemap.client.hoverbar.A_CmsSitemapMenuEntry#onShow() 224 */ 225 @Override 226 public void onShow() { 227 228 CmsClientSitemapEntry entry = getHoverbar().getEntry(); 229 boolean show = getHoverbar().getController().isEditable() 230 && (entry != null) 231 && (!CmsSitemapView.getInstance().isGalleryMode() 232 || getHoverbar().getController().getData().isGalleryManager()); 233 setVisible(show); 234 } 235 236 /** 237 * Creates the right sitemap entry editor for the current mode.<p> 238 * 239 * @param handler the entry editor handler 240 * @param propConfig the property configuration to use 241 * 242 * @return a sitemap entry editor instance 243 */ 244 protected A_CmsPropertyEditor createEntryEditor( 245 I_CmsPropertyEditorHandler handler, 246 Map<String, CmsXmlContentProperty> propConfig) { 247 248 if (CmsSitemapView.getInstance().isNavigationMode()) { 249 return new CmsNavModePropertyEditor(propConfig, handler); 250 } else { 251 boolean isFolder = handler.isFolder(); 252 CmsVfsModePropertyEditor result = new CmsVfsModePropertyEditor(propConfig, handler); 253 result.setShowResourceProperties(!isFolder); 254 return result; 255 } 256 } 257}