package org.geogebra.desktop.gui.dialog; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.util.ArrayList; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSeparator; import javax.swing.JToggleButton; import javax.swing.ListCellRenderer; import javax.swing.SwingConstants; import javax.swing.border.EmptyBorder; import org.geogebra.common.gui.SetLabels; import org.geogebra.common.gui.UpdateFonts; import org.geogebra.common.gui.dialog.options.model.TextOptionsModel; import org.geogebra.common.gui.dialog.options.model.TextOptionsModel.ITextOptionsListener; import org.geogebra.common.gui.inputfield.DynamicTextElement; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoText; import org.geogebra.common.main.Localization; import org.geogebra.common.util.lang.Unicode; import org.geogebra.desktop.gui.dialog.PropertiesPanelD.TextEditPanel; import org.geogebra.desktop.gui.properties.UpdateablePropertiesPanel; /** * panel to select the size of a GeoText * * @author Markus Hohenwarter */ class TextOptionsPanelD extends JPanel implements ActionListener, SetLabels, UpdateFonts, UpdateablePropertiesPanel, FocusListener, ITextOptionsListener { /** * */ private final PropertiesPanelD propertiesPanelD; private static final long serialVersionUID = 1L; private TextOptionsModel model; private JLabel decimalLabel; private JComboBox cbFont, cbSize, cbDecimalPlaces; private JToggleButton btBold, btItalic; private JPanel secondLine; private boolean secondLineVisible = false; private TextEditPanel editPanel; public TextOptionsPanelD(PropertiesPanelD propertiesPanelD) { this.propertiesPanelD = propertiesPanelD; model = new TextOptionsModel(this.propertiesPanelD.app); model.setListener(this); cbFont = new JComboBox(model.getFonts()); cbFont.addActionListener(this); // font size // TODO require font phrases F.S. cbSize = new JComboBox(model.getFontSizes()); cbSize.addActionListener(this); cbFont.addFocusListener(this); // toggle buttons for bold and italic btBold = new JToggleButton(); btBold.setFont(this.propertiesPanelD.app.getBoldFont()); btBold.addActionListener(this); btItalic = new JToggleButton(); btItalic.setFont(this.propertiesPanelD.app.getPlainFont() .deriveFont(Font.ITALIC)); btItalic.addActionListener(this); // decimal places ComboBoxRenderer renderer = new ComboBoxRenderer(); cbDecimalPlaces = new JComboBox( this.propertiesPanelD.loc.getRoundingMenu()); cbDecimalPlaces.setRenderer(renderer); cbDecimalPlaces.addActionListener(this); // font, size JPanel firstLine = new JPanel(); firstLine.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0)); firstLine.add(cbFont); firstLine.add(cbSize); firstLine.add(btBold); firstLine.add(btItalic); // bold, italic secondLine = new JPanel(); secondLine.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0)); decimalLabel = new JLabel(); secondLine.add(decimalLabel); secondLine.add(cbDecimalPlaces); setLayout(new BorderLayout(5, 5)); add(firstLine, BorderLayout.NORTH); add(secondLine, BorderLayout.SOUTH); secondLineVisible = true; } public void setEditPanel(TextEditPanel tep) { this.editPanel = tep; } @Override public void setLabels() { Localization loc = this.propertiesPanelD.app.getLocalization(); String[] fontSizes = loc.getFontSizeStrings(); int selectedIndex = cbSize.getSelectedIndex(); cbSize.removeActionListener(this); cbSize.removeAllItems(); for (int i = 0; i < fontSizes.length; ++i) { cbSize.addItem(fontSizes[i]); } cbSize.addItem(loc.getMenu("Custom") + Unicode.ellipsis); cbSize.setSelectedIndex(selectedIndex); cbSize.addActionListener(this); btItalic.setText(loc.getMenu("Italic").substring(0, 1)); btBold.setText(loc.getMenu("Bold").substring(0, 1)); decimalLabel.setText(loc.getMenu("Rounding") + ":"); } @Override public void setFontSizeVisibleOnly() { cbSize.setVisible(true); cbFont.setVisible(false); btBold.setVisible(false); btItalic.setVisible(false); secondLine.setVisible(false); } static class ComboBoxRenderer extends JLabel implements ListCellRenderer { /** * */ private static final long serialVersionUID = 1L; JSeparator separator; public ComboBoxRenderer() { setOpaque(true); setBorder(new EmptyBorder(1, 1, 1, 1)); separator = new JSeparator(SwingConstants.HORIZONTAL); } @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { String str = (value == null) ? "" : value.toString(); if ("---".equals(str)) { return separator; } if (isSelected) { setBackground(list.getSelectionBackground()); setForeground(list.getSelectionForeground()); } else { setBackground(list.getBackground()); setForeground(list.getForeground()); } setFont(list.getFont()); setText(str); return this; } } @Override public JPanel updatePanel(Object[] geos) { model.setGeos(geos); return update(); } @Override public void updateVisualStyle(GeoElement geo) { if (!model.hasGeos()) { return; } update(); } public JPanel update() { // check geos if (!model.checkGeos()) { model.cancelEditGeo(); return null; } cbSize.removeActionListener(this); cbFont.removeActionListener(this); cbDecimalPlaces.removeActionListener(this); model.updateProperties(); cbSize.addActionListener(this); cbFont.addActionListener(this); cbDecimalPlaces.addActionListener(this); return this; } /** * change listener implementation for slider */ @Override public void actionPerformed(ActionEvent e) { Object source = e.getSource(); if (source == cbSize) { boolean isCustom = (cbSize.getSelectedIndex() == 7); if (isCustom) { final String percentStr = JOptionPane .showInputDialog( this.propertiesPanelD.app .getFrame(), this.propertiesPanelD.app.getLocalization() .getMenu("EnterPercentage"), Math.round(model.getTextPropertiesAt(0) .getFontSizeMultiplier() * 100) + "%"); model.applyFontSizeFromString(percentStr); } else { model.applyFontSizeFromIndex(cbSize.getSelectedIndex()); } } else if (source == cbFont) { model.applyFont(cbFont.getSelectedIndex() == 1); } else if (source == cbDecimalPlaces) { model.applyDecimalPlaces(cbDecimalPlaces.getSelectedIndex()); } else if (source == btBold || source == btItalic) { model.applyFontStyle(btBold.isSelected(), btItalic.isSelected()); } } @Override public void updateFonts() { Font font = this.propertiesPanelD.app.getPlainFont(); cbFont.setFont(font); cbSize.setFont(font); cbDecimalPlaces.setFont(font); btItalic.setFont(font); btBold.setFont(font); decimalLabel.setFont(font); editPanel.setFont(font); } @Override public void focusGained(FocusEvent arg0) { cbSize.setSelectedIndex(GeoText.getFontSizeIndex( model.getTextPropertiesAt(0).getFontSizeMultiplier())); } @Override public void focusLost(FocusEvent arg0) { model.cancelEditGeo(); } @Override public void setWidgetsVisible(boolean showFontDetails, boolean isButton) { // hide most options for Textfields cbFont.setVisible(showFontDetails); btBold.setVisible(showFontDetails); btItalic.setVisible(showFontDetails); secondLine.setVisible(showFontDetails); secondLineVisible = showFontDetails; if (isButton) { secondLine.setVisible(!showFontDetails); secondLineVisible = !showFontDetails; } // removed, stops lists being set to Serif / Sans Serif // cbFont.setVisible(model.isTextEditable()); } @Override public void selectSize(int index) { cbSize.setSelectedIndex(index); } @Override public void selectFont(int index) { cbFont.setSelectedIndex(index); } @Override public void selectDecimalPlaces(int index) { cbDecimalPlaces.setSelectedIndex(index); } @Override public void setSecondLineVisible(boolean noDecimals) { if (noDecimals) { if (secondLineVisible) { secondLineVisible = false; } } else { if (!secondLineVisible) { secondLineVisible = true; } secondLine.setVisible(secondLineVisible); } } @Override public void updatePreview() { if (this.propertiesPanelD.getTextPanel() != null) { this.propertiesPanelD.getTextPanel().td.handleDocumentEvent(); } } @Override public void selectFontStyle(int style) { btBold.setSelected( style == Font.BOLD || style == (Font.BOLD + Font.ITALIC)); btItalic.setSelected( style == Font.ITALIC || style == (Font.BOLD + Font.ITALIC)); } @Override public void setEditorText(ArrayList<DynamicTextElement> list) { // TODO Auto-generated method stub } @Override public void setEditorText(String text) { // TODO Auto-generated method stub } @Override public void reinitEditor() { // only called in Web } }