Package org.snippr.web.controllers

Source Code of org.snippr.web.controllers.SnippetCRUDController

/*
* This file is part of Snippr
*
* Copyright (C) 2012 Igalia, S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package org.snippr.web.controllers;

import java.io.IOException;
import java.util.List;
import java.util.Set;

import org.snippr.business.entities.Comment;
import org.snippr.business.entities.Snippet;
import org.snippr.business.entities.SnippetCode;
import org.snippr.business.exceptions.DuplicateName;
import org.snippr.business.exceptions.InstanceNotFoundException;
import org.snippr.web.common.Notificator;
import org.snippr.web.common.OnlyOneVisible;
import org.snippr.web.common.Util;
import org.snippr.web.model.ICommentModel;
import org.snippr.web.model.ILabelModel;
import org.snippr.web.model.ISnippetModel;
import org.snippr.web.model.IUserModel;
import org.springframework.security.core.Authentication;
import org.zkoss.spring.security.SecurityUtil;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.Button;
import org.zkoss.zul.Div;
import org.zkoss.zul.Grid;
import org.zkoss.zul.Label;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Tab;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;


/**
* @author José Manuel Ciges Regueiro <jmanuel@ciges.net>
* @author Jorge Muñoz Castañer <punkto@gmail.com>
* @version 20120913
*/
public class SnippetCRUDController extends GenericForwardComposer {

    private Notificator notificator;

    private Label notificationMessage;

    private Window listWindow;

    private Window renameWindow;

    private Window editWindow;

    private Listbox listSnippets;

    private OnlyOneVisible visibility;

    private boolean isnewSnippet;

    private Listcell editableListcell;

    private Listbox listLabels;

    private IUserModel userModel;

    private ISnippetModel snippetModel;

    // If this property is set only the snippets with this label will be shown
    private String filterLabel = null;

    private ILabelModel labelModel;
    private Listcell labelEditableCell;

    private Listbox listComments;
    private ICommentModel commentModel;

    private Div newComment;

