package com.nativelibs4java.opencl.demos.interactiveimage; import com.nativelibs4java.opencl.*; import javax.swing.*; import java.awt.event.*; import javax.imageio.*; import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.Dimension; import java.awt.image.*; import java.io.*; import java.awt.FileDialog; import java.util.*; import org.bridj.Platform; import com.ochafik.swing.UndoRedoUtils; import com.ochafik.swing.syntaxcoloring.TokenMarker; import com.ochafik.swing.syntaxcoloring.CCTokenMarker; import com.ochafik.swing.syntaxcoloring.JEditTextArea; import com.ochafik.util.SystemUtils; import java.net.URL; class Utils { public static <C extends JComponent> C withTitle(String title, C c) { c.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createTitledBorder(title), BorderFactory.createLoweredBevelBorder())); return c; } public static JLabel createLinkLabel(String caption, final String urlString) { final JLabel[] lab = new JLabel[1]; JLabel ret = lab[0] = createLinkLabel(caption, new Runnable() { public void run() { try { SystemUtils.runSystemOpenURL(new URL(urlString)); } catch (Exception ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(lab[0], traceToHTML(ex), "Failed to open URL", JOptionPane.ERROR_MESSAGE); } }}); ret.setToolTipText(urlString); return ret; } public static JLabel createLinkLabel(String caption, final Runnable action) { JLabel lab = new JLabel("<html><body><a href='#'>" + caption + "</a></body></html>"); lab.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); lab.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { action.run(); }}); lab.setMaximumSize(lab.getPreferredSize()); return lab; } public static boolean isMac() { return System.getProperty("os.name").startsWith("Mac"); } public static File chooseFile(File initialFile, boolean load) { if (isMac()) { FileDialog d = new FileDialog((java.awt.Frame)null); d.setMode(load ? FileDialog.LOAD : FileDialog.SAVE); if (initialFile != null) { d.setDirectory(initialFile.getParent()); d.setFile(initialFile.getName()); } d.show(); String f = d.getFile(); if (f != null) return new File(new File(d.getDirectory()), d.getFile()); } else { JFileChooser chooser = new JFileChooser(); if (initialFile != null) chooser.setSelectedFile(initialFile); if ((load ? chooser.showOpenDialog(null) : chooser.showSaveDialog(null)) == JFileChooser.APPROVE_OPTION) return chooser.getSelectedFile(); } return null; } public static JEditTextArea textArea(TokenMarker marker) { JEditTextArea ta = new JEditTextArea() { private static final long serialVersionUID = 1L; // int lastCode, lastLocation; // char lastChar = 0; @Override public void processKeyEvent(KeyEvent evt) { if (isMac()) { int m = evt.getModifiers(); if ((m & InputEvent.META_MASK) != 0) { m = (m & ~InputEvent.META_MASK) | InputEvent.CTRL_MASK; evt = new KeyEvent(evt.getComponent(), evt.getID(), evt.getWhen(), m, evt.getKeyCode(), evt.getKeyChar(), evt.getKeyLocation()); if (evt.getID() == KeyEvent.KEY_TYPED) return; } } super.processKeyEvent(evt); } @Override public Dimension getMinimumSize() { return new Dimension(100, 100); } }; ta.setBorder(BorderFactory.createLoweredBevelBorder()); ta.setFocusTraversalKeysEnabled(false); ta.addMouseWheelListener(mouseWheelListener); ta.setPreferredSize(new Dimension(200, 300)); ta.setTokenMarker(marker); return ta; } static MouseWheelListener mouseWheelListener = new MouseWheelListener() { @Override public void mouseWheelMoved(MouseWheelEvent e) { if (!(e.getSource() instanceof JEditTextArea)) return; JEditTextArea ta = (JEditTextArea)e.getSource(); int line = ta.getFirstLine(); if (e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) { int u = e.getUnitsToScroll(); line += u > 0 ? 1 : -1; if (line < 0) line = 0; else if (line >= ta.getLineCount()) line = ta.getLineCount() - 1; ta.setFirstLine(line); } } }; public static String traceToHTML(Exception ex) { return "<html><body><pre><code>" + traceToString(ex).replaceAll("\n", "<br>") + "</code></pre></body></html>"; } public static String traceToString(Exception ex) { StringWriter sout = new StringWriter(); PrintWriter pout = new PrintWriter(sout); ex.printStackTrace(pout); pout.close(); return sout.toString(); } public static String readTextResource(String path) throws IOException { InputStream in = Platform.getClassLoader(Utils.class).getResourceAsStream(path); if (in == null) throw new FileNotFoundException(path); BufferedReader rin = new BufferedReader(new InputStreamReader(in)); String line; StringBuilder b = new StringBuilder(); while ((line = rin.readLine()) != null) { b.append(line); b.append("\n"); } return b.toString(); } }