X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTFontChooserWindow.java;fp=src%2Fjexer%2FTFontChooserWindow.java;h=62eabb632d4841acd354bb5e0901a8e4ff4a8a93;hb=12b90437b5f22c2ae6e9b9b14c3b62b60f6143e5;hp=0000000000000000000000000000000000000000;hpb=b709b36e17eb8807819e51297bb398ef28ece52d;p=fanfix.git diff --git a/src/jexer/TFontChooserWindow.java b/src/jexer/TFontChooserWindow.java new file mode 100644 index 0000000..62eabb6 --- /dev/null +++ b/src/jexer/TFontChooserWindow.java @@ -0,0 +1,628 @@ +/* + * Jexer - Java Text User Interface + * + * The MIT License (MIT) + * + * Copyright (C) 2019 Kevin Lamonte + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * @author Kevin Lamonte [kevin.lamonte@gmail.com] + * @version 1 + */ +package jexer; + +import java.awt.Font; +import java.awt.GraphicsEnvironment; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.ResourceBundle; + +import jexer.backend.ECMA48Terminal; +import jexer.backend.SwingTerminal; +import jexer.bits.CellAttributes; +import jexer.bits.GraphicsChars; +import jexer.event.TKeypressEvent; +import static jexer.TKeypress.*; + +/** + * TFontChooserWindow provides an easy UI for users to alter the running + * font. + * + */ +public class TFontChooserWindow extends TWindow { + + /** + * Translated strings. + */ + private static final ResourceBundle i18n = ResourceBundle.getBundle(TFontChooserWindow.class.getName()); + + // ------------------------------------------------------------------------ + // Variables -------------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * The Swing screen. + */ + private SwingTerminal terminal = null; + + /** + * The ECMA48 screen. + */ + private ECMA48Terminal ecmaTerminal = null; + + /** + * The font name. + */ + private TComboBox fontName; + + /** + * The font size. + */ + private TField fontSize; + + /** + * The X text adjustment. + */ + private TField textAdjustX; + + /** + * The Y text adjustment. + */ + private TField textAdjustY; + + /** + * The height text adjustment. + */ + private TField textAdjustHeight; + + /** + * The width text adjustment. + */ + private TField textAdjustWidth; + + /** + * The sixel palette size. + */ + private TComboBox sixelPaletteSize; + + /** + * The original font size. + */ + private int oldFontSize = 20; + + /** + * The original font. + */ + private Font oldFont = null; + + /** + * The original text adjust X value. + */ + private int oldTextAdjustX = 0; + + /** + * The original text adjust Y value. + */ + private int oldTextAdjustY = 0; + + /** + * The original text adjust height value. + */ + private int oldTextAdjustHeight = 0; + + /** + * The original text adjust width value. + */ + private int oldTextAdjustWidth = 0; + + /** + * The original sixel palette (number of colors) value. + */ + private int oldSixelPaletteSize = 1024; + + // ------------------------------------------------------------------------ + // Constructors ----------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Public constructor. The window will be centered on screen. + * + * @param application the TApplication that manages this window + */ + public TFontChooserWindow(final TApplication application) { + + // Register with the TApplication + super(application, i18n.getString("windowTitle"), 0, 0, 60, 21, MODAL); + + // Add shortcut text + newStatusBar(i18n.getString("statusBar")); + + if (getScreen() instanceof SwingTerminal) { + terminal = (SwingTerminal) getScreen(); + } + if (getScreen() instanceof ECMA48Terminal) { + ecmaTerminal = (ECMA48Terminal) getScreen(); + } + + addLabel(i18n.getString("fontName"), 1, 1, "ttext", false); + addLabel(i18n.getString("fontSize"), 1, 2, "ttext", false); + addLabel(i18n.getString("textAdjustX"), 1, 4, "ttext", false); + addLabel(i18n.getString("textAdjustY"), 1, 5, "ttext", false); + addLabel(i18n.getString("textAdjustHeight"), 1, 6, "ttext", false); + addLabel(i18n.getString("textAdjustWidth"), 1, 7, "ttext", false); + addLabel(i18n.getString("sixelPaletteSize"), 1, 9, "ttext", false); + + int col = 21; + if (terminal == null) { + // Non-Swing case: we can't change anything + addLabel(i18n.getString("unavailable"), col, 1); + addLabel(i18n.getString("unavailable"), col, 2); + addLabel(i18n.getString("unavailable"), col, 4); + addLabel(i18n.getString("unavailable"), col, 5); + addLabel(i18n.getString("unavailable"), col, 6); + addLabel(i18n.getString("unavailable"), col, 7); + } + if (ecmaTerminal == null) { + addLabel(i18n.getString("unavailable"), col, 9); + } + if (ecmaTerminal != null) { + oldSixelPaletteSize = ecmaTerminal.getSixelPaletteSize(); + + String [] sixelSizes = { "2", "256", "512", "1024", "2048" }; + List sizes = new ArrayList(); + sizes.addAll(Arrays.asList(sixelSizes)); + sixelPaletteSize = addComboBox(col, 9, 10, sizes, 0, 6, + new TAction() { + public void DO() { + try { + ecmaTerminal.setSixelPaletteSize(Integer.parseInt( + sixelPaletteSize.getText())); + } catch (NumberFormatException e) { + // SQUASH + } + } + } + ); + sixelPaletteSize.setText(Integer.toString(oldSixelPaletteSize)); + } + + if (terminal != null) { + oldFont = terminal.getFont(); + oldFontSize = terminal.getFontSize(); + oldTextAdjustX = terminal.getTextAdjustX(); + oldTextAdjustY = terminal.getTextAdjustY(); + oldTextAdjustHeight = terminal.getTextAdjustHeight(); + oldTextAdjustWidth = terminal.getTextAdjustWidth(); + + String [] fontNames = GraphicsEnvironment. + getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); + List fonts = new ArrayList(); + fonts.add(0, i18n.getString("builtInTerminus")); + fonts.addAll(Arrays.asList(fontNames)); + fontName = addComboBox(col, 1, 25, fonts, 0, 10, + new TAction() { + public void DO() { + if (fontName.getText().equals(i18n. + getString("builtInTerminus"))) { + + terminal.setDefaultFont(); + } else { + terminal.setFont(new Font(fontName.getText(), + Font.PLAIN, terminal.getFontSize())); + fontSize.setText(Integer.toString( + terminal.getFontSize())); + textAdjustX.setText(Integer.toString( + terminal.getTextAdjustX())); + textAdjustY.setText(Integer.toString( + terminal.getTextAdjustY())); + textAdjustHeight.setText(Integer.toString( + terminal.getTextAdjustHeight())); + textAdjustWidth.setText(Integer.toString( + terminal.getTextAdjustWidth())); + } + } + } + ); + + // Font size + fontSize = addField(col, 2, 3, true, + Integer.toString(terminal.getFontSize()), + new TAction() { + public void DO() { + int currentSize = terminal.getFontSize(); + int newSize = currentSize; + try { + newSize = Integer.parseInt(fontSize.getText()); + } catch (NumberFormatException e) { + fontSize.setText(Integer.toString(currentSize)); + } + if (newSize != currentSize) { + terminal.setFontSize(newSize); + textAdjustX.setText(Integer.toString( + terminal.getTextAdjustX())); + textAdjustY.setText(Integer.toString( + terminal.getTextAdjustY())); + textAdjustHeight.setText(Integer.toString( + terminal.getTextAdjustHeight())); + textAdjustWidth.setText(Integer.toString( + terminal.getTextAdjustWidth())); + } + } + }, + null); + + addSpinner(col + 3, 2, + new TAction() { + public void DO() { + int currentSize = terminal.getFontSize(); + int newSize = currentSize; + try { + newSize = Integer.parseInt(fontSize.getText()); + newSize++; + } catch (NumberFormatException e) { + fontSize.setText(Integer.toString(currentSize)); + } + fontSize.setText(Integer.toString(newSize)); + if (newSize != currentSize) { + terminal.setFontSize(newSize); + textAdjustX.setText(Integer.toString( + terminal.getTextAdjustX())); + textAdjustY.setText(Integer.toString( + terminal.getTextAdjustY())); + textAdjustHeight.setText(Integer.toString( + terminal.getTextAdjustHeight())); + textAdjustWidth.setText(Integer.toString( + terminal.getTextAdjustWidth())); + } + } + }, + new TAction() { + public void DO() { + int currentSize = terminal.getFontSize(); + int newSize = currentSize; + try { + newSize = Integer.parseInt(fontSize.getText()); + newSize--; + } catch (NumberFormatException e) { + fontSize.setText(Integer.toString(currentSize)); + } + fontSize.setText(Integer.toString(newSize)); + if (newSize != currentSize) { + terminal.setFontSize(newSize); + textAdjustX.setText(Integer.toString( + terminal.getTextAdjustX())); + textAdjustY.setText(Integer.toString( + terminal.getTextAdjustY())); + textAdjustHeight.setText(Integer.toString( + terminal.getTextAdjustHeight())); + textAdjustWidth.setText(Integer.toString( + terminal.getTextAdjustWidth())); + } + } + } + ); + + // textAdjustX + textAdjustX = addField(col, 4, 3, true, + Integer.toString(terminal.getTextAdjustX()), + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustX(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustX.getText()); + } catch (NumberFormatException e) { + textAdjustX.setText(Integer.toString(currentAdjust)); + } + if (newAdjust != currentAdjust) { + terminal.setTextAdjustX(newAdjust); + } + } + }, + null); + + addSpinner(col + 3, 4, + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustX(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustX.getText()); + newAdjust++; + } catch (NumberFormatException e) { + textAdjustX.setText(Integer.toString(currentAdjust)); + } + textAdjustX.setText(Integer.toString(newAdjust)); + if (newAdjust != currentAdjust) { + terminal.setTextAdjustX(newAdjust); + } + } + }, + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustX(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustX.getText()); + newAdjust--; + } catch (NumberFormatException e) { + textAdjustX.setText(Integer.toString(currentAdjust)); + } + textAdjustX.setText(Integer.toString(newAdjust)); + if (newAdjust != currentAdjust) { + terminal.setTextAdjustX(newAdjust); + } + } + } + ); + + // textAdjustY + textAdjustY = addField(col, 5, 3, true, + Integer.toString(terminal.getTextAdjustY()), + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustY(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustY.getText()); + } catch (NumberFormatException e) { + textAdjustY.setText(Integer.toString(currentAdjust)); + } + if (newAdjust != currentAdjust) { + terminal.setTextAdjustY(newAdjust); + } + } + }, + null); + + addSpinner(col + 3, 5, + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustY(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustY.getText()); + newAdjust++; + } catch (NumberFormatException e) { + textAdjustY.setText(Integer.toString(currentAdjust)); + } + textAdjustY.setText(Integer.toString(newAdjust)); + if (newAdjust != currentAdjust) { + terminal.setTextAdjustY(newAdjust); + } + } + }, + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustY(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustY.getText()); + newAdjust--; + } catch (NumberFormatException e) { + textAdjustY.setText(Integer.toString(currentAdjust)); + } + textAdjustY.setText(Integer.toString(newAdjust)); + if (newAdjust != currentAdjust) { + terminal.setTextAdjustY(newAdjust); + } + } + } + ); + + // textAdjustHeight + textAdjustHeight = addField(col, 6, 3, true, + Integer.toString(terminal.getTextAdjustHeight()), + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustHeight(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustHeight.getText()); + } catch (NumberFormatException e) { + textAdjustHeight.setText(Integer.toString(currentAdjust)); + } + if (newAdjust != currentAdjust) { + terminal.setTextAdjustHeight(newAdjust); + } + } + }, + null); + + addSpinner(col + 3, 6, + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustHeight(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustHeight.getText()); + newAdjust++; + } catch (NumberFormatException e) { + textAdjustHeight.setText(Integer.toString(currentAdjust)); + } + textAdjustHeight.setText(Integer.toString(newAdjust)); + if (newAdjust != currentAdjust) { + terminal.setTextAdjustHeight(newAdjust); + } + } + }, + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustHeight(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustHeight.getText()); + newAdjust--; + } catch (NumberFormatException e) { + textAdjustHeight.setText(Integer.toString(currentAdjust)); + } + textAdjustHeight.setText(Integer.toString(newAdjust)); + if (newAdjust != currentAdjust) { + terminal.setTextAdjustHeight(newAdjust); + } + } + } + ); + + // textAdjustWidth + textAdjustWidth = addField(col, 7, 3, true, + Integer.toString(terminal.getTextAdjustWidth()), + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustWidth(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustWidth.getText()); + } catch (NumberFormatException e) { + textAdjustWidth.setText(Integer.toString(currentAdjust)); + } + if (newAdjust != currentAdjust) { + terminal.setTextAdjustWidth(newAdjust); + } + } + }, + null); + + addSpinner(col + 3, 7, + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustWidth(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustWidth.getText()); + newAdjust++; + } catch (NumberFormatException e) { + textAdjustWidth.setText(Integer.toString(currentAdjust)); + } + textAdjustWidth.setText(Integer.toString(newAdjust)); + if (newAdjust != currentAdjust) { + terminal.setTextAdjustWidth(newAdjust); + } + } + }, + new TAction() { + public void DO() { + int currentAdjust = terminal.getTextAdjustWidth(); + int newAdjust = currentAdjust; + try { + newAdjust = Integer.parseInt(textAdjustWidth.getText()); + newAdjust--; + } catch (NumberFormatException e) { + textAdjustWidth.setText(Integer.toString(currentAdjust)); + } + textAdjustWidth.setText(Integer.toString(newAdjust)); + if (newAdjust != currentAdjust) { + terminal.setTextAdjustWidth(newAdjust); + } + } + } + ); + + } + + addButton(i18n.getString("okButton"), 18, getHeight() - 4, + new TAction() { + public void DO() { + // Close window. + TFontChooserWindow.this.close(); + } + }); + + TButton cancelButton = addButton(i18n.getString("cancelButton"), + 30, getHeight() - 4, + new TAction() { + public void DO() { + // Restore old values, then close the window. + if (terminal != null) { + terminal.setFont(oldFont); + terminal.setFontSize(oldFontSize); + terminal.setTextAdjustX(oldTextAdjustX); + terminal.setTextAdjustY(oldTextAdjustY); + terminal.setTextAdjustHeight(oldTextAdjustHeight); + terminal.setTextAdjustWidth(oldTextAdjustWidth); + } + if (ecmaTerminal != null) { + ecmaTerminal.setSixelPaletteSize(oldSixelPaletteSize); + } + TFontChooserWindow.this.close(); + } + }); + + // Save this for last: make the cancel button default action. + activate(cancelButton); + + } + + // ------------------------------------------------------------------------ + // Event handlers --------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Handle keystrokes. + * + * @param keypress keystroke event + */ + @Override + public void onKeypress(final TKeypressEvent keypress) { + // Escape - behave like cancel + if (keypress.equals(kbEsc)) { + // Restore old values, then close the window. + if (terminal != null) { + terminal.setFont(oldFont); + terminal.setFontSize(oldFontSize); + } + if (ecmaTerminal != null) { + ecmaTerminal.setSixelPaletteSize(oldSixelPaletteSize); + } + getApplication().closeWindow(this); + return; + } + + // Pass to my parent + super.onKeypress(keypress); + } + + // ------------------------------------------------------------------------ + // TWindow ---------------------------------------------------------------- + // ------------------------------------------------------------------------ + + /** + * Draw me on screen. + */ + @Override + public void draw() { + super.draw(); + + int left = 34; + CellAttributes color = getTheme().getColor("ttext"); + drawBox(left, 6, left + 24, 14, color, color, 3, false); + putStringXY(left + 2, 6, i18n.getString("sample"), color); + for (int i = 7; i < 13; i++) { + hLineXY(left + 1, i, 22, GraphicsChars.HATCH, color); + } + + } + + // ------------------------------------------------------------------------ + // TFontChooserWindow ----------------------------------------------------- + // ------------------------------------------------------------------------ + +}