/* 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.desktop.euclidian; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import javax.swing.DefaultListModel; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import org.geogebra.common.kernel.geos.GeoElement; /** * Use this modal dialog to let the user choose one string from a list. */ // TODO class is unused; will it be used? public class ListDialog extends JDialog { private static final long serialVersionUID = 1L; private static final int MIN_WIDTH = 120; private static final int MIN_HEIGHT = 100; private GeoElement value = null; JList list; DefaultListModel listModel; /** * * @param comp * @param data * list of GeoElement objects * @param title */ public ListDialog(JComponent comp, ArrayList<GeoElement> data, String title) { super(JOptionPane.getFrameForComponent(comp), title, true); // list listModel = new DefaultListModel(); list = new JList(listModel); for (int i = 0; i < data.size(); i++) { GeoLabel label = new GeoLabel(data.get(i)); listModel.addElement(label); } final int lineHeight = list.getPreferredSize().height / data.size(); // listen when mouse is moved over an item MouseMotionListener mml = new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) { int size = listModel.getSize(); list.setSelectedIndex( Math.min(e.getY() / lineHeight, size - 1)); } }; list.addMouseMotionListener(mml); list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); list.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { GeoLabel gl = (GeoLabel) list.getSelectedValue(); if (gl == null) { return; } setValue(gl.geo); setVisible(false); } }); list.setVisibleRowCount(4); JScrollPane listScroller = new JScrollPane(list); Dimension dim = new Dimension(MIN_WIDTH, MIN_HEIGHT); listScroller.setPreferredSize(dim); // Must do the following, too, or else the scroller thinks // it's taller than it is: listScroller.setMinimumSize(dim); // Put everything together, using the content pane's BorderLayout. Container contentPane = getContentPane(); contentPane.add(listScroller, BorderLayout.CENTER); // setUndecorated(false); pack(); } /** * Show the initialized dialog. The first argument should be null if you * want the dialog to come up in the center of the screen. Otherwise, the * argument should be the component on top of which the dialog should * appear. */ public GeoElement showDialog(Component comp, Point location) { Point p = comp.getLocationOnScreen(); setLocation(location.x + p.x, location.y + p.y); setVisible(true); return value; } void setValue(GeoElement newValue) { value = newValue; list.setSelectedValue(value, true); } private static class GeoLabel extends JLabel { private static final long serialVersionUID = 1L; GeoElement geo; public GeoLabel(GeoElement geo) { this.geo = geo; } @Override public String toString() { return geo.getNameDescriptionHTML(true, true); } } }