Package org.brixcms.plugin.menu

Source Code of org.brixcms.plugin.menu.ManageMenuPanel$EditorPanel

/**
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.brixcms.plugin.menu;

import org.apache.wicket.Component;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.util.lang.Objects;
import org.brixcms.BrixNodeModel;
import org.brixcms.jcr.api.JcrSession;
import org.brixcms.jcr.exception.JcrException;
import org.brixcms.jcr.wrapper.BrixNode;
import org.brixcms.plugin.menu.editor.MenuEditor;
import org.brixcms.web.generic.BrixGenericPanel;
import org.brixcms.web.util.AbstractModel;
import org.brixcms.workspace.Workspace;

import javax.jcr.ReferentialIntegrityException;
import java.util.List;

public class ManageMenuPanel extends BrixGenericPanel<Workspace> {
// ------------------------------ FIELDS ------------------------------
    ;
    private Component editor;

    private IModel<BrixNode> currentNode = new BrixNodeModel();
    private Menu currentMenu = new Menu();

    public ManageMenuPanel(String id, final IModel<Workspace> model) {
        super(id, model);

        IModel<List<BrixNode>> listViewModel = new LoadableDetachableModel<List<BrixNode>>() {
            @Override
            protected List<BrixNode> load() {
                return MenuPlugin.get().getMenuNodes(ManageMenuPanel.this.getModelObject().getId());
            }
        };

        add(new MenuListView("listView", listViewModel));
        setupEditor();

        add(new Link<Object>("newMenu") {
            @Override
            public void onClick() {
                currentMenu = new Menu();
                currentNode.setObject(null);
                setupEditor();
            }

            @Override
            public boolean isEnabled() {
                return currentNode.getObject() != null;
            }
        });
    }

    private void setupEditor() {
        Component editor = new EditorPanel("editor", new PropertyModel<Menu>(this, "currentMenu"));
        if (this.editor == null) {
            add(editor);
        } else {
            this.editor.replaceWith(editor);
        }
        this.editor = editor;
    }

    @Override
    protected void onBeforeRender() {
        String workspaceId = getModelObject().getId();
        BrixNode current = currentNode.getObject();
        if (current != null
                && current.getSession().getWorkspace().getName().equals(workspaceId) == false) {
            currentNode.setObject(null);
            currentMenu = new Menu();
            setupEditor();
        }
        super.onBeforeRender();
    }

    @Override
    protected void onDetach() {
        currentNode.detach();
        currentMenu.detach();
        super.onDetach();
    }

    private void onSelectLinkClicked(BrixNode node) {
        currentNode.setObject(node);
        currentMenu = new Menu();
        currentMenu.load(node);
        setupEditor();
    }

    private class MenuListView extends ListView<BrixNode> {
        public MenuListView(String id, IModel<List<BrixNode>> model) {
            super(id, model);
        }

        @Override
        protected void populateItem(final ListItem<BrixNode> item) {
            Link<Object> select = new Link<Object>("select") {
                @Override
                public void onClick() {
                    onSelectLinkClicked(item.getModelObject());
                }

                @Override
                public boolean isEnabled() {
                    BrixNode myNode = item.getModelObject();
                    BrixNode selectedNode = currentNode.getObject();
                    if (selectedNode != null) {
                        return !Objects.equal(myNode.getIdentifier(), selectedNode.getIdentifier());
                    } else {
                        return true;
                    }
                }
            };
            IModel<String> labelModel = new AbstractModel<String>() {
                @Override
                public String getObject() {
                    BrixNode node = item.getModelObject();
                    Menu menu = new Menu();
                    menu.loadName(node);
                    return menu.getName();
                }
            };
            select.add(new Label("label", labelModel));
            item.add(select);
        }

        @Override
        protected IModel<BrixNode> getListItemModel(IModel<? extends List<BrixNode>> listViewModel,
                                                    int index) {
            List<BrixNode> nodes = listViewModel.getObject();
            return new BrixNodeModel(nodes.get(index));
        }
    }

    private class EditorPanel extends BrixGenericPanel<Menu> {
        public EditorPanel(String id, final IModel<Menu> model) {
            super(id, model);

            Form<Menu> form = new Form<Menu>("form", new CompoundPropertyModel<Menu>(model));
            add(form);

            form.add(new TextField<String>("name").setRequired(true));

            form.add(new MenuEditor("editor", model));

            form.add(new SubmitLink("save") {
                @Override
                public void onSubmit() {
                    MenuPlugin plugin = MenuPlugin.get();
                    currentNode.setObject(plugin.saveMenu(model.getObject(), ManageMenuPanel.this
                            .getModelObject().getId(), currentNode.getObject()));
                    getSession().info(ManageMenuPanel.this.getString("menuSaved"));
                }
            });

            form.add(new SubmitLink("delete") {
                @Override
                public void onSubmit() {
                    try {
                        JcrSession session = currentNode.getObject().getSession();
                        currentNode.getObject().remove();
                        session.save();

                        currentNode.setObject(null);
                        currentMenu = new Menu();
                        setupEditor();
                    } catch (JcrException e) {
                        if (e.getCause() instanceof ReferentialIntegrityException) {
                            currentNode.getObject().getSession().refresh(false);
                            currentNode.detach();
                            getSession().error(
                                    "Couldn't delete menu, it is referenced from a tile(s).");
                        }
                    }

                }

                @Override
                public boolean isVisible() {
                    return currentNode.getObject() != null;
                }
            }.setDefaultFormProcessing(false));

            add(new FeedbackPanel("feedback"));
        }
    }
}
TOP

Related Classes of org.brixcms.plugin.menu.ManageMenuPanel$EditorPanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.