All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.coode.matrix.ui.component.MatrixTreeTable Maven / Gradle / Ivy

The newest version!
/*
* Copyright (C) 2007, University of Manchester
*/
package org.coode.matrix.ui.component;

import java.awt.Color;
import java.awt.Container;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.datatransfer.Transferable;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetEvent;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.tree.TreeSelectionModel;

import org.coode.matrix.model.api.MatrixModel;
import org.coode.matrix.ui.renderer.MatrixHeaderCellRenderer;
import org.protege.editor.owl.model.OWLModelManager;
import org.protege.editor.owl.model.event.EventType;
import org.protege.editor.owl.model.event.OWLModelManagerChangeEvent;
import org.protege.editor.owl.model.event.OWLModelManagerListener;
import org.protege.editor.owl.ui.renderer.LinkedObjectComponent;
import org.protege.editor.owl.ui.renderer.OWLRendererPreferences;
import org.protege.editor.owl.ui.table.OWLObjectDropTargetListener;
import org.protege.editor.owl.ui.transfer.OWLObjectDropTarget;
import org.protege.editor.owl.ui.tree.OWLObjectTree;
import org.semanticweb.owlapi.model.OWLEntity;
import org.semanticweb.owlapi.model.OWLObject;
import org.semanticweb.owlapi.model.OWLOntologyChange;

import uk.ac.manchester.cs.bhig.jtreetable.JTreeTable;

