X-Git-Url: http://gb7djk.dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=SpiderConsole%2Fsrc%2FCluster.java;fp=SpiderConsole%2Fsrc%2FCluster.java;h=2bd124058183513ab62ffa4f6192aa35bb4f8f6c;hb=1540d1ee26801546ad652653951bbc25744d85a0;hp=0000000000000000000000000000000000000000;hpb=5e145358734eabf8855fb2b4c1daabcc55bd9da0;p=spider.git diff --git a/SpiderConsole/src/Cluster.java b/SpiderConsole/src/Cluster.java new file mode 100644 index 00000000..2bd12405 --- /dev/null +++ b/SpiderConsole/src/Cluster.java @@ -0,0 +1,358 @@ +/** + * Cluster - Cluster console plugin. + * @author Ian Norton + * @verison 0.1 - 28/12/00. + * @see JPanel + * + * RadioConsole. + * + * Copyright (C) 2001 Ian Norton. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public Licence as published by + * the Free Software Foundation; either version 2 of the Licence, or + * (at your option) any later version. + * + * This program 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 Licence for more details. + * + * You should have received a copy of the GNU General Public Licence + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * + * Contacting the author : + * Ian Norton + * i.norton@lancaster.ac.uk + * http://www.lancs.ac.uk/~norton/ + **/ + +import javax.swing.*; +import javax.swing.text.*; +import javax.swing.event.*; +import java.awt.*; +import java.io.*; +import java.awt.event.*; +import java.util.Hashtable ; +import java.util.Enumeration ; + +// public class Cluster extends Plugin implements Runnable +class Cluster extends Plugin implements Runnable + { + // Name and tip used when creating the tabbed pane. + public static final String NAME = "Cluster" ; + public static final String TIP = "DX Cluster Console" ; + + // Number of commands to buffer. + public static final int CMDBUFFERLINES = 30 ; + + // Number of lines of scrollback to buffer. + public static final int SCROLLBUFFERLINES = 100 ; + + public static final boolean DEBUG = false ; + + // Input and output streams for the plugin. + // private PipedInputStream pin ; + private BufferedReader bir ; + private PipedOutputStream pos ; + + // User input field. + private JTextField tf ; + + private JTextPane jtp ; + private Thread t ; + private SimpleAttributeSet attr ; + private LimitedStyledDocument doc ; + + // Input line scrollback buffer. + private CommandBuffer cbuf ; + + private static final String encoding = "latin1"; // "ISO8859_1"; + + /** + * Class initialiser. + **/ + public Cluster() + { + super() ; + } + + /** + * Plugin initialiser. + * @param PipedInputStream i - Stream to read data from + * @param PipedOutputStream o - Stream to write data to + **/ + public void init(PipedInputStream i, PipedOutputStream o) + { + // Initialise the plugin IO. + bir = new BufferedReader(new InputStreamReader(i)) ; + pos = o ; + + // Initialise the ScrollingTextArea. + // ScrollingTextArea sta = new ScrollingTextArea(pin, SCROLLBUFFERLINES, doc) ; + // sta.setFont(new Font("Courier", Font.PLAIN, 10)) ; + // sta.setFont(new Font("Monospaced", Font.PLAIN, 10)) ; + // System.out.println(sta.getFont()) ; + + doc = new LimitedStyledDocument(SCROLLBUFFERLINES) ; + jtp = new JTextPane(doc) ; + jtp.setEditable(false) ; + attr = new SimpleAttributeSet() ; + StyleConstants.setFontFamily(attr, "Monospaced") ; + StyleConstants.setFontSize(attr, 10) ; + jtp.setBackground(Color.black) ; + + doc.addDocumentListener(new DocumentListener() { + public void insertUpdate(DocumentEvent e) { + jtp.setCaretPosition(doc.getLength()) ; + // tf.requestFocus() ; + } + public void removeUpdate(DocumentEvent e) { + } + public void changedUpdate(DocumentEvent e) { + } + }); + + // Initialise the TextField for user input. + tf = new JTextField() ; + tf.setFont(new Font("Courier", Font.PLAIN, 10)) ; + Insets inset = tf.getMargin() ; + inset.top = inset.top + 1 ; + inset.bottom = inset.bottom + 1 ; + tf.setMargin(inset) ; + tf.setForeground(Color.white) ; + tf.setBackground(Color.black) ; + + // Set the layout manager. + this.setLayout(new BorderLayout()) ; + + // Scrollbars for scrolling text area. + // JScrollPane scrollpane = new JScrollPane(sta); + JScrollPane scrollpane = new JScrollPane(jtp); + + // Add the bits to the panel. + this.add(scrollpane, BorderLayout.CENTER); + this.add(tf, BorderLayout.SOUTH); + + // Initialise the command buffer. + cbuf = new CommandBuffer(CMDBUFFERLINES) ; + + // Action listener stuff. + tf.addKeyListener(new KeyAdapter() + { + public void keyTyped(KeyEvent e) + { + // Enter key + if((e.getID() == KeyEvent.KEY_TYPED) && (e.getKeyChar() == KeyEvent.VK_ENTER)) + { + // System.out.println("Enter Event") ; + send(tf.getText() + '\n') ; + cbuf.addCommand(tf.getText()) ; + tf.setText("") ; + } + } + public void keyPressed(KeyEvent e) + { + // UP Arrow + if((e.getID() == KeyEvent.KEY_PRESSED) && (e.getKeyCode() == KeyEvent.VK_UP)) + { + // System.out.println("UP Event") ; + tf.setText(cbuf.getPreviousCommand()) ; + tf.setCaretPosition(tf.getText().length()) ; + } + // DOWN Arrow + if((e.getID() == KeyEvent.KEY_PRESSED) && (e.getKeyCode() == KeyEvent.VK_DOWN)) + { + // System.out.println("DOWN Event") ; + tf.setText(cbuf.getNextCommand()) ; + tf.setCaretPosition(tf.getText().length()) ; + } + // Escape key + if((e.getID() == KeyEvent.KEY_PRESSED) && (e.getKeyCode() == KeyEvent.VK_ESCAPE)) + { + // System.out.println("ESCAPE Event") ; + tf.setText("") ; } + } + }) ; + + // Add component listener to focus text field. + this.addComponentListener(new ComponentAdapter() { + public void componentShown(ComponentEvent e) { + tf.setVisible(true) ; + tf.requestFocus() ; + } + }); + + // Init the scrolling thread. + t = new Thread(this, "Scrolling thread") ; + t.start() ; + } // End of init + + /** + * getTabName - Get the name that this component should show on it's tab + * @returns String s - Tab name + **/ + + public String getTabName() + { return NAME ; + } + + /** + * getTabTip - Get the tip that this component should show on it's tab + * @returns String s - Tab tip + **/ + public String getTabTip() + { + return TIP ; + } + + /** + * getMenu - get the menu to add to the main menu bar. + * @returns JMenu + **/ + public JMenu getMenu() + { + return null ; + } + /** + * send - Helper function to send data out to the PipedOutputMUX + * @param String s - data to send. + **/ + private void send(String s) + { + // System.out.println("Cluster: send got : " + s) ; + + try + { + // Write the data to the stream. + for(int i=0;i= 0) + // { + // n = pin.read(b); + // if(n > 0) + // { + // output = new String(b, 0, n, encoding) ; + // display(output) ; + // // System.out.println("Read : " + output) ; + // } + // } + output = bir.readLine() ; + if(output != null) display(output) ; + + if(DEBUG) System.out.println("After reading a line.") ; + } + catch(IOException ex) + { + System.out.println("ScrollingTextArea: IOException trying to read.") ; + } + } // End of infinate loop. + } // End of run. + + private void display(String s) + { + // System.out.println(s) ; + // Ignore Ctrl-G. + // s = s.replace('\r', ' ') ; + s = s.replace('', ' ') ; + + attr = getAttributes(s) ; + doc.append(s + "\n", attr) ; + } + + private SimpleAttributeSet getAttributes(String s) + { + SimpleAttributeSet sas = attr ; + + /** + # 0 - $foreground, $background + # 1 - RED, $background + # 2 - BROWN, $background + # 3 - GREEN, $background + # 4 - CYAN, $background + # 5 - BLUE, $background + # 6 - MAGENTA, $background + + VHF DX SPOT + [ '^DX de [\-A-Z0-9]+:\s+([57][01]\d\d\d\.|\d\d\d\d\d\d+.)', COLOR_PAIR(1) ], + PROMPT + [ '^G0VGS de GB7MBC', COLOR_PAIR(6) ], + DUNNO! + [ '^G0VGS de', A_BOLD|COLOR_PAIR(2) ], + HF DX SPOT + [ '^DX', COLOR_PAIR(5) ], + ANNOUNCE + [ '^To', COLOR_PAIR(3) ], + WWV SPOT + [ '^WWV', COLOR_PAIR(4) ], + DUNNO! + [ '^[-A-Z0-9]+ de [-A-Z0-9]+ \d\d-\w\w\w-\d\d\d\d \d\d\d\dZ', COLOR_PAIR(0) ], + DUNNO! - PROBABLY A TALK + [ '^[-A-Z0-9]+ de [-A-Z0-9]+ ', COLOR_PAIR(6) ], + WX SPOT + [ '^WX', COLOR_PAIR(3) ], + NEW MAIL + [ '^New mail', A_BOLD|COLOR_PAIR(4) ], + USER LOGIN? + [ '^User', COLOR_PAIR(2) ], + NODE LOGIN? + [ '^Node', COLOR_PAIR(2) ], + **/ + + Hashtable h = new Hashtable() ; + h.put("DX de", Color.red) ; + h.put("M0AZM de GB7MBC", Color.magenta) ; + h.put("G0VGS de GB7MBC", Color.magenta) ; + h.put("G0VGS2 de GB7MBC", Color.magenta) ; + // h.put("DX", Color.blue) ; + h.put("To", Color.green) ; + h.put("WWV", Color.cyan) ; + h.put("WCY", Color.cyan) ; + // h.put("", Color.) ; + // h.put("", Color.) ; + h.put("WX", Color.green) ; + h.put("New mail", Color.cyan) ; + //h.put("User", Color.brown) ; + //h.put("Node", Color.brown) ; + h.put("User", Color.yellow) ; + h.put("Node", Color.orange) ; + + Enumeration e = h.keys() ; + + while(e.hasMoreElements()) + { + String prefix = (String)e.nextElement() ; + if(s.startsWith(prefix)) + { + StyleConstants.setForeground(sas, (Color)h.get(prefix)) ; + return sas ; + } + } + + StyleConstants.setForeground(sas, Color.white) ; + return sas ; + } + }