/* 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 }