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.
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 $ */
21
21
package freemind.modes.browsemode;
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;
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;
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;
35
import java.util.HashSet;
36
import java.util.Vector;
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;
45
public class BrowseController extends ControllerAdapter {
47
private JPopupMenu popupmenu;
48
private JToolBar toolbar;
51
Action toggleChildrenFolded;
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,
64
public BrowseController(Mode mode) {
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();
77
popupmenu = new BrowsePopupMenu(this);
78
toolbar = new BrowseToolBar(this);
82
public MapAdapter newModel() {
83
return new BrowseMapModel(getFrame());
86
public void doubleClick() {
87
if (getSelected().getLink() == null) { // If link exists, follow the link; toggle folded otherwise
94
protected MindMapNode newNode() {
95
return new BrowseNodeModel(getText("new_node"), getFrame());
100
JMenu getEditMenu() {
101
JMenu editMenu = new JMenu();
102
editMenu.add(getPopupMenu());
106
JMenu getFileMenu() {
107
JMenu fileMenu = new JMenu();
111
public JPopupMenu getPopupMenu() {
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();
122
arrowLinkPopup.add(new GotoLinkNodeAction(link.getSource().toString(), link.getSource()));
123
arrowLinkPopup.add(new GotoLinkNodeAction(link.getTarget().toString(), link.getTarget()));
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()));
137
if(NodeAlreadyVisited.add(foreign_link.getSource())) {
138
arrowLinkPopup.add(new GotoLinkNodeAction(foreign_link.getSource().toString(), foreign_link.getSource()));
141
return arrowLinkPopup;
147
//convenience methods
148
private BrowseMapModel getModel() {
149
return (BrowseMapModel)getController().getModel();
152
private BrowseNodeModel getSelected() {
153
return (BrowseNodeModel)getView().getSelected().getModel();
156
BrowseToolBar getToolBar() {
157
return (BrowseToolBar)toolbar;
160
public void loadURL(String relative) {
163
BrowseMapModel map = (BrowseMapModel)getMap();
165
absolute = new URL( map.getURL(), relative);
167
absolute = new URL( relative );
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;
55
public class BrowseController extends ViewControllerAdapter {
57
private JPopupMenu popupmenu;
58
private JToolBar toolbar;
66
private HookFactory mBrowseHookFactory;
67
private ImageIcon noteIcon;
69
public BrowseController(Mode 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();
76
popupmenu = new BrowsePopupMenu(this);
77
toolbar = new BrowseToolBar(this);
79
// for displaying notes.
80
registerNodeSelectionListener(new NodeNoteViewer(this));
83
public MapAdapter newModel(ModeController modeController) {
84
return new BrowseMapModel(getFrame(), modeController);
87
public void plainClick(MouseEvent e) {
88
/* perform action only if one selected node.*/
89
if(getSelecteds().size() != 1)
177
String type = Tools.getExtension(absolute.getFile());
179
if (type.equals("mm")) {
180
getFrame().setWaitingCursor(true);
183
getFrame().openDocument(absolute);
185
} catch (Exception ex) {
186
getController().errorMessage(getText("url_load_error")+absolute);
187
ex.printStackTrace();
188
//for some reason, this exception is thrown anytime...
190
getFrame().setWaitingCursor(false);
195
public void loadURL() {
196
String link = getSelected().getLink();
202
private void load(URL url) throws Exception {
203
getToolBar().setURLField(url.toString());
204
BrowseMapModel model = (BrowseMapModel)newModel();
214
* Enabled/Disabled all actions that are dependent on
215
* whether there is a map open or not.
217
protected void setAllActions(boolean enabled) {
218
toggleFolded.setEnabled(enabled);
219
toggleChildrenFolded.setEnabled(enabled);
220
followLink.setEnabled(enabled);
227
private class FollowLinkAction extends AbstractAction {
229
super(getText("follow_link"));
231
public void actionPerformed(ActionEvent e) {
91
final MainView component = (MainView)e.getComponent();
92
if (component.isInFollowLinkRegion(e.getX())) {
95
MindMapNode node = (component).getNodeView().getModel();
96
if (!node.hasChildren()) {
97
// the emulate the plain click.
101
toggleFolded.toggleFolded(getSelecteds().listIterator());
105
public void doubleClick() {
106
/* If the link exists, follow the link; toggle folded otherwise */
107
if (getSelected().getLink() == null) {
108
toggleFolded.toggleFolded();
114
// public void anotherNodeSelected(MindMapNode n) {
115
// super.anotherNodeSelected(n);
120
// setFolded(n, false);
125
// private void foldOthers(MindMapNode n) {
129
// MindMapNode parent = n.getParentNode();
130
// for (Iterator iter = parent.childrenUnfolded(); iter.hasNext();) {
131
// MindMapNode element = (MindMapNode) iter.next();
133
// setFolded(element, true);
136
// foldOthers(parent);
139
public MindMapNode newNode(Object userObject, MindMap map) {
140
return new BrowseNodeModel(userObject, getFrame(), map);
143
public JPopupMenu getPopupMenu() {
148
* Link implementation: If this is a link, we want to make a popup with at
149
* least removelink available.
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();
157
arrowLinkPopup.add(getGotoLinkNodeAction(link.getSource()));
158
arrowLinkPopup.add(getGotoLinkNodeAction(link.getTarget()));
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(
167
links.addAll(getModel().getLinkRegistry().getAllLinks(
169
for (int i = 0; i < links.size(); ++i) {
170
BrowseArrowLinkModel foreign_link = (BrowseArrowLinkModel) links
172
if (NodeAlreadyVisited.add(foreign_link.getTarget())) {
173
arrowLinkPopup.add(getGotoLinkNodeAction(foreign_link
176
if (NodeAlreadyVisited.add(foreign_link.getSource())) {
177
arrowLinkPopup.add(getGotoLinkNodeAction(foreign_link
181
return arrowLinkPopup;
188
private GotoLinkNodeAction getGotoLinkNodeAction(MindMapNode destination) {
189
return new GotoLinkNodeAction(this, destination);
192
public JToolBar getModeToolBar() {
195
BrowseToolBar getToolBar() {
196
return (BrowseToolBar) toolbar;
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);
205
// MindMapNode node = getNodeFromID(target);
208
// } catch (Exception e) {
210
// getFrame().out(Tools.expandPlaceholders(getText("link_not_found"), target));
215
// URL absolute = null;
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"));
227
// String type = Tools.getExtension(absolute.getFile());
229
// if (type.equals(freemind.main.FreeMindCommon.FREEMIND_FILE_EXTENSION_WITHOUT_DOT)) {
230
// getFrame().setWaitingCursor(true);
233
// getFrame().openDocument(absolute);
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...
240
// getFrame().setWaitingCursor(false);
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;
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;
259
public void newMap(MindMap mapModel) {
260
setNoteIcon(mapModel.getRootNode());
261
super.newMap(mapModel);
264
private void setNoteIcon(MindMapNode node) {
265
String noteText = node.getNoteText();
266
if(noteText != null && ! noteText.equals("")){
268
if (noteIcon == null) {
269
noteIcon = new ImageIcon(getController()
270
.getResource("images/knotes.png"));
272
node.setStateIcon(NodeNoteBase.NODE_NOTE_ICON, noteIcon);
274
ListIterator children = node.childrenUnfolded();
275
while(children.hasNext()){
276
setNoteIcon((MindMapNode)children.next());
282
* Enabled/Disabled all actions that are dependent on whether there is a map
285
protected void setAllActions(boolean enabled) {
286
super.setAllActions(enabled);
287
toggleFolded.setEnabled(enabled);
288
toggleChildrenFolded.setEnabled(enabled);
289
followLink.setEnabled(enabled);
296
private class FollowLinkAction extends AbstractAction {
298
super(getText("follow_link"));
301
public void actionPerformed(ActionEvent e) {
309
* @see freemind.modes.ModeController#updateMenus(freemind.controller.StructuredMenuHolder)
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");
324
public HookFactory getHookFactory() {
325
return mBrowseHookFactory;
328
public XMLElement createXMLElement() {
329
return new BrowseXMLElement(this);