package org.geogebra.web.web.gui.layout.panels;
import java.util.ArrayList;
import org.geogebra.common.awt.GColor;
import org.geogebra.common.euclidian.event.PointerEventType;
import org.geogebra.common.gui.util.SelectionTable;
import org.geogebra.common.gui.view.algebra.AlgebraView.SortMode;
import org.geogebra.common.kernel.geos.GeoButton;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.kernel.geos.GeoImage;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.main.App;
import org.geogebra.common.main.Feature;
import org.geogebra.common.main.Localization;
import org.geogebra.common.main.OptionType;
import org.geogebra.common.main.settings.AbstractSettings;
import org.geogebra.common.main.settings.AlgebraSettings;
import org.geogebra.common.main.settings.SettingListener;
import org.geogebra.web.html5.gui.util.ClickStartHandler;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.web.gui.color.ColorPopupMenuButton;
import org.geogebra.web.web.gui.images.StyleBarResources;
import org.geogebra.web.web.gui.util.ImageOrText;
import org.geogebra.web.web.gui.util.PopupMenuButtonW;
import org.geogebra.web.web.gui.util.PopupMenuHandler;
import org.geogebra.web.web.gui.util.StyleBarW2;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
/**
* StyleBar for AlgebraView
*/
public class AlgebraStyleBarW extends StyleBarW2 implements
SettingListener {
/** button to open the popup with the supported tree-modes */
PopupMenuButtonW treeModeButton;
PopupMenuButtonW descriptionButton;
/** list of all supported {@link SortMode modes} */
ArrayList<SortMode> supportedModes = new ArrayList<SortMode>();
private GeoElement selectedEntry;
/** localization */
Localization loc;
/**
* @param app
* {@link AppW}
*/
public AlgebraStyleBarW(AppW app){
super(app, App.VIEW_ALGEBRA);
app.getSettings().getAlgebra().addListener(this);
this.loc = app.getLocalization();
update(null);
createColorBtn();
btnColor.setChangeEventHandler(this);
createLineStyleBtn(-1);
createPointStyleBtn(-1);
btnPointStyle.setChangeEventHandler(this);
ClickStartHandler.init(this, new ClickStartHandler(false, true) {
@Override
public void onClickStart(int x, int y, PointerEventType type) {
// nothing to do here
}
});
optionType = OptionType.ALGEBRA;
}
private void createColorBtn() {
btnColor = new ColorPopupMenuButton(app,
ColorPopupMenuButton.COLORSET_DEFAULT, true) {
@Override
public void update(Object[] geos) {
boolean geosOK = geos.length > 0;
for (int i = 0; i < geos.length; i++) {
GeoElement geo = ((GeoElement) geos[i])
.getGeoElementForPropertiesDialog();
if (geo instanceof GeoImage || geo instanceof GeoText
|| geo instanceof GeoButton) {
geosOK = false;
break;
}
}
setVisible(geosOK);
if (geosOK) {
// get color from first geo
GColor geoColor;
geoColor = ((GeoElement) geos[0]).getObjectColor();
// check if selection contains a fillable geo
// if true, then set slider to first fillable's alpha
// value
double alpha = 1.0;
boolean hasFillable = false;
for (int i = 0; i < geos.length; i++) {
if (((GeoElement) geos[i]).isFillable()) {
hasFillable = true;
alpha = ((GeoElement) geos[i]).getAlphaValue();
break;
}
}
if (hasFillable) {
setTitle(loc.getMenu("stylebar.ColorTransparency"));
} else {
setTitle(loc.getMenu("stylebar.Color"));
}
setSliderVisible(hasFillable);
setSliderValue((int) Math.round(alpha * 100));
updateColorTable();
// find the geoColor in the table and select it
int index = this.getColorIndex(geoColor);
setSelectedIndex(index);
setDefaultColor(alpha, geoColor);
this.setKeepVisible(false);
}
}
};
btnColor.addPopupHandler(this);
btnColor.setEnableTable(true);
}
/**
* @param selectedItem
* selected element
*/
public void update(GeoElement selectedItem) {
this.selectedEntry = selectedItem;
clear();
if (selectedItem == null) {
addTreeModeButton();
addDescriptionButton();
addMenuButton();
} else {
add(btnColor);
btnColor.update(new Object[] { selectedItem });
add(btnLineStyle);
btnLineStyle.update(new Object[] { selectedItem });
add(btnPointStyle);
btnPointStyle.update(new Object[] { selectedItem });
addMenuButton();
}
// addViewButton is too expensive
if (!app.has(Feature.DYNAMIC_STYLEBAR)) {
if(getViewButton() == null){
addViewButton();
}else{
add(getViewButton());
}
}
setToolTips();
}
private void addTreeModeButton() {
supportedModes.clear();
supportedModes.add(SortMode.DEPENDENCY);
supportedModes.add(SortMode.TYPE);
supportedModes.add(SortMode.ORDER);
supportedModes.add(SortMode.LAYER);
ImageOrText[] strTreeMode = getTreeModeStr();
if(treeModeButton == null){
treeModeButton = new PopupMenuButtonW(app, strTreeMode,
strTreeMode.length, 1, SelectionTable.MODE_TEXT);
ImageOrText icon = new ImageOrText(
StyleBarResources.INSTANCE.sortObjects());
treeModeButton.setFixedIcon(icon);
treeModeButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
SortMode selectedMode = app.getAlgebraView().getTreeMode();
treeModeButton.setSelectedIndex(supportedModes
.indexOf(selectedMode));
}
});
treeModeButton.addPopupHandler(new PopupMenuHandler() {
@Override
public void fireActionPerformed(PopupMenuButtonW actionButton) {
// called if a object of the popup is clicked
int i = treeModeButton.getSelectedIndex();
app.getSettings().getAlgebra()
.setTreeMode(supportedModes.get(i));
app.closePopups();
app.clearJustClosedPopup();
}
});
}
add(treeModeButton);
}
private void addDescriptionButton() {
ImageOrText[] strTreeMode = getDescriptionModes();
if (descriptionButton == null) {
descriptionButton = new PopupMenuButtonW(app, strTreeMode,
strTreeMode.length, 1, SelectionTable.MODE_TEXT);
ImageOrText icon = new ImageOrText(
StyleBarResources.INSTANCE.description());
descriptionButton.setFixedIcon(icon);
descriptionButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
int selectedMode = app.getKernel().getAlgebraStyle();
if (app.has(Feature.AV_DEFINITION_AND_VALUE)) {
descriptionButton.setSelectedIndex(
AlgebraSettings.indexOfStyleMode(selectedMode));
} else {
descriptionButton.setSelectedIndex(selectedMode);
}
}
});
descriptionButton.addPopupHandler(new PopupMenuHandler() {
@Override
public void fireActionPerformed(PopupMenuButtonW actionButton) {
// called if a object of the popup is clicked
int i = descriptionButton.getSelectedIndex();
if (app.has(Feature.AV_DEFINITION_AND_VALUE)) {
app.getKernel()
.setAlgebraStyle(
AlgebraSettings.getStyleModeAt(i));
} else {
app.getKernel().setAlgebraStyle(i);
}
if (app.getGuiManager().hasPropertiesView()) {
app.getGuiManager().getPropertiesView().repaintView();
}
app.getKernel().updateConstruction();
app.closePopups();
app.clearJustClosedPopup();
}
});
}
add(descriptionButton);
}
/**
* creates an array from all available supported modes and converts it to an
* array of {@link ImageOrText} elements
*
* @return {@link ImageOrText ImageOrText[]}
*/
private ImageOrText[] getTreeModeStr() {
String[] modes = new String[supportedModes.size()];
for (int i = 0; i < supportedModes.size(); i++) {
modes[i] = loc.getMenu(supportedModes.get(i).toString());
}
return ImageOrText.convert(modes);
}
private ImageOrText[] getDescriptionModes() {
return ImageOrText.convert(AlgebraSettings.getDescriptionModes(app));
}
private void setToolTips() {
treeModeButton.setToolTipText(app.getLocalization().getPlainTooltip(
"SortBy"));
descriptionButton.setToolTipText(app.getLocalization().getMenu(
"AlgebraDescriptions"));
}
@Override
public void setOpen(boolean showStyleBar) {
// TODO Auto-generated method stub
}
@Override
public void settingsChanged(AbstractSettings settings) {
//
}
@Override
public void setLabels() {
super.setLabels();
this.treeModeButton.getMyTable().updateText(getTreeModeStr());
this.descriptionButton.getMyTable().updateText(getDescriptionModes());
setToolTips();
}
@Override
protected void handleEventHandlers(Object source) {
needUndo = false;
ArrayList<GeoElement> targetGeos = new ArrayList<GeoElement>();
if (selectedEntry != null) {
targetGeos.add(selectedEntry);
}
processSource(source, targetGeos);
if (needUndo) {
app.storeUndoInfo();
needUndo = false;
}
}
}