    /*
     * (non-Javadoc)
     *
     * @see
     * org.zkoss.zk.ui.util.GenericForwardComposer#doAfterCompose(org.zkoss.
     * zk.ui.Component)
     */
    @Override
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);
        comp.setAttribute("controller", this);
        notificator = Notificator.create(notificationMessage);
        if (editableListcell != null)
            editableListcell.addEventListener("onDoubleClick",
                    new EventListener() {
                        @Override
                        public void onEvent(Event event) throws Exception {
                            for (int i = 0; i < listSnippets.getItemCount(); i++) {
                                Listcell aCell = (Listcell) listSnippets
                                        .getItemAtIndexApi(i).getChildren()
                                        .get(0);

                                ((Label) aCell.getChildren().get(0))
                                        .setVisible(true);
                                ((Textbox) aCell.getChildren().get(1))
                                        .setVisible(false);
                            }
                            Listcell clickedCell = (Listcell) event.getTarget();
                            Label lab = (Label) clickedCell.getChildren()
                                    .get(0);
                            Textbox tex = (Textbox) clickedCell.getChildren()
                                    .get(1);
                            if (lab.isVisible() == true) {
                                lab.setVisible(false);
                                tex.setVisible(true);
                            } else {
                                lab.setVisible(true);
                                tex.setVisible(false);
                            }
                        };
                    });

        if (labelEditableCell != null)
            labelEditableCell.addEventListener("onDoubleClick",
                    new EventListener() {
                        @Override
                        public void onEvent(Event event) throws Exception {
                            for (int i = 0; i < listLabels.getItemCount(); i++) {
                                Listcell aCell = (Listcell) listLabels
                                        .getItemAtIndexApi(i).getChildren()
                                        .get(0);

                                ((Label) aCell.getChildren().get(0))
                                        .setVisible(true);
                                ((Textbox) aCell.getChildren().get(1))
                                        .setVisible(false);
                            }
                            Listcell clickedCell = (Listcell) event.getTarget();
                            Label lab = (Label) clickedCell.getChildren()
                                    .get(0);
                            Textbox tex = (Textbox) clickedCell.getChildren()
                                    .get(1);
                            if (lab.isVisible() == true) {
                                lab.setVisible(false);
                                tex.setVisible(true);
                            } else {
                                lab.setVisible(true);
                                tex.setVisible(false);
                            }
                        };
                    });
    }

    /**
     * Returns the list of Snippets from the database for the logged user filtered by a label if the user has chosen one
     * @return List<Snippet>
     */
    public List<Snippet> getSnippets() {
        org.snippr.business.entities.Label label = getSelectedLabel();
        return snippetModel.getSnippetsByLabel(label);
    }

    /**
     * Returns editing Snippet
     * @return Snippet
     */
    public Snippet getSnippet() {
        return snippetModel.getSnippet();
    }

    /**
     * Sets the label of the actual cell in the grid
     * @param String title
     */
    private void setTitle(String title) {
        Tab tab = (Tab) editWindow.getFellowIfAny("tab");
        if (tab != null) {
            tab.setLabel(title);
        }
    }

    /**
     * Helper function to change between the list windows with the grid and the edit window
     * @return OnlyOneVisible
     */
    private OnlyOneVisible getVisibility() {
        if (visibility == null) {
            visibility = new OnlyOneVisible(listWindow, renameWindow, editWindow);
        }
        return visibility;
    }

    /**
     * Helper function to replace list window by rename window
     * @param String title
     */
    private void showRenameWindow(String title) {
        setTitle(title);
        Util.reloadBindings(renameWindow);
        getVisibility().showOnly(renameWindow);
    }

    /**
     * Opens the form to edit the Snippet title selected
     * @param Snippet snippet
     */
    public void openRenameForm(Snippet snippet) {
        try {
            snippetModel.prepareForEdit(snippet.getId());
            showRenameWindow(String.format("Edit snippet title: %s", snippet.getTitle()));
        } catch (InstanceNotFoundException e) {
            e.printStackTrace();
        }
        showRenameWindow(String.format("Edit snippet title: %s", snippet.getTitle()));
    }

    /**
     * Delete the snippet selected
     * @param Snippet snippet
     * @throws InstanceNotFoundException
     */
    public void delete(Snippet snippet) throws InstanceNotFoundException {
        snippetModel.delete(snippet);
        Util.reloadBindings(listWindow);
    }

    public void deleteSnippet() throws InstanceNotFoundException {
        snippetModel.delete(getSelectedSnippet());
        listSnippets.removeItemAt(listSnippets.getSelectedIndex());
    }

    /**
     * Helper function to show edit window
     * @param String title
     */
    private void showEditWindow(String title) {
        setTitle(title);
        Util.reloadBindings(editWindow);
        getVisibility().showOnly(editWindow);
    }

    /**
     * Opens the form to edit a snippet with its snippet codes
     * @param Snippet snippet
     */
    public void openEditForm(Snippet snippet) {
        try {
            snippetModel.prepareForEdit(snippet.getId());
            showEditWindow("Edit snippet");
        } catch (InstanceNotFoundException e)   {
            e.printStackTrace();
        }
        isnewSnippet = false;
    }

    /**
     * Opens the form to create a snippet with its snippet codes
     * @param Snippet snippet
     */
    public void openCreateForm() {
            snippetModel.prepareForCreate();
            // Disable some buttons and grid while the new snippet is not save
            Button addcodeButton = (Button) editWindow.getFellow("addcodeButton");
            Button saveButton = (Button) editWindow.getFellow("saveButton");
            Button saveandcontinueButton = (Button) editWindow.getFellow("saveandcontinueButton");
            Grid snippetCodeGrid = (Grid) editWindow.getFellow("snippetCodeGrid");
            addcodeButton.setDisabled(true);
            saveButton.setDisabled(true);
            saveandcontinueButton.setDisabled(true);
            snippetCodeGrid.setVisible(false);

            showEditWindow("Create a new  snippet");
            isnewSnippet = true;
    }

    /**
     * Redirects to main snippet window in case of operation canceled
     * @throws IOException
     */
    public void cancel() throws IOException {
        Executions.sendRedirect("/index.zul");
    }

    /**
     * Save the snippet and returns to main snippet window
     * @throws IOException
     */
    public void saveAndExit() throws IOException {
        try {
            snippetModel.save();
            cancel();
        } catch (DuplicateName e) {
            notificator.error("Duplicated Snippet");
        }
    }

    /**
     * Save the snippet without returning to main snippet window
     */
    public void saveAndContinue() {
        try {
            snippetModel.save();
            Util.reloadBindings(editWindow);
            notificator.info("Snippet saved");
            if (isnewSnippet)   {
                Button addcodeButton = (Button) editWindow.getFellow("addcodeButton");
                Grid snippetCodeGrid = (Grid) editWindow.getFellow("snippetCodeGrid");
                snippetCodeGrid.setVisible(true);
                addcodeButton.setDisabled(false);
                // Now we go to "edit mode"
                openEditForm(snippetModel.getSnippet());
            }
        } catch (DuplicateName e) {
            notificator.error("Duplicated Snippet");
        }
    }

    /**
     * Add a blank SnippetCode to the snippet
     */
    public void addSnippetCode() {
        snippetModel.addNewSnippetCode();
        try {
            snippetModel.save();
            Util.reloadBindings(editWindow);
            notificator.info("Snippet Code created");
        } catch (DuplicateName e) {
            notificator.error("Duplicated Snippet");
        }
    }

    /**
     * Delete the snippetCode passed as argument
     * @param SnippetCode snippetCode
     */

    public void delSnippetCode(SnippetCode snippetCode) {
        try {
            snippetModel.deleteSnippetCode(snippetCode);
            // Reload data after deleting the snippet code
            snippetModel.prepareForEdit(snippetModel.getSnippet().getId());
            Util.reloadBindings(editWindow);
            notificator.info("Snippet Code deleted");
        } catch (InstanceNotFoundException e)   {
            e.printStackTrace();
        }
    }

    /**
     * Redirects to home window
     * @throws IOException
     */
    public void goHome() throws IOException {
        Executions.sendRedirect("/");
    }

    public org.snippr.business.entities.Label getSelectedLabel() {
        int index = listLabels.getSelectedIndex();
        if (index != -1) {
            Listitem item = listLabels.getItemAtIndex(index);
            return (org.snippr.business.entities.Label) item.getValue();
        }
        return null;
    }

    public Snippet getSelectedSnippet() {
        int index = listSnippets.getSelectedIndex();
        if (index != -1) {
            Listitem item = listSnippets.getItemAtIndex(index);
            return (Snippet) item.getValue();
        }
        return null;
    }

    /**
     * Creates a new Snippet with default data
     */
    public void addSnippet() {
        org.snippr.business.entities.Label label = getSelectedLabel();
        if (label == null) {
            return;
        }

        try {
            snippetModel.addNewSnippet(label);
        } catch (DuplicateName e) {
            try {
                Messagebox
                        .show("Duplicated Snippet. Please fill the previous default snippet before creating a new one.",
                                "Error", 0,
                        Messagebox.ERROR);
            } catch (InterruptedException e1) {
            }
        }
        Util.reloadBindings(listSnippets);
    }

    public void addLabel() {
        try {
            snippetModel.addNewLabel();
        } catch (DuplicateName e) {
            try {
                Messagebox.show("Duplicated Label", "Error", 0,
                        Messagebox.ERROR);
            } catch (InterruptedException e1) {
            }
        }
        Util.reloadBindings(listLabels);
    }

    /**
     * Verify if the user can save the new Snippet for enabling the save buttons
     */
    public void activateSaveButton()    {
        if (isnewSnippet == true)   {
            Textbox titleTextbox = (Textbox) editWindow.getFellow("titleTextbox");
            Textbox descriptionTextbox = (Textbox) editWindow.getFellow("descriptionTextbox");
            Button saveButton = (Button) editWindow.getFellow("saveButton");
            Button saveandcontinueButton = (Button) editWindow.getFellow("saveandcontinueButton");
            if (titleTextbox.getValue().trim().isEmpty() || descriptionTextbox.getValue().trim().isEmpty()) {
                saveButton.setDisabled(true);
                saveandcontinueButton.setDisabled(true);
            }
            else    {
                saveButton.setDisabled(false);
                saveandcontinueButton.setDisabled(false);
            }
        }
    }

    /**
     * Returns the list of all  Labels from the database for the logged user
     * @return Set<Snippet>
     * @throws InstanceNotFoundException
     */
    public Set<org.snippr.business.entities.Label> getLabels() {
        Authentication auth = SecurityUtil.getAuthentication();
        String username = auth.getName();
        try {
            userModel.prepareForEdit(username);
        }
        catch (InstanceNotFoundException e) {
            e.printStackTrace();
        }
        return userModel.getLabels();
    }

    /**
     * Updates the contents of a snippet
     *
     * @return
     */
    public void updateSnippetTitle(Snippet snippet) {
        try {
            snippetModel.setSnippet(snippet);
            snippetModel.save();
            Util.reloadBindings(listSnippets);
        } catch (DuplicateName e) {
            notificator.error("Duplicated Snippet");
        }
    }

    /**
     *  Sets the name of the label for filtering the snippets lists
     *  @param String labelname
     *  @access public
     */
    public void filterByLabel(String labelname) {
        this.filterLabel = labelname;
        Util.reloadBindings(listSnippets);
    }

    public void updateLabel(org.snippr.business.entities.Label label) {
        try {
            labelModel.setLabel(label);
            labelModel.save();
            Util.reloadBindings(listLabels);
        } catch (DuplicateName e) {
            notificator.error("Label already exists");
        }
    }

    public void deleteLabel() throws InstanceNotFoundException {
        labelModel.delete(getSelectedLabel());
        Util.reloadBindings(listLabels);
    }

    public List<Comment> getComments() {
        return snippetModel.getComments();
    }

    public Comment getComment() {
        return commentModel.getComment();
    }

    public void deleteComment(Comment comment) throws InstanceNotFoundException {
        commentModel.delete(comment);
        Util.reloadBindings(listComments);
    }

    public void snippetSelected(Listbox list) {
        Listitem listItem = list.getSelectedItem();
        Snippet snippet = (Snippet) listItem.getValue();
        snippetModel.setSnippet(snippet);
        getComments();
        Util.reloadBindings(listComments);
    }

    public void openCreateCommentForm() {
        commentModel.prepareForCreate();
        newComment.setVisible(true);
    }

    public void saveComment() throws IOException {
        try {
            commentModel.save(snippetModel.getSnippet());
            newComment.setVisible(false);
            Util.reloadBindings(listComments);
        } catch (DuplicateName e) {
            notificator.error("Duplicated Comment");
        }
    }

}
TOP

Related Classes of org.snippr.web.controllers.SnippetCRUDController

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.