View Javadoc

1   /*
2    *  XNap - A P2P framework and client.
3    *
4    *  See the file AUTHORS for copyright information.
5    *
6    *  This program is free software; you can redistribute it and/or modify
7    *  it under the terms of the GNU General Public License as published by
8    *  the Free Software Foundation.
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  
20  package org.xnap.gui.menu;
21  
22  import java.awt.event.ActionEvent;
23  import java.io.File;
24  
25  import javax.swing.AbstractAction;
26  import javax.swing.AbstractButton;
27  import javax.swing.Action;
28  import javax.swing.ButtonGroup;
29  import javax.swing.JLabel;
30  import javax.swing.JMenu;
31  import javax.swing.JMenuItem;
32  import javax.swing.JRadioButtonMenuItem;
33  
34  import org.xnap.XNap;
35  import org.xnap.event.ListEvent;
36  import org.xnap.event.ListListener;
37  import org.xnap.gui.FileProvider;
38  import org.xnap.gui.util.IconHelper;
39  import org.xnap.gui.viewer.Viewer;
40  import org.xnap.gui.viewer.ViewerFrontend;
41  import org.xnap.gui.viewer.ViewerManager;
42  
43  public class ViewerMenu extends AbstractDynamicMenu implements ListListener
44  {
45      
46      //--- Constant(s) ---
47      
48      //--- Data field(s) ---
49      
50      private FileProvider fp;
51  	private ViewerFrontend vf;
52  	private File currentFile = null;
53      private ButtonGroup bg;
54  	private JMenu jmTryMenu = new JMenu(XNap.tr("Try Viewer"));
55  
56      //--- Constructor(s) ---
57  
58      public ViewerMenu(FileProvider fp, ViewerFrontend vf)
59      {
60  		super(XNap.tr("View With"));
61  
62  		this.fp = fp;
63  		this.vf = vf;
64  
65  		setIcon(IconHelper.getMenuIcon("view_right.png"));
66  
67  		addSeparator();
68  		add(jmTryMenu);
69  		setUpTryMenu();
70  
71  		ViewerManager.getInstance().addListListener(this);
72      }
73  
74      //--- Method(s) ---
75  
76  	private void setUpTryMenu()
77  	{
78  		jmTryMenu.removeAll();
79  		Viewer[] viewers = ViewerManager.getInstance().getViewers();
80  
81  		for (int i = 0; i < viewers.length; i++) {
82  			jmTryMenu.add(new JMenuItem(new ViewerAction(viewers[i])));
83  		}
84  	}
85  
86  	public void itemAdded(ListEvent e)
87  	{
88  		setUpTryMenu();
89  	}
90  
91  	public void itemRemoved(ListEvent e)
92  	{
93  		setUpTryMenu();
94  	}
95  
96      private void addViewers()
97      {
98  		File files[] = fp.getFiles();
99  
100 		if (files == null || files.length > 1) {
101 			addTemporary(new JLabel(XNap.tr("(Please select only one file)",
102 											1)), 0);
103 			jmTryMenu.setEnabled(false);
104 			return;
105 		}
106 
107 		jmTryMenu.setEnabled(true);
108 		currentFile = files[0];
109 		
110 		Viewer viewers[] = ViewerManager.getInstance().getViewers(currentFile);
111 	
112 		bg = new ButtonGroup();
113 		if (viewers != null) {
114 			for (int i = 0; i < viewers.length; i++) {
115 				Action ac = new ViewerAction(viewers[i]);
116 				JRadioButtonMenuItem jcb = new JRadioButtonMenuItem(ac);
117 				jcb.setSelected(i == 0);
118 				bg.add(jcb);
119 				addTemporary(jcb, i);
120 			}
121 		}
122 		else {
123 			addTemporary(new JLabel(XNap.tr("(No viewer available)", 1)), 0);
124 		}
125     }
126 
127     protected void willBecomeVisible()
128     {
129 		removeAllTemporaries();
130 		addViewers();
131     }
132 
133 	/***
134 	 * Wraps a viewer and propagates the display calls.
135 	 */
136 	private class ViewerAction extends AbstractAction
137 	{
138 		private Viewer viewer;
139 
140 		public ViewerAction(Viewer viewer)
141 		{
142 			this.viewer = viewer;
143 			putValue(Action.NAME, viewer.getName());
144 			putValue(Action.SMALL_ICON, (viewer.getIcon() != null) 
145 					 ? viewer.getIcon() : new IconHelper.EmptyIcon(16));
146 		}
147 
148 		public void actionPerformed(ActionEvent event)
149 		{
150 			if (event.getSource() instanceof AbstractButton) {
151 				bg.setSelected
152 					(((AbstractButton)event.getSource()).getModel(), true);
153 			}
154 			ViewerManager.getInstance().setDefaultViewer
155 				(currentFile, viewer);
156 			vf.display(viewer, currentFile);
157 		}
158 	}
159 
160 }