~ubuntu-branches/ubuntu/utopic/freemind/utopic

« back to all changes in this revision

Viewing changes to freemind/freemind/view/mindmapview/attributeview/AttributeView.java

  • Committer: Bazaar Package Importer
  • Author(s): Benjamin Drung
  • Date: 2010-01-03 14:19:19 UTC
  • mfrom: (2.1.1 sid)
  • Revision ID: james.westby@ubuntu.com-20100103141919-m5az7dkicy21hqop
Tags: 0.9.0~rc6+dfsg-1ubuntu1
* Merge from Debian unstable (LP: #182927), remaining changes:
  - debian/copyright: add license/copyright for
    freemind/freemind/main/ExampleFileFilter.java

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*FreeMind - A Program for creating and viewing Mindmaps
 
2
 *Copyright (C) 2000-2001  Joerg Mueller <joergmueller@bigfoot.com>
 
3
 *See COPYING for Details
 
4
 *
 
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.
 
9
 *
 
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.
 
14
 *
 
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.
 
18
 */
 
19
/*$Id: AttributeView.java,v 1.1.6.10 2008/06/21 13:56:44 dpolivaev Exp $*/
 
20
 
 
21
package freemind.view.mindmapview.attributeview;
 
22
 
 
23
import java.awt.Color;
 
24
import java.awt.EventQueue;
 
25
 
 
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;
 
34
 
 
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;
 
44
 
 
45
 
 
46
/**
 
47
 * This class represents a single Node of a MindMap (in analogy to
 
48
 * TreeCellRenderer).
 
49
 */
 
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();
 
61
    
 
62
    public AttributeView(NodeView nodeView) {
 
63
        super();
 
64
        this.nodeView = nodeView;
 
65
        reducedAttributeTableModel = new ReducedAttributeTableModelDecorator(this);
 
66
        currentAttributeTableModel = reducedAttributeTableModel;
 
67
        setViewType(getAttributeRegistry().getAttributeViewType());
 
68
        addListeners();
 
69
    }
 
70
    AttributeRegistry getAttributeRegistry() {
 
71
        return getNode().getMap().getRegistry().getAttributes();
 
72
    }
 
73
    public NodeAttributeTableModel getAttributes() {
 
74
        return getNode().getAttributes();
 
75
    }
 
76
    public void syncronizeAttributeView() {
 
77
        if (attributeTable == null && currentAttributeTableModel.areAttributesVisible()){
 
78
            provideAttributeTable();
 
79
        }
 
80
    }
 
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());
 
91
        }
 
92
    }
 
93
    private void addListeners() {
 
94
        if(getNodeView().getModel().getMap().isReadOnly())
 
95
            return;
 
96
        getAttributeRegistry().addChangeListener(this);
 
97
        addTableModelListeners();
 
98
    }
 
99
    private ModeController getModeController() {
 
100
        return nodeView.getModel().getMap().getModeController();
 
101
    }
 
102
    private void addTableModelListeners() {
 
103
        if(getNodeView().getModel().getMap().isReadOnly())
 
104
            return;
 
105
        final ModeController modeController = getModeController();
 
106
        if(attributeTable != null){
 
107
             if(tablePopupMenu == null){
 
108
                tablePopupMenu = ((MindMapController)modeController).getAttributeTablePopupMenu();
 
109
            }
 
110
            getAttributes().getLayout().addColumnWidthChangeListener(attributeTable);
 
111
            attributeTable.addMouseListener(tablePopupMenu);
 
112
            tableHeader.addMouseListener(tablePopupMenu);
 
113
        }
 
114
        else {
 
115
            getAttributes().addTableModelListener(this);
 
116
        }
 
117
    }
 
118
    
 
119
    private void removeListeners() {
 
120
        if(getNodeView().getModel().getMap().isReadOnly())
 
121
            return;
 
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;
 
130
        }
 
131
        else {
 
132
            getAttributes().removeTableModelListener(this);
 
133
        }
 
134
    }
 
135
    /**
 
136
     */
 
137
    public void update() {
 
138
        if(attributeTable != null && attributeTable.isVisible()){
 
139
            attributeTable.updateAttributeTable();
 
140
        }
 
141
    }
 
142
    /**
 
143
     */
 
144
    public boolean areAttributesVisible() {
 
145
        final String viewType = getViewType();
 
146
        return  viewType !=AttributeTableLayoutModel.HIDE_ALL 
 
147
        && (currentAttributeTableModel.areAttributesVisible() || viewType != getAttributeRegistry().getAttributeViewType());
 
148
    }
 
149
    /**
 
150
     * @return Returns the extendedAttributeTableModel.
 
151
     */
 
