Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   *
   * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
   *
   * The contents of this file are subject to the terms of either the GNU
   * General Public License Version 2 only ("GPL") or the Common
   * Development and Distribution License("CDDL") (collectively, the
   * "License"). You may not use this file except in compliance with the
  * License. You can obtain a copy of the License at
  * http://www.netbeans.org/cddl-gplv2.html
  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
  * specific language governing permissions and limitations under the
  * License.  When distributing the software, include this License Header
  * Notice in each file and include the License file at
  * nbbuild/licenses/CDDL-GPL-2-CP.  Sun designates this
  * particular file as subject to the "Classpath" exception as provided
  * by Sun in the GPL Version 2 section of the License file that
  * accompanied this code. If applicable, add the following below the
  * License Header, with the fields enclosed by brackets [] replaced by
  * your own identifying information:
  * "Portions Copyrighted [year] [name of copyright owner]"
  *
  * Contributor(s):
  *
  * The Original Software is NetBeans. The Initial Developer of the Original
  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
  * Microsystems, Inc. All Rights Reserved.
  *
  * If you wish your version of this file to be governed by only the CDDL
  * or only the GPL Version 2, indicate your decision by adding
  * "[Contributor] elects to include this software in this distribution
  * under the [CDDL or GPL Version 2] license." If you do not indicate a
  * single choice of license, a recipient has the option to distribute
  * your version of this file under either the CDDL, the GPL Version 2 or
  * to extend the choice of license to its licensees as provided above.
  * However, if you add GPL Version 2 code and therefore, elected the GPL
  * Version 2 license, then the option applies only if the new code is
  * made subject to such option by the copyright holder.
  */
 /*
  * DDTablePanel.java -- synopsis.
  *
  */
 
 package org.netbeans.modules.j2ee.sun.ide.editors.ui;
 
 import java.awt.*;
 import java.util.*;
 import java.text.*;
 import javax.swing.*;
 
 import org.openide.*;
Panel containing a JTable for display of Deployment Descriptor array values, and an "add" and "remove" button.

Author(s):
Joe Warzecha
 
 //
 // 29-may-2001
 //	Changes for bug 4457984. Added an ancestor listener to check
 //	for the user cancelling. Changed the call to the addRowAt so
 //	the newly created row is passed to the next level, and called
 //	newElementCancelled in the case where the user cancels the creation
 //	of a new row. (joecorto)
 //	
 public class DDTablePanel extends JPanel 
 			  implements EnhancedCustomPropertyEditor {
 
     static final ResourceBundle bundle = NbBundle.getBundle
                                                 	(DDTablePanel.class);
 
     private DDTableModel model;
 
     private JScrollPane scrollPane;
     private JTable	tab;
     private JButton 	addButton;
     private JButton     editButton;
     private JButton 	removeButton;
     private int         sortCol;
     private Dialog      editDialog
 			    
     public DDTablePanel (DDTableModel mString [] toolTips) {
 	initComponents (mtoolTipstruetruetrue, 500, 70, 12);
     }
 
     public DDTablePanel (DDTableModel mString [] toolTipsint insetVal) {
 	initComponents (mtoolTipstruetruetrue, 500, 70, insetVal);
     }
 
    public DDTablePanel (DDTableModel mString[] toolTipsboolean allowAdd,
			 boolean allowRemove) {
        initComponents (mtoolTipsallowAddallowRemovetrue, 500, 70, 12);
    }
    public DDTablePanel (DDTableModel m) {
        initComponents (mnew String [0], falsefalsefalse, 500, 70, 12);
    }
    
    public DDTablePanel (DDTableModel mString [] toolTipsint widthint height){
        initComponents (mtoolTipstruetruetruewidthheight, 12);
    }

    
This method is called from within the constructor to initialize the form.
    private void initComponents (DDTableModel mString [] toolTips,
				 boolean allowAddboolean allowRemove,
				 boolean allowEditint widthint height,
				 int insetVal) {
	JPanel      buttonPanel;
	 = m;
	 = -1;
	setBorder (new EmptyBorder (insetValinsetValinsetValinsetVal));
	 = new JTable ();
	buttonPanel = new JPanel ();
	buttonPanel.setLayout (new FlowLayout ());
	 = new JButton ();
//	addButton.setText (bundle.getString ("CTL_Add"));
    org.openide.awt.Mnemonics.setLocalizedText(.getString ("CTL_Add")); // NOI18N	
	    public void actionPerformed (ActionEvent evt) {
	        addButtonActionPerformed (evt);
	    }
	});
	buttonPanel.add ();
        
         = new JButton ();
