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

« back to all changes in this revision

Viewing changes to freemind/freemind/modes/browsemode/BrowseController.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:
16
16
 *along with this program; if not, write to the Free Software
17
17
 *Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
18
 */
19
 
/*$Id: BrowseController.java,v 1.13 2003/12/22 11:15:18 christianfoltin Exp $*/
 
19
/* $Id: BrowseController.java,v 1.13.18.7.2.14 2008/08/27 19:05:38 christianfoltin Exp $ */
20
20
 
21
21
package freemind.modes.browsemode;
22
22
 
23
23
import java.awt.event.ActionEvent;
24
 
import java.awt.event.KeyEvent;
25
24
import java.awt.event.MouseEvent;
26
 
import java.net.MalformedURLException;
 
25
import java.io.File;
 
26
import java.io.IOException;
 
27
import java.net.URISyntaxException;
27
28
import java.net.URL;
 
29
import java.util.HashSet;
 
30
import java.util.ListIterator;
 
31
import java.util.Vector;
28
32
 
29
33
import javax.swing.AbstractAction;
30
34
import javax.swing.Action;
31
 
import javax.swing.JMenu;
 
35
import javax.swing.ImageIcon;
32
36
import javax.swing.JPopupMenu;
33
37
import javax.swing.JToolBar;
34
38
 
35
 
import java.util.HashSet;
36
 
import java.util.Vector;
37
 
 
 
39
import freemind.controller.MenuBar;
 
40
import freemind.controller.StructuredMenuHolder;
 
41
import freemind.extensions.HookFactory;
38
42
import freemind.main.Tools;
39
 
import freemind.modes.ControllerAdapter;
 
43
import freemind.main.XMLElement;
 
44
import freemind.main.XMLParseException;
40
45
import freemind.modes.MapAdapter;
 
46
import freemind.modes.MindMap;
41
47
import freemind.modes.MindMapNode;
42
48
import freemind.modes.Mode;
43
 
import freemind.view.mindmapview.NodeView;
44
 
 
45
 
public class BrowseController extends ControllerAdapter {
46
 
 
47
 
    private JPopupMenu popupmenu;
48
 
    private JToolBar toolbar;
49
 
 
50
 
    Action toggleFolded;
51
 
    Action toggleChildrenFolded;
52
 
    Action find;
53
 
    Action findNext;
54
 
    Action followLink;
55
 
    Action nodeUp;
56
 
    Action nodeDown;
57
 
 
58
 
    // disable edit in browse mode (PN)
59
 
    public void edit(KeyEvent e, boolean addNew, boolean editLong) { }
60
 
    public void addNew(final NodeView target, 
61
 
                        final int newNodeMode, 
62
 
                        final KeyEvent e) { }
63
 
 
64
 
    public BrowseController(Mode mode) {
65
 
        super.setMode(mode);
66
 
 
67
 
        // Daniel: Actions are initialized here and not above because of
68
 
        // some error it would produce. Not studied in more detail.
69
 
        toggleFolded = new ToggleFoldedAction();
70
 
        toggleChildrenFolded = new ToggleChildrenFoldedAction();
71
 
        find = new FindAction();
72
 
        findNext = new FindNextAction();
73
 
        followLink = new FollowLinkAction();
74
 
        nodeUp = new NodeUpAction();
75
 
        nodeDown = new NodeDownAction();
76
 
 
77
 
        popupmenu = new BrowsePopupMenu(this);
78
 
        toolbar = new BrowseToolBar(this);
79
 
        setAllActions(false);
80
 
    }
81
 
 
82
 
    public MapAdapter newModel() {
83
 
        return new BrowseMapModel(getFrame());
84
 
    }
85
 
 
86
 
    public void doubleClick() {
87
 
         if (getSelected().getLink() == null) { // If link exists, follow the link; toggle folded otherwise
88
 
             toggleFolded();
89
 
         } else { 
90
 
                loadURL();
91
 
        }
92
 
    }
93
 
 
94
 
    protected MindMapNode newNode() {
95
 
        return new BrowseNodeModel(getText("new_node"), getFrame());
96
 
    }
97
 
 
98
 
    //get/set methods
99
 
 
100
 
    JMenu getEditMenu() {
101
 
        JMenu editMenu = new JMenu();
102
 
        editMenu.add(getPopupMenu());
103
 
        return editMenu;
104
 
    }
105
 
 
106
 
    JMenu getFileMenu() {
107
 
        JMenu fileMenu = new JMenu();
108
 
        return fileMenu;
109
 
    }
110
 
 
111
 
