/*
* ModelMaterialsController.java 26 oct. 2012
*
* Sweet Home 3D, Copyright (c) 2012 Emmanuel PUYBARET / eTeks <info@eteks.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 2 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.eteks.sweethome3d.viewcontroller;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.Arrays;
import com.eteks.sweethome3d.model.Content;
import com.eteks.sweethome3d.model.HomeMaterial;
import com.eteks.sweethome3d.model.UserPreferences;
/**
* A MVC controller for model materials choice.
* @author Emmanuel Puybaret
* @since 4.0
*/
public class ModelMaterialsController implements Controller {
public enum Property {MODEL, MATERIALS}
private final String title;
private final UserPreferences preferences;
private final ViewFactory viewFactory;
private final ContentManager contentManager;
private final PropertyChangeSupport propertyChangeSupport;
private View materialsChoiceView;
private TextureChoiceController textureController;
private Content model;
private float modelWidth;
private float modelDepth;
private float modelHeight;
private float [][] modelRotation;
private boolean backFaceShown;
private HomeMaterial [] materials;
public ModelMaterialsController(String title,
UserPreferences preferences,
ViewFactory viewFactory,
ContentManager contentManager) {
this.title = title;
this.preferences = preferences;
this.viewFactory = viewFactory;
this.contentManager = contentManager;
this.propertyChangeSupport = new PropertyChangeSupport(this);
}
/**
* Returns the view associated with this controller.
*/
public View getView() {
// Create view lazily only once it's needed
if (this.materialsChoiceView == null) {
this.materialsChoiceView = this.viewFactory.createModelMaterialsView(this.preferences, this);
}
return this.materialsChoiceView;
}
/**
* Adds the property change <code>listener</code> in parameter to this controller.
*/
public void addPropertyChangeListener(Property property, PropertyChangeListener listener) {
this.propertyChangeSupport.addPropertyChangeListener(property.name(), listener);
}
/**
* Removes the property change <code>listener</code> in parameter from this controller.
*/
public void removePropertyChangeListener(Property property, PropertyChangeListener listener) {
this.propertyChangeSupport.removePropertyChangeListener(property.name(), listener);
}
/**
* Sets the 3D model which materials are displayed by the view
* and fires a <code>PropertyChangeEvent</code>.
*/
public void setModel(Content model) {
if (this.model != model) {
Content oldModel = this.model;
this.model = model;
this.propertyChangeSupport.firePropertyChange(Property.MODEL.name(), oldModel, model);
}
}
/**
* Returns the 3D model which materials are displayed by the view.
*/
public Content getModel() {
return this.model;
}
/**
* Sets the rotation of the 3D model used to preview materials change.
*/
void setModelRotation(float [][] modelRotation) {
this.modelRotation = modelRotation;
}
/**
* Returns the rotation of the 3D model used to preview materials change.
*/
public float [][] getModelRotation() {
return this.modelRotation;
}
/**
* Sets the size of the 3D model used to preview materials change.
*/
void setModelSize(float width, float depth, float height) {
this.modelWidth = width;
this.modelDepth = depth;
this.modelHeight = height;
}
/**
* Returns the width of the 3D model used to preview materials change.
*/
public float getModelWidth() {
return this.modelWidth;
}
/**
* Returns the depth of the 3D model used to preview materials change.
*/
public float getModelDepth() {
return this.modelDepth;
}
/**
* Returns the height of the 3D model used to preview materials change.
*/
public float getModelHeight() {
return this.modelHeight;
}
/**
* Sets whether the 3D model used to preview materials change should show back face.
*/
void setBackFaceShown(boolean backFaceShown) {
this.backFaceShown = backFaceShown;
}
/**
* Returns <code>true</code> if the 3D model used to preview materials change should show back face.
*/
public boolean isBackFaceShown() {
return this.backFaceShown;
}
/**
* Sets the materials displayed by view and fires a <code>PropertyChangeEvent</code>.
*/
public void setMaterials(HomeMaterial [] materials) {
if (!Arrays.equals(this.materials, materials)) {
HomeMaterial [] oldMaterials = this.materials;
this.materials = materials;
this.propertyChangeSupport.firePropertyChange(Property.MATERIALS.name(), oldMaterials, materials);
}
}
/**
* Returns the materials displayed by view.
*/
public HomeMaterial [] getMaterials() {
return this.materials;
}
/**
* Returns the text that should be displayed as materials choice dialog title.
*/
public String getDialogTitle() {
return this.title;
}
/**
* Returns the texture controller of the model materials.
*/
public TextureChoiceController getTextureController() {
// Create sub controller lazily only once it's needed
if (this.textureController == null
&& this.contentManager != null) {
this.textureController = new TextureChoiceController(
this.preferences.getLocalizedString(ModelMaterialsController.class, "textureTitle"),
this.preferences, this.viewFactory, this.contentManager);
}
return this.textureController;
}
}