package org.vaadin.mideaas.frontend; import java.util.LinkedList; import java.util.List; import org.vaadin.dialogs.ConfirmDialog; import org.vaadin.mideaas.model.ProjectItem; import org.vaadin.mideaas.model.SharedProject; import org.vaadin.mideaas.model.SharedProject.ProjectListener; import org.vaadin.mideaas.model.SharedView; import org.vaadin.mideaas.model.User; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.Alignment; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Notification; import com.vaadin.ui.Panel; import com.vaadin.ui.TreeTable; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; // TODO @SuppressWarnings("serial") public class ProjectItemList extends CustomComponent implements ProjectListener, ValueChangeListener { public interface Listener { public void projectItemSelected(String name); } private static final String TITLE_VIEWS = "Views"; private static final String TITLE_OTHER_FILES = "Other Files"; private final User user; private LinkedList<Listener> listeners = new LinkedList<Listener>(); private final SharedProject project; private final TreeTable tree = new TreeTable(); private UI ui; public ProjectItemList(SharedProject proj, final User user) { super(); this.project = proj; this.user = user; VerticalLayout mainLayout = new VerticalLayout(); Panel p = new Panel("Project Contents"); mainLayout.addComponent(p); VerticalLayout la = new VerticalLayout(); p.setContent(la); la.addComponent(tree); la.setExpandRatio(tree, 1); //HorizontalLayout ho = new HorizontalLayout(); VerticalLayout ve = new VerticalLayout(); ve.setMargin(true); ve.setSizeFull(); Button addButton = new Button("Add New"); addButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { ui.addWindow(new AddNewWindow(project, user)); } }); Button deleteButton = new Button("Delete"); deleteButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { delete(); } }); ve.setSpacing(true); ve.addComponent(addButton); ve.addComponent(deleteButton); //addButton.setWidth("100%"); addButton.setIcon(Icons.PLUS); deleteButton.setIcon(Icons.CROSS); ve.setComponentAlignment(addButton, Alignment.MIDDLE_CENTER); ve.setComponentAlignment(deleteButton, Alignment.MIDDLE_CENTER); //ho.setExpandRatio(addButton, 1); mainLayout.addComponent(ve); setCompositionRoot(mainLayout); } private void delete() { final String sel = (String) tree.getValue(); if (TITLE_VIEWS.equals(tree.getParent(sel))) { final String msg = "Delete View "+sel+"?"; ConfirmDialog.show(ui, msg, msg, "Yes", "No", new ConfirmDialog.Listener() { @Override public void onClose(ConfirmDialog d) { if (d.isConfirmed()) { project.removeProjectItem(sel, user); } } }); } else if (TITLE_OTHER_FILES.equals(tree.getParent(sel))) { // TODO hard-code App.java, should get the name from somewhere else if ("App.java".equals(sel)) { Notification.show("Can't delete " +sel); return; } final String msg = "Delete File "+sel+"?"; ConfirmDialog.show(ui, msg, msg, "Yes", "No", new ConfirmDialog.Listener() { @Override public void onClose(ConfirmDialog d) { if (d.isConfirmed()) { project.removeProjectItem(sel, user); } } }); } } public void addComponentListener(Listener li) { listeners.add(li); } @Override public void attach() { super.attach(); this.ui = UI.getCurrent(); tree.addContainerProperty("Name", Label.class, null); tree.setImmediate(true); tree.setWidth("100%"); tree.setSelectable(true); tree.addValueChangeListener(this); draw(); project.addListener(this); } @Override public void detach() { project.removeListener(this); super.detach(); } private void draw() { tree.removeAllItems(); tree.addItem(new Object[]{new Label(TITLE_VIEWS)}, TITLE_VIEWS); tree.addItem(new Object[]{new Label(TITLE_OTHER_FILES)}, TITLE_OTHER_FILES); List<ProjectItem> items = project.getProjectItemsCopy(); for (ProjectItem pi : items) { String id = pi.getName(); tree.addItem(new Object[]{new ProjectItemLabel(pi)}, id); tree.setItemIcon(id, pi.getIcon()); tree.setChildrenAllowed(id, false); if (pi instanceof SharedView) { tree.setParent(id, TITLE_VIEWS); } else { tree.setParent(id, TITLE_OTHER_FILES); } } tree.setCollapsed(TITLE_VIEWS, false); tree.setCollapsed(TITLE_OTHER_FILES, false); } private void fireComponentSelected(String name) { for (Listener li : listeners) { li.projectItemSelected(name); } } @Override public void changed() { ui.access(new Runnable() { @Override public void run() { draw(); } }); } @Override public void valueChange(ValueChangeEvent event) { String id = (String) event.getProperty().getValue(); Object parent = tree.getParent(id); if (TITLE_VIEWS.equals(parent) || TITLE_OTHER_FILES.equals(parent)) { fireComponentSelected(id); } } }