package it.sauronsoftware.junique.example2; import it.sauronsoftware.junique.AlreadyLockedException; import it.sauronsoftware.junique.JUnique; import it.sauronsoftware.junique.MessageHandler; import java.awt.BorderLayout; import java.awt.Component; import java.awt.FileDialog; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileReader; import java.io.Reader; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.JToolBar; public class Textpad extends JFrame { private static final long serialVersionUID = 1L; private JTabbedPane tabs = new JTabbedPane(); private JButton openButton = new JButton("Open file"); private JButton closeButton = new JButton("Close tab"); public Textpad() { super("Textpad"); closeButton.setEnabled(false); openButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { openDialog(); } }); closeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { closeCurrent(); } }); JToolBar toolbar = new JToolBar(); toolbar.setFloatable(false); toolbar.add(openButton); toolbar.add(closeButton); JPanel all = new JPanel(); all.setLayout(new BorderLayout(3, 3)); all.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); all.add(toolbar, BorderLayout.NORTH); all.add(tabs, BorderLayout.CENTER); setContentPane(all); setSize(600, 500); setLocation(100, 100); setDefaultCloseOperation(EXIT_ON_CLOSE); } private void openDialog() { FileDialog fd = new FileDialog(this, "Open", FileDialog.LOAD); fd.setVisible(true); String dir = fd.getDirectory(); String file = fd.getFile(); if (dir != null && file != null) { open(dir + File.separator + file); } } private void closeCurrent() { Component c = tabs.getSelectedComponent(); if (c != null) { tabs.remove(c); if (tabs.getComponentCount() == 0) { closeButton.setEnabled(false); } } } public void open(String file) { StringBuffer text = new StringBuffer(); File f = new File(file); Reader reader = null; try { reader = new FileReader(f); char[] buf = new char[1024]; int l; while ((l = reader.read(buf)) != -1) { text.append(buf, 0, l); } } catch (Throwable t) { t.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (Throwable t) { ; } } } JTextArea area = new JTextArea(text.toString()); area.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); JScrollPane scroll = new JScrollPane(area); JPanel all = new JPanel(); all.setLayout(new BorderLayout(3, 3)); all.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); all.add(scroll, BorderLayout.CENTER); tabs.add(f.getName(), scroll); tabs.setSelectedComponent(scroll); closeButton.setEnabled(true); } private static Textpad textpad = null; public static void main(String[] args) { String id = Textpad.class.getName(); boolean start; try { JUnique.acquireLock(id, new MessageHandler() { public String handle(String message) { if (textpad != null) { textpad.open(message); textpad.toFront(); } return null; } }); start = true; } catch (AlreadyLockedException e) { // Application already running. start = false; } if (start) { textpad = new Textpad(); textpad.setVisible(true); for (int i = 0; i < args.length; i++) { textpad.open(args[i]); } } else { // Sends arguments to the already active instance. for (int i = 0; i < args.length; i++) { JUnique.sendMessage(id, args[i]); } } } }