// --------------------------------------------------- // University of California Santa Barbara // Media Arts and Technology // MAT 259 | Visualizing Information | Winter 2011 // // Patrick Rudolph // Project 2 | TreeMap // // Data Structures for a single TreeMap // --------------------------------------------------- class CountryMap { int id; String name; String data; PImage img; boolean[] enabled = new boolean[10]; int[][] sumCategories = new int[10][2]; // [?][0] for the class name, [?][1] for the number of items int sum; DeweyL1 rootItem; DeweyL2 rolloverItem; DeweyL1 taggedItem; DeweyL1 zoomItem; BoundsIntegrator zoomBounds; CountryMap(int id, String name, String src) { // once this.id = id; this.name = name; this.data = src+".txt"; this.img = loadImage(src+".png"); zoomBounds = new BoundsIntegrator(0, 0, rectW*2, rectH*2); for(int i = 0; i < 10; i++) { enabled[i] = true; sumCategories[i][0] = i; } } void initializeTreeMap() { // once // root level rootItem = new DeweyL1(null,"000",name,0,id,0); // level 1 & 2 // optimize variable usage... String[] deweyData = loadStrings(data); String[] namesL1 = loadStrings(deweyNamesL1); String[] namesL2 = loadStrings(deweyNamesL2); rootItem.items = new Mappable[10]; int sumL1, sumL2; for(int i = 0; i < rootItem.items.length; i++) { // level 1: 10 dewey categories DeweyL1 newItem = new DeweyL1(rootItem,i+"00",namesL1[i],1,id,i); newItem.items = new Mappable[10]; sumL1 = 0; sumL2 = 0; for(int k = 0; k < 100; k++) { // level 2: 100 dewey categories sumL1 += Integer.parseInt(deweyData[i*100+k]); sumL2 += Integer.parseInt(deweyData[i*100+k]); if( (k+1)%10 == 0 ) { // only create a new item for every 10th deweynumber (stay in level 2) int idx = (k+1)/10-1; newItem.items[idx] = new DeweyL2(newItem,i+""+idx+"0",namesL2[idx+i*10],2,id,idx); newItem.items[idx].setSize(sumL2); sumL2 = 0; } } newItem.setSize(sumL1); rootItem.items[i] = newItem; rootItem.setSize( rootItem.getSize()+sumL1 ); sum += sumL1; sumCategories[i][1] += sumL1; } sortCategories(); rootItem.setBounds(0, 0, rectW*2, rectH*2); rootItem.contentsVisible = true; rootItem.zoomIn(); rootItem.updateColors(); } void sortCategories() { // once + everytime a new selection is applied // sort multi-dimensional arrays Arrays.sort(sumCategories, new Comparator() { //@Override public int compare(int[] o1, int[] o2) { return o2[1] - o1[1]; } }); } void disableItem(int idx) { // once + everytime a new selection is applied if(enabled[idx]) { enabled[idx] = false; Mappable[] items = rootItem.items; DeweyL1 item = (DeweyL1) items[idx]; item.oldSize = item.getSize(); item.setSize(0); } } void enableItem(int idx) { // once + everytime a new selection is applied if(!enabled[idx]) { enabled[idx] = true; Mappable[] items = rootItem.items; DeweyL1 item = (DeweyL1) items[idx]; item.setSize(item.oldSize); } } void updateLayout() { rootItem.layoutValid = false; // recalculate level 1 layout for(int i = 0; i < rootItem.items.length; i++) { // recalculate level 2 layouts ((DeweyL1)rootItem.items[i]).layoutValid = false; } } void drawBackground() { // constantly pushMatrix(); translate(0,0,-2); fill(colMapBg); rect(-rectW-3,-rectH-3,rectW+3,rectH+3); popMatrix(); } void drawTreeMap() { // constantly zoomBounds.update(); rolloverItem = null; taggedItem = null; if (rootItem != null) { rootItem.draw(); } if (rolloverItem != null && getFront() == this) { rolloverItem.drawTitle(); } if (taggedItem != null) { taggedItem.drawTag(); } } }