void init() {
    int innerWidth = width - border * 2;

    /** Sketch */
    Panel sketchPanel = new Panel();
    sketchPanel.setLayout(new FlowLayout(FlowLayout.LEADING));
    sketchPanel.setBackground(new Color(panelBG));
    sketchPanel.setPreferredSize(new Dimension(innerWidth, 270));

    CheckboxGroup sketchToolsGroup = new CheckboxGroup();
    Checkbox lineTool = new Checkbox("Line", sketchToolsGroup, true);
    lineTool.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.sketch.setCurrentTool(Sketch.Tool.LINE);
          }
        });
    Checkbox polygonTool = new Checkbox("Polygon", sketchToolsGroup, false);
    polygonTool.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.sketch.setCurrentTool(Sketch.Tool.POLYGON);
          }
        });
    Checkbox selectTool = new Checkbox("Select", sketchToolsGroup, false);
    selectTool.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.sketch.setCurrentTool(Sketch.Tool.SELECT);
          }
        });
    Checkbox moveTool = new Checkbox("Move", sketchToolsGroup, false);
    moveTool.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.sketch.setCurrentTool(Sketch.Tool.MOVE);
          }
        });

    strokeColor = new ColorWell();
    strokeColor.addChangeListener(
        new ChangeListener() {
          @Override
          public void stateChanged(ChangeEvent e) {
            maker.sketch.setStrokeColor(strokeColor.getColor().getRGB());
          }
        });
    fillColor = new ColorWell();
    fillColor.addChangeListener(
        new ChangeListener() {
          @Override
          public void stateChanged(ChangeEvent e) {
            maker.sketch.setFillColor(fillColor.getColor().getRGB());
          }
        });

    snapH = new Checkbox("Snap Horizontal (H)");
    snapH.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.sketch.snapToHorz = snapH.getState();
          }
        });
    snapV = new Checkbox("Snap Vertical (V)");
    snapV.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.sketch.snapToVert = snapV.getState();
          }
        });
    drawCurves = new Checkbox("Draw Curves (C)");
    drawCurves.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.sketch.drawCurves = drawCurves.getState();
          }
        });
    invertCurve = new Checkbox("Invert Curve (I)");
    invertCurve.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.sketch.invertCurve = invertCurve.getState();
          }
        });

    Button clearSketch = new Button("Clear");
    clearSketch.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.sketch.clear();
            maker.redraw();
          }
        });

    showSketchLines = new Checkbox("Grid Lines");
    showSketchLines.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.sketch.drawSnapGrid = showSketchLines.getState();
            maker.redraw();
          }
        });

    Button snapGridDecrement = new Button("Grid -");
    snapGridDecrement.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.sketch.snapGridDecrement();
            maker.redraw();
          }
        });
    Button snapGridIncrement = new Button("Grid +");
    snapGridIncrement.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.sketch.snapGridIncrement();
            maker.redraw();
          }
        });

    sketchPanel.add(new Label("Sketch"));
    sketchPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    sketchPanel.add(new Label("Tools"));
    sketchPanel.add(lineTool);
    sketchPanel.add(polygonTool);
    sketchPanel.add(selectTool);
    sketchPanel.add(moveTool);
    sketchPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    sketchPanel.add(new Label("Stroke"));
    sketchPanel.add(strokeColor);
    sketchPanel.add(new Label("Fill"));
    sketchPanel.add(fillColor);
    sketchPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    sketchPanel.add(snapH);
    sketchPanel.add(snapV);
    sketchPanel.add(drawCurves);
    sketchPanel.add(invertCurve);
    sketchPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    sketchPanel.add(clearSketch);
    sketchPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    sketchPanel.add(snapGridDecrement);
    sketchPanel.add(snapGridIncrement);
    sketchPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    sketchPanel.add(showSketchLines);

    /** Palette */
    Panel palettePanel = new Panel();
    palettePanel.setLayout(new FlowLayout(FlowLayout.LEADING));
    palettePanel.setBackground(new Color(panelBG));
    palettePanel.setPreferredSize(new Dimension(innerWidth, 110));

    Button addToPalette = new Button("Add Sketch Tile");
    addToPalette.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.palette.saveTileToPalette();
            maker.redraw();
          }
        });

    Button editTile = new Button("Edit Tile");
    editTile.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.palette.loadPaletteTileToSketch();
            maker.redraw();
          }
        });

    Button deleteTile = new Button("Delete Tile(s)");
    deleteTile.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.palette.deletePaletteTile();
            maker.redraw();
          }
        });

    Button clearPalette = new Button("Remove All");
    clearPalette.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.palette.clear();
            maker.redraw();
          }
        });

    palettePanel.add(new Label("Palette"));
    palettePanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    palettePanel.add(addToPalette);
    palettePanel.add(editTile);
    palettePanel.add(deleteTile);
    palettePanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    palettePanel.add(clearPalette);

    /** Grid */
    Panel gridPanel = new Panel();
    gridPanel.setLayout(new FlowLayout(FlowLayout.LEADING));
    gridPanel.setBackground(new Color(panelBG));
    gridPanel.setPreferredSize(new Dimension(innerWidth, 270));

    CheckboxGroup toolsGroup = new CheckboxGroup();
    Checkbox paintTool = new Checkbox("Paint", toolsGroup, true);
    paintTool.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.getCurrentLayout().currentTool = Layout.Tool.PAINT;
          }
        });
    Checkbox lockTool = new Checkbox("Lock", toolsGroup, false);
    lockTool.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.getCurrentLayout().currentTool = Layout.Tool.LOCK;
          }
        });
    Checkbox gridSelectTool = new Checkbox("Select", toolsGroup, false);
    gridSelectTool.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.getCurrentLayout().currentTool = Layout.Tool.SELECT;
          }
        });
    Checkbox gridMoveTool = new Checkbox("Move", toolsGroup, false);
    gridMoveTool.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.getCurrentLayout().currentTool = Layout.Tool.MOVE;
          }
        });

    final Choice layoutChoice = new Choice();
    layoutChoice.add("Seamless Progressive");
    layoutChoice.add("Seamless Random");
    layoutChoice.add("Pure Random");

    layoutChoice.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            String l = layoutChoice.getSelectedItem();
            if (l == "Seamless Progressive") {
              maker.getCurrentLayout().currentLayout = Layout.LayoutType.SEAM_PROG;
            } else if (l == "Seamless Random") {
              maker.getCurrentLayout().currentLayout = Layout.LayoutType.SEAM_RND;
            } else if (l == "Pure Random") {
              maker.getCurrentLayout().currentLayout = Layout.LayoutType.RND;
            }
          }
        });

    Scrollbar percentageFull = new Scrollbar(Scrollbar.HORIZONTAL, 100, 20, 0, 120);
    percentageFull.setPreferredSize(new Dimension(innerWidth / 2, 20));
    percentageFull.addAdjustmentListener(
        new AdjustmentListener() {
          @Override
          public void adjustmentValueChanged(AdjustmentEvent e) {
            float amount = (float) e.getValue() / 100;
            maker.getCurrentLayout().percentageFull = amount;
          }
        });

    final Checkbox transformI = new Checkbox("I", true);
    transformI.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.orientationsToUse.put(
                TruchetMaker.Orientation.I.toString(), transformI.getState());
          }
        });
    final Checkbox transform90 = new Checkbox("90", true);
    transform90.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.orientationsToUse.put(
                TruchetMaker.Orientation.R90.toString(), transform90.getState());
          }
        });
    final Checkbox transform180 = new Checkbox("180", true);
    transform180.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.orientationsToUse.put(
                TruchetMaker.Orientation.R180.toString(), transform180.getState());
          }
        });
    final Checkbox transform270 = new Checkbox("270", true);
    transform270.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.orientationsToUse.put(
                TruchetMaker.Orientation.R270.toString(), transform270.getState());
          }
        });
    final Checkbox transformH = new Checkbox("H", true);
    transformH.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.orientationsToUse.put(
                TruchetMaker.Orientation.MH.toString(), transformH.getState());
          }
        });
    final Checkbox transformV = new Checkbox("V", true);
    transformV.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.orientationsToUse.put(
                TruchetMaker.Orientation.MV.toString(), transformV.getState());
          }
        });

    Button doLayout = new Button("Do Layout");
    doLayout.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            for (Layout l : maker.layouts) {
              l.doLayout();
            }
          }
        });

    Button clearGrid = new Button("Clear");
    clearGrid.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.getCurrentLayout().clear();
            maker.redraw();
          }
        });

    Button incrementGrid = new Button("Grid +");
    incrementGrid.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.getCurrentLayout().incrementGridSize();
            maker.redraw();
          }
        });
    Button decrementGrid = new Button("Grid -");
    decrementGrid.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.getCurrentLayout().decrementGridSize();
            maker.redraw();
          }
        });

    final Checkbox showGridLines = new Checkbox("Grid Lines");
    //		showGridLines.setState(maker.grid.drawGridLines); // not available at this point
    showGridLines.setState(true);
    showGridLines.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.getCurrentLayout().drawGridLines = showGridLines.getState();
            maker.redraw();
          }
        });

    showStateOverlay = new Checkbox("Show States");
    showStateOverlay.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            maker.getCurrentLayout().overlayVisible(showStateOverlay.getState());
            maker.redraw();
          }
        });

    gridPanel.add(new Label("Grid"));
    gridPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    gridPanel.add(new Label("Tools"));
    gridPanel.add(paintTool);
    gridPanel.add(lockTool);
    gridPanel.add(gridSelectTool);
    gridPanel.add(gridMoveTool);
    gridPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    gridPanel.add(new Label("Layout"));
    gridPanel.add(layoutChoice);
    gridPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    gridPanel.add(new Label("Empty"));
    gridPanel.add(percentageFull);
    gridPanel.add(new Label("Full"));
    gridPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    gridPanel.add(transformI);
    gridPanel.add(transform90);
    gridPanel.add(transform180);
    gridPanel.add(transform270);
    gridPanel.add(transformH);
    gridPanel.add(transformV);
    gridPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    gridPanel.add(doLayout);
    gridPanel.add(clearGrid);
    gridPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    gridPanel.add(decrementGrid);
    gridPanel.add(incrementGrid);
    gridPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    gridPanel.add(showGridLines);
    gridPanel.add(showStateOverlay);

    add(sketchPanel);
    add(palettePanel);
    add(gridPanel);

    Panel layoutsPanel = new Panel();
    layoutsPanel.setLayout(new FlowLayout(FlowLayout.LEADING));
    layoutsPanel.setBackground(new Color(panelBG));
    layoutsPanel.setPreferredSize(new Dimension(innerWidth, 70));

    final Choice layouts = new Choice();
    layouts.setPreferredSize(new Dimension(100, 20));
    layouts.add("Grid 1");
    layouts.addItemListener(
        new ItemListener() {
          @Override
          public void itemStateChanged(ItemEvent e) {
            int i = layouts.getSelectedIndex();
            maker.setCurrentLayout(maker.layouts.get(i));
            maker.redraw();
          }
        });

    Button addLayout = new Button("Add Grid");
    addLayout.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.addLayout();
            layouts.add("Grid " + maker.layouts.size());
            maker.redraw();
          }
        });
    Button removeLayout = new Button("Remove Grid");
    removeLayout.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            maker.removeLayout();
            layouts.removeAll();
            for (int i = 0; i < maker.layouts.size(); i++) {
              layouts.add("Grid " + (i + 1));
              maker.redraw();
            }
          }
        });

    layoutsPanel.add(addLayout);
    layoutsPanel.add(removeLayout);
    layoutsPanel.add(Box.createRigidArea(new Dimension(innerWidth, 0)));
    layoutsPanel.add(layouts);
    add(layoutsPanel);

    addKeyListener(
        new KeyListener() {
          @Override
          public void keyPressed(KeyEvent e) {
            switch (e.getKeyCode()) {
              case KeyEvent.VK_C:
                maker.sketch.drawCurves = !maker.sketch.drawCurves;
                drawCurves.setState(maker.sketch.drawCurves);
                break;
              case KeyEvent.VK_I:
                maker.sketch.invertCurve = !maker.sketch.invertCurve;
                invertCurve.setState(maker.sketch.invertCurve);
                break;
              case KeyEvent.VK_H:
                maker.sketch.snapToHorz = !maker.sketch.snapToHorz;
                snapH.setState(maker.sketch.snapToHorz);
                break;
              case KeyEvent.VK_V:
                maker.sketch.snapToVert = !maker.sketch.snapToVert;
                snapV.setState(maker.sketch.snapToVert);
                break;
            }
          }

          @Override
          public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub
          }

          @Override
          public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub
          }
        });

    addWindowListener(
        new WindowListener() {

          @Override
          public void windowClosing(WindowEvent e) {
            //				dispose();
            //				System.exit(0);
          }

          @Override
          public void windowOpened(WindowEvent e) {
            // TODO Auto-generated method stub
          }

          @Override
          public void windowClosed(WindowEvent e) {
            // TODO Auto-generated method stub
          }

          @Override
          public void windowIconified(WindowEvent e) {
            // TODO Auto-generated method stub
          }

          @Override
          public void windowDeiconified(WindowEvent e) {
            // TODO Auto-generated method stub
          }

          @Override
          public void windowActivated(WindowEvent e) {
            // TODO Auto-generated method stub
          }

          @Override
          public void windowDeactivated(WindowEvent e) {
            // TODO Auto-generated method stub
          }
        });
  }
  public MokumFrame() {
    setTitle("Heuristieken 2014 - Mokum Airlines! - Group 4 \"De Vliegende Hollanders\"");
    setLayout(new BorderLayout());
    setSize(1024, 768);

    frame = this;

    Dienstregeling dienstregeling = maakDienstregeling();

    schaal = new Scrollbar();
    schaal.setMaximum(100);
    schaal.setMinimum(1);
    schaal.setOrientation(Scrollbar.HORIZONTAL);
    schaal.setValue(45);
    schaal.setPreferredSize(new Dimension(250, 20));
    redrawButton = new Button("Redraw!");
    left = new BasicArrowButton(BasicArrowButton.WEST);
    right = new BasicArrowButton(BasicArrowButton.EAST);

    traffic = new GlobalTraffic(dienstregeling);
    dienst = new DienstregelingCanvas(dienstregeling);

    schaal.addAdjustmentListener(
        new AdjustmentListener() {
          // Houdt bij of er aan de scrollbar gezet is of niet
          public void adjustmentValueChanged(AdjustmentEvent e) {
            double scaleFactor = (double) schaal.getValue() / 100;
            dienst.setScaleFactor(scaleFactor);
            frame.redraw(200);
          }
        });
    redrawButton.addActionListener(
        new ActionListener() {
          // Houdt bij of er op de knop gedrukt is
          public void actionPerformed(ActionEvent evt) {
            if (evt.getSource() == redrawButton) {
              Dienstregeling dienstregeling = maakDienstregeling();
              traffic.setDienstregeling(dienstregeling);
              dienst.setDienstregeling(dienstregeling);
              frame.redraw(200);
            }
          }
        });

    left.addActionListener(
        new ActionListener() {
          // Houdt bij of er op de knop gedrukt is
          public void actionPerformed(ActionEvent evt) {
            if (evt.getSource() == left) {
              int val = schaal.getValue();
              schaal.setValue(val - 1);
              double scaleFactor = (double) schaal.getValue() / 100;
              dienst.setScaleFactor(scaleFactor);
              frame.redraw(200);
            }
          }
        });

    right.addActionListener(
        new ActionListener() {
          // Houdt bij of er op de knop gedrukt is
          public void actionPerformed(ActionEvent evt) {
            if (evt.getSource() == right) {
              int val = schaal.getValue();
              schaal.setValue(val + 1);
              double scaleFactor = (double) schaal.getValue() / 100;
              dienst.setScaleFactor(scaleFactor);
              frame.redraw(200);
            }
          }
        });

    Panel buttonPane = new Panel();
    buttonPane.setLayout(new FlowLayout());
    buttonPane.add(left);
    buttonPane.add(schaal);
    buttonPane.add(right);
    buttonPane.add(redrawButton);

    buttonPane.setPreferredSize(new Dimension(1024, 40));

    this.add(buttonPane, BorderLayout.SOUTH);

    JPanel topPanel = new JPanel();
    topPanel.add(traffic, BorderLayout.CENTER);
    traffic.setLocation(frame.getWidth() / 2, 0);

    this.add(topPanel, BorderLayout.NORTH);
    this.add(dienst, BorderLayout.CENTER);

    // Exit the program when the window is closed
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Close the window when escape is pressed
    this.addKeyListener(
        new KeyAdapter() {
          @Override
          public void keyPressed(KeyEvent e) {
            super.keyPressed(e);
            if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
              System.exit(0);
            }
          }
        });

    mouseX = 0;
    mouseY = 0;

    this.addMouseMotionListener(
        new MouseMotionAdapter() {

          @Override
          public void mouseMoved(MouseEvent e) {
            super.mouseMoved(e);
            mouseX = (e.getX());
            mouseY = (e.getY()) - 25; // offset the 25px top bar

            mouseposition.setText(String.format("Mouse: %d, %d", mouseX, mouseY));
          }
        });

    mouseposition = new JLabel("Mouse:");
    buttonPane.add(mouseposition);

    // Resize the window
    pack();

    setVisible(true);
    frame.redraw(200);
  }