From: <ez...@us...> - 2006-11-01 22:11:52
|
Revision: 7873 http://svn.sourceforge.net/jedit/?rev=7873&view=rev Author: ezust Date: 2006-11-01 14:05:08 -0800 (Wed, 01 Nov 2006) Log Message: ----------- Added descriptions. Modified Paths: -------------- plugins/JDiffPlugin/trunk/JDiffPlugin.props Added Paths: ----------- plugins/JDiffPlugin/trunk/description.html Modified: plugins/JDiffPlugin/trunk/JDiffPlugin.props =================================================================== --- plugins/JDiffPlugin/trunk/JDiffPlugin.props 2006-11-01 21:48:12 UTC (rev 7872) +++ plugins/JDiffPlugin/trunk/JDiffPlugin.props 2006-11-01 22:05:08 UTC (rev 7873) @@ -4,6 +4,7 @@ plugin.jdiff.JDiffPlugin.author=Andre Kaplan/Mark Wickens plugin.jdiff.JDiffPlugin.version=1.5.1 plugin.jdiff.JDiffPlugin.docs=users-guide.html +plugin.jdiff.JDiffPlugin.description=JDiffPlugin is a visual diff utility for jEdit. # Dependencies plugin.jdiff.JDiffPlugin.depend.0=jdk 1.5 Added: plugins/JDiffPlugin/trunk/description.html =================================================================== --- plugins/JDiffPlugin/trunk/description.html (rev 0) +++ plugins/JDiffPlugin/trunk/description.html 2006-11-01 22:05:08 UTC (rev 7873) @@ -0,0 +1 @@ +JDiffPlugin is a visual diff utility for jEdit. Property changes on: plugins/JDiffPlugin/trunk/description.html ___________________________________________________________________ Name: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ez...@us...> - 2007-07-30 23:40:21
|
Revision: 10241 http://jedit.svn.sourceforge.net/jedit/?rev=10241&view=rev Author: ezust Date: 2007-07-30 16:39:52 -0700 (Mon, 30 Jul 2007) Log Message: ----------- Reformatted DualDiff.java Applied patch 1522563 - allow variable amount of whitespace to ignore. Modified Paths: -------------- plugins/JDiffPlugin/trunk/JDiffPlugin.props plugins/JDiffPlugin/trunk/actions.xml plugins/JDiffPlugin/trunk/build.xml plugins/JDiffPlugin/trunk/jdiff/DualDiff.java plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java plugins/JDiffPlugin/trunk/users-guide.xml Modified: plugins/JDiffPlugin/trunk/JDiffPlugin.props =================================================================== --- plugins/JDiffPlugin/trunk/JDiffPlugin.props 2007-07-30 22:33:22 UTC (rev 10240) +++ plugins/JDiffPlugin/trunk/JDiffPlugin.props 2007-07-30 23:39:52 UTC (rev 10241) @@ -2,7 +2,7 @@ # Author: Andre Kaplan plugin.jdiff.JDiffPlugin.name=JDiff Plugin plugin.jdiff.JDiffPlugin.author=Andre Kaplan/Mark Wickens -plugin.jdiff.JDiffPlugin.version=1.5.1 +plugin.jdiff.JDiffPlugin.version=1.5.2 plugin.jdiff.JDiffPlugin.docs=users-guide.html plugin.jdiff.JDiffPlugin.description=JDiffPlugin is a visual diff utility for jEdit. @@ -22,7 +22,8 @@ - \ jdiff.toggle-ignore-case \ jdiff.toggle-trim-whitespace \ - jdiff.toggle-ignore-whitespace \ + jdiff.toggle-ignore-amount-whitespace \ + jdiff.toggle-ignore-all-whitespace \ - \ jdiff.diff-normal-output @@ -39,12 +40,14 @@ jdiff.next-diff.label=Go to Next Difference jdiff.toggle-ignore-case.label=Ignore case jdiff.toggle-trim-whitespace.label=Ignore leading and trailing whitespace -jdiff.toggle-ignore-whitespace.label=Ignore all whitespace +jdiff.toggle-ignore-amount-whitespace.label=Ignore amount of whitespace +jdiff.toggle-ignore-all-whitespace.label=Ignore all whitespace jdiff.diff-normal-output.label=Normal Diff Output jdiff.ignore-case=false jdiff.trim-whitespace=false -jdiff.ignore-whitespace=false +jdiff.ignore-amount-whitespace=false +jdiff.ignore-all-whitespace=false jdiff.global-virtual-overview=false @@ -70,7 +73,8 @@ options.jdiff.ignore-case=Ignore case options.jdiff.trim-whitespace=Ignore leading and trailing whitespace -options.jdiff.ignore-whitespace=Ignore all whitespace +options.jdiff.ignore-amount-whitespace=Ignore amount of whitespace +options.jdiff.ignore-all-whitespace=Ignore all whitespace options.jdiff.overview-display=Global overview display: options.jdiff.physical-overview=Physical overview Modified: plugins/JDiffPlugin/trunk/actions.xml =================================================================== --- plugins/JDiffPlugin/trunk/actions.xml 2007-07-30 22:33:22 UTC (rev 10240) +++ plugins/JDiffPlugin/trunk/actions.xml 2007-07-30 23:39:52 UTC (rev 10241) @@ -47,14 +47,23 @@ </ACTION> - <ACTION NAME="jdiff.toggle-ignore-whitespace"> + <ACTION NAME="jdiff.toggle-ignore-amount-whitespace"> <CODE> - jdiff.DualDiff.toggleIgnoreWhitespaceFor(view); + jdiff.DualDiff.toggleIgnoreAmountOfWhitespaceFor(view); </CODE> <IS_SELECTED> - return jdiff.DualDiff.getIgnoreWhitespaceFor(view); + return jdiff.DualDiff.getIgnoreAmountOfWhitespaceFor(view); </IS_SELECTED> </ACTION> + + <ACTION NAME="jdiff.toggle-ignore-all-whitespace"> + <CODE> + jdiff.DualDiff.toggleIgnoreAllWhitespaceFor(view); + </CODE> + <IS_SELECTED> + return jdiff.DualDiff.getIgnoreAllWhitespaceFor(view); + </IS_SELECTED> + </ACTION> <ACTION NAME="jdiff.next-diff"> Modified: plugins/JDiffPlugin/trunk/build.xml =================================================================== --- plugins/JDiffPlugin/trunk/build.xml 2007-07-30 22:33:22 UTC (rev 10240) +++ plugins/JDiffPlugin/trunk/build.xml 2007-07-30 23:39:52 UTC (rev 10241) @@ -8,34 +8,14 @@ the JAR file. Before running the 'dist' target, you will need to choose whether to generate the documentation using one of these two targets: - - 'docs-xsltproc': Creates documentation using the xsltproc tool from - libxslt, available at http://xmlsoft.org/XSLT - - 'docs-xalan': Creates documentation using the Xalan XSLT processor, - available at http://xml.apache.org/ - - The default processor is xsltproc. You can change the processor to Xalan by - setting the docs-proc.target property to xalan. This can be done on the - command line by adding '-Ddocs-proc.target=xalan'. If you do not have any - documentation, you can remove the 'docs' target from the depends list for - the 'dist' target. - - To use this template for building your own plugin, make these changes: - - - Change 'name' property for the <project> to the name of your plugin - - Change definition of 'jedit.install.dir' to point to the directory - containing jedit.jar - - If necessary, add any dependencies to the 'project.class.path' definition - - If necessary, change the list of files in the 'dist' target - - If necessary, change the 'docs-xalan' and 'docs-xsltproc' targets to - reflect the appropriate values for your documentation - --> <project name="JDiffPlugin" default="dist" basedir="."> <property file="build.properties"/> <property file="../build.properties"/> - + <property name="user-doc.xml" location = "users-guide.xml"/> + <import file="${build.support}/plugin-build.xml" /> <property name="jedit.install.dir" value="../.."/> <property name="jar.name" value="${ant.project.name}.jar"/> <property name="docs-proc.target" value="xsltproc"/> Modified: plugins/JDiffPlugin/trunk/jdiff/DualDiff.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2007-07-30 22:33:22 UTC (rev 10240) +++ plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2007-07-30 23:39:52 UTC (rev 10241) @@ -20,10 +20,6 @@ package jdiff; -import java.awt.Component; -import java.awt.Container; -import java.awt.event.AdjustmentEvent; -import java.awt.event.AdjustmentListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.MouseEvent; @@ -34,14 +30,9 @@ import java.io.StringWriter; import java.util.Hashtable; -import java.util.Enumeration; - import javax.swing.*; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; -import javax.swing.text.BadLocationException; -import javax.swing.text.Element; - import jdiff.text.FileLine; import jdiff.util.Diff; import jdiff.util.DiffOutput; @@ -72,17 +63,22 @@ private static boolean trimWhitespaceDefault = jEdit.getBooleanProperty( "jdiff.trim-whitespace", false); - private static boolean ignoreWhitespaceDefault = jEdit.getBooleanProperty( - "jdiff.ignore-whitespace", false); + private static boolean ignoreAmountOfWhitespaceDefault = jEdit.getBooleanProperty( + "jdiff.ignore-amount-whitespace", false); + private static boolean ignoreAllWhitespaceDefault = jEdit.getBooleanProperty( + "jdiff.ignore-all-whitespace", false); + private static Hashtable dualDiffs = new Hashtable(); private boolean ignoreCase; private boolean trimWhitespace; - private boolean ignoreWhitespace; + private boolean ignoreAmountOfWhitespace; + private boolean ignoreAllWhitespace; + private View view; private EditPane editPane0; @@ -107,15 +103,17 @@ private DualDiff(View view) { - this(view, ignoreCaseDefault, trimWhitespaceDefault, ignoreWhitespaceDefault); + this(view, ignoreCaseDefault, trimWhitespaceDefault, + ignoreAmountOfWhitespaceDefault, ignoreAllWhitespaceDefault); } private DualDiff(View view, boolean ignoreCase, boolean trimWhitespace, - boolean ignoreWhiteSpace) + boolean ignoreAmountOfWhiteSpace, boolean ignoreAllWhiteSpace) { this.ignoreCase = ignoreCase; this.trimWhitespace = trimWhitespace; - this.ignoreWhitespace = ignoreWhiteSpace; + this.ignoreAmountOfWhitespace = ignoreAmountOfWhiteSpace; + this.ignoreAllWhitespace = ignoreAllWhiteSpace; this.view = view; @@ -205,21 +203,36 @@ this.trimWhitespace = !this.trimWhitespace; } - public boolean getIgnoreWhitespace() + public boolean getIgnoreAmountOfWhitespace() { - return this.ignoreWhitespace; + return this.ignoreAmountOfWhitespace; } - public void setIgnoreWhitespace(boolean ignoreWhitespace) + public void setIgnoreAmountOfWhitespace(boolean ignoreAmountOfWhitespace) { - this.ignoreWhitespace = ignoreWhitespace; + this.ignoreAmountOfWhitespace = ignoreAmountOfWhitespace; } - public void toggleIgnoreWhitespace() + public void toggleIgnoreAmountOfWhitespace() { - this.ignoreWhitespace = !this.ignoreWhitespace; + this.ignoreAmountOfWhitespace = !this.ignoreAmountOfWhitespace; } + public boolean getIgnoreAllWhitespace() + { + return this.ignoreAllWhitespace; + } + + public void setIgnoreAllWhitespace(boolean ignoreAllWhitespace) + { + this.ignoreAllWhitespace = ignoreAllWhitespace; + } + + public void toggleIgnoreAllWhitespace() + { + this.ignoreAllWhitespace = !this.ignoreAllWhitespace; + } + private void initOverviews() { Buffer buf0 = this.editPane0.getBuffer(); @@ -424,14 +437,18 @@ { canonical = canonical.toUpperCase(); } - if (trimWhitespace) + if (trimWhitespace && !ignoreAllWhitespace) { canonical = trimWhitespaces(canonical); } - if (ignoreWhitespace) + if (ignoreAmountOfWhitespace && !ignoreAllWhitespace) { canonical = squeezeRepeatedWhitespaces(canonical); } + if (ignoreAllWhitespace) + { + canonical = removeWhitespaces(canonical); + } lines[i] = new FileLine(text, canonical); } @@ -475,6 +492,26 @@ return new String(outStr, 0, outLen); } + public static String removeWhitespaces(String str) + { + int inLen = str.length(); + int outLen = 0; + char[] inStr = new char[inLen]; + char[] outStr = new char[inLen]; + str.getChars(0, inLen, inStr, 0); + + for (int i = 0; i < inLen; i++) + { + if (!Character.isWhitespace(inStr[i])) + { + outStr[outLen] = inStr[i]; + outLen++; + } + } + + return new String(outStr, 0, outLen); + } + public static String trimWhitespaces(String str) { int inLen = str.length(); @@ -630,7 +667,7 @@ } } - public static boolean getIgnoreWhitespaceFor(View view) + public static boolean getIgnoreAmountOfWhitespaceFor(View view) { DualDiff dualDiff = DualDiff.getDualDiffFor(view); if (dualDiff == null) @@ -638,15 +675,15 @@ return false; } - return dualDiff.getIgnoreWhitespace(); + return dualDiff.getIgnoreAmountOfWhitespace(); } - public static void toggleIgnoreWhitespaceFor(View view) + public static void toggleIgnoreAmountOfWhitespaceFor(View view) { DualDiff dualDiff = DualDiff.getDualDiffFor(view); if (dualDiff != null) { - dualDiff.toggleIgnoreWhitespace(); + dualDiff.toggleIgnoreAmountOfWhitespace(); dualDiff.refresh(); view.invalidate(); @@ -658,6 +695,34 @@ } } + public static boolean getIgnoreAllWhitespaceFor(View view) + { + DualDiff dualDiff = DualDiff.getDualDiffFor(view); + if (dualDiff == null) + { + return false; + } + + return dualDiff.getIgnoreAllWhitespace(); + } + + public static void toggleIgnoreAllWhitespaceFor(View view) + { + DualDiff dualDiff = DualDiff.getDualDiffFor(view); + if (dualDiff != null) + { + dualDiff.toggleIgnoreAllWhitespace(); + dualDiff.refresh(); + + view.invalidate(); + view.validate(); + } + else + { + view.getToolkit().beep(); + } + } + public static void nextDiff(EditPane editPane) { DualDiff dualDiff = DualDiff.getDualDiffFor(editPane.getView()); @@ -1054,7 +1119,6 @@ Log.log(Log.DEBUG, this, "**** mouseReleased " + e); } - } public static void propertiesChanged() @@ -1062,16 +1126,20 @@ boolean newIgnoreCaseDefault = jEdit.getBooleanProperty("jdiff.ignore-case", false); boolean newTrimWhitespaceDefault = jEdit.getBooleanProperty( "jdiff.trim-whitespace", false); - boolean newIgnoreWhitespaceDefault = jEdit.getBooleanProperty( - "jdiff.ignore-whitespace", false); + boolean newIgnoreAmountOfWhitespaceDefault = jEdit.getBooleanProperty( + "jdiff.ignore-amount-whitespace", false); + boolean newIgnoreAllWhitespaceDefault = jEdit.getBooleanProperty( + "jdiff.ignore-all-whitespace", false); if ((newIgnoreCaseDefault != ignoreCaseDefault) || (newTrimWhitespaceDefault != trimWhitespaceDefault) - || (newIgnoreWhitespaceDefault != ignoreWhitespaceDefault)) + || (newIgnoreAmountOfWhitespaceDefault != ignoreAmountOfWhitespaceDefault) + || (newIgnoreAllWhitespaceDefault != ignoreAllWhitespaceDefault)) { ignoreCaseDefault = newIgnoreCaseDefault; trimWhitespaceDefault = newTrimWhitespaceDefault; - ignoreWhitespaceDefault = newIgnoreWhitespaceDefault; + ignoreAmountOfWhitespaceDefault = newIgnoreAmountOfWhitespaceDefault; + ignoreAllWhitespaceDefault = newIgnoreAllWhitespaceDefault; } } } Modified: plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java 2007-07-30 22:33:22 UTC (rev 10240) +++ plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java 2007-07-30 23:39:52 UTC (rev 10241) @@ -33,7 +33,8 @@ { private JCheckBox ignoreCase; private JCheckBox trimWhitespace; - private JCheckBox ignoreWhitespace; + private JCheckBox ignoreAmountOfWhitespace; + private JCheckBox ignoreAllWhitespace; private JRadioButton virtualOverview; private JRadioButton physicalOverview; @@ -47,7 +48,8 @@ public void _init() { this.ignoreCase = this.createCheckBox("jdiff.ignore-case", false); this.trimWhitespace = this.createCheckBox("jdiff.trim-whitespace", false); - this.ignoreWhitespace = this.createCheckBox("jdiff.ignore-whitespace", false); + this.ignoreAmountOfWhitespace = this.createCheckBox("jdiff.ignore-amount-whitespace", false); + this.ignoreAllWhitespace = this.createCheckBox("jdiff.ignore-all-whitespace", false); this.virtualOverview = new JRadioButton(jEdit.getProperty( "options.jdiff.virtual-overview" @@ -67,7 +69,8 @@ addComponent(this.ignoreCase); addComponent(this.trimWhitespace); - addComponent(this.ignoreWhitespace); + addComponent(this.ignoreAmountOfWhitespace); + addComponent(this.ignoreAllWhitespace); addComponent(new JLabel(jEdit.getProperty( "options.jdiff.overview-display" @@ -84,9 +87,12 @@ jEdit.setBooleanProperty("jdiff.trim-whitespace", this.trimWhitespace.isSelected() ); - jEdit.setBooleanProperty("jdiff.ignore-whitespace", - this.ignoreWhitespace.isSelected() + jEdit.setBooleanProperty("jdiff.ignore-amount-whitespace", + this.ignoreAmountOfWhitespace.isSelected() ); + jEdit.setBooleanProperty("jdiff.ignore-all-whitespace", + this.ignoreAllWhitespace.isSelected() + ); jEdit.setBooleanProperty("jdiff.global-virtual-overview", this.virtualOverview.isSelected() Modified: plugins/JDiffPlugin/trunk/users-guide.xml =================================================================== --- plugins/JDiffPlugin/trunk/users-guide.xml 2007-07-30 22:33:22 UTC (rev 10240) +++ plugins/JDiffPlugin/trunk/users-guide.xml 2007-07-30 23:39:52 UTC (rev 10241) @@ -54,6 +54,7 @@ <listitem>Synchronized scrolling</listitem> <listitem>Ignore case option</listitem> <listitem>Ignore leading and trailing whitespace option</listitem> + <listitem>Ignore amount of whitespace option</listitem> <listitem>Ignore all whitespace option</listitem> <listitem>Normal diff output</listitem> </itemizedlist> @@ -194,6 +195,11 @@ </listitem> <listitem> + <guimenuitem>Ignore amount of whitespace</guimenuitem>: + toggles the "Ignore amount of whitespace" option for the current diff + </listitem> + + <listitem> <guimenuitem>Ignore all whitespace</guimenuitem>: toggles the "Ignore all whitespace" option for the current diff </listitem> @@ -227,12 +233,19 @@ </listitem> <listitem> - Ignore all whitespace: lines are compared as if any + Ignore amount of whitespace: lines are compared as if any <itemizedlist> <listitem>leading and trailing whitespaces were removed</listitem> <listitem>sequence of whitespaces were replaced by one single space.</listitem> </itemizedlist> </listitem> + + <listitem> + Ignore all whitespace: lines are compared as if any + <itemizedlist> + <listitem>leading, trailing and inner whitespaces were removed</listitem> + </itemizedlist> + </listitem> </itemizedlist> </simplesect> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ez...@us...> - 2007-07-30 23:57:32
|
Revision: 10242 http://jedit.svn.sourceforge.net/jedit/?rev=10242&view=rev Author: ezust Date: 2007-07-30 16:57:20 -0700 (Mon, 30 Jul 2007) Log Message: ----------- Fixed build file, updated docs to work with docbook 4.2. Modified Paths: -------------- plugins/JDiffPlugin/trunk/JDiffPlugin.props plugins/JDiffPlugin/trunk/build.xml plugins/JDiffPlugin/trunk/users-guide.xml Removed Paths: ------------- plugins/JDiffPlugin/trunk/users-guide.xsl Modified: plugins/JDiffPlugin/trunk/JDiffPlugin.props =================================================================== --- plugins/JDiffPlugin/trunk/JDiffPlugin.props 2007-07-30 23:39:52 UTC (rev 10241) +++ plugins/JDiffPlugin/trunk/JDiffPlugin.props 2007-07-30 23:57:20 UTC (rev 10242) @@ -1,9 +1,9 @@ # JDiffPlugin properties # Author: Andre Kaplan plugin.jdiff.JDiffPlugin.name=JDiff Plugin -plugin.jdiff.JDiffPlugin.author=Andre Kaplan/Mark Wickens +plugin.jdiff.JDiffPlugin.author=André Kaplan/Mark Wickens plugin.jdiff.JDiffPlugin.version=1.5.2 -plugin.jdiff.JDiffPlugin.docs=users-guide.html +plugin.jdiff.JDiffPlugin.docs=index.html plugin.jdiff.JDiffPlugin.description=JDiffPlugin is a visual diff utility for jEdit. # Dependencies Modified: plugins/JDiffPlugin/trunk/build.xml =================================================================== --- plugins/JDiffPlugin/trunk/build.xml 2007-07-30 23:39:52 UTC (rev 10241) +++ plugins/JDiffPlugin/trunk/build.xml 2007-07-30 23:57:20 UTC (rev 10242) @@ -1,13 +1,11 @@ <?xml version="1.0"?> <!-- - This is the standard build.xml file for building the JDiffPlugin plugin. The 'dist' target compiles the plugin, generates documentation, and creates the JAR file. Before running the 'dist' target, you will need to choose whether to generate the documentation using one of these two targets: - --> <project name="JDiffPlugin" default="dist" basedir="."> @@ -15,11 +13,12 @@ <property file="build.properties"/> <property file="../build.properties"/> <property name="user-doc.xml" location = "users-guide.xml"/> - <import file="${build.support}/plugin-build.xml" /> <property name="jedit.install.dir" value="../.."/> <property name="jar.name" value="${ant.project.name}.jar"/> <property name="docs-proc.target" value="xsltproc"/> + <import file="${build.support}/plugin-build.xml" /> + <property name="src.dir" value="."/> <property name="build.dir" value="build"/> <property name="install.dir" value=".."/> @@ -30,83 +29,4 @@ <pathelement location="${src.dir}"/> </path> - - <target name="init"> - <mkdir dir="${build.dir}"/> - <delete file="docbook-wrapper.xsl" /> - <echo file="docbook-wrapper.xsl" - message="<xsl:stylesheet"/> - <echo file="docbook-wrapper.xsl" append="true" - message=" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'"/> - <echo file="docbook-wrapper.xsl" append="true" - message=" version='1.0'>"/> - <echo file="docbook-wrapper.xsl" append="true" - message="<xsl:import href='${docbook.xsl}/html/docbook.xsl'/>"/> - <echo file="docbook-wrapper.xsl" append="true" - message="</xsl:stylesheet>"/> - </target> - - - <target name="compile" depends="init"> - <javac - srcdir="${src.dir}" - destdir="${build.dir}" - deprecation="on" - debug="on" - includeJavaRuntime="yes" - > - <classpath refid="project.class.path"/> - </javac> - </target> - - - <target name="dist" depends="compile, docs"> - <mkdir dir="${install.dir}"/> - - <jar jarfile="${install.dir}/${jar.name}"> - <fileset dir="${build.dir}"/> - <fileset dir="${src.dir}"> - <include name="actions.xml"/> - <include name="**/*.props"/> - <include name="**/*.jpg"/> - <include name="**/*.html"/> - </fileset> - </jar> - </target> - - - <target name="docs"> - <antcall target="docs-${docs-proc.target}"/> - </target> - - - <!-- Generate docs with xsltproc tool from www.xmlsoft.org --> - <target name="docs-xsltproc"> - <exec executable="xsltproc"> - <arg value="--catalogs"/> - <arg value="--output"/> - <arg value="users-guide.html"/> - <arg value="users-guide.xsl"/> - <arg value="users-guide.xml"/> - </exec> - </target> - - - <!-- Generate docs with Xalan tool from xml.apache.org --> - <target name="docs-xalan"> - <style - style="users-guide.xsl" - in="users-guide.xml" - out="users-guide.html" - /> - </target> - - - <target name="clean"> - <delete dir="${build.dir}"/> - <delete> - <fileset dir="." includes="users-guide.html"/> - <fileset dir="." includes="**/*~"/> - </delete> - </target> </project> Modified: plugins/JDiffPlugin/trunk/users-guide.xml =================================================================== --- plugins/JDiffPlugin/trunk/users-guide.xml 2007-07-30 23:39:52 UTC (rev 10241) +++ plugins/JDiffPlugin/trunk/users-guide.xml 2007-07-30 23:57:20 UTC (rev 10242) @@ -1,11 +1,7 @@ <?xml version="1.0"?> +<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" + "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> -<!-- JDiff plugin user's guide --> -<!-- (C) 2002 Andre Kaplan --> - -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" -"file:///c:/develop/docbook-xml-4.2/docbookx.dtd"> - <book> @@ -14,7 +10,7 @@ <authorgroup> <author> - <firstname>André</firstname> + <firstname>André</firstname> <surname>Kaplan</surname> </author> <author> @@ -50,20 +46,15 @@ <para>It features:</para> <itemizedlist> - <listitem>Diff overviews (local and global)</listitem> - <listitem>Synchronized scrolling</listitem> - <listitem>Ignore case option</listitem> - <listitem>Ignore leading and trailing whitespace option</listitem> - <listitem>Ignore amount of whitespace option</listitem> - <listitem>Ignore all whitespace option</listitem> - <listitem>Normal diff output</listitem> + <listitem><para>Diff overviews (local and global)</para></listitem> + <listitem><para>Synchronized scrolling</para></listitem> + <listitem><para>Ignore case option</para></listitem> + <listitem><para>Ignore leading and trailing whitespace option</para></listitem> + <listitem><para>Ignore amount of whitespace option</para></listitem> + <listitem><para>Ignore all whitespace option</para></listitem> + <listitem><para>Normal diff output</para></listitem> </itemizedlist> - <para>It requires:</para> - <itemizedlist> - <listitem>JDK 1.3</listitem> - <listitem>jEdit 4.2+</listitem> - </itemizedlist> </chapter> @@ -75,35 +66,34 @@ <para>The simplest method is to open the Dual Diff Dialog (<guimenu>Plugins</guimenu>> <guisubmenu>JDiff</guisubmenu>> - <guimenuitem>Show dual diff dialog</guimenuitem>) + <guimenuitem>Show dual diff dialog</guimenuitem>) and choose the files to compare. But you can also: </para> <orderedlist> - <listitem>Split your view in two (vertically)</listitem> + <listitem><para>Split your view in two (vertically)</para></listitem> - <listitem>Edit the buffers you want to compare: + <listitem><para>Edit the buffers you want to compare:</para> <itemizedlist> - <listitem>the buffer on the left is the original</listitem> - <listitem>the buffer on the right is the revision</listitem> + <listitem><para>the buffer on the left is the original</para></listitem> + <listitem><para>the buffer on the right is the revision</para></listitem> </itemizedlist> </listitem> - <listitem>Activate JDiff: + <listitem><para>Activate JDiff: <guimenu>Plugins</guimenu>> <guisubmenu>JDiff</guisubmenu>> - <guimenuitem>Dual Diff</guimenuitem> + <guimenuitem>Dual Diff</guimenuitem> </para> </listitem> </orderedlist> - <para>Figure 1 shows the result</para> + <para>Figure 1 shows the result</para> <mediaobject> - <caption>Figure 1 - JDiff Plugin</caption> - <alt>JDiff Plugin snapshot</alt> <imageobject> - <imagedata fileref="diff_snapshot.jpg" format="jpg"/> - </imageobject> + <imagedata fileref="diff_snapshot.jpg" format="JPG"/> + </imageobject> + <caption><para>Figure 1 - JDiff Plugin</para></caption> </mediaobject> </chapter> @@ -112,11 +102,11 @@ <chapter id="display"> <title>Display</title> - <para>Once JDiff is activated as in Figure 1, you should see:</para> + <para>Once JDiff is activated as in Figure 1, you should see:</para> <itemizedlist> - <listitem>Text Highlights</listitem> - <listitem>A local overview (right of the original)</listitem> - <listitem>A global overview (right of the revision)</listitem> + <listitem><para>Text Highlights</para></listitem> + <listitem><para>A local overview (right of the original)</para></listitem> + <listitem><para>A global overview (right of the revision)</para></listitem> </itemizedlist> @@ -126,17 +116,17 @@ <para>By default:</para> <itemizedlist> - <listitem>Changed lines appear in yellow</listitem> - <listitem>Deleted (from the original) lines appear in red</listitem> - <listitem>Inserted (to the revision) lines appear in green</listitem> + <listitem><para>Changed lines appear in yellow</para></listitem> + <listitem><para>Deleted (from the original) lines appear in red</para></listitem> + <listitem><para>Inserted (to the revision) lines appear in green</para></listitem> - <listitem>Invalid lines appear as thin dark grey lines. + <listitem><para>Invalid lines appear as thin dark grey lines.</para> <itemizedlist> - <listitem>In the original, invalid lines indicate where a block was inserted - in the revision. + <listitem><para>In the original, invalid lines indicate where a block was inserted + in the revision.</para> </listitem> - <listitem>In the revision, invalid lines indicate where a block was deleted in - the original. + <listitem><para>In the revision, invalid lines indicate where a block was deleted in + the original. </para> </listitem> </itemizedlist> </listitem> @@ -175,39 +165,39 @@ <title>Other commands</title> <itemizedlist> - <listitem> + <listitem><para> <guimenuitem>Refresh</guimenuitem>: - refreshes the diff display + refreshes the diff display </para> </listitem> - <listitem> - <guimenuitem>Go to previous/next difference</guimenuitem> + <listitem><para> + <guimenuitem>Go to previous/next difference</guimenuitem> </para> </listitem> - <listitem> + <listitem><para> <guimenuitem>Ignore case</guimenuitem>: toggles the "Ignore case" option for the current diff - </listitem> + </para></listitem> - <listitem> + <listitem><para> <guimenuitem>Ignore leading and trailing whitespace</guimenuitem>: toggles the "Ignore leading and trailing whitespace" option for the current diff - </listitem> + </para></listitem> - <listitem> + <listitem><para> <guimenuitem>Ignore amount of whitespace</guimenuitem>: toggles the "Ignore amount of whitespace" option for the current diff - </listitem> + </para></listitem> - <listitem> + <listitem><para> <guimenuitem>Ignore all whitespace</guimenuitem>: toggles the "Ignore all whitespace" option for the current diff - </listitem> + </para></listitem> - <listitem> + <listitem><para> <guimenuitem>Normal Diff Output</guimenuitem>: generates a diff file using the normal method - </listitem> + </para></listitem> </itemizedlist> </chapter> @@ -223,29 +213,29 @@ <para>You can configure how JDiff compares lines by default. JDiff can:</para> <itemizedlist> - <listitem> + <listitem><para> Ignore case: upper-cased lines are compared. - </listitem> + </para></listitem> - <listitem> + <listitem><para> Ignore leading and trailing whitespace: lines are compared as if leading and trailing whitespaces were removed. - </listitem> + </para></listitem> - <listitem> - Ignore amount of whitespace: lines are compared as if any + <listitem><para> + Ignore amount of whitespace: lines are compared as if any</para> <itemizedlist> - <listitem>leading and trailing whitespaces were removed</listitem> - <listitem>sequence of whitespaces were replaced by one single space.</listitem> + <listitem><para>leading and trailing whitespaces were removed</para></listitem> + <listitem><para>sequence of whitespaces were replaced by one single space.</para></listitem> </itemizedlist> </listitem> - <listitem> + <listitem><para> Ignore all whitespace: lines are compared as if any <itemizedlist> - <listitem>leading, trailing and inner whitespaces were removed</listitem> + <listitem><para>leading, trailing and inner whitespaces were removed</para></listitem> </itemizedlist> - </listitem> + </para></listitem> </itemizedlist> </simplesect> @@ -255,12 +245,10 @@ <title>Global overview display</title> <itemizedlist> - <listitem>Virtual overview: uses the virtual representation of - buffers for its display + <listitem><para>Virtual overview: uses the virtual representation of buffers for its display </para> </listitem> - <listitem>Physical overview: uses the physical representation of - buffers for its display + <listitem><para>Physical overview: uses the physical representation of buffers for its display </para> </listitem> </itemizedlist> @@ -273,12 +261,12 @@ <para>You can configure the colors of:</para> <itemizedlist> - <listitem>Changed lines</listitem> - <listitem>Deleted lines</listitem> - <listitem>Inserted lines</listitem> - <listitem>Invalid lines</listitem> - <listitem>Left cursor in the global overview</listitem> - <listitem>Right cursor in the global overview</listitem> + <listitem><para>Changed lines</para></listitem> + <listitem><para>Deleted lines</para></listitem> + <listitem><para>Inserted lines</para></listitem> + <listitem><para>Invalid lines</para></listitem> + <listitem><para>Left cursor in the global overview</para></listitem> + <listitem><para>Right cursor in the global overview</para></listitem> </itemizedlist> </simplesect> @@ -290,10 +278,10 @@ <para>You can configure the colors of:</para> <itemizedlist> - <listitem>Changed lines</listitem> - <listitem>Deleted lines</listitem> - <listitem>Inserted lines</listitem> - <listitem>Invalid lines</listitem> + <listitem><para>Changed lines</para></listitem> + <listitem><para>Deleted lines</para></listitem> + <listitem><para>Inserted lines</para></listitem> + <listitem><para>Invalid lines</para></listitem> </itemizedlist> </simplesect> @@ -327,22 +315,22 @@ <para>You can also write to:</para> <itemizedlist> - <listitem> - Mark Wickens <email>m.w...@rh...</email>; + <listitem><para> + Mark Wickens <email>m.w...@rh...</email>; </para> </listitem> - <listitem> - André Kaplan <email>ak...@je...</email>; + <listitem><para> + André Kaplan <email>ak...@je...</email>; </para> </listitem> - <listitem> + <listitem><para> or jEdit-users mailing-list - <email>jed...@li...</email>; + <email>jed...@li...</email>; </para> </listitem> - <listitem> + <listitem><para> or jEdit-devel mailing-list - <email>jed...@li...</email>. + <email>jed...@li...</email>. </para> </listitem> </itemizedlist> </chapter> @@ -351,13 +339,13 @@ <title>History</title> <itemizedlist> - <listitem> + <listitem> <para> Version 1.4. Updated to work with jEdit v4.2+, including edits for new - JEditTextArea handling and new plugin API. + JEditTextArea handling and new plugin API. </para> </listitem> - <listitem> - Version 1.3.2. Last pre-jEdit v4.2 version of plugin by André. + <listitem><para> + Version 1.3.2. Last pre-jEdit v4.2 version of plugin by André. </para> </listitem> </itemizedlist> </chapter> @@ -366,20 +354,20 @@ <title>Credits</title> <itemizedlist> - <listitem> + <listitem><para> Stuart D. Gathman ported the GNU diff algorithm to Java. See <ulink url="http://www.bmsi.com/java/"> http://www.bmsi.com/java/ - </ulink> + </ulink></para> </listitem> - <listitem> + <listitem><para> Some code and ideas borrowed from JDiff by Mike Dillon <email>md...@je...</email>. See <ulink url="http://sourceforge.net/projects/jdiff"> http://sourceforge.net/projects/jdiff - </ulink> + </ulink> </para> </listitem> </itemizedlist> Deleted: plugins/JDiffPlugin/trunk/users-guide.xsl =================================================================== --- plugins/JDiffPlugin/trunk/users-guide.xsl 2007-07-30 23:39:52 UTC (rev 10241) +++ plugins/JDiffPlugin/trunk/users-guide.xsl 2007-07-30 23:57:20 UTC (rev 10242) @@ -1,52 +0,0 @@ -<?xml version='1.0'?> - -<!-- You should use this XSL stylesheet to create plugin documentation. - - If you want all output in a single HTML file, specify the path to - your DocBook-XSL "html/docbook.xsl" file in the <xsl:import> - statement below. If you want each chapter to have its own file, - specify the path to your "html/xtchunk.xsl". ---> - -<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - version='1.0' - xmlns="http://www.w3.org/TR/xhtml1/transitional" - exclude-result-prefixes="#default"> - -<xsl:import href="docbook-wrapper.xsl"/> - -<!-- Swing HTML control doesn't support “ and ” --> -<xsl:template match="quote">"<xsl:apply-templates/>"</xsl:template> - -<xsl:template match="guibutton"> - <xsl:call-template name="inline.boldseq"/> -</xsl:template> - -<xsl:template match="guiicon"> - <xsl:call-template name="inline.boldseq"/> -</xsl:template> - -<xsl:template match="guilabel"> - <xsl:call-template name="inline.boldseq"/> -</xsl:template> - -<xsl:template match="guimenu"> - <xsl:call-template name="inline.boldseq"/> -</xsl:template> - -<xsl:template match="guimenuitem"> - <xsl:call-template name="inline.boldseq"/> -</xsl:template> - -<xsl:template match="guisubmenu"> - <xsl:call-template name="inline.boldseq"/> -</xsl:template> - -<xsl:variable name="toc.list.type">ul</xsl:variable> - -<xsl:variable name="shade.verbatim">1</xsl:variable> - -<xsl:variable name="funcsynopsis.style">ansi</xsl:variable> -<xsl:template match="void"><xsl:apply-templates/></xsl:template> - -</xsl:stylesheet> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ez...@us...> - 2008-02-02 19:13:27
|
Revision: 11673 http://jedit.svn.sourceforge.net/jedit/?rev=11673&view=rev Author: ezust Date: 2008-02-02 11:13:24 -0800 (Sat, 02 Feb 2008) Log Message: ----------- Removed docbook version, updated HTML version. Moved images. Modified Paths: -------------- plugins/JDiffPlugin/trunk/JDiffPlugin.props plugins/JDiffPlugin/trunk/build.xml plugins/JDiffPlugin/trunk/docs/index.html Added Paths: ----------- plugins/JDiffPlugin/trunk/docs/diff_snapshot.jpg plugins/JDiffPlugin/trunk/docs/diff_snapshot.png Removed Paths: ------------- plugins/JDiffPlugin/trunk/diff_snapshot.jpg plugins/JDiffPlugin/trunk/diff_snapshot.png plugins/JDiffPlugin/trunk/users-guide.xml Modified: plugins/JDiffPlugin/trunk/JDiffPlugin.props =================================================================== --- plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-02 19:01:53 UTC (rev 11672) +++ plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-02 19:13:24 UTC (rev 11673) @@ -3,7 +3,7 @@ plugin.jdiff.JDiffPlugin.name=JDiff Plugin plugin.jdiff.JDiffPlugin.author=André Kaplan/Mark Wickens, Dale Anson plugin.jdiff.JDiffPlugin.version=1.7.0 -plugin.jdiff.JDiffPlugin.docs=index.html +plugin.jdiff.JDiffPlugin.docs=docs/index.html plugin.jdiff.JDiffPlugin.description=JDiffPlugin is a visual diff and merge utility for jEdit. # Dependencies Modified: plugins/JDiffPlugin/trunk/build.xml =================================================================== --- plugins/JDiffPlugin/trunk/build.xml 2008-02-02 19:01:53 UTC (rev 11672) +++ plugins/JDiffPlugin/trunk/build.xml 2008-02-02 19:13:24 UTC (rev 11673) @@ -8,14 +8,12 @@ whether to generate the documentation using one of these two targets: --> -<project name="JDiffPlugin" default="dist" basedir="."> - +<project name="JDiffPlugin" default="build" basedir="."> + <property name="docs-proc.target" value="none"/> <property file="build.properties"/> <property file="../build.properties"/> - <property name="user-doc.xml" location = "users-guide.xml"/> <property name="jedit.install.dir" value="../.."/> <property name="jar.name" value="${ant.project.name}.jar"/> - <property name="docs-proc.target" value="xsltproc"/> <import file="${build.support}/plugin-build.xml" /> @@ -31,8 +29,7 @@ <selector id="packageFiles"> <or> - <filename name="*.png" /> - <filename name="*.jpg" /> + <filename name="docs/*" /> </or> </selector> Deleted: plugins/JDiffPlugin/trunk/diff_snapshot.jpg =================================================================== (Binary files differ) Deleted: plugins/JDiffPlugin/trunk/diff_snapshot.png =================================================================== (Binary files differ) Copied: plugins/JDiffPlugin/trunk/docs/diff_snapshot.jpg (from rev 11671, plugins/JDiffPlugin/trunk/diff_snapshot.jpg) =================================================================== (Binary files differ) Copied: plugins/JDiffPlugin/trunk/docs/diff_snapshot.png (from rev 11671, plugins/JDiffPlugin/trunk/diff_snapshot.png) =================================================================== (Binary files differ) Modified: plugins/JDiffPlugin/trunk/docs/index.html =================================================================== --- plugins/JDiffPlugin/trunk/docs/index.html 2008-02-02 19:01:53 UTC (rev 11672) +++ plugins/JDiffPlugin/trunk/docs/index.html 2008-02-02 19:13:24 UTC (rev 11673) @@ -321,6 +321,9 @@ <h3>History</h3> <ul> + <li><p> Version 1.7. New Line Diff Dockable Added merge functionality, added mouse listener to global overview. (Dale Anson) </p> + </li> + <li><p> Version 1.5.2. Fixes to ignore whitespace options (1522563 - aconnor78) </p></li> <li><p> Version 1.5, updated to work with jEdit 4.3pre3+ Deleted: plugins/JDiffPlugin/trunk/users-guide.xml =================================================================== --- plugins/JDiffPlugin/trunk/users-guide.xml 2008-02-02 19:01:53 UTC (rev 11672) +++ plugins/JDiffPlugin/trunk/users-guide.xml 2008-02-02 19:13:24 UTC (rev 11673) @@ -1,395 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" - "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"> - -<book> - - -<bookinfo> - <title>JDiff plugin</title> - - <authorgroup> - <author> - <firstname>André</firstname> - <surname>Kaplan</surname> - </author> - <author> - <firstname>Mark</firstname> - <surname>Wickens</surname> - </author> - </authorgroup> - - <legalnotice> - <title>Legal Notice</title> - - <para> - Permission is granted to copy, distribute and/or modify this - document under the terms of the GNU Free Documentation License, - Version 1.1 or any later version published by the - Free Software Foundation; with no - <quote>Invariant Sections</quote>, - <quote>Front-Cover Texts</quote> or - <quote>Back-Cover Texts</quote>, - each as defined in the license. - A copy of the license can be found in the file - <filename>COPYING.DOC.txt</filename> included with jEdit. - </para> - </legalnotice> -</bookinfo> - - -<chapter id="presentation"> - <title>Presentation</title> - - <para>JDiffPlugin is a visual diff and merge utility for jEdit.</para> - - <para>It features:</para> - - <itemizedlist> - <listitem><para>Diff overviews (local and global)</para></listitem> - <listitem><para>Synchronized scrolling</para></listitem> - <listitem><para>Ignore case option</para></listitem> - <listitem><para>Ignore leading and trailing whitespace option</para></listitem> - <listitem><para>Ignore amount of whitespace option</para></listitem> - <listitem><para>Ignore all whitespace option</para></listitem> - <listitem><para>Normal diff output</para></listitem> - <listitem><para>Visual merging of differences between two files</para></listitem> - </itemizedlist> - - -</chapter> - - - -<chapter id="usage"> - <title>Usage</title> - - <para>The simplest method is to open the Dual Diff Dialog - (<guimenu>Plugins</guimenu>> - <guisubmenu>JDiff</guisubmenu>> - <guimenuitem>Show dual diff dialog</guimenuitem>) - and choose the files to compare. But you can also: - </para> - - <orderedlist> - <listitem><para>Split your view in two (vertically)</para></listitem> - - <listitem><para>Edit the buffers you want to compare:</para> - <itemizedlist> - <listitem><para>the buffer on the left is the original</para></listitem> - <listitem><para>the buffer on the right is the revision</para></listitem> - </itemizedlist> - </listitem> - - <listitem><para>Activate JDiff: - <guimenu>Plugins</guimenu>> - <guisubmenu>JDiff</guisubmenu>> - <guimenuitem>Dual Diff</guimenuitem> </para> - </listitem> - </orderedlist> - - <para>Figure 1 shows the result</para> - - <mediaobject> - <imageobject> - <imagedata fileref="diff_snapshot.jpg" format="JPG"/> - </imageobject> - <caption><para>Figure 1 - JDiff Plugin</para></caption> - </mediaobject> - -</chapter> - - -<chapter id="display"> - <title>Display</title> - - <para>Once JDiff is activated as in Figure 1, you should see:</para> - <itemizedlist> - <listitem><para>Text Highlights</para></listitem> - <listitem><para>A local overview (right of the original)</para></listitem> - <listitem><para>A global overview (right of the revision)</para></listitem> - </itemizedlist> - - - <simplesect id="color_conventions"> - <title>Color conventions</title> - - <para>By default:</para> - - <itemizedlist> - <listitem><para>Changed lines appear in yellow</para></listitem> - <listitem><para>Deleted (from the original) lines appear in red</para></listitem> - <listitem><para>Inserted (to the revision) lines appear in green</para></listitem> - - <listitem><para>Invalid lines appear as thin dark grey lines.</para> - <itemizedlist> - <listitem><para>In the original, invalid lines indicate where a block was inserted - in the revision.</para> - </listitem> - <listitem><para>In the revision, invalid lines indicate where a block was deleted in - the original. </para> - </listitem> - </itemizedlist> - </listitem> - </itemizedlist> - - </simplesect> - - - <simplesect id="local_overview"> - <title>Local overview</title> - - <para> - The local overview shows how the visible changed/inserted/deleted - blocks from the original and the revision relate to each other. Merging - between files can be performed by clicking - a right arrow in the local overview, which will select the corresponding text - from the original and replace the related text in the revision. Clicking - a left arrow in the local overview will select the corresponding text - from the revision and replace the related text in the original. - </para> - - </simplesect> - - - <simplesect id="global_overview"> - <title>Global overview</title> - - <para> - The global overview should help you estimate how the two edited buffers - differ. - It also displays two cursors which indicate the visible parts of the two - buffers. - </para> - - </simplesect> - -</chapter> - - -<chapter id="other_commands"> - <title>Other commands</title> - - <itemizedlist> - <listitem><para> - <guimenuitem>Refresh</guimenuitem>: - refreshes the diff display </para> - </listitem> - - <listitem><para> - <guimenuitem>Go to previous/next difference</guimenuitem> </para> - </listitem> - - <listitem><para> - <guimenuitem>Ignore case</guimenuitem>: - toggles the "Ignore case" option for the current diff - </para></listitem> - - <listitem><para> - <guimenuitem>Ignore leading and trailing whitespace</guimenuitem>: - toggles the "Ignore leading and trailing whitespace" option for the current diff - </para></listitem> - - <listitem><para> - <guimenuitem>Ignore amount of whitespace</guimenuitem>: - toggles the "Ignore amount of whitespace" option for the current diff - </para></listitem> - - <listitem><para> - <guimenuitem>Ignore all whitespace</guimenuitem>: - toggles the "Ignore all whitespace" option for the current diff - </para></listitem> - - <listitem><para> - <guimenuitem>Normal Diff Output</guimenuitem>: - generates a diff file using the normal method - </para></listitem> - </itemizedlist> - -</chapter> - - -<chapter id="options"> - <title>Options</title> - - - <simplesect id="line_comparison_options"> - <title>Line comparison options</title> - - <para>You can configure how JDiff compares lines by default. JDiff can:</para> - - <itemizedlist> - <listitem><para> - Ignore case: upper-cased lines are compared. - </para></listitem> - - <listitem><para> - Ignore leading and trailing whitespace: lines are compared as if - leading and trailing whitespaces were removed. - </para></listitem> - - <listitem><para> - Ignore amount of whitespace: lines are compared as if any</para> - <itemizedlist> - <listitem><para>leading and trailing whitespaces were removed</para></listitem> - <listitem><para>sequence of whitespaces were replaced by one single space.</para></listitem> - </itemizedlist> - </listitem> - - <listitem><para> - Ignore all whitespace: lines are compared as if any - <itemizedlist> - <listitem><para>leading, trailing and inner whitespaces were removed</para></listitem> - </itemizedlist> - </para></listitem> - </itemizedlist> - - </simplesect> - - - <simplesect id="global_overview_display"> - <title>Global overview display</title> - - <itemizedlist> - <listitem><para>Virtual overview: uses the virtual representation of buffers for its display </para> - </listitem> - - <listitem><para>Physical overview: uses the physical representation of buffers for its display </para> - </listitem> - </itemizedlist> - - </simplesect> - - - <simplesect id="overview_colors"> - <title>Overview colors</title> - - <para>You can configure the colors of:</para> - - <itemizedlist> - <listitem><para>Changed lines</para></listitem> - <listitem><para>Deleted lines</para></listitem> - <listitem><para>Inserted lines</para></listitem> - <listitem><para>Invalid lines</para></listitem> - <listitem><para>Left cursor in the global overview</para></listitem> - <listitem><para>Right cursor in the global overview</para></listitem> - </itemizedlist> - - </simplesect> - - - <simplesect id="highlight_colors"> - <title>Highlight colors</title> - - <para>You can configure the colors of:</para> - - <itemizedlist> - <listitem><para>Changed lines</para></listitem> - <listitem><para>Deleted lines</para></listitem> - <listitem><para>Inserted lines</para></listitem> - <listitem><para>Invalid lines</para></listitem> - </itemizedlist> - - </simplesect> - -</chapter> - - -<chapter id="license"> - <title>License</title> - - <para> - The source code is distributed under the GPL. - Please see - <ulink url="http://www.fsf.org/copyleft/gpl.html"> - http://www.fsf.org/copyleft/gpl.html - </ulink> - </para> -</chapter> - - -<chapter id="feedback"> - <title>Feedback</title> - - <para> - The preferred way to send bug reports is to use the - Sourceforge Bug Tracker at - <ulink url="http://sourceforge.net/bugs/?group_id=588"> - http://sourceforge.net/bugs/?group_id=588 - </ulink> - </para> - - <para>You can also write to:</para> - <itemizedlist> - <listitem><para> - jEdit-users mailing-list - <email>jed...@li...</email> </para> - </listitem> - - <listitem><para> - or jEdit-devel mailing-list - <email>jed...@li...</email> </para> - </listitem> - </itemizedlist> -</chapter> - -<chapter id="history"> - <title>History</title> - - - - <itemizedlist> - - <listitem><para> Version 1.7.0 (Dale Anson) - <itemizedlist> - <listitem><para> Added merge functionality to JDiff. This enhancement makes it easy to move differences from one file to another. </para> </listitem> - <listitem><para> added dockable to show line diffs </para></listitem> - <listitem><para> moved merge controls to dockable </para></listitem> - <listitem><para> added unsplit and swap panes to merge controls </para></listitem> - <listitem><para> updated docs </para></listitem> - <listitem><para> added mouse listener to global overview </para></listitem> - </itemizedlist> - </para></listitem> - - - - <listitem><para> Version 1.5.2. Fixes to ignore whitespace options (1522563 - aconnor78) </para></listitem> - <listitem><para> - Version 1.5, updated to work with jEdit 4.3pre3+ - </para></listitem> - <listitem> <para> - Version 1.4. Updated to work with jEdit v4.2+, including edits for new - JEditTextArea handling and new plugin API. </para> - </listitem> - - <listitem><para> - Version 1.3.2. Last pre-jEdit v4.2 version of plugin by André. </para> - </listitem> - </itemizedlist> -</chapter> - -<chapter id="credits"> - <title>Credits</title> - - <itemizedlist> - <listitem><para> - Stuart D. Gathman ported the GNU diff algorithm to Java. - See - <ulink url="http://www.bmsi.com/java/"> - http://www.bmsi.com/java/ - </ulink></para> - </listitem> - - <listitem><para> - Some code and ideas borrowed from JDiff by - Mike Dillon <email>md...@je...</email>. - See <ulink url="http://sourceforge.net/projects/jdiff"> - http://sourceforge.net/projects/jdiff - </ulink> </para> - </listitem> - </itemizedlist> - -</chapter> - - -</book> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dal...@us...> - 2008-02-07 03:52:57
|
Revision: 11705 http://jedit.svn.sourceforge.net/jedit/?rev=11705&view=rev Author: daleanson Date: 2008-02-06 19:52:54 -0800 (Wed, 06 Feb 2008) Log Message: ----------- button tooltip text added to props file Modified Paths: -------------- plugins/JDiffPlugin/trunk/JDiffPlugin.props plugins/JDiffPlugin/trunk/jdiff/MergeControl.java Modified: plugins/JDiffPlugin/trunk/JDiffPlugin.props =================================================================== --- plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-07 00:02:23 UTC (rev 11704) +++ plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-07 03:52:54 UTC (rev 11705) @@ -42,6 +42,8 @@ jdiff.next-diff.label=Go to Next Difference jdiff.move-right.label=Move Current Diff Right jdiff.move-left.label=Move Current Diff Left +jdiff.unsplit.label=Unsplit +jdiff.swap-textareas.label=Swap text areas jdiff.toggle-ignore-case.label=Ignore case jdiff.toggle-trim-whitespace.label=Ignore leading and trailing whitespace jdiff.toggle-ignore-amount-whitespace.label=Ignore amount of whitespace Modified: plugins/JDiffPlugin/trunk/jdiff/MergeControl.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/MergeControl.java 2008-02-07 00:02:23 UTC (rev 11704) +++ plugins/JDiffPlugin/trunk/jdiff/MergeControl.java 2008-02-07 03:52:54 UTC (rev 11705) @@ -28,6 +28,7 @@ import org.gjt.sp.jedit.Buffer; import org.gjt.sp.jedit.EditPane; import org.gjt.sp.jedit.GUIUtilities; +import org.gjt.sp.jedit.jEdit; /** * This is the button controls to assist in doing merges. @@ -59,21 +60,25 @@ JButton swap = new JButton( GUIUtilities.loadIcon( "SplitVertical.png" ) ); // tooltips - next.setToolTipText( "Go to next diff" ); - prev.setToolTipText( "Go to previous diff" ); - unsplit.setToolTipText( "Unsplit" ); - swap.setToolTipText( "Swap text areas" ); - move_right.setToolTipText( "Move diff to right" ); - move_left.setToolTipText( "Move diff to left" ); + next.setToolTipText( jEdit.getProperty("jdiff.next-diff.label", "Go to next diff") ); + prev.setToolTipText( jEdit.getProperty("jdiff.move-right.label", "Go to previous diff") ); + unsplit.setToolTipText( jEdit.getProperty("jdiff.unsplit.label", "Unsplit") ); + swap.setToolTipText( jEdit.getProperty("jdiff.swap-textareas", "Swap text areas") ); + move_right.setToolTipText( jEdit.getProperty("jdiff.move-right.label", "Move diff to right") ); + move_left.setToolTipText( jEdit.getProperty("jdiff.move-left.label", "Move diff to left") ); // create toolbars JToolBar left_bar = new JToolBar(); + left_bar.setFloatable(false); + left_bar.setRollover(true); left_bar.add( unsplit ); left_bar.add( next ); left_bar.add( move_right ); JToolBar right_bar = new JToolBar(); + right_bar.setFloatable(false); + right_bar.setRollover(true); right_bar.add( move_left ); right_bar.add( prev ); right_bar.add( swap ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dal...@us...> - 2008-02-11 03:29:24
|
Revision: 11769 http://jedit.svn.sourceforge.net/jedit/?rev=11769&view=rev Author: daleanson Date: 2008-02-10 19:29:20 -0800 (Sun, 10 Feb 2008) Log Message: ----------- refactoring and code clean up, fixes for dockable repaint problems. Modified Paths: -------------- plugins/JDiffPlugin/trunk/dockables.xml plugins/JDiffPlugin/trunk/jdiff/DiffGlobalPhysicalOverview.java plugins/JDiffPlugin/trunk/jdiff/DiffGlobalVirtualOverview.java plugins/JDiffPlugin/trunk/jdiff/DiffHighlight.java plugins/JDiffPlugin/trunk/jdiff/DiffLocalOverview.java plugins/JDiffPlugin/trunk/jdiff/DiffOverview.java plugins/JDiffPlugin/trunk/jdiff/DualDiff.java plugins/JDiffPlugin/trunk/jdiff/util/Diff.java plugins/JDiffPlugin/trunk/jdiff/util/DiffNormalOutput.java plugins/JDiffPlugin/trunk/jdiff/util/DiffOutput.java Added Paths: ----------- plugins/JDiffPlugin/trunk/jdiff/component/ plugins/JDiffPlugin/trunk/jdiff/component/DiffLineModel.java plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java plugins/JDiffPlugin/trunk/jdiff/component/DiffLocalOverview.java plugins/JDiffPlugin/trunk/jdiff/component/ui/ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLocalOverviewUI.java plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLineOverviewUI.java plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLocalOverviewUI.java Removed Paths: ------------- plugins/JDiffPlugin/trunk/jdiff/DiffLineOverview.java Modified: plugins/JDiffPlugin/trunk/dockables.xml =================================================================== --- plugins/JDiffPlugin/trunk/dockables.xml 2004-08-05 17:07:08 UTC (rev 11768) +++ plugins/JDiffPlugin/trunk/dockables.xml 2008-02-11 03:29:20 UTC (rev 11769) @@ -3,7 +3,7 @@ <DOCKABLES> <DOCKABLE NAME="jdiff-lines"> - new javax.swing.JScrollPane(); + (javax.swing.JComponent)(( jdiff.component.DiffLineOverview ) jdiff.DualDiff.getDualDiffFor( view ).getLineProcessor()); </DOCKABLE> </DOCKABLES> Modified: plugins/JDiffPlugin/trunk/jdiff/DiffGlobalPhysicalOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DiffGlobalPhysicalOverview.java 2004-08-05 17:07:08 UTC (rev 11768) +++ plugins/JDiffPlugin/trunk/jdiff/DiffGlobalPhysicalOverview.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -40,7 +40,7 @@ private double pixelsPerLine; public DiffGlobalPhysicalOverview( - Diff.change edits, + Diff.Change edits, int lineCount0, int lineCount1, JEditTextArea textArea0, @@ -92,7 +92,7 @@ gfx.fillRect( left.x, left.y, left.width, left.height ); gfx.fillRect( right.x, right.y, right.width, right.height ); - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; int leftOffset = 0; int rightOffset = 0; Modified: plugins/JDiffPlugin/trunk/jdiff/DiffGlobalVirtualOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DiffGlobalVirtualOverview.java 2004-08-05 17:07:08 UTC (rev 11768) +++ plugins/JDiffPlugin/trunk/jdiff/DiffGlobalVirtualOverview.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -35,7 +35,7 @@ public class DiffGlobalVirtualOverview extends DiffOverview { public DiffGlobalVirtualOverview( - Diff.change edits, + Diff.Change edits, int lineCount0, int lineCount1, JEditTextArea textArea0, @@ -93,7 +93,7 @@ gfx.fillRect(left.x, left.y, left.width, left.height); gfx.fillRect(right.x, right.y, right.width, right.height); - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; int virtualLeftHeight = 0; int virtualRightHeight = 0; Modified: plugins/JDiffPlugin/trunk/jdiff/DiffHighlight.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DiffHighlight.java 2004-08-05 17:07:08 UTC (rev 11768) +++ plugins/JDiffPlugin/trunk/jdiff/DiffHighlight.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -57,11 +57,11 @@ private JEditTextArea textArea; private boolean enabled = false; - private Diff.change edits; + private Diff.Change edits; private Position position; - private DiffHighlight(JEditTextArea textArea, Diff.change edits, Position position) { + private DiffHighlight(JEditTextArea textArea, Diff.Change edits, Position position) { this.textArea = textArea; this.edits = edits; this.position = position; @@ -84,7 +84,7 @@ return; } - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; Color color; if (this.position == DiffHighlight.LEFT) { @@ -171,12 +171,12 @@ } - public Diff.change getEdits() { + public Diff.Change getEdits() { return this.edits; } - public void setEdits(Diff.change edits) { + public void setEdits(Diff.Change edits) { this.edits = edits; } @@ -246,7 +246,7 @@ } - public static TextAreaExtension addHighlightTo(EditPane editPane, Diff.change edits, Position position) { + public static TextAreaExtension addHighlightTo(EditPane editPane, Diff.Change edits, Position position) { TextAreaExtension textAreaHighlight = new DiffHighlight( editPane.getTextArea(), edits, position ); Deleted: plugins/JDiffPlugin/trunk/jdiff/DiffLineOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DiffLineOverview.java 2004-08-05 17:07:08 UTC (rev 11768) +++ plugins/JDiffPlugin/trunk/jdiff/DiffLineOverview.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -1,203 +0,0 @@ -/* -* DiffGlobalPhysicalOverview.java -* Copyright (c) 2000, 2001, 2002 Andre Kaplan -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - - -package jdiff; - -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.event.*; -import java.util.*; - -import jdiff.util.Diff; -import jdiff.text.FileLine; - -import org.gjt.sp.jedit.GUIUtilities; -import org.gjt.sp.jedit.View; - -/** - * Performs and displays a character-by-character diff of two lines of text. - */ -public class DiffLineOverview extends JPanel implements LineProcessor { - private DualDiff dualDiff; - private Diff.change edits; - private MergeControl mergeControl; - private JPanel linePanel; - - private int leftMargin = 6; - - - public DiffLineOverview( DualDiff dualDiff ) { - if ( dualDiff == null ) { - throw new IllegalArgumentException(); - } - this.dualDiff = dualDiff; - setBackground( Color.WHITE ); - setLayout( new BorderLayout() ); - mergeControl = new MergeControl( dualDiff.getView() ); - add( mergeControl, BorderLayout.NORTH ); - - linePanel = new JPanel(); - linePanel.setBackground( dualDiff.getBackground() ); - add( linePanel, BorderLayout.CENTER ); - } - - /** - * Performs a character-by-character diff of two lines of text and show - * the results to this panel. - * @param leftLine a line of text from the left edit pane - * @param rightLine a line of text from the right edit pane - */ - public void processLines( String leftLine, String rightLine ) { - if (leftLine == null || rightLine == null) { - return; - } - - // prep for drawing the two lines, use the same font and background - // color as the main text areas - Graphics gfx = getGraphics(); - gfx.translate( 0, mergeControl.getSize().height ); - Font font = dualDiff.getFont(); - Font bold = font.deriveFont( Font.BOLD ); - gfx.setFont( font ); - FontMetrics fm = gfx.getFontMetrics(); - - // clear the display area - Rectangle all = linePanel.getBounds(); - gfx.setColor( dualDiff.getBackground() ); - gfx.fillRect( 0, 0, all.width, all.height ); - - // diff the lines by character - FileLine[] leftLines = new FileLine[ leftLine.length() ]; - FileLine[] rightLines = new FileLine[ rightLine.length() ]; - for ( int i = 0; i < leftLine.length(); i++ ) { - char c = leftLine.charAt( i ); - String text = String.valueOf( c ); - leftLines[ i ] = new FileLine( text, text ); - } - for ( int i = 0; i < rightLine.length(); i++ ) { - char c = rightLine.charAt( i ); - String text = String.valueOf( c ); - rightLines[ i ] = new FileLine( text, text ); - } - Diff d = new Diff( leftLines, rightLines ); - edits = d.diff_2( false ); - - if ( edits == null ) { - // lines are identical - return ; - } - - // arrays to associate a color per character for the left line - ArrayList<Character> leftChars = new ArrayList<Character>(); - ArrayList<Color> leftColors = new ArrayList<Color>(); - for ( int i = 0; i < leftLine.length(); i++ ) { - leftChars.add( leftLine.charAt( i ) ); - leftColors.add( Color.BLACK ); - } - - // arrays to associate a color per character for the right line - ArrayList<Character> rightChars = new ArrayList<Character>(); - ArrayList<Color> rightColors = new ArrayList<Color>(); - for ( int i = 0; i < rightLine.length(); i++ ) { - rightChars.add( rightLine.charAt( i ) ); - rightColors.add( Color.BLACK ); - } - - // calculate the colors per character, use the same colors the user has - // defined for the text area diff coloring. - Color color; - for ( Diff.change hunk = edits; hunk != null; hunk = hunk.link ) { - // left line colors - if ( hunk.deleted == 0 ) { - color = JDiffPlugin.overviewInvalidColor; - } - else { - if ( hunk.inserted == 0 ) { - color = JDiffPlugin.overviewDeletedColor; - } - else { - color = JDiffPlugin.overviewChangedColor; - } - } - for ( int i = 0; i < hunk.deleted; i++ ) { - leftColors.set( hunk.line0 + i, color ); - } - - // right line colors - if ( hunk.inserted == 0 ) { - color = JDiffPlugin.overviewInvalidColor; - } - else { - if ( hunk.deleted == 0 ) { - color = JDiffPlugin.overviewDeletedColor; - } - else { - color = JDiffPlugin.overviewChangedColor; - } - } - for ( int i = 0; i < hunk.inserted; i++ ) { - rightColors.set( hunk.line1 + i, color ); - } - } - - // draw the characters, left line above the right line - int x = leftMargin; - gfx.setColor(Color.BLACK); - gfx.drawString("Left", x, fm.getHeight()); - int left_width = fm.stringWidth(leftLine); - int tick_height = fm.getHeight() / 2; - int y = fm.getHeight() + tick_height; - gfx.drawLine(x, y, x + left_width, y); - gfx.drawLine(x, y, x, y + tick_height); - gfx.drawLine(x + left_width, y, x + left_width, y + tick_height); - - x = leftMargin; - int y0 = 3 * fm.getHeight(); - int y1 = y0 + fm.getHeight() + 3; - for ( int i = 0; i < leftChars.size(); i++ ) { - char c = leftChars.get( i ); - color = leftColors.get( i ); - gfx.setColor( color ); - gfx.setFont( color == Color.BLACK ? font : bold ); - gfx.drawString( String.valueOf( c ), x, y0 ); - x += fm.charWidth( c ); - } - x = leftMargin; - for ( int i = 0; i < rightChars.size(); i++ ) { - char c = rightChars.get( i ); - color = rightColors.get( i ); - gfx.setColor( color ); - gfx.setFont( color == Color.BLACK ? font : bold ); - gfx.drawString( String.valueOf( c ), x, y1 ); - x += fm.charWidth( c ); - } - - x = leftMargin; - gfx.setColor(Color.BLACK); - gfx.setFont(font); - gfx.drawString("Right", x, 6 * fm.getHeight()); - int right_width = fm.stringWidth(rightLine); - y = y1 + (fm.getHeight() / 2); - gfx.drawLine(x, y, x + right_width, y); - gfx.drawLine(x, y, x, y - tick_height); - gfx.drawLine(x + right_width, y, x + right_width, y - tick_height); - } -} Modified: plugins/JDiffPlugin/trunk/jdiff/DiffLocalOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DiffLocalOverview.java 2004-08-05 17:07:08 UTC (rev 11768) +++ plugins/JDiffPlugin/trunk/jdiff/DiffLocalOverview.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -52,7 +52,7 @@ private Rectangle centerRectangle; public DiffLocalOverview( - Diff.change edits, + Diff.Change edits, int lineCount0, int lineCount1, JEditTextArea textArea0, @@ -125,7 +125,7 @@ private void fillLeft( Graphics gfx ) { // fill in the left rectangle to show where left text area has different // lines than the right text area - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; int start_line0 = 0; Color color; @@ -186,7 +186,7 @@ // fill in the right rectangle to show where right text area has different // lines than the left text area Color color; - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; for ( int i1 = 0; ( i1 < rightVisibleLineCount ); i1++ ) { int physicalLine1 = this.textArea1.getPhysicalLineOfScreenLine( i1 ); @@ -231,7 +231,7 @@ // right rectangles. Draw a right and left arrow. Polygon arrow0; Polygon arrow1; - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; for ( int i0 = 0, i1 = 0; ( hunk != null ) && ( i0 < leftVisibleLineCount ) && ( i1 < rightVisibleLineCount ); ) { int physicalLine0 = this.textArea0.getPhysicalLineOfScreenLine( i0 ); int physicalLine1 = this.textArea1.getPhysicalLineOfScreenLine( i1 ); @@ -315,7 +315,7 @@ // copies a diff starting at the given line number in the left text area and // replaces the corresponding diff in the right text area public void moveRight( int line_number ) { - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; for ( ; hunk != null; hunk = hunk.link ) { // find the hunk pertaining to this line number if ( ( hunk.line0 + Math.max( 0, hunk.deleted - 1 ) ) < line_number ) { @@ -358,7 +358,7 @@ // copies a diff starting at the given line number in the right text area and // replaces the corresponding diff in the left text area public void moveLeft( int line_number ) { - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; for ( ; hunk != null; hunk = hunk.link ) { // find the hunk pertaining to this line number if ( ( hunk.line1 + Math.max( 0, hunk.inserted - 1 ) ) < line_number ) { Modified: plugins/JDiffPlugin/trunk/jdiff/DiffOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DiffOverview.java 2004-08-05 17:07:08 UTC (rev 11768) +++ plugins/JDiffPlugin/trunk/jdiff/DiffOverview.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -35,7 +35,7 @@ public abstract class DiffOverview extends JComponent { - protected Diff.change edits; + protected Diff.Change edits; protected int lineCount0; protected int lineCount1; protected JEditTextArea textArea0; @@ -43,7 +43,7 @@ public DiffOverview( - Diff.change edits, + Diff.Change edits, int lineCount0, int lineCount1, JEditTextArea textArea0, @@ -62,7 +62,7 @@ public void synchroScrollRight() { - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; int leftFirstLine = this.textArea0.getFirstLine(); int rightFirstLine = -1; @@ -110,7 +110,7 @@ public void synchroScrollLeft() { - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; int leftFirstLine = -1; int rightFirstLine = this.textArea1.getFirstLine(); Modified: plugins/JDiffPlugin/trunk/jdiff/DualDiff.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2004-08-05 17:07:08 UTC (rev 11768) +++ plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -31,12 +31,15 @@ import java.io.BufferedWriter; import java.io.StringWriter; +import java.nio.*; + import java.util.Hashtable; import java.util.HashSet; import java.util.Set; import javax.swing.*; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; + import jdiff.text.FileLine; import jdiff.util.Diff; import jdiff.util.DiffOutput; @@ -50,6 +53,7 @@ import org.gjt.sp.jedit.GUIUtilities; import org.gjt.sp.jedit.View; import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.gui.DockableWindowManager; import org.gjt.sp.jedit.msg.BufferUpdate; import org.gjt.sp.jedit.msg.EditPaneUpdate; import org.gjt.sp.jedit.textarea.JEditTextArea; @@ -92,7 +96,7 @@ private JEditTextArea textArea1; - private Diff.change edits; + private Diff.Change edits; private DiffOverview diffOverview0; @@ -496,38 +500,47 @@ DualDiff.refreshFor( view ); } - public static void toggleFor( View view ) { - EditPane[] editPanes = view.getEditPanes(); - if ( editPanes.length != 2 ) { - Log.log( Log.DEBUG, DualDiff.class, - "Splitting: the view has to be split in two" ); - if ( editPanes.length > 2 ) { - view.unsplit(); - } - view.splitVertically(); - } + public static void toggleFor( final View view ) { + Runnable r = new Runnable() { + public void run() { + if ( DualDiff.isEnabledFor( view ) ) { + DualDiff.removeFrom( view ); + view.getDockableWindowManager().hideDockableWindow( "jdiff-lines" ); + } + else { + EditPane[] editPanes = view.getEditPanes(); + if ( editPanes.length != 2 ) { + Log.log( Log.DEBUG, DualDiff.class, + "Splitting: the view has to be split in two" ); + if ( editPanes.length > 2 ) { + view.unsplit(); + } + view.splitVertically(); - if ( DualDiff.isEnabledFor( view ) ) { - DualDiff.removeFrom( view ); - view.getDockableWindowManager().toggleDockableWindow( "jdiff-lines" ); - } - else { - DualDiff.addTo( view ); - view.getDockableWindowManager().showDockableWindow( "jdiff-lines" ); - JScrollPane lines = ( JScrollPane ) view.getDockableWindowManager().getDockable( "jdiff-lines" ); - if ( lines != null ) { - lines.getViewport().setView( ( DiffLineOverview ) DualDiff.getDualDiffFor( view ).getLineProcessor() ); - } - } + // danson, make sure the divider is in the middle. For some reason, + // the left side would be much smaller than the right side, this + // takes care of that. + JSplitPane sp = view.getSplitPane(); + sp.setDividerLocation( 0.5 ); + } + DualDiff.addTo( view ); + DockableWindowManager dwm = view.getDockableWindowManager(); + if ( !dwm.isDockableWindowVisible( "jdiff-lines" ) ) { + System.out.println("+++++ not visible"); + if (dwm.getDockableWindow("jdiff-lines") == null) { + dwm.addDockableWindow("jdiff-lines"); + System.out.println("+++++ added dockable"); + } + dwm.showDockableWindow( "jdiff-lines" ); + System.out.println("+++++ dockable showing?"); + } + } - // danson, make sure the divider is in the middle. For some reason, - // the left side would be much smaller than the right side, this - // takes care of that. - JSplitPane sp = view.getSplitPane(); - sp.setDividerLocation( 0.5 ); - - view.invalidate(); - view.validate(); + view.invalidate(); + view.validate(); + } + }; + SwingUtilities.invokeLater( r ); } public static void refreshFor( View view ) { @@ -738,7 +751,7 @@ FileLine[] fileLines1 = dualDiff.getFileLines( buf1 ); Diff d = new Diff( fileLines0, fileLines1 ); - Diff.change script = d.diff_2( false ); + Diff.Change script = d.diff_2( false ); // Files are identical: return if ( script == null ) { @@ -781,7 +794,7 @@ } private void nextDiff0() { - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; int firstLine = this.textArea0.getCaretLine(); for ( ; hunk != null; hunk = hunk.link ) { if ( hunk.line0 > firstLine + ( ( hunk.deleted == 0 ) ? 1 : 0 ) ) { @@ -811,7 +824,7 @@ } private void nextDiff1() { - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; int firstLine = this.textArea1.getCaretLine(); for ( ; hunk != null; hunk = hunk.link ) { if ( hunk.line1 > firstLine + ( ( hunk.inserted == 0 ) ? 1 : 0 ) ) { @@ -841,7 +854,7 @@ } private void prevDiff0() { - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; int firstLine = this.textArea0.getFirstLine(); for ( ; hunk != null; hunk = hunk.link ) { if ( hunk.line0 < firstLine ) { @@ -873,7 +886,7 @@ } private void prevDiff1() { - Diff.change hunk = this.edits; + Diff.Change hunk = this.edits; int firstLine = this.textArea1.getFirstLine(); for ( ; hunk != null; hunk = hunk.link ) { if ( hunk.line1 < firstLine ) { @@ -911,7 +924,7 @@ dualDiff.enableHighlighters(); dualDiff.addHandlers(); - DiffLineOverview lineProcessor = new DiffLineOverview( dualDiff ); + jdiff.component.DiffLineOverview lineProcessor = new jdiff.component.DiffLineOverview( dualDiff ); dualDiff.setLineProcessor( lineProcessor ); dualDiff.diffOverview0.synchroScrollRight(); @@ -970,70 +983,79 @@ }; int previousCaretLine = 0; + LineProcessorRunner runner = new LineProcessorRunner(); public void caretUpdate( final CaretEvent e ) { - Runnable r = new Runnable() { - public void run() { - JEditTextArea source = ( JEditTextArea ) e.getSource(); - Diff.change hunk = DualDiff.this.edits; - String leftLine = ""; - String rightLine = ""; - if ( source == DualDiff.this.textArea0 ) { - int caretLine = DualDiff.this.textArea0.getCaretLine(); - for ( ; hunk != null; hunk = hunk.link ) { - if ( caretLine >= hunk.line0 && caretLine <= hunk.line0 + hunk.deleted ) { - // in a hunk - if ( hunk.deleted == 0 && hunk.line0 > 0 ) { - leftLine = ""; - } - else { - leftLine = DualDiff.this.textArea0.getLineText( caretLine ); - } - int offset = caretLine - hunk.line0; - if ( offset < hunk.inserted ) { - rightLine = DualDiff.this.textArea1.getLineText( hunk.line1 + offset ); - } - else { - rightLine = ""; - } - break ; - } - } - } - else { - int caretLine = DualDiff.this.textArea1.getCaretLine(); - for ( ; hunk != null; hunk = hunk.link ) { - if ( caretLine >= hunk.line1 && caretLine <= hunk.line1 + hunk.inserted ) { - // in a hunk - if ( hunk.inserted == 0 && hunk.line1 > 0 ) { - rightLine = ""; - } - else { - rightLine = DualDiff.this.textArea1.getLineText( caretLine ); - } - int offset = caretLine - hunk.line1; - if ( offset < hunk.deleted ) { - leftLine = DualDiff.this.textArea0.getLineText( hunk.line0 + offset ); - } - else { - leftLine = ""; - } - break ; - } - } - } - DualDiff.this.lineProcessor.processLines( leftLine, rightLine ); - } - }; if ( lineProcessor != null ) { JEditTextArea source = ( JEditTextArea ) e.getSource(); int caretLine = source.getCaretLine(); if ( caretLine != previousCaretLine ) { previousCaretLine = caretLine; - SwingUtilities.invokeLater( r ); + runner.setSource( source ); + SwingUtilities.invokeLater( runner ); } } } + class LineProcessorRunner implements Runnable { + JEditTextArea source = null; + public void setSource( JEditTextArea source ) { + this.source = source; + } + public void run() { + if ( source == null ) { + return ; + } + Diff.Change hunk = DualDiff.this.edits; + String leftLine = ""; + String rightLine = ""; + if ( source == DualDiff.this.textArea0 ) { + int caretLine = DualDiff.this.textArea0.getCaretLine(); + for ( ; hunk != null; hunk = hunk.link ) { + if ( caretLine >= hunk.line0 && caretLine <= hunk.line0 + hunk.deleted ) { + // in a hunk + if ( hunk.deleted == 0 && hunk.line0 > 0 ) { + leftLine = ""; + } + else { + leftLine = DualDiff.this.textArea0.getLineText( caretLine ); + } + int offset = caretLine - hunk.line0; + if ( offset < hunk.inserted ) { + rightLine = DualDiff.this.textArea1.getLineText( hunk.line1 + offset ); + } + else { + rightLine = ""; + } + break ; + } + } + } + else { + int caretLine = DualDiff.this.textArea1.getCaretLine(); + for ( ; hunk != null; hunk = hunk.link ) { + if ( caretLine >= hunk.line1 && caretLine <= hunk.line1 + hunk.inserted ) { + // in a hunk + if ( hunk.inserted == 0 && hunk.line1 > 0 ) { + rightLine = ""; + } + else { + rightLine = DualDiff.this.textArea1.getLineText( caretLine ); + } + int offset = caretLine - hunk.line1; + if ( offset < hunk.deleted ) { + leftLine = DualDiff.this.textArea0.getLineText( hunk.line0 + offset ); + } + else { + leftLine = ""; + } + break ; + } + } + } + DualDiff.this.lineProcessor.processLines( leftLine, rightLine ); + } + } + public void scrolledHorizontally( TextArea textArea ) { // Log.log(Log.DEBUG, this, "**** Adjustment " + e); @@ -1058,7 +1080,7 @@ public void focusGained( FocusEvent e ) { Log.log( Log.DEBUG, this, "**** focusGained " + e ); - if ( !view.getDockableWindowManager().isDockableWindowVisible("jdiff-lines") ) { + if ( !view.getDockableWindowManager().isDockableWindowVisible( "jdiff-lines" ) ) { view.getDockableWindowManager().showDockableWindow( "jdiff-lines" ); } } Added: plugins/JDiffPlugin/trunk/jdiff/component/DiffLineModel.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/DiffLineModel.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/DiffLineModel.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -0,0 +1,142 @@ + +package jdiff.component; + +import java.awt.Color; +import java.util.*; + +import jdiff.*; +import jdiff.text.FileLine; +import jdiff.util.Diff; + +public class DiffLineModel { + + private String leftLine; + private String rightLine; + private List<Character> leftCharacters; + private List<Color> leftColors; + private List<Character> rightCharacters; + private List<Color> rightColors; + + public DiffLineModel() {} + + public DiffLineModel( String leftLine, String rightLine ) { + this.leftLine = leftLine; + this.rightLine = rightLine; + prepData(); + } + + public List<Character> getLeftCharacters() { + return leftCharacters; + } + + public List<Color> getLeftColors() { + return leftColors; + } + + public List<Character> getRightCharacters() { + return rightCharacters; + } + + public List<Color> getRightColors() { + return rightColors; + } + + public void setLeftLine( String line ) { + this.leftLine = line; + prepData(); + } + + public String getLeftLine() { + return leftLine; + } + + public void setRightLine( String line ) { + this.rightLine = line; + prepData(); + } + + public String getRightLine() { + return rightLine; + } + + private void prepData() { + leftCharacters = null; + leftColors = null; + rightCharacters = null; + rightColors = null; + + // diff the lines by character + FileLine[] leftLines = new FileLine[ leftLine.length() ]; + FileLine[] rightLines = new FileLine[ rightLine.length() ]; + for ( int i = 0; i < leftLine.length(); i++ ) { + char c = leftLine.charAt( i ); + String text = String.valueOf( c ); + leftLines[ i ] = new FileLine( text, text ); + } + for ( int i = 0; i < rightLine.length(); i++ ) { + char c = rightLine.charAt( i ); + String text = String.valueOf( c ); + rightLines[ i ] = new FileLine( text, text ); + } + Diff d = new Diff( leftLines, rightLines ); + Diff.Change edits = d.diff_2( false ); + + if ( edits == null ) { + // lines are identical + return ; + } + + // arrays to associate a color per character for the left line + leftCharacters = new ArrayList<Character>(); + leftColors = new ArrayList<Color>(); + for ( int i = 0; i < leftLine.length(); i++ ) { + leftCharacters.add( leftLine.charAt( i ) ); + leftColors.add( Color.BLACK ); + } + + // arrays to associate a color per character for the right line + rightCharacters = new ArrayList<Character>(); + rightColors = new ArrayList<Color>(); + for ( int i = 0; i < rightLine.length(); i++ ) { + rightCharacters.add( rightLine.charAt( i ) ); + rightColors.add( Color.BLACK ); + } + + // calculate the colors per character, use the same colors the user has + // defined for the text area diff coloring. + Color color; + for ( Diff.Change hunk = edits; hunk != null; hunk = hunk.link ) { + // left line colors + if ( hunk.deleted == 0 ) { + color = JDiffPlugin.overviewInvalidColor; + } + else { + if ( hunk.inserted == 0 ) { + color = JDiffPlugin.overviewDeletedColor; + } + else { + color = JDiffPlugin.overviewChangedColor; + } + } + for ( int i = 0; i < hunk.deleted; i++ ) { + leftColors.set( hunk.line0 + i, color ); + } + + // right line colors + if ( hunk.inserted == 0 ) { + color = JDiffPlugin.overviewInvalidColor; + } + else { + if ( hunk.deleted == 0 ) { + color = JDiffPlugin.overviewDeletedColor; + } + else { + color = JDiffPlugin.overviewChangedColor; + } + } + for ( int i = 0; i < hunk.inserted; i++ ) { + rightColors.set( hunk.line1 + i, color ); + } + } + } +} Added: plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -0,0 +1,82 @@ + +package jdiff.component; + +import java.awt.Color; +import java.awt.Font; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; + +import jdiff.DualDiff; +import jdiff.LineProcessor; +import jdiff.component.DiffLineModel; +import jdiff.component.ui.*; + +import org.gjt.sp.jedit.View; + +public class DiffLineOverview extends JComponent implements LineProcessor { + + private static final String uiClassID = "DiffLineOverviewUI"; + + private DualDiff dualDiff = null; + private DiffLineModel diffLineModel = null; + + public DiffLineOverview( DualDiff dualDiff ) { + if ( dualDiff == null ) { + throw new IllegalArgumentException(); + } + this.dualDiff = dualDiff; + this.updateUI(); + } + + public void processLines( String leftLine, String rightLine ) { + if ( leftLine == null || rightLine == null ) { + return ; + } + setModel( new DiffLineModel( leftLine, rightLine ) ); + repaint(); + } + + public void setUI( DiffLineOverviewUI ui ) { + super.setUI( ui ); + } + + public void updateUI() { + if ( UIManager.get( getUIClassID() ) != null ) { + setUI( ( DiffLineOverviewUI ) UIManager.getUI( this ) ); + } + else { + setUI( new BasicDiffLineOverviewUI() ); + } + } + + public DiffLineOverviewUI getUI() { + return ( DiffLineOverviewUI ) ui; + } + + public String getUIClassID() { + return uiClassID; + } + + public View getView() { + return dualDiff.getView(); + } + + public void setModel( DiffLineModel model ) { + diffLineModel = model; + } + + public DiffLineModel getModel() { + return diffLineModel; + } + + @Override + public Color getBackground() { + return dualDiff.getBackground(); + } + + @Override + public Font getFont() { + return dualDiff.getFont(); + } +} Added: plugins/JDiffPlugin/trunk/jdiff/component/DiffLocalOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/DiffLocalOverview.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/DiffLocalOverview.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -0,0 +1,31 @@ + +package jdiff.component; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import jdiff.component.ui.*; + +public class DiffLocalOverview extends JComponent { + private static final String uiClassID = "DiffLocalOverviewUI"; + + public void setUI( DiffLocalOverviewUI ui ) { + super.setUI( ui ); + } + + public void updateUI() { + if ( UIManager.get( getUIClassID() ) != null ) { + setUI( ( DiffLocalOverviewUI ) UIManager.getUI( this ) ); + } + else { + setUI( new BasicDiffLocalOverviewUI() ); + } + } + + public DiffLocalOverviewUI getUI() { + return ( DiffLocalOverviewUI ) ui; + } + + public String getUIClassID() { + return uiClassID; + } +} Added: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -0,0 +1,155 @@ +package jdiff.component.ui; + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import javax.swing.border.LineBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.ComponentUI; + +import jdiff.MergeControl; +import jdiff.component.*; + +public class BasicDiffLineOverviewUI extends DiffLineOverviewUI { + + private DiffLineOverview diffLineOverview = null; + private MergeControl mergeControl = null; + private LineRendererPane lineRendererPane = null; + + public static ComponentUI createUI( JComponent c ) { + return new BasicDiffLineOverviewUI(); + } + + public void installUI( JComponent c ) { + diffLineOverview = ( DiffLineOverview ) c; + diffLineOverview.setLayout( createLayoutManager() ); + diffLineOverview.setBorder( new EmptyBorder( 1, 1, 1, 1 ) ); + + installDefaults(); + installComponents(); + installListeners(); + } + + public void uninstallUI( JComponent c ) { + c.setLayout( null ); + uninstallListeners(); + uninstallComponents(); + uninstallDefaults(); + + diffLineOverview = null; + } + + public void installDefaults() {} + + public void installComponents() { + mergeControl = new MergeControl( diffLineOverview.getView() ); + diffLineOverview.add( mergeControl, BorderLayout.NORTH ); + lineRendererPane = new LineRendererPane( ); + diffLineOverview.add( lineRendererPane, BorderLayout.CENTER ); + } + + public void installListeners() {} + + public void uninstallDefaults() { + diffLineOverview.remove( mergeControl ); + diffLineOverview.remove( lineRendererPane ); + diffLineOverview = null; + } + + public void uninstallComponents() {} + + public void uninstallListeners() {} + + protected LayoutManager createLayoutManager() { + return new BorderLayout(); + } + + public class LineRendererPane extends JPanel { + + private int leftMargin = 6; + + public LineRendererPane( ) { + setBorder( BorderFactory.createLineBorder( Color.black ) ); + } + + public Dimension getPreferredSize() { + return new Dimension( 600, 100 ); + } + + public void paintComponent( Graphics gfx ) { + super.paintComponent( gfx ); + + // clear the display area + Rectangle all = getBounds(); + gfx.setColor( diffLineOverview.getBackground() ); + gfx.fillRect( 0, 0, all.width, all.height ); + + DiffLineModel model = diffLineOverview.getModel(); + if (model == null || model.getLeftCharacters() == null || model.getRightCharacters() == null) { + return; + } + String leftLine = model.getLeftLine(); + String rightLine = model.getRightLine(); + + // set up the font + Font font = diffLineOverview.getFont(); + Font bold = font.deriveFont( Font.BOLD ); + gfx.setFont( font ); + FontMetrics fm = gfx.getFontMetrics(); + + // draw the characters, left line above the right line + // draw "Left" and bounding line with start and end ticks + int x = leftMargin; + gfx.setColor( Color.BLACK ); + gfx.drawString( "Left", x, fm.getHeight() ); + int left_width = fm.stringWidth( leftLine ); + int tick_height = fm.getHeight() / 2; + int y = fm.getHeight() + tick_height; + gfx.drawLine( x, y, x + left_width, y ); + gfx.drawLine( x, y, x, y + tick_height ); + gfx.drawLine( x + left_width, y, x + left_width, y + tick_height ); + + // draw text of left line. How to draw font with anti-aliasing? + Color color; + x = leftMargin; + int y0 = 3 * fm.getHeight(); + int y1 = y0 + fm.getHeight() + 3; + java.util.List<Character> leftChars = model.getLeftCharacters(); + java.util.List<Color> leftColors = model.getLeftColors(); + for ( int i = 0; i < leftChars.size(); i++ ) { + char c = leftChars.get( i ); + color = leftColors.get( i ); + gfx.setColor( color ); + gfx.setFont( color == Color.BLACK ? font : bold ); + gfx.drawString( String.valueOf( c ), x, y0 ); + x += fm.charWidth( c ); + } + + // draw text of right line + x = leftMargin; + java.util.List<Character> rightChars = model.getRightCharacters(); + java.util.List<Color> rightColors = model.getRightColors(); + for ( int i = 0; i < rightChars.size(); i++ ) { + char c = rightChars.get( i ); + color = rightColors.get( i ); + gfx.setColor( color ); + gfx.setFont( color == Color.BLACK ? font : bold ); + gfx.drawString( String.valueOf( c ), x, y1 ); + x += fm.charWidth( c ); + } + + // draw "Right" and bounding line with start and end ticks + x = leftMargin; + gfx.setColor( Color.BLACK ); + gfx.setFont( font ); + gfx.drawString( "Right", x, 6 * fm.getHeight() ); + int right_width = fm.stringWidth( rightLine ); + y = y1 + ( fm.getHeight() / 2 ); + gfx.drawLine( x, y, x + right_width, y ); + gfx.drawLine( x, y, x, y - tick_height ); + gfx.drawLine( x + right_width, y, x + right_width, y - tick_height ); + } + } +} Added: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLocalOverviewUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLocalOverviewUI.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLocalOverviewUI.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -0,0 +1,100 @@ +package jdiff.component.ui; + +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import javax.swing.border.LineBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.ComponentUI; + +import jdiff.component.*; + +public class BasicDiffLocalOverviewUI extends DiffLocalOverviewUI { + + private DiffLocalOverview diffLocalOverview; + + public static ComponentUI createUI(JComponent c) { + return new BasicDiffLocalOverviewUI(); + } + + public void installUI(JComponent c) { + diffLocalOverview = (DiffLocalOverview) c; + installDefaults(); + installComponents(); + installListeners(); + + c.setLayout(createLayoutManager()); + c.setBorder(new EmptyBorder(1, 1, 1, 1)); + } + + public void uninstallUI(JComponent c) { + c.setLayout(null); + uninstallListeners(); + uninstallComponents(); + uninstallDefaults(); + + diffLocalOverview = null; + } + + public void installDefaults() { + + } + + public void installComponents() { + + } + + public void installListeners() { + + } + + public void uninstallDefaults() { + + } + + public void uninstallComponents() { + + } + + public void uninstallListeners() { + + } + + @Override + public void paint(Graphics g, JComponent c) { + super.paint(g, c); + this.paintOverview(g); + } + + protected void paintOverview(Graphics g) { + + } + + + protected LayoutManager createLayoutManager() { + return new DiffLocalOverviewLayout(); + } + + protected class DiffLocalOverviewLayout implements LayoutManager { + public void addLayoutComponent(String name, Component c) { + } + + public void removeLayoutComponent(Component c) { + } + + public Dimension preferredLayoutSize(Container c) { + return new Dimension(0, 0); + } + + public Dimension minimumLayoutSize(Container c) { + return this.preferredLayoutSize(c); + } + + public void layoutContainer(Container c) { + + } + } +} Added: plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLineOverviewUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLineOverviewUI.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLineOverviewUI.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -0,0 +1,7 @@ + +package jdiff.component.ui; + +import javax.swing.plaf.ComponentUI; + +public abstract class DiffLineOverviewUI extends ComponentUI { +} Added: plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLocalOverviewUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLocalOverviewUI.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLocalOverviewUI.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -0,0 +1,7 @@ + +package jdiff.component.ui; + +import javax.swing.plaf.ComponentUI; + +public abstract class DiffLocalOverviewUI extends ComponentUI { +} Modified: plugins/JDiffPlugin/trunk/jdiff/util/Diff.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/Diff.java 2004-08-05 17:07:08 UTC (rev 11768) +++ plugins/JDiffPlugin/trunk/jdiff/util/Diff.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -355,8 +355,8 @@ /** Scan the tables of which lines are inserted and deleted, producing an edit script in reverse order. */ - private change build_reverse_script() { - change script = null; + private Change build_reverse_script() { + Change script = null; final boolean[] changed0 = filevec[0].changed_flag; final boolean[] changed1 = filevec[1].changed_flag; final int len0 = filevec[0].buffered_lines; @@ -377,7 +377,7 @@ while (changed1[1+i1]) ++i1; /* Record this change. */ - script = new change(line0, line1, i0 - line0, i1 - line1, script); + script = new Change(line0, line1, i0 - line0, i1 - line1, script); } /* We have reached lines in the two files that match each other. */ @@ -390,8 +390,8 @@ /** Scan the tables of which lines are inserted and deleted, producing an edit script in forward order. */ - private change build_script() { - change script = null; + private Change build_script() { + Change script = null; final boolean[] changed0 = filevec[0].changed_flag; final boolean[] changed1 = filevec[1].changed_flag; final int len0 = filevec[0].buffered_lines; @@ -411,7 +411,7 @@ while (changed1[i1]) --i1; /* Record this change. */ - script = new change(i0, i1, line0 - i0, line1 - i1, script); + script = new Change(i0, i1, line0 - i0, line1 - i1, script); } /* We have reached lines in the two files that match each other. */ @@ -423,7 +423,7 @@ /* Report the differences of two files. DEPTH is the current directory depth. */ - public change diff_2(final boolean reverse) { + public Change diff_2(final boolean reverse) { /* Some lines are obviously insertions or deletions because they don't match anything. Detect them now, @@ -474,9 +474,9 @@ If DELETED is 0 then LINE0 is the number of the line before which the insertion was done; vice versa for INSERTED and LINE1. */ - public static class change { + public static class Change { /** Previous or next edit command. */ - public change link; + public Change link; /** # lines of file 1 changed here. */ public final int inserted; @@ -497,7 +497,7 @@ If DELETED is 0 then LINE0 is the number of the line before which the insertion was done; vice versa for INSERTED and LINE1. */ - change(int line0, int line1, int deleted, int inserted, change old) { + Change(int line0, int line1, int deleted, int inserted, Change old) { this.line0 = line0; this.line1 = line1; this.inserted = inserted; @@ -508,7 +508,7 @@ public String toString() { StringBuffer sb = new StringBuffer(); - sb.append("change["); + sb.append("Change["); sb.append("line0=").append(line0).append(",deleted=").append(deleted); sb.append(",line1=").append(line1).append(",inserted=").append(inserted); sb.append("]"); Modified: plugins/JDiffPlugin/trunk/jdiff/util/DiffNormalOutput.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/DiffNormalOutput.java 2004-08-05 17:07:08 UTC (rev 11768) +++ plugins/JDiffPlugin/trunk/jdiff/util/DiffNormalOutput.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -30,8 +30,8 @@ } - public void writeScript(Diff.change script) throws IOException { - Diff.change hunk = script; + public void writeScript(Diff.Change script) throws IOException { + Diff.Change hunk = script; for (; hunk != null; hunk = hunk.link) { this.writeHunk(hunk); @@ -42,7 +42,7 @@ /** Writes a hunk of a normal diff. */ - protected void writeHunk(Diff.change hunk) throws IOException { + protected void writeHunk(Diff.Change hunk) throws IOException { int deletes = hunk.deleted; int inserts = hunk.inserted; Modified: plugins/JDiffPlugin/trunk/jdiff/util/DiffOutput.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/DiffOutput.java 2004-08-05 17:07:08 UTC (rev 11768) +++ plugins/JDiffPlugin/trunk/jdiff/util/DiffOutput.java 2008-02-11 03:29:20 UTC (rev 11769) @@ -53,7 +53,7 @@ } - abstract public void writeScript(Diff.change script) throws IOException; + abstract public void writeScript(Diff.Change script) throws IOException; protected void writeLine(String prefix, Object line) throws IOException { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dal...@us...> - 2008-02-14 03:40:10
|
Revision: 11793 http://jedit.svn.sourceforge.net/jedit/?rev=11793&view=rev Author: daleanson Date: 2008-02-13 19:40:05 -0800 (Wed, 13 Feb 2008) Log Message: ----------- code refactoring Modified Paths: -------------- plugins/JDiffPlugin/trunk/JDiffPlugin.props plugins/JDiffPlugin/trunk/dockables.xml plugins/JDiffPlugin/trunk/docs/index.html plugins/JDiffPlugin/trunk/jdiff/DualDiff.java plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java plugins/JDiffPlugin/trunk/jdiff/component/LineProcessor.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java Added Paths: ----------- plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java plugins/JDiffPlugin/trunk/jdiff/component/ui/MergeToolBarUI.java Removed Paths: ------------- plugins/JDiffPlugin/trunk/jdiff/component/MergeControl.java Modified: plugins/JDiffPlugin/trunk/JDiffPlugin.props =================================================================== --- plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-13 18:37:30 UTC (rev 11792) +++ plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-14 03:40:05 UTC (rev 11793) @@ -37,12 +37,14 @@ toggle-dual-diff.label=Dual diff jdiff.show-dual-diff-dialog.label=Show dual diff dialog +jdiff.diff-btn.label=Diff jdiff.refresh-diff.label=Refresh diff jdiff.prev-diff.label=Go to Previous Difference jdiff.next-diff.label=Go to Next Difference jdiff.move-right.label=Move Current Diff Right jdiff.move-left.label=Move Current Diff Left jdiff.unsplit.label=Unsplit +jdiff.refresh.label=Refresh jdiff.swap-textareas.label=Swap text areas jdiff.toggle-ignore-case.label=Ignore case jdiff.toggle-trim-whitespace.label=Ignore leading and trailing whitespace Modified: plugins/JDiffPlugin/trunk/dockables.xml =================================================================== --- plugins/JDiffPlugin/trunk/dockables.xml 2008-02-13 18:37:30 UTC (rev 11792) +++ plugins/JDiffPlugin/trunk/dockables.xml 2008-02-14 03:40:05 UTC (rev 11793) @@ -3,7 +3,13 @@ <DOCKABLES> <DOCKABLE NAME="jdiff-lines"> - (javax.swing.JComponent)(( jdiff.component.DiffLineOverview ) jdiff.DualDiff.getDualDiffFor( view ).getLineProcessor()); + jdiff.DualDiff dualDiff = jdiff.DualDiff.getDualDiffFor(view); + if (dualDiff != null) { + return dualDiff.getDiffLineOverview(); + } + else { + return new jdiff.component.DiffLineOverview(view); + } </DOCKABLE> </DOCKABLES> Modified: plugins/JDiffPlugin/trunk/docs/index.html =================================================================== --- plugins/JDiffPlugin/trunk/docs/index.html 2008-02-13 18:37:30 UTC (rev 11792) +++ plugins/JDiffPlugin/trunk/docs/index.html 2008-02-14 03:40:05 UTC (rev 11793) @@ -323,7 +323,7 @@ <ul> <li><p> Version 1.7. New Line Diff Dockable Added merge functionality, added mouse listener to global overview. (Dale Anson) </p> </li> - + <li><p> Version 1.5.2. Fixes to ignore whitespace options (1522563 - aconnor78) </p></li> <li><p> Version 1.5, updated to work with jEdit 4.3pre3+ Modified: plugins/JDiffPlugin/trunk/jdiff/DualDiff.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-02-13 18:37:30 UTC (rev 11792) +++ plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-02-14 03:40:05 UTC (rev 11793) @@ -43,7 +43,7 @@ import jdiff.component.DiffLocalOverview; import jdiff.component.DiffGlobalPhysicalOverview; import jdiff.component.DiffOverview; -import jdiff.component.LineProcessor; +import jdiff.component.DiffLineOverview; import jdiff.text.FileLine; import jdiff.util.Diff; import jdiff.util.DiffOutput; @@ -60,6 +60,7 @@ import org.gjt.sp.jedit.gui.DockableWindowManager; import org.gjt.sp.jedit.msg.BufferUpdate; import org.gjt.sp.jedit.msg.EditPaneUpdate; +import org.gjt.sp.jedit.msg.ViewUpdate; import org.gjt.sp.jedit.textarea.JEditTextArea; import org.gjt.sp.jedit.textarea.TextArea; import org.gjt.sp.jedit.textarea.TextAreaPainter; @@ -112,7 +113,7 @@ private final ScrollHandler scrollHandler = new ScrollHandler(); - private LineProcessor lineProcessor; + private DiffLineOverview diffLineOverview; private DualDiff( View view ) { this( view, ignoreCaseDefault, trimWhitespaceDefault, @@ -173,7 +174,6 @@ else if ( epu.getWhat() == EditPaneUpdate.BUFFER_CHANGED ) { DualDiff.editPaneBufferChanged( view, editPane ); } - else {} } } @@ -225,12 +225,12 @@ this.ignoreAllWhitespace = !this.ignoreAllWhitespace; } - public void setLineProcessor( LineProcessor lineProcessor ) { - this.lineProcessor = lineProcessor; + public void setDiffLineOverview( DiffLineOverview diffLineOverview ) { + this.diffLineOverview = diffLineOverview; } - public LineProcessor getLineProcessor() { - return lineProcessor; + public DiffLineOverview getDiffLineOverview() { + return diffLineOverview; } // initialize the overviews and merge controls @@ -284,6 +284,18 @@ this.enableHighlighters(); this.addHandlers(); + diffLineOverview.clear(); + EditPane editPane = view.getEditPane(); + final int caret = editPane.getTextArea().getCaretPosition(); + this.scrollHandler.caretUpdate( new CaretEvent( view.getEditPane() ) { + public int getDot() { + return caret; + } + public int getMark() { + return caret; + } + } + ); this.diffOverview0.synchroScrollRight(); this.diffOverview1.repaint(); } @@ -520,8 +532,8 @@ DualDiff.addTo( view ); DockableWindowManager dwm = view.getDockableWindowManager(); if ( !dwm.isDockableWindowVisible( "jdiff-lines" ) ) { - if (dwm.getDockableWindow("jdiff-lines") == null) { - dwm.addDockableWindow("jdiff-lines"); + if ( dwm.getDockableWindow( "jdiff-lines" ) == null ) { + dwm.addDockableWindow( "jdiff-lines" ); } dwm.showDockableWindow( "jdiff-lines" ); } @@ -915,13 +927,14 @@ dualDiff.enableHighlighters(); dualDiff.addHandlers(); - jdiff.component.DiffLineOverview lineProcessor = new jdiff.component.DiffLineOverview( dualDiff ); - dualDiff.setLineProcessor( lineProcessor ); + jdiff.component.DiffLineOverview diffLineOverview = new jdiff.component.DiffLineOverview( dualDiff, view ); + dualDiff.setDiffLineOverview( diffLineOverview ); dualDiff.diffOverview0.synchroScrollRight(); dualDiff.diffOverview1.repaint(); dualDiffs.put( view, dualDiff ); + diffLineOverview.reset(); } private static void removeFrom( View view ) { @@ -936,6 +949,8 @@ dualDiff.removeOverviews(); dualDiffs.remove( view ); + + dualDiff.getDiffLineOverview().setModel(null); } } @@ -973,17 +988,13 @@ } }; - int previousCaretLine = 0; LineProcessorRunner runner = new LineProcessorRunner(); public void caretUpdate( final CaretEvent e ) { - if ( lineProcessor != null ) { + if ( diffLineOverview != null ) { JEditTextArea source = ( JEditTextArea ) e.getSource(); int caretLine = source.getCaretLine(); - if ( caretLine != previousCaretLine ) { - previousCaretLine = caretLine; - runner.setSource( source ); - SwingUtilities.invokeLater( runner ); - } + runner.setSource( source ); + SwingUtilities.invokeLater( runner ); } } @@ -1043,7 +1054,7 @@ } } } - DualDiff.this.lineProcessor.processLines( leftLine, rightLine ); + DualDiff.this.diffLineOverview.processLines( leftLine, rightLine ); } } Modified: plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java 2008-02-13 18:37:30 UTC (rev 11792) +++ plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java 2008-02-14 03:40:05 UTC (rev 11793) @@ -22,7 +22,12 @@ import java.awt.Color; import java.awt.Font; +import java.util.HashSet; +import java.util.Set; + import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import javax.swing.plaf.ComponentUI; import jdiff.DualDiff; @@ -39,19 +44,25 @@ private static final String uiClassID = "DiffLineOverviewUI"; private DualDiff dualDiff = null; + private View view = null; private DiffLineModel diffLineModel = null; + private Set<ChangeListener> changeListeners = new HashSet<ChangeListener>(); + /** * @param dualDiff the DualDiff this component is to control. */ - public DiffLineOverview( DualDiff dualDiff ) { - if ( dualDiff == null ) { - throw new IllegalArgumentException(); - } + public DiffLineOverview( DualDiff dualDiff, View view ) { this.dualDiff = dualDiff; + this.view = view; this.updateUI(); } + public DiffLineOverview(View view) { + this.view = view; + this.updateUI(); + } + /** * Perform a diff on 2 lines. */ @@ -73,6 +84,7 @@ else { setUI( new BasicDiffLineOverviewUI() ); } + fireStateChanged(); } public DiffLineOverviewUI getUI() { @@ -83,16 +95,41 @@ return uiClassID; } + public void addChangeListener(ChangeListener cl) { + if (cl != null) { + changeListeners.add(cl); + } + } + + public void removeChangeListener(ChangeListener cl) { + if (cl != null) { + changeListeners.remove(cl); + } + } + + public void fireStateChanged() { + if (changeListeners.size() > 0) { + ChangeEvent event = new ChangeEvent(this); + for (ChangeListener cl : changeListeners) { + cl.stateChanged(event); + } + } + } + + public DualDiff getDualDiff() { + return dualDiff; + } + /** * @return parent frame */ public View getView() { - return dualDiff.getView(); + return view; } public void setModel( DiffLineModel model ) { diffLineModel = model; - repaint(); + fireStateChanged(); } public DiffLineModel getModel() { @@ -101,11 +138,30 @@ @Override public Color getBackground() { - return dualDiff.getBackground(); + if (dualDiff != null) { + return dualDiff.getBackground(); + } + else { + return view.getEditPane().getTextArea().getPainter().getBackground(); + } } @Override public Font getFont() { - return dualDiff.getFont(); + if (dualDiff != null) { + return dualDiff.getFont(); + } + else { + return view.getEditPane().getTextArea().getPainter().getFont(); + } } + + public void clear() { + setModel(null); + } + + public void reset() { + fireStateChanged(); + } + } Modified: plugins/JDiffPlugin/trunk/jdiff/component/LineProcessor.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/LineProcessor.java 2008-02-13 18:37:30 UTC (rev 11792) +++ plugins/JDiffPlugin/trunk/jdiff/component/LineProcessor.java 2008-02-14 03:40:05 UTC (rev 11793) @@ -21,4 +21,5 @@ public interface LineProcessor { public void processLines(String leftLine, String rightLine); + public void clear(); } Deleted: plugins/JDiffPlugin/trunk/jdiff/component/MergeControl.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/MergeControl.java 2008-02-13 18:37:30 UTC (rev 11792) +++ plugins/JDiffPlugin/trunk/jdiff/component/MergeControl.java 2008-02-14 03:40:05 UTC (rev 11793) @@ -1,141 +0,0 @@ -/* -* MergeControl.java -* Copyright (c) 2008 Dale Anson -* -* This program is free software; you can redistribute it and/or -* modify it under the terms of the GNU General Public License -* as published by the Free Software Foundation; either version 2 -* of the License, or any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -package jdiff.component; - -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.event.*; - -import org.gjt.sp.jedit.Buffer; -import org.gjt.sp.jedit.EditPane; -import org.gjt.sp.jedit.View; -import org.gjt.sp.jedit.GUIUtilities; -import org.gjt.sp.jedit.jEdit; - -import jdiff.*; - -/** - * This is the button controls to assist in doing merges. - */ -public class MergeControl extends JPanel { - - private View view; - - public MergeControl( View view ) { - super(); - - if ( view == null ) { - throw new IllegalArgumentException( "View may not be null." ); - } - this.view = view; - - // create buttons - JButton next = new JButton( GUIUtilities.loadIcon( "ArrowD.png" ) ); - JButton prev = new JButton( GUIUtilities.loadIcon( "ArrowU.png" ) ); - JButton move_right = new JButton( GUIUtilities.loadIcon( "ArrowR.png" )); - JButton move_left = new JButton(GUIUtilities.loadIcon( "ArrowL.png" ) ); - JButton unsplit = new JButton( GUIUtilities.loadIcon( "UnSplit.png" ) ); - JButton swap = new JButton( GUIUtilities.loadIcon( "SplitVertical.png" ) ); - - // tooltips - next.setToolTipText( jEdit.getProperty("jdiff.next-diff.label", "Go to next diff") ); - prev.setToolTipText( jEdit.getProperty("jdiff.move-right.label", "Go to previous diff") ); - unsplit.setToolTipText( jEdit.getProperty("jdiff.unsplit.label", "Unsplit") ); - swap.setToolTipText( jEdit.getProperty("jdiff.swap-textareas", "Swap text areas") ); - move_right.setToolTipText( jEdit.getProperty("jdiff.move-right.label", "Move diff to right") ); - move_left.setToolTipText( jEdit.getProperty("jdiff.move-left.label", "Move diff to left") ); - - - // create toolbars - JToolBar left_bar = new JToolBar(); - left_bar.setFloatable(false); - left_bar.setRollover(true); - left_bar.add( unsplit ); - left_bar.add( next ); - left_bar.add( move_right ); - - JToolBar right_bar = new JToolBar(); - right_bar.setFloatable(false); - right_bar.setRollover(true); - right_bar.add( move_left ); - right_bar.add( prev ); - right_bar.add( swap ); - - // create action listeners - move_left.addActionListener( - new ActionListener() { - public void actionPerformed( ActionEvent ae ) { - DualDiff.moveLeft( MergeControl.this.view.getEditPane() ); - } - } - ); - - move_right.addActionListener( - new ActionListener() { - public void actionPerformed( ActionEvent ae ) { - DualDiff.moveRight( MergeControl.this.view.getEditPane() ); - } - } - ); - - next.addActionListener( - new ActionListener() { - public void actionPerformed( ActionEvent ae ) { - DualDiff.nextDiff( MergeControl.this.view.getEditPane() ); - } - } - ); - - prev.addActionListener( - new ActionListener() { - public void actionPerformed( ActionEvent ae ) { - DualDiff.prevDiff( MergeControl.this.view.getEditPane() ); - } - } - ); - - unsplit.addActionListener( - new ActionListener() { - public void actionPerformed( ActionEvent ae ) { - MergeControl.this.view.unsplit(); - } - } - ); - swap.addActionListener( - new ActionListener() { - public void actionPerformed( ActionEvent ae ) { - EditPane left_ep = MergeControl.this.view.getEditPanes() [ 0 ]; - EditPane right_ep = MergeControl.this.view.getEditPanes() [ 1 ]; - Buffer left = left_ep.getBuffer(); - Buffer right = right_ep.getBuffer(); - left_ep.setBuffer( right ); - right_ep.setBuffer( left ); - } - } - ); - - // layout - setLayout(new FlowLayout()); - add(left_bar); - add(right_bar); - } - -} Added: plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java 2008-02-14 03:40:05 UTC (rev 11793) @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2008, Dale Anson + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + +package jdiff.component; + +import java.awt.Color; +import java.awt.Font; + +import java.util.HashSet; +import java.util.Set; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.ComponentUI; + +import jdiff.DualDiff; +import jdiff.component.DiffLineModel; +import jdiff.component.ui.*; + +import org.gjt.sp.jedit.View; + +/** + * Component to show the merge controls. + */ +public class MergeToolBar extends JComponent { + + private static final String uiClassID = "MergeToolBarUI"; + + private View view = null; + + private Set<ChangeListener> changeListeners = new HashSet<ChangeListener>(); + + /** + * @param view the parent frame + */ + public MergeToolBar( View view ) { + this.view = view; + this.updateUI(); + } + + public void setUI( MergeToolBarUI ui ) { + super.setUI( ui ); + } + + public void updateUI() { + if ( UIManager.get( getUIClassID() ) != null ) { + setUI( ( MergeToolBarUI ) UIManager.getUI( this ) ); + } + else { + setUI( new BasicMergeToolBarUI() ); + } + fireStateChanged(); + } + + public MergeToolBarUI getUI() { + return ( MergeToolBarUI ) ui; + } + + public String getUIClassID() { + return uiClassID; + } + + public void addChangeListener(ChangeListener cl) { + if (cl != null) { + changeListeners.add(cl); + } + } + + public void removeChangeListener(ChangeListener cl) { + if (cl != null) { + changeListeners.remove(cl); + } + } + + public void fireStateChanged() { + if (changeListeners.size() > 0) { + ChangeEvent event = new ChangeEvent(this); + for (ChangeListener cl : changeListeners) { + cl.stateChanged(event); + } + } + } + + /** + * @return parent frame + */ + public View getView() { + return view; + } + +} Modified: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java 2008-02-13 18:37:30 UTC (rev 11792) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java 2008-02-14 03:40:05 UTC (rev 11793) @@ -21,6 +21,7 @@ import java.awt.*; import java.awt.event.*; import javax.swing.*; +import javax.swing.event.*; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; import javax.swing.event.ChangeEvent; @@ -33,13 +34,11 @@ import jdiff.DualDiff; import jdiff.component.*; -public class BasicDiffLineOverviewUI extends DiffLineOverviewUI { +public class BasicDiffLineOverviewUI extends DiffLineOverviewUI implements ChangeListener { private DiffLineOverview diffLineOverview = null; - private MergeControl mergeControl = null; + private MergeToolBar mergeToolBar = null; private LineRendererPane lineRendererPane = null; - private JButton diffButton; - private JButton refreshButton; /** * Required by super class. @@ -90,22 +89,8 @@ * Create and install any sub-components. */ public void installComponents() { - JPanel button_panel = new JPanel(); - diffButton = new JButton(new ImageIcon(BasicDiffLineOverviewUI.class.getClassLoader().getResource("jdiff/component/resources/delta.png"))); - JToolBar diffButton_bar = new JToolBar(); - diffButton_bar.setFloatable( false ); - diffButton_bar.setRollover( true ); - diffButton_bar.add( diffButton ); - button_panel.add(diffButton_bar); - mergeControl = new MergeControl( diffLineOverview.getView() ); - button_panel.add(mergeControl); - refreshButton = new JButton(GUIUtilities.loadIcon( "Reload.png" )); - JToolBar refreshButton_bar = new JToolBar(); - refreshButton_bar.setFloatable( false ); - refreshButton_bar.setRollover( true ); - refreshButton_bar.add( refreshButton ); - button_panel.add(refreshButton_bar); - diffLineOverview.add( button_panel, BorderLayout.NORTH ); + mergeToolBar = new MergeToolBar(diffLineOverview.getView()); + diffLineOverview.add( mergeToolBar, BorderLayout.NORTH ); lineRendererPane = new LineRendererPane( ); diffLineOverview.add( lineRendererPane, BorderLayout.CENTER ); } @@ -114,24 +99,7 @@ * Install any action listeners, mouse listeners, etc. */ public void installListeners() { - diffButton.addActionListener( - new ActionListener() { - public void actionPerformed( ActionEvent ae ) { - View view = diffLineOverview.getView(); - DualDiff.getDualDiffFor(view).toggleFor(view); - diffLineOverview.repaint(); - } - } - ); - refreshButton.addActionListener( - new ActionListener() { - public void actionPerformed( ActionEvent ae ) { - View view = diffLineOverview.getView(); - DualDiff.getDualDiffFor(view).refreshFor(view); - diffLineOverview.repaint(); - } - } - ); + diffLineOverview.addChangeListener( this ); } /** @@ -149,14 +117,13 @@ /** * Tear down and clean up. */ - public void uninstallDefaults() { - } + public void uninstallDefaults() {} /** * Tear down and clean up. */ public void uninstallComponents() { - diffLineOverview.remove( mergeControl ); + diffLineOverview.remove( mergeToolBar ); diffLineOverview.remove( lineRendererPane ); diffLineOverview = null; } @@ -164,8 +131,14 @@ /** * Tear down and clean up. */ - public void uninstallListeners() {} + public void uninstallListeners() { + diffLineOverview.removeChangeListener( this ); + } + public void stateChanged( ChangeEvent event ) { + // adjust buttons + } + /** * @return a BorderLayout */ @@ -199,7 +172,7 @@ // suggest anti-aliasing for the font display. This is for Java 1.5, // jEdit also allows subpixel anti-alias, but that's a 1.6 thing and // would require reflection - if (!"none".equals(jEdit.getProperty("view.antiAlias"))) { + if ( !"none".equals( jEdit.getProperty( "view.antiAlias" ) ) ) { ( ( java.awt.Graphics2D ) gfx ).setRenderingHint( java.awt.RenderingHints.KEY_TEXT_ANTIALIASING, java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON @@ -214,13 +187,8 @@ DiffLineModel model = diffLineOverview.getModel(); if ( model == null || model.getLeftCharacters() == null || model.getRightCharacters() == null ) { - mergeControl.setEnabled(false); - View view = diffLineOverview.getView(); - diffButton.setEnabled(view.getEditPanes().length == 1); - refreshButton.setEnabled(DualDiff.getDualDiffFor(view) != null); return ; } - mergeControl.setEnabled(true); String leftLine = model.getLeftLine(); String rightLine = model.getRightLine(); Added: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java 2008-02-14 03:40:05 UTC (rev 11793) @@ -0,0 +1,258 @@ +/* +* Copyright (c) 2008, Dale Anson +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +package jdiff.component.ui; + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.event.*; +import javax.swing.border.EmptyBorder; +import javax.swing.border.LineBorder; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.plaf.ComponentUI; + +import org.gjt.sp.jedit.Buffer; +import org.gjt.sp.jedit.EditPane; +import org.gjt.sp.jedit.GUIUtilities; +import org.gjt.sp.jedit.View; +import org.gjt.sp.jedit.jEdit; +import jdiff.DualDiff; +import jdiff.component.*; + +public class BasicMergeToolBarUI extends MergeToolBarUI { + + private MergeToolBar toolbar; + private View view; + private JButton next; + private JButton prev; + private JButton move_right; + private JButton move_left; + private JButton unsplit; + private JButton swap; + private JButton diff; + private JButton refresh; + + /** + * Required by super class. + * @param c not used + * @return one of these + */ + public static ComponentUI createUI( JComponent c ) { + return new BasicMergeToolBarUI(); + } + + /** + * Configures the specified component appropriate for the look and feel. + * This method is invoked when the <code>ComponentUI</code> instance is being installed + * as the UI delegate on the specified component. This method should + * completely configure the component for the look and feel, + * including the following: + * <ol> + * <li>Install any default property values for color, fonts, borders, + * icons, opacity, etc. on the component. Whenever possible, + * property values initialized by the client program should <i>not</i> + * be overridden. + * </li><li>Install a <code>LayoutManager</code> on the component if necessary. + * </li><li>Create/add any required sub-components to the component. + * </li><li>Create/install event listeners on the component. + * </li><li>Create/install a <code>PropertyChangeListener</code> on the component in order + * to detect and respond to component property changes appropriately. + * </li><li>Install keyboard UI (mnemonics, traversal, etc.) on the component. + * </li><li>Initialize any appropriate instance data. + * </li></ol> + */ + public void installUI( JComponent c ) { + toolbar = ( MergeToolBar ) c; + view = toolbar.getView(); + installDefaults(); + installComponents(); + installListeners(); + } + + /** + * Install default values for colors, fonts, borders, etc. + */ + public void installDefaults() { + toolbar.setLayout( createLayoutManager() ); + toolbar.setBorder( new EmptyBorder( 1, 1, 1, 1 ) ); + } + + /** + * Create and install any sub-components. + */ + public void installComponents() { + JPanel button_panel = new JPanel(); + + // create buttons + diff = new JButton( new ImageIcon( BasicMergeToolBarUI.class.getClassLoader().getResource( "jdiff/component/resources/delta.png" ) ) ); + next = new JButton( GUIUtilities.loadIcon( "ArrowD.png" ) ); + prev = new JButton( GUIUtilities.loadIcon( "ArrowU.png" ) ); + move_right = new JButton( GUIUtilities.loadIcon( "ArrowR.png" ) ); + move_left = new JButton( GUIUtilities.loadIcon( "ArrowL.png" ) ); + unsplit = new JButton( GUIUtilities.loadIcon( "UnSplit.png" ) ); + swap = new JButton( GUIUtilities.loadIcon( "SplitVertical.png" ) ); + refresh = new JButton( GUIUtilities.loadIcon( "Reload.png" ) ); + + // tooltips + diff.setToolTipText( jEdit.getProperty( "jdiff.diff-btn.label", "Diff" ) ); + next.setToolTipText( jEdit.getProperty( "jdiff.next-diff.label", "Go to next diff" ) ); + prev.setToolTipText( jEdit.getProperty( "jdiff.move-right.label", "Go to previous diff" ) ); + unsplit.setToolTipText( jEdit.getProperty( "jdiff.unsplit.label", "Unsplit" ) ); + swap.setToolTipText( jEdit.getProperty( "jdiff.swap-textareas", "Swap text areas" ) ); + move_right.setToolTipText( jEdit.getProperty( "jdiff.move-right.label", "Move diff to right" ) ); + move_left.setToolTipText( jEdit.getProperty( "jdiff.move-left.label", "Move diff to left" ) ); + refresh.setToolTipText( jEdit.getProperty( "jdiff.refresh.label", "Refresh diff" ) ); + + toolbar.add( diff ); + toolbar.add( unsplit ); + toolbar.add( next ); + toolbar.add( move_right ); + toolbar.add( move_left ); + toolbar.add( prev ); + toolbar.add( swap ); + toolbar.add( refresh); + } + + /** + * Install any action listeners, mouse listeners, etc. + */ + public void installListeners() { + + move_left.addActionListener( + new ActionListener() { + public void actionPerformed( ActionEvent ae ) { + if ( view != null ) { + DualDiff.moveLeft( BasicMergeToolBarUI.this.view.getEditPane() ); + } + } + } + ); + + move_right.addActionListener( + new ActionListener() { + public void actionPerformed( ActionEvent ae ) { + if ( view != null ) { + DualDiff.moveRight( BasicMergeToolBarUI.this.view.getEditPane() ); + } + } + } + ); + + next.addActionListener( + new ActionListener() { + public void actionPerformed( ActionEvent ae ) { + if ( view != null ) { + DualDiff.nextDiff( BasicMergeToolBarUI.this.view.getEditPane() ); + } + } + } + ); + + prev.addActionListener( + new ActionListener() { + public void actionPerformed( ActionEvent ae ) { + if ( view != null ) { + DualDiff.prevDiff( BasicMergeToolBarUI.this.view.getEditPane() ); + } + } + } + ); + + unsplit.addActionListener( + new ActionListener() { + public void actionPerformed( ActionEvent ae ) { + if ( view != null ) { + BasicMergeToolBarUI.this.view.unsplit(); + } + } + } + ); + + swap.addActionListener( + new ActionListener() { + public void actionPerformed( ActionEvent ae ) { + if ( view != null ) { + EditPane left_ep = BasicMergeToolBarUI.this.view.getEditPanes() [ 0 ]; + EditPane right_ep = BasicMergeToolBarUI.this.view.getEditPanes() [ 1 ]; + Buffer left = left_ep.getBuffer(); + Buffer right = right_ep.getBuffer(); + left_ep.setBuffer( right ); + right_ep.setBuffer( left ); + } + } + } + ); + + diff.addActionListener( + new ActionListener() { + public void actionPerformed( ActionEvent ae ) { + View view = toolbar.getView(); + DualDiff.getDualDiffFor( view ).toggleFor( view ); + toolbar.repaint(); + } + } + ); + + refresh.addActionListener( + new ActionListener() { + public void actionPerformed( ActionEvent ae ) { + View view = toolbar.getView(); + DualDiff.getDualDiffFor( view ).refreshFor( view ); + toolbar.repaint(); + } + } + ); + } + + /** + * Tear down and clean up. + */ + public void uninstallUI( JComponent c ) { + c.setLayout( null ); + uninstallListeners(); + uninstallComponents(); + uninstallDefaults(); + } + + /** + * Tear down and clean up. + */ + public void uninstallDefaults() {} + + /** + * Tear down and clean up. + */ + public void uninstallComponents() { + } + + /** + * Tear down and clean up. + */ + public void uninstallListeners() { + } + + /** + * @return a BorderLayout + */ + protected LayoutManager createLayoutManager() { + return new GridLayout(1, 8, 2, 2); + } + +} Added: plugins/JDiffPlugin/trunk/jdiff/component/ui/MergeToolBarUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/MergeToolBarUI.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/MergeToolBarUI.java 2008-02-14 03:40:05 UTC (rev 11793) @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2008, Dale Anson + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + +package jdiff.component.ui; + +import javax.swing.plaf.ComponentUI; + +public abstract class MergeToolBarUI extends ComponentUI { +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dal...@us...> - 2008-02-15 04:33:18
|
Revision: 11800 http://jedit.svn.sourceforge.net/jedit/?rev=11800&view=rev Author: daleanson Date: 2008-02-14 20:33:15 -0800 (Thu, 14 Feb 2008) Log Message: ----------- fix for #1 of 1891865 Modified Paths: -------------- plugins/JDiffPlugin/trunk/JDiffPlugin.props plugins/JDiffPlugin/trunk/jdiff/DualDiff.java plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java Modified: plugins/JDiffPlugin/trunk/JDiffPlugin.props =================================================================== --- plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-15 04:14:13 UTC (rev 11799) +++ plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-15 04:33:15 UTC (rev 11800) @@ -50,6 +50,7 @@ jdiff.toggle-trim-whitespace.label=Ignore leading and trailing whitespace jdiff.toggle-ignore-amount-whitespace.label=Ignore amount of whitespace jdiff.toggle-ignore-all-whitespace.label=Ignore all whitespace +jdiff.auto-show-dockable.label=Automatically show dockable on diff jdiff.diff-normal-output.label=Normal Diff Output jdiff.ignore-case=false @@ -83,10 +84,13 @@ options.jdiff.trim-whitespace=Ignore leading and trailing whitespace options.jdiff.ignore-amount-whitespace=Ignore amount of whitespace options.jdiff.ignore-all-whitespace=Ignore all whitespace +options.jdiff.auto-show-dockable=Automatically show dockable on diff +## no longer used: options.jdiff.overview-display=Global overview display: options.jdiff.physical-overview=Physical overview options.jdiff.virtual-overview=Virtual overview +## options.jdiff.overview=Overview colors: options.jdiff.overview-changed-color=Changed lines color:\ Modified: plugins/JDiffPlugin/trunk/jdiff/DualDiff.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-02-15 04:14:13 UTC (rev 11799) +++ plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-02-15 04:33:15 UTC (rev 11800) @@ -513,9 +513,9 @@ if ( dwm.getDockableWindow( "jdiff-lines" ) == null ) { dwm.addDockableWindow( "jdiff-lines" ); } - /* TODO: make this a property setting? - dwm.showDockableWindow( "jdiff-lines" ); - */ + if ( jEdit.getBooleanProperty( "jdiff.auto-show-dockable" ) ) { + dwm.showDockableWindow( "jdiff-lines" ); + } } } @@ -930,7 +930,7 @@ dualDiffs.remove( view ); - dualDiff.getDiffLineOverview().setModel(null); + dualDiff.getDiffLineOverview().setModel( null ); } } @@ -992,11 +992,11 @@ public void focusGained( FocusEvent e ) { Log.log( Log.DEBUG, this, "**** focusGained " + e ); - /* TODO: make this a property setting? - if ( !view.getDockableWindowManager().isDockableWindowVisible( "jdiff-lines" ) ) { - view.getDockableWindowManager().showDockableWindow( "jdiff-lines" ); + if ( jEdit.getBooleanProperty( "jdiff.auto-show-dockable" ) ) { + if ( !view.getDockableWindowManager().isDockableWindowVisible( "jdiff-lines" ) ) { + view.getDockableWindowManager().showDockableWindow( "jdiff-lines" ); + } } - */ } public void focusLost( FocusEvent e ) { Modified: plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java 2008-02-15 04:14:13 UTC (rev 11799) +++ plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java 2008-02-15 04:33:15 UTC (rev 11800) @@ -35,11 +35,8 @@ private JCheckBox trimWhitespace; private JCheckBox ignoreAmountOfWhitespace; private JCheckBox ignoreAllWhitespace; + private JCheckBox autoShowDockable; - private JRadioButton virtualOverview; - private JRadioButton physicalOverview; - - public JDiffOptionPane() { super("jdiff-general"); } @@ -50,33 +47,13 @@ this.trimWhitespace = this.createCheckBox("jdiff.trim-whitespace", false); this.ignoreAmountOfWhitespace = this.createCheckBox("jdiff.ignore-amount-whitespace", false); this.ignoreAllWhitespace = this.createCheckBox("jdiff.ignore-all-whitespace", false); + this.autoShowDockable = this.createCheckBox("jdiff.auto-show-dockable", false); - this.virtualOverview = new JRadioButton(jEdit.getProperty( - "options.jdiff.virtual-overview" - )); - this.physicalOverview = new JRadioButton(jEdit.getProperty( - "options.jdiff.physical-overview" - )); - - ButtonGroup overviewGroup = new ButtonGroup(); - overviewGroup.add(this.virtualOverview); - overviewGroup.add(this.physicalOverview); - boolean isVirtual = ( - jEdit.getBooleanProperty("jdiff.global-virtual-overview", true) - ); - this.virtualOverview.setSelected(isVirtual); - this.physicalOverview.setSelected(!isVirtual); - addComponent(this.ignoreCase); addComponent(this.trimWhitespace); addComponent(this.ignoreAmountOfWhitespace); addComponent(this.ignoreAllWhitespace); - - addComponent(new JLabel(jEdit.getProperty( - "options.jdiff.overview-display" - ))); - addComponent(this.virtualOverview); - addComponent(this.physicalOverview); + addComponent(this.autoShowDockable); } @@ -93,9 +70,14 @@ jEdit.setBooleanProperty("jdiff.ignore-all-whitespace", this.ignoreAllWhitespace.isSelected() ); + jEdit.setBooleanProperty("jdiff.auto-show-dockable", + this.autoShowDockable.isSelected() + ); + // virtual overview has been removed, it hasn't worked since jEdit 4.2, + // so make sure the property is false jEdit.setBooleanProperty("jdiff.global-virtual-overview", - this.virtualOverview.isSelected() + false ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dal...@us...> - 2008-02-15 06:17:37
|
Revision: 11801 http://jedit.svn.sourceforge.net/jedit/?rev=11801&view=rev Author: daleanson Date: 2008-02-14 22:17:35 -0800 (Thu, 14 Feb 2008) Log Message: ----------- added options for dockable and toolbar layout Modified Paths: -------------- plugins/JDiffPlugin/trunk/JDiffPlugin.props plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java Modified: plugins/JDiffPlugin/trunk/JDiffPlugin.props =================================================================== --- plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-15 04:33:15 UTC (rev 11800) +++ plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-15 06:17:35 UTC (rev 11801) @@ -9,7 +9,8 @@ # Dependencies plugin.jdiff.JDiffPlugin.depend.0=jdk 1.5 plugin.jdiff.JDiffPlugin.depend.1=jedit 04.03.07.00 -plugin.jdiff.JDiffPlugin.activate=true +plugin.jdiff.JDiffPlugin.depend.2=plugin CommonControlsPlugin 0.9.4 +plugin.jdiff.JDiffPlugin.activate=defer # Menu plugin.jdiff.JDiffPlugin.menu=\ @@ -85,6 +86,11 @@ options.jdiff.ignore-amount-whitespace=Ignore amount of whitespace options.jdiff.ignore-all-whitespace=Ignore all whitespace options.jdiff.auto-show-dockable=Automatically show dockable on diff +options.jdiff.show-line-diff=Show line diff in dockable +options.jdiff.orientation.label=Merge Toolbar Orientation: +options.jdiff.toolbar-horizontal=Horizontal +options.jdiff.toolbar-vertical=Vertical +options.jdiff.toolbar-compact=Compact ## no longer used: options.jdiff.overview-display=Global overview display: Modified: plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java 2008-02-15 04:33:15 UTC (rev 11800) +++ plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java 2008-02-15 06:17:35 UTC (rev 11801) @@ -34,12 +34,17 @@ import jdiff.component.DiffLineModel; import jdiff.component.ui.*; +import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.EBComponent; +import org.gjt.sp.jedit.EBMessage; +import org.gjt.sp.jedit.EditBus; import org.gjt.sp.jedit.View; +import org.gjt.sp.jedit.msg.*; /** * Component to show the merge controls and line differences. */ -public class DiffLineOverview extends JComponent implements LineProcessor { +public class DiffLineOverview extends JComponent implements LineProcessor, EBComponent { private static final String uiClassID = "DiffLineOverviewUI"; @@ -56,6 +61,7 @@ this.dualDiff = dualDiff; this.view = view; this.updateUI(); + EditBus.addToBus(this); } public DiffLineOverview(View view) { @@ -164,4 +170,9 @@ fireStateChanged(); } + public void handleMessage( EBMessage message ) { + if (message instanceof PropertiesChanged ) { + fireStateChanged(); + } + } } Modified: plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java 2008-02-15 04:33:15 UTC (rev 11800) +++ plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java 2008-02-15 06:17:35 UTC (rev 11801) @@ -29,6 +29,7 @@ import jdiff.component.ui.*; +import org.gjt.sp.jedit.jEdit; import org.gjt.sp.jedit.EBComponent; import org.gjt.sp.jedit.EBMessage; import org.gjt.sp.jedit.EditBus; @@ -46,6 +47,11 @@ private View view = null; + public static final int HORIZONTAL = 1; + public static final int VERTICAL = 2; + public static final int COMPACT = 3; + private int orientation = HORIZONTAL; + private Set<ChangeListener> changeListeners = new HashSet<ChangeListener>(); /** @@ -121,5 +127,12 @@ else if ( message instanceof ViewUpdate ) { fireStateChanged(); } + else if (message instanceof PropertiesChanged ) { + int orient = jEdit.getIntegerProperty("jdiff.toolbar-orientation", orientation); + if ( orient != orientation ) { + orientation = orient; + fireStateChanged(); + } + } } } Modified: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java 2008-02-15 04:33:15 UTC (rev 11800) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java 2008-02-15 06:17:35 UTC (rev 11801) @@ -89,16 +89,39 @@ * Create and install any sub-components. */ public void installComponents() { - mergeToolBar = new MergeToolBar(diffLineOverview.getView()); - diffLineOverview.add( mergeToolBar, BorderLayout.NORTH ); + mergeToolBar = new MergeToolBar( diffLineOverview.getView() ); lineRendererPane = new LineRendererPane( diffLineOverview.getView() ); - diffLineOverview.add( lineRendererPane, BorderLayout.CENTER ); + int orientation = jEdit.getIntegerProperty( "jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL ); + boolean show_line_diff = jEdit.getBooleanProperty( "jdiff.show-line-diff", true ); + switch ( orientation ) { + case MergeToolBar.VERTICAL: + diffLineOverview.add( mergeToolBar, BorderLayout.NORTH ); + if ( show_line_diff ) { + diffLineOverview.add( lineRendererPane, BorderLayout.CENTER ); + } + break; + case MergeToolBar.COMPACT: + diffLineOverview.add( mergeToolBar, BorderLayout.WEST ); + if ( show_line_diff ) { + diffLineOverview.add( lineRendererPane, BorderLayout.CENTER ); + } + break; + default: + JPanel panel = new JPanel(); + panel.add(mergeToolBar); + diffLineOverview.add( panel, BorderLayout.NORTH ); + if ( show_line_diff ) { + diffLineOverview.add( lineRendererPane, BorderLayout.CENTER ); + } + break; + } } /** * Install any action listeners, mouse listeners, etc. */ public void installListeners() { + diffLineOverview.addChangeListener(this); } /** @@ -109,8 +132,6 @@ uninstallListeners(); uninstallComponents(); uninstallDefaults(); - - diffLineOverview = null; } /** @@ -124,7 +145,6 @@ public void uninstallComponents() { diffLineOverview.remove( mergeToolBar ); diffLineOverview.remove( lineRendererPane ); - diffLineOverview = null; } /** @@ -135,7 +155,8 @@ } public void stateChanged( ChangeEvent event ) { - // adjust buttons + uninstallComponents(); + installComponents(); } /** Modified: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java 2008-02-15 04:33:15 UTC (rev 11800) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java 2008-02-15 06:17:35 UTC (rev 11801) @@ -36,8 +36,10 @@ import jdiff.DualDiff; import jdiff.component.*; -public class BasicMergeToolBarUI extends MergeToolBarUI implements ChangeListener { +import ise.java.awt.KappaLayout; +public class BasicMergeToolBarUI extends MergeToolBarUI implements ChangeListener { + private MergeToolBar toolbar; private View view; private JButton next; @@ -48,6 +50,7 @@ private JButton swap; private JButton diff; private JButton refresh; + private int orientation; /** * Required by super class. @@ -81,6 +84,8 @@ public void installUI( JComponent c ) { toolbar = ( MergeToolBar ) c; view = toolbar.getView(); + orientation = jEdit.getIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL); + installDefaults(); installComponents(); installListeners(); @@ -127,23 +132,57 @@ move_left.setToolTipText( jEdit.getProperty( "jdiff.move-left.label", "Move diff to left" ) ); refresh.setToolTipText( jEdit.getProperty( "jdiff.refresh.label", "Refresh diff" ) ); - // install - toolbar.add( diff ); - toolbar.add( unsplit ); - toolbar.add( next ); - toolbar.add( move_right ); - toolbar.add( move_left ); - toolbar.add( prev ); - toolbar.add( swap ); - toolbar.add( refresh ); + installButtons(); } + private void installButtons() { + int orient = jEdit.getIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL); + //if ( orient != orientation ) { + orientation = orient; + toolbar.removeAll(); + toolbar.setLayout( createLayoutManager() ); + switch ( orient ) { + case MergeToolBar.VERTICAL: + toolbar.add( "0, 0", diff ); + toolbar.add( "0, 1", unsplit ); + toolbar.add( "0, 2", next ); + toolbar.add( "0, 3", move_right ); + toolbar.add( "0, 4", move_left ); + toolbar.add( "0, 5", prev ); + toolbar.add( "0, 6", swap ); + toolbar.add( "0, 7", refresh ); + break; + case MergeToolBar.COMPACT: + toolbar.add( "0, 0", diff ); + toolbar.add( "1, 0", refresh ); + toolbar.add( "0, 1", unsplit ); + toolbar.add( "1, 1", swap ); + toolbar.add( "0, 2", move_right ); + toolbar.add( "1, 2", move_left ); + toolbar.add( "0, 3", next ); + toolbar.add( "1, 3", prev ); + break; + default: + toolbar.add( "0, 0", diff ); + toolbar.add( "1, 0", unsplit ); + toolbar.add( "2, 0", next ); + toolbar.add( "3, 0", move_right ); + toolbar.add( "4, 0", move_left ); + toolbar.add( "5, 0", prev ); + toolbar.add( "6, 0", swap ); + toolbar.add( "7, 0", refresh ); + break; + } + toolbar.repaint(); + //} + } + /** * Install any action listeners, mouse listeners, etc. */ public void installListeners() { //EditBus.addToBus( this ); - toolbar.addChangeListener(this); + toolbar.addChangeListener( this ); move_left.addActionListener( new ActionListener() { @@ -255,17 +294,18 @@ * Tear down and clean up. */ public void uninstallListeners() { - toolbar.removeChangeListener(this); + toolbar.removeChangeListener( this ); } /** * @return a BorderLayout */ protected LayoutManager createLayoutManager() { - return new FlowLayout( FlowLayout.CENTER ); + return new KappaLayout(); } - public void stateChanged(ChangeEvent event) { + public void stateChanged( ChangeEvent event ) { + installButtons(); adjustButtons(); } Modified: plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java 2008-02-15 04:33:15 UTC (rev 11800) +++ plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java 2008-02-15 06:17:35 UTC (rev 11801) @@ -28,7 +28,9 @@ import org.gjt.sp.jedit.AbstractOptionPane; import org.gjt.sp.jedit.jEdit; +import jdiff.component.MergeToolBar; + public class JDiffOptionPane extends AbstractOptionPane { private JCheckBox ignoreCase; @@ -36,6 +38,10 @@ private JCheckBox ignoreAmountOfWhitespace; private JCheckBox ignoreAllWhitespace; private JCheckBox autoShowDockable; + private JRadioButton horizontal; + private JRadioButton vertical; + private JRadioButton compact; + private JCheckBox showLineDiff; public JDiffOptionPane() { super("jdiff-general"); @@ -43,42 +49,89 @@ public void _init() { - this.ignoreCase = this.createCheckBox("jdiff.ignore-case", false); - this.trimWhitespace = this.createCheckBox("jdiff.trim-whitespace", false); - this.ignoreAmountOfWhitespace = this.createCheckBox("jdiff.ignore-amount-whitespace", false); - this.ignoreAllWhitespace = this.createCheckBox("jdiff.ignore-all-whitespace", false); - this.autoShowDockable = this.createCheckBox("jdiff.auto-show-dockable", false); + ignoreCase = createCheckBox("jdiff.ignore-case", false); + trimWhitespace = createCheckBox("jdiff.trim-whitespace", false); + ignoreAmountOfWhitespace = createCheckBox("jdiff.ignore-amount-whitespace", false); + ignoreAllWhitespace = createCheckBox("jdiff.ignore-all-whitespace", false); + autoShowDockable = createCheckBox("jdiff.auto-show-dockable", false); + showLineDiff = createCheckBox("jdiff.show-line-diff", true ); - addComponent(this.ignoreCase); - addComponent(this.trimWhitespace); - addComponent(this.ignoreAmountOfWhitespace); - addComponent(this.ignoreAllWhitespace); - addComponent(this.autoShowDockable); + int orientation = jEdit.getIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL); + horizontal = new JRadioButton(jEdit.getProperty("options.jdiff.toolbar-horizontal")); + vertical = new JRadioButton(jEdit.getProperty("options.jdiff.toolbar-vertical")); + compact = new JRadioButton(jEdit.getProperty("options.jdiff.toolbar-compact")); + + ButtonGroup button_group = new ButtonGroup(); + button_group.add(horizontal); + button_group.add(vertical); + button_group.add(compact); + switch(orientation) { + case MergeToolBar.VERTICAL: + horizontal.setSelected(false); + vertical.setSelected(true); + compact.setSelected(false); + break; + case MergeToolBar.COMPACT: + horizontal.setSelected(false); + vertical.setSelected(false); + compact.setSelected(true); + break; + default: + horizontal.setSelected(true); + vertical.setSelected(false); + compact.setSelected(false); + break; + } + JLabel orientation_label = new JLabel(jEdit.getProperty("options.toolbar-orientation.label", "Merge Toolbar Orientation:")); + + addComponent(ignoreCase); + addComponent(trimWhitespace); + addComponent(ignoreAmountOfWhitespace); + addComponent(ignoreAllWhitespace); + addComponent(autoShowDockable); + addComponent(showLineDiff); + addComponent(orientation_label); + addComponent(horizontal); + addComponent(vertical); + addComponent(compact); } public void _save() { jEdit.setBooleanProperty("jdiff.ignore-case", - this.ignoreCase.isSelected() + ignoreCase.isSelected() ); jEdit.setBooleanProperty("jdiff.trim-whitespace", - this.trimWhitespace.isSelected() + trimWhitespace.isSelected() ); jEdit.setBooleanProperty("jdiff.ignore-amount-whitespace", - this.ignoreAmountOfWhitespace.isSelected() + ignoreAmountOfWhitespace.isSelected() ); jEdit.setBooleanProperty("jdiff.ignore-all-whitespace", - this.ignoreAllWhitespace.isSelected() + ignoreAllWhitespace.isSelected() ); jEdit.setBooleanProperty("jdiff.auto-show-dockable", - this.autoShowDockable.isSelected() + autoShowDockable.isSelected() ); + jEdit.setBooleanProperty("jdiff.show-line-diff", + showLineDiff.isSelected() + ); + if ( vertical.isSelected() ) { + jEdit.setIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.VERTICAL); + } + else if ( compact.isSelected() ) { + jEdit.setIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.COMPACT); + } + else{ + jEdit.setIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL); + + } + + // virtual overview has been removed, it hasn't worked since jEdit 4.2, // so make sure the property is false - jEdit.setBooleanProperty("jdiff.global-virtual-overview", - false - ); + jEdit.setBooleanProperty("jdiff.global-virtual-overview", false); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dal...@us...> - 2008-02-16 04:58:56
|
Revision: 11807 http://jedit.svn.sourceforge.net/jedit/?rev=11807&view=rev Author: daleanson Date: 2008-02-15 20:58:55 -0800 (Fri, 15 Feb 2008) Log Message: ----------- Updated docs. Revised build file. Added dependency on CommonControls. Bug fixes. Option updates. Modified Paths: -------------- plugins/JDiffPlugin/trunk/build.xml plugins/JDiffPlugin/trunk/docs/index.html plugins/JDiffPlugin/trunk/jdiff/DiffHighlight.java plugins/JDiffPlugin/trunk/jdiff/DualDiff.java plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java plugins/JDiffPlugin/trunk/jdiff/util/Diff.java Added Paths: ----------- plugins/JDiffPlugin/trunk/docs/delta.png Modified: plugins/JDiffPlugin/trunk/build.xml =================================================================== --- plugins/JDiffPlugin/trunk/build.xml 2008-02-16 00:04:53 UTC (rev 11806) +++ plugins/JDiffPlugin/trunk/build.xml 2008-02-16 04:58:55 UTC (rev 11807) @@ -1,36 +1,218 @@ -<?xml version="1.0"?> -<!-- - This is the standard build.xml file for building the JDiffPlugin plugin. +<project name="JDiffPlugin" default="dist" basedir="."> - The 'dist' target compiles the plugin, generates documentation, and creates - the JAR file. Before running the 'dist' target, you will need to choose - whether to generate the documentation using one of these two targets: ---> - -<project name="JDiffPlugin" default="build" basedir="."> - <property name="docs-proc.target" value="none"/> + <!-- read build.props to override properties set below --> + <property file="../build.properties"/> <property file="build.properties"/> - <property file="../build.properties"/> - <property name="jedit.install.dir" value="../.."/> - <property name="jar.name" value="${ant.project.name}.jar"/> - <import file="${build.support}/plugin-build.xml" /> - - <property name="src.dir" value="."/> - <property name="build.dir" value="build"/> - <property name="install.dir" value=".."/> + <!-- default location of jedit.jar --> + <property name="jedit.install.dir" value="../.."/> - <path id="project.class.path"> - <pathelement location="${jedit.install.dir}/jedit.jar"/> - <pathelement location="${src.dir}"/> - </path> - - <selector id="packageFiles"> - <or> - <filename name="docs/*" /> - </or> - </selector> + <!-- jar name --> + <property name="jar.name" value="${ant.project.name}.jar"/> + <!-- version number --> + <property name="build.num" value="1.8.0"/> + + <!-- where to put the finished plugin --> + <property name="install.dir" value=".." /> + + <!-- source code directory, this is where the .java files live --> + <property name="src.dir" location="." /> + <mkdir dir="${src.dir}"/> + + <!-- library directory, location for third party jars --> + <property name="lib.dir" location="lib"/> + <mkdir dir="${lib.dir}"/> + + <!-- temporary directory for post-compile processing --> + <property name="build.dir" location="build"/> + <mkdir dir="${build.dir}"/> + + <!-- configuration directory, this is where the configuration files for the + plugin are placed for additional processing prior to getting jarred. --> + <property name="config.dir" location="${build.dir}/config" /> + <mkdir dir="${config.dir}"/> + + <!-- documentation directory, this is where the plugin documentation + files live. Files in this directory will be distributed with the plugin --> + <property name="doc.dir" location="${build.dir}/docs" /> + <mkdir dir="${doc.dir}"/> + + <!-- the directory for the compiled classes. Files in this directory will be + included in the finished jar file. --> + <property name="classes.dir" location="${build.dir}/classes" /> + <mkdir dir="${classes.dir}"/> + + + <!-- ======================================================================== + Target: set classpath + ========================================================================= --> + <target name="setClasspath"> + <path id="classpathref"> + <!-- required locations/jars --> + <pathelement location="${classes.dir}" /> + <pathelement path="${java.class.path}"/> + + <!-- required for jEdit plugin --> + <pathelement location="${jedit.install.dir}/jedit.jar" /> + + <!-- dependencies --> + <pathelement location="${install.dir}/kappalayout.jar"/> + </path> + </target> + + <!-- ======================================================================== + Target: compile + ========================================================================= --> + <target name="compile" + description="Compile" + depends="init,setClasspath"> + <javac deprecation="on" + debug="on" + nowarn="off" + destdir="${classes.dir}" + srcdir="${src.dir}" + target="1.5" + source="1.5"> + <classpath refid="classpathref" /> + <compilerarg value="-Xlint:unchecked"/> + </javac> + <copy todir="${classes.dir}/docs" overwrite="no"> + <fileset dir="${src.dir}/docs"> + <include name="**/*"/> + </fileset> + </copy> + <copy todir="${classes.dir}/jdiff/component/resources" overwrite="no"> + <fileset dir="${src.dir}/jdiff/component/resources"> + <include name="**/*.gif"/> + <include name="**/*.jpg"/> + <include name="**/*.png"/> + </fileset> + </copy> + </target> + + + <!-- ======================================================================== + Target: dist + creates jar file suitable for dropping into jEdit, and puts it up one + directory level + ========================================================================= --> + <target name="dist" + description="Compiles, jars, puts the jar in the jEdit jars directory." + depends="clean,init,compile,prep_files"> + + + <!-- make the plugin jar file --> + <tstamp/> + <jar jarfile="${install.dir}/${ant.project.name}.jar"> + <manifest> + <attribute name="AppName" value="${ant.project.name}" /> + <attribute name="AppVersion" value="${build.num}" /> + <attribute name="Created-By" value="${user.name}" /> + <attribute name="Created-On" value="${TODAY}"/> + </manifest> + + <!-- include everything in the build directory --> + <fileset dir="${classes.dir}"> + <include name="**/*" /> + </fileset> + + <!-- include everything in the config directory--> + <fileset dir="${config.dir}"> + <include name="**/*" /> + </fileset> + + <!-- include everything in the doc directory --> + <fileset dir="${doc.dir}"> + <include name="**/*" /> + </fileset> + </jar> + + <copy todir="${install.dir}"> + <fileset dir="${lib.dir}"> + <include name="*.jar"/> + </fileset> + </copy> + + </target> + + <!-- ======================================================================== + Target: prep_files + prepares certain files for distribution by doing string replacement. + Assumes that the configuration files and documentation files are ready. + ========================================================================= --> + <target name="prep_files"> + <!-- clean out the config and doc deployment directories --> + <delete> + <fileset dir="${config.dir}" includes="**/*"/> + <fileset dir="${doc.dir}" includes="**/*"/> + </delete> + + <!-- copy the config files to deployment directory + CHANGED: apparently, having a 'src/config' directory to hold the configuration + files is too confusing, so now they are dumped in basedir, along with + any other crud that may or may not be part of the deployment package. + Now need to explicitly name the proper files, so we don't pick up the + crud. + --> + <copy todir="${config.dir}"> + <fileset dir="${basedir}"> + <include name="JDiffPlugin.props"/> + <include name="dockables.xml"/> + <include name="actions.xml"/> + <include name="dockables.xml"/> + </fileset> + </copy> + + <!-- copy the docs --> + <copy todir="${doc.dir}/docs" overwrite="yes"> + <fileset dir="${src.dir}/docs"> + <include name="**/*"/> + </fileset> + </copy> + + <!-- insert the build number into the documentation and configuration + files --> + <!-- CHANGED: don't do this, the python build system for jEdit gets + confused if the build number isn't present BEFORE the build, so need + to change it by hand everytime there is a new release. + <replace dir="${config.dir}" token="@@build.num@@" + value="${build.num}" /> + --> + <replace dir="${doc.dir}" token="@@build.num@@" + value="${build.num}" /> + <tstamp/> + <replace dir="${doc.dir}" token="@@tstamp@@" + value="${TODAY}" /> + </target> + + <!-- ======================================================================== + Target: clean + deletes all files from the temp directory + ========================================================================= --> + <target name="clean" description="Delete all files from the classes directory."> + <!-- delete old directories that may still be hanging around. These + caused some confusion. --> + <delete dir="${classes.dir}"/> + <delete dir="${build.dir}"/> + <mkdir dir="${classes.dir}"/> + <mkdir dir="${build.dir}"/> + </target> + + <!-- ======================================================================== + Target: init + this target creates the directories needed for this project and + only needs to be done once. + ========================================================================= --> + <target name="init" + description="Create directory structure."> + <fail unless="jedit.install.dir" message="Please set jedit.install.dir property."/> + <mkdir dir="${src.dir}" /> + <mkdir dir="${classes.dir}" /> + <mkdir dir="${doc.dir}" /> + <mkdir dir="${config.dir}" /> + </target> + </project> Added: plugins/JDiffPlugin/trunk/docs/delta.png =================================================================== (Binary files differ) Property changes on: plugins/JDiffPlugin/trunk/docs/delta.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: plugins/JDiffPlugin/trunk/docs/index.html =================================================================== --- plugins/JDiffPlugin/trunk/docs/index.html 2008-02-16 00:04:53 UTC (rev 11806) +++ plugins/JDiffPlugin/trunk/docs/index.html 2008-02-16 04:58:55 UTC (rev 11807) @@ -4,7 +4,7 @@ </head> <body> - <h2>JDiff plugin</h2> + <h2>JDiff Plugin @@build.num@@</h2> <p> Authors: André Kaplan, Mark Wickens, Dale Anson @@ -53,12 +53,11 @@ <h3>Usage</h3> <p>The simplest method is to open the Dual Diff Dialog - (<guimenu>Plugins</guimenu>> - <guisubmenu>JDiff</guisubmenu>> - <b>Show dual diff dialog</b>) - and choose the files to compare. But you can also: + (Plugins -> JDiff -> <b>Show dual diff dialog</b>) + and choose the files to compare. </p> - + <p> + But you can also:<br> <ol> <li><p>Split your view in two (vertically)</p></li> @@ -75,7 +74,16 @@ <b>Dual Diff</b> </p> </li> </ol> + </p> + <p> + Or if you have JDiff docked:<br> + <ol> + <li>Open the dockable.</li> + <li>Click the 'Diff' button: <br><img src="delta.png"></img></li> + </ol> + </p> + <p>Figure 1 shows the result</p> <img src="diff_overview.jpg" format="JPG"> @@ -147,10 +155,11 @@ <h3>Merge controls</h3> <p> - The merge control has 6 buttons. From left to right: + The merge control has 8 buttons. From left to right in horizontal mode: </p> <p> <ol> + <li>Start a diff.</li> <li>Unsplit the view, which ends the diff session.</li> <li>Move to next diff.</li> <li>Move current diff to right. This replaces the diff on the right @@ -160,8 +169,12 @@ <li>Move to previous diff.</li> <li>Swap text areas, that is, put the file that was on the left on the right, and put the file that was on the right on the left.</li> + <li>Refresh the diff.</li> </ol> </p> + <p> + The merge controls can also be displayed vertically or in a compact form, and with or without the line overview. The vertical display is convenient for the left or right docking areas. The horizontal layout works well in the top or bottom docking areas. The compact layout uses less vertical space in the top or bottom docking areas when the line overview is also displayed. + </p> <hr> @@ -242,16 +255,21 @@ </p></li> </ul> - <h3>Global overview display</h3> - + <h3>Control layout</h3> + <p> + Automatically display dockable on diff: When starting a new diff from the plugin menu, if on, this setting will cause the diff dockable to be displayed immediately so the merge controls are quickly accessible. + </p> + <p> + Show line diffs in dockable: Toggles display of the line diff in the dockable. Turning this off will reduce the amount of screen space the dockable occupies. + </p> + <p> + Merge control layout<br> <ul> - <li><p>Virtual overview: uses the virtual representation of buffers for its display </p> - </li> - - <li><p>Physical overview: uses the physical representation of buffers for its display </p> - </li> + <li>Horizontal: default, merge control buttons in a single horizontal line. Best used docked at top or bottom.</li> + <li>Vertical: merge controls in a single vertical line. Best used docked at the left or right. Not a good choice when the line overview is also on.</li> + <li>Compact: merge controls in 2 columns of 4 buttons. Occupies smallest amount of screen space when used with the line overview.</li> </ul> - + </p> <h3>Overview colors</h3> <p>You can configure the colors of:</p> @@ -321,7 +339,8 @@ <h3>History</h3> <ul> - <li><p> Version 1.7. New Line Diff Dockable Added merge functionality, added mouse listener to global overview. (Dale Anson) </p> + <li><p> Version 1.8. Bug fixes, added "Diff" and "Refresh" buttons to merge controls, major code refactoring to clean up the various painting issues. + <li><p> Version 1.7. Added a dockable to display line diff and merge controls. Added merge functionality, added mouse listener to global overview. (Dale Anson) </p> </li> <li><p> Version 1.5.2. Fixes to ignore whitespace options (1522563 - aconnor78) </p></li> Modified: plugins/JDiffPlugin/trunk/jdiff/DiffHighlight.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DiffHighlight.java 2008-02-16 00:04:53 UTC (rev 11806) +++ plugins/JDiffPlugin/trunk/jdiff/DiffHighlight.java 2008-02-16 04:58:55 UTC (rev 11807) @@ -27,7 +27,7 @@ import java.awt.event.MouseEvent; -import java.util.Hashtable; +import java.util.HashMap; import jdiff.util.Diff; @@ -52,7 +52,7 @@ } // (EditPane, DiffHighlight) association - private static Hashtable highlights = new Hashtable(); + private static HashMap<EditPane, TextAreaExtension> highlights = new HashMap<EditPane, TextAreaExtension>(); private JEditTextArea textArea; private boolean enabled = false; Modified: plugins/JDiffPlugin/trunk/jdiff/DualDiff.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-02-16 00:04:53 UTC (rev 11806) +++ plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-02-16 04:58:55 UTC (rev 11807) @@ -33,7 +33,7 @@ import java.nio.*; -import java.util.Hashtable; +import java.util.HashMap; import javax.swing.*; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; @@ -78,7 +78,7 @@ private static boolean ignoreAllWhitespaceDefault = jEdit.getBooleanProperty( "jdiff.ignore-all-whitespace", false ); - private static Hashtable dualDiffs = new Hashtable(); + private static HashMap<View, DualDiff> dualDiffs = new HashMap<View, DualDiff>(); private boolean ignoreCase; Modified: plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java 2008-02-16 00:04:53 UTC (rev 11806) +++ plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java 2008-02-16 04:58:55 UTC (rev 11807) @@ -67,6 +67,7 @@ public DiffLineOverview(View view) { this.view = view; this.updateUI(); + EditBus.addToBus(this); } /** @@ -172,6 +173,7 @@ public void handleMessage( EBMessage message ) { if (message instanceof PropertiesChanged ) { + System.out.println("+++++ handleMessage" ); fireStateChanged(); } } Modified: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java 2008-02-16 00:04:53 UTC (rev 11806) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java 2008-02-16 04:58:55 UTC (rev 11807) @@ -115,6 +115,7 @@ } break; } + diffLineOverview.repaint(); } /** @@ -137,14 +138,14 @@ /** * Tear down and clean up. */ - public void uninstallDefaults() {} + public void uninstallDefaults() { + } /** * Tear down and clean up. */ public void uninstallComponents() { - diffLineOverview.remove( mergeToolBar ); - diffLineOverview.remove( lineRendererPane ); + diffLineOverview.removeAll( ); } /** @@ -155,8 +156,8 @@ } public void stateChanged( ChangeEvent event ) { - uninstallComponents(); - installComponents(); + uninstallUI(diffLineOverview); + installUI(diffLineOverview); } /** Modified: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java 2008-02-16 00:04:53 UTC (rev 11806) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java 2008-02-16 04:58:55 UTC (rev 11807) @@ -84,7 +84,7 @@ public void installUI( JComponent c ) { toolbar = ( MergeToolBar ) c; view = toolbar.getView(); - orientation = jEdit.getIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL); + orientation = jEdit.getIntegerProperty( "jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL ); installDefaults(); installComponents(); @@ -136,52 +136,49 @@ } private void installButtons() { - int orient = jEdit.getIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL); - //if ( orient != orientation ) { - orientation = orient; - toolbar.removeAll(); - toolbar.setLayout( createLayoutManager() ); - switch ( orient ) { - case MergeToolBar.VERTICAL: - toolbar.add( "0, 0", diff ); - toolbar.add( "0, 1", unsplit ); - toolbar.add( "0, 2", next ); - toolbar.add( "0, 3", move_right ); - toolbar.add( "0, 4", move_left ); - toolbar.add( "0, 5", prev ); - toolbar.add( "0, 6", swap ); - toolbar.add( "0, 7", refresh ); - break; - case MergeToolBar.COMPACT: - toolbar.add( "0, 0", diff ); - toolbar.add( "1, 0", refresh ); - toolbar.add( "0, 1", unsplit ); - toolbar.add( "1, 1", swap ); - toolbar.add( "0, 2", move_right ); - toolbar.add( "1, 2", move_left ); - toolbar.add( "0, 3", next ); - toolbar.add( "1, 3", prev ); - break; - default: - toolbar.add( "0, 0", diff ); - toolbar.add( "1, 0", unsplit ); - toolbar.add( "2, 0", next ); - toolbar.add( "3, 0", move_right ); - toolbar.add( "4, 0", move_left ); - toolbar.add( "5, 0", prev ); - toolbar.add( "6, 0", swap ); - toolbar.add( "7, 0", refresh ); - break; - } - toolbar.repaint(); - //} + int orient = jEdit.getIntegerProperty( "jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL ); + orientation = orient; + toolbar.removeAll(); + toolbar.setLayout( createLayoutManager() ); + switch ( orient ) { + case MergeToolBar.VERTICAL: + toolbar.add( "0, 0", diff ); + toolbar.add( "0, 1", unsplit ); + toolbar.add( "0, 2", next ); + toolbar.add( "0, 3", prev ); + toolbar.add( "0, 4", move_right ); + toolbar.add( "0, 5", move_left ); + toolbar.add( "0, 6", swap ); + toolbar.add( "0, 7", refresh ); + break; + case MergeToolBar.COMPACT: + toolbar.add( "0, 0", diff ); + toolbar.add( "1, 0", unsplit ); + toolbar.add( "0, 1", next ); + toolbar.add( "1, 1", prev ); + toolbar.add( "0, 2", move_right ); + toolbar.add( "1, 2", move_left ); + toolbar.add( "0, 3", swap ); + toolbar.add( "1, 3", refresh ); + break; + default: + toolbar.add( "0, 0", diff ); + toolbar.add( "1, 0", unsplit ); + toolbar.add( "2, 0", next ); + toolbar.add( "3, 0", move_right ); + toolbar.add( "4, 0", move_left ); + toolbar.add( "5, 0", prev ); + toolbar.add( "6, 0", swap ); + toolbar.add( "7, 0", refresh ); + break; + } + toolbar.repaint(); } /** * Install any action listeners, mouse listeners, etc. */ public void installListeners() { - //EditBus.addToBus( this ); toolbar.addChangeListener( this ); move_left.addActionListener( Modified: plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java 2008-02-16 00:04:53 UTC (rev 11806) +++ plugins/JDiffPlugin/trunk/jdiff/options/JDiffOptionPane.java 2008-02-16 04:58:55 UTC (rev 11807) @@ -98,6 +98,17 @@ public void _save() { + if ( vertical.isSelected() ) { + jEdit.setIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.VERTICAL); + } + else if ( compact.isSelected() ) { + jEdit.setIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.COMPACT); + } + else{ + jEdit.setIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL); + + } + jEdit.setBooleanProperty("jdiff.ignore-case", ignoreCase.isSelected() ); @@ -117,18 +128,8 @@ showLineDiff.isSelected() ); - if ( vertical.isSelected() ) { - jEdit.setIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.VERTICAL); - } - else if ( compact.isSelected() ) { - jEdit.setIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.COMPACT); - } - else{ - jEdit.setIntegerProperty("jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL); - } - // virtual overview has been removed, it hasn't worked since jEdit 4.2, // so make sure the property is false jEdit.setBooleanProperty("jdiff.global-virtual-overview", false); Modified: plugins/JDiffPlugin/trunk/jdiff/util/Diff.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/Diff.java 2008-02-16 00:04:53 UTC (rev 11806) +++ plugins/JDiffPlugin/trunk/jdiff/util/Diff.java 2008-02-16 04:58:55 UTC (rev 11807) @@ -1,6 +1,6 @@ package jdiff.util; -import java.util.Hashtable; +import java.util.HashMap; /** A class to compare vectors of objects. The result of comparison is a list of <code>change</code> objects which form an @@ -38,824 +38,799 @@ */ -public class Diff -{ +public class Diff { - /** Prepare to find differences between two arrays. Each element of - the arrays is translated to an "equivalence number" based on - the result of <code>equals</code>. The original Object arrays - are no longer needed for computing the differences. They will - be needed again later to print the results of the comparison as - an edit script, if desired. - */ - public Diff(Object[] a,Object[] b) - { - Hashtable h = new Hashtable(a.length + b.length); - filevec[0] = new file_data(a,h); - filevec[1] = new file_data(b,h); - } + /** Prepare to find differences between two arrays. Each element of + the arrays is translated to an "equivalence number" based on + the result of <code>equals</code>. The original Object arrays + are no longer needed for computing the differences. They will + be needed again later to print the results of the comparison as + an edit script, if desired. + */ + public Diff( Object[] a, Object[] b ) { + HashMap<Object, Integer> h = new HashMap<Object, Integer>( a.length + b.length ); + filevec[ 0 ] = new FileData( a, h ); + filevec[ 1 ] = new FileData( b, h ); + } - /** 1 more than the maximum equivalence value used for this or its - sibling file. */ - private int equiv_max = 1; + /** 1 more than the maximum equivalence value used for this or its + sibling file. */ + private int equiv_max = 1; - /** When set to true, the comparison uses a heuristic to speed it up. - With this heuristic, for files with a constant small density - of changes, the algorithm is linear in the file size. */ - public boolean heuristic = false; + /** When set to true, the comparison uses a heuristic to speed it up. + With this heuristic, for files with a constant small density + of changes, the algorithm is linear in the file size. */ + public boolean heuristic = false; - /** When set to true, the algorithm returns a guarranteed minimal - set of changes. This makes things slower, sometimes much slower. */ - public boolean no_discards = false; + /** When set to true, the algorithm returns a guaranteed minimal + set of changes. This makes things slower, sometimes much slower. */ + public boolean no_discards = false; - private int[] xvec, yvec; /* Vectors being compared. */ - private int[] fdiag; /* Vector, indexed by diagonal, containing - the X coordinate of the point furthest - along the given diagonal in the forward - search of the edit matrix. */ - private int[] bdiag; /* Vector, indexed by diagonal, containing - the X coordinate of the point furthest - along the given diagonal in the backward - search of the edit matrix. */ - private int fdiagoff, bdiagoff; - private final file_data[] filevec = new file_data[2]; - private int cost; + private int[] xvec, yvec; /* Vectors being compared. */ + private int[] fdiag; /* Vector, indexed by diagonal, containing + the X coordinate of the point furthest + along the given diagonal in the forward + search of the edit matrix. */ + private int[] bdiag; /* Vector, indexed by diagonal, containing + the X coordinate of the point furthest + along the given diagonal in the backward + search of the edit matrix. */ + private int fdiagoff, bdiagoff; + private final FileData[] filevec = new FileData[ 2 ]; + private int cost; - /** Find the midpoint of the shortest edit script for a specified - portion of the two files. + /** Find the midpoint of the shortest edit script for a specified + portion of the two files. - We scan from the beginnings of the files, and simultaneously from the ends, - doing a breadth-first search through the space of edit-sequence. - When the two searches meet, we have found the midpoint of the shortest - edit sequence. + We scan from the beginnings of the files, and simultaneously from the ends, + doing a breadth-first search through the space of edit-sequence. + When the two searches meet, we have found the midpoint of the shortest + edit sequence. - The value returned is the number of the diagonal on which the midpoint lies. - The diagonal number equals the number of inserted lines minus the number - of deleted lines (counting only lines before the midpoint). - The edit cost is stored into COST; this is the total number of - lines inserted or deleted (counting only lines before the midpoint). + The value returned is the number of the diagonal on which the midpoint lies. + The diagonal number equals the number of inserted lines minus the number + of deleted lines (counting only lines before the midpoint). + The edit cost is stored into COST; this is the total number of + lines inserted or deleted (counting only lines before the midpoint). - This function assumes that the first lines of the specified portions - of the two files do not match, and likewise that the last lines do not - match. The caller must trim matching lines from the beginning and end - of the portions it is going to specify. + This function assumes that the first lines of the specified portions + of the two files do not match, and likewise that the last lines do not + match. The caller must trim matching lines from the beginning and end + of the portions it is going to specify. - Note that if we return the "wrong" diagonal value, or if - the value of bdiag at that diagonal is "wrong", - the worst this can do is cause suboptimal diff output. - It cannot cause incorrect diff output. */ + Note that if we return the "wrong" diagonal value, or if + the value of bdiag at that diagonal is "wrong", + the worst this can do is cause suboptimal diff output. + It cannot cause incorrect diff output. */ - private int diag (int xoff, int xlim, int yoff, int ylim) - { - final int[] fd = fdiag; // Give the compiler a chance. - final int[] bd = bdiag; // Additional help for the compiler. - final int[] xv = xvec; // Still more help for the compiler. - final int[] yv = yvec; // And more and more . . . - final int dmin = xoff - ylim; // Minimum valid diagonal. - final int dmax = xlim - yoff; // Maximum valid diagonal. - final int fmid = xoff - yoff; // Center diagonal of top-down search. - final int bmid = xlim - ylim; // Center diagonal of bottom-up search. - int fmin = fmid, fmax = fmid; // Limits of top-down search. - int bmin = bmid, bmax = bmid; // Limits of bottom-up search. - /* True if southeast corner is on an odd - diagonal with respect to the northwest. */ - final boolean odd = (fmid - bmid & 1) != 0; + private int diag ( int xoff, int xlim, int yoff, int ylim ) { + final int[] fd = fdiag; // Give the compiler a chance. + final int[] bd = bdiag; // Additional help for the compiler. + final int[] xv = xvec; // Still more help for the compiler. + final int[] yv = yvec; // And more and more . . . + final int dmin = xoff - ylim; // Minimum valid diagonal. + final int dmax = xlim - yoff; // Maximum valid diagonal. + final int fmid = xoff - yoff; // Center diagonal of top-down search. + final int bmid = xlim - ylim; // Center diagonal of bottom-up search. + int fmin = fmid, fmax = fmid; // Limits of top-down search. + int bmin = bmid, bmax = bmid; // Limits of bottom-up search. - fd[fdiagoff + fmid] = xoff; - bd[bdiagoff + bmid] = xlim; + // True if southeast corner is on an odd diagonal with respect to the northwest. + final boolean odd = ( fmid - bmid & 1 ) != 0; - for (int c = 1;; ++c) - { - int d; /* Active diagonal. */ - boolean big_snake = false; + fd[ fdiagoff + fmid ] = xoff; + bd[ bdiagoff + bmid ] = xlim; - /* Extend the top-down search by an edit step in each diagonal. */ - if (fmin > dmin) - fd[fdiagoff + --fmin - 1] = -1; - else - ++fmin; - if (fmax < dmax) - fd[fdiagoff + ++fmax + 1] = -1; - else - --fmax; - for (d = fmax; d >= fmin; d -= 2) - { - int x, y, oldx, tlo = fd[fdiagoff + d - 1], thi = fd[fdiagoff + d + 1]; + for ( int c = 1;; ++c ) { + int d; /* Active diagonal. */ + boolean big_snake = false; - if (tlo >= thi) - x = tlo + 1; + /* Extend the top-down search by an edit step in each diagonal. */ + if ( fmin > dmin ) + fd[ fdiagoff + --fmin - 1 ] = -1; else - x = thi; - oldx = x; - y = x - d; - while (x < xlim && y < ylim && xv[x] == yv[y]) { - ++x; ++y; + ++fmin; + if ( fmax < dmax ) + fd[ fdiagoff + ++fmax + 1 ] = -1; + else + --fmax; + for ( d = fmax; d >= fmin; d -= 2 ) { + int x, y, oldx, tlo = fd[ fdiagoff + d - 1 ], thi = fd[ fdiagoff + d + 1 ]; + + if ( tlo >= thi ) + x = tlo + 1; + else + x = thi; + oldx = x; + y = x - d; + while ( x < xlim && y < ylim && xv[ x ] == yv[ y ] ) { + ++x; + ++y; + } + if ( x - oldx > 20 ) + big_snake = true; + fd[ fdiagoff + d ] = x; + if ( odd && bmin <= d && d <= bmax && bd[ bdiagoff + d ] <= fd[ fdiagoff + d ] ) { + cost = 2 * c - 1; + return d; + } } - if (x - oldx > 20) - big_snake = true; - fd[fdiagoff + d] = x; - if (odd && bmin <= d && d <= bmax && bd[bdiagoff + d] <= fd[fdiagoff + d]) - { - cost = 2 * c - 1; - return d; - } - } - /* Similar extend the bottom-up search. */ - if (bmin > dmin) - bd[bdiagoff + --bmin - 1] = Integer.MAX_VALUE; - else - ++bmin; - if (bmax < dmax) - bd[bdiagoff + ++bmax + 1] = Integer.MAX_VALUE; - else - --bmax; - for (d = bmax; d >= bmin; d -= 2) - { - int x, y, oldx, tlo = bd[bdiagoff + d - 1], thi = bd[bdiagoff + d + 1]; - - if (tlo < thi) - x = tlo; + /* Similar extend the bottom-up search. */ + if ( bmin > dmin ) + bd[ bdiagoff + --bmin - 1 ] = Integer.MAX_VALUE; else - x = thi - 1; - oldx = x; - y = x - d; - while (x > xoff && y > yoff && xv[x - 1] == yv[y - 1]) { - --x; --y; + ++bmin; + if ( bmax < dmax ) + bd[ bdiagoff + ++bmax + 1 ] = Integer.MAX_VALUE; + else + --bmax; + for ( d = bmax; d >= bmin; d -= 2 ) { + int x, y, oldx, tlo = bd[ bdiagoff + d - 1 ], thi = bd[ bdiagoff + d + 1 ]; + + if ( tlo < thi ) + x = tlo; + else + x = thi - 1; + oldx = x; + y = x - d; + while ( x > xoff && y > yoff && xv[ x - 1 ] == yv[ y - 1 ] ) { + --x; + --y; + } + if ( oldx - x > 20 ) + big_snake = true; + bd[ bdiagoff + d ] = x; + if ( !odd && fmin <= d && d <= fmax && bd[ bdiagoff + d ] <= fd[ fdiagoff + d ] ) { + cost = 2 * c; + return d; + } } - if (oldx - x > 20) - big_snake = true; - bd[bdiagoff + d] = x; - if (!odd && fmin <= d && d <= fmax && bd[bdiagoff + d] <= fd[fdiagoff + d]) - { - cost = 2 * c; - return d; - } - } - /* Heuristic: check occasionally for a diagonal that has made - lots of progress compared with the edit distance. - If we have any such, find the one that has made the most - progress and return it as if it had succeeded. + /* Heuristic: check occasionally for a diagonal that has made + lots of progress compared with the edit distance. + If we have any such, find the one that has made the most + progress and return it as if it had succeeded. - With this heuristic, for files with a constant small density - of changes, the algorithm is linear in the file size. */ + With this heuristic, for files with a constant small density + of changes, the algorithm is linear in the file size. */ - if (c > 200 && big_snake && heuristic) - { - int best = 0; - int bestpos = -1; + if ( c > 200 && big_snake && heuristic ) { + int best = 0; + int bestpos = -1; - for (d = fmax; d >= fmin; d -= 2) - { - int dd = d - fmid; - if ((fd[fdiagoff + d] - xoff)*2 - dd > 12 * (c + (dd > 0 ? dd : -dd))) - { - if (fd[fdiagoff + d] * 2 - dd > best - && fd[fdiagoff + d] - xoff > 20 - && fd[fdiagoff + d] - d - yoff > 20) - { - int k; - int x = fd[fdiagoff + d]; + for ( d = fmax; d >= fmin; d -= 2 ) { + int dd = d - fmid; + if ( ( fd[ fdiagoff + d ] - xoff ) * 2 - dd > 12 * ( c + ( dd > 0 ? dd : -dd ) ) ) { + if ( fd[ fdiagoff + d ] * 2 - dd > best + && fd[ fdiagoff + d ] - xoff > 20 + && fd[ fdiagoff + d ] - d - yoff > 20 ) { + int k; + int x = fd[ fdiagoff + d ]; - /* We have a good enough best diagonal; - now insist that it end with a significant snake. */ - for (k = 1; k <= 20; k++) - if (xvec[x - k] != yvec[x - d - k]) - break; + /* We have a good enough best diagonal; + now insist that it end with a significant snake. */ + for ( k = 1; k <= 20; k++ ) + if ( xvec[ x - k ] != yvec[ x - d - k ] ) + break; - if (k == 21) - { - best = fd[fdiagoff + d] * 2 - dd; - bestpos = d; - } - } - } - } - if (best > 0) - { - cost = 2 * c - 1; - return bestpos; - } + if ( k == 21 ) { + best = fd[ fdiagoff + d ] * 2 - dd; + bestpos = d; + } + } + } + } + if ( best > 0 ) { + cost = 2 * c - 1; + return bestpos; + } - best = 0; - for (d = bmax; d >= bmin; d -= 2) - { - int dd = d - bmid; - if ((xlim - bd[bdiagoff + d])*2 + dd > 12 * (c + (dd > 0 ? dd : -dd))) - { - if ((xlim - bd[bdiagoff + d]) * 2 + dd > best - && xlim - bd[bdiagoff + d] > 20 - && ylim - (bd[bdiagoff + d] - d) > 20) - { - /* We have a good enough best diagonal; - now insist that it end with a significant snake. */ - int k; - int x = bd[bdiagoff + d]; + best = 0; + for ( d = bmax; d >= bmin; d -= 2 ) { + int dd = d - bmid; + if ( ( xlim - bd[ bdiagoff + d ] ) * 2 + dd > 12 * ( c + ( dd > 0 ? dd : -dd ) ) ) { + if ( ( xlim - bd[ bdiagoff + d ] ) * 2 + dd > best + && xlim - bd[ bdiagoff + d ] > 20 + && ylim - ( bd[ bdiagoff + d ] - d ) > 20 ) { + /* We have a good enough best diagonal; + now insist that it end with a significant snake. */ + int k; + int x = bd[ bdiagoff + d ]; - for (k = 0; k < 20; k++) - if (xvec[x + k] != yvec[x - d + k]) - break; - if (k == 20) - { - best = (xlim - bd[bdiagoff + d]) * 2 + dd; - bestpos = d; - } - } - } - } - if (best > 0) - { - cost = 2 * c - 1; - return bestpos; - } - } - } - } - - /** Compare in detail contiguous subsequences of the two files - which are known, as a whole, to match each other. - - The results are recorded in the vectors filevec[N].changed_flag, by - storing a 1 in the element for each line that is an insertion or deletion. - - The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1. - - Note that XLIM, YLIM are exclusive bounds. - All line numbers are origin-0 and discarded lines are not counted. */ - - private void compareseq (int xoff, int xlim, int yoff, int ylim) { - /* Slide down the bottom initial diagonal. */ - while (xoff < xlim && yoff < ylim && xvec[xoff] == yvec[yoff]) { - ++xoff; ++yoff; + for ( k = 0; k < 20; k++ ) + if ( xvec[ x + k ] != yvec[ x - d + k ] ) + break; + if ( k == 20 ) { + best = ( xlim - bd[ bdiagoff + d ] ) * 2 + dd; + bestpos = d; + } + } + } + } + if ( best > 0 ) { + cost = 2 * c - 1; + return bestpos; + } + } + } } - /* Slide up the top initial diagonal. */ - while (xlim > xoff && ylim > yoff && xvec[xlim - 1] == yvec[ylim - 1]) { - --xlim; --ylim; - } - /* Handle simple cases. */ - if (xoff == xlim) - while (yoff < ylim) - filevec[1].changed_flag[1+filevec[1].realindexes[yoff++]] = true; - else if (yoff == ylim) - while (xoff < xlim) - filevec[0].changed_flag[1+filevec[0].realindexes[xoff++]] = true; - else - { - /* Find a point of correspondence in the middle of the files. */ + /** Compare in detail contiguous subsequences of the two files + which are known, as a whole, to match each other. - int d = diag (xoff, xlim, yoff, ylim); - int c = cost; - int f = fdiag[fdiagoff + d]; - int b = bdiag[bdiagoff + d]; + The results are recorded in the vectors filevec[N].changed_flag, by + storing a 1 in the element for each line that is an insertion or deletion. - if (c == 1) - { - /* This should be impossible, because it implies that - one of the two subsequences is empty, - and that case was handled above without calling `diag'. - Let's verify that this is true. */ - throw new IllegalArgumentException("Empty subsequence"); - } - else - { - /* Use that point to split this problem into two subproblems. */ - compareseq (xoff, b, yoff, b - d); - /* This used to use f instead of b, - but that is incorrect! - It is not necessarily the case that diagonal d - has a snake from b to f. */ - compareseq (b, xlim, b - d, ylim); - } - } - } + The subsequence of file 0 is [XOFF, XLIM) and likewise for file 1. - /** Discard lines from one file that have no matches in the other file. - */ + Note that XLIM, YLIM are exclusive bounds. + All line numbers are origin-0 and discarded lines are not counted. */ - private void discard_confusing_lines() { - filevec[0].discard_confusing_lines(filevec[1]); - filevec[1].discard_confusing_lines(filevec[0]); - } + private void compareseq ( int xoff, int xlim, int yoff, int ylim ) { + /* Slide down the bottom initial diagonal. */ + while ( xoff < xlim && yoff < ylim && xvec[ xoff ] == yvec[ yoff ] ) { + ++xoff; + ++yoff; + } + /* Slide up the top initial diagonal. */ + while ( xlim > xoff && ylim > yoff && xvec[ xlim - 1 ] == yvec[ ylim - 1 ] ) { + --xlim; + --ylim; + } - private boolean inhibit = false; + /* Handle simple cases. */ + if ( xoff == xlim ) + while ( yoff < ylim ) + filevec[ 1 ].changed_flag[ 1 + filevec[ 1 ].realindexes[ yoff++ ] ] = true; + else if ( yoff == ylim ) + while ( xoff < xlim ) + filevec[ 0 ].changed_flag[ 1 + filevec[ 0 ].realindexes[ xoff++ ] ] = true; + else { + /* Find a point of correspondence in the middle of the files. */ - /** Adjust inserts/deletes of blank lines to join changes - as much as possible. - */ + int d = diag ( xoff, xlim, yoff, ylim ); + int c = cost; + int f = fdiag[ fdiagoff + d ]; + int b = bdiag[ bdiagoff + d ]; - private void shift_boundaries() { - if (inhibit) - return; - filevec[0].shift_boundaries(filevec[1]); - filevec[1].shift_boundaries(filevec[0]); - } + if ( c == 1 ) { + /* This should be impossible, because it implies that + one of the two subsequences is empty, + and that case was handled above without calling `diag'. + Let's verify that this is true. */ + throw new IllegalArgumentException( "Empty subsequence" ); + } + else { + /* Use that point to split this problem into two subproblems. */ + compareseq ( xoff, b, yoff, b - d ); + /* This used to use f instead of b, + but that is incorrect! + It is not necessarily the case that diagonal d + has a snake from b to f. */ + compareseq ( b, xlim, b - d, ylim ); + } + } + } - /** Scan the tables of which lines are inserted and deleted, - producing an edit script in reverse order. */ + /** Discard lines from one file that have no matches in the other file. + */ - private Change build_reverse_script() { - Change script = null; - final boolean[] changed0 = filevec[0].changed_flag; - final boolean[] changed1 = filevec[1].changed_flag; - final int len0 = filevec[0].buffered_lines; - final int len1 = filevec[1].buffered_lines; + private void discardConfusingLines() { + filevec[ 0 ].discardConfusingLines( filevec[ 1 ] ); + filevec[ 1 ].discardConfusingLines( filevec[ 0 ] ); + } - /* Note that changedN[len0] does exist, and contains 0. */ + private boolean inhibit = false; - int i0 = 0, i1 = 0; + /** Adjust inserts/deletes of blank lines to join changes + as much as possible. + */ - while (i0 < len0 || i1 < len1) - { - if (changed0[1+i0] || changed1[1+i1]) - { - int line0 = i0, line1 = i1; + private void shiftBoundaries() { + if ( inhibit ) + return ; + filevec[ 0 ].shiftBoundaries( filevec[ 1 ] ); + filevec[ 1 ].shiftBoundaries( filevec[ 0 ] ); + } - /* Find # lines changed here in each file. */ - while (changed0[1+i0]) ++i0; - while (changed1[1+i1]) ++i1; + /** Scan the tables of which lines are inserted and deleted, + producing an edit script in reverse order. */ - /* Record this change. */ - script = new Change(line0, line1, i0 - line0, i1 - line1, script); - } + private Change buildReverseScript() { + Change script = null; + final boolean[] changed0 = filevec[ 0 ].changed_flag; + final boolean[] changed1 = filevec[ 1 ].changed_flag; + final int len0 = filevec[ 0 ].buffered_lines; + final int len1 = filevec[ 1 ].buffered_lines; - /* We have reached lines in the two files that match each other. */ - i0++; i1++; - } + /* Note that changedN[len0] does exist, and contains 0. */ - return script; - } + int i0 = 0, i1 = 0; - /** Scan the tables of which lines are inserted and deleted, - producing an edit script in forward order. */ + while ( i0 < len0 || i1 < len1 ) { + if ( changed0[ 1 + i0 ] || changed1[ 1 + i1 ] ) { + int line0 = i0, line1 = i1; - private Change build_script() { - Change script = null; - final boolean[] changed0 = filevec[0].changed_flag; - final boolean[] changed1 = filevec[1].changed_flag; - final int len0 = filevec[0].buffered_lines; - final int len1 = filevec[1].buffered_lines; - int i0 = len0, i1 = len1; + /* Find # lines changed here in each file. */ + while ( changed0[ 1 + i0 ] ) + ++i0; + while ( changed1[ 1 + i1 ] ) + ++i1; - /* Note that changedN[-1] does exist, and contains 0. */ + /* Record this change. */ + script = new Change( line0, line1, i0 - line0, i1 - line1, script ); + } - while (i0 >= 0 || i1 >= 0) - { - if (changed0[i0] || changed1[i1]) - { - int line0 = i0, line1 = i1; + /* We have reached lines in the two files that match each other. */ + i0++; + i1++; + } - /* Find # lines changed here in each file. */ - while (changed0[i0]) --i0; - while (changed1[i1]) --i1; + return script; + } - /* Record this change. */ - script = new Change(i0, i1, line0 - i0, line1 - i1, script); - } + /** Scan the tables of which lines are inserted and deleted, + producing an edit script in forward order. */ - /* We have reached lines in the two files that match each other. */ - i0--; i1--; - } + private Change buildScript() { + Change script = null; + final boolean[] changed0 = filevec[ 0 ].changed_flag; + final boolean[] changed1 = filevec[ 1 ].changed_flag; + final int len0 = filevec[ 0 ].buffered_lines; + final int len1 = filevec[ 1 ].buffered_lines; + int i0 = len0, i1 = len1; - return script; - } + /* Note that changedN[-1] does exist, and contains 0. */ - /* Report the differences of two files. DEPTH is the current directory - depth. */ - public Change diff_2(final boolean reverse) { + while ( i0 >= 0 || i1 >= 0 ) { + if ( changed0[ i0 ] || changed1[ i1 ] ) { + int line0 = i0, line1 = i1; - /* Some lines are obviously insertions or deletions - because they don't match anything. Detect them now, - and avoid even thinking about them in the main comparison algorithm. */ + /* Find # lines changed here in each file. */ + while ( changed0[ i0 ] ) + --i0; + while ( changed1[ i1 ] ) + --i1; - discard_confusing_lines(); + /* Record this change. */ + script = new Change( i0, i1, line0 - i0, line1 - i1, script ); + } - /* Now do the main comparison algorithm, considering just the - undiscarded lines. */ + /* We have reached lines in the two files that match each other. */ + i0--; + i1--; + } - xvec = filevec[0].undiscarded; - yvec = filevec[1].undiscarded; + return script; + } - int diags = - filevec[0].nondiscarded_lines + filevec[1].nondiscarded_lines + 3; - fdiag = new int[diags]; - fdiagoff = filevec[1].nondiscarded_lines + 1; - bdiag = new int[diags]; - bdiagoff = filevec[1].nondiscarded_lines + 1; + /* Report the differences of two files. DEPTH is the current directory + depth. */ + public Change diff_2( final boolean reverse ) { - compareseq (0, filevec[0].nondiscarded_lines, - 0, filevec[1].nondiscarded_lines); - fdiag = null; - bdiag = null; + /* Some lines are obviously insertions or deletions + because they don't match anything. Detect them now, + and avoid even thinking about them in the main comparison algorithm. */ - /* Modify the results slightly to make them prettier - in cases where that can validly be done. */ + discardConfusingLines(); - shift_boundaries (); + /* Now do the main comparison algorithm, considering just the + undiscarded lines. */ - /* Get the results of comparison in the form of a chain - of `struct change's -- an edit script. */ + xvec = filevec[ 0 ].undiscarded; + yvec = filevec[ 1 ].undiscarded; - if (reverse) - return build_reverse_script(); - else - return build_script(); - } + int diags = + filevec[ 0 ].nondiscarded_lines + filevec[ 1 ].nondiscarded_lines + 3; + fdiag = new int[ diags ]; + fdiagoff = filevec[ 1 ].nondiscarded_lines + 1; + bdiag = new int[ diags ]; + bdiagoff = filevec[ 1 ].nondiscarded_lines + 1; - /** The result of comparison is an "edit script": a chain of change objects. - Each change represents one place where some lines are deleted - and some are inserted. + compareseq ( 0, filevec[ 0 ].nondiscarded_lines, + 0, filevec[ 1 ].nondiscarded_lines ); + fdiag = null; + bdiag = null; - LINE0 and LINE1 are the first affected lines in the two files (origin 0). - DELETED is the number of lines deleted here from file 0. - INSERTED is the number of lines inserted here in file 1. + /* Modify the results slightly to make them prettier + in cases where that can validly be done. */ - If DELETED is 0 then LINE0 is the number of the line before - which the insertion was done; vice versa for INSERTED and LINE1. */ + shiftBoundaries (); - public static class Change { - /** Previous or next edit command. */ - public Change link; + /* Get the results of comparison in the form of a chain + of `struct change's -- an edit script. */ - /** # lines of file 1 changed here. */ - public final int inserted; + if ( reverse ) + return buildReverseScript(); + else + return buildScript(); + } - /** # lines of file 0 changed here. */ - public final int deleted; + /** The result of comparison is an "edit script": a chain of change objects. + Each change represents one place where some lines are deleted + and some are inserted. - /** Line number of 1st deleted line. */ - public final int line0; - - /** Line number of 1st inserted line. */ - public final int line1; - - /** Cons an additional entry onto the front of an edit script OLD. LINE0 and LINE1 are the first affected lines in the two files (origin 0). DELETED is the number of lines deleted here from file 0. INSERTED is the number of lines inserted here in file 1. If DELETED is 0 then LINE0 is the number of the line before which the insertion was done; vice versa for INSERTED and LINE1. */ - Change(int line0, int line1, int deleted, int inserted, Change old) { - this.line0 = line0; - this.line1 = line1; - this.inserted = inserted; - this.deleted = deleted; - this.link = old; - //System.err.println(line0+","+line1+","+inserted+","+deleted); - } - public String toString() { - StringBuffer sb = new StringBuffer(); - sb.append("Change["); - sb.append("line0=").append(line0).append(",deleted=").append(deleted); - sb.append(",line1=").append(line1).append(",inserted=").append(inserted); - sb.append("]"); - return sb.toString(); - } - } + public static class Change { + /** Previous or next edit command. */ + public Change link; - /** Data on one input file being compared. - */ + /** # lines of file 1 changed here. */ + public final int inserted; - class file_data { + /** # lines of file 0 changed here. */ + public final int deleted; - /** Allocate changed array for the results of comparison. */ - void clear() { - /* Alloc... [truncated message content] |
From: <dal...@us...> - 2008-02-20 20:26:51
|
Revision: 11821 http://jedit.svn.sourceforge.net/jedit/?rev=11821&view=rev Author: daleanson Date: 2008-02-20 12:26:48 -0800 (Wed, 20 Feb 2008) Log Message: ----------- bug fixes, refactoring, optimization. Modified Paths: -------------- plugins/JDiffPlugin/trunk/JDiffPlugin.props plugins/JDiffPlugin/trunk/jdiff/DualDiff.java plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java plugins/JDiffPlugin/trunk/jdiff/component/DiffLocalOverview.java plugins/JDiffPlugin/trunk/jdiff/component/DiffOverview.java plugins/JDiffPlugin/trunk/jdiff/component/DiffTextAreaModel.java plugins/JDiffPlugin/trunk/jdiff/component/LineRendererPane.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLocalOverviewUI.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLocalOverviewUI.java plugins/JDiffPlugin/trunk/jdiff/util/Diff.java Modified: plugins/JDiffPlugin/trunk/JDiffPlugin.props =================================================================== --- plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-19 18:55:43 UTC (rev 11820) +++ plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-02-20 20:26:48 UTC (rev 11821) @@ -34,6 +34,10 @@ jdiff.overview \ jdiff.highlight +# titles for DockableWindowManager +jdiff-lines.title=Diff +jdiff-lines.label=Diff + jdiff-menu.label=JDiff toggle-dual-diff.label=Dual diff Modified: plugins/JDiffPlugin/trunk/jdiff/DualDiff.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-02-19 18:55:43 UTC (rev 11820) +++ plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-02-20 20:26:48 UTC (rev 11821) @@ -35,8 +35,6 @@ import java.util.HashMap; import javax.swing.*; -import javax.swing.event.CaretEvent; -import javax.swing.event.CaretListener; import jdiff.component.DiffLocalOverview; import jdiff.component.DiffGlobalPhysicalOverview; @@ -276,8 +274,6 @@ this.addHandlers(); diffLineOverview.clear(); - EditPane editPane = view.getEditPane(); - final int caret = editPane.getTextArea().getCaretPosition(); this.diffOverview0.synchroScrollRight(); this.diffOverview1.repaint(); } @@ -792,9 +788,11 @@ // move the caret to the start of the first line of the diff int caret_position = textArea0.getLineStartOffset( line ); - this.textArea0.setCaretPosition( caret_position ); + this.textArea0.setCaretPosition( caret_position, false ); + this.textArea0.scrollToCaret(false); caret_position = textArea1.getLineStartOffset( hunk.line1 ); - this.textArea1.setCaretPosition( caret_position ); + this.textArea1.setCaretPosition( caret_position, false ); + this.textArea1.scrollToCaret(false); if ( this.textArea0.getFirstLine() != line ) { this.textArea0.getToolkit().beep(); @@ -822,9 +820,11 @@ // move the caret to the start of the first line of the diff int caret_position = textArea1.getLineStartOffset( line ); - this.textArea1.setCaretPosition( caret_position ); + this.textArea1.setCaretPosition( caret_position, false ); + this.textArea1.scrollToCaret(false); caret_position = textArea0.getLineStartOffset( hunk.line0 ); - this.textArea0.setCaretPosition( caret_position ); + this.textArea0.setCaretPosition( caret_position, false ); + this.textArea0.scrollToCaret(false); if ( this.textArea1.getFirstLine() != line ) { this.textArea1.getToolkit().beep(); @@ -853,9 +853,11 @@ // move the caret to the start of the first line of the diff int caret_position = textArea0.getLineStartOffset( line ); - this.textArea0.setCaretPosition( caret_position ); + this.textArea0.setCaretPosition( caret_position, false ); + this.textArea0.scrollToCaret(false); caret_position = textArea1.getLineStartOffset( hunk.line1 ); - this.textArea1.setCaretPosition( caret_position ); + this.textArea1.setCaretPosition( caret_position, false ); + this.textArea1.scrollToCaret(false); if ( this.textArea0.getFirstLine() != line ) { this.textArea0.getToolkit().beep(); @@ -885,9 +887,11 @@ // move the caret to the start of the first line of the diff int caret_position = textArea1.getLineStartOffset( line ); - this.textArea1.setCaretPosition( caret_position ); + this.textArea1.setCaretPosition( caret_position, false ); + this.textArea1.scrollToCaret(false); caret_position = textArea0.getLineStartOffset( hunk.line0 ); - this.textArea0.setCaretPosition( caret_position ); + this.textArea0.setCaretPosition( caret_position, false ); + this.textArea0.scrollToCaret(false); if ( this.textArea1.getFirstLine() != line ) { this.textArea1.getToolkit().beep(); Modified: plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java 2008-02-19 18:55:43 UTC (rev 11820) +++ plugins/JDiffPlugin/trunk/jdiff/component/DiffLineOverview.java 2008-02-20 20:26:48 UTC (rev 11821) @@ -173,7 +173,6 @@ public void handleMessage( EBMessage message ) { if (message instanceof PropertiesChanged ) { - System.out.println("+++++ handleMessage" ); fireStateChanged(); } } Modified: plugins/JDiffPlugin/trunk/jdiff/component/DiffLocalOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/DiffLocalOverview.java 2008-02-19 18:55:43 UTC (rev 11820) +++ plugins/JDiffPlugin/trunk/jdiff/component/DiffLocalOverview.java 2008-02-20 20:26:48 UTC (rev 11821) @@ -19,14 +19,21 @@ package jdiff.component; +import java.util.*; + import javax.swing.*; -import javax.swing.plaf.ComponentUI; +import javax.swing.event.CaretEvent; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + import jdiff.component.ui.*; - import jdiff.DualDiff; +import org.gjt.sp.jedit.textarea.JEditTextArea; + public class DiffLocalOverview extends DiffOverview { private static final String uiClassID = "DiffLocalOverviewUI"; + private Set<ChangeListener> changeListeners = new HashSet<ChangeListener>(); public DiffLocalOverview(DualDiff dualDiff) { super(dualDiff); @@ -53,4 +60,39 @@ public String getUIClassID() { return uiClassID; } + + public void caretUpdate( final CaretEvent e ) { + if ( e.getSource() instanceof JEditTextArea ) { + fireStateChanged(); + } + } + + public void addChangeListener( ChangeListener cl ) { + if ( cl != null ) { + changeListeners.add( cl ); + } + } + + public void removeChangeListener( ChangeListener cl ) { + if ( cl != null ) { + changeListeners.remove( cl ); + } + } + + public void fireStateChanged() { + if ( changeListeners.size() > 0 ) { + ChangeEvent event = new ChangeEvent( this ); + for ( ChangeListener cl : changeListeners ) { + cl.stateChanged( event ); + } + } + } + + public void moveRight( int line_number ) { + getUI().moveRight( line_number ); + } + + public void moveLeft( int line_number ) { + getUI().moveLeft( line_number ); + } } Modified: plugins/JDiffPlugin/trunk/jdiff/component/DiffOverview.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/DiffOverview.java 2008-02-19 18:55:43 UTC (rev 11820) +++ plugins/JDiffPlugin/trunk/jdiff/component/DiffOverview.java 2008-02-20 20:26:48 UTC (rev 11821) @@ -22,12 +22,15 @@ package jdiff.component; -import java.awt.Dimension; import javax.swing.JComponent; +import javax.swing.SwingUtilities; + import jdiff.DualDiff; import jdiff.util.Diff; + +import org.gjt.sp.jedit.EditPane; +import org.gjt.sp.jedit.View; import org.gjt.sp.jedit.textarea.JEditTextArea; -import org.gjt.sp.util.Log; public abstract class DiffOverview extends JComponent { protected DualDiff dualDiff; @@ -155,9 +158,17 @@ } } - public void moveRight( int line_number ) { - } + /** + * Default implementation does nothing, this is for subclasses to override. + */ + public void moveRight( int line_number ) {} - public void moveLeft( int line_number ) { - } + /** + * Default implementation does nothing, this is for subclasses to override. + */ + public void moveLeft( int line_number ) {} + + /** + */ + } Modified: plugins/JDiffPlugin/trunk/jdiff/component/DiffTextAreaModel.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/DiffTextAreaModel.java 2008-02-19 18:55:43 UTC (rev 11820) +++ plugins/JDiffPlugin/trunk/jdiff/component/DiffTextAreaModel.java 2008-02-20 20:26:48 UTC (rev 11821) @@ -34,6 +34,8 @@ private DualDiff dualDiff; private Diff.Change edits = null; + private HashMap<Integer, Diff.Change> leftHunkMap = null; + private HashMap<Integer, Diff.Change> rightHunkMap = null; private int leftLineCount; private int rightLineCount; @@ -65,6 +67,14 @@ return rightTextArea; } + public HashMap<Integer, Diff.Change> getLeftHunkMap() { + return leftHunkMap; + } + + public HashMap<Integer, Diff.Change> getRightHunkMap() { + return rightHunkMap; + } + private void prepData() { EditPane[] editPanes = dualDiff.getView().getEditPanes(); Buffer buf0 = editPanes[0].getBuffer(); @@ -83,6 +93,30 @@ Diff d = new Diff( fileLines0, fileLines1 ); edits = d.diff_2( false ); + leftHunkMap = new HashMap<Integer, Diff.Change>(); + rightHunkMap = new HashMap<Integer, Diff.Change>(); + Diff.Change hunk = edits; + for ( ; hunk != null; hunk = hunk.link ) { + for (int i = 0; i < hunk.deleted; i++) { + leftHunkMap.put(hunk.line0 + i, hunk); + } + for (int i = 0; i < hunk.inserted; i++) { + rightHunkMap.put(hunk.line1 + i, hunk); + } + } + /* + System.out.println("++++++++++++++++++++++++++++++++++"); + Set<Map.Entry<Integer, Diff.Change>> entries = leftHunkMap.entrySet(); + for (Map.Entry<Integer, Diff.Change> entry : entries) { + System.out.println(entry.getKey() + " = " + entry.getValue()); + } + System.out.println("++++++++++++++++++++++++++++++++++"); + entries = rightHunkMap.entrySet(); + for (Map.Entry<Integer, Diff.Change> entry : entries) { + System.out.println(entry.getKey() + " = " + entry.getValue()); + } + System.out.println("++++++++++++++++++++++++++++++++++"); + */ leftLineCount = fileLines0.length; rightLineCount = fileLines1.length; Modified: plugins/JDiffPlugin/trunk/jdiff/component/LineRendererPane.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/LineRendererPane.java 2008-02-19 18:55:43 UTC (rev 11820) +++ plugins/JDiffPlugin/trunk/jdiff/component/LineRendererPane.java 2008-02-20 20:26:48 UTC (rev 11821) @@ -214,7 +214,6 @@ int caretLine = textArea0.getCaretLine(); for ( ; hunk != null; hunk = hunk.link ) { if ( caretLine >= hunk.line0 && caretLine < hunk.line0 + hunk.deleted ) { - System.out.println("+++++ 1 caretLine: " + caretLine + ", hunk.line0: " + hunk.line0 + ", hunk.deleted: " + hunk.deleted); // in a hunk if ( hunk.deleted == 0 && hunk.line0 > 0 ) { leftLine = ""; @@ -237,7 +236,6 @@ int caretLine = textArea1.getCaretLine(); for ( ; hunk != null; hunk = hunk.link ) { if ( caretLine >= hunk.line1 && caretLine < hunk.line1 + hunk.inserted ) { - System.out.println("+++++ 2 caretLine: " + caretLine + ", hunk.line1: " + hunk.line1 + ", hunk.inserted: " + hunk.inserted); // in a hunk if ( hunk.inserted == 0 && hunk.line1 > 0 ) { rightLine = ""; Modified: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLocalOverviewUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLocalOverviewUI.java 2008-02-19 18:55:43 UTC (rev 11820) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLocalOverviewUI.java 2008-02-20 20:26:48 UTC (rev 11821) @@ -21,11 +21,11 @@ import java.awt.*; import java.awt.event.*; +import java.util.HashMap; +import java.util.Set; + import javax.swing.*; -import javax.swing.border.EmptyBorder; -import javax.swing.border.LineBorder; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; +import javax.swing.event.*; import javax.swing.plaf.ComponentUI; import jdiff.DualDiff; @@ -33,10 +33,12 @@ import jdiff.component.*; import jdiff.util.Diff; +import org.gjt.sp.jedit.EditPane; +import org.gjt.sp.jedit.View; import org.gjt.sp.jedit.textarea.JEditTextArea; import org.gjt.sp.jedit.textarea.Selection; -public class BasicDiffLocalOverviewUI extends DiffLocalOverviewUI implements MouseListener { +public class BasicDiffLocalOverviewUI extends DiffLocalOverviewUI implements MouseListener, ChangeListener, CaretListener { private DiffLocalOverview diffLocalOverview; private LocalRendererPane localRendererPane; @@ -81,24 +83,32 @@ public void installListeners() { diffLocalOverview.addMouseListener( this ); + diffLocalOverview.addChangeListener( this ); + diffLocalOverview.getModel().getLeftTextArea().addCaretListener( this ); + diffLocalOverview.getModel().getRightTextArea().addCaretListener( this ); } - public void uninstallDefaults() { - } + public void uninstallDefaults() {} public void uninstallComponents() { - diffLocalOverview.remove(localRendererPane); + diffLocalOverview.remove( localRendererPane ); diffLocalOverview = null; } public void uninstallListeners() { - diffLocalOverview.removeMouseListener(this); + diffLocalOverview.removeMouseListener( this ); + diffLocalOverview.removeChangeListener( this ); + diffLocalOverview.getModel().getLeftTextArea().removeCaretListener( this ); + diffLocalOverview.getModel().getRightTextArea().removeCaretListener( this ); } protected LayoutManager createLayoutManager() { return new BorderLayout(); } + public void stateChanged( ChangeEvent event ) { + localRendererPane.repaint(); + } public class LocalRendererPane extends JPanel { @@ -139,17 +149,17 @@ // for drawing the diffs for the left text area leftRectangle = new Rectangle( - centerRectangle.x, // 4 - centerRectangle.y, // 0 - centerRectangle.width / 3, // (40 - 4 - 4) / 3 = 8 + centerRectangle.x, // 4 + centerRectangle.y, // 0 + centerRectangle.width / 3, // (40 - 4 - 4) / 3 = 8 Math.max( 1, pixelsPerLine * leftVisibleLineCount ) ); // for drawing the diffs for the right text area rightRectangle = new Rectangle( - centerRectangle.x + ( centerRectangle.width - ( centerRectangle.width / 3 ) ), // 4 + (32 - 8) = 28 - centerRectangle.y, // 0 - centerRectangle.width / 3, // 8 + centerRectangle.x + ( centerRectangle.width - ( centerRectangle.width / 3 ) ), // 4 + (32 - 8) = 28 + centerRectangle.y, // 0 + centerRectangle.width / 3, // 8 Math.max( 1, pixelsPerLine * rightVisibleLineCount ) ); @@ -162,6 +172,9 @@ gfx.fillRect( leftRectangle.x, leftRectangle.y, leftRectangle.width, leftRectangle.height ); gfx.fillRect( rightRectangle.x, rightRectangle.y, rightRectangle.width, rightRectangle.height ); + // clear hunk cursors + paintCurrentHunkCursor(gfx, null); + // draw the diff areas in the left and right rectangles, and draw the // connecting line between corresponding diffs in the center rectangle fillLeft( gfx, model ); @@ -176,143 +189,90 @@ } private void fillLeft( Graphics gfx, DiffTextAreaModel model ) { - // fill in the left rectangle to show where left text area has different - // lines than the right text area - Diff.Change hunk = model.getEdits(); - int start_line0 = 0; + int leftFirstLine = model.getLeftTextArea().getFirstPhysicalLine(); + int leftLastLine = model.getLeftTextArea().getLastPhysicalLine(); + HashMap<Integer, Diff.Change> leftHunkMap = model.getLeftHunkMap(); Color color; - - for ( int i0 = 0; i0 < leftVisibleLineCount; i0++ ) { - // for each line in the left text area, get the current line to consider - int physicalLine0 = model.getLeftTextArea().getPhysicalLineOfScreenLine( i0 ); - - if ( physicalLine0 == -1 ) { - continue; - } - - for ( ; hunk != null; hunk = hunk.link ) { // find the hunk pertaining to this line - if ( ( hunk.line0 + Math.max( 0, hunk.deleted - 1 ) ) < physicalLine0 ) { - continue; // before this line - } - - if ( hunk.line0 > physicalLine0 ) { - break; // after this line, signals end of loop - } - - if ( hunk.deleted == 0 ) { - // 0 means no lines of the left text area were deleted, so - // some lines must have been inserted in the right text area - // at this location, or else there wouldn't be a diff. Draw - // a 1 pixel tall line in the left rectangle to match up with - // the inserted block in the right rectangle - color = JDiffPlugin.overviewInvalidColor; - leftRectangle.height = 1; - } - else { - if ( hunk.inserted == 0 ) { - // 0 means no lines were inserted into the right text area - // so there are lines in the left text area that were removed - // from the right text area - color = JDiffPlugin.overviewDeletedColor; + if (leftHunkMap != null) { + for ( int i = leftFirstLine; i <= leftLastLine; i++ ) { + Diff.Change hunk = leftHunkMap.get( i ); + if ( hunk != null ) { + if ( hunk.deleted == 0 ) { + color = JDiffPlugin.overviewInvalidColor; + leftRectangle.height = 1; } else { - // if here then there are lines in both text areas that are - // different from the lines in the other text area. - color = JDiffPlugin.overviewChangedColor; + color = hunk.inserted == 0 ? JDiffPlugin.overviewDeletedColor : JDiffPlugin.overviewChangedColor; + leftRectangle.height = Math.max( 1, pixelsPerLine * hunk.deleted ); } - - // next line is unnecessary, if, here, the height should - // always be pixelsPerLine: - //leftRectangle.height = Math.max( 1, pixelsPerLine ); - leftRectangle.height = pixelsPerLine; + leftRectangle.y = centerRectangle.y + ( ( i - leftFirstLine ) * pixelsPerLine ); + gfx.setColor( color ); + gfx.fillRect( leftRectangle.x, leftRectangle.y, leftRectangle.width, leftRectangle.height ); + i += Math.max(hunk.deleted, 1); } - - leftRectangle.y = centerRectangle.y + ( i0 * pixelsPerLine ); - gfx.setColor( color ); - gfx.fillRect( leftRectangle.x, leftRectangle.y, leftRectangle.width, leftRectangle.height ); - break; } + int caret_line = model.getLeftTextArea().getCaretLine(); + Diff.Change hunk = leftHunkMap.get(caret_line); + if (hunk != null) { + paintCurrentHunkCursor(gfx, hunk); + } } } private void fillRight( Graphics gfx, DiffTextAreaModel model ) { - // fill in the right rectangle to show where right text area has different - // lines than the left text area + int rightFirstLine = model.getRightTextArea().getFirstPhysicalLine(); + int rightLastLine = model.getRightTextArea().getLastPhysicalLine(); + HashMap<Integer, Diff.Change> rightHunkMap = model.getRightHunkMap(); Color color; - Diff.Change hunk = model.getEdits(); - for ( int i1 = 0; ( i1 < rightVisibleLineCount ); i1++ ) { - int physicalLine1 = model.getRightTextArea().getPhysicalLineOfScreenLine( i1 ); - - if ( physicalLine1 == -1 ) { - continue; - } - - for ( ; hunk != null; hunk = hunk.link ) { - if ( ( hunk.line1 + Math.max( 0, hunk.inserted - 1 ) ) < physicalLine1 ) { - continue; - } - - if ( hunk.line1 > physicalLine1 ) { - break; - } - - if ( hunk.inserted == 0 ) { - color = JDiffPlugin.overviewInvalidColor; - rightRectangle.height = 1; - } - else { - if ( hunk.deleted == 0 ) { - color = JDiffPlugin.overviewInsertedColor; + if (rightHunkMap != null) { + for ( int i = rightFirstLine; i <= rightLastLine; i++ ) { + Diff.Change hunk = rightHunkMap.get( i ); + if ( hunk != null ) { + if ( hunk.inserted == 0 ) { + color = JDiffPlugin.overviewInvalidColor; + rightRectangle.height = 1; } else { - color = JDiffPlugin.overviewChangedColor; + color = hunk.deleted == 0 ? JDiffPlugin.overviewDeletedColor : JDiffPlugin.overviewChangedColor; + rightRectangle.height = Math.max( 1, pixelsPerLine * hunk.inserted ); } - - rightRectangle.height = Math.max( 1, pixelsPerLine ); + rightRectangle.y = centerRectangle.y + ( ( i - rightFirstLine ) * pixelsPerLine ); + gfx.setColor( color ); + gfx.fillRect( rightRectangle.x, rightRectangle.y, rightRectangle.width, rightRectangle.height ); + i += Math.max(hunk.inserted, 1); } - - rightRectangle.y = centerRectangle.y + ( i1 * pixelsPerLine ); - gfx.setColor( color ); - gfx.fillRect( rightRectangle.x, rightRectangle.y, rightRectangle.width, rightRectangle.height ); - break; } + int caret_line = model.getRightTextArea().getCaretLine(); + Diff.Change hunk = rightHunkMap.get(caret_line); + if (hunk != null) { + paintCurrentHunkCursor(gfx, hunk); + } } } private void fillCenter( Graphics gfx, DiffTextAreaModel model ) { // draw a line to connect corresponding differences in the left and // right rectangles. Draw a right and left arrow. - Polygon arrow0; - Polygon arrow1; Diff.Change hunk = model.getEdits(); + JEditTextArea textArea0 = model.getLeftTextArea(); + JEditTextArea textArea1 = model.getRightTextArea(); for ( int i0 = 0, i1 = 0; ( hunk != null ) && ( i0 < leftVisibleLineCount ) && ( i1 < rightVisibleLineCount ); ) { - int physicalLine0 = model.getLeftTextArea().getPhysicalLineOfScreenLine( i0 ); - int physicalLine1 = model.getRightTextArea().getPhysicalLineOfScreenLine( i1 ); + int physicalLine0 = textArea0.getPhysicalLineOfScreenLine( i0 ); + int physicalLine1 = textArea1.getPhysicalLineOfScreenLine( i1 ); - if ( physicalLine0 == -1 ) { + if ( physicalLine0 == -1 || physicalLine1 == -1 ) { break; } - if ( physicalLine1 == -1 ) { - break; - } for ( ; hunk != null; hunk = hunk.link ) { - if ( hunk.line0 < physicalLine0 ) { + if ( hunk.line0 < physicalLine0 || hunk.line1 < physicalLine1 ) { continue; } - if ( hunk.line1 < physicalLine1 ) { + if ( ( hunk.line0 + hunk.deleted ) < physicalLine0 || ( hunk.line1 + hunk.inserted ) < physicalLine1 ) { continue; } - if ( ( hunk.line0 + hunk.deleted ) < physicalLine0 ) { - continue; - } - - if ( ( hunk.line1 + hunk.inserted ) < physicalLine1 ) { - continue; - } - if ( hunk.line0 > physicalLine0 ) { i0++; break; @@ -332,15 +292,15 @@ int center = arrow_height / 2 + 1; if ( hunk.inserted == 0 || hunk.deleted > 0 ) { for ( int i = 0; i < 6; i++ ) { - gfx.drawLine(leftRectangle.x + 2 + i, y0 + 1 + i, leftRectangle.x + 2 + i, y0 + i + arrow_height - (2 * i)); + gfx.drawLine( leftRectangle.x + 2 + i, y0 + 1 + i, leftRectangle.x + 2 + i, y0 + i + arrow_height - ( 2 * i ) ); } y0 += center; } // draw the "move it left" arrow if ( hunk.deleted == 0 || hunk.inserted > 0 ) { - for ( int i = 0; i < 6; i++) { - gfx.drawLine(rightRectangle.x + 1 + i, y1 + center - i, rightRectangle.x + 1 + i, y1 + center + i); + for ( int i = 0; i < 6; i++ ) { + gfx.drawLine( rightRectangle.x + 1 + i, y1 + center - i, rightRectangle.x + 1 + i, y1 + center + i ); } y1 += center; } @@ -469,4 +429,105 @@ public void mouseExited( MouseEvent e ) {} public void mousePressed( MouseEvent e ) {} public void mouseReleased( MouseEvent e ) {} + + public void caretUpdate( final CaretEvent e ) { + if ( e.getSource().equals( diffLocalOverview.getModel().getLeftTextArea() ) ) { + paintCurrentHunkCursor( null, inLeftHunk() ); + } + else if ( e.getSource().equals( diffLocalOverview.getModel().getRightTextArea() ) ) { + paintCurrentHunkCursor( null, inRightHunk() ); + } + } + + private Diff.Change inLeftHunk() { + DiffTextAreaModel model = diffLocalOverview.getModel(); + HashMap<Integer, Diff.Change> leftHunkMap = model.getLeftHunkMap(); + if ( leftHunkMap != null ) { + int caret_line = model.getLeftTextArea().getCaretLine(); + if ( leftHunkMap.get( caret_line ) != null && caret_line >= model.getLeftTextArea().getFirstPhysicalLine() && caret_line <= model.getLeftTextArea().getLastPhysicalLine() ) { + return leftHunkMap.get( caret_line ); + } + } + return null; + } + + private Diff.Change inRightHunk() { + DiffTextAreaModel model = diffLocalOverview.getModel(); + HashMap<Integer, Diff.Change> rightHunkMap = model.getRightHunkMap(); + if ( rightHunkMap != null ) { + int caret_line = model.getRightTextArea().getCaretLine(); + if ( rightHunkMap.get( caret_line ) != null && caret_line >= model.getRightTextArea().getFirstPhysicalLine() && caret_line <= model.getRightTextArea().getLastPhysicalLine() ) { + return rightHunkMap.get( caret_line ); + } + } + return null; + } + + /** + * @param gfx graphics context, if null, will use graphics context from diffLocalOverview component + * @param currentHunk the diff to draw cursors for. If null, will clear all cursors. + */ + private void paintCurrentHunkCursor( Graphics gfx, Diff.Change currentHunk ) { + if ( gfx == null ) { + gfx = diffLocalOverview.getGraphics(); + } + if ( gfx == null ) { + return ; + } + + // clear the current hunk cursors, if any + DiffTextAreaModel model = diffLocalOverview.getModel(); + int leftFirstLine = model.getLeftTextArea().getFirstPhysicalLine(); + int leftLastLine = model.getLeftTextArea().getLastPhysicalLine(); + gfx.setColor( localRendererPane.getBackground() ); + gfx.drawRect( leftRectangle.x - 3, 0, 1, ( leftLastLine - leftFirstLine ) * pixelsPerLine ); + + int rightFirstLine = model.getRightTextArea().getFirstPhysicalLine(); + int rightLastLine = model.getRightTextArea().getLastPhysicalLine(); + gfx.setColor( localRendererPane.getBackground() ); + gfx.drawRect( rightRectangle.x + rightRectangle.width + 1, 0, 1, ( rightLastLine - rightFirstLine ) * pixelsPerLine ); + + if ( currentHunk == null ) { + return ; // nothing to draw + } + + HashMap<Integer, Diff.Change> leftHunkMap = model.getLeftHunkMap(); + if ( leftHunkMap != null ) { + // paint left cursor for current hunk + for ( int i = leftFirstLine; i <= leftLastLine; i++ ) { + Diff.Change hunk = leftHunkMap.get( i ); + if ( hunk != null && hunk.equals( currentHunk ) ) { + if ( hunk.deleted == 0 ) { + leftRectangle.height = 1; + } + else { + leftRectangle.height = Math.max( 1, pixelsPerLine * hunk.deleted ); + } + leftRectangle.y = centerRectangle.y + ( ( i - leftFirstLine ) * pixelsPerLine ); + gfx.setColor( Color.BLACK ); + gfx.drawRect( leftRectangle.x - 3, leftRectangle.y, 1, leftRectangle.height ); + break; + } + } + } + HashMap<Integer, Diff.Change> rightHunkMap = model.getRightHunkMap(); + if ( rightHunkMap != null ) { + // paint right cursor for current hunk + for ( int i = rightFirstLine; i <= rightLastLine; i++ ) { + Diff.Change hunk = rightHunkMap.get( i ); + if ( hunk != null && hunk.equals( currentHunk ) ) { + if ( hunk.inserted == 0 ) { + rightRectangle.height = 1; + } + else { + rightRectangle.height = Math.max( 1, pixelsPerLine * hunk.inserted ); + } + rightRectangle.y = centerRectangle.y + ( ( i - rightFirstLine ) * pixelsPerLine ); + gfx.setColor( Color.BLACK ); + gfx.drawRect( rightRectangle.x + rightRectangle.width + 1, rightRectangle.y, 1, rightRectangle.height ); + break; + } + } + } + } } Modified: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java 2008-02-19 18:55:43 UTC (rev 11820) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java 2008-02-20 20:26:48 UTC (rev 11821) @@ -50,7 +50,6 @@ private JButton swap; private JButton diff; private JButton refresh; - private int orientation; /** * Required by super class. @@ -84,7 +83,6 @@ public void installUI( JComponent c ) { toolbar = ( MergeToolBar ) c; view = toolbar.getView(); - orientation = jEdit.getIntegerProperty( "jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL ); installDefaults(); installComponents(); @@ -137,7 +135,6 @@ private void installButtons() { int orient = jEdit.getIntegerProperty( "jdiff.toolbar-orientation", MergeToolBar.HORIZONTAL ); - orientation = orient; toolbar.removeAll(); toolbar.setLayout( createLayoutManager() ); switch ( orient ) { Modified: plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLocalOverviewUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLocalOverviewUI.java 2008-02-19 18:55:43 UTC (rev 11820) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/DiffLocalOverviewUI.java 2008-02-20 20:26:48 UTC (rev 11821) @@ -22,4 +22,7 @@ import javax.swing.plaf.ComponentUI; public abstract class DiffLocalOverviewUI extends ComponentUI { + + public abstract void moveLeft(int line); + public abstract void moveRight(int line); } Modified: plugins/JDiffPlugin/trunk/jdiff/util/Diff.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/Diff.java 2008-02-19 18:55:43 UTC (rev 11820) +++ plugins/JDiffPlugin/trunk/jdiff/util/Diff.java 2008-02-20 20:26:48 UTC (rev 11821) @@ -498,6 +498,14 @@ sb.append( "]" ); return sb.toString(); } + + public boolean equals(Object o) { + if (!(o instanceof Change)) { + return false; + } + Change c = (Change)o; + return line0 == c.line0 && line1 == c.line1 && deleted == c.deleted && inserted == c.inserted; + } } /** Data on one input file being compared. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <dal...@us...> - 2008-04-14 03:12:30
|
Revision: 12456 http://jedit.svn.sourceforge.net/jedit/?rev=12456&view=rev Author: daleanson Date: 2008-04-13 20:12:29 -0700 (Sun, 13 Apr 2008) Log Message: ----------- added ability to apply normal and unified patches, as in patch files created with diff, diff -u, and svn diff. Can only apply to a single file for now. Modified Paths: -------------- plugins/JDiffPlugin/trunk/JDiffPlugin.props plugins/JDiffPlugin/trunk/actions.xml plugins/JDiffPlugin/trunk/jdiff/DualDiff.java plugins/JDiffPlugin/trunk/jdiff/util/DiffOutput.java Added Paths: ----------- plugins/JDiffPlugin/trunk/jdiff/component/PatchSelectionDialog.java plugins/JDiffPlugin/trunk/jdiff/util/patch/ plugins/JDiffPlugin/trunk/jdiff/util/patch/Patch.java plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/ plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/Chunk.java plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/Patch.java plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/StringTools.java plugins/JDiffPlugin/trunk/jdiff/util/patch/unified/ plugins/JDiffPlugin/trunk/jdiff/util/patch/unified/Patch.java plugins/JDiffPlugin/trunk/jdiff/util/patch/unified/UnifiedChunk.java Modified: plugins/JDiffPlugin/trunk/JDiffPlugin.props =================================================================== --- plugins/JDiffPlugin/trunk/JDiffPlugin.props 2005-04-05 20:51:54 UTC (rev 12455) +++ plugins/JDiffPlugin/trunk/JDiffPlugin.props 2008-04-14 03:12:29 UTC (rev 12456) @@ -28,7 +28,8 @@ jdiff.toggle-ignore-amount-whitespace \ jdiff.toggle-ignore-all-whitespace \ - \ - jdiff.diff-normal-output + jdiff.diff-normal-output \ + jdiff.apply-patch plugin.jdiff.JDiffPlugin.option-group=jdiff.general \ jdiff.overview \ @@ -57,6 +58,7 @@ jdiff.toggle-ignore-all-whitespace.label=Ignore all whitespace jdiff.auto-show-dockable.label=Automatically show dockable on diff jdiff.diff-normal-output.label=Normal Diff Output +jdiff.apply-patch.label=Apply Patch jdiff.ignore-case=false jdiff.trim-whitespace=false Modified: plugins/JDiffPlugin/trunk/actions.xml =================================================================== --- plugins/JDiffPlugin/trunk/actions.xml 2005-04-05 20:51:54 UTC (rev 12455) +++ plugins/JDiffPlugin/trunk/actions.xml 2008-04-14 03:12:29 UTC (rev 12456) @@ -86,6 +86,12 @@ </CODE> </ACTION> + <ACTION NAME="jdiff.apply-patch"> + <CODE> + jdiff.DualDiff.applyPatch(view); + </CODE> + </ACTION> + <ACTION NAME="jdiff.move-right"> <CODE> jdiff.DualDiff.moveRight(editPane); Modified: plugins/JDiffPlugin/trunk/jdiff/DualDiff.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2005-04-05 20:51:54 UTC (rev 12455) +++ plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-04-14 03:12:29 UTC (rev 12456) @@ -20,6 +20,9 @@ package jdiff; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Rectangle; import java.awt.Color; import java.awt.Font; import java.awt.event.FocusEvent; @@ -27,23 +30,22 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseListener; -import java.io.IOException; -import java.io.BufferedWriter; -import java.io.StringWriter; - +import java.io.*; import java.nio.*; -import java.util.HashMap; +import java.util.*; import javax.swing.*; import jdiff.component.DiffLocalOverview; import jdiff.component.DiffGlobalPhysicalOverview; import jdiff.component.DiffOverview; import jdiff.component.DiffLineOverview; +import jdiff.component.PatchSelectionDialog; import jdiff.text.FileLine; import jdiff.util.Diff; import jdiff.util.DiffOutput; import jdiff.util.DiffNormalOutput; +import jdiff.util.patch.Patch; import org.gjt.sp.jedit.Buffer; import org.gjt.sp.jedit.EBComponent; @@ -772,6 +774,68 @@ } } + /** + * Shows a dialog for the user to select + * a patch file, then applies that patch file to the current buffer. + * @param view the view displaying the buffer + */ + public static void applyPatch( View view ) { + try { + // let the user select the patch file and patch file type + PatchSelectionDialog dialog = new PatchSelectionDialog( view ); + center(view, dialog); + dialog.setVisible( true ); + String patch_file = dialog.getPatchFile(); + if ( patch_file == null || patch_file.length() == 0 ) { + // null means user canceled + return ; + } + + // load the patch file + FileReader reader = new FileReader( patch_file ); + StringWriter writer = new StringWriter(); + copyToWriter( reader, writer ); + String patch = writer.toString(); + if ( patch == null || patch.length() == 0 ) { + // say something? + return ; + } + + // load the file to be patched + Buffer buffer = view.getEditPane().getBuffer(); + String bufferText = buffer.getText( 0, buffer.getLength() ); + + String results = ""; + int patch_type = dialog.getPatchType(); + switch ( patch_type ) { + case PatchSelectionDialog.NORMAL: + results = Patch.patchNormal( patch, bufferText ); + break; + default: + results = Patch.patchUnified( patch, bufferText ); + break; + } + jEdit.newFile( view ).insert( 0, results ); + } + catch ( Exception e ) { + // say something? + e.printStackTrace(); + } + } + + public static void copyToWriter( Reader from, Writer to ) throws Exception { + char[] buffer = new char[ 8192 ]; + int chars_read; + while ( true ) { + chars_read = from.read( buffer ); + if ( chars_read == -1 ) + break; + to.write( buffer, 0, chars_read ); + } + to.flush(); + from.close(); + } + private void nextDiff0() { Diff.Change hunk = this.edits; int firstLine = this.textArea0.getCaretLine(); @@ -789,10 +853,10 @@ // move the caret to the start of the first line of the diff int caret_position = textArea0.getLineStartOffset( line ); this.textArea0.setCaretPosition( caret_position, false ); - this.textArea0.scrollToCaret(false); + this.textArea0.scrollToCaret( false ); caret_position = textArea1.getLineStartOffset( hunk.line1 ); this.textArea1.setCaretPosition( caret_position, false ); - this.textArea1.scrollToCaret(false); + this.textArea1.scrollToCaret( false ); if ( this.textArea0.getFirstLine() != line ) { this.textArea0.getToolkit().beep(); @@ -821,10 +885,10 @@ // move the caret to the start of the first line of the diff int caret_position = textArea1.getLineStartOffset( line ); this.textArea1.setCaretPosition( caret_position, false ); - this.textArea1.scrollToCaret(false); + this.textArea1.scrollToCaret( false ); caret_position = textArea0.getLineStartOffset( hunk.line0 ); this.textArea0.setCaretPosition( caret_position, false ); - this.textArea0.scrollToCaret(false); + this.textArea0.scrollToCaret( false ); if ( this.textArea1.getFirstLine() != line ) { this.textArea1.getToolkit().beep(); @@ -854,10 +918,10 @@ // move the caret to the start of the first line of the diff int caret_position = textArea0.getLineStartOffset( line ); this.textArea0.setCaretPosition( caret_position, false ); - this.textArea0.scrollToCaret(false); + this.textArea0.scrollToCaret( false ); caret_position = textArea1.getLineStartOffset( hunk.line1 ); this.textArea1.setCaretPosition( caret_position, false ); - this.textArea1.scrollToCaret(false); + this.textArea1.scrollToCaret( false ); if ( this.textArea0.getFirstLine() != line ) { this.textArea0.getToolkit().beep(); @@ -888,10 +952,10 @@ // move the caret to the start of the first line of the diff int caret_position = textArea1.getLineStartOffset( line ); this.textArea1.setCaretPosition( caret_position, false ); - this.textArea1.scrollToCaret(false); + this.textArea1.scrollToCaret( false ); caret_position = textArea0.getLineStartOffset( hunk.line0 ); this.textArea0.setCaretPosition( caret_position, false ); - this.textArea0.scrollToCaret(false); + this.textArea0.scrollToCaret( false ); if ( this.textArea1.getFirstLine() != line ) { this.textArea1.getToolkit().beep(); @@ -1040,4 +1104,23 @@ ignoreAllWhitespaceDefault = newIgnoreAllWhitespaceDefault; } } -} + + /** + * Centers <code>you</code> on <code>me</code>. Useful for centering + * dialogs on their parent frames. + * + * @param me Component to use as basis for centering. + * @param you Component to center on <code>me</code>. + */ + public static void center( Component me, Component you ) { + Rectangle my = me.getBounds(); + Dimension your = you.getSize(); + int x = my.x + ( my.width - your.width ) / 2; + if ( x < 0 ) + x = 0; + int y = my.y + ( my.height - your.height ) / 2; + if ( y < 0 ) + y = 0; + you.setLocation( x, y ); + } +} \ No newline at end of file Added: plugins/JDiffPlugin/trunk/jdiff/component/PatchSelectionDialog.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/PatchSelectionDialog.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/PatchSelectionDialog.java 2008-04-14 03:12:29 UTC (rev 12456) @@ -0,0 +1,147 @@ +/* +Copyright (c) 2008, Dale Anson +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. +* Neither the name of the author nor the names of its contributors +may be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package jdiff.component; + +// imports +import java.awt.FlowLayout; +import java.util.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import org.gjt.sp.jedit.GUIUtilities; +import org.gjt.sp.jedit.View; +import org.gjt.sp.jedit.browser.VFSBrowser; + +import ise.java.awt.KappaLayout; + +public class PatchSelectionDialog extends JDialog { + + public static final int UNIFIED = 1; + public static final int NORMAL = 2; + + // instance fields + private View view = null; + private JTextField path = null; + private JRadioButton normal_rb = new JRadioButton("Normal"); + private JRadioButton unified_rb = new JRadioButton("Unified"); + + private boolean canceled = false; + + public PatchSelectionDialog( View view ) { + super( ( JFrame ) view, "Select Patch File", true ); + this.view = view; + _init(); + } + + /** Initialises the option pane. */ + protected void _init() { + JPanel panel = new JPanel( new KappaLayout() ); + panel.setBorder( new EmptyBorder( 6, 6, 6, 6 ) ); + + // select patch + JLabel path_label = new JLabel( "Select patch file:" ); + path = new JTextField(30); + JButton browse_btn = new JButton( "Browse" ); + browse_btn.addActionListener( new ActionListener() { + public void actionPerformed( ActionEvent ae ) { + String[] files = GUIUtilities.showVFSFileDialog( view, view.getEditPane().getBuffer().getPath(), VFSBrowser.OPEN_DIALOG, false ); + if (files != null && files.length > 0) { + path.setText(files[0]); + } + } + } + ); + + // select patch type + unified_rb.setSelected(true); + JPanel patch_panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + patch_panel.add(normal_rb); + patch_panel.add(unified_rb); + ButtonGroup bg = new ButtonGroup(); + bg.add(normal_rb); + bg.add(unified_rb); + + // buttons + KappaLayout kl = new KappaLayout(); + JPanel btn_panel = new JPanel( kl ); + JButton ok_btn = new JButton( "Ok" ); + JButton cancel_btn = new JButton( "Cancel" ); + btn_panel.add( "0, 0, 1, 1, 0, w, 3", ok_btn ); + btn_panel.add( "1, 0, 1, 1, 0, w, 3", cancel_btn ); + kl.makeColumnsSameWidth( 0, 1 ); + + ok_btn.addActionListener( new ActionListener() { + public void actionPerformed( ActionEvent ae ) { + if ( path == null || path.getText().length() == 0 ) { + canceled = true; + return ; + } + canceled = false; + PatchSelectionDialog.this.setVisible( false ); + PatchSelectionDialog.this.dispose(); + } + } + ); + + cancel_btn.addActionListener( new ActionListener() { + public void actionPerformed( ActionEvent ae ) { + canceled = true; + PatchSelectionDialog.this.setVisible( false ); + PatchSelectionDialog.this.dispose(); + } + } + ); + + + // add the components to the option panel + panel.add( "0, 0, 3, 1, W, , 3", path_label ); + panel.add( "0, 1, 2, 1, 0, w, 3", path ); + panel.add( "2, 1, 1, 1, 0, w, 3", browse_btn ); + panel.add( "0, 2, 1, 1, 0, , 0", KappaLayout.createVerticalStrut( 6, true ) ); + panel.add( "0, 3, 1, 1, W, , 3", new JLabel("Patch type:")); + panel.add( "0, 4, 3, 1, W, w, 3", patch_panel ); + panel.add( "0, 5, 1, 1, 0, , 0", KappaLayout.createVerticalStrut( 11, true ) ); + panel.add( "0, 6, 3, 1, E, , 0", btn_panel ); + + setContentPane( panel ); + pack(); + + } + + public String getPatchFile() { + if ( canceled ) { + return null; + } + return path.getText(); + } + + public int getPatchType() { + return unified_rb.isSelected() ? UNIFIED : NORMAL; + } +} Modified: plugins/JDiffPlugin/trunk/jdiff/util/DiffOutput.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/DiffOutput.java 2005-04-05 20:51:54 UTC (rev 12455) +++ plugins/JDiffPlugin/trunk/jdiff/util/DiffOutput.java 2008-04-14 03:12:29 UTC (rev 12456) @@ -36,7 +36,7 @@ protected DiffOutput(Object[] a,Object[] b) { - this.lineSeparator = System.getProperty("java.line.separator"); + this.lineSeparator = System.getProperty("line.separator"); this.out = new OutputStreamWriter(System.out); this.file0 = a; this.file1 = b; Added: plugins/JDiffPlugin/trunk/jdiff/util/patch/Patch.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/patch/Patch.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/util/patch/Patch.java 2008-04-14 03:12:29 UTC (rev 12456) @@ -0,0 +1,13 @@ +package jdiff.util.patch; + + +public class Patch { + public static String patchNormal( String patch, String text ) { + return jdiff.util.patch.normal.Patch.patchNormal( patch, text ); + + } + + public static String patchUnified( String patch, String text ) { + return jdiff.util.patch.unified.Patch.patchUnified( patch, text ); + } +} \ No newline at end of file Added: plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/Chunk.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/Chunk.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/Chunk.java 2008-04-14 03:12:29 UTC (rev 12456) @@ -0,0 +1,146 @@ +package jdiff.util.patch.normal; + +/** + * This Library implements a simple patch algorithm which is able to process + * the output of diff in normal format. + * + * This class implements an immutable data structure that is used to store the modification chunks. + * + * A Chunk is a consecutive amount of changes. See the diff documentation for more + * information. + * + * see <a href="http://www.gnu.org/software/diffutils/manual/html_mono/diff.html#Normal">http://www.gnu.org/software/diffutils/manual/html_mono/diff.html#Normal</a> + * + * <pre> + * Copyright (c) 2007 Dominik Schulz + * + * This file is part of jPatchLib. + * + * jPatchLib is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * jPatchLib is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with jPatchLib; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * </pre> + * + * @author Dominik + */ +public class Chunk { + String getName() { + return this.from1 + "," + this.from2 + this.op + this.to1 + "," + this.to2; + } + + /** + * What does this chunk do? + * One of: + * a (add), c (change), or d (delete) + */ + private final char op; + + /** + * Beginning of this change in the first file. + */ + private final int from1; + + /** + * End of this change in the first file. + */ + private final int from2; + + /** + * Beginning of this change in the second file. + */ + private final int to1; + + /** + * End of this change in the second file. + */ + private final int to2; + + /** + * The old text. + */ + private final String[] patch; + + /** + * The new text. + */ + private final String[] target; + + /** + * Create a new chunk. + * @param op a (add), d (delete) or c (change). + * @param from1 + * @param from2 + * @param to1 + * @param to2 + * @param patch + * @param target + */ + public Chunk(char op, int from1, int from2, int to1, int to2, String[] patch, String[] target) { + this.op = op; + this.from1 = from1; + this.from2 = from2; + this.to1 = to1; + this.to2 = to2; + this.patch = patch; + this.target = target; + } + + /** + * @return the from1 + */ + public int getFrom1() { + return from1; + } + + /** + * @return the from2 + */ + public int getFrom2() { + return from2; + } + + /** + * @return the op + */ + public char getOp() { + return op; + } + + /** + * @return the patch + */ + public String[] getPatch() { + return patch; + } + + /** + * @return the target + */ + public String[] getTarget() { + return target; + } + + /** + * @return the to1 + */ + public int getTo1() { + return to1; + } + + /** + * @return the to2 + */ + public int getTo2() { + return to2; + } +} Added: plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/Patch.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/Patch.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/Patch.java 2008-04-14 03:12:29 UTC (rev 12456) @@ -0,0 +1,356 @@ +package jdiff.util.patch.normal; + +import java.util.ArrayList; +import java.util.StringTokenizer; + +/** + * This Library implements a simple patch algorithm which is able to process + * the output of diff in normal format.<br> + * <br> + * This class implements the algorithm.<br> + * <br> + * The Method you're probably looking for is PatchUtils.patch(diff, target).<br> + * <br> + * Example usage in comparison to GNU patch:<br> + * GNU patch: "patch target < diff"<br> + * jPatchLib: "PatchUtils.patch(diff, target"<br> + * + * + * see <a href="http://www.gnu.org/software/diffutils/manual/html_mono/diff.html#Normal">http://www.gnu.org/software/diffutils/manual/html_mono/diff.html#Normal</a> + * + * <pre> + * Copyright (c) 2007 Dominik Schulz + * + * This file is part of jPatchLib. + * + * jPatchLib is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * jPatchLib is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with jPatchLib; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * </pre> + * + * @author Dominik + */ +public class Patch { + + /** + * Checks if the string starts with a number. + * Use to check if the string (line) is the beginning of a new chunk. + * @param str the string to be checked + * @return true if the string starts with a number. + */ + public static boolean startWithNumber( String str ) { + if ( str.startsWith( "1" ) || str.startsWith( "2" ) || str.startsWith( "3" ) || str.startsWith( "4" ) + || str.startsWith( "5" ) || str.startsWith( "6" ) || str.startsWith( "7" ) || str.startsWith( "8" ) + || str.startsWith( "9" ) || str.startsWith( "0" ) ) + return true; + return false; + } + + /** + * Get the single chunks from the patch. + * @param patchSrc the patch as a string array + * @return the array of chunks from the patch file. + */ + public static Chunk[] getChunks( String[] patchSrc ) { + // count the chunks + int numChunks = 0; + for ( int i = 0; i < patchSrc.length; i++ ) { + if ( startWithNumber( patchSrc[ i ] ) ) { + numChunks++; + } + } + // split into chunks (start at (some number) to (some number)). + Chunk[] chunks = new Chunk[ numChunks ]; + numChunks = -1; // must be -1 because in the next step its incremented + ArrayList<String> fromBuf = new ArrayList<String>(); + ArrayList<String> toBuf = new ArrayList<String>(); + char opBuf = ' '; + int from1buf = -1; + int from2buf = -1; + int to1buf = -1; + int to2buf = -1; + for ( int i = 0; i < patchSrc.length; i++ ) { + if ( startWithNumber( patchSrc[ i ] ) ) { + // save the old from buffers + if ( numChunks > -1 ) { + // char op, int from1, int from2, int to1, int to2, String[] patch, String[] target + chunks[ numChunks ] = new Chunk( opBuf, from1buf, from2buf, to1buf, to2buf, fromBuf + .toArray( new String[ 1 ] ), toBuf.toArray( new String[ 1 ] ) ); + } + numChunks++; // increment to the next chunk + fromBuf = new ArrayList<String>(); // reset the arrayLists + toBuf = new ArrayList<String>(); + StringTokenizer tok1; + if ( patchSrc[ i ].contains( "a" ) ) { + tok1 = new StringTokenizer( patchSrc[ i ], "a" ); + opBuf = 'a'; + } + else if ( patchSrc[ i ].contains( "c" ) ) { + tok1 = new StringTokenizer( patchSrc[ i ], "c" ); + opBuf = 'c'; + } + else if ( patchSrc[ i ].contains( "d" ) ) { + tok1 = new StringTokenizer( patchSrc[ i ], "d" ); + opBuf = 'd'; + } + else + tok1 = new StringTokenizer( patchSrc[ i ], "a" ); + String fromRange = tok1.nextToken(); + String toRange = tok1.nextToken(); + log( "fromRange: " + fromRange ); + log( "toRange: " + toRange ); + StringTokenizer tokFrom = new StringTokenizer( fromRange, "," ); + String from1 = tokFrom.nextToken(); + log( "From1: " + from1 ); + String from2 = "0"; + if ( tokFrom.hasMoreTokens() ) { + from2 = tokFrom.nextToken(); + log( "From2: " + from2 ); + } + StringTokenizer tokTo = new StringTokenizer( toRange, "," ); + String to1 = tokTo.nextToken(); + log( "To1: " + to1 ); + String to2 = "0"; + if ( tokTo.hasMoreTokens() ) { + to2 = tokTo.nextToken(); + log( "To2: " + to2 ); + } + from1buf = Integer.parseInt( from1 ); + from2buf = Integer.parseInt( from2 ); + to1buf = Integer.parseInt( to1 ); + to2buf = Integer.parseInt( to2 ); + if ( chunks[ numChunks ] != null ) + log( "--- Chunk Name: " + chunks[ numChunks ].getName() ); + } + else if ( patchSrc[ i ].startsWith( "<" ) ) { + String line = ""; + if ( patchSrc[ i ].length() > 2 ) + line = patchSrc[ i ].substring( 2 ); // cut off the < + log( "< " + line ); + fromBuf.add( line ); + } + else if ( patchSrc[ i ].startsWith( ">" ) ) { + String line = ""; + if ( patchSrc[ i ].length() > 2 ) + line = patchSrc[ i ].substring( 2 ); // cut off the > + log( "> " + line ); + toBuf.add( line ); + } + else if ( patchSrc[ i ].contains( "---" ) ) { + log( "Got seperation line: " + patchSrc[ i ] ); + } + else { + log( "Ignoring: " + patchSrc[ i ] ); + } + } + // finalize + if ( numChunks > -1 ) { + chunks[ numChunks ] = new Chunk( opBuf, from1buf, from2buf, to1buf, to2buf, fromBuf.toArray( new String[ 1 ] ), + toBuf.toArray( new String[ 1 ] ) ); + } + return chunks; + } + + /** + * Apply the chunks from the chunks array to the target. + * @param targetSrc the target to be patched + * @param chunks the chunks to apply + * @return The patched targetSrc array. + */ + public static String[] applyChunks( String[] targetSrc, Chunk[] chunks ) { + // apply each chunk + log( "--- Now applying the Chunks: ---" ); + log( "--- Target Text before: ---" ); + log( StringTools.arrayToString( targetSrc ) ); + /* + * Some words about the offset: + * This will adjust the following chunk operations so that they match the right lines. + * Without this there could be errors after the first chunk was applied, if this changed + * the number of lines. So we keep track of how many lines were added and/or removed and + * adjust the operations by this number of lines. + */ + int offset = 0; + for ( int i = 0; i < chunks.length; i++ ) { + // apply this chunk + Chunk c = chunks[ i ]; + if ( c.getOp() == 'a' ) { + // This will handle an "add" chunk + offset -= c.getTarget().length; + targetSrc = add( c.getFrom1(), c.getTarget(), targetSrc, offset ); + log( "--- Applied an ADD Chunk: ---" ); + log( c.getName() ); + log( StringTools.arrayToString( targetSrc ) ); + } + else if ( c.getOp() == 'c' ) { + // This will handle an "change" chunk + targetSrc = change( c.getFrom1(), c.getFrom2(), c.getTo1(), c.getTo2(), c.getTarget(), targetSrc, offset ); + log( "--- Applied an CHANGE Chunk: ---" ); + log( c.getName() ); + log( StringTools.arrayToString( targetSrc ) ); + } + else if ( c.getOp() == 'd' ) { + // This will handle an "delete" chunk + targetSrc = delete( c.getFrom1(), c.getFrom2(), targetSrc, offset ); + offset += c.getFrom2() - c.getFrom1() + 1; + log( "--- Applied an DELETE Chunk: ---" ); + log( c.getName() ); + log( StringTools.arrayToString( targetSrc ) ); + } + } + log( "--- Done applying the Chunks: ---" ); + log( "--- Target Text after: ---" ); + log( StringTools.arrayToString( targetSrc ) ); + return targetSrc; + } + + /** + * This is like the patch utility from GNU diff/patch. + * @param patchText The output from diff + * @param targetText The text on which the diff will be applied + * @return the result of the patching + */ + public static String patchNormal( String patchText, String targetText ) { + String[] patchSrc = StringTools.stringToArray( patchText ); + String[] targetSrc = StringTools.stringToArray( targetText ); + Chunk[] chunks = getChunks( patchSrc ); + return StringTools.arrayToString( applyChunks( targetSrc, chunks ) ); + } + + /** + * This applys a chunk of the type delete + * @param fromLine the first line to delete + * @param toLine the last line to delete + * @param baseText the text to be patched + * @param offset the offset. see ... uhm, somewhere else + * @return the modified baseText + */ + private static String[] delete( int fromLine, int toLine, String[] baseText, int offset ) { + // check input + if ( fromLine < 0 || toLine < 0 || baseText == null ) { + log( "### delete() - Argument ERROR" ); + return baseText; + } + // adjust from and to + fromLine = fromLine - offset; + toLine = toLine - offset; + log( "--- Offset: " + offset ); + log( "--- Base Text before: ---" ); + log( StringTools.arrayToString( baseText ) ); + log( "--- fromLine: " + fromLine + ", toLine: " + toLine ); + ArrayList<String> buff = new ArrayList<String>(); + for ( int i = 0; i < ( fromLine - 1 ) && i < baseText.length; i++ ) { + buff.add( baseText[ i ] ); + } + // just "drop" the deleted lines + for ( int j = toLine; j < baseText.length; j++ ) { + buff.add( baseText[ j ] ); + } + return buff.toArray( new String[ 1 ] ); + } + + /** + * This applys a chunk of the type change. + * @param fromLine + * @param toLine + * @param to1 + * @param to2 + * @param changeTo + * @param baseText + * @param offset + * @return the modified baseText + */ + private static String[] change( int fromLine, int toLine, int to1, int to2, String[] changeTo, String[] baseText, int offset ) { + log( "######### CHANGE #########" ); + // check input + if ( fromLine < 0 || toLine < 0 || baseText == null || changeTo == null ) { + log( "### change() - Argument ERROR" ); + return baseText; + } + // adjust from and to + fromLine = fromLine - offset; + toLine = toLine - offset; + log( "--- Offset: " + offset ); + log( "--- Base Text before: ---" ); + log( StringTools.arrayToString( baseText ) ); + log( "--- ChangeTo Text before: ---" ); + log( StringTools.arrayToString( changeTo ) ); + log( "--- fromLine: " + fromLine + ", toLine: " + toLine + ", changeTo.length: " + changeTo.length ); + ArrayList<String> buff = new ArrayList<String>(); + int i = 0; + for ( ; i < ( fromLine - 1 ) && i < baseText.length; i++ ) { // stop _before_ the line(s) that has(have) to be changed + log( "--- change() - Adding(1): " + baseText[ i ] ); + buff.add( baseText[ i ] ); + } + for ( int j = 0; j < changeTo.length; j++ ) { + log( "--- change() - Adding(2): " + changeTo[ j ] ); + buff.add( changeTo[ j ] ); + i++; + } + // fix the current line, this may have change due to insertion or removal of lines + int linesRemoved = fromLine; + if ( fromLine > 1 ) + linesRemoved = fromLine - 1; + if ( toLine > 0 ) + linesRemoved = toLine - ( fromLine - 1 ); + int linesInserted = 1; // = 1? + if ( to2 > 0 ) { + linesInserted = to2 - to1; + } + log( "--- change() - Ajusting i by: " + ( linesRemoved - linesInserted ) ); + i = i + ( linesRemoved - linesInserted ); + for ( int j = i; j < baseText.length; j++ ) { + log( "--- change() - Adding(3): " + baseText[ j ] ); + buff.add( baseText[ j ] ); + } + return buff.toArray( new String[ 1 ] ); + } + + /** + * Apply an add chunk. + * @param line + * @param insertion + * @param baseText + * @param offset + * @return the modified baseText + */ + private static String[] add( int line, String[] insertion, String[] baseText, int offset ) { + // check input + if ( line < 0 || baseText == null || insertion == null ) { + log( "### add(line: " + line + ", insertion: " + insertion + ", baseText: " + baseText + ") - Argument ERROR" ); + return baseText; + } + // adjust from and to + line = line - offset; + log( "--- Offset: " + offset ); + ArrayList<String> buff = new ArrayList<String>(); + int i = 0; + for ( ; i < line && i < baseText.length; i++ ) { + buff.add( baseText[ i ] ); + } + for ( int j = 0; j < insertion.length; j++ ) { + buff.add( insertion[ j ] ); + } + for ( int j = i; j < baseText.length; j++ ) { + buff.add( baseText[ j ] ); + } + return buff.toArray( new String[ 1 ] ); + } + + private static final boolean DEBUG = false; + + private static void log( String logLine ) { + if ( DEBUG ) { + System.out.println( logLine ); + } + } +} \ No newline at end of file Added: plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/StringTools.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/StringTools.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/util/patch/normal/StringTools.java 2008-04-14 03:12:29 UTC (rev 12456) @@ -0,0 +1,351 @@ +package jdiff.util.patch.normal; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.StringTokenizer; + +/** + * Tools working on Strings (d'oh) + * + * <pre> + * Copyright (c) 2006 Sebastian Erdweg + * Copyright (c) 2007 Dominik Schulz + * Copyright (c) 2006 Florian Lindner + * Copyright (c) 2006 Betim Berjani + * + * This file is part of FlexiCrypt. + * + * FlexiCrypt is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * FlexiCrypt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with FlexiCrypt; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * </pre> + * + * @author Sebastian + * @author Dominik + */ +public class StringTools { + + /** + * + * @param arr + * the array to convert to a string line by line + * @return the string from the array, every line sperated by \n + */ + public static String arrayToString(Object[] arr) { + return arrayToString(arr, "\n"); + } + + /** + * @param arr + * the array to convert to a string line by line + * @param delim + * the delimiter between the lines + * @return the string from the array, every line sperated by delim + */ + public static String arrayToString(Object[] arr, String delim) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < arr.length; i++) { + sb.append(arr[i].toString()).append(delim); + } + //return sb.toString(); // TODO maybe this should by used instead + return sb.toString().substring(0, (sb.toString().length()-delim.length())); // remove the last delim + } + + public static String stringToStringBuilderCode(String str) { + StringBuilder sb = new StringBuilder(); + sb.append("StringBuilder sb = new StringBuilder();\n"); + String[] lines = stringToArray(str, "\n"); + for (int i = 0; i < lines.length; i++) { + sb.append("sb.append(\""+lines[i]+"\\n\");\n"); + } + return sb.toString(); + } + + /** + * Change the frist letter of each word in the string to upper case. + * @param string the string to change + * @return the changed string + */ + public static String firstLetterUpperCaseOfEachWord(String string) { + String[] nameParts = string.split(" "); + for (int i = 0; i < nameParts.length; i++) { + nameParts[i] = (nameParts[i].charAt(0) + "").toUpperCase() + + nameParts[i].substring(1, nameParts[i].length()); + if (i < nameParts.length - 1) { + nameParts[i] += " "; + } + } + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < nameParts.length; i++) { + sb.append(nameParts[i]); + } + return sb.toString(); + } + + /** + * Get a formated String of bytes with a given maximum length. + * @param b + * @param type + * @param maxLength + * @return the formated string + */ + public static String getFormatedStringOfBytes(byte[] b, String type, int maxLength) { + String formatedString = getFormatedStringOfBytes(b, type); + if (formatedString.length() > maxLength) { + formatedString = formatedString.substring(0, maxLength); + } + return formatedString; + } + + /** + * Get a formated string of bytes. Useful for debugging. + * @param b the byte array + * @param type box, dotted or other + * @return the formated string + */ + public static String getFormatedStringOfBytes(byte[] b, String type) { + if (type.equals("box")) // "box"-Ansicht wie in der MessageDigest box + { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < b.length; i++) { + if ((i > 0) && (i % 8 == 0)) { + sb.append('\n' + StringTools.getStringOfByte(b[i])); + } else if (i == 0) { + sb.append(StringTools.getStringOfByte(b[i])); + } else { + sb.append(' ' + StringTools.getStringOfByte(b[i])); + } + } + return sb.toString(); + } else if (type.equals("dotted")) { // "dotted"-Darstellung wie im + // Zertifikats-Viewer + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < b.length - 1; i++) { + sb.append(StringTools.getStringOfByte(b[i]) + ":"); + } + if (b.length > 0) + sb.append(StringTools.getStringOfByte(b[b.length - 1])); + // nach dem letzten eintrag kein doppelpunkt mehr + return sb.toString(); + } else { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < b.length; i++) { + sb.append(StringTools.getStringOfByte(b[i])); + } + return sb.toString(); + } + } + + /** + * @param b a byte + * @return the corresponding string + */ + public static String getStringOfByte(byte b) { + int c = b; + if (c < 0) { + c = c + 256; + } + String s = Integer.toHexString(c).toUpperCase(); + + if (s.length() == 1) { + s = '0' + s; + } + + return s; + } + + /** + * + * @param text - + * The String that will be broken up into lines of n chars + * @param breakAfter - + * The max. number of chars per line + * @return the broken string + */ + public static String lineBreakAfterNchars(String text, int breakAfter) { + breakAfter--; + int startMark = 0; + int endMark = breakAfter; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < text.length(); i++) { + if (i % breakAfter == 0) { + if ((text.length() - endMark) < 0) { + endMark = text.length(); + sb.append(text.substring(startMark, endMark)); + } else { + sb.append(text.substring(startMark, endMark) + "\n"); + } + startMark = endMark; + endMark = endMark + breakAfter; + } + } + return sb.toString(); + } + + /** + * Read a file into a String + * @param file the file to read from + * @return the content of the file + * @throws IOException + */ + public static String readFileIntoString(File file) throws IOException { + BufferedReader bw = new BufferedReader(new FileReader(file)); + StringBuilder sb = new StringBuilder(); + String line; + while ((line = bw.readLine()) != null) { + sb.append("\n" + line); + } + bw.close(); + return sb.toString().substring(1); + } + + /** + * Almost the same a readFileIntoString with the difference that the input is split a + * newlines and put into an array. + * @param filename + * @return the content of the file + */ + public static String[] readFileIntoStringArray(String filename) { + try { + return stringToArray(readFileIntoString(new File(filename))); + } catch (IOException e) { + return null; + } + } + + /** + * Convert a string to an string array. Split at newlines (\n). + * @param msg string to split up + * @return the string array + */ + public static String[] stringToArray(String msg) { + return stringToArray(msg, "\n"); + } + + /** + * Convert a string to an string array. Split at arbitrary delimiters. + * @param msg string to split up + * @param delim the delimiter, e.g. "\n" or "\r\n" or maybe " ". + * @return the string array + */ + public static String[] stringToArray(String msg, String delim) { + ArrayList<String> al = stringToArrayList(msg, delim); + return al.toArray(new String[al.size()]); + } + + /** + * Convert a string to an ArrayList<String>. Split at "\n". + * @param msg string to split up + * @return the ArrayList<String> + */ + public static ArrayList<String> stringToArrayList(String msg) { + return stringToArrayList(msg, "\n"); + } + + /** + * Splits a String at the given delimiters and puts the result into an ArrayList<String> + * + * @param msg string to split up + * @param delim the delimiter, e.g. "\n" or "\r\n" or maybe " ". + * @return the ArrayList<String> + */ + public static ArrayList<String> stringToArrayList(String msg, String delim) { + ArrayList<String> al = new ArrayList<String>(); + //System.out.println("stringToArrayList(msg: " + msg + ", delim: " + delim + ") - Processing ..."); + StringTokenizer tokens = new StringTokenizer(msg, delim, true); + boolean lastTokenEmpty = false; + while (tokens.hasMoreTokens()) { + String currentToken = tokens.nextToken(); + if(currentToken.equals(delim) && lastTokenEmpty == true) { + //System.out.println("stringToArrayList() - adding token: empty"); + al.add(""); + lastTokenEmpty = true; + } else if(currentToken.equals(delim) && lastTokenEmpty == false) { + // skip this one + //System.out.println("stringToArrayList() - skipping token"); + lastTokenEmpty = true; + } else { + //System.out.println("stringToArrayList() - adding token: " + currentToken); + al.add(currentToken); + lastTokenEmpty = false; + } + } + //System.out.println("stringToArrayList() - size of final array: " + al.size()); + //System.out.println("stringToArrayList() - final string: " + arrayToString(al.toArray(new String[1]))); + return al; + } + + /** + * Write a string into a file. + * @param text the string to write to the file. + * @param file the output file. + * @throws IOException if an I/O error ocurs. + */ + public static void writeStringIntoFile(String text, File file) throws IOException { + BufferedWriter bw = new BufferedWriter(new FileWriter(file)); + bw.write(text); + bw.close(); + } + + /** + * Remove every line-break from the string + * @param text w/ or w/o line breaks + * @return the string w/o line breaks. + */ + public static String removeLineBreaks(String text) { + String replace = text.replace("\n", " "); + replace = replace.replace("\r\n", " "); + replace = replace.replace("\n\r", " "); + replace = replace.replace("\r", " "); + return replace; + } + + /** + * Remove every line-break from the string. Cut at the given maxLength. + * @param text w/ or w/o line breaks + * @param maxLength the maximum length of the returned string + * @return the string w/o line breaks. + */ + public static String removeLineBreaks(String text, int maxLength) { + String ret = removeLineBreaks(text); + if (ret.length() > maxLength) { + ret = ret.substring(0, maxLength); + } + return ret; + } + + /** + * This class provides only static methods. No need to instanciate. + * + */ + private StringTools() { + + } + + public static void main(String args[]) { + /* + File file = new File("/some/input/file.txt"); + try { + System.out.println(stringToStringBuilderCode(readFileIntoString(file))); + } catch (IOException e) { + e.printStackTrace(); + } + */ + } +} Added: plugins/JDiffPlugin/trunk/jdiff/util/patch/unified/Patch.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/patch/unified/Patch.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/util/patch/unified/Patch.java 2008-04-14 03:12:29 UTC (rev 12456) @@ -0,0 +1,245 @@ +/* +* Copyright (c) 2008, Dale Anson +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +package jdiff.util.patch.unified; + +import java.io.*; +import java.util.*; + +/** + * A utility to apply a patch created as a unified diff (diff -u). Currently + * ONLY supports applying a unified diff to a single file at a time. Neither + * edit diffs (diff -e) nor context diffs (diff -c) nor "normal" diffs are + * supported. Applying a recursive diff is not supported either (diff -ur). + * + * Oddly enough, I looked + * around the internet for quite a while before writing this. It seems there + * are very few implementations of diff in java, and only 2 patch implementations, + * neither of which support unified diff. + * + * The "Normal Diff Output" provided by the JDiff plugin is not yet supported by + * this class. + * + * The SVN diff command is in unified diff format. GNU diff with the -u option + * is the standard for unified diff. Both of these are supported by this class. + */ +public class Patch { + + public static String LINE_SEPARATOR = "\n"; + + /** + * This is like the patch utility from GNU diff/patch where it is expected + * that the patch was produced as a "unified" diff, that is, with "diff -u". + * Note that svn diff produces a unified diff that is completely acceptable + * to this method. + * + * @param patchText the output from diff -u + * @param targetText the text on which to apply the patch + * @return the result of applying the patch + */ + public static String patchUnified( String patchText, String targetText ) { + List<String> patchSrc = getLines( patchText, true ); + List<String> targetSrc = getLines( targetText, false ); + List<UnifiedChunk> chunks = getUnifiedChunks( patchSrc ); + return applyUnifiedChunks( targetSrc, chunks ); + } + + private static List<String> getLines( String s, boolean pad ) { + List<String> lines = new ArrayList<String>(); + try { + BufferedReader reader = new BufferedReader( new StringReader( s ) ); + String line = null; + while ( ( line = reader.readLine() ) != null ) { + if ( line.length() == 0 && pad) { + // in a patch file created by a unified diff, each line must + // start with +, -, or space, put a space at the front of any + // blank lines + line = " "; + } + lines.add( line ); + } + } + catch ( Exception e ) { + e.printStackTrace(); + } + return lines; + } + + private static List<UnifiedChunk> getUnifiedChunks( List<String> patchSrc ) { + // count the chunks and calculate offsets to the start of each chunk + int numChunks = 0; + for ( String line : patchSrc ) { + if ( line.startsWith( "@@" ) ) { + ++numChunks; + } + } + int[] chunkOffsets = new int[ numChunks + 1 ]; + int index = 0; + for ( int i = 0; i < patchSrc.size(); i++ ) { + String line = patchSrc.get( i ); + if ( line.startsWith( "@@" ) ) { + chunkOffsets[ index ] = i; + ++index; + } + } + chunkOffsets[ chunkOffsets.length - 1 ] = patchSrc.size(); + + // split the lines into their individual chunks + List < List < String >> chunkLines = new ArrayList < List < String >> (); + for ( int i = 0; i < chunkOffsets.length - 1; i++ ) { + int start = chunkOffsets[ i ]; + int end = chunkOffsets[ i + 1 ]; + List<String> lines = new ArrayList<String>(); + for ( int j = start; j < end; j++ ) { + lines.add( patchSrc.get( j ) ); + } + if ( lines.size() > 0 ) { + chunkLines.add( lines ); + } + } + + // parse the individual sets of chunk lines + List<UnifiedChunk> unifiedChunks = new ArrayList<UnifiedChunk>(); + for ( List<String> lines : chunkLines ) { + if ( lines.size() == 0 ) { + continue; + } + String rangeLine = lines.get( 0 ); + + // Format of the range line is "@@ -L,S +L,S @@" where + // - means the old file, + // + means the new file, + // L is the offset line in that file, + // S is the number of lines following the offset line + // so "@@ -86,3 +86,12 @@" + // means replace the 3 lines starting at line 86 in the old file + // with 12 patch lines. The comma and S value are optional, + // if missing, assume S = 1. + + // parse the range line to get the L and S values + rangeLine = rangeLine.replaceAll( "@", "" ); + rangeLine = rangeLine.trim(); // now have "L,S L,S" + + // get the 2 ranges + String[] ranges = rangeLine.split( "[ ]" ); + if ( ranges.length != 2 ) { + // must be exactly 2 ranges, else chunk is invalid + continue; + } + + // get the L and S values for the 1st range + String[] oldParts = ranges[ 0 ].split( "[,]" ); + int oldStartLine = Integer.parseInt( oldParts[ 0 ].substring( 1 ) ) - 1; + int oldRange = 1; + if ( oldParts.length == 2 ) { + oldRange = Integer.parseInt( oldParts[ 1 ] ); + } + + // get the L and S values for the 2nd range + String[] newParts = ranges[ 1 ].split( "[,]" ); + int newStartLine = Integer.parseInt( newParts[ 0 ].substring( 1 ) ) - 1; + int newRange = 1; + if ( newParts.length == 2 ) { + newRange = Integer.parseInt( newParts[ 1 ] ); + } + + // count line types (-, +, space) to validate ranges. Accumulate + // + and space lines here too for later use. + int minus_lines = 0; + int plus_lines = 0; + int space_lines = 0; + List<String> insertLines = new ArrayList<String>(); + for ( int i = 1; i < lines.size(); i++ ) { + String line = lines.get( i ); + if ( line.startsWith( "-" ) ) { + ++minus_lines; + } + else if ( line.startsWith( "+" ) ) { + ++plus_lines; + insertLines.add( line.substring( 1 ) ); + } + else if ( line.startsWith( " " ) ) { + ++space_lines; + insertLines.add( line.substring( 1 ) ); + } + } + + // validate ranges + if ( oldRange != minus_lines + space_lines ) { + // old range is invalid + continue; + } + if ( newRange != plus_lines + space_lines ) { + // new range is invalid + continue; + } + + // if here, chunk is valid + UnifiedChunk unifiedChunk = new UnifiedChunk(); + unifiedChunk.oldStartLine = oldStartLine; + unifiedChunk.oldRange = oldRange; + unifiedChunk.newStartLine = newStartLine; + unifiedChunk.newRange = newRange; + unifiedChunk.lines = insertLines; + unifiedChunks.add( unifiedChunk ); + } + + return unifiedChunks; + } + + private static String applyUnifiedChunks( List<String> lines, List<UnifiedChunk>chunks ) { + List<String> newLines = new ArrayList<String>(); + int line_number = 0; + for ( UnifiedChunk chunk : chunks ) { + // chunks can overlap, back up a few lines if necessary + if ( line_number >= chunk.oldStartLine ) { + int to_remove = line_number - chunk.oldStartLine; + line_number = chunk.oldStartLine; + for ( int i = 0; i < to_remove; i++ ) { + newLines.remove( newLines.size() - 1 ); + } + } + + // add original lines between last chunk and next chunk + for ( int i = line_number; i < chunk.oldStartLine; i++ ) { + newLines.add( lines.get( line_number ) ); + ++line_number; + } + + // add lines for chunk + for ( int i = 0; i < chunk.lines.size(); i++ ) { + newLines.add( chunk.lines.get( i ) ); + } + + // skip to end of old chunk + line_number += chunk.oldRange; + } + + // add any lines remaining after the last chunk + for ( int i = line_number; i < lines.size(); i++ ) { + newLines.add( lines.get( i ) ); + } + + // put together a string of the patched file + StringBuffer sb = new StringBuffer(); + for ( String line : newLines ) { + sb.append( line ).append( LINE_SEPARATOR ); + } + return sb.toString(); + } +} \ No newline at end of file Added: plugins/JDiffPlugin/trunk/jdiff/util/patch/unified/UnifiedChunk.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/util/patch/unified/UnifiedChunk.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/util/patch/unified/UnifiedChunk.java 2008-04-14 03:12:29 UTC (rev 12456) @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2008, Dale Anson... [truncated message content] |
From: <ez...@us...> - 2008-05-07 01:33:02
|
Revision: 12576 http://jedit.svn.sourceforge.net/jedit/?rev=12576&view=rev Author: ezust Date: 2008-05-06 18:32:59 -0700 (Tue, 06 May 2008) Log Message: ----------- Tidied the docs. Modified Paths: -------------- plugins/JDiffPlugin/trunk/build.xml plugins/JDiffPlugin/trunk/docs/index.html Modified: plugins/JDiffPlugin/trunk/build.xml =================================================================== --- plugins/JDiffPlugin/trunk/build.xml 2008-05-07 01:15:24 UTC (rev 12575) +++ plugins/JDiffPlugin/trunk/build.xml 2008-05-07 01:32:59 UTC (rev 12576) @@ -4,7 +4,7 @@ <!-- read build.props to override properties set below --> <property file="../build.properties"/> <property file="build.properties"/> - + <property file="JDiffPlugin.props" /> <!-- default location of jedit.jar --> <property name="jedit.install.dir" value="../.."/> @@ -13,7 +13,7 @@ <property name="jar.name" value="${ant.project.name}.jar"/> <!-- version number --> - <property name="build.num" value="1.8.0"/> + <property name="build.num" value="${plugin.jdiff.JDiffPlugin.version}"/> <!-- where to put the finished plugin --> <property name="install.dir" value=".." /> Modified: plugins/JDiffPlugin/trunk/docs/index.html =================================================================== --- plugins/JDiffPlugin/trunk/docs/index.html 2008-05-07 01:15:24 UTC (rev 12575) +++ plugins/JDiffPlugin/trunk/docs/index.html 2008-05-07 01:32:59 UTC (rev 12576) @@ -1,387 +1,506 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN"> <html> <head> +<meta name="generator" content="HTML Tidy, see www.w3.org"> <title>JDiff Plugin</title> </head> - <body> - <h2>JDiff Plugin @@build.num@@</h2> +<h2>JDiff Plugin @@build.num@@</h2> - <p> - Authors: André Kaplan, Mark Wickens, Dale Anson - </p> +<p>Authors: Andr\xE9 Kaplan, Mark Wickens, Dale Anson</p> - <h3>Legal Notice</h3> +<h3>Legal Notice</h3> - <p> - Permission is granted to copy, distribute and/or modify this - document under the terms of the GNU Free Documentation License, - Version 1.1 or any later version published by the - Free Software Foundation; with no - Invariant Sections, - Front-Cover Texts or - Back-Cover Texts, - each as defined in the license. - A copy of the license can be found in the file - COPYING.DOC.txt included with jEdit. - </p> +<p>Permission is granted to copy, distribute and/or modify this +document under the terms of the GNU Free Documentation License, +Version 1.1 or any later version published by the Free Software +Foundation; with no Invariant Sections, Front-Cover Texts or +Back-Cover Texts, each as defined in the license. A copy of the +license can be found in the file COPYING.DOC.txt included with +jEdit.</p> <hr> -<a name="presentation"> - <h3>Presentation</h3> +<a name="presentation"> - <p>JDiffPlugin is a visual diff and merge utility for jEdit.</p> +<h3>Presentation</h3> - <p>It features:</p> +<p>JDiffPlugin is a visual diff and merge utility for jEdit.</p> - <ul> - <li><p>Diff overviews (local and global)</p></li> - <li><p>Synchronized scrolling</p></li> - <li><p>Ignore case option</p></li> - <li><p>Ignore leading and trailing whitespace option</p></li> - <li><p>Ignore amount of whitespace option</p></li> - <li><p>Ignore all whitespace option</p></li> - <li><p>Normal diff output</p></li> - <li><p>Visual merging of differences between two files</p></li> - </ul> +<p>It features:</p> +<ul> +<li> +<p>Diff overviews (local and global)</p> +</li> +<li> +<p>Synchronized scrolling</p> +</li> + +<li> +<p>Ignore case option</p> +</li> + +<li> +<p>Ignore leading and trailing whitespace option</p> +</li> + +<li> +<p>Ignore amount of whitespace option</p> +</li> + +<li> +<p>Ignore all whitespace option</p> +</li> + +<li> +<p>Normal diff output</p> +</li> + +<li> +<p>Visual merging of differences between two files</p> +</li> +</ul> + <hr> +<a name="usage"> +<h3>Usage</h3> +<p>The simplest method is to open the Dual Diff Dialog (Plugins +-> JDiff -> <b>Show dual diff dialog</b>) and choose the +files to compare.</p> -<a name="usage"> - <h3>Usage</h3> +<p>But you can also:</p> - <p>The simplest method is to open the Dual Diff Dialog - (Plugins -> JDiff -> <b>Show dual diff dialog</b>) - and choose the files to compare. - </p> - <p> - But you can also:<br> - <ol> - <li><p>Split your view in two (vertically)</p></li> +<ol> +<li> +<p>Split your view in two (vertically)</p> +</li> - <li><p>Edit the buffers you want to compare:</p> - <ul> - <li><p>the buffer on the left is the original</p></li> - <li><p>the buffer on the right is the revision</p></li> - </ul> - </li> +<li> +<p>Edit the buffers you want to compare:</p> - <li><p>Activate JDiff: - <guimenu>Plugins</guimenu>> - <guisubmenu>JDiff</guisubmenu>> - <b>Dual Diff</b> </p> - </li> - </ol> - </p> +<ul> +<li> +<p>the buffer on the left is the original</p> +</li> - <p> - Or if you have JDiff docked:<br> - <ol> - <li>Open the dockable.</li> - <li>Click the 'Diff' button: <br><img src="delta.png"></img></li> - </ol> - </p> +<li> +<p>the buffer on the right is the revision</p> +</li> +</ul> +</li> - <p>Figure 1 shows the result</p> +<li> +<p>Activate JDiff: <b>Plugins</b> > <b>JDiff</b>> <b>Dual +Diff</b></p> +</li> +</ol> - <img src="diff_overview.jpg" format="JPG"> +<p>Or if you have JDiff docked:</p> +<ol> +<li>Open the dockable.</li> + +<li>Click the 'Diff' button: + +<p><img alt="" src="delta.png"></p> +</li> +</ol> + +<p>Figure 1 shows the result</p> + +<img alt="" src="diff_overview.jpg" format="JPG"> + <hr> +<a name="display"> +<h3>Display</h3> -<a name="display"> - <h3>Display</h3> +<p>Once JDiff is activated as in Figure 1, you should see:</p> - <p>Once JDiff is activated as in Figure 1, you should see:</p> - <ul> - <li><p>Text Highlights</p></li> - <li><p>A local overview (right of the original)</p></li> - <li><p>A global overview (right of the revision)</p></li> - <li><p>If you have activated the Diff dockable, you'll also see the merge controls and the line overview.</p></li> - </ul> +<ul> +<li> +<p>Text Highlights</p> +</li> +<li> +<p>A local overview (right of the original)</p> +</li> - <h3>Color conventions</h3> +<li> +<p>A global overview (right of the revision)</p> +</li> - <p>By default:</p> +<li> +<p>If you have activated the Diff dockable, you'll also see the +merge controls and the line overview.</p> +</li> +</ul> - <ul> - <li><p>Changed lines appear in yellow</p></li> - <li><p>Deleted (from the original) lines appear in red</p></li> - <li><p>Inserted (to the revision) lines appear in green</p></li> +<h3>Color conventions</h3> - <li><p>Invalid lines appear as thin dark grey lines.</p> - <ul> - <li><p>In the original, invalid lines indicate where a block was inserted - in the revision.</p> - </li> - <li><p>In the revision, invalid lines indicate where a block was deleted in - the original. </p> - </li> - </ul> - </li> - </ul> +<p>By default:</p> - <h3>Local overview</h3> +<ul> +<li> +<p>Changed lines appear in yellow</p> +</li> - <p> - The local overview shows how the visible changed/inserted/deleted - blocks from the original and the revision relate to each other. Merging - between files can be performed by clicking - a right arrow in the local overview, which will select the corresponding text - from the original and replace the related text in the revision. The blocks to be merged are indicated by vertical black bars so it is obvious which code is moving. Clicking - a left arrow in the local overview will select the corresponding text block - from the revision and replace the related text in the original. Note that the code moves are by block, not by line, so the entire diff will be moved. - </p> +<li> +<p>Deleted (from the original) lines appear in red</p> +</li> - <h3>Global overview</h3> +<li> +<p>Inserted (to the revision) lines appear in green</p> +</li> - <p> - The global overview should help you estimate how the two edited buffers - differ. - It also displays two cursors which indicate the visible parts of the two - buffers. - Clicking within the global overview will move the view to the corresponding - part of the file. - </p> +<li> +<p>Invalid lines appear as thin dark grey lines.</p> - <h3>Line overview</h3> - <p> - The line overview shows character-by-character differences between the - current cursor lines within a diff block. This makes it easy to see the difference of even a single character change between the left and right lines. This overview only shows one line at a time of the diff block, move the cursor within the block to see the individual line differences for each line. - </p> +<ul> +<li> +<p>In the original, invalid lines indicate where a block was +inserted in the revision.</p> +</li> - <h3>Merge controls</h3> - <p> - The merge control has 8 buttons. From left to right in horizontal mode: - </p> - <p> - <ol> - <li><img src="diff.jpg"></img> Start a diff.</li> - <li><img src="unsplit.jpg"></img> Unsplit the view, which ends the diff session.</li> - <li><img src="next_diff.jpg"></img> Move to next diff.</li> - <li><img src="move_right.jpg"></img> Move current diff to right. This replaces the diff block on the right - with the text from the left diff block.</li> - <li><img src="move_left.jpg"></img> Move current diff to left. This replaces the diff block on the left - with the text from the right diff block.</li> - <li><img src="prev_diff.jpg"></img> Move to previous diff.</li> - <li><img src="swap.jpg"></img> Swap text areas, that is, put the file that was on the left on - the right, and put the file that was on the right on the left.</li> - <li><img src="refresh.jpg"></img> Refresh the diff.</li> - </ol> - </p> - <p> - The merge controls can also be displayed vertically or in a compact form (as shown in the image above), and with or without the line overview. The vertical display is convenient for the left or right docking areas. The horizontal layout works well in the top or bottom docking areas. The compact layout uses less vertical space in the top or bottom docking areas when the line overview is also displayed. - </p> +<li> +<p>In the revision, invalid lines indicate where a block was +deleted in the original.</p> +</li> +</ul> +</li> +</ul> +<h3>Local overview</h3> + +<p>The local overview shows how the visible +changed/inserted/deleted blocks from the original and the +revision relate to each other. Merging between files can be +performed by clicking a right arrow in the local overview, which +will select the corresponding text from the original and replace +the related text in the revision. The blocks to be merged are +indicated by vertical black bars so it is obvious which code is +moving. Clicking a left arrow in the local overview will select +the corresponding text block from the revision and replace the +related text in the original. Note that the code moves are by +block, not by line, so the entire diff will be moved.</p> + +<h3>Global overview</h3> + +<p>The global overview should help you estimate how the two +edited buffers differ. It also displays two cursors which +indicate the visible parts of the two buffers. Clicking within +the global overview will move the view to the corresponding part +of the file.</p> + +<h3>Line overview</h3> + +<p>The line overview shows character-by-character differences +between the current cursor lines within a diff block. This makes +it easy to see the difference of even a single character change +between the left and right lines. This overview only shows one +line at a time of the diff block, move the cursor within the +block to see the individual line differences for each line.</p> + +<h3>Merge controls</h3> + +<p>The merge control has 8 buttons. From left to right in +horizontal mode:</p> + +<ol> +<li><img alt="" src="diff.jpg"> Start a diff.</li> + +<li><img alt="" src="unsplit.jpg"> Unsplit the view, which +ends the diff session.</li> + +<li><img alt="" src="next_diff.jpg"> Move to next +diff.</li> + +<li><img alt="" src="move_right.jpg"> Move current diff to +right. This replaces the diff block on the right with the text +from the left diff block.</li> + +<li><img alt="" src="move_left.jpg"> Move current diff to +left. This replaces the diff block on the left with the text from +the right diff block.</li> + +<li><img alt="" src="prev_diff.jpg"> Move to previous +diff.</li> + +<li><img alt="" src="swap.jpg"> Swap text areas, that is, +put the file that was on the left on the right, and put the file +that was on the right on the left.</li> + +<li><img alt="" src="refresh.jpg"> Refresh the diff.</li> +</ol> + +<p>The merge controls can also be displayed vertically or in a +compact form (as shown in the image above), and with or without +the line overview. The vertical display is convenient for the +left or right docking areas. The horizontal layout works well in +the top or bottom docking areas. The compact layout uses less +vertical space in the top or bottom docking areas when the line +overview is also displayed.</p> + <hr> +<a name="other_commands"> +<h3>Other commands</h3> -<a name="other_commands"> - <h3>Other commands</h3> -<p> -These commands are available on the plugin menu: -</p> - <ul> - <li><p> - <b>Refresh</b>: - refreshes the diff display </p> - </li> +<p>These commands are available on the plugin menu:</p> - <li><p> - <b>Go to previous/next difference</b> </p> - </li> +<ul> +<li> +<p><b>Refresh</b>: refreshes the diff display</p> +</li> - <li><p> - <b>Ignore case</b>: - toggles the "Ignore case" option for the current diff - </p></li> +<li> +<p><b>Go to previous/next difference</b></p> +</li> - <li><p> - <b>Ignore leading and trailing whitespace</b>: - toggles the "Ignore leading and trailing whitespace" option for the current diff - </p></li> +<li> +<p><b>Ignore case</b>: toggles the "Ignore case" option for the +current diff</p> +</li> - <li><p> - <b>Ignore amount of whitespace</b>: - toggles the "Ignore amount of whitespace" option for the current diff - </p></li> +<li> +<p><b>Ignore leading and trailing whitespace</b>: toggles the +"Ignore leading and trailing whitespace" option for the current +diff</p> +</li> - <li><p> - <b>Ignore all whitespace</b>: - toggles the "Ignore all whitespace" option for the current diff - </p></li> +<li> +<p><b>Ignore amount of whitespace</b>: toggles the "Ignore amount +of whitespace" option for the current diff</p> +</li> - <li><p> - <b>Normal Diff Output</b>: - generates a diff file using the normal method - </p></li> - </ul> +<li> +<p><b>Ignore all whitespace</b>: toggles the "Ignore all +whitespace" option for the current diff</p> +</li> +<li> +<p><b>Normal Diff Output</b>: generates a diff file using the +normal method</p> +</li> +</ul> + <hr> +<a name="options"> +<h3>Options</h3> -<a name="options"> - <h3>Options</h3> +<p>These settings can be made in the JDiff options panel, Plugins +-> Plugin Options... -> JDiff Plugin</p> -<p> -These settings can be made in the JDiff options panel, Plugins -> Plugin Options... -> JDiff Plugin -</p> - <h3>Line comparison options</h3> +<h3>Line comparison options</h3> - <p>You can configure how JDiff compares lines by default. JDiff can:</p> +<p>You can configure how JDiff compares lines by default. JDiff +can:</p> - <ul> - <li><p> - Ignore case: upper-cased lines are compared. - </p></li> +<ul> +<li> +<p>Ignore case: upper-cased lines are compared.</p> +</li> - <li><p> - Ignore leading and trailing whitespace: lines are compared as if - leading and trailing whitespaces were removed. - </p></li> +<li> +<p>Ignore leading and trailing whitespace: lines are compared as +if leading and trailing whitespaces were removed.</p> +</li> - <li><p> - Ignore amount of whitespace: lines are compared as if any</p> - <ul> - <li><p>leading and trailing whitespaces were removed</p></li> - <li><p>sequence of whitespaces were replaced by one single space.</p></li> - </ul> - </li> +<li> +<p>Ignore amount of whitespace: lines are compared as if any</p> - <li><p> - Ignore all whitespace: lines are compared as if any - <ul> - <li><p>leading, trailing and inner whitespaces were removed</p></li> - </ul> - </p></li> - </ul> +<ul> +<li> +<p>leading and trailing whitespaces were removed</p> +</li> - <h3>Control layout</h3> - <p> - Automatically display dockable on diff: When starting a new diff from the plugin menu, if on, this setting will cause the diff dockable to be displayed immediately so the merge controls are quickly accessible. - </p> - <p> - Show line diffs in dockable: Toggles display of the line diff in the dockable. Turning this off will reduce the amount of screen space the dockable occupies. - </p> - <p> - Merge control layout<br> - <ul> - <li>Horizontal: default, merge control buttons in a single horizontal line. Best used docked at top or bottom.</li> - <li>Vertical: merge controls in a single vertical line. Best used docked at the left or right. Not a good choice when the line overview is also on.</li> - <li>Compact: merge controls in 2 columns of 4 buttons. Occupies smallest amount of screen space when used with the line overview.</li> - </ul> - </p> - <h3>Overview colors</h3> +<li> +<p>sequence of whitespaces were replaced by one single space.</p> +</li> +</ul> +</li> - <p>You can configure the colors of:</p> +<li> +<p>Ignore all whitespace: lines are compared as if:</p> - <ul> - <li><p>Changed lines</p></li> - <li><p>Deleted lines</p></li> - <li><p>Inserted lines</p></li> - <li><p>Invalid lines</p></li> - <li><p>Left cursor in the global overview</p></li> - <li><p>Right cursor in the global overview</p></li> - </ul> +<ul> +<li> +<p>any leading, trailing and inner whitespaces were removed</p> +</li> +</ul> +</li> +</ul> - <h3>Highlight colors</h3> +<h3>Control layout</h3> - <p>You can configure the colors of:</p> +<p>Automatically display dockable on diff: When starting a new +diff from the plugin menu, if on, this setting will cause the +diff dockable to be displayed immediately so the merge controls +are quickly accessible.</p> - <ul> - <li><p>Changed lines</p></li> - <li><p>Deleted lines</p></li> - <li><p>Inserted lines</p></li> - <li><p>Invalid lines</p></li> - </ul> +<p>Show line diffs in dockable: Toggles display of the line diff +in the dockable. Turning this off will reduce the amount of +screen space the dockable occupies.</p> +<p>Merge control layout</p> + +<ul> +<li>Horizontal: default, merge control buttons in a single +horizontal line. Best used docked at top or bottom.</li> + +<li>Vertical: merge controls in a single vertical line. Best used +docked at the left or right. Not a good choice when the line +overview is also on.</li> + +<li>Compact: merge controls in 2 columns of 4 buttons. Occupies +smallest amount of screen space when used with the line +overview.</li> +</ul> + +<h3>Overview colors</h3> + +<p>You can configure the colors of:</p> + +<ul> +<li> +<p>Changed lines</p> +</li> + +<li> +<p>Deleted lines</p> +</li> + +<li> +<p>Inserted lines</p> +</li> + +<li> +<p>Invalid lines</p> +</li> + +<li> +<p>Left cursor in the global overview</p> +</li> + +<li> +<p>Right cursor in the global overview</p> +</li> +</ul> + +<h3>Highlight colors</h3> + +<p>You can configure the colors of:</p> + +<ul> +<li> +<p>Changed lines</p> +</li> + +<li> +<p>Deleted lines</p> +</li> + +<li> +<p>Inserted lines</p> +</li> + +<li> +<p>Invalid lines</p> +</li> +</ul> + <hr> +<a name="license"> +<h3>License</h3> -<a name="license"> - <h3>License</h3> +<p>The source code is distributed under the GPL. Please see <a +href= +"http://www.fsf.org/copyleft/gpl.html">http://www.fsf.org/copyleft/gpl.html</a></p> - <p> - The source code is distributed under the GPL. - Please see - <ulink url="http://www.fsf.org/copyleft/gpl.html"> - http://www.fsf.org/copyleft/gpl.html - </ulink> - </p> <hr> +<a name="feedback"> +<h3>Feedback</h3> -<a name="feedback"> - <h3>Feedback</h3> +<p>The preferred way to send bug reports is to use the +Sourceforge Bug Tracker at <a href= +"http://sourceforge.net/bugs/?group_id=588">http://sourceforge.net/bugs/?group_id=588</a></p> - <p> - The preferred way to send bug reports is to use the - Sourceforge Bug Tracker at - <a href="http://sourceforge.net/bugs/?group_id=588"> - http://sourceforge.net/bugs/?group_id=588 - </a> - </p> +<p>You can also write to:</p> - <p>You can also write to:</p> - <ul> - <li><p> - jEdit-users mailing-list - <a href="mailto:jed...@li...">jed...@li...</a> </p> - </li> +<ul> +<li> +<p>jEdit-users mailing-list <a href= +"mailto:jed...@li...">jed...@li...</a></p> +</li> - <li><p> - or jEdit-devel mailing-list - <a href="mailto:jed...@li...">mailto:jed...@li...</a> </p> - </li> - </ul> +<li> +<p>or jEdit-devel mailing-list <a href= +"mailto:jed...@li...">mailto:jed...@li...</a></p> +</li> +</ul> + <hr> +<a name="history"> -<a name="history"> - <h3>History</h3> +<h3>History</h3> - <ul> - <li><p> Version 1.8. Bug fixes, added "Diff" and "Refresh" buttons to merge controls, major code refactoring to clean up the various painting issues. - <li><p> Version 1.7. Added a dockable to display line diff and merge controls. Added merge functionality, added mouse listener to global overview. (Dale Anson) </p> - </li> +<ul> +<li> +<p>Version 1.8. Bug fixes, added "Diff" and "Refresh" buttons to +merge controls, major code refactoring to clean up the various +painting issues.</p> +</li> - <li><p> Version 1.5.2. Fixes to ignore whitespace options (1522563 - aconnor78) </p></li> - <li><p> - Version 1.5, updated to work with jEdit 4.3pre3+ - </p></li> - <li> <p> - Version 1.4. Updated to work with jEdit v4.2+, including edits for new - JEditTextArea handling and new plugin API. </p> - </li> +<li> +<p>Version 1.7. Added a dockable to display line diff and merge +controls. Added merge functionality, added mouse listener to +global overview. (Dale Anson)</p> +</li> - <li><p> - Version 1.3.2. Last pre-jEdit v4.2 version of plugin by André. </p> - </li> - </ul> +<li> +<p>Version 1.5.2. Fixes to ignore whitespace options (1522563 - +aconnor78)</p> +</li> + +<li> +<p>Version 1.5, updated to work with jEdit 4.3pre3+</p> +</li> + +<li> +<p>Version 1.4. Updated to work with jEdit v4.2+, including edits +for new JEditTextArea handling and new plugin API.</p> +</li> + +<li> +<p>Version 1.3.2. Last pre-jEdit v4.2 version of plugin by +Andr??.</p> +</li> +</ul> + <hr> +<a name="credits"> -<a name="credits"> - <h3>Credits</h3> +<h3>Credits</h3> - <ul> - <li><p> - Stuart D. Gathman ported the GNU diff algorithm to Java. - See - <a href="http://www.bmsi.com/java/"> - http://www.bmsi.com/java/ - </a></p> - </li> +<ul> +<li> +<p>Stuart D. Gathman ported the GNU diff algorithm to Java. See +<a href= +"http://www.bmsi.com/java/">http://www.bmsi.com/java/</a></p> +</li> - <li><p> - Some code and ideas borrowed from JDiff by - Mike Dillon (md...@je...). - See <a href="http://sourceforge.net/projects/jdiff"> - http://sourceforge.net/projects/jdiff - </a> </p> - </li> - </ul> - +<li> +<p>Some code and ideas borrowed from JDiff by Mike Dillon +(md...@je...). See <a href= +"http://sourceforge.net/projects/jdiff">http://sourceforge.net/projects/jdiff</a></p> +</li> +</ul> </body> </html> + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |