diff --git a/main/document/jcapture/.settings/org.eclipse.jdt.core.prefs b/main/document/jcapture/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 8000cd6ca6..0000000000 --- a/main/document/jcapture/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,11 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/main/document/jcapture/JCaptureApplet.html b/main/document/jcapture/JCaptureApplet.html deleted file mode 100644 index 728fca62e9..0000000000 --- a/main/document/jcapture/JCaptureApplet.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/main/document/jcapture/action.php b/main/document/jcapture/action.php deleted file mode 100644 index b6db9b57e1..0000000000 --- a/main/document/jcapture/action.php +++ /dev/null @@ -1,48 +0,0 @@ - 'Pavel Vlasov', - 'email' => 'Pavel.Vlasov@hammurapi.com', - 'name' => 'JCapture', - 'desc' => 'Plugin for making screen captures.', - 'url' => 'http://www.hammurapi.com/dokuwiki/doku.php/products:jcapture:start', - ); - } - - /** - * Register the eventhandlers - */ - function register(&$controller) { - $controller->register_hook('TOOLBAR_DEFINE', 'AFTER', $this, 'insert_button', array ()); - } - - /** - * Inserts the toolbar button - */ - function insert_button(& $event, $param) { - $event->data[] = array ( - 'type' => 'JCapture', - 'title' => 'Screen capture', - 'icon' => '../../plugins/jcapture/camera.png', - 'open' => '', - 'close' => '', - ); - } - -} - diff --git a/main/document/jcapture/applet.php b/main/document/jcapture/applet.php deleted file mode 100644 index a236c725f0..0000000000 --- a/main/document/jcapture/applet.php +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -Java 2 Standard Edition v 1.7 or above is required for this applet.
- Download it from http://java.sun.com. -
- - - - diff --git a/main/document/jcapture/camera.png b/main/document/jcapture/camera.png deleted file mode 100644 index f7cbba0a8c..0000000000 Binary files a/main/document/jcapture/camera.png and /dev/null differ diff --git a/main/document/jcapture/jcapture.jnlp b/main/document/jcapture/jcapture.jnlp deleted file mode 100644 index 93bb4d6c26..0000000000 --- a/main/document/jcapture/jcapture.jnlp +++ /dev/null @@ -1,21 +0,0 @@ - - - - jCapture - Hammurapi Group - - - - - - - - - - - - \ No newline at end of file diff --git a/main/document/jcapture/lib/apache-mime4j-0.6.jar b/main/document/jcapture/lib/apache-mime4j-0.6.jar deleted file mode 100644 index 694e47fdbe..0000000000 Binary files a/main/document/jcapture/lib/apache-mime4j-0.6.jar and /dev/null differ diff --git a/main/document/jcapture/lib/commons-codec-1.3.jar b/main/document/jcapture/lib/commons-codec-1.3.jar deleted file mode 100644 index 4fc82ec096..0000000000 Binary files a/main/document/jcapture/lib/commons-codec-1.3.jar and /dev/null differ diff --git a/main/document/jcapture/lib/commons-logging-1.1.1.jar b/main/document/jcapture/lib/commons-logging-1.1.1.jar deleted file mode 100644 index 1ad4f746a1..0000000000 Binary files a/main/document/jcapture/lib/commons-logging-1.1.1.jar and /dev/null differ diff --git a/main/document/jcapture/lib/httpclient-4.0.1.jar b/main/document/jcapture/lib/httpclient-4.0.1.jar deleted file mode 100644 index 3919e1a750..0000000000 Binary files a/main/document/jcapture/lib/httpclient-4.0.1.jar and /dev/null differ diff --git a/main/document/jcapture/lib/httpcore-4.0.1.jar b/main/document/jcapture/lib/httpcore-4.0.1.jar deleted file mode 100644 index 633a31162a..0000000000 Binary files a/main/document/jcapture/lib/httpcore-4.0.1.jar and /dev/null differ diff --git a/main/document/jcapture/lib/httpmime-4.0.1.jar b/main/document/jcapture/lib/httpmime-4.0.1.jar deleted file mode 100644 index d09360be1c..0000000000 Binary files a/main/document/jcapture/lib/httpmime-4.0.1.jar and /dev/null differ diff --git a/main/document/jcapture/lib/jcapture.jar b/main/document/jcapture/lib/jcapture.jar deleted file mode 100644 index 9cc4110624..0000000000 Binary files a/main/document/jcapture/lib/jcapture.jar and /dev/null differ diff --git a/main/document/jcapture/lib/transform-3.0.2.jar b/main/document/jcapture/lib/transform-3.0.2.jar deleted file mode 100644 index 1747686ae4..0000000000 Binary files a/main/document/jcapture/lib/transform-3.0.2.jar and /dev/null differ diff --git a/main/document/jcapture/license.txt b/main/document/jcapture/license.txt deleted file mode 100644 index 0c73c0553f..0000000000 --- a/main/document/jcapture/license.txt +++ /dev/null @@ -1 +0,0 @@ -GPL v 2 \ No newline at end of file diff --git a/main/document/jcapture/script.js b/main/document/jcapture/script.js deleted file mode 100644 index 1bd9f89d1a..0000000000 --- a/main/document/jcapture/script.js +++ /dev/null @@ -1,19 +0,0 @@ -function addBtnActionJCapture($btn, props, edid) { - $btn.click(function() { - var appletDiv = document.getElementById("jCaptureAppletDiv"); - if (appletDiv==null) { - var oNewDiv = document.createElement("div"); - oNewDiv.id="jCaptureAppletDiv"; - //oNewDiv.style.display='none'; - document.body.appendChild(oNewDiv); - jQuery("#jCaptureAppletDiv").load(DOKU_BASE+"lib/plugins/jcapture/applet.php?edid="+edid+"&pageName="+document.forms['dw__editform'].elements['id'].value); - } else { - document.getElementById("jCaptureApplet").showCaptureFrame(); - } - return false; - }); - - return true; -} - - diff --git a/main/document/jcapture/src/META-INF/services/com.hammurapi.jcapture.VideoEncoder b/main/document/jcapture/src/META-INF/services/com.hammurapi.jcapture.VideoEncoder deleted file mode 100644 index 1fbadfcc92..0000000000 --- a/main/document/jcapture/src/META-INF/services/com.hammurapi.jcapture.VideoEncoder +++ /dev/null @@ -1 +0,0 @@ -com.hammurapi.jcapture.SwfEncoder \ No newline at end of file diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/AWTUtilitiesTranslucener.java b/main/document/jcapture/src/com/hammurapi/jcapture/AWTUtilitiesTranslucener.java deleted file mode 100644 index e4ecc2334c..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/AWTUtilitiesTranslucener.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.Frame; - -import com.sun.awt.AWTUtilities; -import com.sun.awt.AWTUtilities.Translucency; - -public class AWTUtilitiesTranslucener extends Translucener { - - @Override - protected void makeTranslucent(Frame frame) { - if (AWTUtilities.isTranslucencySupported(Translucency.TRANSLUCENT)) { - AWTUtilities.setWindowOpacity(frame, 0.7f); - } - } - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/AbstractCaptureApplet.java b/main/document/jcapture/src/com/hammurapi/jcapture/AbstractCaptureApplet.java deleted file mode 100644 index b34aab7c74..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/AbstractCaptureApplet.java +++ /dev/null @@ -1,262 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.Component; -import java.io.Closeable; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.ProxySelector; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.Properties; -import java.util.StringTokenizer; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; - -import javax.swing.JApplet; -import javax.swing.JOptionPane; -import javax.swing.ProgressMonitorInputStream; -import javax.swing.SwingUtilities; - -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.binary.Hex; -import org.apache.commons.codec.net.URLCodec; -import org.apache.http.HttpResponse; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.entity.mime.content.InputStreamBody; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.conn.ProxySelectorRoutePlanner; - -/** - * Base class for capture applets. - * @author Pavel - * - */ -public abstract class AbstractCaptureApplet extends JApplet { - - private static final String OUTPUT_DIR_PARAMETER = "outputDir"; - - private CaptureFrame captureFrame; - - @Override - public void stop() { - if (captureFrame!=null) { - captureFrame.dispose(); - captureFrame = null; - } - backgroundProcessor.shutdown(); - synchronized (closeables) { - Iterator cit = closeables.iterator(); - while (cit.hasNext()) { - try { - cit.next().close(); - } catch (Exception e) { - e.printStackTrace(); - } - cit.remove(); - } - } - super.stop(); - } - - /** - * Adds closeable to close in applet stop() method. - * @param closeable - */ - public void addCloseable(Closeable closeable) { - synchronized (closeables) { - closeables.add(closeable); - } - } - - private Collection closeables = new ArrayList(); - - public void showCaptureFrame() { - if (captureFrame==null) { - createCaptureFrame(); - } - captureFrame.setVisible(true); - } - - private ExecutorService backgroundProcessor; - - @Override - public void start() { - super.start(); - - ThreadFactory threadFactory = new ThreadFactory() { - - @Override - public Thread newThread(Runnable r) { - Thread th=new Thread(r, "Background processor"); - th.setPriority(Thread.NORM_PRIORITY); - return th; - } - }; - backgroundProcessor = Executors.newSingleThreadExecutor(threadFactory); - - SwingUtilities.invokeLater(new Runnable() { - - public void run() { - createCaptureFrame(); - } - }); - - try { - // Proxy configuration - requires java.net.NetPermission getProxySelector - proxySelector = ProxySelector.getDefault(); - } catch (Exception e) { - System.err.println("Can't obtain proxy information: "+e); - e.printStackTrace(); - } - } - - public ExecutorService getBackgroundProcessor() { - return backgroundProcessor; - } - - protected void createCaptureFrame() { - try { - captureFrame = new CaptureFrame(this); - captureFrame.setVisible(true); - } catch (Exception e) { - JOptionPane.showMessageDialog( - null, - "Error: "+e, - "Cannot create capture window", - JOptionPane.ERROR_MESSAGE); - e.printStackTrace(); - } - } - - public static String formatByteSize(long bytes) { - if (bytes<1024) { - return bytes + "bytes"; - } - if (bytes<1024*1024) { - return MessageFormat.format("{0,number,0.0} Kb", new Object[] {(double) bytes/1024.0}); - } - if (bytes<1024*1024*1024) { - return MessageFormat.format("{0,number,0.00} Mb", new Object[] {(double) bytes/(double) (1024.0*1024.0)}); - } - return MessageFormat.format("{0,number,0.00} Gb", new Object[] {(double) bytes/(double) (1024.0*1024.0*1024.0)}); - } - - - protected File preferencesFile = new File(System.getProperty("user.home")+File.separator+"."+getClass().getName()+".properties"); - - public Properties loadConfig() { - try { - if (preferencesFile.isFile()) { - InputStream configStream = new FileInputStream(preferencesFile); - Properties ret = new Properties(); - ret.load(configStream); - configStream.close(); - return ret; - } - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - public void storeConfig(Properties properties) { - try { - FileOutputStream out = new FileOutputStream(preferencesFile); - properties.store(out, "Config"); - out.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - protected String getCookies() throws DecoderException { - String cookiesStr = getParameter("cookies"); - if (cookiesStr==null) { - return null; - } - - StringBuilder ret = new StringBuilder(); - StringTokenizer st = new StringTokenizer(cookiesStr, ";"); - while (st.hasMoreTokens()) { - String tok = st.nextToken(); - int idx = tok.indexOf("="); - ret.append(hex2urlEncoded(tok.substring(0, idx))); - ret.append("="); - ret.append(hex2urlEncoded(tok.substring(idx+1))); - if (st.hasMoreElements()) { - ret.append(";"); - } - } - - return ret.toString(); - } - - private String hex2urlEncoded(String hexStr) throws DecoderException { - return new String(URLCodec.encodeUrl(null, Hex.decodeHex(hexStr.toCharArray()))); - } - - protected ProxySelector proxySelector; - - /** - * Posts capture/recording to the web site. - * @param parentComponent Parent component for the progress bar. - * @param content Content - file or byte array. - * @param fileName File name. - * @param mimeType Mime type. - * @return - * @throws Exception - */ - public HttpResponse post( - Component parentComponent, - final InputStream content, - final long contentLength, - String fileName, - String mimeType) throws Exception { - - - System.out.println("jCapture applet, build @@@time@@@"); - - /** - * Debugging - save to file. - */ - if (getParameter(OUTPUT_DIR_PARAMETER)!=null) { - OutputStream out = new FileOutputStream(new File(getParameter(OUTPUT_DIR_PARAMETER)+File.separator+fileName)); - byte[] buf=new byte[4096]; - int l; - while ((l=content.read(buf))!=-1) { - out.write(buf, 0, l); - } - out.close(); - content.close(); - return null; - } - - ProgressMonitorInputStream pmis = new ProgressMonitorInputStream(parentComponent, "Uploading "+ fileName + " ("+formatByteSize(contentLength)+")", content); - InputStreamBody bin = new InputStreamBody(pmis, mimeType, bodyName(fileName)) { - - @Override - public long getContentLength() { - return contentLength; - } - }; - - DefaultHttpClient httpClient = new DefaultHttpClient(); - if (proxySelector!=null) { - ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner( - httpClient.getConnectionManager().getSchemeRegistry(), - proxySelector); - httpClient.setRoutePlanner(routePlanner); - } - return httpClient.execute(createRequest(fileName, bin)); - } - - protected abstract HttpUriRequest createRequest(String fileName, InputStreamBody bin) throws Exception; - - protected abstract String bodyName(String fileName); -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/ButtonManager.java b/main/document/jcapture/src/com/hammurapi/jcapture/ButtonManager.java deleted file mode 100644 index eb9bbfc9a7..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/ButtonManager.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.hammurapi.jcapture; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.zip.DataFormatException; - -import com.flagstone.transform.DefineTag; -import com.flagstone.transform.Movie; -import com.flagstone.transform.MovieTag; -import com.flagstone.transform.Place2; -import com.flagstone.transform.datatype.CoordTransform; - - -public class ButtonManager { - - private final Map buttons; - private final List definitions; - - public ButtonManager() { - buttons = new HashMap(); - definitions = new ArrayList(); - } - - public void loadLibrary(URL libUrl) throws IOException, DataFormatException { - Movie movie = new Movie(); - movie.decodeFromUrl(libUrl); - findDefinitions(movie, definitions); - findButtons(movie, buttons); - } - - public int maxIdentifier() { - int identifier = 0; - DefineTag object; - for (Iteratoriter = definitions.iterator(); iter.hasNext();) { - object = iter.next(); - if (object.getIdentifier() > identifier) { - identifier = object.getIdentifier(); - } - } - return identifier; - } - - public List getDefinitions() { - List list = new ArrayList(definitions.size()); - for (Iteratoriter = definitions.iterator(); iter.hasNext();) { - list.add((DefineTag) iter.next().copy()); - } - return list; - } - - public Place2 getButton(final String name, final int layer, final int xpos, final int ypos) { - Place2 place = (Place2)buttons.get(name).copy(); - place.setLayer(layer); - place.setTransform(new CoordTransform(1, 1, 0, 0, xpos, ypos)); - return place; - } - - private void findDefinitions(final Movie movie, final List list) { - MovieTag object; - for (Iterator iter = movie.getObjects().iterator(); iter.hasNext();) { - object = iter.next(); - if (object instanceof DefineTag) { - list.add((DefineTag)object); - } - } - } - - private void findButtons(final Movie movie, final Map list) { - MovieTag object; - Place2 place; - for (Iteratoriter = movie.getObjects().iterator(); iter.hasNext();) { - object = iter.next(); - if (object instanceof Place2) { - place = (Place2)object; - if (place.getName() != null) { - list.put(place.getName(), place); - } - } - } - } -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/CaptureConfig.java b/main/document/jcapture/src/com/hammurapi/jcapture/CaptureConfig.java deleted file mode 100644 index fbd6a0ab8b..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/CaptureConfig.java +++ /dev/null @@ -1,370 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.AWTException; -import java.awt.Component; -import java.awt.MouseInfo; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Robot; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.nio.channels.FileChannel; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; -import java.util.Properties; -import java.util.ServiceLoader; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; - -import javax.sound.sampled.AudioFormat; - -public class CaptureConfig implements VideoEncoder.Config { - - private static final String MP3_COMMAND_PROPERTY = "mp3command"; - private static final String TOOL_BAR_PROPERTY = "toolBar"; - private static final String SPEED_SCALE_PROPERTY = "speedScale"; - private static final String SOUND_PROPERTY = "sound"; - private static final String SCREEN_SCALE_PROPERTY = "screenScale"; - private static final String REMOVE_INACTIVITY_PROPERTY = "removeInactivity"; - private static final String PLAY_PROPERTY = "play"; - private static final String MOUSE_PROPERTY = "mouse"; - private static final String MIXER_NAME_PROPERTY = "mixerName"; - private static final String LOOP_PROPERTY = "loop"; - private static final String INACTIVITY_INTERVAL_PROPERTY = "inactivityInterval"; - private static final String IMAGE_FORMAT_PROPERTY = "imageFormat"; - private static final String FRAMES_PER_SECOND_PROPERTY = "framesPerSecond"; - private static final String BORDER_PROPERTY = "border"; - private static final String RECORDING_RECTANGLE_PROPERTY = "recordingRectangle"; - private static final String ENCODER_NAME_PROPERTY = "encoderName"; - private static final String AUDIO_FORMAT_SAMPLE_SIZE_PROPERTY = "audioFormat.sampleSize"; - private static final String AUDIO_FORMAT_SAMPLE_RATE_PROPERTY = "audioFormat.sampleRate"; - private static final String AUDIO_FORMAT_CHANNELS_PROPERTY = "audioFormat.channels"; - private AudioFormat audioFormat = new AudioFormat(22050.0F, 16, 1, true, false);; - private String mixerName; - private float framesPerSecond = 10.0f; - private double screenScale = 1.0; - private float speedScale = 1.0f; - private boolean removeInactivity; - private double inactivityInterval = 0.7; - private Component parentComponent; - private Rectangle recordingRectangle; - private boolean border = true; - private boolean toolBar = true; - private Robot robot; - private String imageFormat = "PNG"; - private boolean sound = true; - private boolean mouse = true; - private boolean loop = true; - private boolean play = false; - private VideoEncoder encoder; - private int grabRange = 3; - private ExecutorService backgroundProcessor; - private String mp3command; - - public String getMp3command() { - return mp3command; - } - - public void setMp3command(String mp3command) { - this.mp3command = mp3command; - } - - public int getGrabRange() { - return grabRange; - } - - public ExecutorService getBackgroundProcessor() { - return backgroundProcessor; - } - - public void setBackgroundProcessor(ExecutorService backgroundProcessor) { - this.backgroundProcessor = backgroundProcessor; - } - - public void setGrabRange(int grabRange) { - this.grabRange = grabRange; - } - - public VideoEncoder getEncoder() { - return encoder; - } - - public void setEncoder(VideoEncoder encoder) { - this.encoder = encoder; - } - - public boolean isLoop() { - return loop; - } - - public void setLoop(boolean loop) { - this.loop = loop; - } - - public boolean isPlay() { - return play; - } - - public void setPlay(boolean play) { - this.play = play; - } - - public boolean isSound() { - return sound; - } - - public void setSound(boolean sound) { - this.sound = sound; - } - - public boolean isMouse() { - return mouse; - } - - public void setMouse(boolean mouse) { - this.mouse = mouse; - } - - public String getImageFormat() { - return imageFormat; - } - - public void setImageFormat(String imageFormat) { - this.imageFormat = imageFormat; - } - - public CaptureConfig() throws AWTException { - robot = new Robot(); - - ServiceLoader sl = ServiceLoader.load(VideoEncoder.class); - List accumulator = new ArrayList(); - Iterator vit = sl.iterator(); - while (vit.hasNext()) { - accumulator.add(vit.next()); - } - - Collections.sort(accumulator, new Comparator() { - - @Override - public int compare(VideoEncoder o1, VideoEncoder o2) { - return o1.toString().compareTo(o2.toString()); - } - - }); - - encoders = Collections.unmodifiableList(accumulator); - if (encoder==null && !encoders.isEmpty()) { - encoder = encoders.get(0); - } - - } - - /** - * Submits screenshot for processing in a background thread. - * @param task - * @return - */ - public Future submit(ScreenShot task) { - return backgroundProcessor.submit(task); - } - - public Robot getRobot() { - return robot; - } - - public ScreenShot createScreenShot(ScreenShot prev, FileChannel imageChannel) throws IOException { - BufferedImage image = robot.createScreenCapture(recordingRectangle); - Point mouseLocation = MouseInfo.getPointerInfo().getLocation(); - if (mouse && recordingRectangle.contains(mouseLocation)) { - mouseLocation.move(mouseLocation.x-recordingRectangle.x, mouseLocation.y-recordingRectangle.y); - } else { - mouseLocation = null; - } - return new ScreenShot( - image, - mouseLocation, - prev, - System.currentTimeMillis(), - grabRange, - isTransparencySupported(), - border, - getScreenScale(), - imageChannel, - getImageFormat()); - } - - public boolean isTransparencySupported() { - return !"jpeg".equalsIgnoreCase(getImageFormat()) - && !"jpg".equalsIgnoreCase(getImageFormat()); - } - - public boolean isToolBar() { - return toolBar; - } - public void setToolBar(boolean toolBar) { - this.toolBar = toolBar; - } - public boolean isBorder() { - return border; - } - public void setBorder(boolean border) { - this.border = border; - } - public Rectangle getRecordingRectangle() { - return recordingRectangle; - } - public Properties setRecordingRectangle(Rectangle recordingRectangle) { - Rectangle oldValue = this.recordingRectangle; - this.recordingRectangle = recordingRectangle; - if (this.recordingRectangle!=null && !this.recordingRectangle.equals(oldValue)) { - return store(); - } - return null; - } - public AudioFormat getAudioFormat() { - return audioFormat; - } - public void setAudioFormat(AudioFormat audioFormat) { - this.audioFormat = audioFormat; - } - public String getMixerName() { - return mixerName; - } - public void setMixerName(String mixerName) { - this.mixerName = mixerName; - } - public float getFramesPerSecond() { - return framesPerSecond; - } - public void setFramesPerSecond(float framesPerSecond) { - this.framesPerSecond = framesPerSecond; - } - public double getScreenScale() { - return screenScale; - } - public void setScreenScale(double screenScale) { - this.screenScale = screenScale; - } - public float getSpeedScale() { - return speedScale; - } - public void setSpeedScale(float speedScale) { - this.speedScale = speedScale; - } - public boolean isRemoveInactivity() { - return removeInactivity; - } - public void setRemoveInactivity(boolean removeInactivity) { - this.removeInactivity = removeInactivity; - } - public double getInactivityInterval() { - return inactivityInterval; - } - public void setInactivityInterval(double inactivityInterval) { - this.inactivityInterval = inactivityInterval; - } - public Component getParentComponent() { - return parentComponent; - } - public void setParentComponent(Component parentComponent) { - this.parentComponent = parentComponent; - } - - void load(Properties properties) { - if (properties!=null) { - try { - if (properties.containsKey(AUDIO_FORMAT_CHANNELS_PROPERTY)) { - audioFormat = new AudioFormat( - Float.parseFloat(properties.getProperty(AUDIO_FORMAT_SAMPLE_RATE_PROPERTY, String.valueOf(audioFormat.getSampleRate()))), - Integer.parseInt(properties.getProperty(AUDIO_FORMAT_SAMPLE_SIZE_PROPERTY, String.valueOf(audioFormat.getSampleSizeInBits()))), - Integer.parseInt(properties.getProperty(AUDIO_FORMAT_CHANNELS_PROPERTY, String.valueOf(audioFormat.getChannels()))), - true, false); - } - - border=Boolean.parseBoolean(properties.getProperty(BORDER_PROPERTY, String.valueOf(border))); - framesPerSecond=Float.parseFloat(properties.getProperty(FRAMES_PER_SECOND_PROPERTY, String.valueOf(framesPerSecond))); - imageFormat=properties.getProperty(IMAGE_FORMAT_PROPERTY, String.valueOf(imageFormat)); - inactivityInterval=Double.parseDouble(properties.getProperty(INACTIVITY_INTERVAL_PROPERTY, String.valueOf(inactivityInterval))); - loop=Boolean.parseBoolean(properties.getProperty(LOOP_PROPERTY, String.valueOf(loop))); - mixerName=properties.getProperty(MIXER_NAME_PROPERTY, String.valueOf(mixerName)); - mouse=Boolean.parseBoolean(properties.getProperty(MOUSE_PROPERTY, String.valueOf(mouse))); - play=Boolean.parseBoolean(properties.getProperty(PLAY_PROPERTY, String.valueOf(play))); - removeInactivity=Boolean.parseBoolean(properties.getProperty(REMOVE_INACTIVITY_PROPERTY, String.valueOf(removeInactivity))); - screenScale=Double.parseDouble(properties.getProperty(SCREEN_SCALE_PROPERTY, String.valueOf(screenScale))); - sound=Boolean.parseBoolean(properties.getProperty(SOUND_PROPERTY, String.valueOf(sound))); - speedScale=Float.parseFloat(properties.getProperty(SPEED_SCALE_PROPERTY, String.valueOf(speedScale))); - toolBar=Boolean.parseBoolean(properties.getProperty(TOOL_BAR_PROPERTY, String.valueOf(toolBar))); - mp3command=properties.getProperty(MP3_COMMAND_PROPERTY); - encoder = null; - String encoderName = properties.getProperty(ENCODER_NAME_PROPERTY); - if (encoderName!=null) { - for (VideoEncoder candidate: getEncoders()) { - if (encoderName.equals(candidate.toString())) { - encoder = candidate; - break; - } - } - } - if (encoder==null && !getEncoders().isEmpty()) { - encoder = getEncoders().get(0); - } - - String rr = properties.getProperty(RECORDING_RECTANGLE_PROPERTY); - if (rr!=null && rr.trim().length()>0) { - String[] dims = rr.split(";"); - recordingRectangle = new Rectangle(Integer.parseInt(dims[0]), Integer.parseInt(dims[1]), Integer.parseInt(dims[2]), Integer.parseInt(dims[3])); - } - - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - private List encoders; - - /** - * @return array of available encoders. - */ - public List getEncoders() { - return encoders; - } - - Properties store() { - Properties properties = new Properties(); - if (audioFormat!=null) { - properties.setProperty(AUDIO_FORMAT_CHANNELS_PROPERTY, String.valueOf(audioFormat.getChannels())); - properties.setProperty(AUDIO_FORMAT_SAMPLE_RATE_PROPERTY, String.valueOf(audioFormat.getSampleRate())); - properties.setProperty(AUDIO_FORMAT_SAMPLE_SIZE_PROPERTY, String.valueOf(audioFormat.getSampleSizeInBits())); - } - properties.setProperty(BORDER_PROPERTY, String.valueOf(border)); - properties.setProperty(FRAMES_PER_SECOND_PROPERTY, String.valueOf(framesPerSecond)); - properties.setProperty(IMAGE_FORMAT_PROPERTY, String.valueOf(imageFormat)); - properties.setProperty(INACTIVITY_INTERVAL_PROPERTY, String.valueOf(inactivityInterval)); - properties.setProperty(LOOP_PROPERTY, String.valueOf(loop)); - properties.setProperty(MIXER_NAME_PROPERTY, String.valueOf(mixerName)); - properties.setProperty(MOUSE_PROPERTY, String.valueOf(mouse)); - properties.setProperty(PLAY_PROPERTY, String.valueOf(play)); - properties.setProperty(REMOVE_INACTIVITY_PROPERTY, String.valueOf(removeInactivity)); - properties.setProperty(SCREEN_SCALE_PROPERTY, String.valueOf(screenScale)); - properties.setProperty(SOUND_PROPERTY, String.valueOf(sound)); - properties.setProperty(SPEED_SCALE_PROPERTY, String.valueOf(speedScale)); - properties.setProperty(TOOL_BAR_PROPERTY, String.valueOf(toolBar)); - if (recordingRectangle!=null) { - properties.setProperty(RECORDING_RECTANGLE_PROPERTY, recordingRectangle.x+";"+recordingRectangle.y+";"+recordingRectangle.width+";"+recordingRectangle.height); - } - if (mp3command!=null) { - properties.setProperty(MP3_COMMAND_PROPERTY, mp3command); - } - if (encoder!=null) { - properties.setProperty(ENCODER_NAME_PROPERTY, encoder.toString()); - } - - return properties; - } - - -} \ No newline at end of file diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/CaptureFrame.java b/main/document/jcapture/src/com/hammurapi/jcapture/CaptureFrame.java deleted file mode 100644 index 23e0d10bf7..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/CaptureFrame.java +++ /dev/null @@ -1,405 +0,0 @@ -package com.hammurapi.jcapture; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Properties; -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.imageio.ImageIO; -import javax.swing.AbstractAction; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; -import javax.swing.SwingWorker; -import javax.swing.border.LineBorder; - -import netscape.javascript.JSObject; - -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; - -/** - * License: LGPL. - * @author Pavel Vlasov. - * - */ -public class CaptureFrame extends javax.swing.JFrame { - private JPanel capturePanel; - private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss-SSS"); - private int counter; - private CaptureConfig captureConfig; - private AbstractCaptureApplet applet; - private JButton recordButton; - - public CaptureConfig getCaptureConfig() { - return captureConfig; - } - - public CaptureFrame(final AbstractCaptureApplet applet) throws Exception { - super("Screen capture"); - setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("camera.png"))); - - setUndecorated(true); - - Translucener.makeFrameTranslucent(this); - - setAlwaysOnTop(true); - this.applet = applet; - captureConfig = new CaptureConfig(); - captureConfig.load(applet.loadConfig()); - captureConfig.setBackgroundProcessor(applet.getBackgroundProcessor()); - - //--- GUI construction --- - - capturePanel = new JPanel(); - - final JLabel dimensionsLabel = new JLabel(""); - capturePanel.add(dimensionsLabel, BorderLayout.CENTER); - - capturePanel.addComponentListener(new ComponentAdapter() { - - @Override - public void componentResized(ComponentEvent e) { - super.componentResized(e); - dimensionsLabel.setText(e.getComponent().getWidth()+" x "+e.getComponent().getHeight()); - } - }); - - JButton captureButton = new JButton(new AbstractAction() { - - @Override - public void actionPerformed(ActionEvent e) { - Rectangle bounds = capturePanel.getBounds(); - Point loc = bounds.getLocation(); - SwingUtilities.convertPointToScreen(loc, capturePanel); - bounds.setLocation(loc); - Properties props = captureConfig.setRecordingRectangle(bounds); - if (props!=null) { - getApplet().storeConfig(props); - } - capturing.set(true); - setVisible(false); - } - - }); - captureButton.setText("Capture"); - captureButton.setToolTipText("Create a snapshot of the screen"); - capturePanel.add(captureButton, BorderLayout.CENTER); - - recordButton = new JButton(new AbstractAction() { - - @Override - public void actionPerformed(ActionEvent e) { - Rectangle bounds = capturePanel.getBounds(); - Point loc = bounds.getLocation(); - SwingUtilities.convertPointToScreen(loc, capturePanel); - bounds.setLocation(loc); - Properties props = captureConfig.setRecordingRectangle(bounds); - if (props!=null) { - getApplet().storeConfig(props); - } - recording.set(true); - setVisible(false); - } - - }); - recordButton.setText("Record"); - setRecordButtonState(); - capturePanel.add(recordButton, BorderLayout.CENTER); - - JButton optionsButton = new JButton(new AbstractAction() { - - @Override - public void actionPerformed(ActionEvent e) { - new CaptureOptionsDialog(CaptureFrame.this).setVisible(true); - } - - }); - optionsButton.setText("Options"); - capturePanel.add(optionsButton, BorderLayout.CENTER); - - JButton cancelButton = new JButton(new AbstractAction() { - - @Override - public void actionPerformed(ActionEvent e) { - CaptureFrame.this.setVisible(false); - } - - }); - cancelButton.setText("Cancel"); - capturePanel.add(cancelButton, BorderLayout.CENTER); - - getContentPane().add(capturePanel, BorderLayout.CENTER); - - capturePanel.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false)); - - if (captureConfig.getRecordingRectangle()==null) { - setSize(400, 300); - setLocationRelativeTo(null); - } else { - setBounds(captureConfig.getRecordingRectangle()); - } - - Insets dragInsets = new Insets(5, 5, 5, 5); - new ComponentResizer(dragInsets, this); - - ComponentMover cm = new ComponentMover(); - cm.registerComponent(this); - cm.setDragInsets(dragInsets); - - addComponentListener(new ComponentListener() { - - @Override - public void componentShown(ComponentEvent e) { - // TODO Auto-generated method stub - - } - - @Override - public void componentResized(ComponentEvent e) { - // TODO Auto-generated method stub - - } - - @Override - public void componentMoved(ComponentEvent e) { - // TODO Auto-generated method stub - - } - - @Override - public void componentHidden(ComponentEvent e) { - if (capturing.get()) { - capturing.set(false); - try { - capture(); - } catch (Exception ex) { - ex.printStackTrace(); - } - } else if (recording.get()) { - recording.set(false); - record(); - } - } - }); - - } - - void setRecordButtonState() { - if (captureConfig.getEncoder()==null) { - recordButton.setEnabled(false); - recordButton.setToolTipText("Video format not selected. Use Options dialog to select video format."); - } else { - recordButton.setEnabled(true); - recordButton.setToolTipText("Record screen activity and audio"); - } - } - - public AbstractCaptureApplet getApplet() { - return applet; - } - - protected void capture() throws Exception { - try { - Thread.sleep(200); // For Ubuntu. - } catch (InterruptedException ie) { - // Ignore - } - - BufferedImage screenShot = captureConfig.createScreenShot(null, null).call().getRegions().get(0).getImage().getImage(); - - String prefix = getDatePrefix(); - - String defaultImageFormat = applet.getParameter("imageFormat"); - if (defaultImageFormat==null || defaultImageFormat.trim().length()==0) { - defaultImageFormat = "PNG"; - } - final String defaultFileExtension=defaultImageFormat.toLowerCase(); - - final String fileName = JOptionPane.showInputDialog(CaptureFrame.this, "Upload as", applet.getParameter("pageName")+"-capture-"+prefix+"-" + nextCounter() +"."+defaultFileExtension); - if (fileName!=null) { - try { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - int idx = fileName.lastIndexOf('.'); - String imageFormat = idx==-1 ? defaultImageFormat : fileName.substring(idx+1).toUpperCase(); - ImageIO.write(screenShot, imageFormat, baos); - final byte[] imageBytes = baos.toByteArray(); - System.out.println("Image size: "+imageBytes.length); - // Uploading - SwingWorker task = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - - System.out.println("Uploading in background"); - try { - HttpResponse iResponse = applet.post( - CaptureFrame.this, - new ByteArrayInputStream(imageBytes), - imageBytes.length, - fileName, - "application/octet-stream"); - - System.out.println("Response status line: "+iResponse.getStatusLine()); - if (iResponse.getStatusLine().getStatusCode()!=HttpStatus.SC_OK) { - errorMessage = iResponse.getStatusLine(); - errorTitle = "Error saving image"; - return false; - } - return true; - } catch (Error e) { - errorMessage=e.toString(); - errorTitle = "Upload error"; - e.printStackTrace(); - return false; - } - } - - private Object errorMessage; - private String errorTitle; - - protected void done() { - try { - if (get()) { - JSObject window = JSObject.getWindow(applet); - String toEval = "insertAtCarret('"+applet.getParameter("edid")+"','{{:"+fileName+"|}}')"; - System.out.println("Evaluating: "+toEval); - window.eval(toEval); - CaptureFrame.this.setVisible(false); - } else { - JOptionPane.showMessageDialog( - CaptureFrame.this, - errorMessage, - errorTitle, - JOptionPane.ERROR_MESSAGE); - } - } catch (Exception e) { - e.printStackTrace(); - JOptionPane.showMessageDialog( - CaptureFrame.this, - e.toString(), - "Exception", - JOptionPane.ERROR_MESSAGE); - } - }; - - }; - - task.execute(); - } catch (IOException ex) { - JOptionPane.showMessageDialog( - applet, - ex.toString(), - "Error saving image", - JOptionPane.ERROR_MESSAGE); - } - } - } - - public int nextCounter() { - return counter++; - } - - public String getDatePrefix() { - return dateFormat.format(new Date()); - } - - protected void record() { - try { - Thread.sleep(200); // For Ubuntu. - } catch (InterruptedException ie) { - // Ignore - } - - int borderWidth = 1; - JFrame[] borderFrames = new JFrame[4]; - - Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - - Rectangle rr = captureConfig.getRecordingRectangle(); - Color borderColor = Color.RED; - if (rr.x>=borderWidth) { - // West border - borderFrames[0] = new JFrame(); - borderFrames[0].setDefaultCloseOperation(DISPOSE_ON_CLOSE); - borderFrames[0].setSize(borderWidth, rr.height+borderWidth*2); - borderFrames[0].setLocation(rr.x-borderWidth, rr.y-borderWidth); - borderFrames[0].setUndecorated(true); - borderFrames[0].setAlwaysOnTop(true); - borderFrames[0].setFocusableWindowState(false); - borderFrames[0].getContentPane().setBackground(borderColor); - } - if (rr.x+rr.width=borderWidth) { - // North border - borderFrames[2] = new JFrame(); - borderFrames[2].setDefaultCloseOperation(DISPOSE_ON_CLOSE); - borderFrames[2].setSize(rr.width, borderWidth); - borderFrames[2].setLocation(rr.x, rr.y-borderWidth); - borderFrames[2].setUndecorated(true); - borderFrames[2].setAlwaysOnTop(true); - borderFrames[2].setFocusableWindowState(false); - borderFrames[2].getContentPane().setBackground(borderColor); - } - if (rr.y+rr.heightdim.getWidth()) { - x = dim.width-inst.getWidth(); - } else if (x<0) { - x = 0; - } - - int y = rr.getLocation().y+getHeight()+1; - if (y+inst.getHeight()>dim.height) { - y = rr.getLocation().y-inst.getHeight(); - if (y<0) { - y=dim.height-inst.getHeight(); - } - } - inst.setLocation(x, y); - inst.setVisible(true); - } - - private AtomicBoolean capturing = new AtomicBoolean(false); - private AtomicBoolean recording = new AtomicBoolean(false); - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/CaptureOptionsDialog.java b/main/document/jcapture/src/com/hammurapi/jcapture/CaptureOptionsDialog.java deleted file mode 100644 index a4298de0ea..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/CaptureOptionsDialog.java +++ /dev/null @@ -1,606 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.List; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.DataLine; -import javax.sound.sampled.Mixer; -import javax.sound.sampled.TargetDataLine; -import javax.swing.BorderFactory; -import javax.swing.ButtonGroup; -import javax.swing.ComboBoxModel; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JRadioButton; -import javax.swing.JTabbedPane; -import javax.swing.JTextField; -import javax.swing.SwingConstants; - -public class CaptureOptionsDialog extends javax.swing.JDialog { - private JRadioButton sampleSize16Button; - private JTextField timeLineScaleTextField; - private JCheckBox toobarCheckBox; - private JCheckBox videoBorderCheckBox; - private JTextField screenScaleTextField; - private JLabel timelineScalingLabel; - private JLabel screenScalingLabel; - private JTextField fpsTextField; - private JLabel fpsLabel; - private ButtonGroup sampleSizeButtonGroup; - private JComboBox sampleRateComboBox; - private JRadioButton sampleSize8Button; - private JTextField inactivityIntervalTextField; - private JLabel inactivityIntervalLabel; - private JCheckBox inactivityCheckBox; - private JPanel inactivityPanel; - private JPanel scalingPanel; - private JCheckBox stereoCheckBox; - private JLabel sampleSizeLabel; - private JTabbedPane recordingSettingsPane; - private JCheckBox recordSoundCheckBox; - private JLabel sampleRateLabel; - private JComboBox soundLineComboBox; - private JLabel soundSourceLabel; - private JPanel audioSettingsPanel; - private JPanel videoSettingsPanel; - private JButton cancelButton; - private JButton okButton; - private JPanel recordPanel; - private JComboBox encodersComboBox; - private JTextField mp3Text; - - public CaptureOptionsDialog(final CaptureFrame owner) { - super(owner); - setDefaultCloseOperation(DISPOSE_ON_CLOSE); - BorderLayout thisLayout = new BorderLayout(); - this.setLayout(thisLayout); - this.setPreferredSize(new java.awt.Dimension(333, 186)); - - recordPanel = new JPanel(); - this.add(recordPanel); - GridBagLayout recordPanelLayout = new GridBagLayout(); - recordPanelLayout.rowWeights = new double[] { 0.1, 0.0, 0.0, 0.0 }; - recordPanelLayout.rowHeights = new int[] { 7, 7, 20, 7 }; - recordPanelLayout.columnWeights = new double[] { 0.1, 0.0, 0.0, 0.0, 0.0 }; - recordPanelLayout.columnWidths = new int[] { 20, 7, 7, 7, 7 }; - recordPanel.setLayout(recordPanelLayout); - recordPanel.setPreferredSize(new java.awt.Dimension(335, 297)); - - okButton = new JButton(); - recordPanel.add(okButton, new GridBagConstraints(1, 2, 1, 1, 0.0, - 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - okButton.setText("OK"); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - try { - if (recordSoundCheckBox.isSelected()) { - owner.getCaptureConfig().setAudioFormat(audioFormat); - owner.getCaptureConfig().setMixerName((String) soundLineComboBox.getSelectedItem()); - } else { - owner.getCaptureConfig().setRemoveInactivity(inactivityCheckBox.isSelected()); - if (owner.getCaptureConfig().isRemoveInactivity()) { - owner.getCaptureConfig().setInactivityInterval(Double.parseDouble(inactivityIntervalTextField.getText())); - } - } - - owner.getCaptureConfig().setLoop(getLoopCheckBox().isSelected()); - owner.getCaptureConfig().setPlay(getPlayCheckBox().isSelected()); - owner.getCaptureConfig().setMouse(getMouseCheckBox().isSelected()); - owner.getCaptureConfig().setSound(recordSoundCheckBox.isSelected()); - owner.getCaptureConfig().setImageFormat(getImageFormatTextField().getText().trim()); - owner.getCaptureConfig().setBorder(videoBorderCheckBox.isSelected()); - owner.getCaptureConfig().setFramesPerSecond(Float.parseFloat(fpsTextField.getText())); - owner.getCaptureConfig().setScreenScale(Double.parseDouble(screenScaleTextField.getText()) / 100.0); - owner.getCaptureConfig().setSpeedScale((float) (Float.parseFloat(timeLineScaleTextField.getText()) / 100.0)); - owner.getCaptureConfig().setToolBar(toobarCheckBox.isSelected()); - owner.getApplet().storeConfig(owner.getCaptureConfig().store()); - owner.getCaptureConfig().setMp3command(mp3Text.getText()); - owner.getCaptureConfig().setEncoder((VideoEncoder) encodersComboBox.getSelectedItem()); - owner.setRecordButtonState(); - CaptureOptionsDialog.this.setVisible(false); - } catch (Exception e) { - e.printStackTrace(); - JOptionPane.showMessageDialog(CaptureOptionsDialog.this, - e.toString(), "Error in configuration parameters", - JOptionPane.ERROR_MESSAGE); - } - } - }); - - cancelButton = new JButton(); - recordPanel.add(cancelButton, new GridBagConstraints(3, 2, 1, 1, 0.0, - 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - cancelButton.setText("Cancel"); - cancelButton.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - CaptureOptionsDialog.this.setVisible(false); - } - }); - - recordingSettingsPane = new JTabbedPane(); - recordPanel.add(recordingSettingsPane, new GridBagConstraints(0, 0, 5, - 1, 0.0, 0.0, GridBagConstraints.CENTER, - GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); - - videoSettingsPanel = new JPanel(); - GridBagLayout videoSettingsPanelLayout = new GridBagLayout(); - recordingSettingsPane.addTab("Video", null, videoSettingsPanel, null); - videoSettingsPanel.setPreferredSize(new java.awt.Dimension(112, 207)); - videoSettingsPanelLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1 }; - videoSettingsPanelLayout.rowHeights = new int[] { 7, 7, 7, 7, 7, 7, 7, 20 }; - videoSettingsPanelLayout.columnWeights = new double[] { 0.0, 0.0, 0.0, - 0.0, 0.0, 0.0, 0.0, 0.0, 0.1 }; - videoSettingsPanelLayout.columnWidths = new int[] { 115, 7, 40, 7, 20, - 7, 20, 7, 20 }; - videoSettingsPanel.setLayout(videoSettingsPanelLayout); - - scalingPanel = new JPanel(); - GridBagLayout scalingPanelLayout = new GridBagLayout(); - videoSettingsPanel.add(scalingPanel, new GridBagConstraints(0, 6, 1, 1, - 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, - new Insets(0, 0, 0, 0), 0, 0)); - scalingPanel.setBorder(BorderFactory.createTitledBorder("Scaling (%)")); - scalingPanelLayout.rowWeights = new double[] { 0.1, 0.0, 0.1 }; - scalingPanelLayout.rowHeights = new int[] { 7, 7, 7 }; - scalingPanelLayout.columnWeights = new double[] { 0.0, 0.0, 0.1 }; - scalingPanelLayout.columnWidths = new int[] { 7, 7, 7 }; - scalingPanel.setLayout(scalingPanelLayout); - scalingPanel.add(getScreenScalingLabel(), new GridBagConstraints(0, 0, - 1, 1, 0.0, 0.0, GridBagConstraints.EAST, - GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); - scalingPanel.add(getTimelineScalingLabel(), new GridBagConstraints(0, - 2, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, - GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); - scalingPanel.add(getScreenScaleTextField(), new GridBagConstraints(2, - 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, - GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); - scalingPanel.add(getTimeLineScaleTextField(), new GridBagConstraints(2, - 2, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, - GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); - - inactivityPanel = new JPanel(); - GridBagLayout inactivityPanelLayout = new GridBagLayout(); - videoSettingsPanel.add(inactivityPanel, new GridBagConstraints(2, 6, 8, - 1, 0.0, 0.0, GridBagConstraints.WEST, - GridBagConstraints.VERTICAL, new Insets(0, 0, 0, 0), 0, 0)); - videoSettingsPanel.add(getFpsLabel(), new GridBagConstraints(0, 0, 1, - 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - videoSettingsPanel.add(getFpsTextField(), new GridBagConstraints(2, 0, - 1, 1, 0.0, 0.0, GridBagConstraints.WEST, - GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); - - videoSettingsPanel.add(getImageFormatLabel(), new GridBagConstraints(0, 2, 1, - 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - videoSettingsPanel.add(getImageFormatTextField(), new GridBagConstraints(2, 2, - 1, 1, 0.0, 0.0, GridBagConstraints.WEST, - GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); - - videoSettingsPanel.add(getEncoderLabel(), new GridBagConstraints(0, 4, 1, - 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - videoSettingsPanel.add(getEncoderComboBox(), new GridBagConstraints(2, 4, - 6, 1, 0.0, 0.0, GridBagConstraints.WEST, - GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); - - videoSettingsPanel.add(getVideoBorderCheckBox(), - new GridBagConstraints(4, 0, 1, 1, 0.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - videoSettingsPanel.add(getLoopCheckBox(), - new GridBagConstraints(6, 2, 1, 1, 0.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - videoSettingsPanel.add(getPlayCheckBox(), - new GridBagConstraints(8, 2, 1, 1, 0.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - videoSettingsPanel.add(getMouseCheckBox(), - new GridBagConstraints(4, 2, 1, 1, 0.0, 0.0, - GridBagConstraints.WEST, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - videoSettingsPanel.add(getJToobarCheckBox(), new GridBagConstraints(6, - 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, - GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); - inactivityPanel.setBorder(BorderFactory - .createTitledBorder("Inactivity processing")); - inactivityPanel - .setToolTipText("Inactivity handling, enabled if audio is not being recorded."); - inactivityPanelLayout.rowWeights = new double[] { 0.0, 0.0, 0.0 }; - inactivityPanelLayout.rowHeights = new int[] { 7, 7, 7 }; - inactivityPanelLayout.columnWeights = new double[] { 0.0, 0.0, 0.0, - 0.0, 0.1 }; - inactivityPanelLayout.columnWidths = new int[] { 7, 7, 7, 47, 7 }; - inactivityPanel.setLayout(inactivityPanelLayout); - inactivityPanel.setEnabled(false); - - inactivityCheckBox = new JCheckBox(); - inactivityPanel.add(inactivityCheckBox, new GridBagConstraints(1, 0, 4, - 1, 0.0, 0.0, GridBagConstraints.WEST, - GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); - inactivityCheckBox.setText("Remove inactivity"); - inactivityCheckBox.setEnabled(false); - - inactivityIntervalLabel = new JLabel(); - inactivityPanel.add(inactivityIntervalLabel, new GridBagConstraints(1, - 2, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, - GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); - inactivityIntervalLabel.setText("Inactivity interval (sec)"); - inactivityIntervalLabel.setEnabled(false); - - inactivityIntervalTextField = new JTextField(); - inactivityPanel.add(inactivityIntervalTextField, - new GridBagConstraints(3, 2, 1, 1, 0.0, 0.0, - GridBagConstraints.CENTER, - GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), - 0, 0)); - inactivityIntervalTextField.setText("0.7"); - inactivityIntervalTextField.setEnabled(false); - - audioSettingsPanel = new JPanel(); - GridBagLayout audioSettingsPanelLayout = new GridBagLayout(); - recordingSettingsPane.addTab("Audio", null, audioSettingsPanel, null); - audioSettingsPanelLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, - 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1 }; - audioSettingsPanelLayout.rowHeights = new int[] { 7, 7, 7, 7, 7, 7, 7, 7, 7, - 20 }; - audioSettingsPanelLayout.columnWeights = new double[] { 0.0, 0.0, 0.0, - 0.0, 0.0, 0.0, 0.1 }; - audioSettingsPanelLayout.columnWidths = new int[] { 7, 7, 49, 7, 135, - 7, 20 }; - audioSettingsPanel.setLayout(audioSettingsPanelLayout); - - sampleSize16Button = new JRadioButton(); - audioSettingsPanel.add(sampleSize16Button, new GridBagConstraints(4, 4, - 1, 1, 0.0, 0.0, GridBagConstraints.WEST, - GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); - sampleSize16Button.setText("16"); - sampleSize16Button.setSelected(true); - getSampleSizeButtonGroup().add(sampleSize16Button); - sampleSize16Button.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - selectSoundSource(); - } - }); - - recordSoundCheckBox = new JCheckBox(); - audioSettingsPanel.add(recordSoundCheckBox, new GridBagConstraints(0, - 0, 4, 1, 0.0, 0.0, GridBagConstraints.WEST, - GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); - recordSoundCheckBox.setText("Record sound"); - recordSoundCheckBox.setSelected(true); - recordSoundCheckBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - onSetSound(); - } - }); - - soundSourceLabel = new JLabel(); - audioSettingsPanel.add(soundSourceLabel, new GridBagConstraints(0, 6, - 1, 1, 0.0, 0.0, GridBagConstraints.EAST, - GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); - soundSourceLabel.setText("Source"); - - soundLineComboBox = new JComboBox(); - audioSettingsPanel.add(soundLineComboBox, new GridBagConstraints(2, 6, - 3, 1, 0.0, 0.0, GridBagConstraints.CENTER, - GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); - - audioSettingsPanel.add(new JLabel("WAV2MP3 command"), new GridBagConstraints(0, 8, - 1, 1, 0.0, 0.0, GridBagConstraints.EAST, - GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); - - mp3Text = new JTextField(); - audioSettingsPanel.add(mp3Text, new GridBagConstraints(2, 8, - 5, 1, 0.0, 0.0, GridBagConstraints.CENTER, - GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); - - sampleRateLabel = new JLabel(); - audioSettingsPanel.add(sampleRateLabel, new GridBagConstraints(0, 2, 1, - 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - sampleRateLabel.setText("Sample rate (khz)"); - - sampleSizeLabel = new JLabel(); - audioSettingsPanel.add(sampleSizeLabel, new GridBagConstraints(0, 4, 1, - 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - sampleSizeLabel.setText("Sample size (bits)"); - - stereoCheckBox = new JCheckBox(); - audioSettingsPanel.add(stereoCheckBox, new GridBagConstraints(4, 2, 1, - 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, - new Insets(0, 0, 0, 0), 0, 0)); - stereoCheckBox.setText("Stereo"); - stereoCheckBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - selectSoundSource(); - } - }); - - sampleSize8Button = new JRadioButton(); - audioSettingsPanel.add(sampleSize8Button, new GridBagConstraints(2, 4, - 1, 1, 0.0, 0.0, GridBagConstraints.WEST, - GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); - sampleSize8Button.setText("8"); - getSampleSizeButtonGroup().add(sampleSize8Button); - sampleSize8Button.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - selectSoundSource(); - } - }); - - ComboBoxModel sampleRateComboBoxModel = new DefaultComboBoxModel( - new String[] { "5.5", "11", "22", "44" }); - sampleRateComboBox = new JComboBox(); - audioSettingsPanel.add(sampleRateComboBox, new GridBagConstraints(2, 2, - 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, - GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); - sampleRateComboBox.setModel(sampleRateComboBoxModel); - sampleRateComboBox.setSelectedIndex(2); - sampleRateComboBox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - selectSoundSource(); - } - }); - - getImageFormatTextField().setText(owner.getCaptureConfig().getImageFormat()); - - recordSoundCheckBox.setSelected(owner.getCaptureConfig().isSound()); - stereoCheckBox.setSelected(owner.getCaptureConfig().getAudioFormat().getChannels()>1); - if (owner.getCaptureConfig().getAudioFormat().getSampleSizeInBits()==8) { - sampleSize8Button.setSelected(true); - } else { - sampleSize16Button.setSelected(true); - } - - float sampleRate = owner.getCaptureConfig().getAudioFormat().getSampleRate(); - float proximity = Math.abs(sampleRate-sampleRates[0]); - sampleRateComboBox.setSelectedIndex(0); - for (int i=1; i soundLineComboBoxModel; - private JLabel imageFormatLabel; - private JTextField imageFormatTextField; - private JCheckBox mouseCheckBox; - private JCheckBox playCheckBox; - private JCheckBox loopCheckBox; - private JLabel encoderLabel; - - private void selectSoundSource() { - audioFormat = new AudioFormat( - sampleRates[sampleRateComboBox.getSelectedIndex()], - sampleSize8Button.isSelected() ? 8 : 16, - stereoCheckBox.isSelected() ? 2 : 1, true, false); - - String sourceName = (String) soundLineComboBox.getSelectedItem(); - - if (soundLineComboBoxModel == null) { - soundLineComboBoxModel = new DefaultComboBoxModel(); - soundLineComboBox.setModel(soundLineComboBoxModel); - } else { - soundLineComboBoxModel.removeAllElements(); - } - - DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat); - - boolean hasSourceName = false; - for (Mixer.Info mi : AudioSystem.getMixerInfo()) { - Mixer mx = AudioSystem.getMixer(mi); - if (mx.isLineSupported(info)) { - soundLineComboBoxModel.addElement(mi.getName()); - if (sourceName!=null && mi.getName().equals(sourceName)) { - hasSourceName = true; - } - } - } - - if (hasSourceName) { - soundLineComboBoxModel.setSelectedItem(sourceName); - } - } - - private ButtonGroup getSampleSizeButtonGroup() { - if (sampleSizeButtonGroup == null) { - sampleSizeButtonGroup = new ButtonGroup(); - } - return sampleSizeButtonGroup; - } - - private JLabel getFpsLabel() { - if (fpsLabel == null) { - fpsLabel = new JLabel(); - fpsLabel.setText("Frames Per Second"); - } - return fpsLabel; - } - - private JTextField getFpsTextField() { - if (fpsTextField == null) { - fpsTextField = new JTextField(); - fpsTextField.setText("10"); - fpsTextField.setSize(30, 23); - } - return fpsTextField; - } - - private JLabel getImageFormatLabel() { - if (imageFormatLabel == null) { - imageFormatLabel = new JLabel(); - imageFormatLabel.setText("Image format"); - } - return imageFormatLabel; - } - - private JTextField getImageFormatTextField() { - if (imageFormatTextField == null) { - imageFormatTextField = new JTextField(); - imageFormatTextField.setText("png"); - imageFormatTextField.setSize(30, 23); - } - return imageFormatTextField; - } - - private JLabel getEncoderLabel() { - if (encoderLabel == null) { - encoderLabel = new JLabel(); - encoderLabel.setText("Video format"); - } - return encoderLabel; - } - - private JComboBox getEncoderComboBox() { - if (encodersComboBox == null) { - List el = ((CaptureFrame) getOwner()).getCaptureConfig().getEncoders(); - encodersComboBox = new JComboBox(el.toArray(new VideoEncoder[el.size()])); -// encodersComboBox.setSize(30, 23); - } - return encodersComboBox; - } - - private JLabel getScreenScalingLabel() { - if (screenScalingLabel == null) { - screenScalingLabel = new JLabel(); - screenScalingLabel.setText("Graphics"); - } - return screenScalingLabel; - } - - private JLabel getTimelineScalingLabel() { - if (timelineScalingLabel == null) { - timelineScalingLabel = new JLabel(); - timelineScalingLabel.setText("Speed"); - } - return timelineScalingLabel; - } - - private JTextField getScreenScaleTextField() { - if (screenScaleTextField == null) { - screenScaleTextField = new JTextField(); - screenScaleTextField.setText("100"); - } - return screenScaleTextField; - } - - private JTextField getTimeLineScaleTextField() { - if (timeLineScaleTextField == null) { - timeLineScaleTextField = new JTextField(); - timeLineScaleTextField.setText("100"); - } - return timeLineScaleTextField; - } - - private JCheckBox getVideoBorderCheckBox() { - if (videoBorderCheckBox == null) { - videoBorderCheckBox = new JCheckBox(); - videoBorderCheckBox.setText("Border"); - } - return videoBorderCheckBox; - } - - private JCheckBox getMouseCheckBox() { - if (mouseCheckBox == null) { - mouseCheckBox = new JCheckBox(); - mouseCheckBox.setText("Mouse"); - } - return mouseCheckBox; - } - - private JCheckBox getLoopCheckBox() { - if (loopCheckBox == null) { - loopCheckBox = new JCheckBox(); - loopCheckBox.setText("Loop"); - } - return loopCheckBox; - } - - private JCheckBox getPlayCheckBox() { - if (playCheckBox == null) { - playCheckBox = new JCheckBox(); - playCheckBox.setText("Play"); - } - return playCheckBox; - } - - private JCheckBox getJToobarCheckBox() { - if (toobarCheckBox == null) { - toobarCheckBox = new JCheckBox(); - toobarCheckBox.setText("Toolbar"); - toobarCheckBox.setSelected(true); - } - return toobarCheckBox; - } - - void onSetSound() { - for (Component child : recordSoundCheckBox.getParent().getComponents()) { - if (child != recordSoundCheckBox) { - child.setEnabled(recordSoundCheckBox.isSelected()); - } - } - inactivityPanel.setEnabled(!recordSoundCheckBox.isSelected()); - timeLineScaleTextField.setEnabled(!recordSoundCheckBox.isSelected()); - for (Component child : inactivityPanel.getComponents()) { - child.setEnabled(!recordSoundCheckBox.isSelected()); - } - } - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/ComponentMover.java b/main/document/jcapture/src/com/hammurapi/jcapture/ComponentMover.java deleted file mode 100644 index 29526cc1d9..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/ComponentMover.java +++ /dev/null @@ -1,361 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.Component; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.GraphicsEnvironment; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Window; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import javax.swing.JComponent; -import javax.swing.SwingUtilities; - -/** - * This class allows you to move a Component by using a mouse. The Component - * moved can be a high level Window (ie. Window, Frame, Dialog) in which case - * the Window is moved within the desktop. Or the Component can belong to a - * Container in which case the Component is moved within the Container. - * - * When moving a Window, the listener can be added to a child Component of the - * Window. In this case attempting to move the child will result in the Window - * moving. For example, you might create a custom "Title Bar" for an undecorated - * Window and moving of the Window is accomplished by moving the title bar only. - * Multiple components can be registered as "window movers". - * - * Components can be registered when the class is created. Additional components - * can be added at any time using the registerComponent() method. - * - * Taken from http://tips4java.wordpress.com/2009/06/14/moving-windows/ - */ -public class ComponentMover extends MouseAdapter { - private Insets dragInsets = new Insets(0, 0, 0, 0); - private Dimension snapSize = new Dimension(1, 1); - private Insets edgeInsets = new Insets(0, 0, 0, 0); - private boolean changeCursor = true; - private boolean autoLayout = false; - - private Class destinationClass; - private Component destinationComponent; - private Component destination; - private Component source; - - private Point pressed; - private Point location; - - private Cursor originalCursor; - private boolean autoscrolls; - private boolean potentialDrag; - - /** - * Constructor for moving individual components. The components must be - * regisetered using the registerComponent() method. - */ - public ComponentMover() { - } - - /** - * Constructor to specify a Class of Component that will be moved when drag - * events are generated on a registered child component. The events will be - * passed to the first ancestor of this specified class. - * - * @param destinationClass - * the Class of the ancestor component - * @param component - * the Components to be registered for forwarding drag events to - * the ancestor Component. - */ - public ComponentMover(Class destinationClass, Component... components) { - this.destinationClass = destinationClass; - registerComponent(components); - } - - /** - * Constructor to specify a parent component that will be moved when drag - * events are generated on a registered child component. - * - * @param destinationComponent - * the component drage events should be forwareded to - * @param components - * the Components to be registered for forwarding drag events to - * the parent component to be moved - */ - public ComponentMover(Component destinationComponent, - Component... components) { - this.destinationComponent = destinationComponent; - registerComponent(components); - } - - /** - * Get the auto layout property - * - * @return the auto layout property - */ - public boolean isAutoLayout() { - return autoLayout; - } - - /** - * Set the auto layout property - * - * @param autoLayout - * when true layout will be invoked on the parent container - */ - public void setAutoLayout(boolean autoLayout) { - this.autoLayout = autoLayout; - } - - /** - * Get the change cursor property - * - * @return the change cursor property - */ - public boolean isChangeCursor() { - return changeCursor; - } - - /** - * Set the change cursor property - * - * @param changeCursor - * when true the cursor will be changed to the Cursor.MOVE_CURSOR - * while the mouse is pressed - */ - public void setChangeCursor(boolean changeCursor) { - this.changeCursor = changeCursor; - } - - /** - * Get the drag insets - * - * @return the drag insets - */ - public Insets getDragInsets() { - return dragInsets; - } - - /** - * Set the drag insets. The insets specify an area where mouseDragged events - * should be ignored and therefore the component will not be moved. This - * will prevent these events from being confused with a MouseMotionListener - * that supports component resizing. - * - * @param dragInsets - */ - public void setDragInsets(Insets dragInsets) { - this.dragInsets = dragInsets; - } - - /** - * Get the bounds insets - * - * @return the bounds insets - */ - public Insets getEdgeInsets() { - return edgeInsets; - } - - /** - * Set the edge insets. The insets specify how close to each edge of the - * parent component that the child component can be moved. Positive values - * means the component must be contained within the parent. Negative values - * means the component can be moved outside the parent. - * - * @param edgeInsets - */ - public void setEdgeInsets(Insets edgeInsets) { - this.edgeInsets = edgeInsets; - } - - /** - * Remove listeners from the specified component - * - * @param component - * the component the listeners are removed from - */ - public void deregisterComponent(Component... components) { - for (Component component : components) - component.removeMouseListener(this); - } - - /** - * Add the required listeners to the specified component - * - * @param component - * the component the listeners are added to - */ - public void registerComponent(Component... components) { - for (Component component : components) - component.addMouseListener(this); - } - - /** - * Get the snap size - * - * @return the snap size - */ - public Dimension getSnapSize() { - return snapSize; - } - - /** - * Set the snap size. Forces the component to be snapped to the closest grid - * position. Snapping will occur when the mouse is dragged half way. - */ - public void setSnapSize(Dimension snapSize) { - if (snapSize.width < 1 || snapSize.height < 1) - throw new IllegalArgumentException( - "Snap sizes must be greater than 0"); - - this.snapSize = snapSize; - } - - /** - * Setup the variables used to control the moving of the component: - * - * source - the source component of the mouse event destination - the - * component that will ultimately be moved pressed - the Point where the - * mouse was pressed in the destination component coordinates. - */ - @Override - public void mousePressed(MouseEvent e) { - source = e.getComponent(); - int width = source.getSize().width - dragInsets.left - dragInsets.right; - int height = source.getSize().height - dragInsets.top - - dragInsets.bottom; - Rectangle r = new Rectangle(dragInsets.left, dragInsets.top, width, - height); - - if (r.contains(e.getPoint())) - setupForDragging(e); - } - - private void setupForDragging(MouseEvent e) { - source.addMouseMotionListener(this); - potentialDrag = true; - - // Determine the component that will ultimately be moved - - if (destinationComponent != null) { - destination = destinationComponent; - } else if (destinationClass == null) { - destination = source; - } else // forward events to destination component - { - destination = SwingUtilities.getAncestorOfClass(destinationClass, - source); - } - - pressed = e.getLocationOnScreen(); - location = destination.getLocation(); - - if (changeCursor) { - originalCursor = source.getCursor(); - source.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); - } - - // Making sure autoscrolls is false will allow for smoother dragging of - // individual components - - if (destination instanceof JComponent) { - JComponent jc = (JComponent) destination; - autoscrolls = jc.getAutoscrolls(); - jc.setAutoscrolls(false); - } - } - - /** - * Move the component to its new location. The dragged Point must be in the - * destination coordinates. - */ - @Override - public void mouseDragged(MouseEvent e) { - Point dragged = e.getLocationOnScreen(); - int dragX = getDragDistance(dragged.x, pressed.x, snapSize.width); - int dragY = getDragDistance(dragged.y, pressed.y, snapSize.height); - - int locationX = location.x + dragX; - int locationY = location.y + dragY; - - // Mouse dragged events are not generated for every pixel the mouse - // is moved. Adjust the location to make sure we are still on a - // snap value. - -// while (locationX < edgeInsets.left) -// locationX += snapSize.width; -// -// while (locationY < edgeInsets.top) -// locationY += snapSize.height; -// -// Dimension d = getBoundingSize(destination); - -// while (locationX + destination.getSize().width + edgeInsets.right > d.width) -// locationX -= snapSize.width; -// -// while (locationY + destination.getSize().height + edgeInsets.bottom > d.height) -// locationY -= snapSize.height; - - // Adjustments are finished, move the component - - destination.setLocation(locationX, locationY); - } - - /* - * Determine how far the mouse has moved from where dragging started (Assume - * drag direction is down and right for positive drag distance) - */ - private int getDragDistance(int larger, int smaller, int snapSize) { - int halfway = snapSize / 2; - int drag = larger - smaller; - drag += (drag < 0) ? -halfway : halfway; - drag = (drag / snapSize) * snapSize; - - return drag; - } - - /* - * Get the bounds of the parent of the dragged component. - */ - private Dimension getBoundingSize(Component source) { - if (source instanceof Window) { - GraphicsEnvironment env = GraphicsEnvironment - .getLocalGraphicsEnvironment(); - Rectangle bounds = env.getMaximumWindowBounds(); - return new Dimension(bounds.width, bounds.height); - } else { - return source.getParent().getSize(); - } - } - - /** - * Restore the original state of the Component - */ - @Override - public void mouseReleased(MouseEvent e) { - if (!potentialDrag) - return; - - source.removeMouseMotionListener(this); - potentialDrag = false; - - if (changeCursor) - source.setCursor(originalCursor); - - if (destination instanceof JComponent) { - ((JComponent) destination).setAutoscrolls(autoscrolls); - } - - // Layout the components on the parent container - - if (autoLayout) { - if (destination instanceof JComponent) { - ((JComponent) destination).revalidate(); - } else { - destination.validate(); - } - } - } -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/ComponentResizer.java b/main/document/jcapture/src/com/hammurapi/jcapture/ComponentResizer.java deleted file mode 100644 index 513c2bdb5b..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/ComponentResizer.java +++ /dev/null @@ -1,446 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.Component; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.GraphicsEnvironment; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Window; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.HashMap; -import java.util.Map; - -import javax.swing.JComponent; -import javax.swing.SwingUtilities; - -/** - * The ComponentResizer allows you to resize a component by dragging a border of - * the component. - * - * Taken from http://tips4java.wordpress.com/2009/09/13/resizing-components/ - */ -public class ComponentResizer extends MouseAdapter { - private final static Dimension MINIMUM_SIZE = new Dimension(10, 10); - private final static Dimension MAXIMUM_SIZE = new Dimension( - Integer.MAX_VALUE, Integer.MAX_VALUE); - - private static Map cursors = new HashMap(); - { - cursors.put(1, Cursor.N_RESIZE_CURSOR); - cursors.put(2, Cursor.W_RESIZE_CURSOR); - cursors.put(4, Cursor.S_RESIZE_CURSOR); - cursors.put(8, Cursor.E_RESIZE_CURSOR); - cursors.put(3, Cursor.NW_RESIZE_CURSOR); - cursors.put(9, Cursor.NE_RESIZE_CURSOR); - cursors.put(6, Cursor.SW_RESIZE_CURSOR); - cursors.put(12, Cursor.SE_RESIZE_CURSOR); - } - - private Insets dragInsets; - private Dimension snapSize; - - private int direction; - protected static final int NORTH = 1; - protected static final int WEST = 2; - protected static final int SOUTH = 4; - protected static final int EAST = 8; - - private Cursor sourceCursor; - private boolean resizing; - private Rectangle bounds; - private Point pressed; - private boolean autoscrolls; - - private Dimension minimumSize = MINIMUM_SIZE; - private Dimension maximumSize = MAXIMUM_SIZE; - - /** - * Convenience contructor. All borders are resizable in increments of a - * single pixel. Components must be registered separately. - */ - public ComponentResizer() { - this(new Insets(5, 5, 5, 5), new Dimension(1, 1)); - } - - /** - * Convenience contructor. All borders are resizable in increments of a - * single pixel. Components can be registered when the class is created or - * they can be registered separately afterwards. - * - * @param components - * components to be automatically registered - */ - public ComponentResizer(Component... components) { - this(new Insets(5, 5, 5, 5), new Dimension(1, 1), components); - } - - /** - * Convenience contructor. Eligible borders are resisable in increments of a - * single pixel. Components can be registered when the class is created or - * they can be registered separately afterwards. - * - * @param dragInsets - * Insets specifying which borders are eligible to be resized. - * @param components - * components to be automatically registered - */ - public ComponentResizer(Insets dragInsets, Component... components) { - this(dragInsets, new Dimension(1, 1), components); - } - - /** - * Create a ComponentResizer. - * - * @param dragInsets - * Insets specifying which borders are eligible to be resized. - * @param snapSize - * Specify the dimension to which the border will snap to when - * being dragged. Snapping occurs at the halfway mark. - * @param components - * components to be automatically registered - */ - public ComponentResizer(Insets dragInsets, Dimension snapSize, - Component... components) { - setDragInsets(dragInsets); - setSnapSize(snapSize); - registerComponent(components); - } - - /** - * Get the drag insets - * - * @return the drag insets - */ - public Insets getDragInsets() { - return dragInsets; - } - - /** - * Set the drag dragInsets. The insets specify an area where mouseDragged - * events are recognized from the edge of the border inwards. A value of 0 - * for any size will imply that the border is not resizable. Otherwise the - * appropriate drag cursor will appear when the mouse is inside the - * resizable border area. - * - * @param dragInsets - * Insets to control which borders are resizeable. - */ - public void setDragInsets(Insets dragInsets) { - validateMinimumAndInsets(minimumSize, dragInsets); - - this.dragInsets = dragInsets; - } - - /** - * Get the components maximum size. - * - * @return the maximum size - */ - public Dimension getMaximumSize() { - return maximumSize; - } - - /** - * Specify the maximum size for the component. The component will still be - * constrained by the size of its parent. - * - * @param maximumSize - * the maximum size for a component. - */ - public void setMaximumSize(Dimension maximumSize) { - this.maximumSize = maximumSize; - } - - /** - * Get the components minimum size. - * - * @return the minimum size - */ - public Dimension getMinimumSize() { - return minimumSize; - } - - /** - * Specify the minimum size for the component. The minimum size is - * constrained by the drag insets. - * - * @param minimumSize - * the minimum size for a component. - */ - public void setMinimumSize(Dimension minimumSize) { - validateMinimumAndInsets(minimumSize, dragInsets); - - this.minimumSize = minimumSize; - } - - /** - * Remove listeners from the specified component - * - * @param component - * the component the listeners are removed from - */ - public void deregisterComponent(Component... components) { - for (Component component : components) { - component.removeMouseListener(this); - component.removeMouseMotionListener(this); - } - } - - /** - * Add the required listeners to the specified component - * - * @param component - * the component the listeners are added to - */ - public void registerComponent(Component... components) { - for (Component component : components) { - component.addMouseListener(this); - component.addMouseMotionListener(this); - } - } - - /** - * Get the snap size. - * - * @return the snap size. - */ - public Dimension getSnapSize() { - return snapSize; - } - - /** - * Control how many pixels a border must be dragged before the size of the - * component is changed. The border will snap to the size once dragging has - * passed the halfway mark. - * - * @param snapSize - * Dimension object allows you to separately spcify a horizontal - * and vertical snap size. - */ - public void setSnapSize(Dimension snapSize) { - this.snapSize = snapSize; - } - - /** - * When the components minimum size is less than the drag insets then we - * can't determine which border should be resized so we need to prevent this - * from happening. - */ - private void validateMinimumAndInsets(Dimension minimum, Insets drag) { - int minimumWidth = drag.left + drag.right; - int minimumHeight = drag.top + drag.bottom; - - if (minimum.width < minimumWidth || minimum.height < minimumHeight) { - String message = "Minimum size cannot be less than drag insets"; - throw new IllegalArgumentException(message); - } - } - - /** - */ - @Override - public void mouseMoved(MouseEvent e) { - Component source = e.getComponent(); - Point location = e.getPoint(); - direction = 0; - - if (location.x < dragInsets.left) - direction += WEST; - - if (location.x > source.getWidth() - dragInsets.right - 1) - direction += EAST; - - if (location.y < dragInsets.top) - direction += NORTH; - - if (location.y > source.getHeight() - dragInsets.bottom - 1) - direction += SOUTH; - - // Mouse is no longer over a resizable border - - if (direction == 0) { - source.setCursor(sourceCursor); - } else // use the appropriate resizable cursor - { - int cursorType = cursors.get(direction); - Cursor cursor = Cursor.getPredefinedCursor(cursorType); - source.setCursor(cursor); - } - } - - @Override - public void mouseEntered(MouseEvent e) { - if (!resizing) { - Component source = e.getComponent(); - sourceCursor = source.getCursor(); - } - } - - @Override - public void mouseExited(MouseEvent e) { - if (!resizing) { - Component source = e.getComponent(); - source.setCursor(sourceCursor); - } - } - - @Override - public void mousePressed(MouseEvent e) { - // The mouseMoved event continually updates this variable - - if (direction == 0) - return; - - // Setup for resizing. All future dragging calculations are done based - // on the original bounds of the component and mouse pressed location. - - resizing = true; - - Component source = e.getComponent(); - pressed = e.getPoint(); - SwingUtilities.convertPointToScreen(pressed, source); - bounds = source.getBounds(); - - // Making sure autoscrolls is false will allow for smoother resizing - // of components - - if (source instanceof JComponent) { - JComponent jc = (JComponent) source; - autoscrolls = jc.getAutoscrolls(); - jc.setAutoscrolls(false); - } - } - - /** - * Restore the original state of the Component - */ - @Override - public void mouseReleased(MouseEvent e) { - resizing = false; - - Component source = e.getComponent(); - source.setCursor(sourceCursor); - - if (source instanceof JComponent) { - ((JComponent) source).setAutoscrolls(autoscrolls); - } - } - - /** - * Resize the component ensuring location and size is within the bounds of - * the parent container and that the size is within the minimum and maximum - * constraints. - * - * All calculations are done using the bounds of the component when the - * resizing started. - */ - @Override - public void mouseDragged(MouseEvent e) { - if (resizing == false) - return; - - Component source = e.getComponent(); - Point dragged = e.getPoint(); - SwingUtilities.convertPointToScreen(dragged, source); - - changeBounds(source, direction, bounds, pressed, dragged); - } - - protected void changeBounds(Component source, int direction, - Rectangle bounds, Point pressed, Point current) { - // Start with original locaton and size - - int x = bounds.x; - int y = bounds.y; - int width = bounds.width; - int height = bounds.height; - - // Resizing the West or North border affects the size and location - - if (WEST == (direction & WEST)) { - int drag = getDragDistance(pressed.x, current.x, snapSize.width); - int maximum = Math.min(width + x, maximumSize.width); - drag = getDragBounded(drag, snapSize.width, width, - minimumSize.width, maximum); - - x -= drag; - width += drag; - } - - if (NORTH == (direction & NORTH)) { - int drag = getDragDistance(pressed.y, current.y, snapSize.height); - int maximum = Math.min(height + y, maximumSize.height); - drag = getDragBounded(drag, snapSize.height, height, - minimumSize.height, maximum); - - y -= drag; - height += drag; - } - - // Resizing the East or South border only affects the size - - if (EAST == (direction & EAST)) { - int drag = getDragDistance(current.x, pressed.x, snapSize.width); - Dimension boundingSize = getBoundingSize(source); - int maximum = Math.min(boundingSize.width - x, maximumSize.width); - drag = getDragBounded(drag, snapSize.width, width, - minimumSize.width, maximum); - width += drag; - } - - if (SOUTH == (direction & SOUTH)) { - int drag = getDragDistance(current.y, pressed.y, snapSize.height); - Dimension boundingSize = getBoundingSize(source); - int maximum = Math.min(boundingSize.height - y, maximumSize.height); - drag = getDragBounded(drag, snapSize.height, height, - minimumSize.height, maximum); - height += drag; - } - - source.setBounds(x, y, width, height); - source.validate(); - } - - /* - * Determine how far the mouse has moved from where dragging started - */ - private int getDragDistance(int larger, int smaller, int snapSize) { - int halfway = snapSize / 2; - int drag = larger - smaller; - drag += (drag < 0) ? -halfway : halfway; - drag = (drag / snapSize) * snapSize; - - return drag; - } - - /* - * Adjust the drag value to be within the minimum and maximum range. - */ - private int getDragBounded(int drag, int snapSize, int dimension, - int minimum, int maximum) { - while (dimension + drag < minimum) - drag += snapSize; - - while (dimension + drag > maximum) - drag -= snapSize; - - return drag; - } - - /* - * Keep the size of the component within the bounds of its parent. - */ - private Dimension getBoundingSize(Component source) { - if (source instanceof Window) { - GraphicsEnvironment env = GraphicsEnvironment - .getLocalGraphicsEnvironment(); - Rectangle bounds = env.getMaximumWindowBounds(); - return new Dimension(bounds.width, bounds.height); - } else { - return source.getParent().getSize(); - } - } -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/FragmentImpl.java b/main/document/jcapture/src/com/hammurapi/jcapture/FragmentImpl.java deleted file mode 100644 index 0d4b066af9..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/FragmentImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.hammurapi.jcapture; - -import java.io.File; -import java.util.List; - -import com.hammurapi.jcapture.VideoEncoder.Fragment; - -class FragmentImpl implements Fragment { - - private File audio; - private List frames; - - FragmentImpl( List frames, File audio) { - this.audio = audio; - this.frames = frames; - } - - @Override - public List getFrames() { - return frames; - } - - @Override - public File getAudio() { - return audio; - } - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/FrameImpl.java b/main/document/jcapture/src/com/hammurapi/jcapture/FrameImpl.java deleted file mode 100644 index 69172c0f42..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/FrameImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.Dimension; -import java.awt.Point; -import java.util.List; - -import com.hammurapi.jcapture.VideoEncoder.Fragment.Frame; - -class FrameImpl implements Frame { - - private List shapes; - private Point mousePointer; - private Dimension size; - private boolean isActive; - - FrameImpl(List shapes, Point mousePointer, Dimension size, boolean isActive) { - super(); - this.shapes = shapes; - this.mousePointer = mousePointer; - this.size = size; - this.isActive = isActive; - } - - /** - * Merges frame before this frame into this frame by incorporating its shapes. - * This method is used for merging deleted frames. - * @param frame - */ - void merge(Frame frame) { - for (Shape shape: shapes) { - if (shape.getContent().coversEverything()) { - return; // No need in previous shapes. - } - } - shapes.addAll(0, frame.getShapes()); - } - - @Override - public List getShapes() { - return shapes; - } - - @Override - public Point getMousePointer() { - return mousePointer; - } - - @Override - public Dimension getSize() { - return size; - } - - @Override - public boolean isActive() { - return isActive; - } -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/GraphicsDeviceTranslucener.java b/main/document/jcapture/src/com/hammurapi/jcapture/GraphicsDeviceTranslucener.java deleted file mode 100644 index 36a0ec395b..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/GraphicsDeviceTranslucener.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.Frame; -import java.awt.GraphicsDevice; -import java.awt.GraphicsEnvironment; -import java.awt.GraphicsDevice.WindowTranslucency; - -public class GraphicsDeviceTranslucener extends Translucener { - - @Override - protected void makeTranslucent(Frame frame) { - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - GraphicsDevice gd = ge.getDefaultScreenDevice(); - - //If translucent windows aren't supported, exit. - if (gd.isWindowTranslucencySupported(WindowTranslucency.TRANSLUCENT)) { - frame.setOpacity(0.7f); - } - } - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/ImageToolTip.java b/main/document/jcapture/src/com/hammurapi/jcapture/ImageToolTip.java deleted file mode 100644 index f083fbd993..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/ImageToolTip.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * This file is an adapted example from javareference.com - * for more information visit, - * http://www.javareference.com - */ -package com.hammurapi.jcapture; - -import java.awt.Dimension; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Image; - -import javax.swing.JComponent; -import javax.swing.JToolTip; -import javax.swing.SwingUtilities; -import javax.swing.plaf.metal.MetalToolTipUI; - -/** - * This class extends JToolTip and set the UI to ImageToolTipUI. - * - * @author Rahul Sapkal(rahul@javareference.com) - */ -public class ImageToolTip extends JToolTip { - - /** - * This class extends MetalToolTipUI and provides customizes it to draw a - * given image on it. - * - * @author Rahul Sapkal(rahul@javareference.com) - */ - private class ImageToolTipUI extends MetalToolTipUI { - private Image m_image; - - public ImageToolTipUI(Image image) { - m_image = image; - } - - /** - * This method is overriden from the MetalToolTipUI to draw the given - * image and text - */ - public void paint(Graphics g, JComponent c) { - FontMetrics metrics = c.getFontMetrics(g.getFont()); - g.setColor(c.getForeground()); - - g.drawString(((ImageToolTip) c).text, 3, 15); - - g.drawImage(m_image, 3, metrics.getHeight() + 3, c); - } - - /** - * This method is overriden from the MetalToolTipUI to return the - * appropiate preferred size to size the ToolTip to show both the text - * and image. - */ - public Dimension getPreferredSize(JComponent c) { - FontMetrics metrics = c.getFontMetrics(c.getFont()); - String tipText = ((JToolTip) c).getTipText(); - if (tipText == null) { - tipText = ""; - } - - int width = SwingUtilities.computeStringWidth(metrics, tipText); - int height = metrics.getHeight() + m_image.getHeight(c) + 6; - - if (width < m_image.getWidth(c)) { - width = m_image.getWidth(c); - } - - return new Dimension(width, height); - } - } - - private String text; - - public ImageToolTip(String text, Image image) { - this.text = text; - setUI(new ImageToolTipUI(image)); - } -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/JCaptureApplet.java b/main/document/jcapture/src/com/hammurapi/jcapture/JCaptureApplet.java deleted file mode 100644 index 1627c6a4d4..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/JCaptureApplet.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.hammurapi.jcapture; - -import org.apache.commons.codec.DecoderException; -import org.apache.commons.codec.binary.Hex; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.entity.mime.MultipartEntity; -import org.apache.http.entity.mime.content.InputStreamBody; -import org.apache.http.entity.mime.content.StringBody; - -public class JCaptureApplet extends AbstractCaptureApplet { - - private static final String HTTPS_PREFIX = "https://"; - - protected HttpUriRequest createRequest(String fileName, InputStreamBody bin) throws Exception { - String uploadUrl = getParameter("uploadUrl"); - if (uploadUrl==null || uploadUrl.trim().length()==0) { - String host = getParameter("host"); - String dokuHost = host; - - if (dokuHost.toLowerCase().startsWith(HTTPS_PREFIX)) { - if (dokuHost.lastIndexOf(":")0) { - reqEntity.addPart("sectok", new StringBody(sectok)); - } - reqEntity.addPart("ow", new StringBody("1")); - - String opaque = getParameter("opaque"); - if (opaque!=null && opaque.trim().length()>0) { - reqEntity.addPart("opaque", new StringBody(opaque)); - } - - reqEntity.addPart("Filename", new StringBody(fileName)); - - int nsIdx = fileName.lastIndexOf(":"); - String namespace; - if (nsIdx==-1) { - namespace = ":"; - } else { - namespace = ":"+fileName.substring(0, nsIdx); - fileName = fileName.substring(nsIdx+1); - } - - if (namespace!=null) { - reqEntity.addPart("ns", new StringBody(namespace)); - } - - reqEntity.addPart("Filedata", bin); - - httppost.setEntity(reqEntity); - return httppost; - } - - String getDokuBase() throws DecoderException { - return new String(Hex.decodeHex(getParameter("dokuBase").toCharArray())); - } - - @Override - protected String bodyName(String fileName) { - return fileName.substring(fileName.lastIndexOf(":")+1); - } - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/MappedImage.java b/main/document/jcapture/src/com/hammurapi/jcapture/MappedImage.java deleted file mode 100644 index 6f7d401fe6..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/MappedImage.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.lang.ref.Reference; -import java.lang.ref.SoftReference; -import java.nio.ByteBuffer; -import java.nio.MappedByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.channels.FileChannel.MapMode; -import java.util.zip.Adler32; - -import javax.imageio.ImageIO; - -/** - * Mapped image is softly kept in memory and also is written to a temporary file. - * If image reference is cleared by the garbage collector, the image is loaded from the file on demand. - * @author Pavel - * - */ -public class MappedImage { - - private Reference imageRef; - private Reference imageBytesRef; - private MappedByteBuffer buffer; - private int height; - private int width; - private String format; - private long checksum; - private int bytesLength; - - public MappedImage(final BufferedImage image, String format, FileChannel channel) throws IOException { - if (format==null) { - throw new NullPointerException("Format is null"); - } - - class HardReference extends SoftReference { - - HardReference(BufferedImage referent) { - super(referent); - } - - @Override - public BufferedImage get() { - return image; - } - - } - imageRef = channel==null ? new HardReference(image) : new SoftReference(image); - width = image.getWidth(); - height = image.getHeight(); - this.format = format; - if (channel!=null) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ImageIO.write(imageRef.get(), format, baos); - baos.close(); - byte[] imageBytes = baos.toByteArray(); - Adler32 adler = new Adler32(); - adler.update(imageBytes); - checksum = adler.getValue(); - bytesLength = imageBytes.length; - imageBytesRef = new SoftReference(imageBytes); - synchronized (channel) { - long position = channel.position(); - channel.write(ByteBuffer.wrap(imageBytes)); - buffer = channel.map(MapMode.READ_ONLY, position, imageBytes.length); - } - } - } - - public byte[] getImageBytes() throws IOException { - if (imageBytesRef==null) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ImageIO.write(imageRef.get(), format, baos); - return baos.toByteArray(); - } - byte[] ret = imageBytesRef.get(); - if (ret==null) { - buffer.load(); - buffer.rewind(); - ret = new byte[buffer.remaining()]; - buffer.get(ret); - if (bytesLength != ret.length) { - throw new IllegalStateException("Invalid image bytes length, expected "+bytesLength+", got "+ret.length); - } - - Adler32 adler = new Adler32(); - adler.update(ret); - if (checksum != adler.getValue()) { - throw new IllegalStateException("Invalid image bytes checksum"); - } - imageBytesRef = new SoftReference(ret); - } - return ret; - } - - /** - * Reads from reference, if reference was cleared, loads from the mapped buffer. - * @return - * @throws IOException - */ - public BufferedImage getImage() throws IOException { - BufferedImage ret = imageRef.get(); - if (ret==null) { - ret = ImageIO.read(new ByteArrayInputStream(getImageBytes())); - imageRef = new SoftReference(ret); - } - return ret; - } - - public int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/Movie.java b/main/document/jcapture/src/com/hammurapi/jcapture/Movie.java deleted file mode 100644 index c7303e9719..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/Movie.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.Dimension; -import java.io.Closeable; -import java.io.IOException; -import java.text.MessageFormat; -import java.util.List; - -public class Movie implements Closeable { - - private float framesPerSecond; - private List fragments; - private Dimension frameDimension; - private Closeable imagesFileCloseable; - - public Movie(Dimension frameDimension, float framesPerSecond, List fragments, Closeable imagesFileCloseable) { - super(); - this.frameDimension = frameDimension; - this.framesPerSecond = framesPerSecond; - this.fragments = fragments; - this.imagesFileCloseable = imagesFileCloseable; - } - - public List getFragments() { - return fragments; - } - - public float getFramesPerSecond() { - return framesPerSecond; - } - - public Dimension getFrameDimension() { - return frameDimension; - } - - @Override - public String toString() { - int frames = 0; - for (VideoEncoder.Fragment f: fragments) { - frames+=f.getFrames().size(); - } - - long length = (long) (frames/framesPerSecond); - - return MessageFormat.format("{0,number,00}:{1,number,00}:{2,number,00}, {3} frames", length/3600, (length/60) % 60, length % 60, frames); - } - - @Override - public void close() throws IOException { - if (imagesFileCloseable!=null) { - imagesFileCloseable.close(); - } - } - -} \ No newline at end of file diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/MovieEditorDialog.java b/main/document/jcapture/src/com/hammurapi/jcapture/MovieEditorDialog.java deleted file mode 100644 index 297420a2db..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/MovieEditorDialog.java +++ /dev/null @@ -1,1124 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.AlphaComposite; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Image; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.lang.ref.Reference; -import java.lang.ref.SoftReference; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.Executor; - -import javax.sound.sampled.AudioFormat; -import javax.sound.sampled.AudioInputStream; -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.DataLine; -import javax.sound.sampled.SourceDataLine; -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JComponent; -import javax.swing.JFrame; -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JTable; -import javax.swing.JToolTip; -import javax.swing.ListSelectionModel; -import javax.swing.ProgressMonitor; -import javax.swing.SwingWorker; -import javax.swing.Timer; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableCellRenderer; -import javax.swing.table.TableModel; - -import com.hammurapi.jcapture.ShapeImpl.ImageImpl; -import com.hammurapi.jcapture.VideoEncoder.Fragment; -import com.hammurapi.jcapture.VideoEncoder.Fragment.Frame; -import com.hammurapi.jcapture.VideoEncoder.Fragment.Frame.Shape; -import com.hammurapi.jcapture.VideoEncoder.Fragment.Frame.Shape.ImageReference; -import com.hammurapi.jcapture.VideoEncoder.Fragment.Frame.Shape.ShapeContent; - -public class MovieEditorDialog extends javax.swing.JDialog { - - private static final double DECIBELS_PER_PIXEL = 2.0; - private static final double NORMALIZED_LEVEL = 0.95; - private static final int AUDIO_CELL_HEIGHT = 50; - private static final int MEDIAN = AUDIO_CELL_HEIGHT/2; - int minCellDimension = 10; - int minToolTipImageDimension = 150; - - int splashIndex = -1; - - double coeff; - - private static Color INACTIVE_COLOR = new Color(230, 230, 230); - private static Color ACTIVE_COLOR = Color.white; - private static Color SELECTED_COLOR = new Color(0, 0, 255, 70); - private static Color FOCUSED_COLOR = new Color(0, 0, 255, 100); - private static Color PLAYING_COLOR = new Color(255, 0, 0, 100); - - private static Color SPLASH_COLOR = new Color(0, 255, 0, 127); - - private static Color SOUND_COLOR = new Color(0, 0, 127); - private static Color DELETED_SOUND_COLOR = new Color(100, 100, 100); - - private JButton saveButton; - private JPanel contentPanel; - private JScrollPane timeLineScrollPane; - private JCheckBox normalizeVolumeCheckBox; - private JPanel frameCanvas; - JTable timeLineTable; - private JButton discardButton; - private int focusColumn = 0; - private int playingColumn = -1; - private Image mouseImage; - private double maxVolume = -1; - FrameEntry[] frameEntries; - int cellWidth; - int cellHeight; - int toolTipImageWidth; - int toolTipImageHeight; - boolean hasAudio; - private Movie movie; - - int numChannels; - int validBits; - long sampleRate; - Timer[] playTimera = {null}; - private Executor backgroundProcessor; - private double inactivityInterval; - private String imageFormat; - - private class FrameEntry { - - // Not null for first frames in fragments indicating that - // Indicating that it's time to open a new audio file. - File audioFile; - - boolean mouseMoved; - - // Scaled samples for painting - not real ones. - // idx, {min, max} - double[] audioSamples; - - // Number of real samples falling to this frame. - int audioSamplesInFrame; - - boolean isDeleted; - - Reference toolTipImageRef; - - Reference frameImageRef; - - // row, selected, focus - private JPanel[][][] canvases = { - { {new FrameCellCanvas(false, false), new FrameCellCanvas(false, true)}, {new FrameCellCanvas(true, false), new FrameCellCanvas(true, true)} }, - { {new AudioCellCanvas(false, false), new AudioCellCanvas(false, true)}, {new AudioCellCanvas(true, false), new AudioCellCanvas(true, true)} } - }; - - class CellCanvas extends JPanel { - - boolean selected; - boolean hasFocus; - - CellCanvas(boolean selected, boolean hasFocus) { - this.selected = selected; - this.hasFocus = hasFocus; - } - - } - - class FrameCellCanvas extends CellCanvas { - - FrameCellCanvas(boolean selected, boolean hasFocus) { - super(selected, hasFocus); - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - paintFrame(this, g, selected, hasFocus); - } - - } - - class AudioCellCanvas extends CellCanvas { - - AudioCellCanvas(boolean selected, boolean hasFocus) { - super(selected, hasFocus); - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - paintAudio(this, g, selected, hasFocus); - } - - } - - int idx; - int delta; - - Frame frame; - - BufferedImage getToolTipImage() throws IOException { - BufferedImage ret = toolTipImageRef==null ? null : toolTipImageRef.get(); - if (ret == null) { - BufferedImage image = getImage(); - ret = new BufferedImage(toolTipImageWidth, toolTipImageHeight, image.getType()); - Graphics2D g = ret.createGraphics(); - g.setComposite(AlphaComposite.Src); - g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); - g.drawImage(image, 0, 0, ret.getWidth(), ret.getHeight(), null); - g.dispose(); - toolTipImageRef = new SoftReference(ret); - } - return ret; - - } - - void paintFrame(FrameCellCanvas frameCellCanvas, Graphics g, boolean selected, boolean hasFocus) { - g.setColor(frame.isActive() ? ACTIVE_COLOR : INACTIVE_COLOR); - g.fillRect(0, 0, frameCellCanvas.getWidth(), frameCellCanvas.getHeight()); - - if (idx==splashIndex) { - g.setColor(SPLASH_COLOR); - g.fillRect(1, 1, frameCellCanvas.getWidth()-2, frameCellCanvas.getHeight()-2); - - } - - if (frame.getMousePointer()!=null) { - int mx = (int) (frame.getMousePointer().getX()*(frameCellCanvas.getWidth()-3)/frame.getSize().getWidth())+1; - int my = (int) (frame.getMousePointer().getY()*(frameCellCanvas.getHeight()-3)/frame.getSize().getHeight())+1; - g.setColor(mouseMoved ? Color.BLACK : Color.GRAY); - g.fillRect(mx, my, 2, 2); - } - - if (isDeleted) { - g.setColor(Color.RED); - g.drawLine(2, 2, frameCellCanvas.getWidth()-2, frameCellCanvas.getHeight()-2); - g.drawLine(frameCellCanvas.getWidth()-2, 2, 2, frameCellCanvas.getHeight()-2); - } - - decorate(frameCellCanvas, g, selected, hasFocus); - } - - void paintAudio(AudioCellCanvas audioCellCanvas, Graphics g, boolean selected, boolean hasFocus) { - g.setColor(frame.isActive() ? ACTIVE_COLOR : INACTIVE_COLOR); - g.fillRect(0, 0, audioCellCanvas.getWidth(), audioCellCanvas.getHeight()); - - if (audioSamples!=null) { - for (int i = 0; i0 && !coversEverything(startIdx)) { - --startIdx; - } - int deltaArea = 0; - ret = new BufferedImage(frame.getSize().width, frame.getSize().height, shapeImage(frameEntries[startIdx].frame.getShapes().get(0)).getType()); - Graphics2D g = ret.createGraphics(); - for (int i=startIdx; i<=idx; ++i) { - for (Shape shape: frameEntries[i].frame.getShapes()) { - BufferedImage si = shapeImage(shape); - g.drawImage(si, shape.getLocation().x, shape.getLocation().y, null); - if (i==idx) { - deltaArea+=si.getWidth()*si.getHeight(); - } - } - } - delta = (int) (100.0*deltaArea/(frame.getSize().width * frame.getSize().height)); - if (frame.getMousePointer()!=null) { - g.drawImage(mouseImage, frame.getMousePointer().x, frame.getMousePointer().y, null); - } - frameImageRef = new SoftReference(ret); - } - return ret; - } - - private BufferedImage shapeImage(Shape shape) throws IOException { - ShapeContent shapeContent = shape.getContent(); - if (shapeContent instanceof ImageReference) { - return ((ImageReference) shapeContent).getImage().getImage().getImage(); - } - return ((com.hammurapi.jcapture.VideoEncoder.Fragment.Frame.Shape.Image) shapeContent).getImage().getImage(); - } - - boolean coversEverything(int entryIdx) { - for (Shape shape: frameEntries[entryIdx].frame.getShapes()) { - if (shape.getContent().coversEverything()) { - return true; - } - } - return false; - } - - public Component getCellRendererComponent(int row, boolean isSelected, boolean hasFocus) { - return canvases[row][isSelected ? 1 : 0][hasFocus ? 1 : 0]; - } - - } - - public MovieEditorDialog( - final JFrame frame, - final Movie movie, - final Executor backgroundProcessor, - double inactivityInterval, - String imageFormat) { - - super(frame, "Movie editor ("+movie+")"); - frame.setAlwaysOnTop(false); - frame.setVisible(false); - - this.movie = movie; - this.backgroundProcessor = backgroundProcessor; - this.inactivityInterval = inactivityInterval; - this.imageFormat = imageFormat; - - setModal(true); - setIconImage(frame.getIconImage()); - - mouseImage = Toolkit.getDefaultToolkit().getImage(getClass().getResource("mouse.png")); - - double aspectRatio = (double) movie.getFrameDimension().getWidth()/(double) movie.getFrameDimension().getHeight(); - - if (aspectRatio>1) { - cellHeight = minCellDimension; - cellWidth = (int) Math.round(aspectRatio*cellHeight); - - toolTipImageHeight = minToolTipImageDimension; - toolTipImageWidth = (int) Math.round(aspectRatio*toolTipImageHeight); - } else { - cellWidth = minCellDimension; - cellHeight = (int) Math.round((double) cellWidth/aspectRatio); - - toolTipImageWidth = minToolTipImageDimension; - toolTipImageHeight = (int) Math.round((double) toolTipImageWidth/aspectRatio); - } - - setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); - - addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - int confirmed = JOptionPane.showConfirmDialog(null, - "Are you sure you want to exit and discard the movie?", "User Confirmation", - JOptionPane.YES_NO_OPTION); - if (confirmed == JOptionPane.YES_OPTION) { - dispose(); - getOwner().setVisible(false); - } - } - }); - - SwingWorker loader = new SwingWorker() { - - @Override - protected Boolean doInBackground() throws Exception { - int totalFrames = 0; - for (Fragment fr: movie.getFragments()) { - if (fr.getAudio()!=null) { - hasAudio = true; - } - totalFrames+=fr.getFrames().size(); - } - - ProgressMonitor progressMonitor = new ProgressMonitor(frame, "Loading frames", "Loading movie frames", 0, totalFrames); - - try { - frameEntries = new FrameEntry[totalFrames]; - int idx = 0; - double audioSamplesPerFrame = -1; - Point prevMouse = null; - for (Fragment fr: movie.getFragments()) { - WavFile wavFile = fr.getAudio()==null ? null : WavFile.openWavFile(fr.getAudio()); - if (wavFile!=null) { - audioSamplesPerFrame = wavFile.getSampleRate()/movie.getFramesPerSecond(); - numChannels = wavFile.getNumChannels(); - validBits = wavFile.getValidBits(); - sampleRate = wavFile.getSampleRate(); - } - int audioFramesRead = 0; - int framePosition = 0; - for (Frame frm: fr.getFrames()) { - if (progressMonitor.isCanceled()) { - return false; - } - frameEntries[idx] = new FrameEntry(); - frameEntries[idx].frame = frm; - frameEntries[idx].idx = idx; - if (frm.getMousePointer()!=null) { - frameEntries[idx].mouseMoved = !frm.getMousePointer().equals(prevMouse); - } - prevMouse = frm.getMousePointer(); - - if (framePosition == 0) { - frameEntries[idx].audioFile = fr.getAudio(); - } - - if (wavFile!=null && wavFile.getFramesRemaining()>0) { - frameEntries[idx].audioSamplesInFrame = (int) ((framePosition+1)*audioSamplesPerFrame-audioFramesRead); - frameEntries[idx].audioSamples = new double[cellWidth]; - double[][] sampleBuffer = new double[wavFile.getNumChannels()][frameEntries[idx].audioSamplesInFrame]; - frameEntries[idx].audioSamplesInFrame=wavFile.readFrames(sampleBuffer, frameEntries[idx].audioSamplesInFrame); - audioFramesRead+=frameEntries[idx].audioSamplesInFrame; - for (int i=0; i encoder = new SwingWorker() { - - @Override - protected Movie doInBackground() throws Exception { - ProgressMonitor progressMonitor = new ProgressMonitor(MovieEditorDialog.this, "Saving movie", "Composing movie", 0, frameEntries.length); - - List newFrames = new ArrayList(); - - if (splashIndex!=-1) { - newFrames.add(new FrameImpl( - Collections.singletonList((Shape) new ShapeImpl(new Point(0,0), new ImageImpl(new MappedImage(frameEntries[splashIndex].getImage(), imageFormat, null), true))) , - frameEntries[splashIndex].frame.getMousePointer(), - frameEntries[splashIndex].frame.getSize(), - false)); - } - - File newAudio = hasAudio ? File.createTempFile("jCaptureAudioSink", ".wav") : null; - - long numFrames=0; - for (FrameEntry fe: frameEntries) { - if (!fe.isDeleted) { - numFrames+=fe.audioSamplesInFrame; - } - } - WavFile newWavFile = newAudio==null ? null : WavFile.newWavFile(newAudio, numChannels, numFrames, validBits, sampleRate); - - File currentAudio = null; - WavFile currentWav = null; - - for (int i=0; i0 && !frameEntries[i].isDeleted) { - // Normalization - for (double[] ch: buf) { - for (int j=0; j0 && !frameEntries[i].isDeleted) { - newWavFile.writeFrames(buf, read); - } - } - } - - if (frameEntries[i].isDeleted) { - if (i=0 && timeLineTable.isColumnSelected(i); --i) { - range[0] = i; - } - - if (range[0]==range[1]) { - range[1]=frameEntries.length-1; - } - - playingColumn = range[0]; - - if (hasAudio) { - try { - backgroundProcessor.execute(new SoundPlayer(range[0], range[1])); - } catch (Exception ex) { - ex.printStackTrace(); - JOptionPane.showMessageDialog( - MovieEditorDialog.this, - ex.toString(), - "Audio problem", - JOptionPane.ERROR_MESSAGE); - - } - } - - playTimera[0] = new Timer((int) ((double) 1000/movie.getFramesPerSecond()), new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - while (frameEntries[playingColumn].isDeleted) { - ++playingColumn; - if (playingColumn>range[1]) { - ((Timer) e.getSource()).stop(); - return; - } - } - - Rectangle visibleRect = timeLineTable.getVisibleRect(); - Rectangle playingRect = timeLineTable.getCellRect(0, playingColumn, true); - if (!visibleRect.contains(playingRect)) { - Rectangle scrollTo = new Rectangle(playingRect.x, playingRect.width, visibleRect.width-1, visibleRect.height-1); - timeLineTable.scrollRectToVisible(scrollTo); - } - - frameCanvas.repaint(); - timeLineTable.repaint(); - - ++playingColumn; - if (playingColumn>range[1]) { - ((Timer) e.getSource()).stop(); - return; - } - } - - - }) { - @Override - public void stop() { - super.stop(); - playingColumn=-1; - timeLineTable.scrollRectToVisible(timeLineTable.getCellRect(0, focusColumn, true)); - frameCanvas.repaint(); - timeLineTable.repaint(); - playTimera[0] = null; - } - }; - - playTimera[0].start(); - synchronized (playTimera) { - playTimera.notifyAll(); - } - } - }; - playMenuItem.setAction(playAction); - - popup.add(playMenuItem); - - timeLineTable.setComponentPopupMenu(popup ); - - timeLineTable.addMouseListener(new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - if (playTimera[0]!=null) { - playTimera[0].stop(); - } - - if (e.getClickCount()==2) { - int hitColumnIndex = timeLineTable.columnAtPoint(e.getPoint()); - if (hitColumnIndex!=-1) { - frameEntries[hitColumnIndex].isDeleted=!frameEntries[hitColumnIndex].isDeleted; - timeLineTable.repaint(); - } - } - } - }); - - timeLineTable.setToolTipText("Movie timeline"); - timeLineScrollPane.setViewportView(timeLineTable); - timeLineTable.setModel(timeLineTableModel); - timeLineTable.setRowHeight(0, cellHeight+timeLineTable.getRowMargin()*2); - timeLineTable.setRowHeight(1, AUDIO_CELL_HEIGHT+timeLineTable.getRowMargin()*2); - for (int i=0; i 0) { - break; - } - } catch (NumberFormatException nfe) { - // NOP - loop - } - msg = "Invalid double value for inactivity interval: "+newVal+", enter valid value"; - } - int inactivityInFrames = (int) (inactivityInterval*movie.getFramesPerSecond()); - int lastActivity = -inactivityInFrames-1; - for (int idx: timeLineTable.getSelectedColumns()) { - if (!frameEntries[idx].isDeleted && frameEntries[idx].frame.isActive()) { - lastActivity = idx; - } else if (idx - lastActivity > inactivityInFrames && !frameEntries[idx].frame.isActive()) { - frameEntries[idx].isDeleted = true; - } - } - timeLineTable.repaint(); - } - }; - - removeInactivityMenuItem.setAction(deleteFrameAction); - popup.add(removeInactivityMenuItem); - } - - private class SoundPlayer implements Runnable { - - private final int BUFFER_SIZE; - private AudioInputStream audioStream; - private SourceDataLine sourceLine; - private File audioFile; - - public SoundPlayer(int start, int end) throws Exception { - - audioFile = hasAudio ? File.createTempFile("jCaptureRangeAudio", ".wav") : null; - - BUFFER_SIZE = (int) ((double) numChannels*sampleRate*validBits/(movie.getFramesPerSecond()*8)); // 1 frame buffer. - - long numFrames=0; - for (int i = start; i<=end; ++i) { - if (!frameEntries[i].isDeleted) { - numFrames+=frameEntries[i].audioSamplesInFrame; - } - } - WavFile newWavFile = audioFile==null ? null : WavFile.newWavFile(audioFile, numChannels, numFrames, validBits, sampleRate); - - File currentAudio = null; - WavFile currentWav = null; - - for (int i=0; i<=end; ++i) { - if (frameEntries[i].audioFile!=null) { - if (currentWav!=null) { - currentWav.close(); - } - - currentAudio = frameEntries[i].audioFile; - currentWav = WavFile.openWavFile(currentAudio); - } - - if (currentWav!=null) { - if (normalizeVolumeCheckBox!=null && normalizeVolumeCheckBox.isSelected()) { - double[][] buf = new double[numChannels][frameEntries[i].audioSamplesInFrame]; - int read = currentWav.readFrames(buf, frameEntries[i].audioSamplesInFrame); - if (read>0 && i>=start && !frameEntries[i].isDeleted) { - // Normalization - for (double[] ch: buf) { - for (int j=0; j0 && i>=start && !frameEntries[i].isDeleted) { - newWavFile.writeFrames(buf, read); - } - } - } - } - - if (currentWav!=null) { - currentWav.close(); - } - if (newWavFile!=null) { - newWavFile.close(); - } - - if (audioFile!=null) { - audioStream = AudioSystem.getAudioInputStream(audioFile); - AudioFormat audioFormat = audioStream.getFormat(); - DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); - sourceLine = (SourceDataLine) AudioSystem.getLine(info); - sourceLine.open(audioFormat); - } - } - - @Override - public void run() { - try { - sourceLine.start(); - synchronized (playTimera) { - if (playTimera[0] == null) { - playTimera.wait(100); - } - } - try { - byte[] buf = new byte[BUFFER_SIZE]; - int l; - while (playTimera[0]!=null && (l=audioStream.read(buf))!=-1) { - sourceLine.write(buf, 0, l); - } - } finally { - audioStream.close(); - sourceLine.drain(); - sourceLine.close(); - if (!audioFile.delete()) { - audioFile.deleteOnExit(); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - } - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/RecordingControlsFrame.java b/main/document/jcapture/src/com/hammurapi/jcapture/RecordingControlsFrame.java deleted file mode 100644 index 2196ce30d4..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/RecordingControlsFrame.java +++ /dev/null @@ -1,321 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ComponentEvent; -import java.awt.event.ComponentListener; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; - -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.SwingWorker; -import javax.swing.WindowConstants; -import javax.swing.border.LineBorder; - -import netscape.javascript.JSObject; - -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; - -public class RecordingControlsFrame extends javax.swing.JFrame { - private static final String RESUME_TEXT = "Resume"; - private static final String PAUSE_TEXT = "Pause"; - private JButton pauseButton; - private JButton cancelButton; - private JButton stopButton; - private ScreenRecorder screenRecorder; - private CaptureFrame captureFrame; - - public RecordingControlsFrame(final CaptureFrame captureFrame, final JFrame[] borderFrames) { - super("jCapture recording"); - setIconImage(captureFrame.getIconImage()); - this.captureFrame = captureFrame; - - setUndecorated(true); - setAlwaysOnTop(!getBounds().intersects(captureFrame.getBounds())); - - addComponentListener(new ComponentListener() { - - @Override - public void componentShown(ComponentEvent e) { - for (JFrame bf: borderFrames) { - if (bf!=null) { - bf.setVisible(true); - } - } - } - - @Override - public void componentResized(ComponentEvent e) { - // TODO Auto-generated method stub - - } - - @Override - public void componentMoved(ComponentEvent e) { - // TODO Auto-generated method stub - - } - - @Override - public void componentHidden(ComponentEvent e) { - for (JFrame bf: borderFrames) { - if (bf!=null) { - bf.setVisible(false); - } - } - } - }); - - JPanel contentPanel = new JPanel(); - contentPanel.setBorder(new LineBorder(new java.awt.Color(0, 0, 0), 1, false)); - getContentPane().add(contentPanel, BorderLayout.CENTER); - - GridBagLayout thisLayout = new GridBagLayout(); - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - thisLayout.rowWeights = new double[] { 0.0, 0.1, 0.0 }; - thisLayout.rowHeights = new int[] { 7, 7, 7 }; - thisLayout.columnWeights = new double[] { 0.0, 0.1, 0.0, 0.1, 0.0, 0.1, 0.0 }; - thisLayout.columnWidths = new int[] { 7, 20, 7, 20, 7, 7, 7 }; - contentPanel.setLayout(thisLayout); - - pauseButton = new JButton(); - contentPanel.add(pauseButton, new GridBagConstraints(1, 1, 1, 1, 0.0, - 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, - new Insets(0, 0, 0, 0), 0, 0)); - pauseButton.setText(PAUSE_TEXT); - pauseButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - try { - if (PAUSE_TEXT.equals(pauseButton.getText())) { - screenRecorder.stop(); - pauseButton.setText(RESUME_TEXT); - } else { - screenRecorder.start(); - pauseButton.setText(PAUSE_TEXT); - } - } catch (Exception e) { - e.printStackTrace(); - JOptionPane.showMessageDialog(RecordingControlsFrame.this, - e.toString(), "Error pausing/resuming recording", - JOptionPane.ERROR_MESSAGE); - } - } - }); - - stopButton = new JButton(); - contentPanel.add(stopButton, new GridBagConstraints(3, 1, 1, 1, 0.0, - 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, - new Insets(0, 0, 0, 0), 0, 0)); - stopButton.setText("Stop"); - stopButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - - pauseButton.setEnabled(false); - stopButton.setEnabled(false); - cancelButton.setEnabled(false); - - SwingWorker task = new SwingWorker() { - - @Override - protected Movie doInBackground() throws Exception { - screenRecorder.stop(); - return screenRecorder.getMovie(); - } - - @Override - protected void done() { - try { - final Movie movie = get(); - if (movie!=null) { - if (JOptionPane.showConfirmDialog(RecordingControlsFrame.this, "Would you like to edit the movie before uploading?", "Edit movie?", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION) { - new MovieEditorDialog( - RecordingControlsFrame.this, - movie, - captureFrame.getCaptureConfig().getBackgroundProcessor(), - captureFrame.getCaptureConfig().getInactivityInterval(), - captureFrame.getCaptureConfig().getImageFormat()); - } else { - uploadMovie(movie); - } - } else { - JOptionPane.showMessageDialog( - RecordingControlsFrame.this, - "Recording discarded", - "Saving recording", - JOptionPane.INFORMATION_MESSAGE); - RecordingControlsFrame.this.setVisible(false); - } - } catch (Exception e) { - e.printStackTrace(); - JOptionPane.showMessageDialog( - RecordingControlsFrame.this, e.toString(), - "Error saving recording", - JOptionPane.ERROR_MESSAGE); - RecordingControlsFrame.this.setVisible(false); - } - } - - }; - - task.execute(); - - } - }); - - cancelButton = new JButton(); - contentPanel.add(cancelButton, new GridBagConstraints(5, 1, 1, 1, 0.0, - 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, - new Insets(0, 0, 0, 0), 0, 0)); - cancelButton.setText("Cancel"); - cancelButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - if (JOptionPane.showConfirmDialog(RecordingControlsFrame.this, "Are you sure you want to discard the recording?", "Confirm discarding movie", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION) {; - try { - screenRecorder.stop(); - } catch (Exception e) { - e.printStackTrace(); - JOptionPane.showMessageDialog(RecordingControlsFrame.this, - e.toString(), "Error cancelling recording", - JOptionPane.ERROR_MESSAGE); - } finally { - RecordingControlsFrame.this.setVisible(false); - captureFrame.setVisible(true); - } - } - } - }); - - pack(); - this.setSize(301, 40); - captureFrame.getCaptureConfig().setParentComponent(this); - try { - screenRecorder = new ScreenRecorder(captureFrame.getCaptureConfig(), captureFrame.getApplet()); - } catch (Exception e) { - e.printStackTrace(); - JOptionPane.showMessageDialog(this, e.toString(), "Error starting recording", JOptionPane.ERROR_MESSAGE); - setVisible(false); - } - - } - - /** - * Asks for file name and uploads the movie. - * @param movie - */ - void uploadMovie(final Movie movie) { - try { - if (movie!=null) { - - final String fileName = JOptionPane.showInputDialog( - RecordingControlsFrame.this, - "Upload as", - captureFrame.getApplet().getParameter("pageName")+ - "-recording-"+ - captureFrame.getDatePrefix()+ - "-" + captureFrame.nextCounter() +"."+captureFrame.getCaptureConfig().getEncoder().getFileExtension()); - - if (fileName!=null) { - // Uploading - SwingWorker task = new SwingWorker() { - - @Override - protected Dimension doInBackground() throws Exception { - - File savedTo = null; - - try { - // encode and upload - File tmpFile = File.createTempFile("jCaptureMovie", "."+captureFrame.getCaptureConfig().getEncoder().getFileExtension()); - FileOutputStream out = new FileOutputStream(tmpFile); - Dimension dimension = captureFrame.getCaptureConfig().getEncoder().encode(captureFrame.getCaptureConfig(), movie, out); - if (dimension==null) { - return null; - } - out.close(); - savedTo = tmpFile; - - HttpResponse iResponse = captureFrame.getApplet().post( - RecordingControlsFrame.this, - new FileInputStream(tmpFile), - tmpFile.length(), - fileName, - "application/octet-stream"); - - if (iResponse!=null) { - System.out.println("Response status line: "+iResponse.getStatusLine()); - if (iResponse.getStatusLine().getStatusCode()!=HttpStatus.SC_OK) { - errorMessage = iResponse.getStatusLine(); - errorTitle = "Error saving recording"; - return null; - } - } - if (!tmpFile.delete()) { - tmpFile.deleteOnExit(); - } - return dimension; - } catch (Error e) { - errorMessage=e.toString(); - if (savedTo!=null) { - errorMessage=errorMessage + ",\n recording was saved to "+savedTo.getAbsolutePath(); - } - errorTitle = "Upload error"; - e.printStackTrace(); - return null; - } - } - - private Object errorMessage; - private String errorTitle; - - protected void done() { - try { - Dimension dimension = get(); - if (dimension!=null) { - JSObject window = JSObject.getWindow(captureFrame.getApplet()); - String toEval = "insertAtCarret('"+captureFrame.getApplet().getParameter("edid")+"','{{:"+fileName+"?"+dimension.width+"x"+dimension.height+"|}}')"; - System.out.println("Evaluating: "+toEval); - window.eval(toEval); - } else { - JOptionPane.showMessageDialog( - RecordingControlsFrame.this, - errorMessage, - errorTitle, - JOptionPane.ERROR_MESSAGE); - } - } catch (Exception e) { - e.printStackTrace(); - JOptionPane.showMessageDialog( - RecordingControlsFrame.this, - e.toString(), - "Exception", - JOptionPane.ERROR_MESSAGE); - } - }; - - }; - - task.execute(); - } - } else { - JOptionPane.showMessageDialog( - RecordingControlsFrame.this, - "Recording discarded", - "Saving recording", - JOptionPane.INFORMATION_MESSAGE); - } - } finally { - RecordingControlsFrame.this.setVisible(false); - } - } - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/Region.java b/main/document/jcapture/src/com/hammurapi/jcapture/Region.java deleted file mode 100644 index b5bc0a05de..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/Region.java +++ /dev/null @@ -1,221 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.Color; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.nio.channels.FileChannel; - -public class Region extends Rectangle { - - private static final int TRANSPARENT_COLOR = new Color(0,0,0,0).getRGB(); - - private BufferedImage master; - private BufferedImage prev; - private int grabRange; - private MappedImage image; - private boolean transparency; - - public Region(BufferedImage master, String format, FileChannel channel, BufferedImage prev, boolean transparency, int x, int y, int grabRange) { - this.master = master; - this.format = format; - this.channel = channel; - this.prev = prev; - this.transparency = transparency; - this.grabRange = grabRange; - - setBounds(x-grabRange, y-grabRange, grabRange*2+1, grabRange*2+1); - } - - /** - * Special case when region covers the whole image. - * @param master - * @param x - * @param y - * @param grabRange - * @throws IOException - */ - public Region(MappedImage master) throws IOException { - this.image = master; - this.grabRange = 0; - imageLocation = new Point(0,0); - coversEverything = true; - - setBounds(0,0,master.getWidth(),master.getHeight()); - BufferedImage img = master.getImage(); - for (int sx=0, sw=master.getWidth(); sx0) { - imageWidth-=widthDelta; - } - - int imageHeight = height; - int heightDelta = imageHeight+imageLocation.y - master.getHeight(); - if (heightDelta>0) { - imageHeight-=heightDelta; - } - - BufferedImage bImage = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_ARGB); - for (int x=0; x0) { - Thread.sleep(toSleep); - } - - screenShot = config.createScreenShot(screenShot, imagesChannel); - if (first==null) { - first = screenShot; - } - screenshots.add(config.submit(screenShot)); - } - - System.out.println("Captured "+screenshots.size()+" screenshots"); - } - - } - - public Fragment() throws Exception { - if (targetDataLine!=null) { - audioSink = File.createTempFile("jCaptureAudioSink", ".wav"); - targetDataLine.start(); - audioRecordingThread = new AudioRecordingThread(); - audioRecordingThread.start(); - } - - screenCapturingThread = new ScreenCapturingThread(); - screenCapturingThread.start(); - } - - File audioSink; - List> screenshots = new ArrayList>(); - - AudioRecordingThread audioRecordingThread; - ScreenCapturingThread screenCapturingThread; - - volatile boolean isDone; - - void stop() throws Exception { - if (targetDataLine!=null) { - targetDataLine.stop(); - } - isDone = true; - if (audioRecordingThread!=null) { - audioRecordingThread.join(); - } - screenCapturingThread.join(); - if (screenCapturingThread.getException()!=null) { - throw screenCapturingThread.getException(); - } - if (audioRecordingThread!=null && audioRecordingThread.getException()!=null) { - throw audioRecordingThread.getException(); - } - } - - } - - LinkedList fragments = new LinkedList(); - private FileChannel imagesChannel; - - public ScreenRecorder(CaptureConfig config, AbstractCaptureApplet applet) throws Exception { - this.config = config; - final File imagesFile = File.createTempFile("jCaptureImages", ".tmp"); - imagesFile.deleteOnExit(); - final RandomAccessFile raf = new RandomAccessFile(imagesFile, "rw"); - this.imagesChannel = raf.getChannel(); - - imagesFileCloseable = new Closeable() { - - @Override - public void close() throws IOException { - imagesChannel.close(); - raf.close(); - if (!imagesFile.delete()) { - imagesFile.deleteOnExit(); - } - } - - }; - - applet.addCloseable(imagesFileCloseable); - - if (config.isSound()) { - DataLine.Info info = new DataLine.Info(TargetDataLine.class, config.getAudioFormat()); - - Mixer mixer = null; - Mixer firstMixer = null; - for (Mixer.Info mi: AudioSystem.getMixerInfo()) { - Mixer mx = AudioSystem.getMixer(mi); - if (mx.isLineSupported(info)) { - if (firstMixer==null) { - firstMixer = mx; - } - if (config.getMixerName()==null || mi.getName().equals(config.getMixerName())) { - mixer = mx; - break; - } - } - } - - if (mixer==null) { - mixer = firstMixer; - } - - if (mixer!=null) { - targetDataLine = (TargetDataLine) mixer.getLine(info); - targetDataLine.open(config.getAudioFormat()); - } - } - - frameLength = (long) (1000.0/config.getFramesPerSecond()); - - start(); - } - - public synchronized void start() throws Exception { - fragments.add(new Fragment()); - } - - public void stop() throws Exception { - fragments.getLast().stop(); - } - - /** - * Recording is discarded if saveTo is null - * @param saveTo - * @return Movie size in pixels or null if saving was cancelled. - * @throws IOException - * @throws DataFormatException - */ - public Movie getMovie() throws Exception { - stop(); - - if (targetDataLine!=null) { - targetDataLine.close(); - } - - int totalWork = 3; - for (Fragment f: fragments) { - totalWork+=f.screenshots.size()+1; - } - - Map imageCache = new IdentityHashMap(); - - Dimension frameDimension = null; - - ProgressMonitor progressMonitor = new ProgressMonitor(config.getParentComponent(), "Encoding video", "Preparing frames", 0, totalWork+4); - try { - int progressCounter = 0; - - //In frames - int inactivityInterval = config.isRemoveInactivity() && !config.isSound() ? (int) (1000.0 * config.getInactivityInterval() / frameLength) : -1; - float fps = -1; - final List fragmentCollector = new ArrayList(); - for (Fragment fragment: fragments) { - if (progressMonitor.isCanceled()) { - return null; - } - - if (fps<0) { - fps = config.isSound() ? fragment.getActualFps() : config.getSpeedScale()*fragment.getActualFps(); - } - - progressMonitor.setProgress(++progressCounter); - - int lastActivity = -1; - List framesCollector = new ArrayList(); - for (Future sf: fragment.screenshots) { - - if (progressMonitor.isCanceled()) { - return null; - } - - ScreenShot screenShot = sf.get(); - - if (inactivityInterval<0 || screenShot.isActive() || screenShot.getSecNo()-lastActivity frameShapes = new ArrayList(); - for (Region region: screenShot.getRegions()) { - ShapeContent content; - if (region.getMasterImageRegion()==null) { - content = new ShapeImpl.ImageImpl(region.getImage(), region.coversEverything()); - imageCache.put(region, (Image) content); - if (frameDimension==null && region.coversEverything()) { - frameDimension = region.getSize(); - } - } else { - content = new ShapeImpl.ImageReferenceImpl(imageCache.get(region.getMasterImageRegion())); - } - frameShapes.add(new ShapeImpl(region.getImageLocation(), content)); - } - framesCollector.add(new FrameImpl(frameShapes, screenShot.getMousePosition(), screenShot.getSize(), screenShot.isActive())); - } else { - progressMonitor.setProgress(++progressCounter); // Skipping frame, report progress here. - } - - if (screenShot.isActive()) { - lastActivity = screenShot.getSecNo(); - } - - progressMonitor.setProgress(++progressCounter); - } - - fragmentCollector.add(new FragmentImpl(Collections.unmodifiableList(framesCollector), fragment.audioSink)); - } - - return new Movie(frameDimension, fps, fragmentCollector, imagesFileCloseable); - } finally { - progressMonitor.close(); - } - } - - private static abstract class SafeThread extends Thread { - private Exception exception; - - public SafeThread(String name) { - super(name); - } - - @Override - public void run() { - try { - runInternal(); - } catch (Exception e) { - this.exception = e; - e.printStackTrace(); - } - } - - protected abstract void runInternal() throws Exception; - - public Exception getException() { - return exception; - } - } - - long frameLength; - - - private TargetDataLine targetDataLine; - -} \ No newline at end of file diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/ScreenShot.java b/main/document/jcapture/src/com/hammurapi/jcapture/ScreenShot.java deleted file mode 100644 index 080c127b04..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/ScreenShot.java +++ /dev/null @@ -1,251 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.AlphaComposite; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.RenderingHints; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.nio.channels.FileChannel; -import java.util.ArrayList; -import java.util.List; -import java.util.ListIterator; -import java.util.concurrent.Callable; - -import javax.imageio.ImageIO; - -public class ScreenShot implements Callable { - - private final ScreenShot prev; - private final int secNo; - private ScreenShot next; - final private long timeStamp; - private int grabRange; - private boolean transparency; - private MappedImage image; - private Point mousePosition; - private double scale; - private boolean border; - private Dimension size; - private FileChannel imageChannel; - private String imageFormat; - - public ScreenShot( - BufferedImage image, - Point mousePosition, - ScreenShot prev, - long timeStamp, - int grabRange, - boolean transparency, - boolean border, - double scale, - FileChannel imageChannel, - String imageFormat) throws IOException { - - this.image = new MappedImage(image, imageFormat, imageChannel); - this.mousePosition = mousePosition; - this.prev = prev; - if (prev==null) { - secNo=0; - } else { - prev.next = this; - secNo = prev.secNo+1; - } - this.timeStamp = timeStamp; - this.grabRange = grabRange; - this.transparency = transparency; - this.scale = scale; - this.border = border; - this.imageChannel = imageChannel; - this.imageFormat = imageFormat; - } - - public Point getMousePosition() { - return mousePosition; - } - - /** - * Calculates actual FPS. - * @return - */ - public float getFramesPerSecond() { - long start = timeStamp; - long end = 0; - int length = 0; - for (ScreenShot sibling = next; sibling!=null; sibling=sibling.next) { - ++length; - end = sibling.timeStamp; - } - if (length==0) { - return -1; // No way to tell. - } - return (float) (length * 1000.0)/(end - start); - } - - private List regions; - - private long totalPixels; - private long differentPixels; - - public double getDiffLevel() { - return (double) differentPixels/(double) totalPixels; - } - - /** - * If images are different more than diffThreshold, then the - * entire screenshot shall be taken. - */ - private double diffThreshold = 0.7; - - /** - * Performs processing and returns self. - * Screenshot is structured as Callable to simplify live processing in a background thread. - */ - @Override - public ScreenShot call() throws Exception { - BufferedImage img = image.getImage(); - // No petty scaling. - if (scale<0.99 || scale > 1.01) { - BufferedImage scaled = new BufferedImage((int) (img.getWidth()*scale), (int) (img.getHeight()*scale), img.getType()); - Graphics2D g = scaled.createGraphics(); - g.setComposite(AlphaComposite.Src); - g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); - g.drawImage(img, 0, 0, scaled.getWidth(), scaled.getHeight(), null); - g.dispose(); - img = scaled; - - if (mousePosition!=null) { - mousePosition = new Point((int) (mousePosition.x*scale), (int) (mousePosition.y*scale)); - } - } - - if (border) { - Graphics2D ssg = img.createGraphics(); - ssg.setColor(java.awt.Color.GRAY); - ssg.drawRect(0, 0, img.getWidth()-1, img.getHeight()-1); - } - - size = new Dimension(image.getWidth(), image.getHeight()); - - regions = new ArrayList(); - if (prev==null) { - regions.add(new Region(image)); - } else { - BufferedImage pimg = prev.image.getImage(); - for (int x=0, w=img.getWidth(); xdiffThreshold) { - regions.clear(); - regions.add(new Region(image)); - } else { - // Merging adjacent regions - for (int i=0; i lit = regions.listIterator(i+1); - Region master = regions.get(i); - while (lit.hasNext()) { - if (master.merge(lit.next())) { - lit.remove(); - } - } - } - - for (Region region: regions) { - region.grabImage(); - } - } - - // Eligible for garbage collection - if (prev!=null) { - prev.image=null; - } - } - - // De-dup - ListIterator oit = regions.listIterator(); - R: while (oit.hasNext()) { - Region or = oit.next(); - - if (oit.hasPrevious()) { - ListIterator iit = regions.listIterator(oit.previousIndex()); - while (iit.hasPrevious()) { - if (or.dedup(iit.previous())) { - continue R; - } - } - } - - for (ScreenShot sibling=prev; sibling!=null; sibling=sibling.prev) { - for (Region sr: sibling.regions) { - if (or.dedup(sr)) { - continue R; - } - } - } - } - return this; - } - - public void dump(File dir, String imageFormat) throws IOException { - for (int i=0; i getRegions() { - return regions; - } - - public int getSecNo() { - return secNo; - } - - public boolean isActive() { - if (!regions.isEmpty()) { - return true; - } - if (mousePosition==null) { - if (prev==null) { - return false; - } - if (prev.getMousePosition()!=null) { - return true; - } - return false; - } - - if (prev==null) { - return true; - } - if (!mousePosition.equals(prev.getMousePosition())) { - return true; - } - return false; - } - - public Dimension getSize() { - return size; - } - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/ShapeImpl.java b/main/document/jcapture/src/com/hammurapi/jcapture/ShapeImpl.java deleted file mode 100644 index ca3fda48d2..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/ShapeImpl.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.Point; - -import com.hammurapi.jcapture.VideoEncoder.Fragment.Frame.Shape; - -class ShapeImpl implements Shape { - - static class ImageImpl implements Image { - - MappedImage image; - private boolean coversEverything; - - ImageImpl(MappedImage image, boolean coversEverything) { - super(); - this.image = image; - this.coversEverything = coversEverything; - } - - @Override - public boolean coversEverything() { - return coversEverything; - } - - @Override - public MappedImage getImage() { - return image; - } - - } - - static class ImageReferenceImpl implements ImageReference { - - private Image image; - - ImageReferenceImpl(Image image) { - super(); - if (image==null) { - throw new NullPointerException(); - } - this.image = image; - } - - @Override - public boolean coversEverything() { - return image.coversEverything(); - } - - @Override - public Image getImage() { - return image; - } - - } - - private Point location; - private ShapeContent content; - - ShapeImpl(Point location, ShapeContent content) { - super(); - this.location = location; - this.content = content; - } - - @Override - public Point getLocation() { - return location; - } - - @Override - public ShapeContent getContent() { - return content; - } - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/SwfEncoder.java b/main/document/jcapture/src/com/hammurapi/jcapture/SwfEncoder.java deleted file mode 100644 index 88e59a8684..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/SwfEncoder.java +++ /dev/null @@ -1,353 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.AlphaComposite; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.RenderingHints; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.OutputStream; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; - -import javax.imageio.ImageIO; -import javax.swing.JOptionPane; -import javax.swing.ProgressMonitor; - -import com.flagstone.transform.Background; -import com.flagstone.transform.DefineTag; -import com.flagstone.transform.DoAction; -import com.flagstone.transform.Movie; -import com.flagstone.transform.MovieHeader; -import com.flagstone.transform.MovieTag; -import com.flagstone.transform.Place2; -import com.flagstone.transform.Remove; -import com.flagstone.transform.Remove2; -import com.flagstone.transform.ShowFrame; -import com.flagstone.transform.action.Action; -import com.flagstone.transform.action.BasicAction; -import com.flagstone.transform.coder.Coder; -import com.flagstone.transform.datatype.Bounds; -import com.flagstone.transform.datatype.CoordTransform; -import com.flagstone.transform.datatype.WebPalette; -import com.flagstone.transform.image.ImageTag; -import com.flagstone.transform.util.image.ImageDecoder; -import com.flagstone.transform.util.image.ImageRegistry; -import com.flagstone.transform.util.image.ImageShape; -import com.flagstone.transform.util.shape.Canvas; -import com.flagstone.transform.util.sound.SoundFactory; -import com.hammurapi.jcapture.VideoEncoder.Fragment.Frame; -import com.hammurapi.jcapture.VideoEncoder.Fragment.Frame.Shape; -import com.hammurapi.jcapture.VideoEncoder.Fragment.Frame.Shape.Image; -import com.hammurapi.jcapture.VideoEncoder.Fragment.Frame.Shape.ImageReference; -import com.hammurapi.jcapture.VideoEncoder.Fragment.Frame.Shape.ShapeContent; - -public class SwfEncoder implements VideoEncoder { - - @Override - public String getFileExtension() { - return "swf"; - } - - @Override - public String getMimeType() { - return "application/x-shockwave-flash"; - } - - @Override - public String toString() { - return "SWF"; - } - - @Override - public Dimension encode(Config config, - com.hammurapi.jcapture.Movie source, - OutputStream out) - throws Exception { - - AtomicInteger uid = new AtomicInteger(); - - /** - * For reusing shape id's. - */ - int maxId = Coder.USHORT_MAX; - - ButtonManager manager = null; - if (config.isToolBar()) { - manager = new ButtonManager(); - manager.loadLibrary(getClass().getResource("toolbar_buttons.swf")); - uid.set(manager.maxIdentifier()+1); - } - - Canvas path = new Canvas(); - path.setPixels(false); - - int minImgLayer = 10; - int imgLayer = minImgLayer; - int maxImgLayer = maxId - 1000; - - int mouseLayer = maxImgLayer+1; - int mouseUid = -1; - Place2 mousePlace = null; - ImageTag mouseImage = null; - - int layer = maxImgLayer+2; - - int totalWork = 0; - for (Fragment frg: source.getFragments()) { - totalWork = frg.getFrames().size()+1; - } - - ProgressMonitor progressMonitor = new ProgressMonitor(config.getParentComponent(), "Encoding to SWF", "Composing movie", 0, totalWork); - int progressCounter = 0; - - progressMonitor.setNote("Composing movie"); - boolean firstFrame = true; - Dimension ret = null; - Map imageCache = new IdentityHashMap(); - - Movie movie = new Movie(); - - Point prevMouseLocation = null; - - int frameNo = 0; - - for (Fragment fragment: source.getFragments()) { - - SoundFactory soundFactory = null; - boolean soundHeaderAdded = false; - File audio = fragment.getAudio(); - if (audio!=null) { - progressMonitor.setNote("Loading sound"); - soundFactory = new SoundFactory(); - - // MP3 conversion - if (config.getMp3command()!=null && config.getMp3command().trim().length()>0) { - audio = new File(audio.getAbsolutePath()+".mp3"); - Runtime runtime = Runtime.getRuntime(); - Process proc = runtime.exec(MessageFormat.format(config.getMp3command(), new Object[] {fragment.getAudio().getAbsolutePath(), audio.getAbsolutePath()})); - proc.waitFor(); - if (!fragment.getAudio().delete()) { - fragment.getAudio().deleteOnExit(); - } - } - - soundFactory.read(audio); - } - - progressMonitor.setProgress(++progressCounter); - - if (progressMonitor.isCanceled()) { - return null; - } - - for (Frame frame: fragment.getFrames()) { - if (progressMonitor.isCanceled()) { - return null; - } - - boolean addStop = false; - - ++frameNo; - - if (firstFrame) { - firstFrame = false; - - MovieHeader header = new MovieHeader(); - header.setCompressed(true); - header.setFrameRate(source.getFramesPerSecond()); - - int toolbarHeight = 29 * 20; - int toolbarWidth = 495 * 20; - - int toolbarX = 0; // - image.getWidth()*20/2; - int toolbarY = frame.getSize().height*20; - - int movieWidth = frame.getSize().width*20; - int movieHeight = frame.getSize().height*20; - if (config.isToolBar()) { - movieHeight+=toolbarHeight; - } - - ret = new Dimension(movieWidth/20, movieHeight/20); - - float toolbarScaleX = (float) movieWidth / (float) toolbarWidth; - float toolbarScaleY = 1.0f; - - Bounds movieBounds = new Bounds(0, 0, movieWidth, movieHeight); - header.setFrameSize(movieBounds); - movie.add(header); - movie.add(new Background(WebPalette.WHITE.color())); - - if (config.isToolBar()) { - // Add all the shapes etc used for buttons - List toolbarDefinitions = manager.getDefinitions(); - movie.getObjects().addAll(toolbarDefinitions); - - Place2 placeBackground = manager.getButton("background", layer++, 0, 0); - placeBackground.setTransform(new CoordTransform(toolbarScaleX, toolbarScaleY, 0, 0, toolbarX, toolbarY)); - - // Get the button to use and give its position - movie.add(placeBackground); - movie.add(manager.getButton("play_button", layer++, toolbarX + 500, toolbarY + toolbarHeight / 2)); - movie.add(manager.getButton("progress_bar", layer++, toolbarX + 1000, toolbarY + toolbarHeight / 2)); - movie.add(manager.getButton("volume_control", layer++, toolbarX + 5600, toolbarY + toolbarHeight / 2)); - - if (!config.isPlay()) { - addStop = true; - } - } - } - - if (!soundHeaderAdded && soundFactory!=null) { - movie.add(soundFactory.streamHeader(source.getFramesPerSecond())); - soundHeaderAdded = true; - } - - if (soundFactory!=null) { - MovieTag soundBlock = soundFactory.streamSound(); - if (soundBlock != null) { - movie.add(soundBlock); - } - } - - for (Shape shape: frame.getShapes()) { - if (shape.getContent().coversEverything() || imgLayer==maxImgLayer) { - for (int i=minImgLayer; i<=imgLayer; ++i) { - movie.add(new Remove2(i)); - } - imgLayer = minImgLayer; - } - - ShapeContent shapeContent = shape.getContent(); - Image image; - if (shapeContent instanceof Image) { - image = (Image) shapeContent; - } else if (shape.getContent() instanceof ImageReference) { - image = ((ImageReference) shapeContent).getImage(); - } else { - throw new IllegalArgumentException("Unexpected content type: "+shapeContent); - } - - ImageTag imageTag = imageCache.get(image); - if (imageTag==null) { - try { - ImageDecoder decoder = ImageRegistry.getImageProvider("image/"+config.getImageFormat().toLowerCase()); - decoder.read(new ByteArrayInputStream(image.getImage().getImageBytes())); - imageTag = decoder.defineImage(uid.incrementAndGet()); - imageCache.put(image, imageTag); - movie.add(imageTag); - } catch (Exception e) { - // Doing our best to create movie, even with flaws. - System.err.println("Error encoding image at frame "+frameNo+": "+e); - e.printStackTrace(); - if (JOptionPane.showConfirmDialog(config.getParentComponent(), - "Error encoding image ("+image.getImage().getWidth()+"*"+image.getImage().getHeight()+") at frame "+frameNo+": "+e+". Continue encoding?", - "Encoding error", - JOptionPane.YES_NO_OPTION, - JOptionPane.ERROR_MESSAGE)==JOptionPane.NO_OPTION) { - throw e; - } - } - } - - int shapeId = uid.incrementAndGet(); - DefineTag shapeTag = new ImageShape().defineShape(shapeId, imageTag); - Place2 place = Place2.show(shapeTag.getIdentifier(), imgLayer++, shape.getLocation().x*20, shape.getLocation().y*20); - movie.add(shapeTag); - movie.add(place); - } - - Point mouseLocation = frame.getMousePointer(); - if (mouseLocation!=null) { - if (mouseImage==null) { - BufferedImage mouseBi = ImageIO.read(getClass().getResource("mouse.png")); - if (config.getScreenScale()<0.99 || config.getScreenScale() > 1.01) { - BufferedImage scaled = new BufferedImage((int) (mouseBi.getWidth()*config.getScreenScale()), (int) (mouseBi.getHeight()*config.getScreenScale()), mouseBi.getType()); - Graphics2D g = scaled.createGraphics(); - g.setComposite(AlphaComposite.Src); - g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_QUALITY); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); - g.drawImage(mouseBi, 0, 0, scaled.getWidth(), scaled.getHeight(), null); - g.dispose(); - mouseBi = scaled; - } - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ImageIO.write(mouseBi, "PNG", baos); - baos.close(); - ImageDecoder decoder = ImageRegistry.getImageProvider("image/png"); - decoder.read(new ByteArrayInputStream(baos.toByteArray())); - mouseImage = decoder.defineImage(uid.incrementAndGet()); - movie.add(mouseImage); - } - - if (!mouseLocation.equals(prevMouseLocation)) { - prevMouseLocation = mouseLocation; - mouseUid = uid.incrementAndGet(); - DefineTag mShape = new ImageShape().defineShape(uid.incrementAndGet(), mouseImage); //createRect(mouseUid, 100, 100, WebPalette.RED.color()); - if (mousePlace==null) { - mousePlace = Place2.show(mShape.getIdentifier(), mouseLayer, mouseLocation.x*20, mouseLocation.y*20); - } else { - mousePlace = Place2.replace(mShape.getIdentifier(), mouseLayer, mouseLocation.x*20, mouseLocation.y*20); - } - movie.add(mShape); - movie.add(mousePlace); - } - } else if (mouseUid!=-1) { - Remove remove = new Remove(mouseUid, mouseLayer); - movie.add(remove); - } - - if (addStop) { - DoAction cmd = new DoAction(new ArrayList()); - cmd.add(BasicAction.STOP); - movie.add(cmd); - } - movie.add(ShowFrame.getInstance()); - - progressMonitor.setProgress(++progressCounter); - } - - progressMonitor.setProgress(++progressCounter); - if (soundFactory!=null) { - progressMonitor.setNote("Recording trailing sound"); - MovieTag block; - while ((block = soundFactory.streamSound()) != null) { - movie.add(block); - movie.add(ShowFrame.getInstance()); - } - } - - if (audio!=null) { - if (!audio.delete()) { - audio.deleteOnExit(); - } - } - } - - if (!config.isLoop()) { - List actions = new ArrayList(); - actions.add(BasicAction.STOP); - actions.add(BasicAction.END); - DoAction doAction = new DoAction(actions); - movie.add(doAction); - movie.add(ShowFrame.getInstance()); - } - - progressMonitor.setProgress(++progressCounter); - progressMonitor.setNote("Encoding movie"); - movie.encodeToStream(out); - source.close(); - return ret; - } - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/Translucener.java b/main/document/jcapture/src/com/hammurapi/jcapture/Translucener.java deleted file mode 100644 index 33a537b7f2..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/Translucener.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.Frame; - -abstract class Translucener { - - protected abstract void makeTranslucent(Frame frame); - - static void makeFrameTranslucent(Frame frame) throws Exception { - String jVersion = System.getProperty("java.version"); - if (jVersion==null || "1.6".equals(jVersion) || jVersion.startsWith("1.6.")) { - ((Translucener) Class.forName("com.hammurapi.jcapture.AWTUtilitiesTranslucener").newInstance()).makeTranslucent(frame); - } else { - ((Translucener) Class.forName("com.hammurapi.jcapture.GraphicsDeviceTranslucener").newInstance()).makeTranslucent(frame); - } - } -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/VideoEncoder.java b/main/document/jcapture/src/com/hammurapi/jcapture/VideoEncoder.java deleted file mode 100644 index d32f2a8343..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/VideoEncoder.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.hammurapi.jcapture; - -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Point; -import java.io.File; -import java.io.OutputStream; -import java.util.List; - -/** - * This is a service interface to be implemented by video encoders. - * jCapture discovers encoders using java.util.ServiceLoader. - * - * All interfaces used by this interface are defined as nested for easy reference. - * @author Pavel - * - */ -public interface VideoEncoder { - - interface Config { - - /** - * - * @return true if encoder shall add a toolbar to the movie. - */ - boolean isToolBar(); - - /** - * - * @return true if movie shall be played in a loop. - */ - boolean isLoop(); - - /** - * - * @return true if movie shall start playing after downloading. - */ - boolean isPlay(); - - /** - * @return For scaling mouse pointer. - */ - double getScreenScale(); - - /** - * For progress monitor. - * @return - */ - Component getParentComponent(); - - String getImageFormat(); - - /** - * @return OS command to convert WAV to MP3 if encoder requires/benefits from it. - */ - String getMp3command(); - } - - /** - * Movie fragment is a collection of frames with associated audio. - * @author Pavel - * - */ - interface Fragment { - - /** - * Frame contains zero or more shapes and mouse location. - * @author Pavel - * - */ - interface Frame { - - boolean isActive(); - - /** - * Image shape to be placed on the screen. - * @author Pavel - * - */ - interface Shape { - - /** - * Base interface for shape content. - * @author Pavel - * - */ - interface ShapeContent { - - /** - * @return true if this shape covers the entire screen area. - */ - boolean coversEverything(); - } - - interface Image extends ShapeContent { - - MappedImage getImage(); - - } - - /** - * References already defined image. - * @author Pavel - * - */ - interface ImageReference extends ShapeContent { - - Image getImage(); - - } - - Point getLocation(); - - ShapeContent getContent(); - - } - - /** - * Frame's shapes. - * @return - */ - List getShapes(); - - Point getMousePointer(); - - Dimension getSize(); - - } - - /** - * Fragment frames. - * @return - */ - List getFrames(); - - /** - * Audio file (WAV). - * @return - */ - File getAudio(); - - } - - String getFileExtension(); - - String getMimeType(); - - /** - * This method shall return output format name, e.g. SWF. - * @return - */ - String toString(); - - /** - * Encodes video to output stream. - * @param fragments Fragments to encode - * @param out Output stream - * @param progressMonitor Progress monitor has work allocated for each frame plus one unit of work per fragment for sound decoding plus one unit for final encoding. - * @param progressCounter current progress counter position. - * @return movie size or null if operation was cancelled - */ - Dimension encode(Config config, Movie movie, OutputStream out) throws Exception; - -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/WavFile.java b/main/document/jcapture/src/com/hammurapi/jcapture/WavFile.java deleted file mode 100644 index 0c2d68e722..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/WavFile.java +++ /dev/null @@ -1,787 +0,0 @@ -package com.hammurapi.jcapture; - -// This file was taken from http://www.labbookpages.co.uk/audio/javaWavFiles.html - -// Wav file IO class -// A.Greensted -// http://www.labbookpages.co.uk - -// File format is based on the information from -// http://www.sonicspot.com/guide/wavefiles.html -// http://www.blitter.com/~russtopia/MIDI/~jglatt/tech/wave.htm - -// Version 1.0 - -import java.io.*; - -public class WavFile { - private enum IOState { - READING, WRITING, CLOSED - }; - - private final static int BUFFER_SIZE = 4096; - - private final static int FMT_CHUNK_ID = 0x20746D66; - private final static int DATA_CHUNK_ID = 0x61746164; - private final static int RIFF_CHUNK_ID = 0x46464952; - private final static int RIFF_TYPE_ID = 0x45564157; - - private File file; // File that will be read from or written to - private IOState ioState; // Specifies the IO State of the Wav File (used for - // snaity checking) - private int bytesPerSample; // Number of bytes required to store a single - // sample - private long numFrames; // Number of frames within the data section - private FileOutputStream oStream; // Output stream used for writting data - private FileInputStream iStream; // Input stream used for reading data - private double floatScale; // Scaling factor used for int <-> float - // conversion - private double floatOffset; // Offset factor used for int <-> float - // conversion - private boolean wordAlignAdjust; // Specify if an extra byte at the end of - // the data chunk is required for word - // alignment - - // Wav Header - private int numChannels; // 2 bytes unsigned, 0x0001 (1) to 0xFFFF (65,535) - private long sampleRate; // 4 bytes unsigned, 0x00000001 (1) to 0xFFFFFFFF - // (4,294,967,295) - // Although a java int is 4 bytes, it is signed, - // so need to use a long - private int blockAlign; // 2 bytes unsigned, 0x0001 (1) to 0xFFFF (65,535) - private int validBits; // 2 bytes unsigned, 0x0002 (2) to 0xFFFF (65,535) - - // Buffering - private byte[] buffer; // Local buffer used for IO - private int bufferPointer; // Points to the current position in local buffer - private int bytesRead; // Bytes read after last read into local buffer - private long frameCounter; // Current number of frames read or written - - // Cannot instantiate WavFile directly, must either use newWavFile() or - // openWavFile() - private WavFile() { - buffer = new byte[BUFFER_SIZE]; - } - - public int getNumChannels() { - return numChannels; - } - - public long getNumFrames() { - return numFrames; - } - - public long getFramesRemaining() { - return numFrames - frameCounter; - } - - public long getSampleRate() { - return sampleRate; - } - - public int getValidBits() { - return validBits; - } - - public static WavFile newWavFile(File file, int numChannels, - long numFrames, int validBits, long sampleRate) throws IOException, - WavFileException { - // Instantiate new Wavfile and initialise - WavFile wavFile = new WavFile(); - wavFile.file = file; - wavFile.numChannels = numChannels; - wavFile.numFrames = numFrames; - wavFile.sampleRate = sampleRate; - wavFile.bytesPerSample = (validBits + 7) / 8; - wavFile.blockAlign = wavFile.bytesPerSample * numChannels; - wavFile.validBits = validBits; - - // Sanity check arguments - if (numChannels < 1 || numChannels > 65535) - throw new WavFileException( - "Illegal number of channels, valid range 1 to 65536"); - if (numFrames < 0) - throw new WavFileException("Number of frames must be positive"); - if (validBits < 2 || validBits > 65535) - throw new WavFileException( - "Illegal number of valid bits, valid range 2 to 65536"); - if (sampleRate < 0) - throw new WavFileException("Sample rate must be positive"); - - // Create output stream for writing data - wavFile.oStream = new FileOutputStream(file); - - // Calculate the chunk sizes - long dataChunkSize = wavFile.blockAlign * numFrames; - long mainChunkSize = 4 + // Riff Type - 8 + // Format ID and size - 16 + // Format data - 8 + // Data ID and size - dataChunkSize; - - // Chunks must be word aligned, so if odd number of audio data bytes - // adjust the main chunk size - if (dataChunkSize % 2 == 1) { - mainChunkSize += 1; - wavFile.wordAlignAdjust = true; - } else { - wavFile.wordAlignAdjust = false; - } - - // Set the main chunk size - putLE(RIFF_CHUNK_ID, wavFile.buffer, 0, 4); - putLE(mainChunkSize, wavFile.buffer, 4, 4); - putLE(RIFF_TYPE_ID, wavFile.buffer, 8, 4); - - // Write out the header - wavFile.oStream.write(wavFile.buffer, 0, 12); - - // Put format data in buffer - long averageBytesPerSecond = sampleRate * wavFile.blockAlign; - - putLE(FMT_CHUNK_ID, wavFile.buffer, 0, 4); // Chunk ID - putLE(16, wavFile.buffer, 4, 4); // Chunk Data Size - putLE(1, wavFile.buffer, 8, 2); // Compression Code (Uncompressed) - putLE(numChannels, wavFile.buffer, 10, 2); // Number of channels - putLE(sampleRate, wavFile.buffer, 12, 4); // Sample Rate - putLE(averageBytesPerSecond, wavFile.buffer, 16, 4); // Average Bytes - // Per Second - putLE(wavFile.blockAlign, wavFile.buffer, 20, 2); // Block Align - putLE(validBits, wavFile.buffer, 22, 2); // Valid Bits - - // Write Format Chunk - wavFile.oStream.write(wavFile.buffer, 0, 24); - - // Start Data Chunk - putLE(DATA_CHUNK_ID, wavFile.buffer, 0, 4); // Chunk ID - putLE(dataChunkSize, wavFile.buffer, 4, 4); // Chunk Data Size - - // Write Format Chunk - wavFile.oStream.write(wavFile.buffer, 0, 8); - - // Calculate the scaling factor for converting to a normalised double - if (wavFile.validBits > 8) { - // If more than 8 validBits, data is signed - // Conversion required multiplying by magnitude of max positive - // value - wavFile.floatOffset = 0; - wavFile.floatScale = Long.MAX_VALUE >> (64 - wavFile.validBits); - } else { - // Else if 8 or less validBits, data is unsigned - // Conversion required dividing by max positive value - wavFile.floatOffset = 1; - wavFile.floatScale = 0.5 * ((1 << wavFile.validBits) - 1); - } - - // Finally, set the IO State - wavFile.bufferPointer = 0; - wavFile.bytesRead = 0; - wavFile.frameCounter = 0; - wavFile.ioState = IOState.WRITING; - - return wavFile; - } - - public static WavFile openWavFile(File file) throws IOException, - WavFileException { - // Instantiate new Wavfile and store the file reference - WavFile wavFile = new WavFile(); - wavFile.file = file; - - // Create a new file input stream for reading file data - wavFile.iStream = new FileInputStream(file); - - // Read the first 12 bytes of the file - int bytesRead = wavFile.iStream.read(wavFile.buffer, 0, 12); - if (bytesRead != 12) - throw new WavFileException("Not enough wav file bytes for header"); - - // Extract parts from the header - long riffChunkID = getLE(wavFile.buffer, 0, 4); - long chunkSize = getLE(wavFile.buffer, 4, 4); - long riffTypeID = getLE(wavFile.buffer, 8, 4); - - // Check the header bytes contains the correct signature - if (riffChunkID != RIFF_CHUNK_ID) - throw new WavFileException( - "Invalid Wav Header data, incorrect riff chunk ID"); - if (riffTypeID != RIFF_TYPE_ID) - throw new WavFileException( - "Invalid Wav Header data, incorrect riff type ID"); - - // Check that the file size matches the number of bytes listed in header - if (file.length() != chunkSize + 8) { - throw new WavFileException("Header chunk size (" + chunkSize - + ") does not match file size (" + file.length() + ")"); - } - - boolean foundFormat = false; - boolean foundData = false; - - // Search for the Format and Data Chunks - while (true) { - // Read the first 8 bytes of the chunk (ID and chunk size) - bytesRead = wavFile.iStream.read(wavFile.buffer, 0, 8); - if (bytesRead == -1) - throw new WavFileException( - "Reached end of file without finding format chunk"); - if (bytesRead != 8) - throw new WavFileException("Could not read chunk header"); - - // Extract the chunk ID and Size - long chunkID = getLE(wavFile.buffer, 0, 4); - chunkSize = getLE(wavFile.buffer, 4, 4); - - // Word align the chunk size - // chunkSize specifies the number of bytes holding data. However, - // the data should be word aligned (2 bytes) so we need to calculate - // the actual number of bytes in the chunk - long numChunkBytes = (chunkSize % 2 == 1) ? chunkSize + 1 - : chunkSize; - - if (chunkID == FMT_CHUNK_ID) { - // Flag that the format chunk has been found - foundFormat = true; - - // Read in the header info - bytesRead = wavFile.iStream.read(wavFile.buffer, 0, 16); - - // Check this is uncompressed data - int compressionCode = (int) getLE(wavFile.buffer, 0, 2); - if (compressionCode != 1) - throw new WavFileException("Compression Code " - + compressionCode + " not supported"); - - // Extract the format information - wavFile.numChannels = (int) getLE(wavFile.buffer, 2, 2); - wavFile.sampleRate = getLE(wavFile.buffer, 4, 4); - wavFile.blockAlign = (int) getLE(wavFile.buffer, 12, 2); - wavFile.validBits = (int) getLE(wavFile.buffer, 14, 2); - - if (wavFile.numChannels == 0) - throw new WavFileException( - "Number of channels specified in header is equal to zero"); - if (wavFile.blockAlign == 0) - throw new WavFileException( - "Block Align specified in header is equal to zero"); - if (wavFile.validBits < 2) - throw new WavFileException( - "Valid Bits specified in header is less than 2"); - if (wavFile.validBits > 64) - throw new WavFileException( - "Valid Bits specified in header is greater than 64, this is greater than a long can hold"); - - // Calculate the number of bytes required to hold 1 sample - wavFile.bytesPerSample = (wavFile.validBits + 7) / 8; - if (wavFile.bytesPerSample * wavFile.numChannels != wavFile.blockAlign) - throw new WavFileException( - "Block Align does not agree with bytes required for validBits and number of channels"); - - // Account for number of format bytes and then skip over - // any extra format bytes - numChunkBytes -= 16; - if (numChunkBytes > 0) - wavFile.iStream.skip(numChunkBytes); - } else if (chunkID == DATA_CHUNK_ID) { - // Check if we've found the format chunk, - // If not, throw an exception as we need the format information - // before we can read the data chunk - if (foundFormat == false) - throw new WavFileException( - "Data chunk found before Format chunk"); - - // Check that the chunkSize (wav data length) is a multiple of - // the - // block align (bytes per frame) - if (chunkSize % wavFile.blockAlign != 0) - throw new WavFileException( - "Data Chunk size is not multiple of Block Align"); - - // Calculate the number of frames - wavFile.numFrames = chunkSize / wavFile.blockAlign; - - // Flag that we've found the wave data chunk - foundData = true; - - break; - } else { - // If an unknown chunk ID is found, just skip over the chunk - // data - wavFile.iStream.skip(numChunkBytes); - } - } - - // Throw an exception if no data chunk has been found - if (foundData == false) - throw new WavFileException("Did not find a data chunk"); - - // Calculate the scaling factor for converting to a normalised double - if (wavFile.validBits > 8) { - // If more than 8 validBits, data is signed - // Conversion required dividing by magnitude of max negative value - wavFile.floatOffset = 0; - wavFile.floatScale = 1 << (wavFile.validBits - 1); - } else { - // Else if 8 or less validBits, data is unsigned - // Conversion required dividing by max positive value - wavFile.floatOffset = -1; - wavFile.floatScale = 0.5 * ((1 << wavFile.validBits) - 1); - } - - wavFile.bufferPointer = 0; - wavFile.bytesRead = 0; - wavFile.frameCounter = 0; - wavFile.ioState = IOState.READING; - - return wavFile; - } - - // Get and Put little endian data from local buffer - // ------------------------------------------------ - private static long getLE(byte[] buffer, int pos, int numBytes) { - numBytes--; - pos += numBytes; - - long val = buffer[pos] & 0xFF; - for (int b = 0; b < numBytes; b++) - val = (val << 8) + (buffer[--pos] & 0xFF); - - return val; - } - - private static void putLE(long val, byte[] buffer, int pos, int numBytes) { - for (int b = 0; b < numBytes; b++) { - buffer[pos] = (byte) (val & 0xFF); - val >>= 8; - pos++; - } - } - - // Sample Writing and Reading - // -------------------------- - private void writeSample(long val) throws IOException { - for (int b = 0; b < bytesPerSample; b++) { - if (bufferPointer == BUFFER_SIZE) { - oStream.write(buffer, 0, BUFFER_SIZE); - bufferPointer = 0; - } - - buffer[bufferPointer] = (byte) (val & 0xFF); - val >>= 8; - bufferPointer++; - } - } - - private long readSample() throws IOException, WavFileException { - long val = 0; - - for (int b = 0; b < bytesPerSample; b++) { - if (bufferPointer == bytesRead) { - int read = iStream.read(buffer, 0, BUFFER_SIZE); - if (read == -1) - throw new WavFileException("Not enough data available"); - bytesRead = read; - bufferPointer = 0; - } - - int v = buffer[bufferPointer]; - if (b < bytesPerSample - 1 || bytesPerSample == 1) - v &= 0xFF; - val += v << (b * 8); - - bufferPointer++; - } - - return val; - } - - // Integer - // ------- - public int readFrames(int[] sampleBuffer, int numFramesToRead) - throws IOException, WavFileException { - return readFrames(sampleBuffer, 0, numFramesToRead); - } - - public int readFrames(int[] sampleBuffer, int offset, int numFramesToRead) - throws IOException, WavFileException { - if (ioState != IOState.READING) - throw new IOException("Cannot read from WavFile instance"); - - for (int f = 0; f < numFramesToRead; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) { - sampleBuffer[offset] = (int) readSample(); - offset++; - } - - frameCounter++; - } - - return numFramesToRead; - } - - public int readFrames(int[][] sampleBuffer, int numFramesToRead) - throws IOException, WavFileException { - return readFrames(sampleBuffer, 0, numFramesToRead); - } - - public int readFrames(int[][] sampleBuffer, int offset, int numFramesToRead) - throws IOException, WavFileException { - if (ioState != IOState.READING) - throw new IOException("Cannot read from WavFile instance"); - - for (int f = 0; f < numFramesToRead; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) - sampleBuffer[c][offset] = (int) readSample(); - - offset++; - frameCounter++; - } - - return numFramesToRead; - } - - public int writeFrames(int[] sampleBuffer, int numFramesToWrite) - throws IOException, WavFileException { - return writeFrames(sampleBuffer, 0, numFramesToWrite); - } - - public int writeFrames(int[] sampleBuffer, int offset, int numFramesToWrite) - throws IOException, WavFileException { - if (ioState != IOState.WRITING) - throw new IOException("Cannot write to WavFile instance"); - - for (int f = 0; f < numFramesToWrite; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) { - writeSample(sampleBuffer[offset]); - offset++; - } - - frameCounter++; - } - - return numFramesToWrite; - } - - public int writeFrames(int[][] sampleBuffer, int numFramesToWrite) - throws IOException, WavFileException { - return writeFrames(sampleBuffer, 0, numFramesToWrite); - } - - public int writeFrames(int[][] sampleBuffer, int offset, - int numFramesToWrite) throws IOException, WavFileException { - if (ioState != IOState.WRITING) - throw new IOException("Cannot write to WavFile instance"); - - for (int f = 0; f < numFramesToWrite; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) - writeSample(sampleBuffer[c][offset]); - - offset++; - frameCounter++; - } - - return numFramesToWrite; - } - - // Long - // ---- - public int readFrames(long[] sampleBuffer, int numFramesToRead) - throws IOException, WavFileException { - return readFrames(sampleBuffer, 0, numFramesToRead); - } - - public int readFrames(long[] sampleBuffer, int offset, int numFramesToRead) - throws IOException, WavFileException { - if (ioState != IOState.READING) - throw new IOException("Cannot read from WavFile instance"); - - for (int f = 0; f < numFramesToRead; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) { - sampleBuffer[offset] = readSample(); - offset++; - } - - frameCounter++; - } - - return numFramesToRead; - } - - public int readFrames(long[][] sampleBuffer, int numFramesToRead) - throws IOException, WavFileException { - return readFrames(sampleBuffer, 0, numFramesToRead); - } - - public int readFrames(long[][] sampleBuffer, int offset, int numFramesToRead) - throws IOException, WavFileException { - if (ioState != IOState.READING) - throw new IOException("Cannot read from WavFile instance"); - - for (int f = 0; f < numFramesToRead; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) - sampleBuffer[c][offset] = readSample(); - - offset++; - frameCounter++; - } - - return numFramesToRead; - } - - public int writeFrames(long[] sampleBuffer, int numFramesToWrite) - throws IOException, WavFileException { - return writeFrames(sampleBuffer, 0, numFramesToWrite); - } - - public int writeFrames(long[] sampleBuffer, int offset, int numFramesToWrite) - throws IOException, WavFileException { - if (ioState != IOState.WRITING) - throw new IOException("Cannot write to WavFile instance"); - - for (int f = 0; f < numFramesToWrite; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) { - writeSample(sampleBuffer[offset]); - offset++; - } - - frameCounter++; - } - - return numFramesToWrite; - } - - public int writeFrames(long[][] sampleBuffer, int numFramesToWrite) - throws IOException, WavFileException { - return writeFrames(sampleBuffer, 0, numFramesToWrite); - } - - public int writeFrames(long[][] sampleBuffer, int offset, - int numFramesToWrite) throws IOException, WavFileException { - if (ioState != IOState.WRITING) - throw new IOException("Cannot write to WavFile instance"); - - for (int f = 0; f < numFramesToWrite; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) - writeSample(sampleBuffer[c][offset]); - - offset++; - frameCounter++; - } - - return numFramesToWrite; - } - - // Double - // ------ - public int readFrames(double[] sampleBuffer, int numFramesToRead) - throws IOException, WavFileException { - return readFrames(sampleBuffer, 0, numFramesToRead); - } - - public int readFrames(double[] sampleBuffer, int offset, int numFramesToRead) - throws IOException, WavFileException { - if (ioState != IOState.READING) - throw new IOException("Cannot read from WavFile instance"); - - for (int f = 0; f < numFramesToRead; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) { - sampleBuffer[offset] = floatOffset + (double) readSample() - / floatScale; - offset++; - } - - frameCounter++; - } - - return numFramesToRead; - } - - public int readFrames(double[][] sampleBuffer, int numFramesToRead) - throws IOException, WavFileException { - return readFrames(sampleBuffer, 0, numFramesToRead); - } - - public int readFrames(double[][] sampleBuffer, int offset, - int numFramesToRead) throws IOException, WavFileException { - if (ioState != IOState.READING) - throw new IOException("Cannot read from WavFile instance"); - - for (int f = 0; f < numFramesToRead; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) - sampleBuffer[c][offset] = floatOffset + (double) readSample() - / floatScale; - - offset++; - frameCounter++; - } - - return numFramesToRead; - } - - public int writeFrames(double[] sampleBuffer, int numFramesToWrite) - throws IOException, WavFileException { - return writeFrames(sampleBuffer, 0, numFramesToWrite); - } - - public int writeFrames(double[] sampleBuffer, int offset, - int numFramesToWrite) throws IOException, WavFileException { - if (ioState != IOState.WRITING) - throw new IOException("Cannot write to WavFile instance"); - - for (int f = 0; f < numFramesToWrite; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) { - writeSample((long) (floatScale * (floatOffset + sampleBuffer[offset]))); - offset++; - } - - frameCounter++; - } - - return numFramesToWrite; - } - - public int writeFrames(double[][] sampleBuffer, int numFramesToWrite) - throws IOException, WavFileException { - return writeFrames(sampleBuffer, 0, numFramesToWrite); - } - - public int writeFrames(double[][] sampleBuffer, int offset, - int numFramesToWrite) throws IOException, WavFileException { - if (ioState != IOState.WRITING) - throw new IOException("Cannot write to WavFile instance"); - - for (int f = 0; f < numFramesToWrite; f++) { - if (frameCounter == numFrames) - return f; - - for (int c = 0; c < numChannels; c++) - writeSample((long) (floatScale * (floatOffset + sampleBuffer[c][offset]))); - - offset++; - frameCounter++; - } - - return numFramesToWrite; - } - - public void close() throws IOException { - // Close the input stream and set to null - if (iStream != null) { - iStream.close(); - iStream = null; - } - - if (oStream != null) { - // Write out anything still in the local buffer - if (bufferPointer > 0) - oStream.write(buffer, 0, bufferPointer); - - // If an extra byte is required for word alignment, add it to the - // end - if (wordAlignAdjust) - oStream.write(0); - - // Close the stream and set to null - oStream.close(); - oStream = null; - } - - // Flag that the stream is closed - ioState = IOState.CLOSED; - } - - public void display() { - display(System.out); - } - - public void display(PrintStream out) { - out.printf("File: %s\n", file); - out.printf("Channels: %d, Frames: %d\n", numChannels, numFrames); - out.printf("IO State: %s\n", ioState); - out.printf("Sample Rate: %d, Block Align: %d\n", sampleRate, blockAlign); - out.printf("Valid Bits: %d, Bytes per sample: %d\n", validBits, - bytesPerSample); - } - - public static void main(String[] args) { - if (args.length < 1) { - System.err.println("Must supply filename"); - System.exit(1); - } - - try { - for (String filename : args) { - WavFile readWavFile = openWavFile(new File(filename)); - readWavFile.display(); - - long numFrames = readWavFile.getNumFrames(); - int numChannels = readWavFile.getNumChannels(); - int validBits = readWavFile.getValidBits(); - long sampleRate = readWavFile.getSampleRate(); - - WavFile writeWavFile = newWavFile(new File("out.wav"), - numChannels, numFrames, validBits, sampleRate); - - final int BUF_SIZE = 5001; - - // int[] buffer = new int[BUF_SIZE * numChannels]; - // long[] buffer = new long[BUF_SIZE * numChannels]; - double[] buffer = new double[BUF_SIZE * numChannels]; - - int framesRead = 0; - int framesWritten = 0; - - do { - framesRead = readWavFile.readFrames(buffer, BUF_SIZE); - framesWritten = writeWavFile.writeFrames(buffer, BUF_SIZE); - System.out.printf("%d %d\n", framesRead, framesWritten); - } while (framesRead != 0); - - readWavFile.close(); - writeWavFile.close(); - } - - WavFile writeWavFile = newWavFile(new File("out2.wav"), 1, 10, 23, - 44100); - double[] buffer = new double[10]; - writeWavFile.writeFrames(buffer, 10); - writeWavFile.close(); - } catch (Exception e) { - System.err.println(e); - e.printStackTrace(); - } - } -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/WavFileException.java b/main/document/jcapture/src/com/hammurapi/jcapture/WavFileException.java deleted file mode 100644 index 64e27feb71..0000000000 --- a/main/document/jcapture/src/com/hammurapi/jcapture/WavFileException.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.hammurapi.jcapture; - -//This file was taken from http://www.labbookpages.co.uk/audio/javaWavFiles.html and package declaration was added. - -public class WavFileException extends Exception -{ - public WavFileException() - { - super(); - } - - public WavFileException(String message) - { - super(message); - } - - public WavFileException(String message, Throwable cause) - { - super(message, cause); - } - - public WavFileException(Throwable cause) - { - super(cause); - } -} diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/camera.png b/main/document/jcapture/src/com/hammurapi/jcapture/camera.png deleted file mode 100644 index f7cbba0a8c..0000000000 Binary files a/main/document/jcapture/src/com/hammurapi/jcapture/camera.png and /dev/null differ diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/mouse.png b/main/document/jcapture/src/com/hammurapi/jcapture/mouse.png deleted file mode 100644 index 59c10fd242..0000000000 Binary files a/main/document/jcapture/src/com/hammurapi/jcapture/mouse.png and /dev/null differ diff --git a/main/document/jcapture/src/com/hammurapi/jcapture/toolbar_buttons.swf b/main/document/jcapture/src/com/hammurapi/jcapture/toolbar_buttons.swf deleted file mode 100644 index 524d8a3042..0000000000 Binary files a/main/document/jcapture/src/com/hammurapi/jcapture/toolbar_buttons.swf and /dev/null differ