/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved. * Copyright (C) 2011-2016 Brian P. Hinz * * This 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; either version 2 of the License, or * (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this software; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ // // This Dialog class implements a pop-up dialog. This is needed because // apparently you can't use the standard AWT Dialog from within an applet. The // dialog can be made visible by calling its showDialog() method. Dialogs can // be modal or non-modal. For a modal dialog box, the showDialog() method must // be called from a thread other than the GUI thread, and it only returns when // the dialog box has been dismissed. For a non-modal dialog box, the // showDialog() method returns immediately. package com.tigervnc.vncviewer; import java.awt.*; import java.awt.Dialog.*; import java.awt.event.*; import java.io.File; import javax.swing.*; import javax.swing.border.*; import javax.swing.filechooser.*; import javax.swing.text.*; class Dialog extends JDialog implements ActionListener, ItemListener, KeyListener { // GridBag weights static double HEAVY = 1.0; static double LIGHT = 0.0; public Dialog(boolean modal) { setIconImage(VncViewer.frameIcon); if (modal) { setModalityType(ModalityType.APPLICATION_MODAL); } else { setModalityType(ModalityType.MODELESS); } } public void showDialog(Component c) { initDialog(); if (c != null) { setLocationRelativeTo(c); } else { Dimension dpySize = getToolkit().getScreenSize(); Dimension mySize = getSize(); int x = (dpySize.width - mySize.width) / 2; int y = (dpySize.height - mySize.height) / 2; setLocation(x, y); } if (getModalityType() == ModalityType.APPLICATION_MODAL) setAlwaysOnTop(true); setVisible(true); } public void showDialog() { showDialog(null); } public void endDialog() { setVisible(false); setAlwaysOnTop(false); } // initDialog() can be overridden in a derived class. Typically it is used // to make sure that checkboxes have the right state, etc. public void initDialog() { } public void actionPerformed(ActionEvent e) { } public void itemStateChanged(ItemEvent e) { } public void keyTyped(KeyEvent event) { } public void keyReleased(KeyEvent event) { } public void keyPressed(KeyEvent event) { } protected void addListeners(Container c) { for (Component ch : c.getComponents()) { if (ch instanceof JCheckBox) ((JCheckBox)ch).addItemListener(this); else if (ch instanceof JRadioButton) ((JRadioButton)ch).addActionListener(this); else if (ch instanceof JButton) ((JButton)ch).addActionListener(this); else if (ch instanceof JComboBox) ((JComboBox)ch).addActionListener(this); else if (ch instanceof JTextField) ((JTextField)ch).addKeyListener(this); else if (ch instanceof Container) addListeners((Container)ch); } } public int getButtonLabelInset(AbstractButton b) { // Aligning components vertically to the label of // a JCheckbox is absurdly difficult. JCheckBox's // getIcon() method generally returns null, so we // have to resort to querying the UIManager in // order to determine the width of the checkbox. // The default values are based on Nimbus. int width = 18; int gap = 4; Icon ico = b.getIcon(); if (ico == null) { if (b instanceof JCheckBox) ico = (Icon)UIManager.get("CheckBox.icon"); else if (b instanceof JRadioButton) ico = (Icon)UIManager.get("RadioButton.icon"); } if (ico != null) width = Math.max(width, ico.getIconWidth()); if (b != null) gap = Math.max(gap, b.getIconTextGap()); return width + gap; } public static File showChooser(String title, File defFile, Container c, FileNameExtensionFilter f) { JFileChooser fc = new JFileChooser(defFile); fc.setDialogTitle(title); fc.setApproveButtonText("OK \u21B5"); fc.setFileHidingEnabled(false); if (f != null) fc.setFileFilter(f); if (fc.showOpenDialog(c) == JFileChooser.APPROVE_OPTION) return fc.getSelectedFile(); else return null; } public static File showChooser(String title, File defFile, Container c) { return showChooser(title, defFile, c, null); } protected File showChooser(String title, File defFile, FileNameExtensionFilter f) { return showChooser(title, defFile, this, f); } protected File showChooser(String title, File defFile) { return showChooser(title, defFile, this); } protected class GroupedJRadioButton extends JRadioButton { public GroupedJRadioButton(String l, ButtonGroup g, JComponent c) { super(l); c.add(this); if (g != null) g.add(this); } } protected class MyJComboBox extends JComboBox { public MyJComboBox(Object[] items) { super(items); // Hack to set the left inset on editable JComboBox if (UIManager.getLookAndFeel().getID().equals("Windows")) { this.setBorder(BorderFactory.createCompoundBorder(this.getBorder(), BorderFactory.createEmptyBorder(0,1,0,0))); } else if (UIManager.getLookAndFeel().getID().equals("Metal")) { ComboBoxEditor editor = this.getEditor(); JTextField jtf = (JTextField)editor.getEditorComponent(); jtf.setBorder(new CompoundBorder(jtf.getBorder(), new EmptyBorder(0,2,0,0))); } } public MyJComboBox() { new MyJComboBox(null); } @Override public void setPrototypeDisplayValue(Object prototypeDisplayValue) { // Even with setPrototypeDisplayValue set JComboxBox resizes // itself when setEditable(true) is called. super.setPrototypeDisplayValue(prototypeDisplayValue); boolean e = isEditable(); setEditable(false); Dimension d = getPreferredSize(); setPreferredSize(d); setEditable(e); } public void setDocument(PlainDocument doc) { ComboBoxEditor editor = this.getEditor(); JTextField jtf = (JTextField)editor.getEditorComponent(); jtf.setDocument(doc); } } private Window fullScreenWindow; }