public GUI(GeneralDestruction generalDestruction,
			PhysicsController physicsController, View viewMain,
			View viewOrtho1, View viewOrtho2, View viewOrtho3,
			Canvas3D canvasGame, Canvas3D canvasMain, Canvas3D canvasOrtho1,
			Canvas3D canvasOrtho2, Canvas3D canvasOrtho3, Input input,
			int mode, boolean fullscreen) {

		this.generalDestruction = generalDestruction;
		this.physicsController = physicsController;
		input.setGUI(this);

		// Views
		this.viewMain = viewMain;
		this.viewOrtho1 = viewOrtho1;
		this.viewOrtho2 = viewOrtho2;
		this.viewOrtho3 = viewOrtho3;

		// Canvases
		this.canvasGame = canvasGame;
		this.canvasMain = canvasMain;
		this.canvasOrtho1 = canvasOrtho1;
		this.canvasOrtho2 = canvasOrtho2;
		this.canvasOrtho3 = canvasOrtho3;

		mainPanel = new JPanel(new GridLayout(1,1));

		// Game panels
		gamePanel = new JPanel();
		gamePanel.setLayout(new BorderLayout());
		gamePanel.add(canvasGame, BorderLayout.CENTER);

		// Editor panels
		JPanel canvasMainPanel = new JPanel(new GridLayout());
		canvasMainPanel.add(canvasMain);
		JPanel canvasOrtho1Panel = new JPanel(new GridLayout());
		canvasOrtho1Panel.add(canvasOrtho1);
		JPanel canvasOrtho2Panel = new JPanel(new GridLayout());
		canvasOrtho2Panel.add(canvasOrtho2);
		JPanel canvasOrtho3Panel = new JPanel(new GridLayout());
		canvasOrtho3Panel.add(canvasOrtho3);

		canvasMainPanel.setBorder(new TitledBorder(new EtchedBorder(),
				"Perspective"));
		canvasOrtho1Panel
				.setBorder(new TitledBorder(new EtchedBorder(), "Top"));
		canvasOrtho2Panel.setBorder(new TitledBorder(new EtchedBorder(),
				"Front"));
		canvasOrtho3Panel
				.setBorder(new TitledBorder(new EtchedBorder(), "Side"));

		JPanel canvasPanel = new JPanel(new GridLayout(2, 2));
		canvasPanel.add(canvasOrtho1Panel);
		canvasPanel.add(canvasOrtho2Panel);
		canvasPanel.add(canvasMainPanel);
		canvasPanel.add(canvasOrtho3Panel);

		JPanel buttonsPanel = new JPanel(new GridBagLayout());
		ActionListener buttonListener = new ButtonListener();
		openButton = new JButton("Open");
		saveAsButton = new JButton("Save As");
		startStopButton = new JButton("Start Simulation");
		stepButton = new JButton("Step Simulation");
		openButton.addActionListener(buttonListener);
		saveAsButton.addActionListener(buttonListener);
		startStopButton.addActionListener(buttonListener);
		stepButton.addActionListener(buttonListener);

		GridBagConstraints gc = new GridBagConstraints();
		gc.anchor = GridBagConstraints.WEST;
		gc.gridwidth = 1;
		buttonsPanel.add(openButton, gc);
		gc.gridx = 1;
		buttonsPanel.add(saveAsButton, gc);
		gc.gridx = 2;
		buttonsPanel.add(startStopButton, gc);
		gc.gridx = 3;
		gc.weightx = 1;
		buttonsPanel.add(stepButton, gc);

		editorPanel = new JPanel(new BorderLayout());
		editorPanel.add(canvasPanel, BorderLayout.CENTER);
		editorPanel.add(buttonsPanel, BorderLayout.NORTH);

		// Windows
		window = new JFrame();
		window.setPreferredSize(new Dimension(800, 600));
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		window.getContentPane().setLayout(new BorderLayout());
		window.getContentPane().add(buttonsPanel, BorderLayout.NORTH);
		window.getContentPane().add(mainPanel, BorderLayout.CENTER);

		setFullscreen(false);
		setMode(mode == GeneralDestruction.MODE_EDITOR ? GeneralDestruction.MODE_GAME
				: GeneralDestruction.MODE_EDITOR);
		window.pack();
		setMode(mode);
		window.pack();
		setFullscreen(fullscreen);
		window.setLocationRelativeTo(null);
		window.setVisible(true);
	}