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}