private JPanel setupControlPanel() {
        JPanel controlPanel = new JPanel();
        controlPanel.setBorder(new TitledBorder("Controls"));
        GridBagLayout gbl = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();

        controlPanel.setLayout(gbl);
        gbc.anchor = GridBagConstraints.WEST;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.ipady = 0;
        gbc.ipadx = 0;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;

        // a special controls mode panel
        if (setupDragAndDrop) {
            JPanel panel00 = setupControlMode();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 2;
            gbl.setConstraints(panel00, gbc);
            controlPanel.add(panel00);
        }


        // next row
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        {
            // To DO: change setupControls here...
            JPanel panel01 = setupControls(nameTableRegions[0], "Name Table");
            final JCheckBox oamCB = new JCheckBox("Show OAM Grid");
            oamCB.setSelected(nameTableRegions[0].getShowOAMGrid());
            oamCB.addChangeListener(new ChangeListener() {

                public void stateChanged(ChangeEvent e) {
                    nameTableRegions[0].setShowOAMGrid(oamCB.isSelected());
                    for (int i = 0; i < nameTableRegions.length; i++) {
                        nameTableRegions[i].notifyDisplayInterfaceUpdated();
                    }
                }
            });
            panel01.add(oamCB);

            {
                JPanel spinnerPanel = new JPanel();
                spinnerPanel.setLayout(new FlowLayout());
                final JSpinner spinner = new JSpinner();
                Integer value = new Integer(nameTableRegions[0].getScale());
                Integer min = new Integer(NameTablePanel.MIN_SCALE);
                Integer max = new Integer(NameTablePanel.MAX_SCALE);
                Integer step = new Integer(1);
                SpinnerNumberModel spinnerModel = new SpinnerNumberModel(value, min, max, step);
                spinner.setModel(spinnerModel);
                spinner.setToolTipText("Scale for the Name Table");
                spinner.addChangeListener(new ChangeListener() {

                    public void stateChanged(ChangeEvent e) {
                        int newVal = ((Integer) spinner.getModel().getValue()).intValue();
                        for (int i = 0; i < nameTableRegions.length; i++) {
                            nameTableRegions[i].setScale(newVal);
                        }
                    }
                });
                spinnerPanel.add(new JLabel("Scale:"));
                spinnerPanel.add(spinner);
                panel01.add(spinnerPanel);
            }

            gbl.setConstraints(panel01, gbc);
            controlPanel.add(panel01);
        }
        if (editorRegion != null) {
            gbc.gridx = 1;
            gbc.gridy = 1;
            gbc.gridwidth = 1;
            JPanel panel11 = setupControls(editorRegion, "Entry Editor");
            gbl.setConstraints(panel11, gbc);
            controlPanel.add(panel11);
        }

        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.gridwidth = 1;
        {
            JPanel panel02 = setupControls(patternTableRegions[0], "Background Pattern Table");

            ButtonGroup buttonGroup = new ButtonGroup();
            JRadioButton b1 = new JRadioButton("Background Palette");
            buttonGroup.add(b1);
            panel02.add(b1);

            JRadioButton b2 = new JRadioButton("Sprite Palette");
            buttonGroup.add(b2);
            panel02.add(b2);

            buttonGroup.setSelected(b1.getModel(), true);

            b1.addItemListener(new ItemListener() {

                public void itemStateChanged(ItemEvent e) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        patternTableRegions[0].setPaletteType(0);
                    }
                }
            });
            b2.addItemListener(new ItemListener() {

                public void itemStateChanged(ItemEvent e) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        patternTableRegions[0].setPaletteType(1);
                    }
                }
            });
            gbl.setConstraints(panel02, gbc);
            controlPanel.add(panel02);
        }

        gbc.gridx = 1;
        gbc.gridy = 2;
        {
            JPanel panel12 = setupControls(patternTableRegions[1], "Sprite Pattern Table");
            ButtonGroup buttonGroup = new ButtonGroup();
            JRadioButton b1 = new JRadioButton("Background Palette");
            buttonGroup.add(b1);
            panel12.add(b1);

            JRadioButton b2 = new JRadioButton("Sprite Palette");
            buttonGroup.add(b2);
            panel12.add(b2);

            buttonGroup.setSelected(b2.getModel(), true);

            b1.addItemListener(new ItemListener() {

                public void itemStateChanged(ItemEvent e) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        patternTableRegions[1].setPaletteType(0);
                    }
                }
            });
            b2.addItemListener(new ItemListener() {

                public void itemStateChanged(ItemEvent e) {
                    if (e.getStateChange() == ItemEvent.SELECTED) {
                        patternTableRegions[1].setPaletteType(1);
                    }
                }
            });

            gbl.setConstraints(panel12, gbc);
            controlPanel.add(panel12);
        }

        // put it in the top left corner (when scaling)
        JPanel daOtherPanel = new JPanel();
        daOtherPanel.setLayout(new BorderLayout());
        daOtherPanel.add(controlPanel, BorderLayout.NORTH);
        JPanel daPanel = new JPanel();
        daPanel.setLayout(new BorderLayout());
        daPanel.add(daOtherPanel, BorderLayout.WEST);

        return daPanel;
    }