Newer
Older
/* SelectionMenu.java
*
* created: Sun Jan 10 1999
*
* This file is part of Artemis
*
* Copyright(C) 1998,1999,2000,2001,2002 Genome Research Limited
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or(at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/SelectionMenu.java,v 1.9 2008-06-11 15:17:43 tjc Exp $
*/
package uk.ac.sanger.artemis.components;
import uk.ac.sanger.artemis.sequence.MarkerRange;
import uk.ac.sanger.artemis.*;
import java.awt.event.*;
import javax.swing.*;
/**
* This a super class for EditMenu, ViewMenu and GotoMenu. It is a JMenu that
* knows how to get hold of the Selection. It also has the method
* getParentFrame() to find the owning JFrame of the menu.
*
* @author Kim Rutherford
/** */
private static final long serialVersionUID = 1L;
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
/** The Selection that was passed to the constructor. */
/* final */ private Selection selection;
/** The JFrame reference that was passed to the constructor. */
private JFrame frame = null;
/**
* Create a new SelectionMenu object.
* @param frame The JFrame that owns this JMenu.
* @param name The string to use as the menu title.
* @param selection The Selection that the commands in the menu will
* operate on.
**/
public SelectionMenu(final JFrame frame,
final String menu_name,
final Selection selection)
{
super(menu_name);
this.frame = frame;
this.selection = selection;
}
/**
* Return the JFrame that was passed to the constructor.
**/
public JFrame getParentFrame()
{
return frame;
}
/**
* Check that the are some Features in the current selection. If there are
* some features then return true. If there are no features selected then
* popup a message saying so and return false.
**/
protected boolean checkForSelectionFeatures()
{
return checkForSelectionFeatures(getParentFrame(), getSelection());
}
/**
* Check that the are some Features in the given selection. If there are
* some features then return true. If there are no features selected then
* popup a message saying so and return false.
* @param frame The JFrame to use for MessageDialog components.
* @param selection The selected features to check.
**/
static boolean checkForSelectionFeatures(final JFrame frame,
final Selection selection)
{
final FeatureVector features_to_check = selection.getAllFeatures();
if(features_to_check.size() == 0)
{
new MessageDialog(frame, "No features selected");
return false;
}
else
return true;
}
/**
* Check that the are some Features in the current selection and that the
* selection isn't too big. If there is more than one feature in the
* selection and less than the given maximum then return true. If there
* are no features selected then popup a message saying so and return
* false. If there are more selected features than the given maximum
* than display the message in a YesNoDialog component and return the
* result of the dialog.
**/
protected boolean checkForSelectionFeatures(final int maximum_size,
final String message)
{
return checkForSelectionFeatures(getParentFrame(), getSelection(),
maximum_size, message);
}
/**
* Check that the are some Features in the given selection and that the
* selection isn't too big. If there is more than one feature in the
* selection and less than the given maximum then return true. If there
* are no features selected then popup a message saying so and return
* false. If there are more selected features than the given maximum
* than display the message in a YesNoDialog component and return the
* result of the dialog.
* @param frame The JFrame to use for MessageDialog components.
* @param selection The selected features to check.
**/
static boolean checkForSelectionFeatures(final JFrame frame,
final Selection selection,
final int maximum_size,
final String message)
{
final FeatureVector features_to_check = selection.getAllFeatures();
if(features_to_check.size() == 0)
{
new MessageDialog(frame, "No features selected");
return false;
}
else
{
if(features_to_check.size() > maximum_size)
{
final YesNoDialog dialog =
new YesNoDialog(frame, message);
return dialog.getResult();
}
else
return true;
}
}
/**
* Check that there are only CDS features in the given selection, that there
* are some features selected and that the selection isn't too big. If
* there is more than one feature in the selection and less than the given
* maximum then return true. If there are no features selected then popup
* a message saying so and return false. If there are more selected
* features than the given maximum than display the message in a
* YesNoDialog component and return the result of the dialog.
* @param frame The Frame to use for MessageDialog components.
* @param selection The selected features to check.
**/
static boolean checkForSelectionCDSFeatures(final JFrame frame,
final Selection selection,
final int maximum_size,
final String max_message)
{
final FeatureVector features_to_check = selection.getAllFeatures();
if(features_to_check.size() == 0)
{
new MessageDialog(frame, "No CDS features selected");
return false;
}
else
{
for(int i = 0 ; i < features_to_check.size() ; ++i)
{
final Feature this_feature = features_to_check.elementAt(i);
if(!this_feature.isCDS())
{
final String message =
"a non-CDS feature(" + this_feature.getIDString() +
") is selected - can't continue";
final MessageDialog dialog =
new MessageDialog(frame, message);
return false;
}
}
if(features_to_check.size() > maximum_size)
{
final YesNoDialog dialog =
new YesNoDialog(frame, max_message);
return dialog.getResult();
}
else
return true;
}
}
/**
* Check that the are some FeatureSegments in the current selection and
* that the selection isn't too big. If there is more than one
* FeatureSegments in the selection and less than the given maximum then
* return true. If there are no FeatureSegments selected then popup a
* message saying so and return false. If there are more selected
* FeatureSegments than the given maximum than display the message in a
* YesNoDialog component and return the result of the dialog.
**/
protected boolean checkForSelectionFeatureSegments(final int maximum_size,
final String message)
{
final FeatureSegmentVector segments_to_check =
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
if(segments_to_check.size() == 0)
{
new MessageDialog(getParentFrame(), "No exons selected");
return false;
}
else
{
if(segments_to_check.size() > maximum_size)
{
final YesNoDialog dialog =
new YesNoDialog(getParentFrame(), message);
return dialog.getResult();
}
else
return true;
}
}
/**
* Check that the current selection contains a MarkerRange. If it does
* then return true. If not then popup a message saying so and return
* false.
**/
protected boolean checkForSelectionRange()
{
return checkForSelectionRange(getParentFrame(), getSelection());
}
/**
* Check that the current selection contains a MarkerRange. If it does
* then return true. If not then popup a message saying so and return
* false.
* @param frame The JFrame to use for MessageDialog components.
* @param selection The selected features to check.
**/
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
final Selection selection)
{
final MarkerRange marker_range = selection.getMarkerRange();
if(marker_range == null)
{
new MessageDialog(frame, "No bases selected");
return false;
}
else
return true;
}
/**
* Return the Selection object that was passed to the constructor.
**/
protected Selection getSelection()
{
return selection;
}
/**
*
**/
protected static KeyStroke makeMenuKeyStroke(final int key_code)
{
return KeyStroke.getKeyStroke(key_code,
Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()); //InputEvent.CTRL_MASK);
private void getJMenuItems(JMenu menu, Vector menu_items)
{
for(int i=0; i<menus.length; i++)
{
if(menus[i] instanceof JMenuItem)
menu_items.add(menus[i]);
}
}
protected JScrollPane getShortCuts()
{
final Vector menu_items = new Vector();
final Component menus[] = getMenuComponents();
for(int i=0; i<menus.length; i++)
{
if(menus[i] instanceof JMenu)
{
menu_items.add(menus[i]);
getJMenuItems((JMenu)menus[i], menu_items);
}
else if(menus[i] instanceof JMenuItem)
menu_items.add(menus[i]);
}
Box bdown = Box.createVerticalBox();
String alist[] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
"L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
"W", "X", "Y", "Z", "--"};
for(int i=0; i<menu_items.size(); i++)
{
Box bacross = Box.createHorizontalBox();
if(menu_items.get(i) instanceof JMenu)
{
bacross.add(new JLabel( ((JMenu)menu_items.get(i)).getText() ));
bacross.add(Box.createHorizontalGlue());
bdown.add(bacross);
continue;
}
final JMenuItem mi = (JMenuItem)menu_items.get(i);
bacross.add(new JLabel(mi.getText()));
KeyStroke ks = mi.getAccelerator();
if(ks != null)
{
String keystroke = getKeyText(ks.getKeyCode());
combo.setSelectedItem( getKeyText(ks.getKeyCode()) );
}
else
combo.setSelectedItem("--");
Dimension dim = combo.getPreferredSize();
dim = new Dimension(100, dim.height);
combo.setPreferredSize(dim);
combo.setMaximumSize(dim);
combo.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if(e.getStateChange() == ItemEvent.SELECTED)
setAccelerator(combo,mod_combo,mi);
}
});
// modifier
mod_combo.setSelectedItem("Default");
mod_combo.setPreferredSize(dim);
mod_combo.setMaximumSize(dim);
mod_combo.addItemListener(new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
if(e.getStateChange() == ItemEvent.SELECTED)
setAccelerator(combo,mod_combo,mi);
}
});
bacross.add(Box.createHorizontalGlue());
bacross.add(combo);
bdown.add(bacross);
}
bdown.add(Box.createVerticalGlue());
final Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
jsp.setPreferredSize(new Dimension(jsp.getPreferredSize().width,
screen.height/2));
return jsp;
}
private void setAccelerator(final JComboBox combo, final JComboBox mod_combo,
final JMenuItem mi)
{
if(combo.getSelectedItem() == "--")
mi.setAccelerator(null);
else
{
char c[] = ((String)combo.getSelectedItem()).toCharArray();
int modifier = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
if( ((String)mod_combo.getSelectedItem()).equals("Alt") )
modifier = InputEvent.ALT_MASK;
else if( ((String)mod_combo.getSelectedItem()).equals("Ctrl") )
modifier = InputEvent.CTRL_MASK;
else if( ((String)mod_combo.getSelectedItem()).equals("Shift") )
modifier = InputEvent.SHIFT_MASK;
mi.setAccelerator(KeyStroke.getKeyStroke(c[0], modifier));
mi.setText(mi.getText());
mi.revalidate();
mi.repaint();
}
}
/* public void getAccelerators()
{
Hashtable keyStrokeHash = new Hashtable();
Component menus[] = getMenuComponents();
for(int i = 0; i < menus.length; i++)
{
JMenuItem menu = (JMenuItem)menus[i];
KeyStroke ks = menu.getAccelerator();
if(ks != null)
keyStrokeHash.put(menu.getText(), ks);
}
}*/
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
public static String getKeyText(int keyCode)
{
if(keyCode >= KeyEvent.VK_0 && keyCode <= KeyEvent.VK_9 ||
keyCode >= KeyEvent.VK_A && keyCode <= KeyEvent.VK_Z)
return String.valueOf((char)keyCode);
switch(keyCode)
{
case KeyEvent.VK_BACK_SPACE: return "BACK_SPACE";
case KeyEvent.VK_CONTROL: return "CONTROL";
case KeyEvent.VK_LEFT: return "LEFT";
case KeyEvent.VK_UP: return "UP";
case KeyEvent.VK_RIGHT: return "RIGHT";
case KeyEvent.VK_DOWN: return "DOWN";
case KeyEvent.VK_DELETE: return "DELETE";
case KeyEvent.VK_BACK_QUOTE: return "BACK_QUOTE";
case KeyEvent.VK_KP_UP: return "KP_UP";
case KeyEvent.VK_KP_DOWN: return "KP_DOWN";
case KeyEvent.VK_KP_LEFT: return "KP_LEFT";
case KeyEvent.VK_KP_RIGHT: return "KP_RIGHT";
}
return "unknown(0x" + Integer.toString(keyCode, 16) + ")";
}