/* 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.PromoteToParentTableModel;
import com.qumasoft.guitools.qwin.QWinFrame;
import com.qumasoft.guitools.qwin.QWinUtility;
import com.qumasoft.guitools.qwin.operation.OperationPromoteFile;
import com.qumasoft.qvcslib.ClientExpansionContext;
import com.qumasoft.qvcslib.FilePromotionInfo;
import com.qumasoft.qvcslib.MergedInfoInterface;
import com.qumasoft.qvcslib.Utility;
import java.awt.Component;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
/**
* Promote to parent branch dialog.
*
* @author Jim Voris
*/
public class PromoteToParentDialog extends AbstractQWinCommandDialog implements ListSelectionListener {
private static final long serialVersionUID = 7918480277463772711L;
private final String branchToPromoteFromName;
private final PromoteToParentTableModel promoteToParentTableModel;
private final PromoteToParentTableCellRenderer promoteToParentTableCellRenderer = new PromoteToParentTableCellRenderer();
/**
* Constructor for promote to parent branch dialog.
*
* @param parent the parent frame.
* @param branchName the branch that we are promoting from.
*/
@SuppressWarnings("LeakingThisInConstructor")
public PromoteToParentDialog(java.awt.Frame parent, String branchName) {
super(parent, false);
this.branchToPromoteFromName = branchName;
promoteToParentTableModel = new PromoteToParentTableModel(this.branchToPromoteFromName);
promoteToParentTableModel.initialize();
initComponents();
// Define the renderer for the table's cells.
promotionCandidateTable.setDefaultRenderer(javax.swing.JLabel.class, promoteToParentTableCellRenderer);
// Define the renderer for the column headers.
promotionCandidateTable.getTableHeader().setDefaultRenderer(new PromoteToParentHeaderRenderer(promotionCandidateTable.getTableHeader().getDefaultRenderer()));
// Listen to selection changes.
promotionCandidateTable.getSelectionModel().addListSelectionListener(this);
updateButtons();
// Center the dialog.
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() {
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
promotionCandidateTable = new javax.swing.JTable();
jPanel2 = new javax.swing.JPanel();
selectAllButton = new javax.swing.JButton();
unSelectAllButton = new javax.swing.JButton();
compareToParentButton = new javax.swing.JButton();
promoteButton = new javax.swing.JButton();
jPanel3 = new javax.swing.JPanel();
closeButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Promote to parent branch");
jPanel1.setLayout(new java.awt.BorderLayout());
promotionCandidateTable.setModel(promoteToParentTableModel);
jScrollPane1.setViewportView(promotionCandidateTable);
jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
jPanel2.setBorder(javax.swing.BorderFactory.createEmptyBorder(20, 10, 20, 10));
jPanel2.setLayout(new javax.swing.BoxLayout(jPanel2, javax.swing.BoxLayout.Y_AXIS));
selectAllButton.setToolTipText("Select all files");
selectAllButton.setLabel("Select All");
selectAllButton.setMaximumSize(new java.awt.Dimension(161, 29));
selectAllButton.setMinimumSize(new java.awt.Dimension(161, 29));
selectAllButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
selectAllButtonActionPerformed(evt);
}
});
jPanel2.add(selectAllButton);
unSelectAllButton.setToolTipText("Unselect all files");
unSelectAllButton.setLabel("Unselect All");
unSelectAllButton.setMaximumSize(new java.awt.Dimension(161, 29));
unSelectAllButton.setMinimumSize(new java.awt.Dimension(161, 29));
unSelectAllButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
unSelectAllButtonActionPerformed(evt);
}
});
jPanel2.add(unSelectAllButton);
compareToParentButton.setToolTipText("Compare the selected file to the same file on the parent branch.");
compareToParentButton.setLabel("Compare to parent");
compareToParentButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
compareToParentButtonActionPerformed(evt);
}
});
jPanel2.add(compareToParentButton);
promoteButton.setText("Promote...");
promoteButton.setToolTipText("Promote the selected file(s) to the parent branch.");
promoteButton.setMaximumSize(new java.awt.Dimension(161, 29));
promoteButton.setMinimumSize(new java.awt.Dimension(161, 29));
promoteButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
promoteButtonActionPerformed(evt);
}
});
jPanel2.add(promoteButton);
jPanel3.setPreferredSize(new java.awt.Dimension(10, 50));
jPanel3.setSize(new java.awt.Dimension(10, 50));
org.jdesktop.layout.GroupLayout jPanel3Layout = new org.jdesktop.layout.GroupLayout(jPanel3);
jPanel3.setLayout(jPanel3Layout);
jPanel3Layout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 166, Short.MAX_VALUE)
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 130, Short.MAX_VALUE)
);
jPanel2.add(jPanel3);
closeButton.setToolTipText("Close this dialog.");
closeButton.setLabel("Close");
closeButton.setMaximumSize(new java.awt.Dimension(161, 29));
closeButton.setMinimumSize(new java.awt.Dimension(161, 29));
closeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
closeButtonActionPerformed(evt);
}
});
jPanel2.add(closeButton);
getContentPane().add(jPanel2, java.awt.BorderLayout.LINE_END);
pack();
}// </editor-fold>//GEN-END:initComponents
private void closeButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_closeButtonActionPerformed
{//GEN-HEADEREND:event_closeButtonActionPerformed
dismissDialog();
}//GEN-LAST:event_closeButtonActionPerformed
private void promoteButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_promoteButtonActionPerformed
{//GEN-HEADEREND:event_promoteButtonActionPerformed
String serverName = QWinFrame.getQWinFrame().getServerName();
String projectName = QWinFrame.getQWinFrame().getProjectName();
String viewName = QWinFrame.getQWinFrame().getViewName();
int[] selectionIndexList = promotionCandidateTable.getSelectedRows();
List<FilePromotionInfo> filePromotionInfoList = new ArrayList<>();
for (int i = 0; i < selectionIndexList.length; i++) {
FilePromotionInfo filePromotionInfo = promoteToParentTableModel.getFilePromotionInfo(selectionIndexList[i]);
MergedInfoInterface mergedInfo = promoteToParentTableModel.getMergedInfo(filePromotionInfo.getFileId());
if (mergedInfo != null && !mergedInfo.getIsOverlap()) {
filePromotionInfoList.add(filePromotionInfo);
}
}
OperationPromoteFile operationPromoteFile = new OperationPromoteFile(serverName, projectName, viewName, this.branchToPromoteFromName,
QWinFrame.getQWinFrame().getUserLocationProperties(), filePromotionInfoList);
operationPromoteFile.executeOperation();
}//GEN-LAST:event_promoteButtonActionPerformed
private void compareToParentButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_compareToParentButtonActionPerformed
{//GEN-HEADEREND:event_compareToParentButtonActionPerformed
compareParentRevisionToChildRevision();
}//GEN-LAST:event_compareToParentButtonActionPerformed
private void unSelectAllButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_unSelectAllButtonActionPerformed
{//GEN-HEADEREND:event_unSelectAllButtonActionPerformed
promotionCandidateTable.clearSelection();
}//GEN-LAST:event_unSelectAllButtonActionPerformed
private void selectAllButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_selectAllButtonActionPerformed
{//GEN-HEADEREND:event_selectAllButtonActionPerformed
promotionCandidateTable.selectAll();
}//GEN-LAST:event_selectAllButtonActionPerformed
/**
* Dismiss the dialog.
*/
@Override
public void dismissDialog() {
promoteToParentTableModel.closeModel();
setVisible(false);
dispose();
}
/**
* The list selection model changed.
*
* @param e the event describing the selection change.
*/
@Override
public void valueChanged(ListSelectionEvent e) {
updateButtons();
}
private void updateButtons() {
int[] selectionIndexList = promotionCandidateTable.getSelectedRows();
if (selectionIndexList.length > 0) {
// Enable promote button.
promoteButton.setEnabled(true);
if (selectionIndexList.length == 1) {
// Enable compare to parent.
compareToParentButton.setEnabled(true);
} else {
// Disable compare to parent.
compareToParentButton.setEnabled(false);
}
} else {
// Disable promote button
promoteButton.setEnabled(false);
// Disable compare to parent button
compareToParentButton.setEnabled(false);
}
}
private void compareParentRevisionToChildRevision() {
byte[] buffer1;
byte[] buffer2;
String serverName = QWinFrame.getQWinFrame().getServerName();
int[] selectionIndexList = promotionCandidateTable.getSelectedRows();
if (selectionIndexList.length == 1) {
FilePromotionInfo filePromotionInfo = promoteToParentTableModel.getFilePromotionInfo(selectionIndexList[0]);
MergedInfoInterface mergedInfo = promoteToParentTableModel.getMergedInfo(filePromotionInfo.getFileId());
String firstRevisionString = mergedInfo.getDefaultRevisionString();
String secondRevisionString = filePromotionInfo.getChildBranchTipRevisionString();
// Get workfile buffer... not keyword expanded.
buffer1 = mergedInfo.getRevisionAsByteArray(firstRevisionString);
buffer2 = mergedInfo.getRevisionAsByteArray(secondRevisionString);
String buffer1DisplayName = mergedInfo.getShortWorkfileName() + ": Parent Branch Revision: " + firstRevisionString;
String buffer2DisplayName = mergedInfo.getShortWorkfileName() + ": Child Branch Revision: " + secondRevisionString;
int buffer1RevisionIndex = mergedInfo.getLogfileInfo().getRevisionInformation().getRevisionIndex(firstRevisionString);
int buffer2RevisionIndex = mergedInfo.getLogfileInfo().getRevisionInformation().getRevisionIndex(secondRevisionString);
if ((buffer1 != null) && (buffer2 != null)) {
ClientExpansionContext context1 = new ClientExpansionContext(serverName, QWinFrame.getQWinFrame().getUserProperties(),
QWinFrame.getQWinFrame().getUserLocationProperties(),
buffer1RevisionIndex, null, true);
File expandedBuffer1 = Utility.expandBuffer(buffer1, mergedInfo, context1);
ClientExpansionContext context2 = new ClientExpansionContext(serverName, QWinFrame.getQWinFrame().getUserProperties(),
QWinFrame.getQWinFrame().getUserLocationProperties(),
buffer2RevisionIndex, null, true);
File expandedBuffer2 = Utility.expandBuffer(buffer2, mergedInfo, context2);
try {
QWinFrame.getQWinFrame().visualCompare(expandedBuffer1.getCanonicalPath(), expandedBuffer2.getCanonicalPath(), buffer1DisplayName, buffer2DisplayName);
} catch (IOException e) {
QWinUtility.logProblem(Level.SEVERE, Utility.expandStackTraceToString(e));
}
}
}
}
class PromoteToParentTableCellRenderer extends javax.swing.table.DefaultTableCellRenderer {
private static final long serialVersionUID = 8361575430460451520L;
PromoteToParentTableCellRenderer() {
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
PromoteToParentTableModel promoteToParentTableModel = (PromoteToParentTableModel) promotionCandidateTable.getModel();
JLabel inputLabel = (JLabel) promoteToParentTableModel.getValueAt(row, column);
// Set the column alignment.
switch (column) {
default: {
setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
break;
}
}
if (isSelected) {
super.setForeground(table.getSelectionForeground());
super.setBackground(table.getSelectionBackground());
} else {
super.setForeground(table.getForeground());
super.setBackground(table.getBackground());
setBorder(noFocusBorder);
}
setFont(table.getFont());
setText(inputLabel.getText());
setToolTipText(inputLabel.getToolTipText());
setIcon(null);
return this;
}
}
class PromoteToParentHeaderRenderer extends javax.swing.table.DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
private TableCellRenderer defaultRenderer = null;
PromoteToParentHeaderRenderer(TableCellRenderer defaultRenderer) {
this.defaultRenderer = defaultRenderer;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
DefaultTableCellRenderer component = (DefaultTableCellRenderer) defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
component.setFont(table.getFont());
return component;
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton closeButton;
private javax.swing.JButton compareToParentButton;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JButton promoteButton;
private javax.swing.JTable promotionCandidateTable;
private javax.swing.JButton selectAllButton;
private javax.swing.JButton unSelectAllButton;
// End of variables declaration//GEN-END:variables
}