152
    private ExtendedAttributeTableModelDecorator getExtendedAttributeTableModel() {
 
153
        if(extendedAttributeTableModel == null){
 
154
            extendedAttributeTableModel = new ExtendedAttributeTableModelDecorator(this);
 
155
        }
 
156
        return extendedAttributeTableModel;
 
157
    }
 
158
    
 
159
    private void setViewType(String viewType) {
 
160
        JTableHeader currentColumnHeaderView = null;
 
161
        if(viewType == AttributeTableLayoutModel.SHOW_ALL){
 
162
            currentAttributeTableModel = getExtendedAttributeTableModel();
 
163
            currentColumnHeaderView = tableHeader;
 
164
        }
 
165
        else {
 
166
            currentAttributeTableModel = reducedAttributeTableModel;
 
167
        }
 
168
        if(attributeTable != null){
 
169
            attributeTable.setModel(currentAttributeTableModel);
 
170
            attributeTable.setTableHeader(currentColumnHeaderView);
 
171
            attributeViewScrollPane.setColumnHeaderView(currentColumnHeaderView);
 
172
            attributeViewScrollPane.invalidate();
 
173
        }
 
174
    }
 
175
    public AttributeTableModel getCurrentAttributeTableModel() {
 
176
        return currentAttributeTableModel;
 
177
    }
 
178
     /**
 
179
     */
 
180
    MindMapNode getNode() {
 
181
        return getNodeView().getModel();
 
182
    }
 
183
    
 
184
    public void stateChanged(ChangeEvent event){
 
185
        setViewType(getAttributeRegistry().getAttributeViewType());
 
186
        reducedAttributeTableModel.stateChanged(null);
 
187
        getNodeView().revalidate();
 
188
    }
 
189
    /**
 
190
     */
 
191
    public NodeView getNodeView() {
 
192
        return nodeView;
 
193
    }
 
194
    /**
 
195
     */
 
196
    public MapView getMapView() {
 
197
        return getNodeView().getMap();
 
198
    }
 
199
    /* (non-Javadoc)
 
200
     * @see javax.swing.event.AncestorListener#ancestorRemoved(javax.swing.event.AncestorEvent)
 
201
     */
 
202
    public void viewRemoved() {
 
203
        removeListeners();        
 
204
        if(reducedAttributeTableModel != null) reducedAttributeTableModel.viewRemoved();          
 
205
        if(extendedAttributeTableModel != null) extendedAttributeTableModel.viewRemoved();          
 
206
        if(attributeTable != null) attributeTable.viewRemoved();                
 
207
    }
 
208
    /* (non-Javadoc)
 
209
     * @see javax.swing.event.AncestorListener#ancestorMoved(javax.swing.event.AncestorEvent)
 
210
     */
 
211
    public void ancestorMoved(AncestorEvent event) {
 
212
    }
 
213
    public void tableChanged(TableModelEvent e) {
 
214
        MapView map = getNodeView().getMap();
 
215
        map.getModel().nodeChanged(getNode());
 
216
    }
 
217
    public String getViewType() {
 
218
        return currentAttributeTableModel == reducedAttributeTableModel 
 
219
        ? getAttributeRegistry().getAttributeViewType()
 
220
        : AttributeTableLayoutModel.SHOW_ALL;
 
221
    }
 
222
    public void startEditing() {
 
223
        if(getNode().getMap().isReadOnly()){
 
224
                return;
 
225
        }
 
226
        provideAttributeTable();
 
227
        if(currentAttributeTableModel == reducedAttributeTableModel){
 
228
            getExtendedAttributeTableModel();
 
229
            setViewType(AttributeTableLayoutModel.SHOW_ALL);
 
230
        }
 
231
        EventQueue.invokeLater(new Runnable() {
 
232
            public void run() {
 
233
                startEditingTable();
 
234
            }
 
235
        });
 
236
    }
 
237
    private void startEditingTable() {
 
238
        attributeTable.requestFocus();
 
239
        if(currentAttributeTableModel.getRowCount() == 0){
 
240
            attributeTable.insertRow(0);
 
241
        }
 
242
        else{
 
243
            attributeTable.changeSelection(0, 0, false, false);
 
244
        }
 
245
    }
 
246
    
 
247
    boolean isPopupShown(){
 
248
        return attributeTable != null && tablePopupMenu != null
 
249
        && (tablePopupMenu.getTable() == attributeTable);       
 
250
    }
 
251
    public void stopEditing() {
 
252
        if(attributeTable.isEditing()){
 
253
            attributeTable.getCellEditor().stopCellEditing();
 
254
        }
 
255
        final String registryAttributeViewType = getAttributeRegistry().getAttributeViewType();
 
256
        if(registryAttributeViewType != getViewType()){
 
257
            setViewType(registryAttributeViewType);
 
258
        }
 
259
        getNodeView().requestFocus();
 
260
    }
 
261
}