blob: f3eacacad055699569b4b8eb487333f3870b2240 [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.netbeans.modules.viewmodel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.datatransfer.Transferable;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.List;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JToolTip;
import javax.swing.event.CellEditorListener;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import org.netbeans.junit.NbTestCase;
import org.netbeans.spi.viewmodel.ColumnModel;
import org.netbeans.spi.viewmodel.ExtendedNodeModel;
import org.netbeans.spi.viewmodel.Model;
import org.netbeans.spi.viewmodel.ModelListener;
import org.netbeans.spi.viewmodel.Models;
import org.netbeans.spi.viewmodel.TableModel;
import org.netbeans.spi.viewmodel.TableRendererModel;
import org.netbeans.spi.viewmodel.TreeModel;
import org.netbeans.spi.viewmodel.UnknownTypeException;
import org.openide.util.Exceptions;
import org.openide.util.RequestProcessor;
import org.openide.util.datatransfer.PasteType;
/**
* Test of TableRendererModel.
*
* @author Martin Entlicher
*/
public class TableRendererTest extends NbTestCase {
private OutlineTable ot;
public TableRendererTest(String name) {
super(name);
}
private void setUpModel() {
Model mr = new TableRendererModelImpl();
ArrayList l = new ArrayList ();
l.add(mr);
l.add(new ColumnModelImpl("col1"));
l.add(new ColumnModelImpl("col2"));
Models.CompoundModel mcm = Models.createCompoundModel(l);
OutlineTable tt = BasicTest.createView(mcm);
RequestProcessor rp = tt.currentTreeModelRoot.getRootNode().getRequestProcessor();
BasicTest.waitFinished (rp);
this.ot = tt;
//root = tt.getExplorerManager ().getRootContext ();
}
public void testRenderers() {
setUpModel();
JTable t = ot.treeTable.getTable();
ot.revalidate();
javax.swing.JFrame f = new javax.swing.JFrame();
f.setLayout(new BorderLayout());
f.add(ot, BorderLayout.CENTER);
f.setSize(600, 500);
f.setVisible(true);
//while (f.isVisible()) {
try {
Thread.sleep(333);
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
}
//}
System.out.println("table rows = "+t.getRowCount());
TableCellRenderer tcr = t.getCellRenderer(0, 0);
Component c = tcr.getTableCellRendererComponent(t, null, true, true, 0, 0);
//System.err.println("c = "+c);
assertTrue("Renderer component = "+c, c instanceof RendererComponent);
assertEquals("Renderer of 0:DN", ((RendererComponent) c).getText());
tcr = t.getCellRenderer(0, 1);
c = tcr.getTableCellRendererComponent(t, null, true, true, 0, 1);
assertEquals("Renderer of 0:col1", ((RendererComponent) c).getText());
tcr = t.getCellRenderer(0, 2);
c = tcr.getTableCellRendererComponent(t, null, true, true, 0, 2);
assertEquals("Renderer of 0:col2", ((RendererComponent) c).getText());
tcr = t.getCellRenderer(1, 0);
c = tcr.getTableCellRendererComponent(t, null, true, true, 1, 0);
assertFalse("Renderer component = "+c, c instanceof RendererComponent);
tcr = t.getCellRenderer(1, 1);
c = tcr.getTableCellRendererComponent(t, null, true, true, 1, 1);
assertFalse("Renderer component = "+c, c instanceof RendererComponent);
tcr = t.getCellRenderer(2, 1);
c = tcr.getTableCellRendererComponent(t, null, true, true, 2, 1);
assertEquals("Renderer of 2:col1", ((RendererComponent) c).getText());
tcr = t.getCellRenderer(6, 0);
c = tcr.getTableCellRendererComponent(t, null, true, true, 6, 0);
assertEquals("Renderer of 6:DN", ((RendererComponent) c).getText());
tcr = t.getCellRenderer(8, 2);
c = tcr.getTableCellRendererComponent(t, null, true, true, 8, 2);
assertEquals("Renderer of 8:col2", ((RendererComponent) c).getText());
}
public void testEditors() {
setUpModel();
JTable t = ot.treeTable.getTable();
ot.revalidate();
javax.swing.JFrame f = new javax.swing.JFrame();
f.setLayout(new BorderLayout());
f.add(ot, BorderLayout.CENTER);
f.setSize(600, 500);
f.setVisible(true);
//while (f.isVisible()) {
try {
Thread.sleep(333);
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
}
//}
System.out.println("table rows = "+t.getRowCount());
TableCellEditor tce = t.getCellEditor(0, 0);
assertTrue(tce+"is not editable.", tce.isCellEditable(getMouseClickAt(t, 0, 0)));
//assertTrue(t+"is not editable.", t.isCellEditable(0, 0));
Component c = tce.getTableCellEditorComponent(t, null, true, 0, 0);
//System.err.println("c = "+c);
assertTrue("Editor component = "+c, c instanceof EditorComponent);
assertEquals("Editor of 0:DN", ((EditorComponent) c).getText());
tce = t.getCellEditor(0, 1);
assertTrue(tce+"is not editable.", tce.isCellEditable(getMouseClickAt(t, 0, 1)));
assertTrue(t+"is not editable.", t.isCellEditable(0, 1));
c = tce.getTableCellEditorComponent(t, null, true, 0, 1);
assertTrue("Editor component = "+c, c instanceof EditorComponent);
assertEquals("Editor of 0:col1", ((EditorComponent) c).getText());
tce = t.getCellEditor(0, 2);
assertTrue(tce+"is not editable.", tce.isCellEditable(getMouseClickAt(t, 0, 2)));
assertTrue(t+"is not editable.", t.isCellEditable(0, 2));
c = tce.getTableCellEditorComponent(t, null, true, 0, 2);
assertTrue("Editor component = "+c, c instanceof EditorComponent);
assertEquals("Editor of 0:col2", ((EditorComponent) c).getText());
tce = t.getCellEditor(1, 0);
assertFalse(tce+"is editable.", tce.isCellEditable(getMouseClickAt(t, 1, 0)));
assertFalse(t+"is editable.", t.isCellEditable(1, 0));
c = tce.getTableCellEditorComponent(t, null, true, 1, 0);
assertFalse("Editor component = "+c, c instanceof EditorComponent);
tce = t.getCellEditor(1, 2);
assertFalse(tce+"is editable.", tce.isCellEditable(getMouseClickAt(t, 1, 2)));
assertFalse(t+"is editable.", t.isCellEditable(1, 2));
c = tce.getTableCellEditorComponent(t, null, true, 1, 2);
assertFalse("Editor component = "+c, c instanceof EditorComponent);
tce = t.getCellEditor(3, 1);
assertTrue(tce+"is not editable.", tce.isCellEditable(getMouseClickAt(t, 3, 1)));
assertTrue(t+"is not editable.", t.isCellEditable(3, 1));
c = tce.getTableCellEditorComponent(t, null, true, 3, 1);
assertTrue("Editor component = "+c, c instanceof EditorComponent);
assertEquals("Editor of 3:col1", ((EditorComponent) c).getText());
tce = t.getCellEditor(6, 0);
assertTrue(tce+"is not editable.", tce.isCellEditable(getMouseClickAt(t, 6, 0)));
assertTrue(t+"is not editable.", t.isCellEditable(6, 0));
c = tce.getTableCellEditorComponent(t, null, true, 6, 0);
assertTrue("Editor component = "+c, c instanceof EditorComponent);
assertEquals("Editor of 6:DN", ((EditorComponent) c).getText());
tce = t.getCellEditor(9, 2);
assertTrue(tce+"is not editable.", tce.isCellEditable(getMouseClickAt(t, 9, 2)));
assertTrue(t+"is not editable.", t.isCellEditable(9, 2));
c = tce.getTableCellEditorComponent(t, null, true, 9, 2);
assertTrue("Editor component = "+c, c instanceof EditorComponent);
assertEquals("Editor of 9:col2", ((EditorComponent) c).getText());
}
public void testTooltip() {
setUpModel();
JTable t = ot.treeTable.getTable();
ot.revalidate();
javax.swing.JFrame f = new javax.swing.JFrame();
f.setLayout(new BorderLayout());
f.add(ot, BorderLayout.CENTER);
f.setSize(600, 500);
f.setVisible(true);
//while (f.isVisible()) {
try {
Thread.sleep(333);
} catch (InterruptedException ex) {
Exceptions.printStackTrace(ex);
}
//}
MouseEvent event = getMouseClickAt(t, 0, 0);
String tipText = t.getToolTipText(event);
JToolTip tip = t.createToolTip();
tip.setTipText(tipText);
assertTrue("Bad ToolTip class: "+tip, tip instanceof RendererComponent.ToolTipComponent);
assertEquals("ToolTip for Renderer of 0:DN", tip.getTipText());
event = getMouseClickAt(t, 1, 1);
tipText = t.getToolTipText(event);
tip = t.createToolTip();
tip.setTipText(tipText);
assertFalse("Bad ToolTip class: "+tip, tip instanceof RendererComponent.ToolTipComponent);
event = getMouseClickAt(t, 2, 2);
tipText = t.getToolTipText(event);
tip = t.createToolTip();
tip.setTipText(tipText);
assertTrue("Bad ToolTip class: "+tip, tip instanceof RendererComponent.ToolTipComponent);
assertEquals("ToolTip for Renderer of 2:col2", tip.getTipText());
}
private MouseEvent getMouseClickAt(JTable t, int row, int col) {
Point p = t.getCellRect(row, col, false).getLocation();
MouseEvent me = new MouseEvent(t, 1000, System.currentTimeMillis(), 0, p.x, p.y, 1, false);
return me;
}
private static class RendererComponent extends JLabel {
private String s;
public RendererComponent(String s) {
super(s);
this.s = s;
}
@Override
public String getToolTipText() {
return "ToolTip for "+s;
}
@Override
public JToolTip createToolTip() {
return new ToolTipComponent();
}
private static class ToolTipComponent extends JToolTip {
}
}
private static final class CellRendererImpl implements TableCellRenderer {
private Object node;
private String columnID;
public CellRendererImpl(Object node, String columnID) {
this.node = node;
this.columnID = columnID;
}
public Object getNode() {
return node;
}
public String getColumnID() {
return columnID;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
return new RendererComponent("Renderer of "+node.toString()+":"+columnID);
}
}
private static class EditorComponent extends JTextField {
public EditorComponent(String s) {
super(s);
}
}
private static final class CellEditorImpl implements TableCellEditor {
private Object node;
private String columnID;
public CellEditorImpl(Object node, String columnID) {
this.node = node;
this.columnID = columnID;
}
public Object getNode() {
return node;
}
public String getColumnID() {
return columnID;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
return new EditorComponent("Editor of "+node.toString()+":"+columnID);
}
@Override
public Object getCellEditorValue() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isCellEditable(EventObject anEvent) {
if (anEvent.getSource() instanceof JTable) {
JTable table = (JTable) anEvent.getSource();
if (anEvent instanceof MouseEvent) {
MouseEvent event = (MouseEvent) anEvent;
Point p = event.getPoint();
int row = table.rowAtPoint(p);
int col = table.columnAtPoint(p);
Rectangle rect = table.getCellRect(row, col, true);
p.translate(-rect.x, -rect.y);
System.out.println("isCellEditable("+anEvent+")");
System.out.println("Point "+p+"in rectangle "+rect);
if (p.x > rect.width - 24) {
// last 24 points not editable
return false;
}
}
}
return true;
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
@Override
public boolean stopCellEditing() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void cancelCellEditing() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public void addCellEditorListener(CellEditorListener l) {
}
@Override
public void removeCellEditorListener(CellEditorListener l) {
}
}
private static final class TableRendererModelImpl implements TableRendererModel, TreeModel, TableModel, ExtendedNodeModel {
private List<ModelListener> listeners = new ArrayList<ModelListener>();
// TableRendererModel
@Override
public boolean canRenderCell(Object node, String columnID) throws UnknownTypeException {
return Integer.parseInt((String) node) % 2 == 0; // Use this renderer for even rows only.
}
@Override
public TableCellRenderer getCellRenderer(Object node, String columnID) throws UnknownTypeException {
if (!(Integer.parseInt((String) node) % 2 == 0)) {
throw new IllegalStateException("Trying to get renderer even if we can not provide it node = "+node);
}
return new CellRendererImpl(node, columnID);
}
@Override
public boolean canEditCell(Object node, String columnID) throws UnknownTypeException {
return Integer.parseInt((String) node) % 3 == 0; // Use this renderer for every third row only.
}
@Override
public TableCellEditor getCellEditor(Object node, String columnID) throws UnknownTypeException {
if (!(Integer.parseInt((String) node) % 3 == 0)) {
throw new IllegalStateException("Trying to get editor even if we can not provide it node = "+node);
}
return new CellEditorImpl(node, columnID);
}
@Override
public void addModelListener(ModelListener l) {
listeners.add(l);
}
@Override
public void removeModelListener(ModelListener l) {
listeners.remove(l);
}
// TreeModel
@Override
public Object getRoot() {
return ROOT;
}
@Override
public Object[] getChildren(Object parent, int from, int to) throws UnknownTypeException {
if (ROOT.equals(parent)) {
return new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
}
throw new UnknownTypeException(parent);
}
@Override
public boolean isLeaf(Object node) throws UnknownTypeException {
return !ROOT.equals(node);
}
@Override
public int getChildrenCount(Object node) throws UnknownTypeException {
return Integer.MAX_VALUE;
}
// TableModel
@Override
public Object getValueAt(Object node, String columnID) throws UnknownTypeException {
return ((String) node) + " " + columnID;
}
@Override
public boolean isReadOnly(Object node, String columnID) throws UnknownTypeException {
return Integer.parseInt((String) node) % 2 == 0;
}
@Override
public void setValueAt(Object node, String columnID, Object value) throws UnknownTypeException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public String getDisplayName(Object node) throws UnknownTypeException {
return node.toString();
}
@Override
public String getIconBase(Object node) throws UnknownTypeException {
return null;
}
@Override
public String getShortDescription(Object node) throws UnknownTypeException {
return "Short Description of "+node;
}
@Override
public boolean canRename(Object node) throws UnknownTypeException {
return Integer.parseInt((String) node) % 3 == 0;
}
@Override
public boolean canCopy(Object node) throws UnknownTypeException {
return false;
}
@Override
public boolean canCut(Object node) throws UnknownTypeException {
return false;
}
@Override
public Transferable clipboardCopy(Object node) throws IOException, UnknownTypeException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Transferable clipboardCut(Object node) throws IOException, UnknownTypeException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public PasteType[] getPasteTypes(Object node, Transferable t) throws UnknownTypeException {
return new PasteType[] {};
}
@Override
public void setName(Object node, String name) throws UnknownTypeException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public String getIconBaseWithExtension(Object node) throws UnknownTypeException {
return null;
}
}
private static class ColumnModelImpl extends ColumnModel {
private String id;
ColumnModelImpl(String id) {
this.id = id;
}
@Override
public Class getType() {
return String.class;
}
@Override
public String getDisplayName() {
return "Test Column "+id;
}
@Override
public String getID() {
return id;
}
}
}