blob: c77687464ebc9d784a4c33d928144e8a71555f28 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.chemistry.opencmis.workbench.details;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.Collection;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.ObjectId;
import org.apache.chemistry.opencmis.workbench.ClientHelper;
import org.apache.chemistry.opencmis.workbench.model.ClientModel;
import org.apache.chemistry.opencmis.workbench.model.ClientModelEvent;
import org.apache.chemistry.opencmis.workbench.model.ObjectListener;
import org.apache.chemistry.opencmis.workbench.swing.CollectionRenderer;
import org.apache.chemistry.opencmis.workbench.swing.IdRenderer;
public abstract class AbstractDetailsTable extends JTable implements ObjectListener {
private static final long serialVersionUID = 1L;
private static final Cursor HAND_CURSOR = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
private static final Cursor DEFAULT_CURSOR = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
private ClientModel model;
private String[] columnNames;
@SuppressWarnings("PMD.ArrayIsStoredDirectly")
public void init(final ClientModel model, final String[] columnNames, final int[] colummnWidths) {
this.model = model;
model.addObjectListener(this);
this.columnNames = columnNames;
setModel(new DetailsTableModel(this));
setDefaultRenderer(Collection.class, new CollectionRenderer());
setDefaultRenderer(ObjectId.class, new IdRenderer());
setAutoResizeMode(AUTO_RESIZE_OFF);
setAutoCreateRowSorter(true);
for (int i = 0; i < colummnWidths.length; i++) {
TableColumn column = getColumnModel().getColumn(i);
column.setPreferredWidth(colummnWidths[i]);
}
setFillsViewportHeight(true);
final JPopupMenu popup = new JPopupMenu();
final JMenuItem menuItem = new JMenuItem("Copy to clipboard");
popup.add(menuItem);
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ClientHelper.copyTableToClipboard(AbstractDetailsTable.this);
}
});
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
int row = rowAtPoint(e.getPoint());
int column = columnAtPoint(e.getPoint());
if (row > -1 && column > -1) {
if (e.getClickCount() == 1) {
singleClickAction(e, row, column);
} else if (e.getClickCount() == 2) {
doubleClickAction(e, row);
}
}
}
}
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
}
});
addMouseMotionListener(new MouseMotionListener() {
public void mouseMoved(MouseEvent e) {
int row = rowAtPoint(e.getPoint());
int column = columnAtPoint(e.getPoint());
if (row > -1 && getColumnClass(column) == ObjectId.class) {
setCursor(HAND_CURSOR);
} else {
setCursor(DEFAULT_CURSOR);
}
}
public void mouseDragged(MouseEvent e) {
}
});
}
public void objectLoaded(ClientModelEvent event) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
((DetailsTableModel) getModel()).fireTableDataChanged();
}
});
}
public CmisObject getObject() {
return model.getCurrentObject();
}
public ClientModel getClientModel() {
return model;
}
public String[] getColumnNames() {
return columnNames;
}
public abstract int getDetailRowCount();
public abstract Object getDetailValueAt(int rowIndex, int columnIndex);
public Class<?> getDetailColumClass(int columnIndex) {
return String.class;
}
public void singleClickAction(MouseEvent e, int rowIndex, int colIndex) {
}
public void doubleClickAction(MouseEvent e, int rowIndex) {
}
public void setTab(int tab) {
((JTabbedPane) getParent().getParent().getParent()).setSelectedIndex(tab);
}
static class DetailsTableModel extends AbstractTableModel {
private final AbstractDetailsTable table;
public DetailsTableModel(AbstractDetailsTable table) {
this.table = table;
}
private static final long serialVersionUID = 1L;
public String getColumnName(int columnIndex) {
return table.getColumnNames()[columnIndex];
}
public int getColumnCount() {
return table.getColumnNames().length;
}
public int getRowCount() {
if (table.getObject() == null) {
return 0;
}
return table.getDetailRowCount();
}
public Object getValueAt(int rowIndex, int columnIndex) {
if (table.getObject() == null) {
return null;
}
return table.getDetailValueAt(rowIndex, columnIndex);
}
public Class<?> getColumnClass(int columnIndex) {
return table.getDetailColumClass(columnIndex);
}
}
}