From: Olyutorskii Date: Mon, 2 Mar 2020 02:29:09 +0000 (+0900) Subject: add ActionListener list to popup. X-Git-Tag: v4.101.2^2~33 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=3f4d85f311e23098b1de056c05bd7e10042a6a1a;p=jindolf%2FJindolf.git add ActionListener list to popup. --- diff --git a/src/main/java/jp/sfjp/jindolf/Controller.java b/src/main/java/jp/sfjp/jindolf/Controller.java index 02e3fc5..45a663d 100644 --- a/src/main/java/jp/sfjp/jindolf/Controller.java +++ b/src/main/java/jp/sfjp/jindolf/Controller.java @@ -539,7 +539,7 @@ public class Controller if(periodView == null) return; Discussion discussion = periodView.getDiscussion(); - Talk talk = discussion.getPopupedTalk(); + Talk talk = discussion.getActiveTalk(); if(talk == null) return; Period period = periodView.getPeriod(); @@ -1146,7 +1146,7 @@ public class Controller TabBrowser browser = this.topView.getTabBrowser(); Village village = getVillage(); - final Anchor anchor = discussion.getPopupedAnchor(); + final Anchor anchor = discussion.getActiveAnchor(); if(anchor == null) return; Runnable task = () -> { diff --git a/src/main/java/jp/sfjp/jindolf/glyph/Discussion.java b/src/main/java/jp/sfjp/jindolf/glyph/Discussion.java index 4d7e230..239e3c0 100644 --- a/src/main/java/jp/sfjp/jindolf/glyph/Discussion.java +++ b/src/main/java/jp/sfjp/jindolf/glyph/Discussion.java @@ -31,6 +31,7 @@ import java.util.regex.Pattern; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.ActionMap; +import javax.swing.Icon; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JMenuItem; @@ -70,7 +71,7 @@ import jp.sfjp.jindolf.view.TopicFilter; * など */ @SuppressWarnings("serial") -public class Discussion extends JComponent +public final class Discussion extends JComponent implements Scrollable, MouseInputListener, ComponentListener{ private static final Color COLOR_NORMALBG = Color.BLACK; @@ -99,6 +100,8 @@ public class Discussion extends JComponent private int lastWidth = -1; private final DiscussionPopup popup = new DiscussionPopup(); + private Talk activeTalk; + private Anchor activeAnchor; /** @@ -1019,9 +1022,8 @@ public class Discussion extends JComponent * @return コピーした文字列 */ public CharSequence copyTalk(){ - TalkDraw talkDraw = this.popup.lastPopupedTalkDraw; - if(talkDraw == null) return null; - Talk talk = talkDraw.getTalk(); + Talk talk = getActiveTalk(); + if(talk == null) return null; StringBuilder selected = new StringBuilder(); @@ -1046,36 +1048,56 @@ public class Discussion extends JComponent } /** - * ポップアップメニュートリガ座標に会話があればそれを返す。 + * ポップアップメニュートリガなどの要因による + * 特定の会話への指示があればそれを返す。 * * @return 会話 */ - public Talk getPopupedTalk(){ - TalkDraw talkDraw = this.popup.lastPopupedTalkDraw; - if(talkDraw == null) return null; - Talk talk = talkDraw.getTalk(); - return talk; + public Talk getActiveTalk(){ + return this.activeTalk; } /** - * ポップアップメニュートリガ座標にアンカーがあればそれを返す。 + * ポップアップメニュートリガなどの要因による + * 特定の会話への指示があればそれを設定する。 + * + * @param talk 会話 + */ + public void setActiveTalk(Talk talk){ + this.activeTalk = talk; + return; + } + + /** + * ポップアップメニュートリガなどの要因による + * 特定のアンカーへの指示があればそれを返す。 * * @return アンカー */ - public Anchor getPopupedAnchor(){ - return this.popup.lastPopupedAnchor; + public Anchor getActiveAnchor(){ + return this.activeAnchor; + } + + /** + * ポップアップメニュートリガなどの要因による + * 特定のアンカーへの指示があればそれを設定する。 + * + * @param anchor アンカー + */ + public void setActiveAnchor(Anchor anchor){ + this.activeAnchor = anchor; + return; } /** * {@inheritDoc} + * + *

キーバインディング設定が変わる可能性あり。 */ @Override public void updateUI(){ super.updateUI(); - this.popup.updateUI(); - modifyInputMap(); - return; } @@ -1117,21 +1139,15 @@ public class Discussion extends JComponent /** * ActionListenerを追加する。 * - *

対象となるActionは、 + *

通知対象となるActionは、 * COPYキー操作によって選択文字列からクリップボードへの - * コピーが指示される場合のみ。 + * コピーが指示される場合とポップアップメニューの押下。 * * @param listener リスナー */ public void addActionListener(ActionListener listener){ this.listenerList.add(ActionListener.class, listener); - - this.popup.menuCopy .addActionListener(listener); - this.popup.menuSelTalk .addActionListener(listener); - this.popup.menuJumpAnchor .addActionListener(listener); - this.popup.menuWebTalk .addActionListener(listener); - this.popup.menuSummary .addActionListener(listener); - + this.popup.addActionListener(listener); return; } @@ -1142,13 +1158,7 @@ public class Discussion extends JComponent */ public void removeActionListener(ActionListener listener){ this.listenerList.remove(ActionListener.class, listener); - - this.popup.menuCopy .removeActionListener(listener); - this.popup.menuSelTalk .removeActionListener(listener); - this.popup.menuJumpAnchor .removeActionListener(listener); - this.popup.menuWebTalk .removeActionListener(listener); - this.popup.menuSummary .removeActionListener(listener); - + this.popup.removeActionListener(listener); return; } @@ -1255,7 +1265,7 @@ public class Discussion extends JComponent /** * ポップアップメニュー。 */ - private class DiscussionPopup extends JPopupMenu{ + private static final class DiscussionPopup extends JPopupMenu{ private final JMenuItem menuCopy = new JMenuItem("選択範囲をコピー"); @@ -1268,16 +1278,26 @@ public class Discussion extends JComponent private final JMenuItem menuSummary = new JMenuItem("発言を集計..."); - private TalkDraw lastPopupedTalkDraw; - private Anchor lastPopupedAnchor; - /** * コンストラクタ。 */ - public DiscussionPopup(){ + DiscussionPopup(){ super(); + design(); + setCommand(); + + Icon icon = GUIUtils.getWWWIcon(); + this.menuWebTalk.setIcon(icon); + + return; + } + + /** + * メニューのデザイン。 + */ + private void design(){ add(this.menuCopy); add(this.menuSelTalk); addSeparator(); @@ -1285,24 +1305,26 @@ public class Discussion extends JComponent add(this.menuWebTalk); addSeparator(); add(this.menuSummary); + return; + } + /** + * アクションコマンドの設定。 + */ + private void setCommand(){ this.menuCopy - .setActionCommand(ActionManager.CMD_COPY); + .setActionCommand(ActionManager.CMD_COPY); this.menuSelTalk - .setActionCommand(ActionManager.CMD_COPYTALK); + .setActionCommand(ActionManager.CMD_COPYTALK); this.menuJumpAnchor - .setActionCommand(ActionManager.CMD_JUMPANCHOR); + .setActionCommand(ActionManager.CMD_JUMPANCHOR); this.menuWebTalk - .setActionCommand(ActionManager.CMD_WEBTALK); + .setActionCommand(ActionManager.CMD_WEBTALK); this.menuSummary - .setActionCommand(ActionManager.CMD_DAYSUMMARY); - - this.menuWebTalk.setIcon(GUIUtils.getWWWIcon()); - + .setActionCommand(ActionManager.CMD_DAYSUMMARY); return; } - /** * {@inheritDoc} * @@ -1310,36 +1332,92 @@ public class Discussion extends JComponent * *

ポップアップクリックの対象となった会話やアンカーを記録する。 * - * @param comp {@inheritDoc} + * @param invoker {@inheritDoc} * @param x {@inheritDoc} * @param y {@inheritDoc} */ @Override - public void show(Component comp, int x, int y){ + public void show(Component invoker, int x, int y){ + if( ! (invoker instanceof Discussion) ){ + super.show(invoker, x, y); + return; + } + Discussion dis = (Discussion) invoker; + Point point = new Point(x, y); - this.lastPopupedTalkDraw = getHittedTalkDraw(point); - boolean talkPointed = this.lastPopupedTalkDraw != null; - if(talkPointed){ - this.lastPopupedAnchor = - this.lastPopupedTalkDraw.getAnchor(point); - }else{ - this.lastPopupedAnchor = null; + boolean talkPointed = false; + Talk activeTalk = null; + Anchor activeAnchor = null; + + TalkDraw popupTalkDraw = dis.getHittedTalkDraw(point); + if(popupTalkDraw != null){ + talkPointed = true; + activeTalk = popupTalkDraw.getTalk(); + activeAnchor = popupTalkDraw.getAnchor(point); } - boolean anchorPointed = this.lastPopupedAnchor != null; - boolean hasSelectedText = getSelected() != null; + dis.setActiveTalk(activeTalk); + dis.setActiveAnchor(activeAnchor); + + boolean anchorPointed = activeAnchor != null; + boolean hasSelectedText = dis.getSelected() != null; this.menuSelTalk .setEnabled(talkPointed); this.menuWebTalk .setEnabled(talkPointed); this.menuJumpAnchor .setEnabled(anchorPointed); this.menuCopy .setEnabled(hasSelectedText); - super.show(comp, x, y); + super.show(invoker, x, y); + + return; + } + + /** + * ActionListenerを追加する。 + * + *

受信対象はポップアップメニュー押下。 + * + * @param listener リスナー + */ + public void addActionListener(ActionListener listener){ + this.listenerList.add(ActionListener.class, listener); + + this.menuCopy .addActionListener(listener); + this.menuSelTalk .addActionListener(listener); + this.menuJumpAnchor .addActionListener(listener); + this.menuWebTalk .addActionListener(listener); + this.menuSummary .addActionListener(listener); + + return; + } + + /** + * ActionListenerを削除する。 + * + * @param listener リスナー + */ + public void removeActionListener(ActionListener listener){ + this.listenerList.remove(ActionListener.class, listener); + + this.menuCopy .removeActionListener(listener); + this.menuSelTalk .removeActionListener(listener); + this.menuJumpAnchor .removeActionListener(listener); + this.menuWebTalk .removeActionListener(listener); + this.menuSummary .removeActionListener(listener); return; } + /** + * ActionListenerを列挙する。 + * + * @return すべてのActionListener + */ + public ActionListener[] getActionListeners(){ + return this.listenerList.getListeners(ActionListener.class); + } + } }