001/*
002 * This library is part of OpenCms -
003 * the Open Source Content Management System
004 *
005 * Copyright (c) Alkacon Software GmbH & Co. KG (https://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: https://www.alkacon.com
019 *
020 * For further information about OpenCms, please see the
021 * project website: https://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.shared.CmsClientSitemapEntry;
034import org.opencms.ade.sitemap.shared.CmsSitemapData;
035import org.opencms.gwt.client.ui.A_CmsListItemSelectDialog;
036import org.opencms.gwt.client.ui.CmsConfirmDialog;
037import org.opencms.gwt.client.ui.CmsListItemWidget;
038import org.opencms.gwt.client.ui.I_CmsConfirmDialogHandler;
039import org.opencms.gwt.shared.CmsListInfoBean;
040import org.opencms.util.CmsStringUtil;
041
042import java.util.List;
043
044/**
045 * Sitemap context menu create sub sitemap entry.<p>
046 *
047 * @since 8.0.0
048 */
049public class CmsSubSitemapMenuEntry extends A_CmsSitemapMenuEntry {
050
051    /**
052     * Selection dialog for sitemap folder types.<p>
053     */
054    protected class SitemapTypeDialog extends A_CmsListItemSelectDialog<CmsListInfoBean> {
055
056        /**
057         * Creates a new instance.<p>
058         *
059         * @param itemInfos the list info beans for the different sitemap types
060         */
061        public SitemapTypeDialog(List<CmsListInfoBean> itemInfos) {
062
063            super(
064                itemInfos,
065                Messages.get().key(Messages.GUI_SITEMAP_TYPE_CHOICE_TITLE_0),
066                Messages.get().key(Messages.GUI_SITEMAP_TYPE_CHOICE_TEXT_0));
067
068        }
069
070        /**
071         * @see org.opencms.gwt.client.ui.A_CmsListItemSelectDialog#handleSelection(org.opencms.gwt.shared.CmsListInfoBean)
072         */
073        @Override
074        protected void handleSelection(CmsListInfoBean info) {
075
076            CmsSitemapController controller = CmsSitemapView.getInstance().getController();
077            String typeName = info.getResourceType();
078            final CmsClientSitemapEntry entry = getHoverbar().getEntry();
079            controller.createSitemapSubEntry(entry, typeName);
080        }
081
082    }
083
084    /**
085     * Constructor.<p>
086     *
087     * @param hoverbar the hoverbar
088     */
089    public CmsSubSitemapMenuEntry(CmsSitemapHoverbar hoverbar) {
090
091        super(hoverbar);
092        setLabel(Messages.get().key(Messages.GUI_HOVERBAR_SUBSITEMAP_0));
093        setActive(true);
094    }
095
096    /**
097     * @see org.opencms.gwt.client.ui.contextmenu.I_CmsContextMenuEntry#execute()
098     */
099    public void execute() {
100
101        if (isCreateFolderMode()) {
102            executeFolderMode();
103        } else {
104            executeConvertMode();
105        }
106    }
107
108    /**
109     * @see org.opencms.ade.sitemap.client.hoverbar.A_CmsSitemapMenuEntry#onShow()
110     */
111    @Override
112    public void onShow() {
113
114        CmsSitemapController controller = getHoverbar().getController();
115        CmsClientSitemapEntry entry = getHoverbar().getEntry();
116        boolean show = controller.isEditable()
117            && CmsSitemapView.getInstance().isNavigationMode()
118            && entry.isInNavigation()
119            && entry.isFolderType()
120            && !controller.isRoot(entry.getSitePath());
121        if (isCreateFolderMode()) {
122            setVisible(show);
123            setActive(show);
124            setDisabledReason(null);
125        } else {
126            setVisible(show);
127            if (show && !entry.isEditable()) {
128                setActive(false);
129                setDisabledReason(controller.getNoEditReason(entry));
130            } else {
131                setActive(true);
132                setDisabledReason(null);
133            }
134        }
135    }
136
137    /**
138     * @see org.opencms.gwt.client.ui.contextmenu.I_CmsContextMenuEntry#execute()
139     */
140    private void executeConvertMode() {
141
142        final CmsSitemapController controller = getHoverbar().getController();
143        String confirmTitle = Messages.get().key(Messages.GUI_SUBSITEMAP_CONFIRM_TITLE_0);
144        String confirmMessage = Messages.get().key(Messages.GUI_SUBSITEMAP_CONFIRM_TEXT_0);
145        CmsConfirmDialog confirmDialog = new CmsConfirmDialog(confirmTitle, confirmMessage);
146
147        final CmsClientSitemapEntry entry = getHoverbar().getEntry();
148
149        CmsListInfoBean infoBean = new CmsListInfoBean();
150        infoBean.setTitle(entry.getTitle());
151        infoBean.setSubTitle(entry.getSitePath());
152        infoBean.addAdditionalInfo(Messages.get().key(Messages.GUI_NAME_0), entry.getName());
153        String shownPath = entry.getVfsPath();
154        if (CmsStringUtil.isEmptyOrWhitespaceOnly(shownPath)) {
155            shownPath = "-";
156        }
157        infoBean.addAdditionalInfo(Messages.get().key(Messages.GUI_VFS_PATH_0), shownPath);
158        // showing the resource type icon of the default file in navigation mode
159        infoBean.setResourceType(
160            CmsStringUtil.isNotEmptyOrWhitespaceOnly(entry.getDefaultFileType())
161            ? entry.getDefaultFileType()
162            : entry.getResourceTypeName());
163        confirmDialog.addTopWidget(new CmsListItemWidget(infoBean));
164        confirmDialog.setHandler(new I_CmsConfirmDialogHandler() {
165
166            /**
167             * @see org.opencms.gwt.client.ui.I_CmsCloseDialogHandler#onClose()
168             */
169            public void onClose() {
170
171                // do nothing
172            }
173
174            /**
175             * @see org.opencms.gwt.client.ui.I_CmsConfirmDialogHandler#onOk()
176             */
177            public void onOk() {
178
179                controller.createSubSitemap(entry.getId());
180            }
181        });
182        confirmDialog.center();
183    }
184
185    /**
186     * @see org.opencms.gwt.client.ui.contextmenu.I_CmsContextMenuEntry#execute()
187     */
188    private void executeFolderMode() {
189
190        final CmsSitemapController controller = getHoverbar().getController();
191        SitemapTypeDialog dialog = new SitemapTypeDialog(controller.getData().getSubsitemapFolderTypeInfos());
192        dialog.center();
193    }
194
195    /**
196     * Checks if new folders should be created for subsitemaps.<p>
197     *
198     * @return true if new folders should be created for subsitemaps
199     */
200    private boolean isCreateFolderMode() {
201
202        CmsSitemapController controller = getHoverbar().getController();
203        CmsSitemapData data = controller.getData();
204        return data.isCreateNewFoldersForSubsitemaps()
205            && (data.getSubsitemapFolderTypeInfos() != null)
206            && !data.getSubsitemapFolderTypeInfos().isEmpty();
207    }
208
209}