package ij.text; import java.awt.*; import java.io.*; import java.awt.event.*; import ij.*; import ij.io.*; import ij.gui.*; import ij.plugin.filter.Analyzer; import ij.measure.ResultsTable; import ij.macro.Interpreter; /** Uses a TextPanel to displays text in a window. @see TextPanel */ public class TextWindow extends Frame implements ActionListener, FocusListener, ItemListener { public static final String LOC_KEY = "results.loc"; public static final String WIDTH_KEY = "results.width"; public static final String HEIGHT_KEY = "results.height"; public static final String LOG_LOC_KEY = "log.loc"; public static final String DEBUG_LOC_KEY = "debug.loc"; static final String FONT_SIZE = "tw.font.size"; static final String FONT_ANTI= "tw.font.anti"; TextPanel textPanel; CheckboxMenuItem antialiased; int[] sizes = {9, 10, 11, 12, 13, 14, 16, 18, 20, 24, 36, 48, 60, 72}; int fontSize = (int)Prefs.get(FONT_SIZE, 5); MenuBar mb; /** Opens a new single-column text window. @param title the title of the window @param str the text initially displayed in the window @param width the width of the window in pixels @param height the height of the window in pixels */ public TextWindow(String title, String data, int width, int height) { this(title, "", data, width, height); } /** Opens a new multi-column text window. @param title the title of the window @param headings the tab-delimited column headings @param data the text initially displayed in the window @param width the width of the window in pixels @param height the height of the window in pixels */ public TextWindow(String title, String headings, String data, int width, int height) { super(title); enableEvents(AWTEvent.WINDOW_EVENT_MASK); if (IJ.isLinux()) setBackground(ImageJ.backgroundColor); textPanel = new TextPanel(title); textPanel.setTitle(title); add("Center", textPanel); textPanel.setColumnHeadings(headings); if (data!=null && !data.equals("")) textPanel.append(data); addKeyListener(textPanel); ImageJ ij = IJ.getInstance(); if (ij!=null) { textPanel.addKeyListener(ij); Image img = ij.getIconImage(); if (img!=null) try {setIconImage(img);} catch (Exception e) {} } addFocusListener(this); addMenuBar(); setFont(); WindowManager.addWindow(this); Point loc=null; int w=0, h=0; if (title.equals("Results")) { loc = Prefs.getLocation(LOC_KEY); w = (int)Prefs.get(WIDTH_KEY, 0.0); h = (int)Prefs.get(HEIGHT_KEY, 0.0); } else if (title.equals("Log")) { loc = Prefs.getLocation(LOG_LOC_KEY); w = width; h = height; } else if (title.equals("Debug")) { loc = Prefs.getLocation(DEBUG_LOC_KEY); w = width; h = height; } if (loc!=null&&w>0 && h>0) { setSize(w, h); setLocation(loc); } else { setSize(width, height); GUI.center(this); } show(); } /** Opens a new text window containing the contents of a text file. @param path the path to the text file @param width the width of the window in pixels @param height the height of the window in pixels */ public TextWindow(String path, int width, int height) { super(""); enableEvents(AWTEvent.WINDOW_EVENT_MASK); textPanel = new TextPanel(); textPanel.addKeyListener(IJ.getInstance()); add("Center", textPanel); if (openFile(path)) { WindowManager.addWindow(this); setSize(width, height); show(); } else dispose(); } void addMenuBar() { mb = new MenuBar(); if (Menus.getFontSize()!=0) mb.setFont(Menus.getFont()); Menu m = new Menu("File"); m.add(new MenuItem("Save As...", new MenuShortcut(KeyEvent.VK_S))); if (getTitle().equals("Results")) { m.add(new MenuItem("Rename...")); m.add(new MenuItem("Duplicate...")); } m.addActionListener(this); mb.add(m); m = new Menu("Edit"); m.add(new MenuItem("Cut", new MenuShortcut(KeyEvent.VK_X))); m.add(new MenuItem("Copy", new MenuShortcut(KeyEvent.VK_C))); m.add(new MenuItem("Clear")); m.add(new MenuItem("Select All", new MenuShortcut(KeyEvent.VK_A))); m.addActionListener(this); mb.add(m); m = new Menu("Font"); m.add(new MenuItem("Make Text Smaller")); m.add(new MenuItem("Make Text Larger")); m.addSeparator(); antialiased = new CheckboxMenuItem("Antialiased", Prefs.get(FONT_ANTI, IJ.isMacOSX()?true:false)); antialiased.addItemListener(this); m.add(antialiased); m.add(new MenuItem("Save Settings")); m.addActionListener(this); mb.add(m); if (getTitle().equals("Results")) { m = new Menu("Results"); m.add(new MenuItem("Clear Results")); m.add(new MenuItem("Summarize")); m.add(new MenuItem("Distribution...")); m.add(new MenuItem("Set Measurements...")); m.add(new MenuItem("Options...")); m.addActionListener(this); mb.add(m); } setMenuBar(mb); } /** Adds one or lines of text to the window. @param text The text to be appended. Multiple lines should be separated by \n. */ public void append(String text) { textPanel.append(text); } void setFont() { textPanel.setFont(new Font("SanSerif", Font.PLAIN, sizes[fontSize]), antialiased.getState()); } boolean openFile(String path) { OpenDialog od = new OpenDialog("Open Text File...", path); String directory = od.getDirectory(); String name = od.getFileName(); if (name==null) return false; path = directory + name; IJ.showStatus("Opening: " + path); try { BufferedReader r = new BufferedReader(new FileReader(directory + name)); load(r); r.close(); } catch (Exception e) { IJ.error(e.getMessage()); return true; } textPanel.setTitle(name); setTitle(name); IJ.showStatus(""); return true; } /** Returns a reference to this TextWindow's TextPanel. */ public TextPanel getTextPanel() { return textPanel; } /** Appends the text in the specified file to the end of this TextWindow. */ public void load(BufferedReader in) throws IOException { int count=0; while (true) { String s=in.readLine(); if (s==null) break; textPanel.appendLine(s); } } public void actionPerformed(ActionEvent evt) { String cmd = evt.getActionCommand(); if (cmd.equals("Make Text Larger")) changeFontSize(true); else if (cmd.equals("Make Text Smaller")) changeFontSize(false); else if (cmd.equals("Save Settings")) saveSettings(); else textPanel.doCommand(cmd); } public void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); int id = e.getID(); if (id==WindowEvent.WINDOW_CLOSING) close(); else if (id==WindowEvent.WINDOW_ACTIVATED) WindowManager.setWindow(this); } public void itemStateChanged(ItemEvent e) { setFont(); } public void close() { close(true); } /** Closes this TextWindow. Display a "save changes" dialog if this is the "Results" window and 'showDialog' is true. */ public void close(boolean showDialog) { if (getTitle().equals("Results")) { if (showDialog && !Analyzer.resetCounter()) return; IJ.setTextPanel(null); Prefs.saveLocation(LOC_KEY, getLocation()); Dimension d = getSize(); Prefs.set(WIDTH_KEY, d.width); Prefs.set(HEIGHT_KEY, d.height); } else if (getTitle().equals("Log")) { Prefs.saveLocation(LOG_LOC_KEY, getLocation()); IJ.debugMode = false; IJ.log("\\Closed"); IJ.notifyEventListeners(IJEventListener.LOG_WINDOW_CLOSED); } else if (getTitle().equals("Debug")) { Prefs.saveLocation(DEBUG_LOC_KEY, getLocation()); } else if (textPanel!=null && textPanel.rt!=null) { if (!saveContents()) return; } //setVisible(false); dispose(); WindowManager.removeWindow(this); textPanel.flush(); } public void rename(String title) { textPanel.rename(title); } boolean saveContents() { int lineCount = textPanel.getLineCount(); if (!textPanel.unsavedLines) lineCount = 0; ImageJ ij = IJ.getInstance(); boolean macro = IJ.macroRunning() || Interpreter.isBatchMode(); if (lineCount>0 && !macro && ij!=null && !ij.quitting()) { YesNoCancelDialog d = new YesNoCancelDialog(this, getTitle(), "Save "+lineCount+" measurements?"); if (d.cancelPressed()) return false; else if (d.yesPressed()) { if (!textPanel.saveAs("")) return false; } } textPanel.rt.reset(); return true; } void changeFontSize(boolean larger) { int in = fontSize; if (larger) { fontSize++; if (fontSize==sizes.length) fontSize = sizes.length-1; } else { fontSize--; if (fontSize<0) fontSize = 0; } IJ.showStatus(sizes[fontSize]+" point"); setFont(); } void saveSettings() { Prefs.set(FONT_SIZE, fontSize); Prefs.set(FONT_ANTI, antialiased.getState()); IJ.showStatus("Font settings saved (size="+sizes[fontSize]+", antialiased="+antialiased.getState()+")"); } public void focusGained(FocusEvent e) { WindowManager.setWindow(this); } public void focusLost(FocusEvent e) {} }