package org.geogebra.common.gui.dialog.options.model;
import org.geogebra.common.kernel.geos.GProperty;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoNumeric;
import org.geogebra.common.main.App;
import org.geogebra.common.plugin.EuclidianStyleConstants;
public class LineStyleModel extends OptionsModel {
public interface ILineStyleListener extends PropertyListener {
void setThicknessSliderValue(int value);
void setThicknessSliderMinimum(int minimum);
void setOpacitySliderValue(int value);
void selectCommonLineStyle(boolean equalStyle, int type);
void setLineTypeVisible(boolean value);
void setLineStyleHiddenVisible(boolean value);
void selectCommonLineStyleHidden(boolean equalStyle, int type);
void setLineOpacityVisible(boolean value);
}
private ILineStyleListener listener;
public void setListener(ILineStyleListener listener) {
this.listener = listener;
}
private boolean lineTypeEnabled;
private boolean lineStyleHiddenEnabled;
private boolean lineOpacityEnabled;
private static Integer[] lineStyleArray = null;
public static void initStyleArray() {
if (lineStyleArray == null) {
lineStyleArray = getLineTypes();
}
}
public LineStyleModel(App app) {
super(app);
}
private static final Integer[] getLineTypes() {
Integer[] ret = {
Integer.valueOf(EuclidianStyleConstants.LINE_TYPE_FULL),
Integer.valueOf(EuclidianStyleConstants.LINE_TYPE_DASHED_LONG),
Integer.valueOf(EuclidianStyleConstants.LINE_TYPE_DASHED_SHORT),
Integer.valueOf(EuclidianStyleConstants.LINE_TYPE_DOTTED),
Integer.valueOf(
EuclidianStyleConstants.LINE_TYPE_DASHED_DOTTED),
Integer.valueOf(EuclidianStyleConstants.LINE_TYPE_POINTWISE) };
return ret;
}
public static final Integer getStyleAt(int i) {
initStyleArray();
return lineStyleArray[i];
}
public static final Integer getStyleCount() {
initStyleArray();
return lineStyleArray.length;
}
private int maxMinimumThickness() {
if (!hasGeos()) {
return 1;
}
for (int i = 0; i < getGeosLength(); i++) {
GeoElement testGeo = getGeoAt(i).getGeoElementForPropertiesDialog();
if (testGeo.getMinimumLineThickness() == 1) {
return 1;
}
}
return 0;
}
@Override
public void updateProperties() {
GeoElement temp, geo0 = getGeoAt(0);
// Log.debug("geo0 = " + geo0 + ", lineTypeEnabled=" + lineTypeEnabled);
if (listener != null) {
listener.setThicknessSliderValue(geo0.getLineThickness());
// allow polygons to have thickness 0
listener.setThicknessSliderMinimum(maxMinimumThickness());
int opacity = (int) ((geo0.getLineOpacity() / 255.0f) * 100);
listener.setOpacitySliderValue(opacity);
listener.setLineTypeVisible(lineTypeEnabled);
listener.setLineStyleHiddenVisible(lineStyleHiddenEnabled);
listener.setLineOpacityVisible(lineOpacityEnabled);
}
// check if geos have same line style
if (lineTypeEnabled) {
boolean equalStyle = true;
int type0 = geo0.getLineType();
for (int i = 1; i < getGeosLength(); i++) {
temp = getGeoAt(i);
// same style?
if (type0 != temp.getLineType()) {
equalStyle = false;
}
}
if (listener != null) {
listener.selectCommonLineStyle(equalStyle, type0);
}
}
// check if geos have same line style
if (lineStyleHiddenEnabled) {
boolean equalStyle = true;
int type0 = geo0.getLineTypeHidden();
for (int i = 1; i < getGeosLength(); i++) {
temp = getGeoAt(i);
// same style?
if (type0 != temp.getLineTypeHidden()) {
equalStyle = false;
}
}
if (listener != null) {
listener.selectCommonLineStyleHidden(equalStyle, type0);
}
}
}
public void applyThickness(int value) {
for (int i = 0; i < getGeosLength(); i++) {
GeoElement geo = getGeoAt(i);
geo.setLineThickness(value);
geo.updateVisualStyleRepaint(GProperty.LINE_STYLE);
}
storeUndoInfo();
}
public void applyLineType(int type) {
for (int i = 0; i < getGeosLength(); i++) {
GeoElement geo = getGeoAt(i);
geo.setLineType(type);
geo.updateVisualStyleRepaint(GProperty.LINE_STYLE);
}
storeUndoInfo();
}
public void applyLineStyleHidden(int type) {
for (int i = 0; i < getGeosLength(); i++) {
GeoElement geo = getGeoAt(i);
geo.setLineTypeHidden(type);
geo.updateVisualStyleRepaint(GProperty.LINE_STYLE);
}
storeUndoInfo();
}
public void applyOpacity(int value) {
for (int i = 0; i < getGeosLength(); i++) {
GeoElement geo = getGeoAt(i);
geo.setLineOpacity(value);
geo.updateVisualStyleRepaint(GProperty.LINE_STYLE);
}
storeUndoInfo();
}
public void applyLineTypeFromIndex(int index) {
applyLineType(lineStyleArray[index]);
}
@Override
public boolean isValidAt(int index) {
return match(getGeoAt(index).getGeoElementForPropertiesDialog());
}
/**
* Decides if geo is accepted for this model.
*
* @param geo
* The geo to match.
* @return if geo has line properties
*/
public static boolean match(GeoElement geo) {
return (geo.showLineProperties() || geo.isNumberValue())
&& !geo.isGeoBoolean() && !((geo instanceof GeoNumeric)
&& ((GeoNumeric) geo).isSlider());
}
@Override
public boolean checkGeos() {
boolean geosOK = true;
lineTypeEnabled = true;
lineStyleHiddenEnabled = true;
lineOpacityEnabled = true;
for (int i = 0; i < getGeosLength(); i++) {
if (!isValidAt(i)) {
geosOK = false;
break;
}
GeoElement geo = getGeoAt(i);
if (i == 0) {
lineStyleHiddenEnabled = geo.getKernel().getApplication()
.isEuclidianView3Dinited();
}
if ((geo instanceof GeoNumeric) && ((GeoNumeric) geo).isSlider()) {
lineTypeEnabled = false;
lineStyleHiddenEnabled = false;
lineOpacityEnabled = false;
}
}
return geosOK;
}
@Override
public PropertyListener getListener() {
return listener;
}
}