    public JPopupMenu getPopupMenu() {
112
 
        return popupmenu;
113
 
    }
114
 
 
115
 
    /** Link implementation: If this is a link, we want to make a popup with at least removelink available.*/
116
 
    public JPopupMenu getPopupForModel(java.lang.Object obj) {
117
 
        if( obj instanceof BrowseArrowLinkModel) {
118
 
            // yes, this is a link.
119
 
            BrowseArrowLinkModel link = (BrowseArrowLinkModel) obj;
120
 
            JPopupMenu arrowLinkPopup = new JPopupMenu();
121
 
 
122
 
            arrowLinkPopup.add(new GotoLinkNodeAction(link.getSource().toString(), link.getSource())); 
123
 
            arrowLinkPopup.add(new GotoLinkNodeAction(link.getTarget().toString(), link.getTarget())); 
124
 
 
125
 
            arrowLinkPopup.addSeparator();
126
 
            // add all links from target and from source:
127
 
            HashSet NodeAlreadyVisited = new HashSet();
128
 
            NodeAlreadyVisited.add(link.getSource());
129
 
            NodeAlreadyVisited.add(link.getTarget());
130
 
            Vector links = getModel().getLinkRegistry().getAllLinks(link.getSource());
131
 
            links.addAll(getModel().getLinkRegistry().getAllLinks(link.getTarget()));
132
 
            for(int i = 0; i < links.size(); ++i) {
133
 
                BrowseArrowLinkModel foreign_link = (BrowseArrowLinkModel) links.get(i);
134
 
                if(NodeAlreadyVisited.add(foreign_link.getTarget())) {
135
 
                    arrowLinkPopup.add(new GotoLinkNodeAction(foreign_link.getTarget().toString(), foreign_link.getTarget())); 
136
 
                }
137
 
                if(NodeAlreadyVisited.add(foreign_link.getSource())) {
138
 
                    arrowLinkPopup.add(new GotoLinkNodeAction(foreign_link.getSource().toString(), foreign_link.getSource())); 
139
 
                }
140
 
            }
141
 
            return arrowLinkPopup;
142
 
        }
143
 
        return null;
144
 
    }
145
 
 
146
 
 
147
 
    //convenience methods
148
 
    private BrowseMapModel getModel() {
149
 
        return (BrowseMapModel)getController().getModel();
150
 
    }
151
 
 
152
 
    private BrowseNodeModel getSelected() {
153
 
        return (BrowseNodeModel)getView().getSelected().getModel();
154
 
    }
155
 
 
156
 
    BrowseToolBar getToolBar() {
157
 
        return (BrowseToolBar)toolbar;
158
 
    }
159
 
 
160
 
