Show ProjectWhiteBoard.java syntax highlighted
package ucalgary.ebe.webui.client.ui;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
import ucalgary.ebe.webui.client.WebUI2ServiceConnection;
import ucalgary.ebe.webui.client.data.BacklogWeb;
import ucalgary.ebe.webui.client.data.IterationWeb;
import ucalgary.ebe.webui.client.data.ProjectWeb;
import ucalgary.ebe.webui.client.data.StoryCardWeb;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.ChangeListener;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.FocusListener;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;
import com.google.gwt.user.client.ui.Widget;
public class ProjectWhiteBoard extends Tree {
private static final String FLOAT_PATTERN = "\\d+(\\.{1}\\d+)?";
private static final String ONLY_DATE_TIMESTAMP_PATTERN = "(\\d){4}-(\\d){2}-(\\d){2}";
private static final String TIMESTAMP_PATTERN = "(\\d){4}-(\\d){2}-(\\d){2}(\\s(\\d){2}:(\\d){2}:(\\d){2}(\\.\\d{1,9})?)?";
private WebUI2ServiceConnection con;
private HashMap lookup = new HashMap();
public ProjectWhiteBoard(WebUI2ServiceConnection con, ProjectWeb project) {
super();
this.con = con;
this.createProjectTree(project);
}
/****************************************************************************************
* ADD *
****************************************************************************************/
/**
* Adds a backlog to an existing project
*
* @param backlog Backlog data
*/
public void addBacklog(BacklogWeb backlog) {
this.getItem(0).addItem(createBacklogItem(backlog));
}
/**
* Adds an iteration to an existing project
*
* @param iteration Iteration data
*/
public void addIteration(IterationWeb iteration) {
this.getItem(0).addItem(createIterationItem(iteration));
}
/**
* Adds a storycard to an existing iteration or backlog
*
* @param storycard Storycard data
*/
public void addStoryCard(StoryCardWeb storycard) {
try {
Long parentid = new Long(storycard.getParent());
TreeItem parent = (TreeItem) this.lookup.get(parentid);
TreeItem item = parent.getChild(0);
StoryCardGrid storycards = (StoryCardGrid)item.getWidget();
storycards.addStoryCard(storycard);
} catch(Exception e) {
e.printStackTrace();
}
}
/****************************************************************************************
* CREATE *
****************************************************************************************/
/**
* Creates a tree with the project data received from the webservice
*
* @param project Project data
*/
private void createProjectTree(ProjectWeb project) {
Grid prjgrid = new Grid(1, 2);
prjgrid.addStyleName("webui-ProjectGrid");
prjgrid.setBorderWidth(1);
//ADD PROJECT ICON
Image prj_image = new Image("images/project.gif");
prj_image.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
// TODO Auto-generated method stub
System.out.println("Edit project");
}
});
prjgrid.setWidget(0, 0, prj_image);
//ADD PROJECT NAME TEXTBOX
TextBoxWithID prj_name_textbox = new TextBoxWithID(project.getId());
prj_name_textbox.setText(project.getName());
prj_name_textbox.addStyleName("webui-ProjectName");
prj_name_textbox.addStyleName("webui-Project-OutOfFocus");
prj_name_textbox.addFocusListener(new FocusListener() {
public void onFocus(Widget sender) {
//HIGHLIGHT EDITED FIELD
sender.addStyleName("webui-Project-InFocus");
sender.removeStyleName("webui-Project-OutOfFocus");
}
public void onLostFocus(Widget sender) {
//SET FIELD BACK TO NORMAL TABLE DESIGN
sender.addStyleName("webui-Project-OutOfFocus");
sender.removeStyleName("webui-Project-InFocus");
//COMMIT CHANGES
TextBoxWithID tb = (TextBoxWithID)sender;
getConnection().updateProjectName(tb.getId(), tb.getText());
}
});
prjgrid.setWidget(0, 1, prj_name_textbox);
TreeItem prj = new TreeItem(prjgrid);
this.addItem(prj);
//TODO check if there really are any children of the project!
if(project.getBacklog() != null) {
// CREATE ITEM FOR BACKLOG
prj.addItem(this.createBacklogItem(project.getBacklog()));
}
Vector iterations = project.getIterationChildren();
if(!iterations.isEmpty()) {
// CREATE ITEMS FOR ALL ITERATIONS
for (int i = 0; i < project.getIterationChildren().size(); i++) {
prj.addItem(this.createIterationItem((IterationWeb)iterations.get(i)));
}
}
}
/**
* Creates treeitems for every iteration and the storycards in that
* iteration
*
* @param iteration Iteration data
* @return TreeItem with all iteration data (including storycard children)
*/
private TreeItem createIterationItem(IterationWeb iteration) {
Grid itergrid = new Grid(1, 7);
itergrid.addStyleName("webui-IterationGrid");
itergrid.setBorderWidth(1);
//ADD ITERATION ICON
Image iter_image = new Image("images/iteration.gif");
iter_image.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
System.out.println("Edit iteration");
}
});
itergrid.setWidget(0, 0, iter_image);
//ADD ITERATION NAME TEXTBOX
TextBoxWithID itername_textbox = new TextBoxWithID(iteration.getId());
itername_textbox.setText(iteration.getName());
itername_textbox.addStyleName("webui-Iteration-OutOfFocus");
itername_textbox.addFocusListener(new FocusListener() {
public void onFocus(Widget sender) {
//HIGHLIGHT EDITED FIELD
sender.addStyleName("webui-Iteration-InFocus");
sender.removeStyleName("webui-Iteration-OutOfFocus");
}
public void onLostFocus(Widget sender) {
//SET FIELD BACK TO NORMAL TABLE DESIGN
sender.addStyleName("webui-Iteration-OutOfFocus");
sender.removeStyleName("webui-Iteration-InFocus");
//COMMIT CHANGES
TextBoxWithID tb = (TextBoxWithID)sender;
getConnection().updateIterationName(tb.getId(), tb.getText());
}
});
itergrid.setWidget(0, 1, itername_textbox);
//ADD ITERATION DESCRIPTION TEXTBOX
TextBoxWithID iterdesc_textbox = new TextBoxWithID(iteration.getId());
iterdesc_textbox.setText(iteration.getDescription());
iterdesc_textbox.addStyleName("webui-Iteration-OutOfFocus");
iterdesc_textbox.addFocusListener(new FocusListener() {
public void onFocus(Widget sender) {
//HIGHLIGHT EDITED FIELD
sender.addStyleName("webui-Iteration-InFocus");
sender.removeStyleName("webui-Iteration-OutOfFocus");
}
public void onLostFocus(Widget sender) {
//SET FIELD BACK TO NORMAL TABLE DESIGN
sender.addStyleName("webui-Iteration-OutOfFocus");
sender.removeStyleName("webui-Iteration-InFocus");
//COMMIT CHANGES
TextBoxWithID tb = (TextBoxWithID)sender;
getConnection().updateIterationDescription(tb.getId(), tb.getText());
}
});
itergrid.setWidget(0, 2, iterdesc_textbox);
//ADD ITERATION ENDDATE TEXTBOX
TextBoxWithID iterend_textbox = new TextBoxWithID(iteration.getId(), iteration.getEndDate());
iterend_textbox.setText(iteration.getEndDate());
iterend_textbox.addStyleName("webui-Iteration-OutOfFocus");
iterend_textbox.addFocusListener(new FocusListener() {
public void onFocus(Widget sender) {
//HIGHLIGHT EDITED FIELD
sender.addStyleName("webui-Iteration-InFocus");
sender.removeStyleName("webui-Iteration-OutOfFocus");
}
public void onLostFocus(Widget sender) {
//SET FIELD BACK TO NORMAL TABLE DESIGN
sender.addStyleName("webui-Iteration-OutOfFocus");
sender.removeStyleName("webui-Iteration-InFocus");
//COMMIT CHANGES
TextBoxWithID tb = (TextBoxWithID)sender;
if(!tb.getText().matches(ONLY_DATE_TIMESTAMP_PATTERN)) {
tb.setText(tb.getOldText());
} else {
tb.setOldText(tb.getText());
getConnection().updateIterationEndDate(tb.getId(), tb.getText());
}
}
});
itergrid.setWidget(0, 3, iterend_textbox);
//ADD ITERATION AVAILABLE EFFORT TEXTBOX
TextBoxWithID iteravail_textbox = new TextBoxWithID(iteration.getId(), String.valueOf(iteration.getAvailableEffort()));
iteravail_textbox.setText(String.valueOf(iteration.getAvailableEffort()));
iteravail_textbox.addStyleName("webui-Iteration-OutOfFocus");
iteravail_textbox.addFocusListener(new FocusListener() {
public void onFocus(Widget sender) {
//HIGHLIGHT EDITED FIELD
sender.addStyleName("webui-Iteration-InFocus");
sender.removeStyleName("webui-Iteration-OutOfFocus");
}
public void onLostFocus(Widget sender) {
//SET FIELD BACK TO NORMAL TABLE DESIGN
sender.addStyleName("webui-Iteration-OutOfFocus");
sender.removeStyleName("webui-Iteration-InFocus");
//COMMIT CHANGES
TextBoxWithID tb = (TextBoxWithID)sender;
if(!tb.getText().matches(FLOAT_PATTERN)) {
tb.setText(tb.getOldText());
} else {
tb.setOldText(tb.getText());
getConnection().updateIterationAvailableEffort(tb.getId(), Float.valueOf(tb.getText()).floatValue());
}
}
});
itergrid.setWidget(0, 4, iteravail_textbox);
//ADD COMPLETE ICON
ImageWithID iter_complete_image = new ImageWithID("images/complete.gif", iteration.getId());
iter_complete_image.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
ImageWithID img = (ImageWithID)sender;
getConnection().updateIterationStatus(img.getId(), StoryCardWeb.STATUS_COMPLETED);
}
});
itergrid.setWidget(0, 5, iter_complete_image);
/*// took away DeleteIteration from methods
//ADD DELETE ICON
ImageWithID iter_delete_image = new ImageWithID("images/delete.gif", iteration.getId());
iter_delete_image.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
if(Window.confirm("Deleting this Iteration is IRREVERSIBLE! Are you really sure?")) {
ImageWithID img = (ImageWithID)sender;
getConnection().deleteIteration(img.getId());
((TreeItem)lookup.get(new Long(img.getId()))).remove();
}
}
});
itergrid.setWidget(0, 6, iter_delete_image);
*/
TreeItem iter = new TreeItem(itergrid);
this.lookup.put(new Long(iteration.getId()), iter);
// CREATE ITEMS FOR ALL STORYCARDS IN ITERATION
iter.addItem(new StoryCardGrid(con, iteration.getStoryCardChildren()));
return iter;
}
/**
* Creates treeitem for the backlog and every storycard in the backlog
*
* @param backlog Backlog data
* @return TreeItem with all backlog data (including storycard children)
*/
private TreeItem createBacklogItem(BacklogWeb backlog) {
Grid backgrid = new Grid(1, 3);
backgrid.addStyleName("webui-BacklogGrid");
backgrid.setBorderWidth(1);
//ADD BACKLOG ICON
Image back_image = new Image("images/product_backlog.gif");
back_image.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
// TODO Auto-generated method stub
System.out.println("Edit Backlog");
}
});
backgrid.setWidget(0, 0, back_image);
backgrid.setText(0, 1, backlog.getName());
//ADD DELETE ICON
ImageWithID delete_back_image = new ImageWithID("images/delete.gif", backlog.getId());
delete_back_image.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
ImageWithID img = (ImageWithID)sender;
// getConnection().deleteBacklog(img.getId());
Window.alert("Backlog can't be deleted!");
}
});
backgrid.setWidget(0, 2, delete_back_image);
TreeItem back = new TreeItem(backgrid);
this.lookup.put(new Long(backlog.getId()), back);
// CREATE ITEMS FOR ALL STORYCARDS IN BACKLOG
back.addItem(new StoryCardGrid(con, backlog.getStoryCardChildren()));
return back;
}
/****************************************************************************************
* HELPER METHODS *
****************************************************************************************/
/**
* Redraws storycardgrid after deletion of a storycard
*
* @param id ID of the storycard parent (backlog or iteration)
* @param storycards Remaining storycards
*/
public void refreshStoryCardGrid(long id, Vector storycards) {
TreeItem parent = (TreeItem)lookup.get(new Long(id));
parent.getChild(0).remove();
parent.addItem(new StoryCardGrid(con, storycards));
}
/**
* @return
*/
public Vector getCheckedStoryCardIDs() {
Iterator parents = this.lookup.values().iterator();
Vector sc_ids = new Vector();
while(parents.hasNext()) {
sc_ids.addAll(((StoryCardGrid)((TreeItem)parents.next()).getChild(0).getWidget()).getCheckedStoryCardIDs());
}
return sc_ids;
}
/****************************************************************************************
* GETTERS & SETTERS *
****************************************************************************************/
/**
* @return Connection to webservice
*/
public WebUI2ServiceConnection getConnection() {
return this.con;
}
/**
* @return Lookup table with all planning objects
*/
public HashMap getLookUp() {
return this.lookup;
}
}
See more files for this project here