package org.geogebra.web.web.gui.properties;
import java.util.ArrayList;
import org.geogebra.common.gui.SetLabels;
import org.geogebra.common.gui.view.properties.PropertiesView;
import org.geogebra.common.kernel.ModeSetter;
import org.geogebra.common.kernel.geos.GProperty;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.main.OptionType;
import org.geogebra.common.util.debug.Log;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.html5.util.tabpanel.MultiRowsTabPanel;
import org.geogebra.web.web.gui.dialog.options.OptionPanelW;
import org.geogebra.web.web.gui.dialog.options.OptionsAdvancedW;
import org.geogebra.web.web.gui.dialog.options.OptionsAlgebraW;
import org.geogebra.web.web.gui.dialog.options.OptionsCASW;
import org.geogebra.web.web.gui.dialog.options.OptionsDefaultsW;
import org.geogebra.web.web.gui.dialog.options.OptionsEuclidianW;
import org.geogebra.web.web.gui.dialog.options.OptionsLayoutW;
import org.geogebra.web.web.gui.dialog.options.OptionsObjectW;
import org.geogebra.web.web.gui.dialog.options.OptionsSpreadsheetW;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RequiresResize;
import com.google.gwt.user.client.ui.Widget;
/**
* @author gabor
*
* PropertiesView for Web
*
*/
public class PropertiesViewW extends PropertiesView
implements RequiresResize, SetLabels {
private FlowPanel wrappedPanel;
// option panels
private OptionsDefaultsW defaultsPanel;
private OptionsEuclidianW euclidianPanel, euclidianPanel2, euclidianPanel3D;
private OptionsSpreadsheetW spreadsheetPanel;
private OptionsCASW casPanel;
private OptionsAdvancedW advancedPanel;
private OptionsLayoutW layoutPanel;
private OptionsAlgebraW algebraPanel;
private PropertiesStyleBarW styleBar;
private Label notImplemented;
private FlowPanel contentsPanel;
private OptionType optionType;
// For autoopen AV feature
// private boolean wasAVShowing;
//
// private boolean auxWasVisible;
//
// private boolean isObjectOptionsVisible;
/**
*
* @param app
* app
* @param ot
* initial options type
*/
public PropertiesViewW(AppW app, OptionType ot) {
super(app);
this.wrappedPanel = new FlowPanel();
app.setPropertiesView(this);
app.setWaitCursor();
notImplemented = new Label("Not implemented");
optionType = ot;
initGUI();
app.setDefaultCursor();
}
private void initGUI() {
wrappedPanel.addStyleName("PropertiesViewW");
// getStyleBar();
//mainPanel = new FlowPanel();
contentsPanel = new FlowPanel();
contentsPanel.addStyleName("contentsPanel");
contentsPanel.addStyleName("contentsPanel2");
//wrappedPanel.addStyleName("propertiesView");
//mainPanel.add(contentsPanel);
wrappedPanel.add(contentsPanel);
wrappedPanel.add(getStyleBar().getWrappedPanel());
// if(!((AppW) app).getLAF().isSmart()){
//mainPanel.add(getStyleBar().getWrappedPanel());
// }
//wrappedPanel.add(mainPanel);
setOptionPanel(optionType, 0);
//createButtonPanel();
//add(buttonPanel, BorderLayout.SOUTH);
}
/**
* @return the style bar for this view.
*/
public PropertiesStyleBarW getStyleBar() {
if (styleBar == null) {
styleBar = newPropertiesStyleBar();
}
return styleBar;
}
/**
* @return properties stylebar
*/
protected PropertiesStyleBarW newPropertiesStyleBar() {
return new PropertiesStyleBarW(this, app);
}
/**
* Returns the option panel for the given type. If the panel does not exist,
* a new one is constructed
*
* @param type
* panel type
* @param subType
* tab number for given panel
* @return options panel
*/
public OptionPanelW getOptionPanel(OptionType type, int subType) {
if (styleBar != null) {
styleBar.updateGUI();
}
switch (type) {
case DEFAULTS:
if (defaultsPanel == null) {
defaultsPanel = new OptionsDefaultsW();
}
return defaultsPanel;
case CAS:
if (casPanel == null) {
casPanel = new OptionsCASW((AppW) app);
}
return casPanel;
case EUCLIDIAN:
if (euclidianPanel == null) {
euclidianPanel = new OptionsEuclidianW((AppW) app,
((AppW) app).getActiveEuclidianView());
euclidianPanel.setLabels();
euclidianPanel.setView(((AppW)app).getEuclidianView1());
euclidianPanel.showCbView(false);
}
Log.debug("euclidianPanel");
return euclidianPanel;
case EUCLIDIAN2:
if (euclidianPanel2 == null) {
euclidianPanel2 = new OptionsEuclidianW((AppW) app,
((AppW)app).getEuclidianView2(1));
euclidianPanel2.setLabels();
euclidianPanel2.setView(((AppW)app).getEuclidianView2(1));
euclidianPanel2.showCbView(false);
}
Log.debug("euclidianPanel2");
return euclidianPanel2;
case EUCLIDIAN3D:
if (euclidianPanel3D == null) {
euclidianPanel3D = new OptionsEuclidianW((AppW) app,
((AppW)app).getEuclidianView3D());
euclidianPanel3D.setLabels();
// euclidianPanel3D.setView(((AppW)app).getEuclidianView3D());
euclidianPanel3D.showCbView(false);
}
Log.debug("euclidianPanel2");
return euclidianPanel2;
case SPREADSHEET:
if (spreadsheetPanel == null) {
spreadsheetPanel = new OptionsSpreadsheetW((AppW) app);
}
return spreadsheetPanel;
case ADVANCED:
if (advancedPanel == null) {
advancedPanel = new OptionsAdvancedW();
}
return advancedPanel;
case ALGEBRA:
if (algebraPanel == null) {
algebraPanel = new OptionsAlgebraW((AppW) app);
}
return algebraPanel;
case LAYOUT:
if (layoutPanel == null) {
layoutPanel = new OptionsLayoutW();
}
layoutPanel.getWrappedPanel().setStyleName("layoutPanel");
return layoutPanel;
case OBJECTS:
if (getObjectPanel() == null) {
setObjectPanel(new OptionsObjectW((AppW) app, false,
new Runnable() {
@Override
public void run() {
updatePropertiesView();
}
}));
}
Log.debug("obect prop SELECTING TAB " + subType);
getObjectPanel().selectTab(subType);
return getObjectPanel();
}
return null;
}
/**
* TODO disabled; decide if we want this
*
* @param visible
* whether to show AV
*/
public void updateAVvisible(boolean visible) {
// if ((visible && this.optionPanel instanceof OptionsObjectW) ==
// this.isObjectOptionsVisible) {
// return;
// }
// this.isObjectOptionsVisible = !this.isObjectOptionsVisible;
// if (visible) {
// wasAVShowing = app.getGuiManager().hasAlgebraViewShowing();
// auxWasVisible = app.getSettings().getAlgebra()
// .getShowAuxiliaryObjects();
// if (!wasAVShowing) {
// app.getGuiManager().setShowView(true, App.VIEW_ALGEBRA);
// app.updateViewSizes();
// }
// app.setShowAuxiliaryObjects(true);
//
// } else {
// if (!auxWasVisible) {
// app.setShowAuxiliaryObjects(false);
// }
// if (!wasAVShowing) {
// app.getGuiManager().setShowView(false, App.VIEW_ALGEBRA);
// app.updateViewSizes();
// }
// }
}
@Override
protected OptionsObjectW getObjectPanel() {
return super.getObjectPanel() != null
? (OptionsObjectW) super.getObjectPanel() : null;
}
@Override
public void add(GeoElement geo) {
// TODO Auto-generated method stub
}
@Override
public void remove(GeoElement geo) {
// TODO Auto-generated method stub
}
@Override
public void rename(GeoElement geo) {
// TODO Auto-generated method stub
}
@Override
public void update(GeoElement geo) {
if(geo.isLabelSet()){
updatePropertiesGUI();
}
}
@Override
public void updateVisualStyle(GeoElement geo, GProperty prop) {
// TODO Auto-generated method stub
Log.debug("update visual style");
if(geo.isLabelSet()){
updatePropertiesGUI();
}
}
@Override
public void updateAuxiliaryObject(GeoElement geo) {
// TODO Auto-generated method stub
updatePropertiesGUI();
}
@Override
public void repaintView() {
// nothing on repaint
}
@Override
public void reset() {
// TODO Auto-generated method stub
Log.debug("reset");
}
@Override
public void clearView() {
Log.debug("Clear View");
}
@Override
public void setMode(int mode,ModeSetter m) {
// TODO Auto-generated method stub
Log.debug("setting mode");
}
@Override
public int getViewID() {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean hasFocus() {
// TODO Auto-generated method stub
return false;
}
@Override
public void updateSelection() {
if (app.getSelectionManager().selectedGeosSize() != 0 && optionType != OptionType.OBJECTS) {
setOptionPanel(OptionType.OBJECTS);
}
else if (app.getSelectionManager().selectedGeosSize() == 0) {
if (optionType != OptionType.EUCLIDIAN
|| optionType != OptionType.EUCLIDIAN2
|| optionType != OptionType.EUCLIDIAN3D
|| optionType != OptionType.EUCLIDIAN_FOR_PLANE) {
if (app.getActiveEuclidianView().isEuclidianView3D()) {
setOptionPanel(OptionType.EUCLIDIAN3D);
} else if (app.getActiveEuclidianView().isDefault2D()) {
setOptionPanel(app.getActiveEuclidianView().getEuclidianViewNo() == 1
? OptionType.EUCLIDIAN : OptionType.EUCLIDIAN2);
} else {
setOptionPanel(OptionType.EUCLIDIAN_FOR_PLANE);
}
}
}
updatePropertiesGUI();
}
@Override
protected void setOptionPanelWithoutCheck(OptionType type) {
int sType = 0;
if (type == OptionType.OBJECTS && this.getObjectPanel() != null) {
MultiRowsTabPanel tabPanel = this.getObjectPanel()
.getTabPanel();
sType = tabPanel.getTabBar().getSelectedTab();
}
setOptionPanel(type, sType);
}
@Override
protected void setObjectsToolTip() {
Log.debug("=============== PropertiesViewW.setObjectsToolTip() : TODO");
// styleBar.setObjectsToolTip();
}
@Override
protected void setSelectedTab(OptionType type) {
switch (type) {
default:
// do nothing
break;
case EUCLIDIAN:
euclidianPanel.setSelectedTab(getSelectedTab());
break;
case EUCLIDIAN2:
euclidianPanel2.setSelectedTab(getSelectedTab());
break;
}
}
@Override
protected void updateObjectPanelSelection(ArrayList<GeoElement> geos) {
if (getObjectPanel() == null) {
return;
}
getObjectPanel().updateSelection(geos);
updateTitleBar();
setObjectsToolTip();
}
@Override
public void setOptionPanel(OptionType type, int subType) {
optionType = type;
contentsPanel.clear();
OptionPanelW optionPanel = getOptionPanel(type, subType);
updateAVvisible(true);
Widget wPanel = optionPanel.getWrappedPanel();
notImplemented.setText(getTypeString(type) + " - Not implemented");
contentsPanel.add(wPanel != null ? wPanel: notImplemented);
if(wPanel != null) {
onResize();
}
this.styleBar.selectButton(type);
}
/**
* @return selected option type
*/
public OptionType getOptionType() {
return optionType;
}
@Override
public void mousePressedForPropertiesView() {
if (getObjectPanel() == null) {
return;
}
getObjectPanel().forgetGeoAdded();
}
@Override
public void updateSelection(ArrayList<GeoElement> geos) {
if (geos.size() != 0 && optionType != OptionType.OBJECTS) {
setOptionPanel(OptionType.OBJECTS);
}
updatePropertiesGUI();
Log.debug("updateSelection(geos)");
}
private void updatePropertiesGUI() {
OptionsObjectW panel = getObjectPanel();
if (panel != null) {
panel.updateGUI();
if (optionType == OptionType.OBJECTS) {
if (!panel.getWrappedPanel().isVisible()) {
setOptionPanel(OptionType.EUCLIDIAN);
}
}
}
// if (optionType == OptionType.OBJECTS) {
// Log.debug("selecting tab 2");
// getObjectPanel().selectTab(2);
// }
if (styleBar != null) {
styleBar.updateGUI();
}
}
@Override
protected void updateTitleBar() {
updatePropertiesGUI();
}
@Override
public void attachView() {
if (isAttached()) {
Log.debug("already attached");
return;
}
clearView();
kernel.notifyAddAll(this);
kernel.attach(this);
app.getKernel().getAnimatonManager().stopAnimation();
setAttached(true);
}
@Override
public void detachView() {
kernel.detach(this);
clearView();
app.getKernel().getAnimatonManager().startAnimation();
setAttached(false);
}
@Override
public void updatePropertiesView() {
updatePropertiesGUI();
Log.debug("updatePropertiesView");
}
@Override
public boolean isShowing() {
Log.debug("isShowing");
return false;
}
/**
*
* @return GWT panel of this view
*/
public Widget getWrappedPanel() {
return wrappedPanel;
}
/**
* Rebuild GUI for the new font size
*/
public void updateFonts(){
updatePropertiesGUI();
}
@Override
public void onResize() {
//-34px for width of stylebar
int width = getWrappedPanel().getOffsetWidth() - 37;
int height = getWrappedPanel().getOffsetHeight();
//contentsPanel.setHeight(getWrappedPanel().getOffsetHeight() + "px");
if(height > 0 && width > 0) {
contentsPanel.setWidth(width + "px");
}
}
@Override
public boolean suggestRepaint(){
return false;
}
@Override
public void setLabels() {
if (euclidianPanel != null) {
euclidianPanel.setLabels();
}
if (euclidianPanel2 != null) {
euclidianPanel2.setLabels();
}
if (euclidianPanel3D != null) {
euclidianPanel3D.setLabels();
}
if (spreadsheetPanel != null) {
spreadsheetPanel.setLabels();
}
if (casPanel != null) {
casPanel.setLabels();
}
if (algebraPanel != null) {
algebraPanel.setLabels();
}
}
@Override
public void updateStyleBar() {
if (styleBar != null) {
styleBar.updateGUI();
}
}
}