v7cr.ProjectEditor.java Source code

Java tutorial

Introduction

Here is the source code for v7cr.ProjectEditor.java

Source

/**
 * Copyright (c) 2011, Thilo Planz. All rights reserved.
 *
 * 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 v7cr;

import v7cr.v7db.BSONBackedObject;
import v7cr.vaadin.BSONFormFieldFactory;
import v7cr.vaadin.BSONItem;

import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DBObject;
import com.vaadin.data.util.BeanContainer;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.event.ItemClickEvent.ItemClickListener;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.ui.Button;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Form;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Button.ClickEvent;

@SuppressWarnings("serial")
class ProjectEditor extends CustomComponent implements ItemClickListener, Button.ClickListener {

    private final Table projTable = new Table();

    private final Panel rightSide = new Panel();

    ProjectEditor(V7CR v7) {
        setCaption(v7.getMessage("projectEditor.name"));
        setIcon(new ThemeResource("../runo/icons/16/settings.png"));

        reload(v7);
        projTable.setSelectable(true);
        projTable.addListener(this);

        rightSide.setWidth("500");

        HorizontalLayout hl = new HorizontalLayout();
        hl.setWidth("100%");
        VerticalLayout leftSide = new VerticalLayout();
        leftSide.addComponent(projTable);
        Button add = new Button(v7.getMessage("button.newProject"));
        add.addListener(this);
        leftSide.addComponent(add);
        hl.addComponent(leftSide);
        hl.addComponent(rightSide);

        setCompositionRoot(hl);

    }

    private void reload(V7CR v7) {
        BeanContainer<String, Project> beans = new BeanContainer<String, Project>(Project.class);
        beans.setBeanIdProperty("id");

        for (BSONBackedObject b : v7.find("projects")) {
            try {
                beans.addBean(new Project(b));
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            }
        }

        projTable.setContainerDataSource(beans);
        projTable.setVisibleColumns(new Object[] { "id", "name" });

    }

    public void itemClick(ItemClickEvent event) {
        String projectId = (String) event.getItemId();
        if (projectId == null)
            return;

        V7CR v7 = V7CR.getInstance();

        final Project p = new Project(v7.load("projects", projectId));

        final DBObject b = p.getDBObject();
        rightSide.removeAllComponents();
        rightSide.addComponent(new Label(projectId));

        final Form form = new Form();
        rightSide.addComponent(form);

        form.setFormFieldFactory(new BSONFormFieldFactory(p.getSchemaDefinition()));

        form.setItemDataSource(new BSONItem(b));
        form.setVisibleItemProperties(new String[] { "name", "repo", "viewChanges" });

        form.setWidth("100%");

        Button submit = new Button(v7.getMessage("button.submit"));
        rightSide.addComponent(submit);
        submit.addListener(new Button.ClickListener() {

            public void buttonClick(ClickEvent event) {

                form.commit();

                V7CR v7 = V7CR.getInstance();
                v7.update("projects", b);
                rightSide.removeAllComponents();
                reload(v7);

            }
        });

    }

    public void buttonClick(ClickEvent event) {
        rightSide.removeAllComponents();
        final DBObject b = new BasicDBObject();
        Project p = new Project(new BSONBackedObject());
        final Form form = new Form();
        form.setWidth("100%");
        rightSide.addComponent(form);

        form.setFormFieldFactory(new BSONFormFieldFactory(p.getSchemaDefinition()));

        form.setItemDataSource(new BSONItem(b, p.getSchemaDefinition()));
        form.setVisibleItemProperties(new String[] { "_id", "name", "repo", "viewChanges" });
        V7CR v7 = V7CR.getInstance();

        Button submit = new Button(v7.getMessage("button.create"));
        rightSide.addComponent(submit);

        submit.addListener(new Button.ClickListener() {

            public void buttonClick(ClickEvent event) {

                form.commit();

                V7CR v7 = V7CR.getInstance();
                v7.insert("projects", b);
                // also create the member role
                DBObject r = new BasicDBObjectBuilder().add("_id", "project:" + b.get("_id"))
                        .add("name", "Reviewers of project '" + b.get("_id") + "'").get();

                v7.insert("roles", r);
                rightSide.removeAllComponents();
                reload(v7);

            }
        });

    }
}