//	editButton.setText (bundle.getString ("CTL_Edit"));
    org.openide.awt.Mnemonics.setLocalizedText(.getString ("CTL_Edit")); // NOI18N	
	    public void actionPerformed (ActionEvent evt) {
	    }
	});
	buttonPanel.add ();
	 = new JButton ();
//	removeButton.setText (bundle.getString ("CTL_Remove"));
    org.openide.awt.Mnemonics.setLocalizedText(.getString ("CTL_Remove")); // NOI18N	
	    public void actionPerformed (ActionEvent evt) {
	        removeButtonActionPerformed (evt);
	    }
	});
	buttonPanel.add ();
	add (buttonPanel.);
	if ( instanceof SortableDDTableModel) {
	}
	setHeaderToolTips (toolTips);
	if ((allowRemove) || (allowEdit)) {
	         new ListSelectionListener() {
	             public void valueChanged(ListSelectionEvent e) {
		         if ((!e.getValueIsAdjusting()) &&
					(.getRowCount () > 0)) {
		             boolean rowSelected = .getSelectedRow() != -1;
		             .setEnabled(rowSelected);
			     .setEnabled(rowSelected);
		         }
	             }
	         }
            );
	}
	if (allowEdit) {
	        public void mouseClicked(MouseEvent me) {
	            if (me.getClickCount() == 2) {
		        int row = .rowAtPoint(me.getPoint());
		        if (row != -1) {
		            .setRowSelectionInterval(row,row);
		            editButtonActionPerformed(null);          
		        }
	            }
	        }
	    });
	}
	.setVisible (allowEdit);
	int tableWidth = initColumnSizes();
	if (tableWidth > width) {
	    width = tableWidth;
	}
	this.addAncestorListener(new AListener()); // BUG 4457984
        initAccessibility();
    } 
    private void initAccessibility(){
        getAccessibleContext().setAccessibleDescription(.getString ("ACSD_DDTablePanel"));
    }
    public void addListSelectionListener (ListSelectionListener l) {
    }
    }
    public void setVerticalScrollBarValue (int val) {
	int curVal = .getVerticalScrollBar ().getValue ();
	if (curVal != val) {
	}
    }
    
    public void linkLabel(JLabel label)
    {
        label.setLabelFor();
    }
    public Color getHeaderColor () {
	if (.getColumnCount () < 1) {
	    return .;
	}
				        (c.getHeaderValue (), false
					 false, -1, 0);
	return comp.getForeground ();
    }
    public int getSelectedRow () {
	return .getSelectedRow ();
    }
    public void setSelectedRow (int row) {
	if (row == -1) {
	    .clearSelection ();
else {
	    .addRowSelectionInterval (rowrow);
	}
    }
    private void setHeaderToolTips (String [] toolTips) {
	/* 
	 * A change was made in the jdk, such that in jdk1.3, the
	 * TableColumn may not have a TableCellRenderer for the table
	 * headers. Now, that renderer is created in the JTableHeader
	 * instead. Because of this inconsistency, I added code
	 * which determines if the TableColumn has a default renderer
	 * and if not, creates one (the code is actually "stolen" from
	 * the jdk1.2.2 source).
	 */
	for (int i = 0; i < .getColumnCount(); i++) {
	    TableColumn c = .getColumnModel ().getColumn (i);
	    TableCellRenderer cellR = c.getHeaderRenderer ();
	    
                 public Component getTableCellRendererComponent (JTable table,
                                                                 Object value,
                         		                   boolean isSelected,
                                                             boolean hasFocus
					                  int rowint column)
                 {
                      if (table != null) {
                          JTableHeader header = table.getTableHeader();
                    	  if (header != null) {
                              setForeground(header.getForeground());
                              setBackground(header.getBackground());
			      int style = 
                                (.convertColumnIndexToModel(column) ==
                                 )?.:.;
                              setFont(header.getFont().deriveFont(style));
			  }
		      }
 
                      setText ((value == null) ? "" : value.toString ());	// NOI18N
                      setBorder(UIManager.getBorder("TableHeader.cellBorder"));	// NOI18N
                      return this;
		 }
	    };
            label.setHorizontalAlignment(.);
	    c.setHeaderRenderer (label);
	    cellR = label;
	    Component comp = cellR.getTableCellRendererComponent 
				        (c.getHeaderValue (), false
					 false, -1, i);
	    if ((comp != null) && (comp instanceof JComponent
		 && i<toolTips.length) {
    		JComponent jComp = (JComponentcomp;
    		jComp.setToolTipText (toolTips [i]);
	    } 
      	}
    }
    private int maxSize(int col) {
        Component c = null;
	int max = 0;
        for (int i = 0; i < .getRowCount(); i++) {
                             getTableCellRendererComponent(
                                 .getValueAt(i,col),
                                 falsefalseicol);
	    if (c.getPreferredSize(). > max) {
	        max = c.getPreferredSize().;
	    }
        }
	return max;
    }			    
    private int initColumnSizes() {
        for (int i = 0; i < .getColumnCount(); i++) {
            TableColumn column = .getColumnModel().getColumn(i);
            Component comp = column.getHeaderRenderer().
                             getTableCellRendererComponent(
                                 nullcolumn.getHeaderValue(), 
                                 falsefalse, 0, 0);
	    /* 
	     * Note the +6 is so that there will be some "white" space
	     * on each side of the text in the header.
	     */
            int headerWidth = comp.getPreferredSize(). + 6;
            int cellWidth = maxSize(i);
	    totWidth += Math.max (headerWidthcellWidth);
            column.setPreferredWidth(Math.max(headerWidthcellWidth));
        }
	return totWidth;
    } 			    
    public void setCellEditor (int colTableCellEditor cEdit) {
    }   
    private void addButtonActionPerformed(ActionEvent evt) {
    }
    private void closeEditDialog() {
        .setVisible(false);
        .dispose();
	 = null;
    }			    
    public void editSelectedRow () {
	editRow (.getSelectedRow (), false);
    }
    private void editRow(final int rowfinal boolean isNew) {
        final DDTableModelEditor editor = .getEditor();
	//
	// Changed how new is done for bug 4457984.
	//
	final Object obj = (isNew?.makeNewElement():.getValueAt(row));
	editor.setValue(obj);
	JPanel p = new JPanel();
	JPanel editorPanel = editor.getPanel ();        
	HelpCtx hCtx = null// HelpCtx.findHelp (editorPanel);        
	if (hCtx != null) {
	    HelpCtx.setHelpIDString (phCtx.getHelpID ());
	}
	p.add(.editorPanel);
	String editType = isNew?.getString("TTL_ADD"):
	                        .getString("TTL_EDIT");
	String title = MessageFormat.format(.getString("TTL_DIALOG"),
					    new Object[] {
	                                        editType
                                            });
	}
        DialogDescriptor dd = new DialogDescriptor(ptitle
            true.null
            .null
            new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
		   if (evt.getSource() != .) {
		       if (isNew) {
			    //
			    // BUG 4457984 - the new was cancelled, so
			    // tell the model. This allows the app server
			    // api to be told.
			    //
		       }
		   } else {
                       java.util.List errors = 
                           .isValueValid
					(editor.getValue (), isNew?-1:row);
                       if (! errors.isEmpty()) {
                           Component errorComp = getErrorComponent (("MSG_TableErrors"),errors);// NOI18N
                           errorComp.getAccessibleContext().setAccessibleDescription(getA11yText(errors));
                           NotifyDescriptor d = new NotifyDescriptor(errorComp,
                                         MessageFormat.format(
                                            .getString("TTL_DIALOG"),
                                            new Object[] { 
				              .getString("TTL_ERROR"),
					 null);
	                    DialogDisplayer.getDefault().notify(d);
			    return;
                       } else {
			   if (!isNew) {
			       if (! .isEditValid 
						(editor.getValue (), row)) {
				   return;
			       }
			       int[] rows = .getSelectedRows();
			       .clearSelection();
			       .setValueAt(roweditor.getValue());
			       if (rows != null) {
				   for (int i = 0; i < rows.lengthi++) {
				       .setRowSelectionInterval(rows[i], 
								   rows[i]);
				   }
			       }
			   } else {
			       //
			       // BUG 4457984 - pass the row created above
			       // to the next level so that it can store
			       // the original row created.
			       //
			       .addRowAt(row >= .getRowCount() ? .getRowCount()-1 :
                                              rowobjeditor.getValue());
			   } 
			}
                   }
		   closeEditDialog(); 
                }
            });
        dd.setClosingOptions(new Object[0]);
        // XXX workaround for issuezilla 12542
        JButton cancel = new JButton(.getString("LBL_Cancel"));
        cancel.getAccessibleContext().setAccessibleDescription(.getString("ACSD_Cancel"));
        cancel.setVerifyInputWhenFocusTarget(false);
        dd.setOptions(new Object[] { 
                              .,
                              cancel});
         = DialogDisplayer.getDefault().createDialog(dd);
        .setVisible(true);
    }
    			    
    private void editButtonActionPerformed (ActionEvent evt) {
        editRow(.getSelectedRow(), false);
    }
    private void removeButtonActionPerformed (ActionEvent evt) {
	int row = .getSelectedRow ();
	java.util.List errors = .canRemoveRow (row);
	if (! (errors.isEmpty ())) {
	    Component c = getErrorComponent ("MSG_RemoveWarning"errors);	// NOI18N
            NotifyDescriptor.Confirmation confirmDesc =
                           new NotifyDescriptor.Confirmation (c
					.getString ("CTL_Remove") + 
					" " + .getModelName () + " " +	// NOI18N
					.getString ("TTL_WARNING"));
            Object [] options = new Object [] { .getString ("CTL_Remove"),
                           		    . };
            confirmDesc.setOptions (options);
            Object o = DialogDisplayer.getDefault().notify(confirmDesc);
            if (o == .) {
                return ;
            }
	}
	//
	// The following is needed to make sure those rows that have
	// associated app server properties are set up so the plug-in
	// knows they are being deleted. Creating the editor causes
	// the model subclasses to call the plug-in making sure it
	// has loaded its information about these rows (See EjbRefAppSrvEditor
	// and ejb/EditableDDRef).
	//
        DDTableModelEditor editor = .getEditor();
    }
    private Component getErrorComponent 
				(String summaryStringjava.util.List errors) {
	if (errors.size () == 1) {
	    return new MultiLineField ((Stringerrors.get (0));
	}
	MessageArea msg = new MessageArea ();
	Object [] o = new Object [] { .getModelName() };
	msg.setText (MessageFormat.format 
				(.getString (summaryString), o));
	Iterator iter = errors.iterator ();
	while (iter.hasNext ()) {
	    msg.appendBulletItem ((Stringiter.next ());
	}
	return msg;
    }
    private String getA11yText(java.util.List errors) {
        Object [] o = new Object [] { .getModelName() };
        StringBuffer buf =new StringBuffer(MessageFormat.format(.getString("MSG_TableErrors"),o));
        for (int i=0;i<errors.size();i++) {
            buf.append("\n"+(String)errors.get(i)); //NOI18N
        }
        return buf.toString();
    }
    
    
Add listener for table header clicks. This invokes sort on the clicked column.
    private void addMouseListenerToHeader(final SortableDDTableModel model) { 
        MouseAdapter listMouseListener = new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                TableColumnModel columnModel = .getColumnModel();
                int viewColumn = columnModel.getColumnIndexAtX(e.getX()); 
                int column = .convertColumnIndexToModel(viewColumn); 
                if (e.getClickCount() == 1 && column != -1) {
                    model.setSortColumn( = column); 
                }
            }
        };
        JTableHeader th = .getTableHeader(); 
        th.addMouseListener(listMouseListener); 
    }
    public Object getPropertyValue () throws IllegalStateException {
         = true;
	return .getValue ();
    }
    boolean getPropertyValueCalled = false;
    //
    // Added to fix bug 4457984 - check for a cancel.
    //
    class AListener implements AncestorListener {
	public void ancestorAdded(AncestorEvent event) {
	}
	public void ancestorMoved(AncestorEvent event) {
	}
	public void ancestorRemoved(AncestorEvent event) {
	    if (!DDTablePanel.this.isShowing()) {
	    	if () {
		    // User pressed OK
else {
		    // User cancelled
		}
	    }
	}
    }