/**
 * Author: Nick Drummond
* http://www.cs.man.ac.uk/~drummond/

*

* The University Of Manchester
* Bio Health Informatics Group
* Date: Jan 3, 2008

*/ public class MatrixTreeTable extends JTreeTable implements OWLObjectDropTarget, LinkedObjectComponent { private static final long serialVersionUID = 1L; private OWLModelManager mngr; protected MatrixModel model; protected Cursor defaultCursor; private TableCellRenderer headerRenderer; private OWLModelManagerListener l = new OWLModelManagerListener(){ public void handleChange(OWLModelManagerChangeEvent event) { if (event.getType().equals(EventType.ENTITY_RENDERER_CHANGED)){ handleRendererChanged(); } } }; public MatrixTreeTable(OWLObjectTree tree, MatrixModel model, OWLModelManager mngr) { // constructor ensures createColsFromModel disabled otherwise JTable redraws all columns // on a tableChanged() losing any width info columns are added manually in tableChanged() super(tree, model); this.model = model; this.mngr = mngr; headerRenderer = new MatrixHeaderCellRenderer(); defaultCursor = getCursor(); handleRendererChanged(); mngr.addListener(l); getTable().setGridColor(Color.LIGHT_GRAY); setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); // allow drop on both the table and the scrollpane final Container clientPane = getTable().getParent(); DropTarget dt = new DropTarget(clientPane, new MatrixDropTargetListener(this)); clientPane.setDropTarget(dt); dt = new DropTarget(getTable(), new MatrixDropTargetListener(this)); getTable().setDropTarget(dt); setupColumns(); } public void dispose(){ model.dispose(); mngr.removeListener(l); } @Override protected String getTreeTitle() { return getModel().getTreeColumnLabel(); } private void setupColumns(){ final TableColumnModel cm = getTable().getColumnModel(); for (int i=0; i getTree() { return (OWLObjectTree)super.getTree(); } @Override public MatrixModel getModel(){ return (MatrixModel)super.getModel(); } public R getSelectedOWLObject() { if (getTable().getSelectedRow() >= 0) { return (R) model.getValueAt(getTable().getSelectedRow(), 0); } else { return null; } } public boolean dropOWLObjects(List owlObjects, Point pt, int type) { boolean result = false; int dropRow = getTable().rowAtPoint(pt); int dropColumn = getTable().columnAtPoint(pt); for (OWLObject obj : owlObjects) { // if any of the objects are dropped successfully, return true // this behaviour may need revising depending on expectations if (dropOWLObject(obj, dropColumn, dropRow)) { result = true; } } if (result){ getTable().repaint(); } return result; } protected boolean dropOWLObject(OWLObject dropObject, int dropColumn, int dropRow) { boolean result = false; int modelColumn = getTable().convertColumnIndexToModel(dropColumn); if (dropRow >= 0 && model.isSuitableCellValue(dropObject, dropRow, modelColumn)) { // droppedInSelection is true when more than one row is selected and one of the selected rows is dropped on boolean droppedInSelection = false; int[] selectedRows = getTable().getSelectedRows(); if (selectedRows.length > 1) { for (int selectedRow : selectedRows) { if (selectedRow == dropRow) { droppedInSelection = true; break; } } } if (droppedInSelection) { for (int selectedRow : selectedRows) { if (addValue(dropObject, selectedRow, modelColumn)){ result = true; } } } else { result = addValue(dropObject, dropRow, modelColumn); } if (result){ repaint(getTable().getCellRect(dropRow, modelColumn, true)); } } else{ Object colObj = model.getSuitableColumnObject(dropObject); if (colObj != null) { result = addColumn(colObj); } } return result; } public boolean addColumn(Object object) { return addColumn(object, getTable().getColumnCount()); } public boolean addColumn(Object object, int index) { boolean success = model.addColumn(object); if (success){ TableColumn c = getTable().getColumnModel().getColumn(index); c.setHeaderRenderer(headerRenderer); } return success; } public boolean removeColumn(Object object){ model.removeColumn(object); return true; } private boolean addValue(OWLObject value, int row, int col) { boolean success = false; if (model.isCellEditable(row, col)) { R rowObj = model.getNodeForRow(row); Object colObj = model.getColumnObjectAtModelIndex(col); List changes = model.addMatrixValue(rowObj, colObj, value); if (!changes.isEmpty()){ mngr.applyChanges(changes); success = true; } } return success; } protected void handleRendererChanged() { final int rowHeight = getFontMetrics(OWLRendererPreferences.getInstance().getFont()).getHeight(); getTree().setRowHeight(rowHeight); getTable().validate(); } ////////////////////////////////////////// implementation of LinkedObjectComponent private OWLEntity linkedObject; public Point getMouseCellLocation() { Point mousePos = getMousePosition(); if (mousePos == null) { return new Point(); } Rectangle cellRect = getMouseCellRect(); return new Point(mousePos.x - cellRect.x, mousePos.y - cellRect.y); } public Rectangle getMouseCellRect() { Point mousePos = getMousePosition(); if(mousePos != null) { return getTable().getCellRect(getTable().rowAtPoint(mousePos), getTable().columnAtPoint(mousePos), true); } else { return null; } } // // public Object getCellObject() { // Point mousePosition = getMousePosition(); // if (mousePosition == null) { // return null; // } // int row = getTable().rowAtPoint(mousePosition); // int col = getTable().columnAtPoint(mousePosition); // return getTable().getValueAt(row, col); // } public void setLinkedObject(OWLObject object) { if (object instanceof OWLEntity) { linkedObject = (OWLEntity) object; setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); } else { linkedObject = null; setCursor(defaultCursor); } } public OWLObject getLinkedObject() { return linkedObject; } public JComponent getComponent() { return this; } /** * The DnD behaviour for the matrix tree table */ class MatrixDropTargetListener extends OWLObjectDropTargetListener { public MatrixDropTargetListener(MatrixTreeTable component) { super(component); } @Override public void dragOver(DropTargetDragEvent dtde) { super.dragOver(dtde); Transferable t = dtde.getTransferable(); if (isAcceptableTransferable(t)) { if (getTable().getSelectedRows().length < 2) { Point pt = dtde.getLocation(); int row = getTable().rowAtPoint(pt); int col = getTable().columnAtPoint(pt); if (row != -1) { OWLObject obj = getDropObjects(t).iterator().next(); if (model.isSuitableCellValue(obj, row, col)) { // Provide a bit of feedback by selecting the table row getTable().getSelectionModel().setSelectionInterval(row, row); setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); } else{ setCursor(defaultCursor); } } } } } @Override public void dragExit(DropTargetEvent dte) { super.dragExit(dte); setCursor(defaultCursor); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy