/* Copyright 2004-2014 Jim Voris
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.qumasoft.guitools.qwin.dialog;
import com.qumasoft.guitools.qwin.operation.OperationCompareRevisions;
import com.qumasoft.qvcslib.LabelInfo;
import com.qumasoft.qvcslib.LogfileInfo;
import com.qumasoft.qvcslib.MergedInfoInterface;
import com.qumasoft.qvcslib.RevisionInformation;
import java.io.File;
import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
* Compare revisions dialog.
* @author Jim Voris
*/
public class CompareRevisionsDialog extends AbstractQWinCommandDialog implements ListSelectionListener {
private static final long serialVersionUID = 8688069875269169702L;
private final OperationCompareRevisions operationCompareRevisions;
private Object[] selectedRevisions;
private final MergedInfoInterface mergedInfo;
private File selectedFile;
/**
* Create a new compare revisions dialog.
* @param parent the parent frame.
* @param info the file containing the revisions to compare.
* @param operation the operation that will do the work.
*/
public CompareRevisionsDialog(java.awt.Frame parent, MergedInfoInterface info, OperationCompareRevisions operation) {
super(parent, false);
mergedInfo = info;
operationCompareRevisions = operation;
initComponents();
populateComponents();
getRootPane().setDefaultButton(compareToWorkfileButton);
revisionsToCompareList.requestFocusInWindow();
setFont();
center();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
revisionsToCompareLabel = new javax.swing.JLabel();
compareToWorkfileButton = new javax.swing.JButton();
closeButton = new javax.swing.JButton();
rightBottomAnchor = new javax.swing.JLabel();
revisionListScrollPane = new javax.swing.JScrollPane();
revisionsToCompareList = new javax.swing.JList();
compareToFileButton = new javax.swing.JButton();
setTitle("Compare Revisions");
setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
closeDialog(evt);
}
});
revisionsToCompareLabel.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
revisionsToCompareLabel.setText("Revisions to compare:");
compareToWorkfileButton.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
compareToWorkfileButton.setText("Compare to workfile");
compareToWorkfileButton.setToolTipText("Compare to the current workfile");
compareToWorkfileButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
compareToWorkfileButtonActionPerformed(evt);
}
});
closeButton.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
closeButton.setText("Close");
closeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
closeButtonActionPerformed(evt);
}
});
rightBottomAnchor.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
rightBottomAnchor.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
rightBottomAnchor.setText(" ");
rightBottomAnchor.setEnabled(false);
rightBottomAnchor.setFocusable(false);
rightBottomAnchor.setMaximumSize(new java.awt.Dimension(12, 12));
rightBottomAnchor.setMinimumSize(new java.awt.Dimension(12, 12));
rightBottomAnchor.setPreferredSize(new java.awt.Dimension(12, 12));
revisionsToCompareList.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
revisionListScrollPane.setViewportView(revisionsToCompareList);
compareToFileButton.setFont(new java.awt.Font("Arial", 0, 12)); // NOI18N
compareToFileButton.setText("Compare to file...");
compareToFileButton.setToolTipText("Choose a file to compare");
compareToFileButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
compareToFileButtonActionPerformed(evt);
}
});
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(12, 12, 12)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(revisionsToCompareLabel)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
.add(layout.createSequentialGroup()
.add(compareToWorkfileButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(compareToFileButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 143, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(18, 18, 18)
.add(closeButton))
.add(org.jdesktop.layout.GroupLayout.LEADING, revisionListScrollPane, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 386, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(28, 28, 28)
.add(rightBottomAnchor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))))
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(12, 12, 12)
.add(revisionsToCompareLabel)
.add(4, 4, 4)
.add(revisionListScrollPane, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 110, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(10, 10, 10)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(20, 20, 20)
.add(rightBottomAnchor, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(compareToWorkfileButton)
.add(closeButton)
.add(compareToFileButton)))
.addContainerGap(20, Short.MAX_VALUE))
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void compareToWorkfileButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_compareToWorkfileButtonActionPerformed
{//GEN-HEADEREND:event_compareToWorkfileButtonActionPerformed
selectedFile = null;
operationCompareRevisions.processDialogResult(mergedInfo, this);
}//GEN-LAST:event_compareToWorkfileButtonActionPerformed
private void closeButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_closeButtonActionPerformed
{//GEN-HEADEREND:event_closeButtonActionPerformed
closeDialog(null);
}//GEN-LAST:event_closeButtonActionPerformed
/** Closes the dialog */
private void closeDialog(java.awt.event.WindowEvent evt)
{//GEN-FIRST:event_closeDialog
setVisible(false);
dispose();
}//GEN-LAST:event_closeDialog
private void compareToFileButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_compareToFileButtonActionPerformed
JFileChooser fileToCompareChooser = new JFileChooser();
fileToCompareChooser.setCurrentDirectory(mergedInfo.getWorkfile());
fileToCompareChooser.setApproveButtonText("OK");
fileToCompareChooser.setApproveButtonToolTipText("Compare to selected file");
int returnVal = fileToCompareChooser.showOpenDialog(getParent());
if (returnVal == JFileChooser.APPROVE_OPTION) {
selectedFile = fileToCompareChooser.getSelectedFile();
operationCompareRevisions.processDialogResult(mergedInfo, this);
}
}//GEN-LAST:event_compareToFileButtonActionPerformed
@Override
public void dismissDialog() {
closeButtonActionPerformed(null);
}
private void populateComponents() {
compareToWorkfileButton.setEnabled(false);
compareToFileButton.setEnabled(true);
revisionsToCompareList.addListSelectionListener(this);
revisionsToCompareList.setModel(new RevisionsListModel(mergedInfo));
}
/**
* Called whenever the value of the selection changes.
*
* @param e the event that characterizes the change.
*
*/
@Override
public void valueChanged(ListSelectionEvent e) {
int[] selectedIndices = revisionsToCompareList.getSelectedIndices();
if (selectedIndices.length == 0) {
compareToWorkfileButton.setEnabled(false);
compareToFileButton.setEnabled(true);
} else if (selectedIndices.length == 1) {
compareToWorkfileButton.setText("Compare to workfile");
compareToFileButton.setEnabled(true);
// The button can only be enabled if the workfile exists.
if (mergedInfo.getWorkfileInfo() == null) {
compareToWorkfileButton.setEnabled(false);
} else {
compareToWorkfileButton.setEnabled(true);
}
} else if (selectedIndices.length == 2) {
compareToWorkfileButton.setEnabled(true);
compareToFileButton.setEnabled(false);
compareToWorkfileButton.setText("Compare revisions");
} else {
compareToWorkfileButton.setEnabled(false);
compareToFileButton.setEnabled(false);
}
if (selectedRevisions != null) {
if (!(selectedIndices.length == selectedRevisions.length)) {
selectedRevisions = new Object[selectedIndices.length];
}
} else {
selectedRevisions = new Object[selectedIndices.length];
}
Object[] selectedItems = revisionsToCompareList.getSelectedValuesList().toArray();
System.arraycopy(selectedItems, 0, selectedRevisions, 0, selectedIndices.length);
}
public Object[] getSelectedRevisions() {
return selectedRevisions;
}
public File getSelectedFile() {
return selectedFile;
}
static class RevisionsListModel extends DefaultListModel<Object> {
private static final long serialVersionUID = 1L;
RevisionsListModel(Object o) {
MergedInfoInterface mergedInfo = (MergedInfoInterface) o;
// Populate the list of revisions...
LogfileInfo logfileInfo = mergedInfo.getLogfileInfo();
RevisionInformation revisionInformation = logfileInfo.getRevisionInformation();
for (int i = 0; i < logfileInfo.getLogFileHeaderInfo().getRevisionCount(); i++) {
addElement(revisionInformation.getRevisionHeader(i).getRevisionString());
}
LabelInfo[] labelInfoArray = logfileInfo.getLogFileHeaderInfo().getLabelInfo();
if (labelInfoArray != null) {
for (LabelInfo labelInfoArray1 : labelInfoArray) {
addElement(labelInfoArray1);
}
}
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton closeButton;
private javax.swing.JButton compareToFileButton;
private javax.swing.JButton compareToWorkfileButton;
private javax.swing.JScrollPane revisionListScrollPane;
private javax.swing.JLabel revisionsToCompareLabel;
private javax.swing.JList revisionsToCompareList;
private javax.swing.JLabel rightBottomAnchor;
// End of variables declaration//GEN-END:variables
}