/* GeoGebra - Dynamic Mathematics for Everyone http://www.geogebra.org This file is part of GeoGebra. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation. */ package org.geogebra.common.euclidian.draw; import org.geogebra.common.awt.GGraphics2D; import org.geogebra.common.awt.GRectangle; import org.geogebra.common.euclidian.BoundingBox; import org.geogebra.common.euclidian.Drawable; import org.geogebra.common.euclidian.EuclidianView; import org.geogebra.common.euclidian.MyButton; import org.geogebra.common.euclidian.RemoveNeeded; import org.geogebra.common.kernel.StringTemplate; import org.geogebra.common.kernel.geos.GeoButton; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.main.App; /** * Button (for scripting) * * @author Markus Hohenwarter */ public final class DrawButton extends Drawable implements RemoveNeeded { private GeoButton geoButton; private boolean isVisible; private String oldCaption; /** button "component" */ public MyButton myButton; /** * @param view * view * @param geoButton * button */ public DrawButton(EuclidianView view, GeoButton geoButton) { this.view = view; this.geoButton = geoButton; geo = geoButton; myButton = new MyButton(geoButton, view); // action listener for checkBox /* * bl = new ButtonListener(); * * myButton.addItemListener(bl); myButton.addMouseListener(bl); * myButton.addMouseMotionListener(bl); myButton.setFocusable(false); */ // view.add(myButton); update(); } // private class ButtonListener implements ItemListener, // MouseListener, MouseMotionListener { // // private boolean dragging = false; // private EuclidianController ec = // ((EuclidianView)view).getEuclidianController(); // // /** // * Handles click on check box. Changes value of GeoBoolean. // */ // public void itemStateChanged(ItemEvent e) { // } // // public void mouseDragged(MouseEvent e) { // dragging = true; // e.translatePoint(myButton.getX(), myButton.getY()); // ec.mouseDragged(e); // ((EuclidianView)view).setToolTipText(null); // } // // public void mouseMoved(MouseEvent e) { // e.translatePoint(myButton.getX(), myButton.getY()); // ec.mouseMoved(e); // ((EuclidianView)view).setToolTipText(null); // } // // public void mouseClicked(MouseEvent e) { // if (e.getClickCount() > 1) return; // // e.translatePoint(myButton.getX(), myButton.getY()); // ec.mouseClicked(e); // } // // public void mousePressed(MouseEvent e) { // dragging = false; // e.translatePoint(myButton.getX(), myButton.getY()); // ec.mousePressed(e); // } // // public void mouseReleased(MouseEvent e) { // if (!dragging && !e.isMetaDown() && !e.isPopupTrigger() // && view.getMode() == EuclidianConstants.MODE_MOVE) // { // // handle LEFT CLICK // //geoBool.setValue(!geoBool.getBoolean()); // //geoBool.updateRepaint(); // // // delayed run to allow time for focus leaving event // // to be triggered for GeoTextField // SwingUtilities.invokeLater( new Runnable(){ public void // run() { geo.runScripts(null); }}); // // // // make sure itemChanged does not change // // the value back my faking a drag // dragging = true; // } // else { // // handle right click and dragging // e.translatePoint(myButton.getX(), myButton.getY()); // ec.mouseReleased(e); // } // } // // public void mouseEntered(MouseEvent arg0) { // hit = true; // ((EuclidianView)view).setToolTipText(null); // } // // public void mouseExited(MouseEvent arg0) { // hit = false; // } // } @Override final public void update() { isVisible = geo.isEuclidianVisible(); if (!isVisible) { return; } // get caption to show r String caption = geo.getCaption(StringTemplate.defaultTemplate); if (!caption.equals(oldCaption)) { oldCaption = caption; labelDesc = GeoElement.indicesToHTML(caption, true); } myButton.setText(labelDesc); int fontSize = (int) (view.getFontSize() * geoButton.getFontSizeMultiplier()); App app = view.getApplication(); // myButton.setOpaque(true); myButton.setFont(app.getFontCanDisplay(myButton.getText(), geoButton.isSerifFont(), geoButton.getFontStyle(), fontSize)); // myButton.setForeground(geogebra.awt.Color.getAwtColor(geo.getObjectColor())); // Color bgCol = geo.getBackgroundColor(); // myButton.setBackground(Color.red);//bgCol != null ? bgCol : // view.getBackground()); // set checkbox state // jButton.removeItemListener(bl); // jButton.setSelected(geo.getBoolean()); // jButton.addItemListener(bl); xLabel = geo.labelOffsetX; yLabel = geo.labelOffsetY; labelRectangle.setBounds(xLabel, yLabel, myButton.getWidth(), myButton.getHeight()); myButton.setBounds(labelRectangle); } @Override final public void draw(GGraphics2D g2) { if (isVisible) { myButton.setSelected(geo.doHighlighting()); myButton.paintComponent(g2, geoButton.getFontSizeMultiplier()); // setSelected doesn't seem to do anything in Windows XP // if (!Application.MAC_OS) { // // but looks ugly in MacOS, see #820 // button.setBackground(geo.doHighlighting() ? Color.blue : // Color.white); // } } } /** * Removes button from view again */ @Override final public void remove() { // ((EuclidianView)view).remove(myButton); } /** * was this object clicked at? (mouse pointer location (x,y) in screen * coords) */ @Override final public boolean hit(int x, int y, int hitThreshold) { return myButton.getBounds().contains(x, y) && isVisible; } @Override final public boolean isInside(GRectangle rect) { return rect.contains(labelRectangle); } @Override public boolean intersectsRectangle(GRectangle rect) { return myButton.getBounds().intersects(rect) && isVisible; } /** * Returns false */ @Override public boolean hitLabel(int x, int y) { return false; } @Override final public GeoElement getGeoElement() { return geo; } @Override final public void setGeoElement(GeoElement geo) { this.geo = geo; } @Override public BoundingBox getBoundingBox() { // TODO Auto-generated method stub return null; } @Override public void updateBoundingBox() { // TODO Auto-generated method stub } }