From 694ef5870cbea6804cf2ceb8257080a5dd1977ec Mon Sep 17 00:00:00 2001
From: tobias <tobias.ullerich@icloud.com>
Date: Fri, 5 Aug 2016 22:03:00 +0200
Subject: [PATCH] Code Cleaning

Performance Issue on MainLayout Switching fixed
add Comments
---
 .../playpad/action/cartaction/CartAction.java |   4 +-
 .../desktop/DesktopMainLayoutConnect.java     |  16 +++
 .../DesktopMenuToolbarViewController.java     |  17 +--
 .../layout/touch/TouchMainLayoutConnect.java  |  16 +++
 .../touch/TouchMenuToolbarViewController.java |  24 +---
 .../pad/listener/PadContentListener.java      |   9 +-
 .../main/MainViewControllerV2.java            |  44 +++----
 .../main/VolumeChangeListener.java            |   2 +-
 .../option/MappingTabViewController.java      |   3 +-
 .../viewcontroller/pad/PadDragListener.java   |   1 -
 .../src/de/tobias/playpad/action/Mapping.java |   6 +
 .../action/feedback/ColorAdjustable.java      |   9 ++
 .../action/feedback}/ColorAdjuster.java       |  27 +++--
 .../playpad/view/main/MainLayoutConnect.java  |   8 ++
 .../playpad/view/main/MainLayoutHandler.java  |   5 +-
 .../main/IMainViewController.java             | 110 ++++++++++++++++--
 .../main/MenuToolbarViewController.java       |  73 +++++++-----
 17 files changed, 256 insertions(+), 118 deletions(-)
 create mode 100644 PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjustable.java
 rename {PlayWall/src/de/tobias/playpad/viewcontroller/main => PlayWallCore/src/de/tobias/playpad/action/feedback}/ColorAdjuster.java (70%)

diff --git a/PlayWall/src/de/tobias/playpad/action/cartaction/CartAction.java b/PlayWall/src/de/tobias/playpad/action/cartaction/CartAction.java
index 9d15775c..4c3f5c71 100644
--- a/PlayWall/src/de/tobias/playpad/action/cartaction/CartAction.java
+++ b/PlayWall/src/de/tobias/playpad/action/cartaction/CartAction.java
@@ -6,6 +6,7 @@ import de.tobias.playpad.Strings;
 import de.tobias.playpad.action.Action;
 import de.tobias.playpad.action.InputType;
 import de.tobias.playpad.action.connect.CartActionConnect;
+import de.tobias.playpad.action.feedback.ColorAdjustable;
 import de.tobias.playpad.action.feedback.FeedbackType;
 import de.tobias.playpad.pad.Pad;
 import de.tobias.playpad.pad.PadStatus;
@@ -18,7 +19,7 @@ import de.tobias.utils.util.Localization;
 import javafx.beans.property.SimpleStringProperty;
 import javafx.beans.property.StringProperty;
 
