/* * (c) Copyright 2010-2011 AgileBirds * * This file is part of OpenFlexo. * * OpenFlexo 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 3 of the License, or * (at your option) any later version. * * OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>. * */ package org.openflexo.swing.merge; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.AdjustmentEvent; import java.awt.event.AdjustmentListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Hashtable; import java.util.Observable; import java.util.Observer; import java.util.Vector; import javax.swing.AbstractAction; import javax.swing.AbstractListModel; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultListCellRenderer; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JCheckBoxMenuItem; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.ScrollPaneConstants; import javax.swing.SwingUtilities; import javax.swing.border.EtchedBorder; import javax.swing.border.LineBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.openflexo.diff.merge.DetailedMerge; import org.openflexo.diff.merge.IMerge; import org.openflexo.diff.merge.MergeChange; import org.openflexo.diff.merge.MergeChange.MergeChangeAction; import org.openflexo.diff.merge.MergeChange.MergeChangeSource; import org.openflexo.icon.UtilsIconLibrary; import org.openflexo.toolbox.TokenMarkerStyle; public class MergePanelElements implements Observer { IMerge _merge; MergeTextArea _leftTextArea; MergeTextArea _rightTextArea; FilterChangeList _changeListPanel; private ListSelectionListener lsl; ComparePanel comparePanel; // JList changesList; JScrollPane _mergePanel; TokenMarkerStyle style; public MergePanelElements(IMerge merge) { this(merge, null, null); } public MergePanelElements(IMerge merge, TokenMarkerStyle style) { this(merge, style, null); } public MergePanelElements(IMerge merge, TokenMarkerStyle style, String noChangeLabel) { super(); _merge = merge; _merge.addObserver(this); this.style = style; _changeListPanel = new FilterChangeList(noChangeLabel); // if (_merge.getChanges().size() > 0) { // changesList = new JList(_merge.getChanges()); // changesList.setVisibleRowCount(5); // changesList.setCellRenderer(new DefaultListCellRenderer(){ // public Component getListCellRendererComponent( // JList list, // Object value, // int index, // boolean isSelected, // boolean cellHasFocus) // { // JLabel returned = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); // returned.setIcon(iconForChange((MergeChange)value)); // returned.setText(((MergeChange)value).toString()); // return returned; // } // }); // changesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // lsl = new ListSelectionListener() { // public void valueChanged(ListSelectionEvent e) { // selectChange((MergeChange)changesList.getSelectedValue()); // } // }; // changesList.addListSelectionListener(lsl); // changesList.addMouseListener(new MouseAdapter() { // public void mousePressed(MouseEvent mouseEvent) // { // if (mouseEvent.isPopupTrigger() // && changesList.getSelectedValue() != null // && changesList.getSelectedValue() instanceof MergeChange // && ((MergeChange)changesList.getSelectedValue()).getMergeChangeSource() == MergeChangeSource.Conflict) // comparePanel._buttonForChanges.get(changesList.getSelectedValue()).getPopupMenu().show(mouseEvent.getComponent(), // mouseEvent.getX()+10, mouseEvent.getY()); // } // public void mouseReleased(MouseEvent mouseEvent) // { // if (mouseEvent.isPopupTrigger() // && changesList.getSelectedValue() != null // && changesList.getSelectedValue() instanceof MergeChange // && ((MergeChange)changesList.getSelectedValue()).getMergeChangeSource() == MergeChangeSource.Conflict) // comparePanel._buttonForChanges.get(changesList.getSelectedValue()).getPopupMenu().show(mouseEvent.getComponent(), // mouseEvent.getX()+10, mouseEvent.getY()); // } // // }); // // } // else { // Object[] obj = {noChangeLabel}; // changesList = new JList(obj); // changesList.setEnabled(false); // } _leftTextArea = new MergeTextArea(merge.getLeftSource(), merge, MergeTextArea.Side.Left, style); _rightTextArea = new MergeTextArea(merge.getRightSource(), merge, MergeTextArea.Side.Right, style); _mergeTextArea = new MergeTextArea(merge.getMergedSource(), merge, MergeTextArea.Side.Merge, style); JPanel _insideMergePanel = new JPanel(new BorderLayout()); _insideMergePanel.add(_mergeTextArea.getLinesTA(), BorderLayout.WEST); _insideMergePanel.add(_mergeTextArea.getPainter(), BorderLayout.CENTER); _mergePanel = new JScrollPane(_insideMergePanel); _mergeTextArea.validate(); comparePanel = new ComparePanel(); comparePanel._scrollPane.getVerticalScrollBar().addAdjustmentListener(mergePanelSBAdjustementListener = new AdjustmentListener() { @Override public void adjustmentValueChanged(AdjustmentEvent e) { // (new Exception()).printStackTrace(); _mergePanel.getVerticalScrollBar().removeAdjustmentListener(comparePanelSBAdjustementListener); _mergePanel.getVerticalScrollBar().setValue(e.getValue()); _mergePanel.getVerticalScrollBar().addAdjustmentListener(comparePanelSBAdjustementListener); } }); _mergePanel.getVerticalScrollBar().addAdjustmentListener(comparePanelSBAdjustementListener = new AdjustmentListener() { @Override public void adjustmentValueChanged(AdjustmentEvent e) { // (new Exception()).printStackTrace(); comparePanel._scrollPane.getVerticalScrollBar().removeAdjustmentListener(mergePanelSBAdjustementListener); comparePanel._scrollPane.getVerticalScrollBar().setValue(e.getValue()); comparePanel._scrollPane.getVerticalScrollBar().addAdjustmentListener(mergePanelSBAdjustementListener); } }); _mergePanel.getVerticalScrollBar().setUnitIncrement(10); _mergePanel.getVerticalScrollBar().setBlockIncrement(50); comparePanel._scrollPane.getVerticalScrollBar().setUnitIncrement(10); comparePanel._scrollPane.getVerticalScrollBar().setBlockIncrement(50); _controlPanel = new JPanel(new FlowLayout()); /*_controlPanel.add(_chooseButton = new JButton("Choose")); _chooseButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (getSelectedMergeChange() != null) { getSelectedMergeChange().setMergeChangeAction(MergeChangeAction.Choose); updateAfterMergeChangeActionChanging(); } } });*/ _controlPanel.add(_chooseButton = new JButton()); /*_controlPanel.add(_ignoreButton = new JButton("Ignore")); _ignoreButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (getSelectedMergeChange() != null) { getSelectedMergeChange().setMergeChangeAction(MergeChangeAction.Ignore); updateAfterMergeChangeActionChanging(); } } });*/ _controlPanel.add(_ignoreButton = new JButton()); /*_controlPanel.add(_chooseLeftButton = new JButton("Choose left")); _chooseLeftButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (getSelectedMergeChange() != null) { getSelectedMergeChange().setMergeChangeAction(MergeChangeAction.ChooseLeft); updateAfterMergeChangeActionChanging(); } } });*/ _controlPanel.add(_chooseLeftButton = new JButton()); /*_controlPanel.add(_chooseRightButton = new JButton("Choose right")); _chooseRightButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (getSelectedMergeChange() != null) { getSelectedMergeChange().setMergeChangeAction(MergeChangeAction.ChooseRight); updateAfterMergeChangeActionChanging(); } } });*/ _controlPanel.add(_chooseRightButton = new JButton()); /*_controlPanel.add(_chooseNoneButton = new JButton("Choose none")); _chooseNoneButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (getSelectedMergeChange() != null) { getSelectedMergeChange().setMergeChangeAction(MergeChangeAction.ChooseNone); updateAfterMergeChangeActionChanging(); } } });*/ _controlPanel.add(_chooseNoneButton = new JButton()); /*_controlPanel.add(_chooseBothLeftFirstButton = new JButton("Choose both left first")); _chooseBothLeftFirstButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (getSelectedMergeChange() != null) { getSelectedMergeChange().setMergeChangeAction(MergeChangeAction.ChooseBothLeftFirst); updateAfterMergeChangeActionChanging(); } } });*/ _controlPanel.add(_chooseBothLeftFirstButton = new JButton()); /*_controlPanel.add(_chooseBothRightFirstButton = new JButton("Choose both right first")); _chooseBothRightFirstButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (getSelectedMergeChange() != null) { getSelectedMergeChange().setMergeChangeAction(MergeChangeAction.ChooseBothRightFirst); updateAfterMergeChangeActionChanging(); } } });*/ _controlPanel.add(_chooseBothRightFirstButton = new JButton()); /*_controlPanel.add(_customEditingButton = new JButton("Choose both right first")); _customEditingButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (getSelectedMergeChange() != null) { getSelectedMergeChange().setMergeChangeAction(MergeChangeAction.ChooseBothRightFirst); updateAfterMergeChangeActionChanging(); } } });*/ _controlPanel.add(_customEditingButton = new JButton()); updateControlPanel(); comparePanel.validate(); _controlPanel.validate(); _mergePanel.validate(); } void updateAfterMergeChangeActionChanging() { // Ensure merged source has been computed _merge.getMergedSource(); _mergeTextArea.update(); _mergePanel.revalidate(); _mergePanel.repaint(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { selectChange(getSelectedMergeChange()); } }); } private JPanel _controlPanel; private JButton _chooseButton; private JButton _ignoreButton; private JButton _chooseLeftButton; private JButton _chooseRightButton; private JButton _chooseNoneButton; private JButton _chooseBothLeftFirstButton; private JButton _chooseBothRightFirstButton; private JButton _customEditingButton; private MergeTextArea _mergeTextArea; AdjustmentListener mergePanelSBAdjustementListener; AdjustmentListener comparePanelSBAdjustementListener; public class ComparePanel extends JPanel { JScrollPane _scrollPane; private JComponent _separator = null; AdjustmentListener leftSBAdjustementListener; AdjustmentListener rightSBAdjustementListener; private JPanel centerPane; private GridBagLayout gridbag; Hashtable<MergeChange, MergeChangeButton> _buttonForChanges; ComparePanel() { super(new BorderLayout()); _buttonForChanges = new Hashtable<MergeChange, MergeChangeButton>(); JComponent separator = getSeparator(); JComponent left = _leftTextArea; JComponent right = _rightTextArea; gridbag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); centerPane = new JPanel(); centerPane.setLayout(gridbag); // c.gridwidth = 1; // c.gridheight = 1; c.weightx = 0.0; c.anchor = GridBagConstraints.NORTHWEST; c.fill = GridBagConstraints.NONE; // c.gridwidth = 1; gridbag.setConstraints(_leftTextArea.getLinesTA(), c); centerPane.add(_leftTextArea.getLinesTA()); c.weightx = 1.0; c.weighty = 1.0; // c.gridwidth = 1; // c.gridheight = 1; c.anchor = GridBagConstraints.WEST; c.fill = GridBagConstraints.BOTH; // c.gridwidth = GridBagConstraints.REMAINDER; gridbag.setConstraints(left, c); centerPane.add(left); // c.gridwidth = 1; // c.gridheight = 1; c.weightx = 0.0; c.anchor = GridBagConstraints.CENTER; c.fill = GridBagConstraints.VERTICAL; // c.gridwidth = 1; gridbag.setConstraints(separator, c); centerPane.add(separator); c.weightx = 1.0; c.weighty = 1.0; // c.gridwidth = 1; // c.gridheight = 1; c.anchor = GridBagConstraints.EAST; c.fill = GridBagConstraints.BOTH; // c.gridwidth = GridBagConstraints.REMAINDER; gridbag.setConstraints(right, c); centerPane.add(right); // c.gridwidth = 1; // c.gridheight = 1; c.weightx = 0.0; c.anchor = GridBagConstraints.NORTHEAST; c.fill = GridBagConstraints.NONE; // c.gridwidth = 1; gridbag.setConstraints(_rightTextArea.getLinesTA(), c); centerPane.add(_rightTextArea.getLinesTA()); add(_scrollPane = new JScrollPane(centerPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER), BorderLayout.CENTER); JPanel scrollBars = new JPanel(new GridLayout(1, 2)); scrollBars.add(_leftTextArea.getHorizontalScrollBar()); scrollBars.add(_rightTextArea.getHorizontalScrollBar()); scrollBars.validate(); add(scrollBars, BorderLayout.SOUTH); validate(); _leftTextArea.getHorizontalScrollBar().addAdjustmentListener(leftSBAdjustementListener = new AdjustmentListener() { @Override public void adjustmentValueChanged(AdjustmentEvent e) { _rightTextArea.getHorizontalScrollBar().removeAdjustmentListener(rightSBAdjustementListener); _rightTextArea.getHorizontalScrollBar().setValue(e.getValue()); _rightTextArea.getHorizontalScrollBar().addAdjustmentListener(rightSBAdjustementListener); } }); _rightTextArea.getHorizontalScrollBar().addAdjustmentListener(rightSBAdjustementListener = new AdjustmentListener() { @Override public void adjustmentValueChanged(AdjustmentEvent e) { _leftTextArea.getHorizontalScrollBar().removeAdjustmentListener(leftSBAdjustementListener); _leftTextArea.getHorizontalScrollBar().setValue(e.getValue()); _leftTextArea.getHorizontalScrollBar().addAdjustmentListener(leftSBAdjustementListener); } }); if (_merge.getChanges().size() > 0) { selectChange(_merge.getChanges().firstElement()); } } void selectChange(MergeChange change) { _leftTextArea.setChange(change, true); _rightTextArea.setChange(change, true); } void update() { getSeparator().removeAll(); buttonsInitialized = false; revalidate(); repaint(); } private JComponent getSeparator() { if (_separator == null) { _separator = new JPanel(); _separator.setLayout(new BoxLayout(_separator, BoxLayout.Y_AXIS)); _separator.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); } return _separator; } protected boolean buttonsInitialized = false; private class SelectChange implements ActionListener { private MergeChange change; SelectChange(MergeChange change) { this.change = change; } @Override public void actionPerformed(ActionEvent e) { MergePanelElements.this.selectChange(change); } } private void updateChangeButtonLocations() { if (!buttonsInitialized) { if (_leftTextArea.readyToDisplay()) { float remainderHeight = _leftTextArea.getPreferredSize().height; for (MergeChange c : _merge.getChanges()) { JButton button = new MergeChangeButton(c); float height = _leftTextArea.heightAboveChange(c, button.getPreferredSize().height); _separator.add(Box.createRigidArea(new Dimension(0, (int) height))); _separator.add(button); remainderHeight -= button.getPreferredSize().height; remainderHeight -= height; } _separator.add(Box.createRigidArea(new Dimension(0, (int) remainderHeight))); validate(); repaint(); buttonsInitialized = true; } else { // Not ready } } } protected class MergeChangeButton extends JButton { private JPopupMenu popupMenu = null; MergeChange change; LineBorder selectedBorder; protected MergeChangeButton(MergeChange c) { super(iconForChange(c)); change = c; _buttonForChanges.put(change, this); addActionListener(new SelectChange(c)); setBorder(BorderFactory.createEmptyBorder(1, 1, 1, _leftTextArea.getVerticalScrollBar().getPreferredSize().width)); addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { setBorder(selectedBorder); // setBorder(BorderFactory.createLineBorder(Color.RED)); } @Override public void mouseExited(MouseEvent e) { setBorder(BorderFactory.createEmptyBorder(1, 1, 1, _leftTextArea.getVerticalScrollBar().getPreferredSize().width)); } @Override public void mousePressed(MouseEvent mouseEvent) { if (mouseEvent.isPopupTrigger()) { getPopupMenu().show(mouseEvent.getComponent(), mouseEvent.getX() + 10, mouseEvent.getY()); } } @Override public void mouseReleased(MouseEvent mouseEvent) { if (mouseEvent.isPopupTrigger()) { getPopupMenu().show(mouseEvent.getComponent(), mouseEvent.getX() + 10, mouseEvent.getY()); } } }); selectedBorder = new LineBorder(Color.RED, 1) { @Override public Insets getBorderInsets(Component c) { Insets returned = super.getBorderInsets(c); returned.right = _leftTextArea.getVerticalScrollBar().getPreferredSize().width; return returned; } @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { Color oldColor = g.getColor(); g.setColor(lineColor); g.drawRect(x, y, width - _leftTextArea.getVerticalScrollBar().getPreferredSize().width, height - 1); g.setColor(oldColor); } }; if (change.getMergeChangeAction() == MergeChangeAction.AutomaticMergeResolving && change.isResolved()) { setToolTipText(change.getAutomaticMergeReason()); } } JPopupMenu getPopupMenu() { if (popupMenu == null) { popupMenu = new JPopupMenu() { @Override public void show(Component invoker, int x, int y) { super.show(invoker, x, y); for (int i = 0; i < getComponentCount(); i++) { if (getComponent(i) instanceof ChangeActionCheckBoxMenuItem) { ChangeActionCheckBoxMenuItem item = (ChangeActionCheckBoxMenuItem) getComponent(i); item.updateState(); } } } }; if (change.getMergeChangeSource() == MergeChangeSource.Left || change.getMergeChangeSource() == MergeChangeSource.Right) { popupMenu.add(new ChangeActionCheckBoxMenuItem(getChangeAction(change, MergeChangeAction.KeepChange))); popupMenu.add(new ChangeActionCheckBoxMenuItem(getChangeAction(change, MergeChangeAction.IgnoreChange))); } else if (change.getMergeChangeSource() == MergeChangeSource.Conflict) { popupMenu.add(new ChangeActionCheckBoxMenuItem(getChangeAction(change, MergeChangeAction.AutomaticMergeResolving))); popupMenu.add(new ChangeActionCheckBoxMenuItem(getChangeAction(change, MergeChangeAction.ChooseLeft))); popupMenu.add(new ChangeActionCheckBoxMenuItem(getChangeAction(change, MergeChangeAction.ChooseRight))); popupMenu.add(new ChangeActionCheckBoxMenuItem(getChangeAction(change, MergeChangeAction.ChooseNone))); popupMenu.add(new ChangeActionCheckBoxMenuItem(getChangeAction(change, MergeChangeAction.ChooseBothLeftFirst))); popupMenu.add(new ChangeActionCheckBoxMenuItem(getChangeAction(change, MergeChangeAction.ChooseBothRightFirst))); popupMenu.add(new ChangeActionCheckBoxMenuItem(getChangeAction(change, MergeChangeAction.CustomEditing))); popupMenu.add(new ChangeActionCheckBoxMenuItem(getChangeAction(change, MergeChangeAction.Undecided))); } if (!(change.getMerge() instanceof DetailedMerge)) { JMenuItem showDetailedAnalysis = new JMenuItem(localizedForKey("detailed_analysis")); showDetailedAnalysis.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { showDetailedMerge(change); } }); popupMenu.addSeparator(); popupMenu.add(showDetailedAnalysis); } } return popupMenu; } } void showDetailedMerge(MergeChange mergeChange) { new DetailedMergeAnalysisPanel(mergeChange.getDetailedMerge()) { @Override protected String localizedForKey(String key) { return MergePanelElements.this.localizedForKey(key); } @Override protected void validateChanges() { super.validateChanges(); updateAfterMergeChangeActionChanging(); } }; } private class ChangeActionCheckBoxMenuItem extends JCheckBoxMenuItem { ChangeActionCheckBoxMenuItem(ChangeAction action) { super(action); updateState(); } @Override public ChangeAction getAction() { return (ChangeAction) super.getAction(); } @Override public boolean isSelected() { if (getAction() != null) { return getAction().mergeChange.getMergeChangeAction() == getAction().mergeChangeAction; } return super.isSelected(); } protected void updateState() { setState(getState()); } } @Override public void paint(Graphics g) { super.paint(g); updateChangeButtonLocations(); } } public void selectChange(MergeChange change) { if ((MergeChange) getFilteredChangeList().getSelectedValue() != change) { getFilteredChangeList().removeListSelectionListener(lsl); getFilteredChangeList().setSelectedValue(change, true); getFilteredChangeList().addListSelectionListener(lsl); } comparePanel.selectChange(change); _mergeTextArea.setChange(change, true); updateControlPanel(); } MergeChange getSelectedMergeChange() { return (MergeChange) getFilteredChangeList().getSelectedValue(); } protected void updateControlPanel() { _controlPanel.remove(_chooseButton); _controlPanel.remove(_ignoreButton); _controlPanel.remove(_chooseLeftButton); _controlPanel.remove(_chooseRightButton); _controlPanel.remove(_chooseNoneButton); _controlPanel.remove(_chooseBothRightFirstButton); _controlPanel.remove(_chooseBothLeftFirstButton); _controlPanel.remove(_customEditingButton); if (getSelectedMergeChange() != null && getSelectedMergeChange().getMergeChangeSource() != MergeChangeSource.Conflict) { _chooseButton.setAction(getChangeAction(getSelectedMergeChange(), MergeChangeAction.KeepChange)); _ignoreButton.setAction(getChangeAction(getSelectedMergeChange(), MergeChangeAction.IgnoreChange)); _controlPanel.add(_ignoreButton, 0); _controlPanel.add(_chooseButton, 0); } else if (getSelectedMergeChange() != null && getSelectedMergeChange().getMergeChangeSource() == MergeChangeSource.Conflict) { _chooseLeftButton.setAction(getChangeAction(getSelectedMergeChange(), MergeChangeAction.ChooseLeft)); _chooseRightButton.setAction(getChangeAction(getSelectedMergeChange(), MergeChangeAction.ChooseRight)); _chooseNoneButton.setAction(getChangeAction(getSelectedMergeChange(), MergeChangeAction.ChooseNone)); _chooseBothLeftFirstButton.setAction(getChangeAction(getSelectedMergeChange(), MergeChangeAction.ChooseBothLeftFirst)); _chooseBothRightFirstButton.setAction(getChangeAction(getSelectedMergeChange(), MergeChangeAction.ChooseBothRightFirst)); _customEditingButton.setAction(getChangeAction(getSelectedMergeChange(), MergeChangeAction.CustomEditing)); _controlPanel.add(_customEditingButton, 0); _controlPanel.add(_chooseBothRightFirstButton, 0); _controlPanel.add(_chooseBothLeftFirstButton, 0); _controlPanel.add(_chooseNoneButton, 0); _controlPanel.add(_chooseRightButton, 0); _controlPanel.add(_chooseLeftButton, 0); } _controlPanel.validate(); _controlPanel.repaint(); /*_chooseButton.setEnabled(getSelectedMergeChange() != null && getSelectedMergeChange().getMergeChangeSource() != MergeChangeSource.Conflict); _ignoreButton.setEnabled(getSelectedMergeChange() != null && getSelectedMergeChange().getMergeChangeSource() != MergeChangeSource.Conflict); _chooseLeftButton.setEnabled(getSelectedMergeChange() != null && getSelectedMergeChange().getMergeChangeSource() == MergeChangeSource.Conflict); _chooseRightButton.setEnabled(getSelectedMergeChange() != null && getSelectedMergeChange().getMergeChangeSource() == MergeChangeSource.Conflict); _chooseNoneButton.setEnabled(getSelectedMergeChange() != null && getSelectedMergeChange().getMergeChangeSource() == MergeChangeSource.Conflict); _chooseBothButton.setEnabled(getSelectedMergeChange() != null && getSelectedMergeChange().getMergeChangeSource() == MergeChangeSource.Conflict);*/ } public FilterChangeList getChangesList() { return _changeListPanel; } public ComparePanel getComparePanel() { return comparePanel; } public JScrollPane getMergePanel() { return _mergePanel; } static Icon iconForChangeCategory(MergeChange.ChangeCategory cat) { switch (cat) { case LEFT_ADDITION: return UtilsIconLibrary.LEFT_ADDITION_ICON; case LEFT_MODIFICATION: return UtilsIconLibrary.LEFT_MODIFICATION_ICON; case LEFT_REMOVAL: return UtilsIconLibrary.LEFT_REMOVAL_ICON; case SMART_CONFLICT_RESOLVED: return UtilsIconLibrary.SMART_CONFLICT_RESOLVED_ICON; case SMART_CONFLICT_UNRESOLVED: return UtilsIconLibrary.SMART_CONFLICT_UNRESOLVED_ICON; case CUSTOM_EDITING_RESOLVED: return UtilsIconLibrary.CUSTOM_EDITING_RESOLVED_ICON; case CUSTOM_EDITING_UNRESOLVED: return UtilsIconLibrary.CUSTOM_EDITING_UNRESOLVED_ICON; case ADD_CONFLICT_RESOLVED: return UtilsIconLibrary.ADD_CONFLICT_RESOLVED_ICON; case ADD_CONFLICT_UNRESOLVED: return UtilsIconLibrary.ADD_CONFLICT_UNRESOLVED_ICON; case CONFLICT_RESOLVED: return UtilsIconLibrary.CONFLICT_RESOLVED_ICON; case CONFLICT_UNRESOLVED: return UtilsIconLibrary.CONFLICT_UNRESOLVED_ICON; case DEL_CONFLICT_RESOLVED: return UtilsIconLibrary.DEL_CONFLICT_RESOLVED_ICON; case DEL_CONFLICT_UNRESOLVED: return UtilsIconLibrary.DEL_CONFLICT_UNRESOLVED_ICON; case RIGHT_ADDITION: return UtilsIconLibrary.RIGHT_ADDITION_ICON; case RIGHT_MODIFICATION: return UtilsIconLibrary.RIGHT_MODIFICATION_ICON; case RIGHT_REMOVAL: return UtilsIconLibrary.RIGHT_REMOVAL_ICON; } return null; } static Icon iconForChange(MergeChange value) { return iconForChangeCategory(value.category()); // if (value.getMergeChangeSource() == MergeChange.MergeChangeSource.Left) { // if (value.getMergeChangeType() == MergeChange.MergeChangeType.Addition) { // return LEFT_ADDITION_ICON; // } // else if (value.getMergeChangeType() == MergeChange.MergeChangeType.Modification) { // return LEFT_MODIFICATION_ICON; // } // else if (value.getMergeChangeType() == MergeChange.MergeChangeType.Removal) { // return LEFT_REMOVAL_ICON; // } // } // else if (value.getMergeChangeSource() == MergeChange.MergeChangeSource.Conflict) { // if (value.getMergeChangeAction() == MergeChangeAction.AutomaticMergeResolving) { // if (value.isResolved()) return SMART_CONFLICT_RESOLVED_ICON; // else return SMART_CONFLICT_UNRESOLVED_ICON; // } // else if (value.getMergeChangeAction() == MergeChangeAction.CustomEditing) { // if (value.isResolved()) return CUSTOM_EDITING_RESOLVED_ICON; // else return CUSTOM_EDITING_UNRESOLVED_ICON; // } // if (value.getMergeChangeType() == MergeChange.MergeChangeType.Addition) { // if (value.isResolved()) return ADD_CONFLICT_RESOLVED_ICON; // else return ADD_CONFLICT_UNRESOLVED_ICON; // } // else if (value.getMergeChangeType() == MergeChange.MergeChangeType.Modification) { // if (value.isResolved()) return CONFLICT_RESOLVED_ICON; // else return CONFLICT_UNRESOLVED_ICON; // } // else if (value.getMergeChangeType() == MergeChange.MergeChangeType.Removal) { // if (value.isResolved()) return DEL_CONFLICT_RESOLVED_ICON; // else return DEL_CONFLICT_UNRESOLVED_ICON; // } // } // else if (value.getMergeChangeSource() == MergeChange.MergeChangeSource.Right) { // if (value.getMergeChangeType() == MergeChange.MergeChangeType.Addition) { // return RIGHT_ADDITION_ICON; // } // else if (value.getMergeChangeType() == MergeChange.MergeChangeType.Modification) { // return RIGHT_MODIFICATION_ICON; // } // else if (value.getMergeChangeType() == MergeChange.MergeChangeType.Removal) { // return RIGHT_REMOVAL_ICON; // } // } } public IMerge getMerge() { return _merge; } public JPanel getControlPanel() { return _controlPanel; } private Hashtable<MergeChange, Hashtable<MergeChangeAction, ChangeAction>> storedActions = new Hashtable<MergeChange, Hashtable<MergeChangeAction, ChangeAction>>(); protected ChangeAction getChangeAction(MergeChange mergeChange, MergeChangeAction mergeChangeAction) { if (storedActions.get(mergeChange) == null) { storedActions.put(mergeChange, new Hashtable<MergeChangeAction, ChangeAction>()); } if (storedActions.get(mergeChange).get(mergeChangeAction) == null) { storedActions.get(mergeChange).put(mergeChangeAction, new ChangeAction(mergeChange, mergeChangeAction)); } return storedActions.get(mergeChange).get(mergeChangeAction); } public class ChangeAction extends AbstractAction { MergeChange mergeChange; MergeChangeAction mergeChangeAction; public ChangeAction(MergeChange mergeChange, MergeChangeAction mergeChangeAction) { super(localizedNameForMergeChangeAction(mergeChangeAction), iconForMergeChangeAction(mergeChangeAction)); this.mergeChange = mergeChange; this.mergeChangeAction = mergeChangeAction; } @Override public void actionPerformed(ActionEvent e) { if (mergeChangeAction == MergeChangeAction.CustomEditing) { new HandConflictResolver(mergeChange, style, mergeChange.getMergeChangeAction(), MergePanelElements.this); } else { mergeChange.setMergeChangeAction(mergeChangeAction); } updateAfterMergeChangeActionChanging(); } @Override public boolean isEnabled() { return isEditable(); } } protected String localizedForKey(String key) { return key; } String localizedNameForMergeChangeAction(MergeChangeAction mergeChangeAction) { if (mergeChangeAction == MergeChangeAction.KeepChange) { return localizedForKey("keep_change"); } else if (mergeChangeAction == MergeChangeAction.IgnoreChange) { return localizedForKey("ignore_change"); } else if (mergeChangeAction == MergeChangeAction.ChooseLeft) { return localizedForKey("choose_left"); } else if (mergeChangeAction == MergeChangeAction.ChooseRight) { return localizedForKey("choose_right"); } else if (mergeChangeAction == MergeChangeAction.ChooseNone) { return localizedForKey("choose_none"); } else if (mergeChangeAction == MergeChangeAction.ChooseBothLeftFirst) { return localizedForKey("choose_both_left_first"); } else if (mergeChangeAction == MergeChangeAction.ChooseBothRightFirst) { return localizedForKey("choose_both_right_first"); } else if (mergeChangeAction == MergeChangeAction.CustomEditing) { return localizedForKey("resolve_by_hand"); } else if (mergeChangeAction == MergeChangeAction.AutomaticMergeResolving) { return localizedForKey("automatic_merge_resolving"); } else if (mergeChangeAction == MergeChangeAction.Undecided) { return localizedForKey("unresolved_merge"); } return null; } Icon iconForMergeChangeAction(MergeChangeAction mergeChangeAction) { if (mergeChangeAction == MergeChangeAction.KeepChange) { return UtilsIconLibrary.ACCEPT_ICON; } else if (mergeChangeAction == MergeChangeAction.IgnoreChange) { return UtilsIconLibrary.REFUSE_ICON; } else if (mergeChangeAction == MergeChangeAction.ChooseLeft) { return UtilsIconLibrary.CHOOSE_LEFT_ICON; } else if (mergeChangeAction == MergeChangeAction.ChooseRight) { return UtilsIconLibrary.CHOOSE_RIGHT_ICON; } else if (mergeChangeAction == MergeChangeAction.ChooseNone) { return UtilsIconLibrary.CHOOSE_NONE; } else if (mergeChangeAction == MergeChangeAction.ChooseBothLeftFirst) { return UtilsIconLibrary.CHOOSE_BOTH_LEFT_FIRST; } else if (mergeChangeAction == MergeChangeAction.ChooseBothRightFirst) { return UtilsIconLibrary.CHOOSE_BOTH_RIGHT_FIRST; } else if (mergeChangeAction == MergeChangeAction.CustomEditing) { return UtilsIconLibrary.CUSTOM_EDITING_ICON; } else if (mergeChangeAction == MergeChangeAction.AutomaticMergeResolving) { return UtilsIconLibrary.AUTOMATIC_MERGE_RESOLVING_ICON; } else if (mergeChangeAction == MergeChangeAction.Undecided) { return UtilsIconLibrary.CONFLICT_UNRESOLVED_ICON; } return null; } private boolean editable = true; public boolean isEditable() { return editable; } public void setEditable(boolean editable) { this.editable = editable; } public MergeTextArea getLeftTextArea() { return _leftTextArea; } public MergeTextArea getMergeTextArea() { return _mergeTextArea; } public MergeTextArea getRightTextArea() { return _rightTextArea; } @Override public void update(Observable o, Object dataModification) { if (o == getMerge() && dataModification instanceof MergeChange) { // System.out.println("Hop on change"); comparePanel.update(); getFilteredChangeList().repaint(); } } public JList getFilteredChangeList() { return _changeListPanel.filteredChangeList(); } public class FilterChangeList extends JPanel { private Vector<MergeChange.ChangeCategory> selectedCategories; JList _filteredList; public FilterChangeList(String noChangeLabel) { super(new BorderLayout()); selectedCategories = new Vector<MergeChange.ChangeCategory>(); for (MergeChange.ChangeCategory c : MergeChange.ChangeCategory.values()) { selectedCategories.add(c); } initFilteredList(noChangeLabel); _filteredList.setMinimumSize(_filteredList.getPreferredSize()); add(new FilterPanel(), BorderLayout.NORTH); JScrollPane pane = new JScrollPane(filteredChangeList()); pane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); add(pane, BorderLayout.CENTER); } private void initFilteredList(String noChangeLabel) { if (_merge.getChanges().size() > 0) { _filteredList = new JList(_merge.getChanges()); _filteredList.setVisibleRowCount(5); _filteredList.setCellRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel returned = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); returned.setIcon(iconForChange((MergeChange) value)); returned.setText(((MergeChange) value).toString()); return returned; } }); _filteredList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); lsl = new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { selectChange((MergeChange) _filteredList.getSelectedValue()); } }; _filteredList.addListSelectionListener(lsl); _filteredList.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent mouseEvent) { if (mouseEvent.isPopupTrigger() && _filteredList.getSelectedValue() != null && _filteredList.getSelectedValue() instanceof MergeChange && ((MergeChange) _filteredList.getSelectedValue()).getMergeChangeSource() == MergeChangeSource.Conflict) { comparePanel._buttonForChanges.get(_filteredList.getSelectedValue()).getPopupMenu() .show(mouseEvent.getComponent(), mouseEvent.getX() + 10, mouseEvent.getY()); } } @Override public void mouseReleased(MouseEvent mouseEvent) { if (mouseEvent.isPopupTrigger() && _filteredList.getSelectedValue() != null && _filteredList.getSelectedValue() instanceof MergeChange && ((MergeChange) _filteredList.getSelectedValue()).getMergeChangeSource() == MergeChangeSource.Conflict) { comparePanel._buttonForChanges.get(_filteredList.getSelectedValue()).getPopupMenu() .show(mouseEvent.getComponent(), mouseEvent.getX() + 10, mouseEvent.getY()); } } }); } else { Object[] obj = { noChangeLabel }; _filteredList = new JList(obj); _filteredList.setEnabled(false); } } public void addAllFilter(MergeChange.ChangeCategory[] categories) { for (MergeChange.ChangeCategory item : categories) { selectedCategories.add(item); } refreshList(); } public void removeAllFilter(MergeChange.ChangeCategory[] categories) { for (MergeChange.ChangeCategory item : categories) { selectedCategories.remove(item); } refreshList(); } // public void addFilter(MergeChange.ChangeCategory category){ // selectedCategories.add(category); // refreshList(); // } // public void removeFilter(MergeChange.ChangeCategory category){ // selectedCategories.remove(category); // refreshList(); // } public JList filteredChangeList() { return _filteredList; } public void refreshList() { final Vector<MergeChange> listData = _merge.filteredChangeList(selectedCategories); _filteredList.setModel(new AbstractListModel() { @Override public int getSize() { return listData.size(); } @Override public Object getElementAt(int i) { return listData.elementAt(i); } }); } class FilterPanel extends JPanel { public FilterPanel() { super(new FlowLayout(FlowLayout.LEFT)); add(new ButtonFilter(MergeChange.CONFLICT_UNRESOLVED_CATEGORIES, true, UtilsIconLibrary.CONFLICT_ICON)); add(new ButtonFilter(MergeChange.CONFLICT_RESOLVED_CATEGORIES, true, UtilsIconLibrary.CONFLICT_RESOLVED_ICON)); add(new ButtonFilter(MergeChange.LEFT_CATEGORIES, true, UtilsIconLibrary.LEFT_ICON)); add(new ButtonFilter(MergeChange.RIGHT_CATEGORIES, true, UtilsIconLibrary.RIGHT_ICON)); } class ButtonFilter extends JButton { boolean _isSelected; final MergeChange.ChangeCategory[] _categories; public ButtonFilter(MergeChange.ChangeCategory[] categories, boolean isSelected, Icon icon) { super(); _isSelected = isSelected; _categories = categories; setIcon(icon); setBorder(_isSelected ? BorderFactory.createEtchedBorder(EtchedBorder.LOWERED) : BorderFactory.createEmptyBorder()); setPreferredSize(new Dimension(27, 18)); addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { _isSelected = !_isSelected; if (_isSelected) { addAllFilter(_categories); } else { removeAllFilter(_categories); } setBorder(_isSelected ? BorderFactory.createEtchedBorder(EtchedBorder.LOWERED) : BorderFactory .createEmptyBorder()); System.out.println(getPreferredSize()); } }); } } } public void setVisibleRowCount(int i) { _filteredList.setVisibleRowCount(i); } } }