mirror of
https://github.com/deathmarine/Luyten.git
synced 2024-11-23 04:40:07 +00:00
Addresses #53 Adds Ctrl+Wheel text zoom, and FontChooser to RightClick
popup
This commit is contained in:
parent
92fae89c60
commit
9290349011
1
.gitignore
vendored
1
.gitignore
vendored
@ -4,3 +4,4 @@
|
||||
/bin
|
||||
/target
|
||||
/lib
|
||||
/resources
|
||||
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
4
pom.xml
4
pom.xml
@ -164,7 +164,7 @@
|
||||
<classPath>
|
||||
<mainClass>${project.groupId}.${project.artifactId}.Luyten</mainClass>
|
||||
</classPath>
|
||||
<icon>Luyten.ico</icon>
|
||||
<icon>luyten.ico</icon>
|
||||
<jre>
|
||||
<minVersion>1.7.0</minVersion>
|
||||
<maxVersion>1.8.0</maxVersion>
|
||||
@ -228,7 +228,7 @@
|
||||
bundleid="${project.groupId}.${project.artifactId}"
|
||||
mainclass="${project.groupId}.${project.artifactId}.LuytenOsx"
|
||||
version="${project.version}" copyright="2015"
|
||||
icon="${project.build.sourceDirectory}/resources/Luyten.icns"
|
||||
icon="${project.build.sourceDirectory}/resources/luyten.icns"
|
||||
jvmversion="1.7+" screenmenu="true"
|
||||
antialiasedgraphics="true" highresolutioncapable="true" >
|
||||
<documenttype name="Class File" extensions="class" role="Viewer" />
|
||||
|
719
src/us/deathmarine/luyten/JFontChooser.java
Normal file
719
src/us/deathmarine/luyten/JFontChooser.java
Normal file
@ -0,0 +1,719 @@
|
||||
package us.deathmarine.luyten;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Font;
|
||||
import java.awt.Frame;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.awt.GridLayout;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.FocusAdapter;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.KeyAdapter;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.Action;
|
||||
import javax.swing.ActionMap;
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.BoxLayout;
|
||||
import javax.swing.InputMap;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JList;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextField;
|
||||
import javax.swing.KeyStroke;
|
||||
import javax.swing.ListSelectionModel;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.border.Border;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import javax.swing.text.BadLocationException;
|
||||
import javax.swing.text.Document;
|
||||
import javax.swing.text.JTextComponent;
|
||||
import javax.swing.text.Position;
|
||||
|
||||
/**
|
||||
* The <code>JFontChooser</code> class is a swing component for font selection.
|
||||
* This class has <code>JFileChooser</code> like APIs. The following code pops
|
||||
* up a font chooser dialog.
|
||||
*
|
||||
* <pre>
|
||||
* JFontChooser fontChooser = new JFontChooser(); int result =
|
||||
* fontChooser.showDialog(parent); if (result == JFontChooser.OK_OPTION) { Font
|
||||
* font = fontChooser.getSelectedFont(); System.out.println("Selected Font : " +
|
||||
* font); }
|
||||
*
|
||||
* <pre>
|
||||
**/
|
||||
public class JFontChooser extends JComponent {
|
||||
// class variables
|
||||
/**
|
||||
* Return value from <code>showDialog()</code>.
|
||||
*
|
||||
* @see #showDialog
|
||||
**/
|
||||
public static final int OK_OPTION = 0;
|
||||
/**
|
||||
* Return value from <code>showDialog()</code>.
|
||||
*
|
||||
* @see #showDialog
|
||||
**/
|
||||
public static final int CANCEL_OPTION = 1;
|
||||
/**
|
||||
* Return value from <code>showDialog()</code>.
|
||||
*
|
||||
* @see #showDialog
|
||||
**/
|
||||
public static final int ERROR_OPTION = -1;
|
||||
private static final Font DEFAULT_SELECTED_FONT = new Font("Serif", Font.PLAIN, 12);
|
||||
private static final Font DEFAULT_FONT = new Font("Dialog", Font.PLAIN, 10);
|
||||
private static final int[] FONT_STYLE_CODES = { Font.PLAIN, Font.BOLD, Font.ITALIC, Font.BOLD | Font.ITALIC };
|
||||
private static final String[] DEFAULT_FONT_SIZE_STRINGS = { "8", "9", "10", "11", "12", "14", "16", "18", "20",
|
||||
"22", "24", "26", "28", "36", "48", "72", };
|
||||
|
||||
// instance variables
|
||||
protected int dialogResultValue = ERROR_OPTION;
|
||||
|
||||
private String[] fontStyleNames = null;
|
||||
private String[] fontFamilyNames = null;
|
||||
private String[] fontSizeStrings = null;
|
||||
private JTextField fontFamilyTextField = null;
|
||||
private JTextField fontStyleTextField = null;
|
||||
private JTextField fontSizeTextField = null;
|
||||
private JList fontNameList = null;
|
||||
private JList fontStyleList = null;
|
||||
private JList fontSizeList = null;
|
||||
private JPanel fontNamePanel = null;
|
||||
private JPanel fontStylePanel = null;
|
||||
private JPanel fontSizePanel = null;
|
||||
private JPanel samplePanel = null;
|
||||
private JTextField sampleText = null;
|
||||
|
||||
/**
|
||||
* Constructs a <code>JFontChooser</code> object.
|
||||
**/
|
||||
public JFontChooser() {
|
||||
this(DEFAULT_FONT_SIZE_STRINGS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a <code>JFontChooser</code> object using the given font size
|
||||
* array.
|
||||
*
|
||||
* @param fontSizeStrings
|
||||
* the array of font size string.
|
||||
**/
|
||||
public JFontChooser(String[] fontSizeStrings) {
|
||||
if (fontSizeStrings == null) {
|
||||
fontSizeStrings = DEFAULT_FONT_SIZE_STRINGS;
|
||||
}
|
||||
this.fontSizeStrings = fontSizeStrings;
|
||||
|
||||
JPanel selectPanel = new JPanel();
|
||||
selectPanel.setLayout(new BoxLayout(selectPanel, BoxLayout.X_AXIS));
|
||||
selectPanel.add(getFontFamilyPanel());
|
||||
selectPanel.add(getFontStylePanel());
|
||||
selectPanel.add(getFontSizePanel());
|
||||
|
||||
JPanel contentsPanel = new JPanel();
|
||||
contentsPanel.setLayout(new GridLayout(2, 1));
|
||||
contentsPanel.add(selectPanel, BorderLayout.NORTH);
|
||||
contentsPanel.add(getSamplePanel(), BorderLayout.CENTER);
|
||||
|
||||
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
|
||||
this.add(contentsPanel);
|
||||
this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
|
||||
this.setSelectedFont(DEFAULT_SELECTED_FONT);
|
||||
}
|
||||
|
||||
public JTextField getFontFamilyTextField() {
|
||||
if (fontFamilyTextField == null) {
|
||||
fontFamilyTextField = new JTextField();
|
||||
fontFamilyTextField.addFocusListener(new TextFieldFocusHandlerForTextSelection(fontFamilyTextField));
|
||||
fontFamilyTextField.addKeyListener(new TextFieldKeyHandlerForListSelectionUpDown(getFontFamilyList()));
|
||||
fontFamilyTextField.getDocument()
|
||||
.addDocumentListener(new ListSearchTextFieldDocumentHandler(getFontFamilyList()));
|
||||
fontFamilyTextField.setFont(DEFAULT_FONT);
|
||||
|
||||
}
|
||||
return fontFamilyTextField;
|
||||
}
|
||||
|
||||
public JTextField getFontStyleTextField() {
|
||||
if (fontStyleTextField == null) {
|
||||
fontStyleTextField = new JTextField();
|
||||
fontStyleTextField.addFocusListener(new TextFieldFocusHandlerForTextSelection(fontStyleTextField));
|
||||
fontStyleTextField.addKeyListener(new TextFieldKeyHandlerForListSelectionUpDown(getFontStyleList()));
|
||||
fontStyleTextField.getDocument()
|
||||
.addDocumentListener(new ListSearchTextFieldDocumentHandler(getFontStyleList()));
|
||||
fontStyleTextField.setFont(DEFAULT_FONT);
|
||||
}
|
||||
return fontStyleTextField;
|
||||
}
|
||||
|
||||
public JTextField getFontSizeTextField() {
|
||||
if (fontSizeTextField == null) {
|
||||
fontSizeTextField = new JTextField();
|
||||
fontSizeTextField.addFocusListener(new TextFieldFocusHandlerForTextSelection(fontSizeTextField));
|
||||
fontSizeTextField.addKeyListener(new TextFieldKeyHandlerForListSelectionUpDown(getFontSizeList()));
|
||||
fontSizeTextField.getDocument()
|
||||
.addDocumentListener(new ListSearchTextFieldDocumentHandler(getFontSizeList()));
|
||||
fontSizeTextField.setFont(DEFAULT_FONT);
|
||||
}
|
||||
return fontSizeTextField;
|
||||
}
|
||||
|
||||
public JList getFontFamilyList() {
|
||||
if (fontNameList == null) {
|
||||
fontNameList = new JList(getFontFamilies());
|
||||
fontNameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
fontNameList.addListSelectionListener(new ListSelectionHandler(getFontFamilyTextField()));
|
||||
fontNameList.setSelectedIndex(0);
|
||||
fontNameList.setFont(DEFAULT_FONT);
|
||||
fontNameList.setFocusable(false);
|
||||
}
|
||||
return fontNameList;
|
||||
}
|
||||
|
||||
public JList getFontStyleList() {
|
||||
if (fontStyleList == null) {
|
||||
fontStyleList = new JList(getFontStyleNames());
|
||||
fontStyleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
fontStyleList.addListSelectionListener(new ListSelectionHandler(getFontStyleTextField()));
|
||||
fontStyleList.setSelectedIndex(0);
|
||||
fontStyleList.setFont(DEFAULT_FONT);
|
||||
fontStyleList.setFocusable(false);
|
||||
}
|
||||
return fontStyleList;
|
||||
}
|
||||
|
||||
public JList getFontSizeList() {
|
||||
if (fontSizeList == null) {
|
||||
fontSizeList = new JList(this.fontSizeStrings);
|
||||
fontSizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
||||
fontSizeList.addListSelectionListener(new ListSelectionHandler(getFontSizeTextField()));
|
||||
fontSizeList.setSelectedIndex(0);
|
||||
fontSizeList.setFont(DEFAULT_FONT);
|
||||
fontSizeList.setFocusable(false);
|
||||
}
|
||||
return fontSizeList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the family name of the selected font.
|
||||
*
|
||||
* @return the font family of the selected font.
|
||||
*
|
||||
* @see #setSelectedFontFamily
|
||||
**/
|
||||
public String getSelectedFontFamily() {
|
||||
String fontName = (String) getFontFamilyList().getSelectedValue();
|
||||
return fontName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the style of the selected font.
|
||||
*
|
||||
* @return the style of the selected font. <code>Font.PLAIN</code>,
|
||||
* <code>Font.BOLD</code>, <code>Font.ITALIC</code>,
|
||||
* <code>Font.BOLD|Font.ITALIC</code>
|
||||
*
|
||||
* @see java.awt.Font#PLAIN
|
||||
* @see java.awt.Font#BOLD
|
||||
* @see java.awt.Font#ITALIC
|
||||
* @see #setSelectedFontStyle
|
||||
**/
|
||||
public int getSelectedFontStyle() {
|
||||
int index = getFontStyleList().getSelectedIndex();
|
||||
return FONT_STYLE_CODES[index];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the size of the selected font.
|
||||
*
|
||||
* @return the size of the selected font
|
||||
*
|
||||
* @see #setSelectedFontSize
|
||||
**/
|
||||
public int getSelectedFontSize() {
|
||||
int fontSize = 1;
|
||||
String fontSizeString = getFontSizeTextField().getText();
|
||||
while (true) {
|
||||
try {
|
||||
fontSize = Integer.parseInt(fontSizeString);
|
||||
break;
|
||||
} catch (NumberFormatException e) {
|
||||
fontSizeString = (String) getFontSizeList().getSelectedValue();
|
||||
getFontSizeTextField().setText(fontSizeString);
|
||||
}
|
||||
}
|
||||
|
||||
return fontSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the selected font.
|
||||
*
|
||||
* @return the selected font
|
||||
*
|
||||
* @see #setSelectedFont
|
||||
* @see java.awt.Font
|
||||
**/
|
||||
public Font getSelectedFont() {
|
||||
Font font = new Font(getSelectedFontFamily(), getSelectedFontStyle(), getSelectedFontSize());
|
||||
return font;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the family name of the selected font.
|
||||
*
|
||||
* @param name
|
||||
* the family name of the selected font.
|
||||
*
|
||||
* @see getSelectedFontFamily
|
||||
**/
|
||||
public void setSelectedFontFamily(String name) {
|
||||
String[] names = getFontFamilies();
|
||||
for (int i = 0; i < names.length; i++) {
|
||||
if (names[i].toLowerCase().equals(name.toLowerCase())) {
|
||||
getFontFamilyList().setSelectedIndex(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
updateSampleFont();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the style of the selected font.
|
||||
*
|
||||
* @param style
|
||||
* the size of the selected font. <code>Font.PLAIN</code>,
|
||||
* <code>Font.BOLD</code>, <code>Font.ITALIC</code>, or
|
||||
* <code>Font.BOLD|Font.ITALIC</code>.
|
||||
*
|
||||
* @see java.awt.Font#PLAIN
|
||||
* @see java.awt.Font#BOLD
|
||||
* @see java.awt.Font#ITALIC
|
||||
* @see #getSelectedFontStyle
|
||||
**/
|
||||
public void setSelectedFontStyle(int style) {
|
||||
for (int i = 0; i < FONT_STYLE_CODES.length; i++) {
|
||||
if (FONT_STYLE_CODES[i] == style) {
|
||||
getFontStyleList().setSelectedIndex(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
updateSampleFont();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the size of the selected font.
|
||||
*
|
||||
* @param size
|
||||
* the size of the selected font
|
||||
*
|
||||
* @see #getSelectedFontSize
|
||||
**/
|
||||
public void setSelectedFontSize(int size) {
|
||||
String sizeString = String.valueOf(size);
|
||||
for (int i = 0; i < this.fontSizeStrings.length; i++) {
|
||||
if (this.fontSizeStrings[i].equals(sizeString)) {
|
||||
getFontSizeList().setSelectedIndex(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
getFontSizeTextField().setText(sizeString);
|
||||
updateSampleFont();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the selected font.
|
||||
*
|
||||
* @param font
|
||||
* the selected font
|
||||
*
|
||||
* @see #getSelectedFont
|
||||
* @see java.awt.Font
|
||||
**/
|
||||
public void setSelectedFont(Font font) {
|
||||
setSelectedFontFamily(font.getFamily());
|
||||
setSelectedFontStyle(font.getStyle());
|
||||
setSelectedFontSize(font.getSize());
|
||||
}
|
||||
|
||||
public String getVersionString() {
|
||||
return ("Version");
|
||||
}
|
||||
|
||||
/**
|
||||
* Show font selection dialog.
|
||||
*
|
||||
* @param parent
|
||||
* Dialog's Parent component.
|
||||
* @return OK_OPTION, CANCEL_OPTION or ERROR_OPTION
|
||||
*
|
||||
* @see #OK_OPTION
|
||||
* @see #CANCEL_OPTION
|
||||
* @see #ERROR_OPTION
|
||||
**/
|
||||
public int showDialog(Component parent) {
|
||||
dialogResultValue = ERROR_OPTION;
|
||||
JDialog dialog = createDialog(parent);
|
||||
dialog.addWindowListener(new WindowAdapter() {
|
||||
public void windowClosing(WindowEvent e) {
|
||||
dialogResultValue = CANCEL_OPTION;
|
||||
}
|
||||
});
|
||||
|
||||
dialog.setVisible(true);
|
||||
dialog.dispose();
|
||||
dialog = null;
|
||||
|
||||
return dialogResultValue;
|
||||
}
|
||||
|
||||
protected class ListSelectionHandler implements ListSelectionListener {
|
||||
private JTextComponent textComponent;
|
||||
|
||||
ListSelectionHandler(JTextComponent textComponent) {
|
||||
this.textComponent = textComponent;
|
||||
}
|
||||
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
if (e.getValueIsAdjusting() == false) {
|
||||
JList list = (JList) e.getSource();
|
||||
String selectedValue = (String) list.getSelectedValue();
|
||||
|
||||
String oldValue = textComponent.getText();
|
||||
textComponent.setText(selectedValue);
|
||||
if (!oldValue.equalsIgnoreCase(selectedValue)) {
|
||||
textComponent.selectAll();
|
||||
textComponent.requestFocus();
|
||||
}
|
||||
|
||||
updateSampleFont();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected class TextFieldFocusHandlerForTextSelection extends FocusAdapter {
|
||||
private JTextComponent textComponent;
|
||||
|
||||
public TextFieldFocusHandlerForTextSelection(JTextComponent textComponent) {
|
||||
this.textComponent = textComponent;
|
||||
}
|
||||
|
||||
public void focusGained(FocusEvent e) {
|
||||
textComponent.selectAll();
|
||||
}
|
||||
|
||||
public void focusLost(FocusEvent e) {
|
||||
textComponent.select(0, 0);
|
||||
updateSampleFont();
|
||||
}
|
||||
}
|
||||
|
||||
protected class TextFieldKeyHandlerForListSelectionUpDown extends KeyAdapter {
|
||||
private JList targetList;
|
||||
|
||||
public TextFieldKeyHandlerForListSelectionUpDown(JList list) {
|
||||
this.targetList = list;
|
||||
}
|
||||
|
||||
public void keyPressed(KeyEvent e) {
|
||||
int i = targetList.getSelectedIndex();
|
||||
switch (e.getKeyCode()) {
|
||||
case KeyEvent.VK_UP:
|
||||
i = targetList.getSelectedIndex() - 1;
|
||||
if (i < 0) {
|
||||
i = 0;
|
||||
}
|
||||
targetList.setSelectedIndex(i);
|
||||
break;
|
||||
case KeyEvent.VK_DOWN:
|
||||
int listSize = targetList.getModel().getSize();
|
||||
i = targetList.getSelectedIndex() + 1;
|
||||
if (i >= listSize) {
|
||||
i = listSize - 1;
|
||||
}
|
||||
targetList.setSelectedIndex(i);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected class ListSearchTextFieldDocumentHandler implements DocumentListener {
|
||||
JList targetList;
|
||||
|
||||
public ListSearchTextFieldDocumentHandler(JList targetList) {
|
||||
this.targetList = targetList;
|
||||
}
|
||||
|
||||
public void insertUpdate(DocumentEvent e) {
|
||||
update(e);
|
||||
}
|
||||
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
update(e);
|
||||
}
|
||||
|
||||
public void changedUpdate(DocumentEvent e) {
|
||||
update(e);
|
||||
}
|
||||
|
||||
private void update(DocumentEvent event) {
|
||||
String newValue = "";
|
||||
try {
|
||||
Document doc = event.getDocument();
|
||||
newValue = doc.getText(0, doc.getLength());
|
||||
} catch (BadLocationException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
if (newValue.length() > 0) {
|
||||
int index = targetList.getNextMatch(newValue, 0, Position.Bias.Forward);
|
||||
if (index < 0) {
|
||||
index = 0;
|
||||
}
|
||||
targetList.ensureIndexIsVisible(index);
|
||||
|
||||
String matchedName = targetList.getModel().getElementAt(index).toString();
|
||||
if (newValue.equalsIgnoreCase(matchedName)) {
|
||||
if (index != targetList.getSelectedIndex()) {
|
||||
SwingUtilities.invokeLater(new ListSelector(index));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ListSelector implements Runnable {
|
||||
private int index;
|
||||
|
||||
public ListSelector(int index) {
|
||||
this.index = index;
|
||||
}
|
||||
|
||||
public void run() {
|
||||
targetList.setSelectedIndex(this.index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected class DialogOKAction extends AbstractAction {
|
||||
protected static final String ACTION_NAME = "OK";
|
||||
private JDialog dialog;
|
||||
|
||||
protected DialogOKAction(JDialog dialog) {
|
||||
this.dialog = dialog;
|
||||
putValue(Action.DEFAULT, ACTION_NAME);
|
||||
putValue(Action.ACTION_COMMAND_KEY, ACTION_NAME);
|
||||
putValue(Action.NAME, (ACTION_NAME));
|
||||
}
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
dialogResultValue = OK_OPTION;
|
||||
dialog.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
protected class DialogCancelAction extends AbstractAction {
|
||||
protected static final String ACTION_NAME = "Cancel";
|
||||
private JDialog dialog;
|
||||
|
||||
protected DialogCancelAction(JDialog dialog) {
|
||||
this.dialog = dialog;
|
||||
putValue(Action.DEFAULT, ACTION_NAME);
|
||||
putValue(Action.ACTION_COMMAND_KEY, ACTION_NAME);
|
||||
putValue(Action.NAME, (ACTION_NAME));
|
||||
}
|
||||
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
dialogResultValue = CANCEL_OPTION;
|
||||
dialog.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
protected JDialog createDialog(Component parent) {
|
||||
Frame frame = parent instanceof Frame ? (Frame) parent
|
||||
: (Frame) SwingUtilities.getAncestorOfClass(Frame.class, parent);
|
||||
JDialog dialog = new JDialog(frame, ("Select Font"), true);
|
||||
|
||||
Action okAction = new DialogOKAction(dialog);
|
||||
Action cancelAction = new DialogCancelAction(dialog);
|
||||
|
||||
JButton okButton = new JButton(okAction);
|
||||
okButton.setFont(DEFAULT_FONT);
|
||||
JButton cancelButton = new JButton(cancelAction);
|
||||
cancelButton.setFont(DEFAULT_FONT);
|
||||
|
||||
JPanel buttonsPanel = new JPanel();
|
||||
buttonsPanel.setLayout(new GridLayout(2, 1));
|
||||
buttonsPanel.add(okButton);
|
||||
buttonsPanel.add(cancelButton);
|
||||
buttonsPanel.setBorder(BorderFactory.createEmptyBorder(25, 0, 10, 10));
|
||||
|
||||
ActionMap actionMap = buttonsPanel.getActionMap();
|
||||
actionMap.put(cancelAction.getValue(Action.DEFAULT), cancelAction);
|
||||
actionMap.put(okAction.getValue(Action.DEFAULT), okAction);
|
||||
InputMap inputMap = buttonsPanel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
|
||||
inputMap.put(KeyStroke.getKeyStroke("ESCAPE"), cancelAction.getValue(Action.DEFAULT));
|
||||
inputMap.put(KeyStroke.getKeyStroke("ENTER"), okAction.getValue(Action.DEFAULT));
|
||||
|
||||
JPanel dialogEastPanel = new JPanel();
|
||||
dialogEastPanel.setLayout(new BorderLayout());
|
||||
dialogEastPanel.add(buttonsPanel, BorderLayout.NORTH);
|
||||
|
||||
dialog.getContentPane().add(this, BorderLayout.CENTER);
|
||||
dialog.getContentPane().add(dialogEastPanel, BorderLayout.EAST);
|
||||
dialog.pack();
|
||||
dialog.setLocationRelativeTo(frame);
|
||||
return dialog;
|
||||
}
|
||||
|
||||
protected void updateSampleFont() {
|
||||
Font font = getSelectedFont();
|
||||
getSampleTextField().setFont(font);
|
||||
}
|
||||
|
||||
protected JPanel getFontFamilyPanel() {
|
||||
if (fontNamePanel == null) {
|
||||
fontNamePanel = new JPanel();
|
||||
fontNamePanel.setLayout(new BorderLayout());
|
||||
fontNamePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
|
||||
fontNamePanel.setPreferredSize(new Dimension(180, 130));
|
||||
|
||||
JScrollPane scrollPane = new JScrollPane(getFontFamilyList());
|
||||
scrollPane.getVerticalScrollBar().setFocusable(false);
|
||||
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
||||
|
||||
JPanel p = new JPanel();
|
||||
p.setLayout(new BorderLayout());
|
||||
p.add(getFontFamilyTextField(), BorderLayout.NORTH);
|
||||
p.add(scrollPane, BorderLayout.CENTER);
|
||||
|
||||
JLabel label = new JLabel(("Font Name"));
|
||||
label.setHorizontalAlignment(JLabel.LEFT);
|
||||
label.setHorizontalTextPosition(JLabel.LEFT);
|
||||
label.setLabelFor(getFontFamilyTextField());
|
||||
label.setDisplayedMnemonic('F');
|
||||
|
||||
fontNamePanel.add(label, BorderLayout.NORTH);
|
||||
fontNamePanel.add(p, BorderLayout.CENTER);
|
||||
|
||||
}
|
||||
return fontNamePanel;
|
||||
}
|
||||
|
||||
protected JPanel getFontStylePanel() {
|
||||
if (fontStylePanel == null) {
|
||||
fontStylePanel = new JPanel();
|
||||
fontStylePanel.setLayout(new BorderLayout());
|
||||
fontStylePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
|
||||
fontStylePanel.setPreferredSize(new Dimension(140, 130));
|
||||
|
||||
JScrollPane scrollPane = new JScrollPane(getFontStyleList());
|
||||
scrollPane.getVerticalScrollBar().setFocusable(false);
|
||||
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
||||
|
||||
JPanel p = new JPanel();
|
||||
p.setLayout(new BorderLayout());
|
||||
p.add(getFontStyleTextField(), BorderLayout.NORTH);
|
||||
p.add(scrollPane, BorderLayout.CENTER);
|
||||
|
||||
JLabel label = new JLabel(("Font Style"));
|
||||
label.setHorizontalAlignment(JLabel.LEFT);
|
||||
label.setHorizontalTextPosition(JLabel.LEFT);
|
||||
label.setLabelFor(getFontStyleTextField());
|
||||
label.setDisplayedMnemonic('Y');
|
||||
|
||||
fontStylePanel.add(label, BorderLayout.NORTH);
|
||||
fontStylePanel.add(p, BorderLayout.CENTER);
|
||||
}
|
||||
return fontStylePanel;
|
||||
}
|
||||
|
||||
protected JPanel getFontSizePanel() {
|
||||
if (fontSizePanel == null) {
|
||||
fontSizePanel = new JPanel();
|
||||
fontSizePanel.setLayout(new BorderLayout());
|
||||
fontSizePanel.setPreferredSize(new Dimension(70, 130));
|
||||
fontSizePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
|
||||
|
||||
JScrollPane scrollPane = new JScrollPane(getFontSizeList());
|
||||
scrollPane.getVerticalScrollBar().setFocusable(false);
|
||||
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
||||
|
||||
JPanel p = new JPanel();
|
||||
p.setLayout(new BorderLayout());
|
||||
p.add(getFontSizeTextField(), BorderLayout.NORTH);
|
||||
p.add(scrollPane, BorderLayout.CENTER);
|
||||
|
||||
JLabel label = new JLabel(("Font Size"));
|
||||
label.setHorizontalAlignment(JLabel.LEFT);
|
||||
label.setHorizontalTextPosition(JLabel.LEFT);
|
||||
label.setLabelFor(getFontSizeTextField());
|
||||
label.setDisplayedMnemonic('S');
|
||||
|
||||
fontSizePanel.add(label, BorderLayout.NORTH);
|
||||
fontSizePanel.add(p, BorderLayout.CENTER);
|
||||
}
|
||||
return fontSizePanel;
|
||||
}
|
||||
|
||||
protected JPanel getSamplePanel() {
|
||||
if (samplePanel == null) {
|
||||
Border titledBorder = BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), ("Sample"));
|
||||
Border empty = BorderFactory.createEmptyBorder(5, 10, 10, 10);
|
||||
Border border = BorderFactory.createCompoundBorder(titledBorder, empty);
|
||||
|
||||
samplePanel = new JPanel();
|
||||
samplePanel.setLayout(new BorderLayout());
|
||||
samplePanel.setBorder(border);
|
||||
|
||||
samplePanel.add(getSampleTextField(), BorderLayout.CENTER);
|
||||
}
|
||||
return samplePanel;
|
||||
}
|
||||
|
||||
protected JTextField getSampleTextField() {
|
||||
if (sampleText == null) {
|
||||
Border lowered = BorderFactory.createLoweredBevelBorder();
|
||||
|
||||
sampleText = new JTextField(("AaBbYyZz"));
|
||||
sampleText.setBorder(lowered);
|
||||
sampleText.setPreferredSize(new Dimension(300, 100));
|
||||
}
|
||||
return sampleText;
|
||||
}
|
||||
|
||||
protected String[] getFontFamilies() {
|
||||
if (fontFamilyNames == null) {
|
||||
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
|
||||
fontFamilyNames = env.getAvailableFontFamilyNames();
|
||||
}
|
||||
return fontFamilyNames;
|
||||
}
|
||||
|
||||
protected String[] getFontStyleNames() {
|
||||
if (fontStyleNames == null) {
|
||||
int i = 0;
|
||||
fontStyleNames = new String[4];
|
||||
fontStyleNames[i++] = ("Plain");
|
||||
fontStyleNames[i++] = ("Bold");
|
||||
fontStyleNames[i++] = ("Italic");
|
||||
fontStyleNames[i++] = ("BoldItalic");
|
||||
}
|
||||
return fontStyleNames;
|
||||
}
|
||||
}
|
@ -1,22 +1,34 @@
|
||||
package us.deathmarine.luyten;
|
||||
|
||||
import java.awt.Cursor;
|
||||
import java.awt.Font;
|
||||
import java.awt.Panel;
|
||||
import java.awt.PopupMenu;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.AdjustmentEvent;
|
||||
import java.awt.event.AdjustmentListener;
|
||||
import java.awt.event.InputEvent;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.event.MouseMotionAdapter;
|
||||
import java.awt.event.MouseWheelEvent;
|
||||
import java.awt.event.MouseWheelListener;
|
||||
import java.io.StringWriter;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import javax.swing.JDialog;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JMenuItem;
|
||||
import javax.swing.JPopupMenu;
|
||||
import javax.swing.JScrollBar;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.ScrollPaneConstants;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.event.HyperlinkEvent;
|
||||
@ -26,6 +38,7 @@ import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
|
||||
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
|
||||
import org.fife.ui.rsyntaxtextarea.Theme;
|
||||
import org.fife.ui.rtextarea.RTextScrollPane;
|
||||
|
||||
import com.strobel.assembler.metadata.MetadataSystem;
|
||||
import com.strobel.assembler.metadata.TypeDefinition;
|
||||
import com.strobel.decompiler.DecompilationOptions;
|
||||
@ -67,7 +80,7 @@ public class OpenFile implements SyntaxConstants {
|
||||
private DecompilationOptions decompilationOptions;
|
||||
private TypeDefinition type;
|
||||
|
||||
public OpenFile(String name, String path, Theme theme, MainWindow mainWindow) {
|
||||
public OpenFile(String name, String path, Theme theme, final MainWindow mainWindow) {
|
||||
this.name = name;
|
||||
this.path = path;
|
||||
this.mainWindow = mainWindow;
|
||||
@ -128,8 +141,27 @@ public class OpenFile implements SyntaxConstants {
|
||||
else
|
||||
textArea.setSyntaxEditingStyle(SYNTAX_STYLE_PROPERTIES_FILE);
|
||||
scrollPane = new RTextScrollPane(textArea, true);
|
||||
|
||||
scrollPane.setIconRowHeaderEnabled(true);
|
||||
textArea.setText("");
|
||||
|
||||
//Edit RTextArea's PopupMenu
|
||||
JPopupMenu pop = textArea.getPopupMenu();
|
||||
pop.addSeparator();
|
||||
JMenuItem item = new JMenuItem("Font");
|
||||
item.addActionListener(new ActionListener() {
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
JFontChooser fontChooser = new JFontChooser();
|
||||
fontChooser.setSelectedFont(textArea.getFont());
|
||||
int result = fontChooser.showDialog(mainWindow);
|
||||
if (result == JFontChooser.OK_OPTION)
|
||||
textArea.setFont(fontChooser.getSelectedFont());
|
||||
}
|
||||
});
|
||||
pop.add(item);
|
||||
textArea.setPopupMenu(pop);
|
||||
|
||||
theme.apply(textArea);
|
||||
|
||||
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
|
||||
@ -179,6 +211,23 @@ public class OpenFile implements SyntaxConstants {
|
||||
}
|
||||
});
|
||||
|
||||
//Add Ctrl+Wheel Zoom for Text Size
|
||||
scrollPane.addMouseWheelListener(new MouseWheelListener(){
|
||||
@Override
|
||||
public void mouseWheelMoved(MouseWheelEvent e) {
|
||||
if ((e.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) != 0){
|
||||
Font font = textArea.getFont();
|
||||
int size = font.getSize();
|
||||
if(e.getWheelRotation() > 0){ //Down
|
||||
textArea.setFont(new Font(font.getName(), font.getStyle(), ++size));
|
||||
}else{
|
||||
textArea.setFont(new Font(font.getName(), font.getStyle(), --size >= 2 ? --size : 2));
|
||||
}
|
||||
}
|
||||
e.consume();
|
||||
}
|
||||
});
|
||||
|
||||
textArea.addMouseMotionListener(new MouseMotionAdapter() {
|
||||
private boolean isLinkLabelPrev = false;
|
||||
private String prevLinkText = null;
|
||||
|
Loading…
Reference in New Issue
Block a user