//
// This file is part of the prose package.
//
// The contents of this file are subject to the Mozilla Public License
// Version 1.1 (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.mozilla.org/MPL/
//
// Software distributed under the License is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// for the specific language governing rights and limitations under the
// License.
//
// The Original Code is prose.
//
// The Initial Developer of the Original Code is Andrei Popovici. Portions
// created by Andrei Popovici are Copyright (C) 2002 Andrei Popovici.
// All Rights Reserved.
//
// Contributor(s):
// $Id: JWorksheetProseClientPane.java,v 1.3 2008/11/18 11:43:39 anicoara Exp $
// ==============================================================
//
package ch.ethz.prose.tools;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.InputEvent;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.JTableHeader;
import javax.swing.BorderFactory;
import java.awt.Color;
/**
* @author pschoch
*/
public class JWorksheetProseClientPane extends javax.swing.JSplitPane {
private static final long serialVersionUID = 4050765991929655860L;
public static final int ASPECT_COL_INDEX = 0;
public static final int JOINPOINT_COL_INDEX = 2;
public static final Color SEL_COLOR = new Color(255, 204, 204);
public static final Color NOT_SEL_COLOR = new Color(153, 153, 153);
public static final Color WHITE_COLOR = new Color(255, 255, 255);
public static final Color SEL_TABCELL_COLOR = new Color(204, 204, 255);
private javax.swing.JScrollPane tableScrollPaneRight;
private javax.swing.JScrollPane tableScrollPaneLeft;
private javax.swing.JTable leftTable;
private javax.swing.JTable rightTable;
private JMultipleProseClient parent = null;
private MultipleClientModel myModel = null;
private String proseName = null;
private String url = null;
private String host = null;
private String port = null;
private JTable activeTable = null; // will be either the left or the right table
/** Creates new form BeanForm */
public JWorksheetProseClientPane() {}
public JWorksheetProseClientPane(JMultipleProseClient parent, String name, String host, String port)
throws IllegalUserInputException {
// setOrientation(VERTICAL_SPLIT);
this.parent = parent;
this.myModel = parent.getModel();
this.proseName = name;
this.url = host + ":" + port;
this.host = host;
this.port = port;
initComponents();
setActiveTable(leftTable);
}
public String getHost() {
return host;
}
public String getPort() {
return port;
}
/** 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.
*/
private void initComponents() throws IllegalUserInputException {
tableScrollPaneLeft = new javax.swing.JScrollPane();
leftTable = new JToolTipTable();
tableScrollPaneRight = new javax.swing.JScrollPane();
rightTable = new JToolTipTable();
setPreferredSize(new java.awt.Dimension(802, 452));
setMinimumSize(new java.awt.Dimension(2, 2));
setDividerLocation(0.5);
tableScrollPaneLeft.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
tableScrollPaneLeft.setPreferredSize(new java.awt.Dimension(400, 450));
tableScrollPaneLeft.setName("scrollPane");
tableScrollPaneLeft.setMinimumSize(new java.awt.Dimension(0, 0));
leftTable.setModel(myModel.createTableModel(proseName,host,port,true));
tableScrollPaneLeft.setBorder(BorderFactory.createTitledBorder("REAL ASPECT MANAGER"));
tableScrollPaneRight.setBorder(BorderFactory.createTitledBorder("TEST ASPECT MANAGER"));
leftTable.setIntercellSpacing(new java.awt.Dimension(2, 2));
leftTable.setColumnSelectionAllowed(true);
leftTable.setTableHeader(new JTableHeader(leftTable.getColumnModel()));
leftTable.getTableHeader().setBackground(NOT_SEL_COLOR);
leftTable.getTableHeader().addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
onMousePressed(evt);
}
});
leftTable.setPreferredSize(new Dimension(this.getWidth(), ((WorksheetSingleClientModel)leftTable.getModel()).getRowCount()
* leftTable.getRowHeight()));
leftTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
leftTable.setMaximumSize(new java.awt.Dimension(32767, 32767));
leftTable.setName("leftTable");
leftTable.setAutoCreateColumnsFromModel(false);
leftTable.setMinimumSize(new java.awt.Dimension(450, 100));
leftTable.setPreferredSize(new java.awt.Dimension(450, 400));
customizeTable(leftTable);
leftTable.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
tableMouseClicked(evt);
tableMouseRightClicked(evt);
}
});
tableScrollPaneLeft.setViewportView(leftTable);
setLeftComponent(tableScrollPaneLeft);
tableScrollPaneRight.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
tableScrollPaneRight.setPreferredSize(new java.awt.Dimension(400, 450));
tableScrollPaneRight.setName("scrollPane");
tableScrollPaneRight.setMinimumSize(new java.awt.Dimension(0, 0));
rightTable.setModel(myModel.createTableModel(proseName,host,port,false));
rightTable.setIntercellSpacing(new java.awt.Dimension(2, 2));
rightTable.setColumnSelectionAllowed(true);
rightTable.setTableHeader(new JTableHeader(rightTable.getColumnModel()));
rightTable.getTableHeader().setBackground(NOT_SEL_COLOR);
rightTable.getTableHeader().addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
onMousePressed(evt);
}
});
rightTable.setPreferredSize(new Dimension(this.getWidth(), ((WorksheetSingleClientModel)rightTable.getModel()).getRowCount()
* rightTable.getRowHeight()));
rightTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
rightTable.setMaximumSize(new java.awt.Dimension(32767, 32767));
rightTable.setPreferredSize(new java.awt.Dimension(450, 400));
rightTable.setName("rightTable");
rightTable.setAutoCreateColumnsFromModel(false);
rightTable.setMinimumSize(new java.awt.Dimension(450, 100));
customizeTable(rightTable);
rightTable.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
tableMouseClicked(evt);
tableMouseRightClicked(evt);
}
});
tableScrollPaneRight.setViewportView(rightTable);
setRightComponent(tableScrollPaneRight);
}//GEN-END:initComponents
private void tableMouseRightClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tableMouseRightClicked
if (!((evt.getModifiers() & InputEvent.BUTTON3_MASK) == InputEvent.BUTTON3_MASK))
return;
JTable myTable = (JTable)evt.getSource();
Object value = myTable.getModel().getValueAt(myTable.rowAtPoint(evt.getPoint()), myTable.columnAtPoint(evt.getPoint()));
if (value == null)
return;
((JMultipleProseClient)getTopLevelAncestor()).newTextAreaContent(value.toString());
}//GEN-LAST:event_tableMouseRightClicked
private void tableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tableMouseClicked
JTable myTable = (JTable)evt.getSource();
if (isActive(myTable))
return;
setActiveTable(myTable);
((WorksheetSingleClientModel)myTable.getModel()).setSelectedCells(new int[] { myTable.rowAtPoint(evt.getPoint()) });
((WorksheetSingleClientModel)myTable.getModel()).setSelectedColumn(myTable.columnAtPoint(evt.getPoint()));
}//GEN-LAST:event_tableMouseClicked
private void onMousePressed(java.awt.event.MouseEvent evt) {
JTable myTable = ((JTableHeader)evt.getComponent()).getTable();
if (isActive(myTable))
return;
setActiveTable(myTable);
}
public void select() {
myModel.setActualTableModel((WorksheetSingleClientModel)activeTable.getModel());
}
private void setActiveTable(JTable myTable) {
if (activeTable != null) {
activeTable.getTableHeader().setBackground(NOT_SEL_COLOR);
activeTable.setSelectionBackground(WHITE_COLOR);
}
if (!myTable.equals(activeTable)) {
activeTable = myTable;
activeTable.getTableHeader().setBackground(SEL_COLOR);
activeTable.setSelectionBackground(SEL_TABCELL_COLOR);
myModel.setActualTableModel((WorksheetSingleClientModel)activeTable.getModel());
}
}
public JTable getActiveTable() {
return activeTable;
}
public boolean isActive(JTable table) {
return table.equals(activeTable);
}
public JTable getLeftTable() {
return leftTable;
}
public JTable getRightTable() {
return rightTable;
}
public String getProseName() {
return proseName;
}
public String getProseURL() {
return url;
}
public String toString() {
return ("JWorksheetProseClientPane: " + proseName);
}
protected void customizeTable(JTable table) throws IllegalUserInputException {
setActiveTable(table);
((WorksheetSingleClientModel)table.getModel()).addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
try
{
getActiveTable().setPreferredSize(new java.awt.Dimension(getActiveTable().getWidth(),
myModel.getActualTableModel().getRowCount() *
getActiveTable().getRowHeight()));
}
catch (IllegalUserInputException e1)
{/*cannot happen */}
}
});
table.getTableHeader().setReorderingAllowed(false);
//assign selection model for row selection and for column selection
table.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
table.getColumnModel().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
try {
// install the ListSelectionListener that listens on row selection changes
if (e.getValueIsAdjusting())
return;
myModel.getActualTableModel().setSelectedCells(getActiveTable().getSelectedRows());
if (getActiveTable().getSelectedRowCount() > 0) {
if (getActiveTable().getSelectedColumnCount() == 1)
myModel.getActualTableModel().setSelectedColumn(getActiveTable().getSelectedColumn());
}
else
myModel.getActualTableModel().setSelectedColumn(-1);
}
catch (IllegalUserInputException e2)
{/*cannot happen */}
}
});
table.getColumnModel().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
try {
// install the ListSelectionListener that listens on column selection changes
if (e.getValueIsAdjusting())
return;
myModel.getActualTableModel().setSelectedColumn(getActiveTable().getSelectedColumn());
}
catch (IllegalUserInputException e3)
{/*cannot happen */}
}
});
table.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
try {
// to indicate the selected cells correctly. By default the forground color is omitted every second time.
if (getActiveTable().getColumnModel().getColumnIndexAtX(evt.getX()) == myModel.getActualTableModel().getSelectedColumn())
getActiveTable().getColumnModel().getSelectionModel().setSelectionInterval(
myModel.getActualTableModel().getSelectedColumn(), myModel.getActualTableModel().getSelectedColumn());
}
catch (IllegalUserInputException e4)
{/*cannot happen */}
}
});
table.getColumnModel().getColumn(JOINPOINT_COL_INDEX).setCellRenderer(new MyJPSurrogateRenderer());
}
public static class JToolTipTable extends JTable {
private static final long serialVersionUID = 3544395807361872688L;
public String getToolTipText(java.awt.event.MouseEvent e) {
Point p = e.getPoint();
Object value = getValueAt(rowAtPoint(p), columnAtPoint(p));
if (value != null)
return value.toString();
else
return "";
}
}
public class MyJPSurrogateRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 3256437023534627123L;
public java.awt.Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
java.awt.Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
int [] pastedCells = ((WorksheetSingleClientModel)table.getModel()).pastedCells;
if ((pastedCells != null) && (row >= pastedCells[0]) &&
(row <= pastedCells[pastedCells.length-1])) {
this.setFont(new java.awt.Font("Dialog", java.awt.Font.ITALIC, 12));
}
return component;
}
}
}