タイニー番組ナビゲータ本体
修订版 | acda55c6634caab31e1f78d63708ececf90f8214 (tree) |
---|---|
时间 | 2014-07-02 10:18:44 |
作者 | peeweedee <peeweedee@user...> |
Commiter | peeweedee |
・プルダウンメニューの一部にキーボードショートカットをつける
@@ -6,14 +6,7 @@ import java.awt.Component; | ||
6 | 6 | import java.awt.Desktop; |
7 | 7 | import java.awt.Dimension; |
8 | 8 | import java.awt.Point; |
9 | -import java.awt.event.ActionEvent; | |
10 | -import java.awt.event.ActionListener; | |
11 | -import java.awt.event.ComponentAdapter; | |
12 | -import java.awt.event.ComponentEvent; | |
13 | -import java.awt.event.ComponentListener; | |
14 | -import java.awt.event.MouseAdapter; | |
15 | -import java.awt.event.MouseEvent; | |
16 | -import java.awt.event.MouseListener; | |
9 | +import java.awt.event.*; | |
17 | 10 | import java.io.File; |
18 | 11 | import java.io.IOException; |
19 | 12 | import java.net.URI; |
@@ -3269,7 +3262,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3269 | 3262 | JPopupMenu pop = new JPopupMenu(); |
3270 | 3263 | |
3271 | 3264 | { |
3272 | - JMenuItem menuItem = new JMenuItem("番組追跡の編集【"+keyword+"】"); | |
3265 | + JMenuItem menuItem = new JMenuItemWithShortcut("番組追跡の編集【"+keyword+"】"); | |
3266 | + menuItem.setMnemonic(KeyEvent.VK_E); | |
3273 | 3267 | menuItem.addActionListener(new ActionListener() { |
3274 | 3268 | public void actionPerformed(ActionEvent e) { |
3275 | 3269 | editTraceKey(keyword); |
@@ -3279,7 +3273,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3279 | 3273 | } |
3280 | 3274 | |
3281 | 3275 | { |
3282 | - JMenuItem menuItem = new JMenuItem("番組追跡の削除【"+keyword+"】"); | |
3276 | + JMenuItem menuItem = new JMenuItemWithShortcut("番組追跡の削除【"+keyword+"】"); | |
3277 | + menuItem.setMnemonic(KeyEvent.VK_D); | |
3283 | 3278 | menuItem.addActionListener(new ActionListener() { |
3284 | 3279 | public void actionPerformed(ActionEvent e) { |
3285 | 3280 | removeTraceKey(keyword); |
@@ -3299,6 +3294,7 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3299 | 3294 | for (String o : TVProgram.OKINIIRI) { |
3300 | 3295 | final String okini = o; |
3301 | 3296 | JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem(okini, okini.equals(tk.getOkiniiri())); |
3297 | + menuItem.setMnemonic(KeyEvent.VK_0 + okini.length()); | |
3302 | 3298 | bg.add(menuItem); |
3303 | 3299 | menuItem.addActionListener(new ActionListener() { |
3304 | 3300 | public void actionPerformed(ActionEvent e) { |
@@ -3321,7 +3317,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3321 | 3317 | JPopupMenu pop = new JPopupMenu(); |
3322 | 3318 | |
3323 | 3319 | { |
3324 | - JMenuItem menuItem = new JMenuItem("キーワードの編集【"+keyword+"】"); | |
3320 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワードの編集【"+keyword+"】"); | |
3321 | + menuItem.setMnemonic(KeyEvent.VK_E); | |
3325 | 3322 | menuItem.addActionListener(new ActionListener() { |
3326 | 3323 | public void actionPerformed(ActionEvent e) { |
3327 | 3324 | editSearchKey(keyword); |
@@ -3330,7 +3327,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3330 | 3327 | pop.add(menuItem); |
3331 | 3328 | } |
3332 | 3329 | { |
3333 | - JMenuItem menuItem = new JMenuItem("キーワードの削除【"+keyword+"】"); | |
3330 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワードの削除【"+keyword+"】"); | |
3331 | + menuItem.setMnemonic(KeyEvent.VK_D); | |
3334 | 3332 | menuItem.addActionListener(new ActionListener() { |
3335 | 3333 | public void actionPerformed(ActionEvent e) { |
3336 | 3334 | removeSearchKey(keyword); |
@@ -3345,7 +3343,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3345 | 3343 | for ( SearchGroup gr : srGrps ) { |
3346 | 3344 | final String groupName = gr.getName(); |
3347 | 3345 | if (srGrps.isFind(groupName,keyword) ) { |
3348 | - JMenuItem menuItem = new JMenuItem("キーワードグループから登録解除【"+groupName+"】"); | |
3346 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワードグループから登録解除【"+groupName+"】"); | |
3347 | + menuItem.setMnemonic(KeyEvent.VK_R); | |
3349 | 3348 | menuItem.setForeground(Color.RED); |
3350 | 3349 | menuItem.addActionListener(new ActionListener() { |
3351 | 3350 | public void actionPerformed(ActionEvent e) { |
@@ -3355,7 +3354,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3355 | 3354 | pop.add(menuItem); |
3356 | 3355 | } |
3357 | 3356 | else { |
3358 | - JMenuItem menuItem = new JMenuItem("キーワードグループに追加【"+groupName+"】"); | |
3357 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワードグループに追加【"+groupName+"】"); | |
3358 | + menuItem.setMnemonic(KeyEvent.VK_A); | |
3359 | 3359 | menuItem.addActionListener(new ActionListener() { |
3360 | 3360 | public void actionPerformed(ActionEvent e) { |
3361 | 3361 | addSearchKeyGroupItem(groupName,keyword); |
@@ -3377,6 +3377,7 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3377 | 3377 | for (String o : TVProgram.OKINIIRI) { |
3378 | 3378 | final String okini = o; |
3379 | 3379 | JRadioButtonMenuItem menuItem = new JRadioButtonMenuItem(okini, okini.equals(sr.getOkiniiri())); |
3380 | + menuItem.setMnemonic(KeyEvent.VK_0 + okini.length()); | |
3380 | 3381 | bg.add(menuItem); |
3381 | 3382 | menuItem.addActionListener(new ActionListener() { |
3382 | 3383 | public void actionPerformed(ActionEvent e) { |
@@ -3396,7 +3397,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3396 | 3397 | private void showPopupForSortTraceKey(int x, int y) { |
3397 | 3398 | JPopupMenu pop = new JPopupMenu(); |
3398 | 3399 | { |
3399 | - JMenuItem menuItem = new JMenuItem("番組追跡の並べ替え"); | |
3400 | + JMenuItem menuItem = new JMenuItemWithShortcut("番組追跡の並べ替え"); | |
3401 | + menuItem.setMnemonic(KeyEvent.VK_S); | |
3400 | 3402 | menuItem.addActionListener(new ActionListener() { |
3401 | 3403 | public void actionPerformed(ActionEvent e) { |
3402 | 3404 | sortTraceKey(); |
@@ -3411,7 +3413,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3411 | 3413 | private void showPopupForSortSearchKey(int x, int y) { |
3412 | 3414 | JPopupMenu pop = new JPopupMenu(); |
3413 | 3415 | { |
3414 | - JMenuItem menuItem = new JMenuItem("キーワード検索の並べ替え"); | |
3416 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワード検索の並べ替え"); | |
3417 | + menuItem.setMnemonic(KeyEvent.VK_S); | |
3415 | 3418 | menuItem.addActionListener(new ActionListener() { |
3416 | 3419 | public void actionPerformed(ActionEvent e) { |
3417 | 3420 | sortSearchKey(); |
@@ -3426,7 +3429,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3426 | 3429 | private void showPopupForSortExtension(int x, int y) { |
3427 | 3430 | JPopupMenu pop = new JPopupMenu(); |
3428 | 3431 | { |
3429 | - JMenuItem menuItem = new JMenuItem("延長警告の並べ替え"); | |
3432 | + JMenuItem menuItem = new JMenuItemWithShortcut("延長警告の並べ替え"); | |
3433 | + menuItem.setMnemonic(KeyEvent.VK_S); | |
3430 | 3434 | menuItem.addActionListener(new ActionListener() { |
3431 | 3435 | public void actionPerformed(ActionEvent e) { |
3432 | 3436 | sortExtension(); |
@@ -3443,7 +3447,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3443 | 3447 | JPopupMenu pop = new JPopupMenu(); |
3444 | 3448 | |
3445 | 3449 | { |
3446 | - JMenuItem menuItem = new JMenuItem("キーワードグループの追加"); | |
3450 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワードグループの追加"); | |
3451 | + menuItem.setMnemonic(KeyEvent.VK_A); | |
3447 | 3452 | menuItem.addActionListener(new ActionListener() { |
3448 | 3453 | public void actionPerformed(ActionEvent e) { |
3449 | 3454 | addSearchKeyGroup(); |
@@ -3459,7 +3464,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3459 | 3464 | JPopupMenu pop = new JPopupMenu(); |
3460 | 3465 | |
3461 | 3466 | { |
3462 | - JMenuItem menuItem = new JMenuItem("キーワードグループの編集【"+name+"】"); | |
3467 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワードグループの編集【"+name+"】"); | |
3468 | + menuItem.setMnemonic(KeyEvent.VK_E); | |
3463 | 3469 | menuItem.addActionListener(new ActionListener() { |
3464 | 3470 | public void actionPerformed(ActionEvent e) { |
3465 | 3471 | editSeachkeyGroup(name); |
@@ -3471,7 +3477,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3471 | 3477 | pop.addSeparator(); |
3472 | 3478 | |
3473 | 3479 | { |
3474 | - JMenuItem menuItem = new JMenuItem("キーワードグループの削除【"+name+"】"); | |
3480 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワードグループの削除【"+name+"】"); | |
3481 | + menuItem.setMnemonic(KeyEvent.VK_D); | |
3475 | 3482 | menuItem.addActionListener(new ActionListener() { |
3476 | 3483 | public void actionPerformed(ActionEvent e) { |
3477 | 3484 | removeSearchKeyGroup(name); |
@@ -3487,7 +3494,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3487 | 3494 | JPopupMenu pop = new JPopupMenu(); |
3488 | 3495 | |
3489 | 3496 | { |
3490 | - JMenuItem menuItem = new JMenuItem("キーワードの編集【"+member+"】"); | |
3497 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワードの編集【"+member+"】"); | |
3498 | + menuItem.setMnemonic(KeyEvent.VK_E); | |
3491 | 3499 | menuItem.addActionListener(new ActionListener() { |
3492 | 3500 | public void actionPerformed(ActionEvent e) { |
3493 | 3501 | editSearchKeyGroupItem(name,member); |
@@ -3496,7 +3504,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3496 | 3504 | pop.add(menuItem); |
3497 | 3505 | } |
3498 | 3506 | { |
3499 | - JMenuItem menuItem = new JMenuItem("キーワードの削除【"+member+"】"); | |
3507 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワードの削除【"+member+"】"); | |
3508 | + menuItem.setMnemonic(KeyEvent.VK_D); | |
3500 | 3509 | menuItem.addActionListener(new ActionListener() { |
3501 | 3510 | public void actionPerformed(ActionEvent e) { |
3502 | 3511 | removeSearchKeyGroupItem(null,member); |
@@ -3511,8 +3520,9 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3511 | 3520 | for ( SearchGroup gr : srGrps ) { |
3512 | 3521 | final String groupName = gr.getName(); |
3513 | 3522 | if (srGrps.isFind(groupName,member) ) { |
3514 | - JMenuItem menuItem = new JMenuItem("キーワードグループから登録解除【"+groupName+"】"); | |
3523 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワードグループから登録解除【"+groupName+"】"); | |
3515 | 3524 | menuItem.setForeground(Color.RED); |
3525 | + menuItem.setMnemonic(KeyEvent.VK_R); | |
3516 | 3526 | menuItem.addActionListener(new ActionListener() { |
3517 | 3527 | public void actionPerformed(ActionEvent e) { |
3518 | 3528 | removeSearchKeyGroupItem(groupName, member); |
@@ -3521,7 +3531,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3521 | 3531 | pop.add(menuItem); |
3522 | 3532 | } |
3523 | 3533 | else { |
3524 | - JMenuItem menuItem = new JMenuItem("キーワードグループに追加【"+groupName+"】"); | |
3534 | + JMenuItem menuItem = new JMenuItemWithShortcut("キーワードグループに追加【"+groupName+"】"); | |
3535 | + menuItem.setMnemonic(KeyEvent.VK_A); | |
3525 | 3536 | menuItem.addActionListener(new ActionListener() { |
3526 | 3537 | public void actionPerformed(ActionEvent e) { |
3527 | 3538 | addSearchKeyGroupItem(groupName,member); |
@@ -3541,7 +3552,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3541 | 3552 | JPopupMenu pop = new JPopupMenu(); |
3542 | 3553 | |
3543 | 3554 | { |
3544 | - JMenuItem menuItem = new JMenuItem("延長警告の編集【"+keyword+"】"); | |
3555 | + JMenuItem menuItem = new JMenuItemWithShortcut("延長警告の編集【"+keyword+"】"); | |
3556 | + menuItem.setMnemonic(KeyEvent.VK_E); | |
3545 | 3557 | menuItem.addActionListener(new ActionListener() { |
3546 | 3558 | public void actionPerformed(ActionEvent e) { |
3547 | 3559 | editExtension(keyword); |
@@ -3550,7 +3562,8 @@ public abstract class AbsListedView extends JPanel implements TickTimerListener | ||
3550 | 3562 | pop.add(menuItem); |
3551 | 3563 | } |
3552 | 3564 | { |
3553 | - JMenuItem menuItem = new JMenuItem("延長警告の削除【"+keyword+"】"); | |
3565 | + JMenuItem menuItem = new JMenuItemWithShortcut("延長警告の削除【"+keyword+"】"); | |
3566 | + menuItem.setMnemonic(KeyEvent.VK_D); | |
3554 | 3567 | menuItem.addActionListener(new ActionListener() { |
3555 | 3568 | public void actionPerformed(ActionEvent e) { |
3556 | 3569 | removeExtension(keyword); |
@@ -1,13 +1,6 @@ | ||
1 | 1 | package tainavi; |
2 | 2 | |
3 | -import java.awt.Color; | |
4 | -import java.awt.Component; | |
5 | -import java.awt.Dimension; | |
6 | -import java.awt.Font; | |
7 | -import java.awt.Graphics2D; | |
8 | -import java.awt.Insets; | |
9 | -import java.awt.Point; | |
10 | -import java.awt.Rectangle; | |
3 | +import java.awt.*; | |
11 | 4 | import java.awt.image.BufferedImage; |
12 | 5 | import java.beans.PropertyChangeEvent; |
13 | 6 | import java.beans.PropertyChangeListener; |
@@ -261,4 +254,55 @@ public class CommonSwingUtils { | ||
261 | 254 | e.printStackTrace(); |
262 | 255 | } |
263 | 256 | } |
257 | + | |
258 | + /** | |
259 | + * 左端で折り返す文字列の描画 | |
260 | + */ | |
261 | + public static int drawWrappedString(Graphics2D g, int x, int baseline, int width, int height, String message, FontMetrics fm, int fontHeight, boolean center) { | |
262 | + int top = 0; | |
263 | + int bottom = top; | |
264 | + int length = message.length(); | |
265 | + int strWidth = 0; | |
266 | + int cWidth = 0; | |
267 | + int drawX = 0; | |
268 | + while ( bottom < length && baseline < height) { | |
269 | + String str; | |
270 | + if ( cWidth == 0 ) { | |
271 | + char c = message.charAt(bottom); | |
272 | + cWidth = fm.charWidth(c); | |
273 | + } | |
274 | + if ( (strWidth+cWidth) > width ) { | |
275 | + // 越えちゃった | |
276 | + str = message.substring(top, bottom); | |
277 | + // センタリング有無 | |
278 | + if ( center ) { | |
279 | + drawX = (width-strWidth) / 2; | |
280 | + } | |
281 | + // 次の頭(cWidthは次のループで利用) | |
282 | + top = bottom; | |
283 | + strWidth = cWidth; | |
284 | + } | |
285 | + else if ( bottom+1 == length ) { | |
286 | + // 残り全部 | |
287 | + str = message.substring(top, bottom+1); | |
288 | + // センタリング有無 | |
289 | + if ( center ) { | |
290 | + drawX = (width-strWidth) / 2; | |
291 | + } | |
292 | + // 次はない | |
293 | + bottom++; | |
294 | + } | |
295 | + else { | |
296 | + // まだ足りない | |
297 | + bottom++; | |
298 | + strWidth += cWidth; | |
299 | + cWidth = 0; | |
300 | + continue; | |
301 | + } | |
302 | + g.drawString(str, x+drawX, baseline); | |
303 | + baseline += fontHeight; | |
304 | + } | |
305 | + return baseline; | |
306 | + } | |
307 | + | |
264 | 308 | } |
@@ -0,0 +1,27 @@ | ||
1 | +package tainavi; | |
2 | + | |
3 | +import javax.swing.*; | |
4 | +import java.awt.event.KeyEvent; | |
5 | + | |
6 | +/** | |
7 | + * Created by unknown on 2014/07/02. | |
8 | + */ | |
9 | +public class JMenuItemWithShortcut extends JMenuItem { | |
10 | + | |
11 | + public JMenuItemWithShortcut(String s) { | |
12 | + super(s); | |
13 | + } | |
14 | + | |
15 | + @Override | |
16 | + public String getText() { | |
17 | + int n = this.getMnemonic(); | |
18 | + int k = 0; | |
19 | + if ( n >= KeyEvent.VK_0 && n >= KeyEvent.VK_0 ) { | |
20 | + k = '0' + (n - KeyEvent.VK_0); | |
21 | + } | |
22 | + if ( n >= KeyEvent.VK_A && n >= KeyEvent.VK_Z ) { | |
23 | + k = 'a' + (n - KeyEvent.VK_A); | |
24 | + } | |
25 | + return ((k > 0) ? String.format("(%c) ", n) : "") + super.getText(); | |
26 | + } | |
27 | +} |
@@ -65,7 +65,7 @@ public class JTXTButton extends JLabel { | ||
65 | 65 | } |
66 | 66 | }; |
67 | 67 | |
68 | - private static final float DRAWTAB = 2.0F; | |
68 | + private static final float DRAWTAB = 2.0F; | |
69 | 69 | |
70 | 70 | |
71 | 71 | /******************************************************************************* |
@@ -306,7 +306,7 @@ public class JTXTButton extends JLabel { | ||
306 | 306 | FontMetrics fm = g2.getFontMetrics(startFont); |
307 | 307 | float hi = Float.valueOf(fm.getHeight()); |
308 | 308 | float as = Float.valueOf(fm.getAscent()); |
309 | - | |
309 | + | |
310 | 310 | float startx = Float.valueOf(DRAWTAB); |
311 | 311 | float startw = draww; |
312 | 312 | float xposstartx = 0.0F; |
@@ -369,7 +369,7 @@ public class JTXTButton extends JLabel { | ||
369 | 369 | GlyphVector gv = wgv.getGv(); |
370 | 370 | g2.setPaint(Color.RED); |
371 | 371 | g2.drawGlyphVector(gv, titlex, baseline); |
372 | - | |
372 | + | |
373 | 373 | xpos = wgv.getLastX(); // 後続有り |
374 | 374 | baseline += wgv.getLastY(); |
375 | 375 | } |
@@ -396,7 +396,23 @@ public class JTXTButton extends JLabel { | ||
396 | 396 | else { |
397 | 397 | detail = tvd.detail; |
398 | 398 | } |
399 | - | |
399 | + | |
400 | + /* | |
401 | + FontMetrics fm = g2.getFontMetrics(detailFont); | |
402 | + int hi = fm.getAscent() + fm.getDescent(); | |
403 | + int as = fm.getAscent(); | |
404 | + int detailx = (int) (DRAWTAB+detailTab); | |
405 | + int detailw = (int) (draww-detailTab); | |
406 | + | |
407 | + if ( baseline == 0.0F ) { | |
408 | + baseline = as; // 初期垂直位置 | |
409 | + } | |
410 | + | |
411 | + g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); | |
412 | + g2.setColor(detailFontColor); | |
413 | + CommonSwingUtils.drawWrappedString(g2, detailx, (int)baseline, detailw, (int)drawh, detail, fm, hi, false); | |
414 | + */ | |
415 | + | |
400 | 416 | FontMetrics fm = g2.getFontMetrics(detailFont); |
401 | 417 | float as = Float.valueOf(fm.getAscent()); |
402 | 418 | float detailx = Float.valueOf(DRAWTAB+detailTab); |
@@ -405,7 +421,7 @@ public class JTXTButton extends JLabel { | ||
405 | 421 | if ( baseline == 0.0F ) { |
406 | 422 | baseline = as; // 初期垂直位置 |
407 | 423 | } |
408 | - | |
424 | + | |
409 | 425 | WrappedGlyphVector wgv = getWrappedGlyphVector(detail, detailw, 0.0f, detailFont, as, frc); |
410 | 426 | g2.setPaint(detailFontColor); |
411 | 427 |