Code Search for Developers
 
 
  

ProjectWhiteBoard.java from MASE: Agile Software Engineering at Krugle


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

MASE: Agile Software Engineering

The MASE project investigates methods to support the coordination and executable acceptance testing of software projects. Keywords: Agile methods, distributed teams, Extreme Programming. See http://ebe.cpsc.ucalgary.ca/ebe for more information.

Project homepage: http://sourceforge.net/projects/mase
Programming language(s): Java,XML
License: other

  CheckBoxWithID.java
  CreateIterationDialogBox.java
  CreateProjectDialogBox.java
  CreateStoryCardDialogBox.java
  ImageButton.java
  ImageWithID.java
  LoadProjectElement.java
  MoveStoryCardElement.java
  ProjectWhiteBoard.java
  StoryCardGrid.java
  StoryCardParentListBox.java
  TextBoxWithID.java
  WebUIMenu.java