/*FreeMind - A Program for creating and viewing Mindmaps
*Copyright (C) 2000-2001 Joerg Mueller <joergmueller@bigfoot.com>
*See COPYING for Details
*
*This program is free software; you can redistribute it and/or
*modify it under the terms of the GNU General Public License
*as published by the Free Software Foundation; either version 2
*of the License, or (at your option) any later version.
*
*This program is distributed in the hope that it will be useful,
*but WITHOUT ANY WARRANTY; without even the implied warranty of
*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*GNU General Public License for more details.
*
*You should have received a copy of the GNU General Public License
*along with this program; if not, write to the Free Software
*Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*$Id: AttributeView.java,v 1.1.6.10 2008/06/21 13:56:44 dpolivaev Exp $*/
package freemind.view.mindmapview.attributeview;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.event.AncestorEvent;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.JTableHeader;
import freemind.modes.MindMapNode;
import freemind.modes.ModeController;
import freemind.modes.attributes.AttributeRegistry;
import freemind.modes.attributes.AttributeTableLayoutModel;
import freemind.modes.attributes.AttributeTableModel;
import freemind.modes.attributes.NodeAttributeTableModel;
import freemind.modes.mindmapmode.MindMapController;
import freemind.view.mindmapview.MapView;
import freemind.view.mindmapview.NodeView;
/**
* This class represents a single Node of a MindMap (in analogy to
* TreeCellRenderer).
*/
public class AttributeView implements ChangeListener, TableModelListener {
private AttributeTable attributeTable;
private ReducedAttributeTableModelDecorator reducedAttributeTableModel;
private ExtendedAttributeTableModelDecorator extendedAttributeTableModel = null;
private AttributeTableModelDecoratorAdapter currentAttributeTableModel;
private JScrollPane attributeViewScrollPane;
private NodeView nodeView;
private JTableHeader tableHeader;
static private AttributePopupMenu tablePopupMenu;
private static final Color HEADER_BACKGROUND = UIManager
.getColor("TableHeader.background");
// private static final Color HEADER_BACKGROUND = Color.BLUE.darker();
public AttributeView(NodeView nodeView) {
super();
this.nodeView = nodeView;
reducedAttributeTableModel = new ReducedAttributeTableModelDecorator(
this);
currentAttributeTableModel = reducedAttributeTableModel;
setViewType(getAttributeRegistry().getAttributeViewType());
addListeners();
}
AttributeRegistry getAttributeRegistry() {
return getNode().getMap().getRegistry().getAttributes();
}
public NodeAttributeTableModel getAttributes() {
return getNode().getAttributes();
}
public void syncronizeAttributeView() {
if (attributeTable == null
&& currentAttributeTableModel.areAttributesVisible()) {
provideAttributeTable();
}
}
private void provideAttributeTable() {
if (attributeTable == null) {
attributeTable = new AttributeTable(this);
tableHeader = attributeTable.getTableHeader();
tableHeader.setBackground(HEADER_BACKGROUND);
addTableModelListeners();
attributeViewScrollPane = new AttributeViewScrollPane(
attributeTable);
getNodeView().getContentPane().add(attributeViewScrollPane);
getAttributes().removeTableModelListener(this);
setViewType(getAttributeRegistry().getAttributeViewType());
}
}
private void addListeners() {
if (getNodeView().getModel().getMap().isReadOnly())
return;
getAttributeRegistry().addChangeListener(this);
addTableModelListeners();
}
private ModeController getModeController() {
return nodeView.getModel().getMap().getModeController();
}
private void addTableModelListeners() {
if (getNodeView().getModel().getMap().isReadOnly())
return;
final ModeController modeController = getModeController();
if (attributeTable != null) {
if (tablePopupMenu == null) {
tablePopupMenu = ((MindMapController) modeController)
.getAttributeTablePopupMenu();
}
getAttributes().getLayout().addColumnWidthChangeListener(
attributeTable);
attributeTable.addMouseListener(tablePopupMenu);
tableHeader.addMouseListener(tablePopupMenu);
} else {
getAttributes().addTableModelListener(this);
}
}
private void removeListeners() {
if (getNodeView().getModel().getMap().isReadOnly())
return;
getAttributeRegistry().removeChangeListener(this);
if (attributeTable != null) {
getAttributes().getLayout().removeColumnWidthChangeListener(
attributeTable);
attributeTable.getParent().remove(attributeTable);
attributeTable.getModel().removeTableModelListener(attributeTable);
attributeTable.removeMouseListener(tablePopupMenu);
tableHeader.removeMouseListener(tablePopupMenu);
tablePopupMenu = null;
} else {
getAttributes().removeTableModelListener(this);
}
}
/**
*/
public void update() {
if (attributeTable != null && attributeTable.isVisible()) {
attributeTable.updateAttributeTable();
}
}
/**
*/
public boolean areAttributesVisible() {
final String viewType = getViewType();
return viewType != AttributeTableLayoutModel.HIDE_ALL
&& (currentAttributeTableModel.areAttributesVisible() || viewType != getAttributeRegistry()
.getAttributeViewType());
}
/**
* @return Returns the extendedAttributeTableModel.
*/
private ExtendedAttributeTableModelDecorator getExtendedAttributeTableModel() {
if (extendedAttributeTableModel == null) {
extendedAttributeTableModel = new ExtendedAttributeTableModelDecorator(
this);
}
return extendedAttributeTableModel;
}
private void setViewType(String viewType) {
JTableHeader currentColumnHeaderView = null;
if (viewType == AttributeTableLayoutModel.SHOW_ALL) {
currentAttributeTableModel = getExtendedAttributeTableModel();
currentColumnHeaderView = tableHeader;
} else {
currentAttributeTableModel = reducedAttributeTableModel;
}
if (attributeTable != null) {
attributeTable.setModel(currentAttributeTableModel);
attributeTable.setTableHeader(currentColumnHeaderView);
attributeViewScrollPane
.setColumnHeaderView(currentColumnHeaderView);
attributeViewScrollPane.invalidate();
}
}
public AttributeTableModel getCurrentAttributeTableModel() {
return currentAttributeTableModel;
}
/**
*/
MindMapNode getNode() {
return getNodeView().getModel();
}
public void stateChanged(ChangeEvent event) {
setViewType(getAttributeRegistry().getAttributeViewType());
reducedAttributeTableModel.stateChanged(null);
getNodeView().revalidate();
}
/**
*/
public NodeView getNodeView() {
return nodeView;
}
/**
*/
public MapView getMapView() {
return getNodeView().getMap();
}
/*
* (non-Javadoc)
*
* @see
* javax.swing.event.AncestorListener#ancestorRemoved(javax.swing.event.
* AncestorEvent)
*/
public void viewRemoved() {
removeListeners();
if (reducedAttributeTableModel != null)
reducedAttributeTableModel.viewRemoved();
if (extendedAttributeTableModel != null)
extendedAttributeTableModel.viewRemoved();
if (attributeTable != null)
attributeTable.viewRemoved();
}
/*
* (non-Javadoc)
*
* @see javax.swing.event.AncestorListener#ancestorMoved(javax.swing.event.
* AncestorEvent)
*/
public void ancestorMoved(AncestorEvent event) {
}
public void tableChanged(TableModelEvent e) {
MapView map = getNodeView().getMap();
map.getModel().nodeChanged(getNode());
}
public String getViewType() {
return currentAttributeTableModel == reducedAttributeTableModel ? getAttributeRegistry()
.getAttributeViewType() : AttributeTableLayoutModel.SHOW_ALL;
}
public void startEditing() {
if (getNode().getMap().isReadOnly()) {
return;
}
provideAttributeTable();
if (currentAttributeTableModel == reducedAttributeTableModel) {
getExtendedAttributeTableModel();
setViewType(AttributeTableLayoutModel.SHOW_ALL);
}
EventQueue.invokeLater(new Runnable() {
public void run() {
startEditingTable();
}
});
}
private void startEditingTable() {
attributeTable.requestFocus();
if (currentAttributeTableModel.getRowCount() == 0) {
attributeTable.insertRow(0);
} else {
attributeTable.changeSelection(0, 0, false, false);
}
}
boolean isPopupShown() {
return attributeTable != null && tablePopupMenu != null
&& (tablePopupMenu.getTable() == attributeTable);
}
public void stopEditing() {
if (attributeTable.isEditing()) {
attributeTable.getCellEditor().stopCellEditing();
}
final String registryAttributeViewType = getAttributeRegistry()
.getAttributeViewType();
if (registryAttributeViewType != getViewType()) {
setViewType(registryAttributeViewType);
}
getNodeView().requestFocus();
}
}