public static void loadBlockDrawerSets(
      Workspace workspace, Element root, FactoryManager manager) {
    Pattern attrExtractor = Pattern.compile("\"(.*)\"");
    Matcher nameMatcher;
    NodeList drawerSetNodes = root.getElementsByTagName("BlockDrawerSet");
    Node drawerSetNode;
    for (int i = 0; i < drawerSetNodes.getLength(); i++) {
      drawerSetNode = drawerSetNodes.item(i);
      if (drawerSetNode.getNodeName().equals("BlockDrawerSet")) {
        NodeList drawerNodes = drawerSetNode.getChildNodes();
        Node drawerNode;
        // retreive drawer information of this bar
        for (int j = 0; j < drawerNodes.getLength(); j++) {
          drawerNode = drawerNodes.item(j);
          if (drawerNode.getNodeName().equals("BlockDrawer")) {
            String drawerName = null;
            Color buttonColor = Color.blue;
            StringTokenizer col;
            nameMatcher =
                attrExtractor.matcher(drawerNode.getAttributes().getNamedItem("name").toString());
            if (nameMatcher.find()) { // will be true
              drawerName = nameMatcher.group(1);
            }

            // get drawer's color:
            Node colorNode = drawerNode.getAttributes().getNamedItem("button-color");
            //    					if(colorNode == null){
            //    						buttonColor = Color.blue;
            //    						System.out.println("Loading a drawer without defined color: ");
            //    						for(int ai=0; ai<drawerNode.getAttributes().getLength(); ai++){
            //
            //	System.out.println("\t"+drawerNode.getAttributes().item(ai).getNodeName()+
            //        								", "+drawerNode.getAttributes().item(ai).getNodeValue());
            //        					}
            //    					}else{
            if (colorNode != null) {
              nameMatcher = attrExtractor.matcher(colorNode.toString());
              if (nameMatcher.find()) { // will be true
                col = new StringTokenizer(nameMatcher.group(1));
                if (col.countTokens() == 3) {
                  buttonColor =
                      new Color(
                          Integer.parseInt(col.nextToken()),
                          Integer.parseInt(col.nextToken()),
                          Integer.parseInt(col.nextToken()));
                } else {
                  buttonColor = Color.BLACK;
                }
              }
            }

            manager.addStaticDrawer(drawerName, buttonColor);

            // get block genuses in drawer and create blocks
            NodeList drawerBlocks = drawerNode.getChildNodes();
            Node blockNode;
            ArrayList<RenderableBlock> drawerRBs = new ArrayList<RenderableBlock>();
            for (int k = 0; k < drawerBlocks.getLength(); k++) {
              blockNode = drawerBlocks.item(k);
              if (blockNode.getNodeName().equals("BlockGenusMember")) {
                String genusName = blockNode.getTextContent();
                assert BlockGenus.getGenusWithName(genusName) != null
                    : "Unknown BlockGenus: " + genusName;
                Block newBlock;
                // don't link factory blocks to their stubs because they will
                // forever remain inside the drawer and never be active
                newBlock = new Block(workspace, genusName, false);
                drawerRBs.add(
                    new FactoryRenderableBlock(workspace, manager, newBlock.getBlockID()));
              }
            }
            manager.addStaticBlocks(drawerRBs, drawerName);
          }
        }
      }
    }
  }