📄 swingshellconsole.java
字号:
/* * Copyright (c) 2001 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Sun Microsystems, Inc. for Project JXTA." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact Project JXTA at http://www.jxta.org. * * 5. Products derived from this software may not be called "JXTA", * nor may "JXTA" appear in their name, without prior written * permission of Sun. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL SUN MICROSYSTEMS OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of Project JXTA. For more * information on Project JXTA, please see * <http://www.jxta.org/>. * * This license is based on the BSD license adopted by the Apache Foundation. * * $Id: SwingShellConsole.java,v 1.8 2006/06/14 16:37:12 bondolo Exp $ */package net.jxta.impl.shell;import java.awt.Font;import java.awt.GridBagConstraints;import java.awt.GridBagLayout;import java.awt.datatransfer.Clipboard;import java.awt.datatransfer.DataFlavor;import java.awt.datatransfer.StringSelection;import java.awt.datatransfer.Transferable;import java.awt.event.InputEvent;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import java.util.ArrayList;import java.util.Collections;import java.util.List;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JViewport;import java.awt.HeadlessException;import java.awt.datatransfer.UnsupportedFlavorException;import java.io.IOException;import java.io.InterruptedIOException;import javax.swing.text.BadLocationException;import java.util.logging.Level;import java.util.logging.Logger;import net.jxta.credential.Credential;import net.jxta.membership.MembershipService;import net.jxta.peergroup.PeerGroup;import net.jxta.rendezvous.RendezVousService;import net.jxta.rendezvous.RendezvousEvent;import net.jxta.rendezvous.RendezvousListener;import net.jxta.exception.PeerGroupException;import net.jxta.impl.rendezvous.RendezVousServiceInterface;import net.jxta.impl.rendezvous.rpv.PeerView;import net.jxta.impl.rendezvous.rpv.PeerViewEvent;import net.jxta.impl.rendezvous.rpv.PeerViewListener;import net.jxta.impl.shell.bin.Shell.Shell;/** * A Swing based container for JXTA Shell sessions. **/public class SwingShellConsole extends ShellConsole { /** * Log4J Logger **/ private static final java.util.logging.Logger LOG = java.util.logging.Logger.getLogger(SwingShellConsole.class.getName());; /** * The number of consoles opened **/ private static int consoleCount = 0; /** * Lines of console input awaiting shell processing. **/ private List lines = new ArrayList(); /** * The panel in which our stuff lives. **/ private JPanel panel; /** * Is this console embedded in another application? If yes, * the Shell must ignore exit commands. */ private boolean embedded = false; /** * The frame that holds the TextArea object making up the terminal. If we * are running in a panel provided by someone else then this will not be * initialized. **/ private JFrame frame = null; /** * The TextArea object that displays the status **/ private JLabel statusStart = null; /** * The TextArea object that displays the status **/ private JLabel statusEnd = null; /** * The TextArea object that displays the data **/ private JTextArea text = null; /** * The length of the static text displayed, excludes the prompt and the * current input line. **/ private int textLength = 0; /** * Length of the prompt. **/ private int promptLength = 0; /** * Length of the current input line. **/ private int lineLength = 0; /** * Location of the insertion point within the current input line **/ private int lineInsert = 0; /** * Keeps bits for the status line. **/ private StatusKeeper statusKeeper = null; /** * Creates a new terminal window with rows row and cols columns to display. * * @param consoleName the name of the console * @param rootApp The root shell application for this console instance. * @param rows the number of rows displayed * @param cols the number of columns displayed **/ public SwingShellConsole( ShellApp rootApp, String consoleName, int rows, int cols) { this( null, rootApp, consoleName, rows, cols); } /** * Creates a new terminal window with rows row and cols columns to display. * * @param inPanel The panel in which the shell console will live. * @param rootApp The root shell application for this console instance. * @param consoleName the name of the console * @param rows the number of rows displayed * @param cols the number of columns displayed **/ public SwingShellConsole(JPanel inPanel, ShellApp rootApp, String consoleName, int rows, int cols) { super( rootApp, consoleName ); String consoleFullName; synchronized ( this.getClass() ) { consoleFullName = consoleName + " - " + (++consoleCount); } try { if (null == inPanel) { panel = new JPanel(new GridBagLayout()); // create a frame for it to live in. frame = new JFrame(consoleFullName); frame.getContentPane().add(panel); frame.addWindowListener(new WindowAdapter() { /** * {@inheritDoc} */ public void windowClosing(WindowEvent e) { ShellApp sa = getShellApp(); if (null != sa) { sa.stopApp(); } } /** * {@inheritDoc} */ public void windowGainedFocus(WindowEvent e) { text.getCaret().setVisible(true); } /** * {@inheritDoc} */ public void windowLostFocus(WindowEvent e) { text.getCaret().setVisible(false); } }); } else { panel = inPanel; panel.setLayout(new GridBagLayout()); embedded = true; } } catch (InternalError error) { // this will occur is AWT is not available or can't be initialized (most // commonly on unix machines in a terminal window). if (LOG.isLoggable(java.util.logging.Level.SEVERE)) { LOG.finer("Could not initialize AWT, using TTY Console mode"); } HeadlessException horseman = new HeadlessException("InternalError"); horseman.initCause(error); throw horseman; } // Shell embedded in another application if( null == System.getProperty(Shell.JXTA_SHELL_EMBEDDED_KEY)) { try { System.setProperty(Shell.JXTA_SHELL_EMBEDDED_KEY, Boolean.toString(embedded)); } catch( SecurityException couldntSet ) { ; } } int fontsize = 12; String fontname = System.getProperty("SHELLFONTNAME", "Lucida Sans Typewriter"); String fontsizeProp = System.getProperty("SHELLFONTSIZE"); if (fontsizeProp != null) { try { fontsize = Integer.valueOf(fontsizeProp).intValue(); } catch (NumberFormatException e) { // will use default size ; } } this.statusStart = new JLabel( " ", JLabel.LEADING); statusStart.setFont(new Font(fontname, Font.PLAIN, fontsize)); GridBagConstraints constr = new GridBagConstraints(); constr.gridwidth = 1; constr.gridheight = 1; constr.gridx = 0; constr.gridy = 0; constr.weightx = 1; constr.weighty = 0; constr.anchor = GridBagConstraints.FIRST_LINE_START; constr.fill = GridBagConstraints.HORIZONTAL; panel.add( statusStart, constr ); this.statusEnd = new JLabel( " ", JLabel.TRAILING ); statusEnd.setFont(new Font(fontname, Font.PLAIN, fontsize)); constr.gridwidth = 1; constr.gridheight = 1; constr.gridx = 1; constr.gridy = 0; constr.weightx = 1; constr.weighty = 0; constr.anchor = GridBagConstraints.FIRST_LINE_END; constr.fill = GridBagConstraints.HORIZONTAL; panel.add( statusEnd, constr ); this.text = new JTextArea(); text.setRows(rows); text.setColumns(cols); text.setFont(new Font(fontname, Font.PLAIN, fontsize)); text.setEditable(false); text.addKeyListener( new SwingShellConsole.keyHandler() ); text.setWrapStyleWord(true); text.setLineWrap(true); text.getCaret().setVisible(true); JScrollPane stsp = new JScrollPane(); stsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); stsp.getViewport().add(text); stsp.getViewport().setScrollMode(JViewport.BLIT_SCROLL_MODE); constr.gridwidth = 2; constr.gridheight = 1; constr.gridx = 0; constr.gridy = 1; constr.weightx = 1; constr.weighty = 1; constr.anchor = GridBagConstraints.LAST_LINE_END; constr.fill = GridBagConstraints.BOTH; panel.add( stsp, constr ); if( null != frame ) { // Offset the frames frame.setLocation( (fontsize * 4), (fontsize * 4) ); frame.pack(); frame.setVisible(true); } text.requestFocus(); } /**
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -