/* * Created on 16.11.2009 * */ package org.jdesktop.swingxset.util; import java.awt.Component; import java.awt.Window; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.util.logging.Logger; import javax.jnlp.ClipboardService; import javax.jnlp.ServiceManager; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JEditorPane; import javax.swing.text.DefaultEditorKit; import org.jdesktop.application.Application; import org.pushingpixels.trident.Timeline; import org.pushingpixels.trident.Timeline.TimelineState; import org.pushingpixels.trident.callback.UIThreadTimelineCallbackAdapter; /** * Misc. convenience methods ;-) */ public class DemoUtils { @SuppressWarnings("unused") private static final Logger LOG = Logger.getLogger(DemoUtils.class .getName()); /** * Replaces the editor's default copy action in security restricted * environments with one messaging the ClipboardService. Does nothing * if not restricted. * * @param editor the editor to replace */ public static void replaceCopyAction(final JEditorPane editor) { if (!isRestricted()) return; Action safeCopy = new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { try { ClipboardService cs = (ClipboardService)ServiceManager.lookup ("javax.jnlp.ClipboardService"); StringSelection transferable = new StringSelection(editor.getSelectedText()); cs.setContents(transferable); } catch (Exception e1) { // do nothing } } }; editor.getActionMap().put(DefaultEditorKit.copyAction, safeCopy); } private static boolean isRestricted() { SecurityManager manager = System.getSecurityManager(); if (manager == null) return false; try { manager.checkSystemClipboardAccess(); return false; } catch (SecurityException e) { // nothing to do - not allowed to access } return true; } //--------------- Application-related convenience methods /** * Injects the resources into the given component instance from * the ResourceMap of the component's class. */ public static void injectResources(Component comp) { Application.getInstance().getContext().getResourceMap(comp.getClass()).injectComponents(comp); } /** * Injects the resources into the given component instance from * the ResourceMap of the parent's class. */ public static void injectResources(Object parent, Component child) { Application.getInstance().getContext().getResourceMap(parent.getClass()) .injectComponents(child); } /** * Returns an Icon stored with the given key using the resourceMap of * the baseClass, or null if none is found. * */ public static Icon getResourceIcon(Class<?> baseClass, String key) { return Application.getInstance().getContext() .getResourceMap(baseClass).getIcon(key); } /** * Returns an String stored with the given key using the resourceMap of * the baseClass, or null if none is found. * */ public static String getResourceString(Class<?> baseClass, String key) { return Application.getInstance().getContext() .getResourceMap(baseClass).getString(key); } public static Action getAction(Object actionProvider, String key) { return Application.getInstance().getContext().getActionMap(actionProvider).get(key); } //--------------------- swingset specials public static void setSnippet(String snippet, JComponent... comps) { for (JComponent comp : comps) { comp.putClientProperty("snippetKey", snippet); } } //----------------------- Window transparency convenience support public static void fadeOutAndDispose(final Window window, int fadeOutDuration) { fadeOutAndEnd(window, fadeOutDuration, false); } public static void fadeOutAndExit(Window window, int fadeOutDuration) { fadeOutAndEnd(window, fadeOutDuration, true); } /** * @param window * @param fadeOutDuration */ private static void fadeOutAndEnd(final Window window, int fadeOutDuration, final boolean exit) { Timeline dispose = new Timeline(new WindowFader(window)); dispose.addPropertyToInterpolate("opacity", 1.0f, // AWTUtilitiesWrapper.getWindowOpacity(window), 0.0f); dispose.addCallback(new UIThreadTimelineCallbackAdapter() { @Override public void onTimelineStateChanged(TimelineState oldState, TimelineState newState, float durationFraction, float timelinePosition) { if (newState == TimelineState.DONE) { if (exit) { Runtime.getRuntime().exit(0); } else { window.dispose(); } } } }); dispose.setDuration(fadeOutDuration); dispose.play(); } public static class WindowFader { private Window window; public WindowFader(Window window) { this.window = window; } public void setOpacity(float opacity) { AWTUtilitiesWrapper.setWindowOpacity(window, opacity); } } private DemoUtils() {} }