package jp.ne.mki.wedge.rule.client.component.frame; import java.awt.event.KeyEvent; import javax.swing.AbstractButton; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.plaf.ComponentInputMapUIResource; import jp.ne.mki.wedge.rule.base.AbstractClient; import jp.ne.mki.wedge.run.client.data.Item; /** * <h2>ボタンにFunctionKeyのKeyMap追加</h2> * <p>In(0)に指定されたアイテムのボタンコンポーネント)に対して、画面にフォーカスが当たっているとき(JComponent.WHEN_IN_FOCUSED_WINDOW)のInputMapにパラメータで指定された * キーを、追加(put)します。<br> * この設定により、ショートカットキーの登録が行えます。但し、Modifierの登録は行えません。ModifierをAltにしたい場合にはニーモニックキーを使用してください。<br> * このロジッククラスでは、InputMapに対してPutのみ行います。このロジッククラス実行後、InputMapのクリアが行われる処理(ニーモニックの再登録など)が * 行われるとこの設定はクリアされますのでご注意ください。<br> * KeyMap出来るボタンコンポーネントは一つのみになります</p> * <br/> * <h4>[I/O RECORD]</h4> * <table border="1" cellpadding="3" cellspacing="0" width="100%"> * <tr class="TableSubHeadingColor"> * <th style="width:50%;">InputRecord</th> * <th>OutputRecord</th> * </tr><tr class="TableRowColor"> * <td> * <!-- InputRecordの内容を記述 --> * 設定するボタンコンポーネントが割り当てられたアイテム(一つ) * <!-- ここまで --> * </td> * <td> * <!-- OutputRecordの内容を記述 --> * * <!-- ここまで --> * </td> * </tr></table> * * <h4>[RULE PARAMETER]</h4> * <table border="1" cellpadding="3" cellspacing="0" width="100%"> * <tr> * <th style="width:100px;" class="TableSubHeadingColor">Parameter</th> * <td class="TableRowColor"> * <!-- Parameterの内容を記述 --> * ファンクションキーの名称(F1,F2・・・) * <!--ここまで --> * </td> * </tr></table> * * @author mki * @version 1.0 */ public class SetFunctionKeyMapToButton extends AbstractClient { AbstractButton button = null; int keyId = -1; /** * IOパラメータ取得。{@link #execute() execute} の前に実行される。 * @return int OK=処理続行、ERROR=異常終了、CANCEL=処理を中断(正常終了) */ public int getIOParameter() { //入力引数より、対象のボタンコンポーネント取得 Item data = getInItem(0); if (data == null) { setErrorMessageMustInRecord(1); return IO_ERROR_IN; } JComponent comp = data.getComponent(); if (comp instanceof AbstractButton) { button = (AbstractButton) comp; } else { setErrorMessageMustInComp(1, "AbstractButton"); return IO_ERROR_IN; } //パラメータよりKeyID取得 try { keyId = getFunctionKeyNo(getRuleParameter()); } catch (Exception ex) { errorMessage = ex.getMessage(); return IO_ERROR_PARAMETER; } return OK; } /** * ロジッククラスの処理を実行します * @return int OK */ public int execute() { setKeyMap(keyId, button); return OK; } /** * ボタンコンポーネントにKeyMapを行います * @param int Key番号 * @param AbstractButton 割り当てるボタン */ protected static void setKeyMap(int key, AbstractButton button) { if (button == null) { return; } if (key < 0) { return; } InputMap map = SwingUtilities.getUIInputMap(button, JComponent.WHEN_IN_FOCUSED_WINDOW); if (map == null) { map = new ComponentInputMapUIResource(button); SwingUtilities.replaceUIInputMap(button, JComponent.WHEN_IN_FOCUSED_WINDOW, map); } if (map != null) { map.put(KeyStroke.getKeyStroke(key, 0, false), "pressed"); map.put(KeyStroke.getKeyStroke(key, 0, true), "released"); } } /** * ファンクションの文字列からキー番号を取得します * @param String ファンクションキー文字列 * @return int キー番号 */ protected static int getFunctionKeyNo(String keyString) throws Exception { if (keyString.equals("F1")) { return KeyEvent.VK_F1; } else if (keyString.equals("F2")) { return KeyEvent.VK_F2; } else if (keyString.equals("F3")) { return KeyEvent.VK_F3; } else if (keyString.equals("F4")) { return KeyEvent.VK_F4; } else if (keyString.equals("F5")) { return KeyEvent.VK_F5; } else if (keyString.equals("F6")) { return KeyEvent.VK_F6; } else if (keyString.equals("F7")) { return KeyEvent.VK_F7; } else if (keyString.equals("F8")) { return KeyEvent.VK_F8; } else if (keyString.equals("F9")) { return KeyEvent.VK_F9; } else if (keyString.equals("F10")) { return KeyEvent.VK_F10; } else if (keyString.equals("F11")) { return KeyEvent.VK_F11; } else if (keyString.equals("F12")) { return KeyEvent.VK_F12; } else { return Integer.parseInt(keyString); } } /** * 終了処理。保持していた変数などを開放する処理を記述します。<br/> * {@link #execute() execute} の後に実行されます。<br/>正常終了・異常終了などに関わらず必ず実行されます。 */ public void exit() { button = null; } }