/*
*
* Perforce/JBuilder Opentool
* Copyright (C) 2002 Mark Ackerman
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.dafreels.opentools.actions.ui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.util.*;
import com.dafreels.opentools.actions.*;
import com.dafreels.opentools.*;
import com.dafreels.vcs.command.*;
/**
* Title: Perforce Open Tool
* Description:
* Copyright: Copyright (c) 2002
* Company:
* @author Mark Ackerman
* @version 1.0
*/
public class HistoryDialog extends JDialog
{
private static final String LEAD_IN = "... ";
protected static Vector _columnNames = new Vector(4);
private JTable _historyTable;
private JTextArea _fileName;
private JButton _diffRevsButton, _diffButton, _describeButton, _syncButton;
private JTextArea _actionsText;
private JTextArea _descriptionText;
static
{
_columnNames.add( "Revision" );
_columnNames.add( "File" );
_columnNames.add( "ChangeList" );
_columnNames.add( "Date" );
_columnNames.add( "User" );
_columnNames.add( "Action" );
_columnNames.add( "Description");
}
public HistoryDialog(Frame frame, String title, boolean modal)
{
super(frame, title, modal);
buildControls();
}
protected void buildControls()
{
getContentPane().setLayout(new GridBagLayout());
JPanel buttonPanel = new JPanel(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(5,5,5,5);
gbc.weightx = 1.0;
getContentPane().add(buttonPanel, gbc);
_syncButton = new JButton("Sync");
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
//gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTH;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(5,5,5,5);
buttonPanel.add(_syncButton, gbc);
_diffRevsButton = new JButton("Diff Revs");
_diffRevsButton.setEnabled(false);
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
//gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTH;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(5,5,5,5);
buttonPanel.add(_diffRevsButton, gbc);
_diffButton = new JButton("Diff vs Client File");
gbc = new GridBagConstraints();
gbc.gridx = 2;
gbc.gridy = 0;
//gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTH;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(5,5,5,5);
buttonPanel.add(_diffButton, gbc);
_describeButton = new JButton("Describe ChangeList");
gbc = new GridBagConstraints();
gbc.gridx = 3;
gbc.gridy = 0;
//gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTH;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(5,5,5,5);
buttonPanel.add(_describeButton, gbc);
//Color gray = new Color(200,200,200);
JLabel label = new JLabel("File:");
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(5,5,0,5);
//getContentPane().add(label, gbc);
_fileName = new JTextArea();
_fileName.setEditable(false);
_fileName.setBackground(null);
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(5,5,5,5);
//getContentPane().add(_fileName, gbc);
_historyTable = new JTable()
{
public boolean isCellEditable(int row, int col)
{
return false;
}
public Dimension getPreferredScrollableViewportSize()
{
Dimension d = super.getPreferredScrollableViewportSize();
d.height = getRowHeight() *10;
return d;
}
};
_historyTable.setBackground(null);
//_historyTable.setEnabled(false);
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(5,5,5,5);
gbc.weightx = 1.0;
gbc.weighty = 1.0;
getContentPane().add(new JScrollPane(_historyTable), gbc);
label = new JLabel("Actions:");
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 2;
//gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(5,5,5,5);
getContentPane().add(label, gbc);
_actionsText = new JTextArea ()
{
public Dimension getPreferredScrollableViewportSize()
{
Dimension d = super.getPreferredScrollableViewportSize();
d.height = 100;
return d;
}
};
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 3;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(5,5,5,5);
gbc.weightx = 1.0;
gbc.weighty = .8;
getContentPane().add(new JScrollPane(_actionsText), gbc);
label = new JLabel("Change Description:");
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 4;
//gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(5,5,5,5);
getContentPane().add(label, gbc);
_descriptionText = new JTextArea()
{
public Dimension getPreferredScrollableViewportSize()
{
Dimension d = super.getPreferredScrollableViewportSize();
d.height = 100;
return d;
}
};
_descriptionText.setWrapStyleWord(true);
_descriptionText.setLineWrap(true);
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 5;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.BOTH;
gbc.insets = new Insets(5,5,5,5);
gbc.weightx = 1.0;
gbc.weighty = .8;
getContentPane().add(new JScrollPane(_descriptionText), gbc);
JPanel panel = new JPanel(new GridBagLayout());
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 6;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.SOUTH;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(0,0,0,0);
getContentPane().add(panel, gbc);
JButton button = new JButton("Close");
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.SOUTH;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(5,5,5,5);
panel.add(button, gbc);
_historyTable.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
if ( e.getClickCount() >= 2 && SwingUtilities.isLeftMouseButton(e))
{
int row = _historyTable.rowAtPoint(e.getPoint());
if ( row == -1 )
{
return;
}
Vector changeList = getChangeList();
try
{
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
new DescribeAction((String)_historyTable.getValueAt(row, 2), changeList);
}
finally
{
setCursor(Cursor.getDefaultCursor());
}
}
}
});
_historyTable.getSelectionModel().addListSelectionListener(new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
int rowCnt = _historyTable.getSelectedRowCount();
if (rowCnt == 1 )
{
_diffButton.setEnabled(true);
_syncButton.setEnabled(true);
_describeButton.setEnabled(true);
_diffRevsButton.setEnabled(false);
}
else if ( rowCnt == 2 )
{
_diffButton.setEnabled(false);
_syncButton.setEnabled(false);
_describeButton.setEnabled(false);
_diffRevsButton.setEnabled(true);
}
else
{
_diffButton.setEnabled(false);
_syncButton.setEnabled(false);
_describeButton.setEnabled(false);
_diffRevsButton.setEnabled(false);
}
int[] rows = _historyTable.getSelectedRows();
if ( rows.length == 0 )
{
_actionsText.setText("");
_descriptionText.setText("");
}
else
{
int lastRow = rows[rows.length-1];
_actionsText.setText((String)_historyTable.getValueAt(lastRow, 5));
_descriptionText.setText((String)_historyTable.getValueAt(lastRow, 6));
}
}
});
_describeButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int row = _historyTable.getSelectedRow();
if ( row < 0 )
{
return;
}
Vector changeList = getChangeList();
try
{
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
new DescribeAction((String)_historyTable.getValueAt(row, 2), changeList);
}
finally
{
setCursor(Cursor.getDefaultCursor());
}
}
});
_diffButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
new DiffAction(true).
actionPerformed(com.borland.primetime.ide.Browser.getActiveBrowser());
}
});
_diffRevsButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if ( _historyTable.getSelectedRowCount() != 2 )
{
return;
}
int[] rows = _historyTable.getSelectedRows();
}
});
button.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
setVisible(false);
}
});
}
/**
* fill this dialog with the contents of formatter
* @param formatter the output from the <code>fstat</code> command
*/
public void fillForm(String fileName, MessageFormatter formatter)
{
if ( _fileName != null )
{
_fileName.setText(fileName);
}
String message, arg;
StringTokenizer tokenizer;
String token;
int field;
Vector row;
Vector table = new Vector();
MessageWriter.outputErrorMessages(MessageFormatter.getInstance());
boolean firstFile = true;
while( (message = formatter.getNextMessage()) != null)
{
System.out.println(message);
if ( message.startsWith("//"))
{
if ( !firstFile )
{
HistoryDialog dialog = new HistoryDialog((Frame)getParent(),
getTitle(), false);
dialog.fillForm(message, formatter);
dialog.setVisible(true);
break;
}
firstFile = false;
}
else if ( message.startsWith(LEAD_IN))
{
message = message.substring(4);
if ( message.startsWith(LEAD_IN))
{
continue; // proly got a ... ... branch into
}
// format of message s/b:
// #7 change 60 edit on 2002/04/08 by mark@Q (text) 'fix so that during a Save'
tokenizer = new StringTokenizer(message, " ");
field = 0;
row = new Vector(7);
while (tokenizer.hasMoreTokens() && field <= 10)
{
token = tokenizer.nextToken();
field++;
switch ( field )
{
case 1: // revision
row.add(token);
row.add(fileName);
break;
case 3: // changelist number
row.add(token);
break;
case 4: // type of change, edit, add, etc - skip
row.add(token);
break;
case 6: // date
row.insertElementAt(token,3);
break;
case 8: // changed by
row.insertElementAt(token,4);
break;
case 10: // description
int idx = message.indexOf("'");
if ( idx == -1 )
{
continue;
}
row.add(message.substring(idx+1, message.length()-1));
break;
case 2: // word 'change'
case 5: // word 'on' - skip
case 7: // word 'by'
case 9: // (text)
break;
}
}
table.add(row);
}
}
DefaultTableModel model = new DefaultTableModel(table, _columnNames)
{
public boolean isCellEditable(int row, int column)
{
return false;
}
};
_historyTable.setModel(model);
pack();
setLocation();
}
/**
* set the dialogs location centered on its parent. If it doesn't
* hava a parent then center it on the screen.
*/
public void setLocation()
{
Component parent = getParent();
int ix, iy, bx, by;
Dimension d = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
Dimension dd = getSize();
if ( parent == null )
{
ix = (d.width-dd.width)/2;
iy = (d.height-dd.height)/2;
}
else
{
Rectangle bounds = parent.getBounds();
Rectangle abounds = getBounds();
ix = bounds.x + (bounds.width - abounds.width)/ 2;
iy = bounds.y + (bounds.height - abounds.height)/2;
}
if(iy < 10) iy = 10;
if(ix < 10) ix = 10;
bx = ix+dd.width;
by = iy+dd.height;
// see if the dialog is off the screen.
if ( bx > d.width )
{
ix -=bx-d.width;
}
if ( by > d.height )
{
iy -= by-d.height;
}
setLocation(ix,iy);
}
protected Vector getChangeList()
{
int rowCnt = _historyTable.getRowCount();
Vector v = new Vector(rowCnt);
for (int i = 0; i < rowCnt; i++ )
{
v.add(_historyTable.getValueAt(i, 2));
}
return v;
}
public static void main(String[] args)
{
new HistoryDialog(new JFrame(), "File History", false).setVisible(true);
}
}