/* * * 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.util.Vector; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.UIManager; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import com.dafreels.opentools.Main; import com.dafreels.opentools.MessageWriter; import com.dafreels.vcs.command.Command; import com.dafreels.vcs.command.CommandTool; import com.dafreels.vcs.command.MessageFormatter; import com.dafreels.vcs.command.PropertyInterface; /** * <p>Title: Perforce Open Tool </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2002</p> * <p>Company: RMA</p> * @author Mark Ackerman * */ public class DescribeDialog extends JDialog { private static final String LEAD_IN = "... "; private static final Color GRAY = new Color(200,200,200); private JTextPane _descriptionText; private String _changeListNumber; private Vector _changeList; private JButton _diffsButton; public DescribeDialog(Frame frame, String title, boolean modal, String changeListNumber, Vector changeList ) { super(frame, title, modal); _changeListNumber = changeListNumber; _changeList = changeList; buildControls(); } protected void buildControls() { getContentPane().setLayout(new GridBagLayout()); _descriptionText = new JTextPane() { public Dimension getPreferredScrollableViewportSize() { Dimension d = super.getPreferredScrollableViewportSize(); d.width = 500; d.height = 200; return d; } }; _descriptionText.setEditable(false); //_descriptionText.setWrapStyleWord(true); //_descriptionText.setLineWrap(true); _descriptionText.setBackground(null); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 1; gbc.weightx = 1.0; gbc.weighty = 1.0; gbc.anchor = GridBagConstraints.NORTHWEST; gbc.fill = GridBagConstraints.BOTH; gbc.insets = new Insets(5,5,0,5); getContentPane().add(new JScrollPane(_descriptionText), gbc); JPanel panel = new JPanel(new GridBagLayout()); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.SOUTH; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.insets = new Insets(5,5,0,5); getContentPane().add(panel, gbc); JButton upbutton = new JButton(getImageIcon("com/borland/primetime/actions/image/up.gif")); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.SOUTH; gbc.fill = GridBagConstraints.VERTICAL; gbc.insets = new Insets(5,5,0,5); panel.add(upbutton, gbc); JButton downbutton = new JButton(getImageIcon("com/borland/primetime/actions/image/down.gif")); gbc = new GridBagConstraints(); gbc.gridx = 1; gbc.gridy = 0; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.SOUTH; gbc.fill = GridBagConstraints.VERTICAL; gbc.insets = new Insets(5,5,0,5); panel.add(downbutton, gbc); _diffsButton = new JButton("Show Diffs"); gbc = new GridBagConstraints(); gbc.gridx = 2; gbc.gridy = 0; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.SOUTH; gbc.fill = GridBagConstraints.NONE; gbc.insets = new Insets(5,5,0,5); panel.add(_diffsButton, gbc); JButton okbutton = new JButton("Close"); gbc = new GridBagConstraints(); gbc.gridx = 3; gbc.gridy = 0; gbc.gridwidth = 1; gbc.weightx = 0.; gbc.weighty = 0.; gbc.anchor = GridBagConstraints.SOUTHEAST; gbc.fill = GridBagConstraints.NONE; gbc.insets = new Insets(5,5,0,5); panel.add(okbutton, gbc); okbutton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setVisible(false); } }); _diffsButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { runDescribe(true); _diffsButton.setVisible(false); } }); if ( _changeList == null || _changeList.size() == 0 ) { upbutton.setVisible(false); downbutton.setVisible(false); } else { upbutton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { previousChange(); } }); downbutton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { nextChange(); } }); } } /** * fill this dialog with the contents of formatter * @param formatter the output from the <code>fstat</code> command */ public void fillForm(MessageFormatter formatter) { _descriptionText.setText(""); String message, arg; SimpleAttributeSet attrs; PropertyInterface props = Main.m_props; DefaultListModel model = new DefaultListModel(); formatter.getNextMessage(); // throw away first line MessageWriter.outputErrorMessages(MessageFormatter.getInstance()); while( (message = formatter.getNextMessage()) != null) { if ( message.startsWith(LEAD_IN)) { message = message.substring(4); } message = message.trim(); message = message.concat("\n"); if ( message.startsWith("//")) { appendFileLine(message); } else { attrs = new SimpleAttributeSet(); StyleConstants.setForeground(attrs, UIManager.getColor("TextField.foreground")); StyleConstants.setBackground(attrs, GRAY); appendText(message, attrs); } //_descriptionText.append("\n"); } _descriptionText.setCaretPosition(0); if( !isVisible() ) { pack(); setLocation(); } } protected void appendFileLine(String message) { SimpleAttributeSet attrs = new SimpleAttributeSet(); StyleConstants.setForeground(attrs, Color.blue); StyleConstants.setBackground(attrs, GRAY); StyleConstants.setUnderline(attrs, true); int idx = message.lastIndexOf(" "); if ( idx == -1 ) { appendText(message, attrs); } else { String file = message.substring(0, idx); appendText(file, attrs); attrs = new SimpleAttributeSet(); StyleConstants.setForeground(attrs, UIManager.getColor("TextField.foreground")); StyleConstants.setBackground(attrs, GRAY); appendText(message.substring(idx), attrs); } } protected void appendText(String message, SimpleAttributeSet attrs) { Font f = (Font)UIManager.get("TextField.font"); StyleConstants.setFontFamily(attrs,f.getFamily()); StyleConstants.setFontSize(attrs, f.getSize()+1); try { Document doc = _descriptionText.getDocument(); int len = doc.getLength(); doc.insertString(len, message, attrs); } catch (BadLocationException ex) { System.out.println(ex); } } /** * 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); } public void runDescribe(boolean showDiffs) { if ( _changeListNumber == null ) { return; } try { setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); StringBuffer sb = new StringBuffer("describe "); if ( !showDiffs ) { sb.append("-s "); } sb.append(_changeListNumber); //Run the command CommandTool.runCommand(new Command(sb.toString()), Main.m_props); //Output the p4 messages fillForm(MessageFormatter.getInstance()); } finally { setCursor(Cursor.getDefaultCursor()); } } protected void previousChange() { if ( _changeList == null ) { return; } int idx = _changeList.indexOf(_changeListNumber); if ( idx >= _changeList.size() || idx < 1) { return; } idx--; _changeListNumber = (String)_changeList.get(idx); runDescribe(!_diffsButton.isVisible()); } protected void nextChange() { if ( _changeList == null ) { return; } int idx = _changeList.indexOf(_changeListNumber); if ( idx >= _changeList.size() || idx == -1) { return; } idx++; _changeListNumber = (String)_changeList.get(idx); runDescribe(!_diffsButton.isVisible()); } /** * Retrieves a ImageIcon for a particular path. The path could be a path for a system resource, * or a file path. This method checks the system resources first. If nothing is found, it checks * the file path. If */ public static javax.swing.ImageIcon getImageIcon(String name ) { if ( name == null || name.length() == 0 ) return null; try { java.net.URL url = ClassLoader.getSystemResource(name); if ( url == null ) { java.io.File f = new java.io.File(name); url = f.toURL(); if(url == null) return null; } return getImageIcon(url); } catch (Exception e) { System.out.println("getImageIcon: Error loading " + name +" Error: " + e); e.printStackTrace(); } return null; } public static javax.swing.ImageIcon getImageIcon(java.net.URL url) { java.awt.Toolkit tk = java.awt.Toolkit.getDefaultToolkit(); if ( tk == null ) return null; java.awt.Image image = tk.getImage(url); if ( image == null ) return null; return new javax.swing.ImageIcon(image); } }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#3 | 4090 | David Freels |
Fixed bug where paths with spaces would not work. Also checked in new code or JBuilderX. |
||
#2 | 2994 | Mark E. Ackerman |
changed for version 1.0.7. Added display of submitted changelists, redo sync, updated icons, misc bug fixes and improvements. |
||
#1 | 1640 | Mark E. Ackerman |
added diff action, unlock action, status dialog, file history with detail, fixed stretching of submit dialog. added diff to submit dialog. added icons to the popup menu. added status line message for most actions. added confirm to revert action. added displaying of error messages from p4 command. added About Open tool support. added option on Perforce Page to not display output from p4 command. added version info on the PerforcePage. some other misc fixes and changes. changed version number to 0.9.3 |