    public void loadURL(String relative) {
161
 
        URL absolute = null;
162
 
        try {
163
 
            BrowseMapModel map = (BrowseMapModel)getMap();
164
 
            if (map != null) {
165
 
                absolute = new URL( map.getURL(), relative);    
166
 
            } else {
167
 
                absolute = new URL( relative );
168
 
            }
169
 
            //      absolute = new URL(relative);
170
 
            getFrame().out(absolute.toString());
171
 
        } catch (MalformedURLException ex) {
172
 
            getController().errorMessage(getText("url_error") + " " + ex.getMessage());
173
 
            //getFrame().err(getText("url_error"));
 
49
import freemind.modes.ModeController;
 
50
import freemind.modes.common.GotoLinkNodeAction;
 
51
import freemind.modes.common.plugins.NodeNoteBase;
 
52
import freemind.modes.viewmodes.ViewControllerAdapter;
 
53
import freemind.view.mindmapview.MainView;
 
54
 
 
55
public class BrowseController extends ViewControllerAdapter {
 
56
 
 
57
        private JPopupMenu popupmenu;
 
58
        private JToolBar toolbar;
 
59
 
 
60
        Action followLink;
 
61
 
 
62
        Action nodeUp;
 
63
 
 
64
        Action nodeDown;
 
65
 
 
66
        private HookFactory mBrowseHookFactory;
 
67
        private ImageIcon noteIcon;
 
68
 
 
69
        public BrowseController(Mode mode) {
 
70
                super(mode);
 
71
                mBrowseHookFactory = new BrowseHookFactory();
 
72
                // Daniel: Actions are initialized here and not above because of
 
73
                // some error it would produce. Not studied in more detail.
 
74
                followLink = new FollowLinkAction();
 
75
 
 
76
                popupmenu = new BrowsePopupMenu(this);
 
77
                toolbar = new BrowseToolBar(this);
 
78
                setAllActions(false);
 
79
                // for displaying notes.
 
80
                registerNodeSelectionListener(new NodeNoteViewer(this));
 
81
        }
 
82
 
 
83
        public MapAdapter newModel(ModeController modeController) {
 
84
                return new BrowseMapModel(getFrame(), modeController);
 
85
        }
 
86
 
 
87
        public void plainClick(MouseEvent e) {
 
88
        /* perform action only if one selected node.*/
 
89
        if(getSelecteds().size() != 1)
174
90
            return;
175
 
        }
176
 
 
177
 
        String type = Tools.getExtension(absolute.getFile());
178
 
        try {
179
 
            if (type.equals("mm")) {
180
 
                getFrame().setWaitingCursor(true);
181
 
                load(absolute);
182
 
            } else {
183
 
                getFrame().openDocument(absolute);
184
 
            }
185
 
        } catch (Exception ex) {
186
 
            getController().errorMessage(getText("url_load_error")+absolute);
187
 
            ex.printStackTrace();
188
 
            //for some reason, this exception is thrown anytime...
189
 
        } finally {
190
 
            getFrame().setWaitingCursor(false);
191
 
        }
192
 
        
193
 
    }
194
 
 
195
 
    public void loadURL() {
196
 
        String link = getSelected().getLink();
197
 
        if (link != null) {
198
 
            loadURL(link);
199
 
        }
200
 
    }
201
 
 
202
 
    private void load(URL url) throws Exception {
203
 
        getToolBar().setURLField(url.toString());
204
 
        BrowseMapModel model = (BrowseMapModel)newModel();
205
 
        model.load(url);
206
 
        newMap(model);
207
 
        mapOpened(true);
208
 
    }
209
 
 
210
 
 
211
 
 
212
 
 
213
 
    /**
214
 
     * Enabled/Disabled all actions that are dependent on
215
 
     * whether there is a map open or not.
216
 
     */
217
 
    protected void setAllActions(boolean enabled) {
218
 
        toggleFolded.setEnabled(enabled);
219
 
        toggleChildrenFolded.setEnabled(enabled);
220
 
        followLink.setEnabled(enabled);
221
 
    }
222
 
 
223
 
    //////////
224
 
    // Actions
225
 
    /////////
226
 
 
227
 
    private class FollowLinkAction extends AbstractAction {
228
 
        FollowLinkAction() {
229
 
            super(getText("follow_link"));
230
 
        }
231
 
        public void actionPerformed(ActionEvent e) {
232
 
            loadURL();
233
 
        }
234
 
    }
 
91
        final MainView component = (MainView)e.getComponent();
 
92
        if (component.isInFollowLinkRegion(e.getX())) {
 
93
            loadURL(); }
 
94
        else {
 
95
                MindMapNode node = (component).getNodeView().getModel();
 
96
            if (!node.hasChildren()) {
 
97
                // the emulate the plain click.
 
98
                doubleClick(e);
 
99
                return;
 
100
            }
 
101
            toggleFolded.toggleFolded(getSelecteds().listIterator());
 
102
        }
 
103
 
 
104
        }
 
105
        public void doubleClick() {
 
106
                /* If the link exists, follow the link; toggle folded otherwise */
 
107
                if (getSelected().getLink() == null) {
 
108
                        toggleFolded.toggleFolded();
 
109
                } else {
 
110
                        loadURL();
 
111
                }
 
112
        }
 
113
 
 
114
//      public void anotherNodeSelected(MindMapNode n) {
 
115
//              super.anotherNodeSelected(n);
 
116
//              if(n.isRoot()){
 
117
//                      return;
 
118
//              }
 
119
//              //Presentation:
 
120
//              setFolded(n, false);
 
121
//              foldOthers(n);
 
122
//      }
 
123
//
 
124
//
 
125
//      private void foldOthers(MindMapNode n) {
 
126
//              if(n.isRoot()){
 
127
//                      return;
 
128
//              }
 
129
//              MindMapNode parent = n.getParentNode();
 
130
//              for (Iterator iter = parent.childrenUnfolded(); iter.hasNext();) {
 
131
//                      MindMapNode element = (MindMapNode) iter.next();
 
132
//                      if(element != n){
 
133
//                              setFolded(element, true);
 
134
//                      }
 
135
//              }
 
136
//              foldOthers(parent);
 
137
//      }
 
138
 
 
139
        public MindMapNode newNode(Object userObject, MindMap map) {
 
140
                return new BrowseNodeModel(userObject, getFrame(), map);
 
141
        }
 
142
 
 
143
        public JPopupMenu getPopupMenu() {
 
144
                return popupmenu;
 
145
        }
 
146
 
 
147
        /**
 
148
         * Link implementation: If this is a link, we want to make a popup with at
 
149
         * least removelink available.
 
150
         */
 
151
        public JPopupMenu getPopupForModel(java.lang.Object obj) {
 
152
                if (obj instanceof BrowseArrowLinkModel) {
 
153
                        // yes, this is a link.
 
154
                        BrowseArrowLinkModel link = (BrowseArrowLinkModel) obj;
 
155
                        JPopupMenu arrowLinkPopup = new JPopupMenu();
 
156
 
 
157
                        arrowLinkPopup.add(getGotoLinkNodeAction(link.getSource()));
 
158
                        arrowLinkPopup.add(getGotoLinkNodeAction(link.getTarget()));
 
159
 
 
160
                        arrowLinkPopup.addSeparator();
 
161
                        // add all links from target and from source:
 
162
                        HashSet NodeAlreadyVisited = new HashSet();
 
163
                        NodeAlreadyVisited.add(link.getSource());
 
164
                        NodeAlreadyVisited.add(link.getTarget());
 
165
                        Vector links = getModel().getLinkRegistry().getAllLinks(
 
166
                                        link.getSource());
 
167
                        links.addAll(getModel().getLinkRegistry().getAllLinks(
 
168
                                        link.getTarget()));
 
169
                        for (int i = 0; i < links.size(); ++i) {
 
170
                                BrowseArrowLinkModel foreign_link = (BrowseArrowLinkModel) links
 
171
                                                .get(i);
 
172
                                if (NodeAlreadyVisited.add(foreign_link.getTarget())) {
 
173
                                        arrowLinkPopup.add(getGotoLinkNodeAction(foreign_link
 
174
                                                        .getTarget()));
 
175
                                }
 
176
                                if (NodeAlreadyVisited.add(foreign_link.getSource())) {
 
177
                                        arrowLinkPopup.add(getGotoLinkNodeAction(foreign_link
 
178
                                                        .getSource()));
 
179
                                }
 
180
                        }
 
181
                        return arrowLinkPopup;
 
182
                }
 
183
                return null;
 
184
        }
 
185
 
 
186
        /**
 
187
         */
 
188
        private GotoLinkNodeAction getGotoLinkNodeAction(MindMapNode destination) {
 
189
                return new GotoLinkNodeAction(this, destination);
 
190
        }
 
191
 
 
192
        public JToolBar getModeToolBar() {
 
193
                return getToolBar();
 
194
        }
 
195
        BrowseToolBar getToolBar() {
 
196
                return (BrowseToolBar) toolbar;
 
197
        }
 
198
 
 
199
//      public void loadURL(String relative) {
 
200
//              // copy from mind map controller:
 
201
//        if (relative.startsWith("#")) {
 
202
//                      // inner map link, fc, 12.10.2004
 
203
//                      String target = relative.substring(1);
 
204
//                      try {
 
205
//                              MindMapNode node = getNodeFromID(target);
 
206
//                              centerNode(node);
 
207
//                              return;
 
208
//                      } catch (Exception e) {
 
209
//                              // bad luck.
 
210
//                              getFrame().out(Tools.expandPlaceholders(getText("link_not_found"), target));
 
211
//                              return;
 
212
//                      }
 
213
//              }
 
214
//
 
215
//              URL absolute = null;
 
216
//              try {
 
217
//                      absolute = new URL(getMap().getURL(), relative);
 
218
//                      getFrame().out(absolute.toString());
 
219
//              } catch (MalformedURLException ex) {
 
220
//                      freemind.main.Resources.getInstance().logExecption(ex);
 
221
//                      getController().errorMessage(
 
222
//                                      getText("url_error") + " " + ex.getMessage());
 
223
//                      // getFrame().err(getText("url_error"));
 
224
//                      return;
 
225
//              }
 
226
//
 
227
//              String type = Tools.getExtension(absolute.getFile());
 
228
//              try {
 
229
//                      if (type.equals(freemind.main.FreeMindCommon.FREEMIND_FILE_EXTENSION_WITHOUT_DOT)) {
 
230
//                              getFrame().setWaitingCursor(true);
 
231
//                              load(absolute);
 
232
//                      } else {
 
233
//                              getFrame().openDocument(absolute);
 
234
//                      }
 
235
//              } catch (Exception ex) {
 
236
//                      getController().errorMessage(getText("url_load_error") + absolute);
 
237
//freemind.main.Resources.getInstance().logExecption(                   ex);
 
238
//                      // for some reason, this exception is thrown anytime...
 
239
//              } finally {
 
240
//                      getFrame().setWaitingCursor(false);
 
241
//              }
 
242
//
 
243
//      }
 
244
 
 
245
        public ModeController load(URL url) throws IOException, XMLParseException, URISyntaxException {
 
246
            ModeController newModeController = super.load(url);
 
247
            // decorator pattern.
 
248
            ((BrowseToolBar) newModeController.getModeToolBar()).setURLField(url.toString());
 
249
            return newModeController;
 
250
        }
 
251
 
 
252
        public ModeController load(File url) throws IOException {
 
253
                ModeController newModeController = super.load(url);
 
254
                // decorator pattern.
 
255
                ((BrowseToolBar) newModeController.getModeToolBar()).setURLField(Tools.fileToUrl(url).toString());
 
256
                return newModeController;
 
257
        }
 
258
        
 
259
        public void newMap(MindMap mapModel) {
 
260
                setNoteIcon(mapModel.getRootNode());
 
261
                super.newMap(mapModel);
 
262
        }
 
263
 
 
264
        private void setNoteIcon(MindMapNode node) {
 
265
                String noteText = node.getNoteText();
 
266
                if(noteText != null && ! noteText.equals("")){
 
267
            // icon
 
268
            if (noteIcon == null) {
 
269
                noteIcon = new ImageIcon(getController()
 
270
                        .getResource("images/knotes.png"));
 
271
            }
 
272
            node.setStateIcon(NodeNoteBase.NODE_NOTE_ICON, noteIcon);                   
 
273
                }
 
274
                ListIterator children = node.childrenUnfolded();
 
275
                while(children.hasNext()){
 
276
                        setNoteIcon((MindMapNode)children.next());
 
277
                }
 
278
        
 
279
        }
 
280
 
 
281
        /**
 
282
         * Enabled/Disabled all actions that are dependent on whether there is a map
 
283
         * open or not.
 
284
         */
 
285
        protected void setAllActions(boolean enabled) {
 
286
                super.setAllActions(enabled);
 
287
                toggleFolded.setEnabled(enabled);
 
288
                toggleChildrenFolded.setEnabled(enabled);
 
289
                followLink.setEnabled(enabled);
 
290
        }
 
291
 
 
292
        // ////////
 
293
        // Actions
 
294
        // ///////
 
295
 
 
296
        private class FollowLinkAction extends AbstractAction {
 
297
                FollowLinkAction() {
 
298
                        super(getText("follow_link"));
 
299
                }
 
300
 
 
301
                public void actionPerformed(ActionEvent e) {
 
302
                        loadURL();
 
303
                }
 
304
        }
 
305
 
 
306
        /*
 
307
         * (non-Javadoc)
 
308
         *
 
309
         * @see freemind.modes.ModeController#updateMenus(freemind.controller.StructuredMenuHolder)
 
310
         */
 
311
        public void updateMenus(StructuredMenuHolder holder) {
 
312
                add(holder, MenuBar.EDIT_MENU + "/find/find", find, "keystroke_find");
 
313
                add(holder, MenuBar.EDIT_MENU + "/find/findNext", findNext,
 
314
                                "keystroke_find_next");
 
315
                add(holder, MenuBar.EDIT_MENU + "/find/followLink", followLink,
 
316
                                "keystroke_follow_link");
 
317
                holder.addSeparator(MenuBar.EDIT_MENU + "/find");
 
318
                add(holder, MenuBar.EDIT_MENU + "/find/toggleFolded", toggleFolded,
 
319
                                "keystroke_toggle_folded");
 
320
                add(holder, MenuBar.EDIT_MENU + "/find/toggleChildrenFolded",
 
321
                                toggleChildrenFolded, "keystroke_toggle_children_folded");
 
322
        }
 
323
 
 
324
        public HookFactory getHookFactory() {
 
325
                return mBrowseHookFactory;
 
326
        }
 
327
        
 
328
        public XMLElement createXMLElement() {
 
329
                return new BrowseXMLElement(this);
 
330
        }
 
331
 
235
332
}