1
/*FreeMind - A Program for creating and viewing Mindmaps
2
*Copyright (C) 2000-2001 Joerg Mueller <joergmueller@bigfoot.com>
3
*See COPYING for Details
5
*This program is free software; you can redistribute it and/or
6
*modify it under the terms of the GNU General Public License
7
*as published by the Free Software Foundation; either version 2
8
*of the License, or (at your option) any later version.
10
*This program is distributed in the hope that it will be useful,
11
*but WITHOUT ANY WARRANTY; without even the implied warranty of
12
*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
*GNU General Public License for more details.
15
*You should have received a copy of the GNU General Public License
16
*along with this program; if not, write to the Free Software
17
*Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
/*$Id: AttributeView.java,v 1.1.6.10 2008/06/21 13:56:44 dpolivaev Exp $*/
21
package freemind.view.mindmapview.attributeview;
23
import java.awt.Color;
24
import java.awt.EventQueue;
26
import javax.swing.JScrollPane;
27
import javax.swing.UIManager;
28
import javax.swing.event.AncestorEvent;
29
import javax.swing.event.ChangeEvent;
30
import javax.swing.event.ChangeListener;
31
import javax.swing.event.TableModelEvent;
32
import javax.swing.event.TableModelListener;
33
import javax.swing.table.JTableHeader;
35
import freemind.modes.MindMapNode;
36
import freemind.modes.ModeController;
37
import freemind.modes.attributes.AttributeRegistry;
38
import freemind.modes.attributes.AttributeTableLayoutModel;
39
import freemind.modes.attributes.AttributeTableModel;
40
import freemind.modes.attributes.NodeAttributeTableModel;
41
import freemind.modes.mindmapmode.MindMapController;
42
import freemind.view.mindmapview.MapView;
43
import freemind.view.mindmapview.NodeView;
47
* This class represents a single Node of a MindMap (in analogy to
50
public class AttributeView implements ChangeListener, TableModelListener {
51
private AttributeTable attributeTable;
52
private ReducedAttributeTableModelDecorator reducedAttributeTableModel;
53
private ExtendedAttributeTableModelDecorator extendedAttributeTableModel = null;
54
private AttributeTableModelDecoratorAdapter currentAttributeTableModel;
55
private JScrollPane attributeViewScrollPane;
56
private NodeView nodeView;
57
private JTableHeader tableHeader;
58
static private AttributePopupMenu tablePopupMenu;
59
private static final Color HEADER_BACKGROUND = UIManager.getColor("TableHeader.background");
60
// private static final Color HEADER_BACKGROUND = Color.BLUE.darker();
62
public AttributeView(NodeView nodeView) {
64
this.nodeView = nodeView;
65
reducedAttributeTableModel = new ReducedAttributeTableModelDecorator(this);
66
currentAttributeTableModel = reducedAttributeTableModel;
67
setViewType(getAttributeRegistry().getAttributeViewType());
70
AttributeRegistry getAttributeRegistry() {
71
return getNode().getMap().getRegistry().getAttributes();
73
public NodeAttributeTableModel getAttributes() {
74
return getNode().getAttributes();
76
public void syncronizeAttributeView() {
77
if (attributeTable == null && currentAttributeTableModel.areAttributesVisible()){
78
provideAttributeTable();
81
private void provideAttributeTable() {
82
if (attributeTable == null){
83
attributeTable = new AttributeTable(this);
84
tableHeader = attributeTable.getTableHeader();
85
tableHeader.setBackground(HEADER_BACKGROUND);
86
addTableModelListeners();
87
attributeViewScrollPane = new AttributeViewScrollPane(attributeTable);
88
getNodeView().getContentPane().add(attributeViewScrollPane);
89
getAttributes().removeTableModelListener(this);
90
setViewType(getAttributeRegistry().getAttributeViewType());
93
private void addListeners() {
94
if(getNodeView().getModel().getMap().isReadOnly())
96
getAttributeRegistry().addChangeListener(this);
97
addTableModelListeners();
99
private ModeController getModeController() {
100
return nodeView.getModel().getMap().getModeController();
102
private void addTableModelListeners() {
103
if(getNodeView().getModel().getMap().isReadOnly())
105
final ModeController modeController = getModeController();
106
if(attributeTable != null){
107
if(tablePopupMenu == null){
108
tablePopupMenu = ((MindMapController)modeController).getAttributeTablePopupMenu();
110
getAttributes().getLayout().addColumnWidthChangeListener(attributeTable);
111
attributeTable.addMouseListener(tablePopupMenu);
112
tableHeader.addMouseListener(tablePopupMenu);
115
getAttributes().addTableModelListener(this);
119
private void removeListeners() {
120
if(getNodeView().getModel().getMap().isReadOnly())
122
getAttributeRegistry().removeChangeListener(this);
123
if(attributeTable != null){
124
getAttributes().getLayout().removeColumnWidthChangeListener(attributeTable);
125
attributeTable.getParent().remove(attributeTable);
126
attributeTable.getModel().removeTableModelListener(attributeTable);
127
attributeTable.removeMouseListener(tablePopupMenu);
128
tableHeader.removeMouseListener(tablePopupMenu);
129
tablePopupMenu = null;
132
getAttributes().removeTableModelListener(this);
137
public void update() {
138
if(attributeTable != null && attributeTable.isVisible()){
139
attributeTable.updateAttributeTable();
144
public boolean areAttributesVisible() {
145
final String viewType = getViewType();
146
return viewType !=AttributeTableLayoutModel.HIDE_ALL
147
&& (currentAttributeTableModel.areAttributesVisible() || viewType != getAttributeRegistry().getAttributeViewType());
150
* @return Returns the extendedAttributeTableModel.
152
private ExtendedAttributeTableModelDecorator getExtendedAttributeTableModel() {
153
if(extendedAttributeTableModel == null){
154
extendedAttributeTableModel = new ExtendedAttributeTableModelDecorator(this);
156
return extendedAttributeTableModel;
159
private void setViewType(String viewType) {
160
JTableHeader currentColumnHeaderView = null;
161
if(viewType == AttributeTableLayoutModel.SHOW_ALL){
162
currentAttributeTableModel = getExtendedAttributeTableModel();
163
currentColumnHeaderView = tableHeader;
166
currentAttributeTableModel = reducedAttributeTableModel;
168
if(attributeTable != null){
169
attributeTable.setModel(currentAttributeTableModel);
170
attributeTable.setTableHeader(currentColumnHeaderView);
171
attributeViewScrollPane.setColumnHeaderView(currentColumnHeaderView);
172
attributeViewScrollPane.invalidate();
175
public AttributeTableModel getCurrentAttributeTableModel() {
176
return currentAttributeTableModel;
180
MindMapNode getNode() {
181
return getNodeView().getModel();
184
public void stateChanged(ChangeEvent event){
185
setViewType(getAttributeRegistry().getAttributeViewType());
186
reducedAttributeTableModel.stateChanged(null);
187
getNodeView().revalidate();
191
public NodeView getNodeView() {
196
public MapView getMapView() {
197
return getNodeView().getMap();
200
* @see javax.swing.event.AncestorListener#ancestorRemoved(javax.swing.event.AncestorEvent)
202
public void viewRemoved() {
204
if(reducedAttributeTableModel != null) reducedAttributeTableModel.viewRemoved();
205
if(extendedAttributeTableModel != null) extendedAttributeTableModel.viewRemoved();
206
if(attributeTable != null) attributeTable.viewRemoved();
209
* @see javax.swing.event.AncestorListener#ancestorMoved(javax.swing.event.AncestorEvent)
211
public void ancestorMoved(AncestorEvent event) {
213
public void tableChanged(TableModelEvent e) {
214
MapView map = getNodeView().getMap();
215
map.getModel().nodeChanged(getNode());
217
public String getViewType() {
218
return currentAttributeTableModel == reducedAttributeTableModel
219
? getAttributeRegistry().getAttributeViewType()
220
: AttributeTableLayoutModel.SHOW_ALL;
222
public void startEditing() {
223
if(getNode().getMap().isReadOnly()){
226
provideAttributeTable();
227
if(currentAttributeTableModel == reducedAttributeTableModel){
228
getExtendedAttributeTableModel();
229
setViewType(AttributeTableLayoutModel.SHOW_ALL);
231
EventQueue.invokeLater(new Runnable() {
237
private void startEditingTable() {
238
attributeTable.requestFocus();
239
if(currentAttributeTableModel.getRowCount() == 0){
240
attributeTable.insertRow(0);
243
attributeTable.changeSelection(0, 0, false, false);
247
boolean isPopupShown(){
248
return attributeTable != null && tablePopupMenu != null
249
&& (tablePopupMenu.getTable() == attributeTable);
251
public void stopEditing() {
252
if(attributeTable.isEditing()){
253
attributeTable.getCellEditor().stopCellEditing();
255
final String registryAttributeViewType = getAttributeRegistry().getAttributeViewType();
256
if(registryAttributeViewType != getViewType()){
257
setViewType(registryAttributeViewType);
259
getNodeView().requestFocus();