package org.geogebra.web.web.gui.dialog;
import org.geogebra.common.awt.GColor;
import org.geogebra.common.awt.GFont;
import org.geogebra.common.awt.GRectangle;
import org.geogebra.common.euclidian.EuclidianController;
import org.geogebra.common.euclidian.EuclidianStatic;
import org.geogebra.common.euclidian.EuclidianView;
import org.geogebra.common.gui.dialog.TextPreviewer;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.geos.GeoText;
import org.geogebra.common.main.App;
import org.geogebra.common.main.settings.EuclidianSettings;
import org.geogebra.web.html5.euclidian.EuclidianControllerW;
import org.geogebra.web.html5.euclidian.EuclidianPanelWAbstract;
import org.geogebra.web.html5.euclidian.EuclidianViewW;
import com.google.gwt.canvas.client.Canvas;
import com.google.gwt.dom.client.Style;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.Widget;
/**
*
* Web implementation of TextPreviewPanel
*
* @author G. Sturr
*
*/
public class TextPreviewPanelW extends TextPreviewer {
private MyEuclidianViewPanelForTextPreviewPanelW evPanel;
/**
* @param kernel
*/
public TextPreviewPanelW(Kernel kernel) {
super(kernel);
}
/**
* @return Widget that encloses the EuclidianView
*/
public Widget getPanel() {
return getEVPanel();
}
/**
* Updates the preferred size of this panel to match the estimated size of
* the given preview geo. This forces the enclosing scrollpane to show
* scrollbars when the size of the preview geo grows larger than the
* scrollpane viewport.
*
* Note: The preview geo uses absolute screen coords, so we can't easily get
* the bounding box dimensions and must use dummy containers to estimate
* these dimensions.
*
* @param previewGeo
*/
@Override
protected void updateViewportSize(GeoText previewGeo) {
int padding = 5; // account for inset
boolean isLatex = previewGeo.isLaTeX();
boolean serif = previewGeo.isSerifFont();
int size = (int) (previewGeo.getFontSizeMultiplier() * getApp()
.getFontSize());
GFont textFont = getApp().getFontCommon(serif, previewGeo.getFontStyle(),
size);
GRectangle rect;
if (isLatex) {
rect = EuclidianStatic.drawMultilineLaTeX(getApp(),
ev.getTempGraphics2D(textFont), previewGeo,
ev.getTempGraphics2D(textFont), textFont, GColor.BLACK,
GColor.WHITE,
previewGeo.getTextString(), 0, 0, serif, null);
} else {
rect = EuclidianStatic.drawMultiLineText(getApp(),
previewGeo.getTextString(), 0, 0, ((EuclidianViewW) ev).g2p,
serif, textFont);
}
//App.debug("text rect: " + rect.getWidth() + " x " +
// rect.getHeight());
int w = (int) rect.getWidth() + padding;
int h = (int) rect.getHeight() + padding;
((EuclidianViewW) ev).setPreferredSize(w, h);
evPanel.setSize(w + "px", h + "px");
}
@Override
protected void removeEVMouseListeners() {
// ev.removeMouseListener(ev.getEuclidianController());
// ev.removeMouseMotionListener(ev.getEuclidianController());
// ev.removeMouseWheelListener(ev.getEuclidianController());
}
@Override
protected EuclidianViewW getEuclidianView() {
if (ev == null) {
ev = new MyEuclidianView(getEVPanel(), new EuclidianControllerW(
kernel), EuclidianView.EVNO_GENERAL,
null);
}
return (EuclidianViewW) ev;
}
private MyEuclidianViewPanelForTextPreviewPanelW getEVPanel() {
if (evPanel == null) {
evPanel = new MyEuclidianViewPanelForTextPreviewPanelW();
}
return evPanel;
}
public void onResize() {
getEVPanel().onResize();
}
/****************************************************************************
* Extension of EuclidianViewD for displaying preview text strings
*
*/
private static class MyEuclidianView extends EuclidianViewW {
public MyEuclidianView(MyEuclidianViewPanelForTextPreviewPanelW panel,
EuclidianController ec,
int evno, EuclidianSettings settings) {
super(panel, ec, evno, settings);
// the show axis and show grid parameters currently do nothing, so
// we do it here
this.setShowAxes(false, false);
this.showGrid(false);
}
/**
* Overrides attachView with an empty method to prevent this panel from
* attaching to the kernel
*/
@Override
public void attachView() {
// do nothing
}
@Override
public int getViewID() {
return App.VIEW_TEXT_PREVIEW;
}
@Override
public boolean isPlotPanel() {
return true;
}
}
/****************************************************************************
* Panel for EuclidianView
*
*/
private class MyEuclidianViewPanelForTextPreviewPanelW extends AbsolutePanel implements
EuclidianPanelWAbstract {
private Canvas canvas;
public MyEuclidianViewPanelForTextPreviewPanelW() {
super();
canvas = Canvas.createIfSupported();
canvas.getElement().getStyle().setPosition(Style.Position.ABSOLUTE);
canvas.getElement().getStyle().setZIndex(0);
add(canvas);
}
@Override
public AbsolutePanel getAbsolutePanel() {
return this;
}
@Override
public Panel getEuclidianPanel() {
return this;
}
@Override
public Canvas getCanvas() {
return canvas;
}
@Override
public EuclidianView getEuclidianView() {
return ev;
}
@Override
public void onResize() {
// nothing to do on resize
}
@Override
public void deferredOnResize() {
// nothing to do on resize
}
@Override
public void updateNavigationBar() {
// TODO Auto-generated method stub
}
}
public void setText(String buildGeoGebraString) {
// TODO Auto-generated method stub
}
}