From: <dal...@us...> - 2008-02-15 04:14:17
|
Revision: 11799 http://jedit.svn.sourceforge.net/jedit/?rev=11799&view=rev Author: daleanson Date: 2008-02-14 20:14:13 -0800 (Thu, 14 Feb 2008) Log Message: ----------- continuing to refactor to MVC. contains fix for item #4 of 1891865. buttons are smaller, diff dockable works correctly when undocked, when docked doesn't automatically open on diff. separated merge controls from line view so they are separate components. Modified Paths: -------------- plugins/JDiffPlugin/trunk/jdiff/DualDiff.java plugins/JDiffPlugin/trunk/jdiff/component/DiffLineModel.java plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java Added Paths: ----------- plugins/JDiffPlugin/trunk/jdiff/component/LineRendererPane.java plugins/JDiffPlugin/trunk/jdiff/component/SquareButton.java plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicLineRendererPaneUI.java plugins/JDiffPlugin/trunk/jdiff/component/ui/LineRendererPaneUI.java Modified: plugins/JDiffPlugin/trunk/jdiff/DualDiff.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-02-15 01:00:14 UTC (rev 11798) +++ plugins/JDiffPlugin/trunk/jdiff/DualDiff.java 2008-02-15 04:14:13 UTC (rev 11799) @@ -34,8 +34,6 @@ 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; @@ -60,7 +58,6 @@ 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; @@ -109,8 +106,6 @@ private Box box0; - private Box box1; - private final ScrollHandler scrollHandler = new ScrollHandler(); private DiffLineOverview diffLineOverview; @@ -145,6 +140,10 @@ return view; } + public Diff.Change getEdits() { + return edits; + } + public void handleMessage( EBMessage message ) { if ( message instanceof BufferUpdate ) { BufferUpdate bu = ( BufferUpdate ) message; @@ -166,13 +165,13 @@ return ; } if ( epu.getWhat() == EditPaneUpdate.CREATED ) { - DualDiff.editPaneCreated( view, editPane ); + DualDiff.editPaneCreated( view ); } else if ( epu.getWhat() == EditPaneUpdate.DESTROYED ) { DualDiff.editPaneDestroyed( view, editPane ); } else if ( epu.getWhat() == EditPaneUpdate.BUFFER_CHANGED ) { - DualDiff.editPaneBufferChanged( view, editPane ); + DualDiff.editPaneBufferChanged( view ); } } } @@ -240,10 +239,6 @@ if ( !buf0.isLoaded() || !buf1.isLoaded() ) { this.edits = null; - - int lineCount0 = ( ( buf0.isLoaded() ) ? buf0.getLineCount() : 1 ); - int lineCount1 = ( ( buf1.isLoaded() ) ? buf1.getLineCount() : 1 ); - this.diffOverview0 = new DiffLocalOverview( DualDiff.this ); this.diffOverview1 = new DiffGlobalPhysicalOverview( DualDiff.this ); } @@ -253,10 +248,6 @@ Diff d = new Diff( fileLines0, fileLines1 ); this.edits = d.diff_2( false ); - - int lineCount0 = fileLines0.length; - int lineCount1 = fileLines1.length; - this.diffOverview0 = new DiffLocalOverview( DualDiff.this ); this.diffOverview1 = new DiffGlobalPhysicalOverview( DualDiff.this ); } @@ -287,15 +278,6 @@ 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(); } @@ -356,21 +338,17 @@ private void addHandlers() { this.textArea0.addScrollListener( this.scrollHandler ); this.textArea0.addFocusListener( this.scrollHandler ); - this.textArea0.addCaretListener( this.scrollHandler ); this.textArea1.addScrollListener( this.scrollHandler ); this.textArea1.addFocusListener( this.scrollHandler ); - this.textArea1.addCaretListener( this.scrollHandler ); } private void removeHandlers() { this.textArea0.removeScrollListener( this.scrollHandler ); this.textArea0.removeFocusListener( this.scrollHandler ); - this.textArea0.removeCaretListener( this.scrollHandler ); this.textArea1.removeScrollListener( this.scrollHandler ); this.textArea1.removeFocusListener( this.scrollHandler ); - this.textArea1.removeCaretListener( this.scrollHandler ); } private FileLine[] getFileLines( Buffer buffer ) { @@ -493,7 +471,7 @@ return ( dualDiffs.get( view ) != null ); } - private static void editPaneCreated( View view, EditPane editPane ) { + private static void editPaneCreated( View view ) { DualDiff.removeFrom( view ); } @@ -502,7 +480,7 @@ DiffHighlight.removeHighlightFrom( editPane ); } - private static void editPaneBufferChanged( View view, EditPane editPane ) { + private static void editPaneBufferChanged( View view ) { DualDiff.refreshFor( view ); } @@ -535,7 +513,9 @@ if ( dwm.getDockableWindow( "jdiff-lines" ) == null ) { dwm.addDockableWindow( "jdiff-lines" ); } + /* TODO: make this a property setting? dwm.showDockableWindow( "jdiff-lines" ); + */ } } @@ -954,8 +934,7 @@ } } - private class ScrollHandler implements ScrollListener, CaretListener, FocusListener, - MouseListener { + private class ScrollHandler implements ScrollListener, FocusListener, MouseListener { private Runnable syncWithRightVert = new Runnable() { public void run() { DualDiff.this.diffOverview0.repaint(); @@ -988,76 +967,7 @@ } }; - LineProcessorRunner runner = new LineProcessorRunner(); - public void caretUpdate( final CaretEvent e ) { - if ( diffLineOverview != null ) { - JEditTextArea source = ( JEditTextArea ) e.getSource(); - int caretLine = source.getCaretLine(); - 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.diffLineOverview.processLines( leftLine, rightLine ); - } - } - public void scrolledHorizontally( TextArea textArea ) { // Log.log(Log.DEBUG, this, "**** Adjustment " + e); @@ -1082,9 +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" ); } + */ } public void focusLost( FocusEvent e ) { Modified: plugins/JDiffPlugin/trunk/jdiff/component/DiffLineModel.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/DiffLineModel.java 2008-02-15 01:00:14 UTC (rev 11798) +++ plugins/JDiffPlugin/trunk/jdiff/component/DiffLineModel.java 2008-02-15 04:14:13 UTC (rev 11799) @@ -43,6 +43,10 @@ prepData(); } + public String toString() { + return new StringBuffer().append("DiffLineModel[left[").append(leftLine).append("], right[").append(rightLine).append("]]").toString(); + } + public List<Character> getLeftCharacters() { return leftCharacters; } Added: plugins/JDiffPlugin/trunk/jdiff/component/LineRendererPane.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/LineRendererPane.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/LineRendererPane.java 2008-02-15 04:14:13 UTC (rev 11799) @@ -0,0 +1,268 @@ +/* +* 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.util.HashSet; +import java.util.Set; + +import javax.swing.*; +import javax.swing.event.CaretListener; +import javax.swing.event.CaretEvent; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import jdiff.DualDiff; +import jdiff.component.ui.*; +import jdiff.util.Diff; + +import org.gjt.sp.jedit.EditBus; +import org.gjt.sp.jedit.EditPane; +import org.gjt.sp.jedit.View; +import org.gjt.sp.jedit.EBComponent; +import org.gjt.sp.jedit.EBMessage; +import org.gjt.sp.jedit.msg.*; +import org.gjt.sp.jedit.textarea.JEditTextArea; + +/** + * Component to show the merge controls. + * Implements EBComponent to know about when the View splits and unsplits so + * the buttons can be enabled or disabled accordingly. + */ +public class LineRendererPane extends JComponent implements EBComponent, CaretListener { + + private static final String uiClassID = "LineRendererPaneUI"; + + private View view = null; + private DiffLineModel diffLineModel = null; + private LineProcessorRunner runner = new LineProcessorRunner(); + + private Set<ChangeListener> changeListeners = new HashSet<ChangeListener>(); + + /** + * @param view the parent frame + */ + public LineRendererPane( View view ) { + if ( view == null ) { + throw new IllegalArgumentException( "view cannot be null" ); + } + this.view = view; + this.updateUI(); + EditBus.addToBus(this); + } + + public void setUI( LineRendererPaneUI ui ) { + super.setUI( ui ); + } + + public void updateUI() { + if ( UIManager.get( getUIClassID() ) != null ) { + setUI( ( LineRendererPaneUI ) UIManager.getUI( this ) ); + } + else { + setUI( new BasicLineRendererPaneUI() ); + } + fireStateChanged(); + } + + public LineRendererPaneUI getUI() { + return ( LineRendererPaneUI ) 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; + } + + public void setModel( DiffLineModel model ) { + diffLineModel = model; + fireStateChanged(); + } + + public DiffLineModel getModel() { + return diffLineModel; + } + + @Override + public Color getBackground() { + return view.getEditPane().getTextArea().getPainter().getBackground(); + } + + @Override + public Font getFont() { + return view.getEditPane().getTextArea().getPainter().getFont(); + } + + public void clear() { + setModel( null ); + } + + public void reset() { + fireStateChanged(); + } + + public void handleMessage( EBMessage message ) { + if ( message instanceof EditPaneUpdate ) { + EditPaneUpdate epu = ( EditPaneUpdate ) message; + if ( epu.getWhat() == EditPaneUpdate.DESTROYED ) { + fireStateChanged(); + } + } + else if ( message instanceof ViewUpdate ) { + fireStateChanged(); + } + maybeAddCaretListeners(); + } + + /** + * Adds or removes caret listeners as appropriate. + */ + private void maybeAddCaretListeners() { + if ( view == null ) { + return ; + } + for ( EditPane ep : view.getEditPanes() ) { + ep.getTextArea().removeCaretListener( this ); + } + if ( view.getEditPanes().length == 2 ) { + view.getEditPanes() [ 0 ].getTextArea().addCaretListener( this ); + view.getEditPanes() [ 1 ].getTextArea().addCaretListener( this ); + } + } + + public void caretUpdate( final CaretEvent e ) { + if ( e.getSource() instanceof JEditTextArea ) { + JEditTextArea source = ( JEditTextArea ) e.getSource(); + runner.setSource( source ); + SwingUtilities.invokeLater( runner ); + } + } + + /** + * Builds the line diff model. + */ + class LineProcessorRunner implements Runnable { + JEditTextArea source = null; + public void setSource( JEditTextArea source ) { + this.source = source; + } + public void run() { + if ( source == null ) { + LineRendererPane.this.setModel(null); + return ; + } + DualDiff dualDiff = DualDiff.getDualDiffFor( LineRendererPane.this.view ); + if ( dualDiff == null ) { + LineRendererPane.this.setModel(null); + return ; + } + Diff.Change hunk = dualDiff.getEdits(); + if ( hunk == null ) { + LineRendererPane.this.setModel(null); + return ; + } + + JEditTextArea textArea0 = LineRendererPane.this.view.getEditPanes() [ 0 ].getTextArea(); + JEditTextArea textArea1 = LineRendererPane.this.view.getEditPanes() [ 1 ].getTextArea(); + String leftLine = ""; + String rightLine = ""; + if ( source == textArea0 ) { + 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 = ""; + } + else { + leftLine = textArea0.getLineText( caretLine ); + } + int offset = caretLine - hunk.line0; + if ( offset < hunk.inserted ) { + rightLine = textArea1.getLineText( hunk.line1 + offset ); + } + else { + rightLine = ""; + } + break ; + } + } + } + else { + 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 = ""; + } + else { + rightLine = textArea1.getLineText( caretLine ); + } + int offset = caretLine - hunk.line1; + if ( offset < hunk.deleted ) { + leftLine = textArea0.getLineText( hunk.line0 + offset ); + } + else { + leftLine = ""; + } + break ; + } + } + } + if ((leftLine.equals("") && rightLine.equals("")) || leftLine.equals(rightLine)) { + LineRendererPane.this.setModel(null); + } + else { + LineRendererPane.this.setModel( new DiffLineModel( leftLine, rightLine ) ); + } + } + } + +} Modified: plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java 2008-02-15 01:00:14 UTC (rev 11798) +++ plugins/JDiffPlugin/trunk/jdiff/component/MergeToolBar.java 2008-02-15 04:14:13 UTC (rev 11799) @@ -1,26 +1,24 @@ /* - * 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. - */ +* 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; @@ -28,18 +26,21 @@ 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.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. + * Implements EBComponent to know about when the View splits and unsplits so + * the buttons can be enabled or disabled accordingly. */ -public class MergeToolBar extends JComponent { +public class MergeToolBar extends JComponent implements EBComponent { private static final String uiClassID = "MergeToolBarUI"; @@ -53,6 +54,7 @@ public MergeToolBar( View view ) { this.view = view; this.updateUI(); + EditBus.addToBus( this ); } public void setUI( MergeToolBarUI ui ) { @@ -77,23 +79,27 @@ return uiClassID; } - public void addChangeListener(ChangeListener cl) { - if (cl != null) { - changeListeners.add(cl); + public void removeNotify() { + EditBus.removeFromBus( this ); + } + + public void addChangeListener( ChangeListener cl ) { + if ( cl != null ) { + changeListeners.add( cl ); } } - public void removeChangeListener(ChangeListener cl) { - if (cl != null) { - changeListeners.remove(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); + if ( changeListeners.size() > 0 ) { + ChangeEvent event = new ChangeEvent( this ); + for ( ChangeListener cl : changeListeners ) { + cl.stateChanged( event ); } } } @@ -105,4 +111,15 @@ return view; } + public void handleMessage( EBMessage message ) { + if ( message instanceof EditPaneUpdate ) { + EditPaneUpdate epu = ( EditPaneUpdate ) message; + if ( epu.getWhat() == EditPaneUpdate.DESTROYED ) { + fireStateChanged(); + } + } + else if ( message instanceof ViewUpdate ) { + fireStateChanged(); + } + } } Added: plugins/JDiffPlugin/trunk/jdiff/component/SquareButton.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/SquareButton.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/SquareButton.java 2008-02-15 04:14:13 UTC (rev 11799) @@ -0,0 +1,40 @@ +/* +* 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.Dimension; +import javax.swing.Icon; +import javax.swing.JButton; + +public class SquareButton extends JButton { + private Dimension size = new Dimension(30, 30); + + public SquareButton(Icon icon) { + super(icon); + } + public Dimension getPreferredSize() { + return size; + } + public Dimension getMinimumSize() { + return size; + } + public Dimension getMaximumSize() { + return size; + } +} Modified: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java 2008-02-15 01:00:14 UTC (rev 11798) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicDiffLineOverviewUI.java 2008-02-15 04:14:13 UTC (rev 11799) @@ -91,7 +91,7 @@ public void installComponents() { mergeToolBar = new MergeToolBar(diffLineOverview.getView()); diffLineOverview.add( mergeToolBar, BorderLayout.NORTH ); - lineRendererPane = new LineRendererPane( ); + lineRendererPane = new LineRendererPane( diffLineOverview.getView() ); diffLineOverview.add( lineRendererPane, BorderLayout.CENTER ); } @@ -99,7 +99,6 @@ * Install any action listeners, mouse listeners, etc. */ public void installListeners() { - diffLineOverview.addChangeListener( this ); } /** @@ -145,111 +144,4 @@ protected LayoutManager createLayoutManager() { return new BorderLayout(); } - - /** - * Panel to display line differences. A single line from the left text area is - * show directly above the corresponding line from the right text area. Both - * lines are color coded to highlight any differences between them, which makes - * it easy to spot differences. - */ - public class LineRendererPane extends JPanel { - - private int leftMargin = 6; - - public LineRendererPane( ) { - setBorder( BorderFactory.createLineBorder( Color.black ) ); - } - - /** - * @return 600 x 100 - */ - public Dimension getPreferredSize() { - return new Dimension( 600, 100 ); - } - - public void paintComponent( Graphics gfx ) { - - // 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" ) ) ) { - ( ( java.awt.Graphics2D ) gfx ).setRenderingHint( - java.awt.RenderingHints.KEY_TEXT_ANTIALIASING, - java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON - ); - } - 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 - 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/BasicLineRendererPaneUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicLineRendererPaneUI.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicLineRendererPaneUI.java 2008-02-15 04:14:13 UTC (rev 11799) @@ -0,0 +1,256 @@ +/* +* 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.plaf.ComponentUI; + +import org.gjt.sp.jedit.jEdit; +import jdiff.component.*; + +public class BasicLineRendererPaneUI extends DiffLineOverviewUI implements ChangeListener { + + private LineRendererPane lineRendererPane = null; + private DiffLineModel model; + private LineRenderer lineRenderer = null; + + /** + * Required by super class. + * @param c not used + * @return one of these + */ + public static ComponentUI createUI( JComponent c ) { + return new BasicLineRendererPaneUI(); + } + + /** + * 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 ) { + lineRendererPane = ( LineRendererPane ) c; + + installDefaults(); + installComponents(); + installListeners(); + } + + /** + * Install default values for colors, fonts, borders, etc. + */ + public void installDefaults() { + lineRendererPane.setLayout( createLayoutManager() ); + lineRendererPane.setBorder( new EmptyBorder( 1, 1, 1, 1 ) ); + } + + /** + * Create and install any sub-components. + */ + public void installComponents() { + lineRenderer = new LineRenderer( ); + lineRendererPane.add( lineRenderer, BorderLayout.CENTER ); + } + + /** + * Install any action listeners, mouse listeners, etc. + */ + public void installListeners() { + lineRendererPane.addChangeListener( this ); + } + + /** + * Tear down and clean up. + */ + public void uninstallUI( JComponent c ) { + c.setLayout( null ); + uninstallListeners(); + uninstallComponents(); + uninstallDefaults(); + + lineRendererPane = null; + } + + /** + * Tear down and clean up. + */ + public void uninstallDefaults() {} + + /** + * Tear down and clean up. + */ + public void uninstallComponents() { + lineRenderer = null; + } + + /** + * Tear down and clean up. + */ + public void uninstallListeners() { + lineRendererPane.removeChangeListener( this ); + } + + public void stateChanged( ChangeEvent event ) { + // paint lines or clear, depends on the view and the model. + lineRenderer.repaint(); + } + + /** + * @return a BorderLayout + */ + protected LayoutManager createLayoutManager() { + return new BorderLayout(); + } + + /** + * Panel to display line differences. A single line from the left text area is + * show directly above the corresponding line from the right text area. Both + * lines are color coded to highlight any differences between them, which makes + * it easy to spot differences. + */ + public class LineRenderer extends JPanel { + + private int leftMargin = 6; + + public LineRenderer( ) { + setBorder( BorderFactory.createLineBorder( Color.black ) ); + } + + /** + * @return 600 x 100 + */ + public Dimension getPreferredSize() { + return new Dimension( 600, 100 ); + } + + private boolean isSplit() { + if ( lineRendererPane.getView() == null ) { + return false; + } + return lineRendererPane.getView().getEditPanes().length == 2; + } + + public void paintComponent( Graphics gfx ) { + + // 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" ) ) ) { + ( ( java.awt.Graphics2D ) gfx ).setRenderingHint( + java.awt.RenderingHints.KEY_TEXT_ANTIALIASING, + java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON + ); + } + super.paintComponent( gfx ); + + // clear the display area + Rectangle all = getBounds(); + gfx.setColor( lineRendererPane.getBackground() ); + gfx.fillRect( 0, 0, all.width, all.height ); + + if ( !isSplit() ) { + return ; + } + + model = lineRendererPane.getModel(); + if ( model == null ) { + return ; + } + String leftLine = model.getLeftLine(); + String rightLine = model.getRightLine(); + + // set up the font + Font font = lineRendererPane.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 + 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 ); + } + } +} Modified: plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java 2008-02-15 01:00:14 UTC (rev 11798) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/BasicMergeToolBarUI.java 2008-02-15 04:14:13 UTC (rev 11799) @@ -23,9 +23,7 @@ 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; @@ -33,10 +31,12 @@ import org.gjt.sp.jedit.GUIUtilities; import org.gjt.sp.jedit.View; import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.msg.*; + import jdiff.DualDiff; import jdiff.component.*; -public class BasicMergeToolBarUI extends MergeToolBarUI { +public class BasicMergeToolBarUI extends MergeToolBarUI implements ChangeListener { private MergeToolBar toolbar; private View view; @@ -98,18 +98,25 @@ * 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" ) ); + diff = new SquareButton( new ImageIcon( BasicMergeToolBarUI.class.getClassLoader().getResource( "jdiff/component/resources/delta.png" ) ) ); + next = new SquareButton( GUIUtilities.loadIcon( "ArrowD.png" ) ); + prev = new SquareButton( GUIUtilities.loadIcon( "ArrowU.png" ) ); + move_right = new SquareButton( GUIUtilities.loadIcon( "ArrowR.png" ) ); + move_left = new SquareButton( GUIUtilities.loadIcon( "ArrowL.png" ) ); + unsplit = new SquareButton( GUIUtilities.loadIcon( "UnSplit.png" ) ); + swap = new SquareButton( GUIUtilities.loadIcon( "SplitVertical.png" ) ); + refresh = new SquareButton( GUIUtilities.loadIcon( "Reload.png" ) ); + diff.setEnabled( true ); + next.setEnabled( false ); + prev.setEnabled( false ); + move_right.setEnabled( false ); + move_left.setEnabled( false ); + unsplit.setEnabled( false ); + swap.setEnabled( false ); + refresh.setEnabled( false ); + // tooltips diff.setToolTipText( jEdit.getProperty( "jdiff.diff-btn.label", "Diff" ) ); next.setToolTipText( jEdit.getProperty( "jdiff.next-diff.label", "Go to next diff" ) ); @@ -120,6 +127,7 @@ 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 ); @@ -127,13 +135,15 @@ toolbar.add( move_left ); toolbar.add( prev ); toolbar.add( swap ); - toolbar.add( refresh); + toolbar.add( refresh ); } /** * Install any action listeners, mouse listeners, etc. */ public void installListeners() { + //EditBus.addToBus( this ); + toolbar.addChangeListener(this); move_left.addActionListener( new ActionListener() { @@ -239,20 +249,43 @@ /** * Tear down and clean up. */ - public void uninstallComponents() { - } + public void uninstallComponents() {} /** * Tear down and clean up. */ public void uninstallListeners() { + toolbar.removeChangeListener(this); } /** * @return a BorderLayout */ protected LayoutManager createLayoutManager() { - return new GridLayout(1, 8, 2, 2); + return new FlowLayout( FlowLayout.CENTER ); } + public void stateChanged(ChangeEvent event) { + adjustButtons(); + } + + private void adjustButtons( ) { + // adjust buttons + SwingUtilities.invokeLater( new Runnable() { + public void run() { + boolean enabled = BasicMergeToolBarUI.this.view.getEditPanes().length == 2; + diff.setEnabled( !enabled ); + next.setEnabled( enabled ); + prev.setEnabled( enabled ); + move_right.setEnabled( enabled ); + move_left.setEnabled( enabled ); + unsplit.setEnabled( enabled ); + swap.setEnabled( enabled ); + refresh.setEnabled( enabled ); + BasicMergeToolBarUI.this.toolbar.repaint(); + } + } + ); + } + } Added: plugins/JDiffPlugin/trunk/jdiff/component/ui/LineRendererPaneUI.java =================================================================== --- plugins/JDiffPlugin/trunk/jdiff/component/ui/LineRendererPaneUI.java (rev 0) +++ plugins/JDiffPlugin/trunk/jdiff/component/ui/LineRendererPaneUI.java 2008-02-15 04:14:13 UTC (rev 11799) @@ -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 LineRendererPaneUI extends ComponentUI { +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |