001 /* 002 * Copyright 2002 - 2007 JEuclid, http://jeuclid.sf.net 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 /* $Id: FontSelectionDialog.java,v 503f7e4f22db 2008/04/28 12:43:00 maxberger $ */ 018 019 package net.sourceforge.jeuclid.app.mathviewer; 020 021 import java.awt.BorderLayout; 022 import java.awt.Dialog; 023 import java.awt.FlowLayout; 024 import java.awt.Font; 025 import java.awt.Frame; 026 import java.awt.event.ActionEvent; 027 import java.awt.event.ActionListener; 028 import java.util.ArrayList; 029 import java.util.Collections; 030 import java.util.List; 031 import java.util.Vector; 032 033 import javax.swing.JButton; 034 import javax.swing.JDialog; 035 import javax.swing.JLabel; 036 import javax.swing.JList; 037 import javax.swing.JPanel; 038 import javax.swing.JScrollPane; 039 import javax.swing.JTextArea; 040 import javax.swing.ScrollPaneConstants; 041 import javax.swing.WindowConstants; 042 import javax.swing.event.ListSelectionEvent; 043 import javax.swing.event.ListSelectionListener; 044 045 import net.sourceforge.jeuclid.font.FontFactory; 046 047 /** 048 * Dialog that lets user select one or more fonts available in the system. 049 * 050 * @version $Revision: 503f7e4f22db $ 051 */ 052 // CHECKSTYLE:OFF 053 public class FontSelectionDialog extends JDialog { 054 // CHECKSTYLE:ON 055 056 private static final int SAMPLE_FONTSIZE = 14; 057 058 /** 059 * 060 */ 061 private static final long serialVersionUID = 1L; 062 063 private static final String PREVIEW_TEXT = "The quick brown fox jumps over the lazy dog. 123456790"; 064 065 private final List<String> fontNames = new ArrayList<String>(); 066 067 private JList list; 068 069 /** 070 * Default Constructor. 071 * 072 * @param parent 073 * parent dialog 074 * @param currentFontNames 075 * font names to select initially 076 */ 077 public FontSelectionDialog(final Dialog parent, 078 final List<String> currentFontNames) { 079 super(parent); 080 this.init(currentFontNames); 081 } 082 083 /** 084 * Default Constructor. 085 * 086 * @param parent 087 * parent frame 088 * @param currentFontNames 089 * font names to select initially 090 */ 091 public FontSelectionDialog(final Frame parent, 092 final List<String> currentFontNames) { 093 super(parent); 094 this.init(currentFontNames); 095 } 096 097 private void init(final List<String> currentFontNames) { 098 this.setTitle(Messages 099 .getString("MathViewer.FontSelectionDialog.title")); 100 this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 101 this 102 .getContentPane() 103 .add( 104 new JLabel( 105 Messages 106 .getString("MathViewer.FontSelectionDialog.topLabel")), 107 BorderLayout.NORTH); 108 this.setupFontsList(currentFontNames); 109 this.setupButtons(); 110 this.pack(); 111 this.setLocationByPlatform(true); 112 this.setModal(true); 113 } 114 115 /** 116 * @return selected font names if OK was pressed to close the dialog 117 */ 118 public List<String> getFontNames() { 119 return this.fontNames; 120 } 121 122 private void setupFontsList(final List<String> currentFontNames) { 123 // CHECKSTYLE:OFF 124 // Vector is a must because JList requires it. 125 final Vector<String> allFonts = new Vector<String>(FontFactory 126 .getInstance().listFontNames()); 127 // CHECKSTYLE:ON 128 Collections.sort(allFonts); 129 this.list = new JList(allFonts); 130 final List<Integer> selectedIndicies = new ArrayList<Integer>(); 131 if (currentFontNames != null && !currentFontNames.isEmpty()) { 132 for (final String value : currentFontNames) { 133 final int i = Collections.binarySearch(allFonts, value); 134 if (i > -1) { 135 selectedIndicies.add(i); 136 } 137 } 138 } 139 final int[] selectedIndiciesArr = new int[selectedIndicies.size()]; 140 for (int i = 0; i < selectedIndiciesArr.length; i++) { 141 selectedIndiciesArr[i] = selectedIndicies.get(i); 142 } 143 this.list.setSelectedIndices(selectedIndiciesArr); 144 final JScrollPane scrollPane = new JScrollPane(this.list, 145 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 146 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); 147 final JTextArea preview = new JTextArea( 148 FontSelectionDialog.PREVIEW_TEXT); 149 this.list.addListSelectionListener(new ListSelectionListener() { 150 public void valueChanged(final ListSelectionEvent e) { 151 preview.setFont(FontFactory.getInstance().getFont( 152 (String) FontSelectionDialog.this.list 153 .getSelectedValue(), Font.PLAIN, 154 FontSelectionDialog.SAMPLE_FONTSIZE)); 155 preview.revalidate(); 156 } 157 }); 158 this.getContentPane().add(scrollPane, BorderLayout.WEST); 159 this.getContentPane().add(preview, BorderLayout.CENTER); 160 } 161 162 private void setupButtons() { 163 final JPanel buttonsPanel = new JPanel(new FlowLayout( 164 FlowLayout.CENTER)); 165 final JButton btnOK = new JButton(Messages.getString("MathViewer.ok")); 166 btnOK.setMnemonic('O'); 167 final ActionListener actionListener = new ActionListener() { 168 public void actionPerformed(final ActionEvent e) { 169 if (e.getSource() == btnOK) { 170 for (Object val : FontSelectionDialog.this.list 171 .getSelectedValues()) { 172 FontSelectionDialog.this.fontNames.add((String) val); 173 } 174 } 175 FontSelectionDialog.this.dispose(); 176 } 177 }; 178 btnOK.addActionListener(actionListener); 179 buttonsPanel.add(btnOK); 180 final JButton btnCancel = new JButton(Messages 181 .getString("MathViewer.cancel")); 182 btnCancel.setMnemonic('C'); 183 btnCancel.addActionListener(actionListener); 184 buttonsPanel.add(btnCancel); 185 this.getContentPane().add(buttonsPanel, BorderLayout.SOUTH); 186 } 187 188 }