-public class CartAction extends Action {
+public class CartAction extends Action implements ColorAdjustable {
 
 	public enum ControlMode {
 		PLAY_PAUSE,
@@ -63,6 +64,7 @@ public class CartAction extends Action {
 		this.mode = mode;
 	}
 
+	@Override
 	public boolean isAutoFeedbackColors() {
 		return autoFeedbackColors;
 	}
diff --git a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMainLayoutConnect.java b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMainLayoutConnect.java
index 9ef7c735..e39b0662 100644
--- a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMainLayoutConnect.java
+++ b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMainLayoutConnect.java
@@ -1,5 +1,7 @@
 package de.tobias.playpad.layout.desktop;
 
+import java.util.Stack;
+
 import de.tobias.playpad.pad.view.IPadViewV2;
 import de.tobias.playpad.view.main.MainLayoutConnect;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
@@ -9,6 +11,12 @@ public class DesktopMainLayoutConnect implements MainLayoutConnect {
 
 	private DesktopMenuToolbarViewController desktopMenuToolbarViewController;
 
+	private Stack<IPadViewV2> recyclingStack;
+
+	public DesktopMainLayoutConnect() {
+		recyclingStack = new Stack<>();
+	}
+
 	@Override
 	public String getType() {
 		return "Desktop";
@@ -29,9 +37,17 @@ public class DesktopMainLayoutConnect implements MainLayoutConnect {
 
 	@Override
 	public IPadViewV2 createPadView() {
+		if (!recyclingStack.isEmpty()) {
+			return recyclingStack.pop();
+		}
 		return new DesktopPadView();
 	}
 
+	@Override
+	public void recyclePadView(IPadViewV2 padView) {
+		recyclingStack.push(padView);
+	}
+
 	@Override
 	public String getStylesheet() {
 		return null;
diff --git a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
index c8e5b424..94adf0b7 100644
--- a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
+++ b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
@@ -56,7 +56,6 @@ import javafx.scene.control.MenuItem;
 import javafx.scene.control.RadioMenuItem;
 import javafx.scene.control.Slider;
 import javafx.scene.control.ToggleGroup;
-import javafx.scene.image.Image;
 import javafx.scene.input.KeyCombination;
 import javafx.stage.Modality;
 import javafx.stage.Stage;
@@ -90,7 +89,7 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 		toolbarHBox.prefWidthProperty().bind(toolbar.widthProperty().subtract(25));
 		toolbarHBox.prefHeightProperty().bind(toolbar.minHeightProperty());
 
-		showLiveLabel(false);
+		showLiveInfo(false);
 		initLayoutMenu();
 	}
 
@@ -167,16 +166,6 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 		fullScreenMenuItem.setSelected(fullScreenActive);
 	}
 
-	@Override
-	public void addToolbarIcon(Image icon) {
-		// TODO Implement
-	}
-
-	@Override
-	public void removeToolbarIcon(Image icon) {
-		// TODO Implement
-	}
-
 	@Override
 	public void addToolbarItem(Node node) {
 		iconHbox.getChildren().add(node);
@@ -229,7 +218,7 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 	}
 
 	@Override
-	public void showLiveLabel(boolean show) {
+	public void showLiveInfo(boolean show) {
 		liveLabel.setVisible(show);
 	}
 
@@ -333,7 +322,7 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 
 			ProfileViewController controller = new ProfileViewController(mainViewController.getStage(), currentProject);
 			controller.getStage().showAndWait();
-			mainViewController.setTitle();
+			mainViewController.updateWindowTitle();
 		});
 	}
 
diff --git a/PlayWall/src/de/tobias/playpad/layout/touch/TouchMainLayoutConnect.java b/PlayWall/src/de/tobias/playpad/layout/touch/TouchMainLayoutConnect.java
index 5616af4a..be191f56 100644
--- a/PlayWall/src/de/tobias/playpad/layout/touch/TouchMainLayoutConnect.java
+++ b/PlayWall/src/de/tobias/playpad/layout/touch/TouchMainLayoutConnect.java
@@ -1,5 +1,7 @@
 package de.tobias.playpad.layout.touch;
 
+import java.util.Stack;
+
 import de.tobias.playpad.pad.view.IPadViewV2;
 import de.tobias.playpad.view.main.MainLayoutConnect;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
@@ -9,6 +11,12 @@ public class TouchMainLayoutConnect implements MainLayoutConnect {
 
 	private TouchMenuToolbarViewController touchMainLayoutConnect;
 
+	private Stack<IPadViewV2> recyclingStack;
+
+	public TouchMainLayoutConnect() {
+		recyclingStack = new Stack<>();
+	}
+	
 	@Override
 	public String getType() {
 		return "Touch";
@@ -30,9 +38,17 @@ public class TouchMainLayoutConnect implements MainLayoutConnect {
 
 	@Override
 	public IPadViewV2 createPadView() {
+		if (!recyclingStack.isEmpty()) {
+			return recyclingStack.pop();
+		}
 		return new TouchPadView();
 	}
 
+	@Override
+	public void recyclePadView(IPadViewV2 padView) {
+		recyclingStack.push(padView);
+	}
+
 	@Override
 	public String getStylesheet() {
 		return "de/tobias/playpad/assets/style/touch.css";
diff --git a/PlayWall/src/de/tobias/playpad/layout/touch/TouchMenuToolbarViewController.java b/PlayWall/src/de/tobias/playpad/layout/touch/TouchMenuToolbarViewController.java
index c976d00a..34f32b4c 100644
--- a/PlayWall/src/de/tobias/playpad/layout/touch/TouchMenuToolbarViewController.java
+++ b/PlayWall/src/de/tobias/playpad/layout/touch/TouchMenuToolbarViewController.java
@@ -37,7 +37,7 @@ public class TouchMenuToolbarViewController extends BasicMenuToolbarViewControll
 		toolbarHBox.prefWidthProperty().bind(toolbar.widthProperty().subtract(25));
 		toolbarHBox.prefHeightProperty().bind(toolbar.minHeightProperty());
 
-		showLiveLabel(false);
+		showLiveInfo(false);
 	}
 
 	@Override
@@ -70,16 +70,6 @@ public class TouchMenuToolbarViewController extends BasicMenuToolbarViewControll
 		fullScreenMenuItem.setSelected(fullScreenActive);
 	}
 
-	@Override
-	public void addToolbarIcon(Image icon) {
-		// TODO Implement
-	}
-
-	@Override
-	public void removeToolbarIcon(Image icon) {
-		// TODO Implement
-	}
-
 	@Override
 	public void addToolbarItem(Node node) {
 		iconHbox.getChildren().add(node);
@@ -91,21 +81,19 @@ public class TouchMenuToolbarViewController extends BasicMenuToolbarViewControll
 	}
 
 	@Override
-	public void addMenuItem(MenuItem item, MenuType type) {
-	}
+	public void addMenuItem(MenuItem item, MenuType type) {}
 
 	@Override
-	public void removeMenuItem(MenuItem item) {
-	}
+	public void removeMenuItem(MenuItem item) {}
 
 	@Override
 	public boolean isAlwaysOnTopActive() {
-		return false; // TODO
+		return alwaysOnTopItem.isSelected();
 	}
 
 	@Override
 	public boolean isFullscreenActive() {
-		return false; // TODO
+		return fullScreenMenuItem.isSelected();
 	}
 
 	@Override
@@ -115,7 +103,7 @@ public class TouchMenuToolbarViewController extends BasicMenuToolbarViewControll
 	}
 
 	@Override
-	public void showLiveLabel(boolean show) {
+	public void showLiveInfo(boolean show) {
 		liveLabel.setVisible(show);
 	}
 
diff --git a/PlayWall/src/de/tobias/playpad/pad/listener/PadContentListener.java b/PlayWall/src/de/tobias/playpad/pad/listener/PadContentListener.java
index 728e1590..98135071 100644
--- a/PlayWall/src/de/tobias/playpad/pad/listener/PadContentListener.java
+++ b/PlayWall/src/de/tobias/playpad/pad/listener/PadContentListener.java
@@ -29,15 +29,14 @@ public class PadContentListener implements ChangeListener<PadContent> {
 		controller.updateButtonDisable();
 		controller.updateTimeLabel();
 
-		// TODO PadContentListener
-		// // Remove old listener
+		// Remove old listener
 		if (oldValue != null && oldValue instanceof Durationable) {
 			Durationable oldDurationable = (Durationable) oldValue;
 			oldDurationable.durationProperty().removeListener(controller.getPadDurationListener());
 			oldDurationable.positionProperty().removeListener(controller.getPadPositionListener());
 		}
-		//
-		// // set new content listener / bindings
+
+		// set new content listener / bindings
 		if (newValue instanceof Durationable) {
 			controller.getView().setPlaybarVisible(true);
 
@@ -45,7 +44,7 @@ public class PadContentListener implements ChangeListener<PadContent> {
 			durationable.durationProperty().addListener(controller.getPadDurationListener());
 			durationable.positionProperty().addListener(controller.getPadPositionListener());
 
-			// // Init Duration
+			// Init Duration
 			controller.getPadDurationListener().changed(null, null, durationable.getDuration());
 		} else {
 			controller.getView().setPlaybarVisible(false);
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java b/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java
index 6e9a67e6..29fb2c9b 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java
@@ -75,7 +75,6 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 	private List<IPadViewV2> padViews;
 
 	private MenuToolbarViewController menuToolbarViewController;
-	private MainLayoutConnect mainLayout;
 
 	private Project openProject;
 	private int currentPageShowing = -1;
@@ -89,6 +88,7 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 	private Color gridColor;
 
 	// Layout
+	private MainLayoutConnect mainLayout;
 	private List<MainLayoutHandler> layoutActions;
 
 	// Listener
@@ -197,6 +197,7 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 		}
 
 		removePadsFromView();
+		removePadViews();
 
 		headerBox.getChildren().clear();
 		MenuToolbarViewController newMenuToolbarViewController = mainLayout.createMenuToolbar(this);
@@ -377,7 +378,7 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 
 		showPage(FIRST_PAGE);
 		loadUserCss();
-		setTitle();
+		updateWindowTitle();
 	}
 
 	// Pad, Pages
@@ -402,9 +403,9 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 			padGridPane.getRowConstraints().add(c);
 		}
 
-		// Pads - Remove Old PadViews
-		padViews.forEach(view -> padGridPane.getChildren().remove(view.getRootNode()));
-		padViews.clear();
+		// Pads - Remove alte PadViews, falls noch welche vorhanden
+		if (!padViews.isEmpty())
+			removePadViews();
 
 		// Neue PadViews
 		for (int y = 0; y < profileSettings.getRows(); y++) {
@@ -430,6 +431,15 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 		menuToolbarViewController.initPageButtons();
 	}
 
+	private void removePadViews() {
+		padViews.forEach(view ->
+		{
+			padGridPane.getChildren().remove(view.getRootNode());
+			mainLayout.recyclePadView(view);
+		});
+		padViews.clear();
+	}
+
 	/**
 	 * Zeigt die aktuellen Pads von einem Profil zu einer Seite in den entsprechenden Views an.
 	 */
@@ -482,7 +492,7 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 	}
 
 	@Override
-	public void setPadVolume(double volume) {
+	public void setGlobalVolume(double volume) {
 		if (openProject != null) {
 			for (Pad pad : openProject.getPads().values()) {
 				if (pad != null)
@@ -496,18 +506,17 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 	@Override
 	public void showLiveInfo() {
 		if (!shown && menuToolbarViewController != null) {
-			menuToolbarViewController.showLiveLabel(true);
+			menuToolbarViewController.showLiveInfo(true);
 			shown = true;
 			Worker.runLater(() ->
 			{
 				try {
 					Thread.sleep(PlayPadMain.displayTimeMillis * 2);
-				} catch (Exception e) {
-				}
+				} catch (Exception e) {}
 				Platform.runLater(() ->
 				{
 					if (menuToolbarViewController != null)
-						menuToolbarViewController.showLiveLabel(false);
+						menuToolbarViewController.showLiveInfo(false);
 					shown = false;
 				});
 			});
@@ -549,8 +558,7 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 			Worker.runLater(() ->
 			{
 				loadMidiDevice(profileSettings.getMidiDevice());
-
-				applyColorsToMappers();
+				Profile.currentProfile().getMappings().getActiveMapping().adjustPadColorToMapper(openProject);
 
 				Platform.runLater(() ->
 				{
@@ -656,7 +664,8 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 		if (openProject != null) {
 			Profile.currentProfile().currentLayout().applyCssMainView(this, getStage(), openProject);
 		}
-		applyColorsToMappers();
+
+		Profile.currentProfile().getMappings().getActiveMapping().adjustPadColorToMapper(openProject);
 	}
 
 	/**
@@ -679,14 +688,7 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 		}
 	}
 
-	@Override
-	public void applyColorsToMappers() {
-		if (openProject != null) {
-			ColorAdjuster.applyColorsToMappers(openProject);
-		}
-	}
-
-	public void setTitle() {
+	public void updateWindowTitle() {
 		if (openProject != null && Profile.currentProfile() != null) {
 			getStage().setTitle(Localization.getString(Strings.UI_Window_Main_Title, openProject.getRef().getName(),
 					Profile.currentProfile().getRef().getName()));
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/main/VolumeChangeListener.java b/PlayWall/src/de/tobias/playpad/viewcontroller/main/VolumeChangeListener.java
index 4549271b..2d017c45 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/main/VolumeChangeListener.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/main/VolumeChangeListener.java
@@ -13,6 +13,6 @@ public class VolumeChangeListener implements ChangeListener<Number> {
 
 	@Override
 	public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
-		mainViewController.setPadVolume(newValue.doubleValue());
+		mainViewController.setGlobalVolume(newValue.doubleValue());
 	}
 }
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/MappingTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/MappingTabViewController.java
index 670083cb..c58323cb 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/MappingTabViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/MappingTabViewController.java
@@ -160,7 +160,8 @@ public class MappingTabViewController extends SettingsTabViewController implemen
 
 	@Override
 	public void reload(Profile profile, Project project, IMainViewController controller) {
-		controller.applyColorsToMappers();
+		Project currentProject = PlayPadMain.getProgramInstance().getCurrentProject();
+		Profile.currentProfile().getMappings().getActiveMapping().adjustPadColorToMapper(currentProject);
 
 		Mapping activeMapping = Profile.currentProfile().getMappings().getActiveMapping();
 
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/pad/PadDragListener.java b/PlayWall/src/de/tobias/playpad/viewcontroller/pad/PadDragListener.java
index 4c3df054..2dc9956d 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/pad/PadDragListener.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/pad/PadDragListener.java
@@ -91,7 +91,6 @@ public class PadDragListener {
 		// Drag and Drop von Pads
 		if (event.getDragboard().hasString() && event.getDragboard().getString().trim().matches(REGEX)) {
 			int padID = Integer.valueOf(event.getDragboard().getString());
-			// TODO Pad Drag and Drop
 			if (padID != sourcePad.getIndex()) {
 
 				Collection<PadDragMode> connects = PlayPadPlugin.getRegistryCollection().getDragModes().getComponents();
diff --git a/PlayWallCore/src/de/tobias/playpad/action/Mapping.java b/PlayWallCore/src/de/tobias/playpad/action/Mapping.java
index f7c1fd11..718327a1 100644
--- a/PlayWallCore/src/de/tobias/playpad/action/Mapping.java
+++ b/PlayWallCore/src/de/tobias/playpad/action/Mapping.java
@@ -7,6 +7,8 @@ import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
 
+import com.sun.scenario.effect.ColorAdjust;
+
 import de.tobias.playpad.PlayPadPlugin;
 import de.tobias.playpad.action.mapper.Mapper;
 import de.tobias.playpad.action.mapper.MapperConnect;
@@ -176,6 +178,10 @@ public class Mapping implements Cloneable, ActionDisplayable {
 		}
 		getActions().forEach(action -> action.clearFeedback());
 	}
+	
+	public void adjustPadColorToMapper(Project project) {
+		
+	}
 
 	@Override
 	public Mapping clone() throws CloneNotSupportedException {
diff --git a/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjustable.java b/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjustable.java
new file mode 100644
index 00000000..4a851b77
--- /dev/null
+++ b/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjustable.java
@@ -0,0 +1,9 @@
+package de.tobias.playpad.action.feedback;
+
+public interface ColorAdjustable {
+
+	public boolean isAutoFeedbackColors();
+	
+	public int getCart();
+	
+}
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/main/ColorAdjuster.java b/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjuster.java
similarity index 70%
rename from PlayWall/src/de/tobias/playpad/viewcontroller/main/ColorAdjuster.java
rename to PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjuster.java
index 9ba8fb78..aa16d884 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/main/ColorAdjuster.java
+++ b/PlayWallCore/src/de/tobias/playpad/action/feedback/ColorAdjuster.java
@@ -1,12 +1,8 @@
-package de.tobias.playpad.viewcontroller.main;
+package de.tobias.playpad.action.feedback;
 
-import java.util.List;
+import java.util.Set;
 
-import de.tobias.playpad.action.cartaction.CartAction;
-import de.tobias.playpad.action.connect.CartActionConnect;
-import de.tobias.playpad.action.feedback.ColorAssociator;
-import de.tobias.playpad.action.feedback.DisplayableFeedbackColor;
-import de.tobias.playpad.action.feedback.FeedbackMessage;
+import de.tobias.playpad.action.Action;
 import de.tobias.playpad.action.mapper.Mapper;
 import de.tobias.playpad.action.mapper.MapperFeedbackable;
 import de.tobias.playpad.design.CartDesign;
@@ -21,19 +17,22 @@ public class ColorAdjuster {
 
 	public static void applyColorsToMappers(Project project) {
 		// Apply Layout to Mapper
-		List<CartAction> actions = Profile.currentProfile().getMappings().getActiveMapping().getActions(CartActionConnect.TYPE);
-		for (CartAction cartAction : actions) {
-			if (cartAction.isAutoFeedbackColors()) {
-				for (Mapper mapper : cartAction.getMappers()) {
-					if (mapper instanceof MapperFeedbackable) {
-						mapColorForMapper(cartAction, mapper, project);
+		Set<Action> actions = Profile.currentProfile().getMappings().getActiveMapping().getActions();
+		for (Action action : actions) {
+			if (action instanceof ColorAdjustable) {
+				ColorAdjustable adjustable = (ColorAdjustable) action;
+				if (adjustable.isAutoFeedbackColors()) {
+					for (Mapper mapper : action.getMappers()) {
+						if (mapper instanceof MapperFeedbackable) {
+							mapColorForMapper(adjustable, mapper, project);
+						}
 					}
 				}
 			}
 		}
 	}
 
-	private static void mapColorForMapper(CartAction cartAction, Mapper mapper, Project project) {
+	private static void mapColorForMapper(ColorAdjustable cartAction, Mapper mapper, Project project) {
 		MapperFeedbackable feedbackable = (MapperFeedbackable) mapper;
 		if (feedbackable.supportFeedback() && mapper instanceof ColorAssociator) {
 			ColorAssociator colorAssociator = (ColorAssociator) mapper;
diff --git a/PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutConnect.java b/PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutConnect.java
index 92bd7dbe..c81e610e 100644
--- a/PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutConnect.java
+++ b/PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutConnect.java
@@ -45,6 +45,14 @@ public interface MainLayoutConnect {
 	 */
 	public IPadViewV2 createPadView();
 
+	/**
+	 * Recycelt eine PadView, damit nicht immer neue erstellt werden müssen.
+	 * 
+	 * @param padView
+	 *            alte PadView
+	 */
+	public void recyclePadView(IPadViewV2 padView);
+
 	/**
 	 * Gibt das Layout sepzifische Stylesheet zurück.
 	 * 
diff --git a/PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutHandler.java b/PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutHandler.java
index 23d1d5b7..4c94753b 100644
--- a/PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutHandler.java
+++ b/PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutHandler.java
@@ -4,10 +4,11 @@ import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import de.tobias.playpad.viewcontroller.main.MenuToolbarViewController;
 
 /**
- * Schnittstelle für das Handle einer neunen Toolbar. Diese Methode wird vom MainView automatisch bei einem neuen Layout
- * aufgeführt.
+ * Schnittstelle für das Handle einer neunen Toolbar. Diese Methode wird vom MainView automatisch bei einem neuen Layout aufgeführt.
  * 
  * @author tobias
+ * 
+ * @since 5.1.0
  *
  * @see IMainViewController#performLayoutDependendAction(MainLayoutHandler)
  * @see MainLayoutConnect
diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java
index 2d58a59e..54550f4d 100644
--- a/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java
+++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java
@@ -15,20 +15,79 @@ import javafx.scene.paint.Color;
 import javafx.stage.Screen;
 import javafx.stage.Stage;
 
+/**
+ * Schnittstelle für das Hautpfenster von PlayWall.
+ * 
+ * @author tobias
+ * 
+ * @since 5.1.0
+ *
+ */
 public interface IMainViewController extends NotificationHandler {
 
+	/**
+	 * Setzt die Grid Farbe.
+	 * 
+	 * @param color
+	 *            Neue Farbe
+	 */
 	public void setGridColor(Color color);
 
+	/**
+	 * Gibt die Stage des ViewControllers zurück.
+	 * 
+	 * @return Stage
+	 */
 	public Stage getStage();
 
-	public int getPage();
-
+	/**
+	 * Gibt den Root Node der View zurück.
+	 * 
+	 * @return root node
+	 */
 	public Parent getParent();
 
+	/**
+	 * Registriert ein KeyEvent Listener für das Fenster.
+	 * 
+	 * @param eventType
+	 *            Event Type
+	 * @param listener
+	 *            Listener für Event
+	 */
 	public void registerKeyboardListener(EventType<KeyEvent> eventType, EventHandler<KeyEvent> listener);
 
+	/**
+	 * Aktualisiert den Title des Fenster.
+	 */
+	public void updateWindowTitle();
+
+	/**
+	 * Gibt den aktiven MenuToolbarController des Hauptfensters zurück. Dieser basiert auf dem aktuellen MainLayout.
+	 * 
+	 * @return Controller
+	 */
+	public MenuToolbarViewController getMenuToolbarController();
+
+	/**
+	 * Gibt den Bildschirm zurück, wo das Fenster aktiv ist,
+	 * 
+	 * @return Screen
+	 */
+	public Screen getScreen();
+
+	/**
+	 * Erstellt die Pad Views.
+	 */
 	public void createPadViews();
 
+	/**
+	 * Gibt die Nummer Aktuelle Seite zurück. (0, n)
+	 * 
+	 * @return Nummer der Seite
+	 */
+	public int getPage();
+
 	/**
 	 * Zeigt eine Seite. Sollte die Seite bereits offen sien, passiert nichts.
 	 * 
@@ -37,25 +96,54 @@ public interface IMainViewController extends NotificationHandler {
 	 */
 	public void showPage(int page);
 
+	/**
+	 * Lädt die CSS Files neu.
+	 */
 	public void loadUserCss();
 
-	public void applyColorsToMappers();
-
+	/**
+	 * Zeigt einen Hinweis, wenn eine Aktion versucht wird zu machen, wie während der Wiedergabe eines Pads nicht erlaubt ist. Die Methode
+	 * delegiert an die Toolbar weiter.
+	 * 
+	 * @see MenuToolbarViewController#showLiveInfo(boolean)
+	 */
 	public void showLiveInfo();
 
-	public void setTitle();
-
+	/**
+	 * Gibt die PadViews zurück.
+	 * 
+	 * @return Liste der PadViews
+	 */
 	List<IPadViewV2> getPadViews();
 
-	public Screen getScreen();
-
+	/**
+	 * Gibt den MIDI Handler des Hauptfensters für die Kacheln zurück.
+	 * 
+	 * @return MIDI Handler
+	 */
 	public MidiListener getMidiHandler();
 
-	public MenuToolbarViewController getMenuToolbarController();
-
-	public void setPadVolume(double doubleValue);
+	/**
+	 * Setzt das Globale Volume bei den Kacheln des aktuellen Projekts.
+	 * 
+	 * @param doubleValue
+	 *            [0..1]
+	 */
+	public void setGlobalVolume(double doubleValue);
 
+	/**
+	 * Setzt das MainLayout des Hauptfensters.
+	 * 
+	 * @param mainLayoutConnect
+	 */
 	public void setMainLayout(MainLayoutConnect mainLayoutConnect);
 
+	/**
+	 * Führt eine Aktion für das Hauptfenster aus. Beispielsweise MenuItem in MenuToolbarController hinzufügen. Zudem wird diese Aktion
+	 * gespeichert und bei einem Layoutwechsel erneut ausgeführt.
+	 * 
+	 * @param runnable
+	 *            Funktion
+	 */
 	public void performLayoutDependendAction(MainLayoutHandler runnable);
 }
diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/MenuToolbarViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/MenuToolbarViewController.java
index 61a34d54..9e2c066a 100644
--- a/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/MenuToolbarViewController.java
+++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/MenuToolbarViewController.java
@@ -8,11 +8,9 @@ import de.tobias.utils.ui.ContentViewController;
 import javafx.scene.Node;
 import javafx.scene.control.MenuItem;
 import javafx.scene.control.Slider;
-import javafx.scene.image.Image;
 
 /**
- * Abstrakter ViewController für das Menu und die Toolbar des Hauptfenster. Jede Implementierung kann die GUI selbst
- * bestimmen.
+ * Abstrakter ViewController für das Menu und die Toolbar des Hauptfenster. Jede Implementierung kann die GUI selbst bestimmen.
  * 
  * @author tobias
  *
@@ -21,7 +19,7 @@ import javafx.scene.image.Image;
 public abstract class MenuToolbarViewController extends ContentViewController {
 
 	protected static final String CURRENT_PAGE_BUTTON = "current-page-button";
-	
+
 	/**
 	 * Erstellt einen neuen ViewController ohne Localization
 	 * 
@@ -49,18 +47,18 @@ public abstract class MenuToolbarViewController extends ContentViewController {
 	}
 
 	/**
-	 * Wird von MainViwController aufgerufen, wenn die Buttons für die einzelnen Seiten neu erstellt werden müssen. Das
-	 * ist der Fall beim laden eines Projektes und bei Änderungen an den Einstellungen.
+	 * Wird von MainViwController aufgerufen, wenn die Buttons für die einzelnen Seiten neu erstellt werden müssen. Das ist der Fall beim
+	 * laden eines Projektes und bei Änderungen an den Einstellungen.
 	 */
 	public abstract void initPageButtons();
 
 	/*
-	 * 
+	 * Handling Actions from MainViewController
 	 */
 
 	/**
-	 * Mit dieser Methode werden mögliche Eingaben vom Nutzer geblocked (Beispiel: GUI Element disable). Diese Methode
-	 * wird bei Änderung der Einstellung aufgerufen.
+	 * Mit dieser Methode werden mögliche Eingaben vom Nutzer geblocked (Beispiel: GUI Element disable). Diese Methode wird bei Änderung der
+	 * Einstellung aufgerufen.
 	 * 
 	 * @param looked
 	 *            true locked, false unlocked
@@ -69,30 +67,30 @@ public abstract class MenuToolbarViewController extends ContentViewController {
 	 */
 	public abstract void setLocked(boolean looked);
 
-	// Icons
 	/**
-	 * Fügt ein Info Icon zur GUI hinzu.
+	 * Setzt das Menü für die Einstellung Always On Top.
 	 * 
-	 * @param icon
-	 *            icon
+	 * @param alwaysOnTopActive
+	 *            <code>true</code> Menu Aktiv
 	 */
-	public abstract void addToolbarIcon(Image icon);
+	public abstract void setAlwaysOnTopActive(boolean alwaysOnTopActive);
 
 	/**
-	 * Fügt ein Node zur Toolbar hinzu.
+	 * Setzt das Menü für die Einstellung FullScreen.
 	 * 
-	 * @param node
-	 *            node
+	 * @param fullScreenActive
+	 *            <code>true</code> FullScreen
 	 */
-	public abstract void addToolbarItem(Node node);
+	public abstract void setFullScreenActive(boolean fullScreenActive);
 
+	// Icons
 	/**
-	 * Entfernt ein spezielles Icon von der GUI.
+	 * Fügt ein Node zur Toolbar hinzu.
 	 * 
-	 * @param icon
-	 *            Remove Icon
+	 * @param node
+	 *            node
 	 */
-	public abstract void removeToolbarIcon(Image icon);
+	public abstract void addToolbarItem(Node node);
 
 	/**
 	 * Entfernt das Toolbar Item.
@@ -145,13 +143,30 @@ public abstract class MenuToolbarViewController extends ContentViewController {
 	 */
 	public abstract void deinit();
 
+	/**
+	 * Gibt den Global Volume Slider zurück. Jede Toolbar muss einen solchen für das Global Layout enthalten.
+	 * 
+	 * @return Slider
+	 */
 	public abstract Slider getVolumeSlider();
 
-	public abstract void setAlwaysOnTopActive(boolean alwaysOnTopActive);
-	
-	public abstract void setFullScreenActive(boolean fullScreenActive);
-	
-	public abstract void showLiveLabel(boolean show);
-	
-	public abstract void hilightPageButton(int index);
+	// Utils
+
+	/**
+	 * Zeigt den Hinweis LiveModus, und signalisiert dem Nutzer, das eine Aktion blokciert ist.
+	 * 
+	 * @param show
+	 *            <code>true</code> Hinweis Aktiv
+	 */
+	public abstract void showLiveInfo(boolean show);
+
+	/**
+	 * Hebt dem Page Button der Aktiv ist hervor. Gleichzeitig wird der vorherige Button nicht mehr Hervorgehebt.
+	 * 
+	 * @param page
+	 *            Neue Seite
+	 * 
+	 * @see IMainViewController#showPage(int)
+	 */
+	public abstract void hilightPageButton(int page);
 }
-- 
GitLab