package org.geogebra.desktop.gui.dialog;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import org.geogebra.common.euclidian.EuclidianController;
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.desktop.euclidian.EuclidianControllerD;
import org.geogebra.desktop.euclidian.EuclidianControllerListeners;
import org.geogebra.desktop.euclidian.EuclidianViewD;
import org.geogebra.desktop.gui.util.GeoGebraIconD;
import org.geogebra.desktop.main.AppD;
/**
*
* Desktop implementation of TextPreviewPanel
*
* @author G. Sturr
*
*/
public class TextPreviewPanelD extends TextPreviewer {
/**
* @param kernel
*/
public TextPreviewPanelD(Kernel kernel) {
super(kernel);
}
/**
* @return JPanel that encloses the EuclidianView
*/
public JPanel getJPanel() {
return ((EuclidianViewD) ev).getJPanel();
}
/**
* 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) {
Dimension d = new Dimension();
ImageIcon testIcon = new ImageIcon();
JTextPane dummyText = new JTextPane();
int padding = 5; // account for inset
if (previewGeo == null) {
return;
}
if (previewGeo.isLaTeX()) {
// LaTex geo, use dummy ImageIcon
GeoGebraIconD.drawLatexImageIcon((AppD) getApp(), testIcon,
previewGeo.getTextString(), ((AppD) getApp()).getPlainFont(),
true, Color.black, null);
// System.out.println("=============> " + testIcon.getIconHeight() +
// " : " + testIcon.getIconWidth());
// get the dimensions from the icon and add some padding
d.height = testIcon.getIconHeight() + padding;
d.width = testIcon.getIconWidth() + padding;
} else {
// Plain text geo, use dummy JTextArea
// set font and line spacing (guessing at this value)
dummyText.setFont(((AppD) getApp()).getPlainFont());
MutableAttributeSet set = new SimpleAttributeSet();
StyleConstants.setLineSpacing(set, 1);
// StyleConstants.setSpaceBelow(set, (float) 0.5);
dummyText.setParagraphAttributes(set, true);
dummyText.setText(previewGeo.getTextString());
d = dummyText.getPreferredSize();
// add some padding
d.height += padding;
d.width += padding;
}
// update this panel
((EuclidianViewD) ev).setPreferredSize(d);
((EuclidianViewD) ev).revalidate();
}
@Override
protected void removeEVMouseListeners() {
((EuclidianViewD) ev).removeMouseListener(
(EuclidianControllerListeners) ev.getEuclidianController());
((EuclidianViewD) ev).removeMouseMotionListener(
(EuclidianControllerListeners) ev.getEuclidianController());
((EuclidianViewD) ev).removeMouseWheelListener(
(EuclidianControllerListeners) ev.getEuclidianController());
}
@Override
protected EuclidianViewD getEuclidianView() {
boolean[] showAxes = { false, false };
boolean showGrid = false;
if (ev == null) {
ev = new EuclidianViewTextPreview(new EuclidianControllerD(kernel),
showAxes, showGrid, EuclidianView.EVNO_GENERAL, null);
}
return (EuclidianViewD) ev;
}
/****************************************************************************
* Extension of EuclidianViewD for displaying preview text strings in the
* text editor.
*
*/
private static class EuclidianViewTextPreview extends EuclidianViewD {
public EuclidianViewTextPreview(EuclidianController ec,
boolean[] showAxes, boolean showGrid, int evno,
EuclidianSettings settings) {
super(ec, showAxes, showGrid, evno, settings);
}
/**
* 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;
}
}
}