/*
* funCKit - functional Circuit Kit
* Copyright (C) 2013 Lukas Elsner <open@mindrunner.de>
* Copyright (C) 2013 Peter Dahlberg <catdog2@tuxzone.org>
* Copyright (C) 2013 Julian Stier <mail@julian-stier.de>
* Copyright (C) 2013 Sebastian Vetter <mail@b4sti.eu>
* Copyright (C) 2013 Thomas Poxrucker <poxrucker_t@web.de>
* Copyright (C) 2013 Alexander Treml <alex.treml@directbox.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.sep2011.funckit.drawer;
import java.util.List;
import java.util.Set;
import de.sep2011.funckit.model.graphmodel.AccessPoint;
import de.sep2011.funckit.model.graphmodel.Brick;
import de.sep2011.funckit.model.graphmodel.Element;
import de.sep2011.funckit.model.sessionmodel.EditPanelModel;
import de.sep2011.funckit.model.sessionmodel.SessionModel;
import de.sep2011.funckit.model.sessionmodel.Settings;
import de.sep2011.funckit.validator.Result;
/**
* Resolver object, that builds an {@link ElementState} with a given {@link
* Element} upon information collected from {@link SessionModel} and {@link
* EditPanelModel} (and thus {@link Settings}, too).
*/
public class ElementStateResolver {
/**
* Breakpoint value to switch from fancy to simple drawing.
*/
private final static double ZOOM_BREAKPOINT_DRAW_SIMPLE = 0.4;
private final EditPanelModel panelModel;
private final SessionModel sessionModel;
public ElementStateResolver(EditPanelModel panelModel,
SessionModel sessionModel) {
this.panelModel = panelModel;
this.sessionModel = sessionModel;
}
public ElementState resolve(Element element) {
ElementState elementState = new ElementState();
elementState.setMode(ElementState.Mode.NORMAL);
double zoomLevel = panelModel.getTransformation().getScaleX();
/* Check if element should be drawn very simple - depending on zoom. */
if (zoomLevel < ZOOM_BREAKPOINT_DRAW_SIMPLE) {
elementState.setSimple();
}
/* Check for ghost or selection mode. */
if (panelModel.getSelectedElements().contains(element)) {
elementState.setMode(ElementState.Mode.SELECTED);
} else if (panelModel.getGhosts().contains(element)) {
elementState.setMode(ElementState.Mode.GHOST);
}
elementState.setSimulated(sessionModel.getCurrentSimulation() != null);
/* Mark erroneous elements from validations. */
List<Result> results = sessionModel.getCurrentCheckResults();
if (results != null) {
for (Result r : results) {
if (r.getFlawElements().contains(element)) {
elementState.setHasError(true);
}
}
}
/* Mark erroneous ghosts. */
Set<Element> erroneousGhosts = sessionModel.getCurrentProject()
.getErrorGhosts();
if (erroneousGhosts != null && erroneousGhosts.contains(element)) {
elementState.setHasError(true);
}
/* Check if element is active one (if zoom is near enough). */
if (panelModel.getActiveBrick() != null
&& panelModel.getActiveBrick().equals(element)) {
elementState.setActive();
}
return elementState;
}
public ElementState resolve(AccessPoint accessPoint) {
Brick brick = accessPoint.getBrick();
ElementState elementState = new ElementState();
elementState.setMode(ElementState.Mode.NORMAL);
double zoomLevel = panelModel.getTransformation().getScaleX();
if (zoomLevel < ZOOM_BREAKPOINT_DRAW_SIMPLE) {
elementState.setSimple();
}
if (panelModel.getGhosts().contains(brick)) {
elementState.setMode(ElementState.Mode.GHOST);
}
elementState.setSimulated(sessionModel.getCurrentSimulation() != null);
/* Check if element is active one (if zoom is near enough). */
if (panelModel.getActiveBrick() != null
&& panelModel.getActiveBrick().equals(brick)) {
elementState.setActive();
}
return elementState;
}
}