blob: 0c67305ad2b8c2b775ad811043d934d8a2aed440 [file] [log] [blame]
/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
* Copyright (C) 2011-2014 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.
*/
package com.tigervnc.vncviewer;
import java.awt.*;
import java.awt.Cursor;
import java.awt.event.*;
import java.io.File;
import javax.swing.filechooser.*;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JFileChooser;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import com.tigervnc.rfb.*;
import static com.tigervnc.vncviewer.Parameters.*;
public class F8Menu extends JPopupMenu implements ActionListener {
public F8Menu(CConn cc) {
super("VNC Menu");
setLightWeightPopupEnabled(false);
String os = System.getProperty("os.name");
if (os.startsWith("Windows"))
com.sun.java.swing.plaf.windows.WindowsLookAndFeel.setMnemonicHidden(false);
this.cc = cc;
restore = addMenuItem("Restore",KeyEvent.VK_R);
restore.setEnabled(!embed.getValue());
move = addMenuItem("Move");
move.setEnabled(false);
size = addMenuItem("Size");
size.setEnabled(false);
minimize = addMenuItem("Minimize", KeyEvent.VK_N);
minimize.setEnabled(!embed.getValue());
maximize = addMenuItem("Maximize", KeyEvent.VK_X);
maximize.setEnabled(!embed.getValue());
addSeparator();
exit = addMenuItem("Close Viewer", KeyEvent.VK_C);
addSeparator();
fullScreenCheckbox = new JCheckBoxMenuItem("Full Screen");
fullScreenCheckbox.setMnemonic(KeyEvent.VK_F);
fullScreenCheckbox.setSelected(fullScreen.getValue());
fullScreenCheckbox.addActionListener(this);
fullScreenCheckbox.setEnabled(!embed.getValue());
add(fullScreenCheckbox);
addSeparator();
clipboard = addMenuItem("Clipboard...");
addSeparator();
int keyCode = MenuKey.getMenuKeyCode();
String keyText = KeyEvent.getKeyText(keyCode);
f8 = addMenuItem("Send "+keyText, keyCode);
ctrlAltDel = addMenuItem("Send Ctrl-Alt-Del");
addSeparator();
refresh = addMenuItem("Refresh Screen", KeyEvent.VK_H);
addSeparator();
newConn = addMenuItem("New connection...", KeyEvent.VK_W);
newConn.setEnabled(!embed.getValue());
options = addMenuItem("Options...", KeyEvent.VK_O);
save = addMenuItem("Save connection info as...", KeyEvent.VK_S);
info = addMenuItem("Connection info...", KeyEvent.VK_I);
about = addMenuItem("About VncViewer...", KeyEvent.VK_A);
addSeparator();
dismiss = addMenuItem("Dismiss menu");
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
JMenuItem addMenuItem(String str, int mnemonic) {
JMenuItem item = new JMenuItem(str, mnemonic);
item.addActionListener(this);
add(item);
return item;
}
JMenuItem addMenuItem(String str) {
JMenuItem item = new JMenuItem(str);
item.addActionListener(this);
add(item);
return item;
}
boolean actionMatch(ActionEvent ev, JMenuItem item) {
return ev.getActionCommand().equals(item.getActionCommand());
}
public void actionPerformed(ActionEvent ev) {
if (actionMatch(ev, exit)) {
cc.close();
} else if (actionMatch(ev, fullScreenCheckbox)) {
if (fullScreenCheckbox.isSelected())
cc.desktop.fullscreen_on();
else
cc.desktop.fullscreen_off();
} else if (actionMatch(ev, restore)) {
if (cc.desktop.fullscreen_active())
cc.desktop.fullscreen_off();
cc.desktop.setExtendedState(JFrame.NORMAL);
} else if (actionMatch(ev, minimize)) {
if (cc.desktop.fullscreen_active())
cc.desktop.fullscreen_off();
cc.desktop.setExtendedState(JFrame.ICONIFIED);
} else if (actionMatch(ev, maximize)) {
if (cc.desktop.fullscreen_active())
cc.desktop.fullscreen_off();
cc.desktop.setExtendedState(JFrame.MAXIMIZED_BOTH);
} else if (actionMatch(ev, clipboard)) {
ClipboardDialog.showDialog(cc.desktop);
} else if (actionMatch(ev, f8)) {
cc.writeKeyEvent(MenuKey.getMenuKeySym(), true);
cc.writeKeyEvent(MenuKey.getMenuKeySym(), false);
} else if (actionMatch(ev, ctrlAltDel)) {
cc.writeKeyEvent(Keysyms.Control_L, true);
cc.writeKeyEvent(Keysyms.Alt_L, true);
cc.writeKeyEvent(Keysyms.Delete, true);
cc.writeKeyEvent(Keysyms.Delete, false);
cc.writeKeyEvent(Keysyms.Alt_L, false);
cc.writeKeyEvent(Keysyms.Control_L, false);
} else if (actionMatch(ev, refresh)) {
cc.refresh();
} else if (actionMatch(ev, newConn)) {
VncViewer.newViewer();
} else if (actionMatch(ev, options)) {
OptionsDialog.showDialog(cc.desktop);
} else if (actionMatch(ev, save)) {
String title = "Save the TigerVNC configuration to file";
File dflt = new File(FileUtils.getVncHomeDir().concat("default.tigervnc"));
if (!dflt.exists() || !dflt.isFile())
dflt = new File(FileUtils.getVncHomeDir());
FileNameExtensionFilter filter =
new FileNameExtensionFilter("TigerVNC configuration (*.tigervnc)", "tigervnc");
File f = Dialog.showChooser(title, dflt, this, filter);
while (f != null && f.exists() && f.isFile()) {
String msg = f.getAbsolutePath();
msg = msg.concat(" already exists. Do you want to overwrite?");
Object[] options = {"Overwrite", "No \u21B5"};
JOptionPane op =
new JOptionPane(msg, JOptionPane.QUESTION_MESSAGE,
JOptionPane.OK_CANCEL_OPTION, null, options, options[1]);
JDialog dlg = op.createDialog(this, "TigerVNC Viewer");
dlg.setIconImage(VncViewer.frameIcon);
dlg.setAlwaysOnTop(true);
dlg.setVisible(true);
if (op.getValue() == options[0])
break;
else
f = Dialog.showChooser(title, f, this, filter);
}
if (f != null && (!f.exists() || f.canWrite()))
saveViewerParameters(f.getAbsolutePath(), vncServerName.getValue());
} else if (actionMatch(ev, info)) {
cc.showInfo();
} else if (actionMatch(ev, about)) {
VncViewer.showAbout(cc.desktop);
} else if (actionMatch(ev, dismiss)) {
firePopupMenuCanceled();
}
}
public void show(Component invoker, int x, int y) {
// lightweight components can't show in FullScreen Exclusive mode
/*
Window fsw = DesktopWindow.getFullScreenWindow();
GraphicsDevice gd = null;
if (fsw != null) {
gd = fsw.getGraphicsConfiguration().getDevice();
if (gd.isFullScreenSupported())
DesktopWindow.setFullScreenWindow(null);
}
*/
super.show(invoker, x, y);
/*
if (fsw != null && gd.isFullScreenSupported())
DesktopWindow.setFullScreenWindow(fsw);
*/
}
CConn cc;
JMenuItem restore, move, size, minimize, maximize;
JMenuItem exit, clipboard, ctrlAltDel, refresh;
JMenuItem newConn, options, save, info, about, dismiss;
static JMenuItem f8;
JCheckBoxMenuItem fullScreenCheckbox;
static LogWriter vlog = new LogWriter("F8Menu");
}