OSDN Git Service

Merge branch 'Branch_release-'
[jindolf/Jindolf.git] / src / main / java / jp / sfjp / jindolf / view / PeriodView.java
-/*\r
- * period viewer\r
- *\r
- * Copyright(c) 2008 olyutorskii\r
- * $Id: PeriodView.java 972 2009-12-26 05:05:15Z olyutorskii $\r
- */\r
-\r
-package jp.sourceforge.jindolf;\r
-\r
-import java.awt.BorderLayout;\r
-import java.awt.Color;\r
-import java.awt.Component;\r
-import java.awt.GridBagConstraints;\r
-import java.awt.GridBagLayout;\r
-import java.awt.Insets;\r
-import java.awt.LayoutManager;\r
-import java.awt.Rectangle;\r
-import java.awt.event.ItemEvent;\r
-import java.awt.event.ItemListener;\r
-import java.util.List;\r
-import javax.swing.BorderFactory;\r
-import javax.swing.DefaultComboBoxModel;\r
-import javax.swing.DefaultListCellRenderer;\r
-import javax.swing.JComboBox;\r
-import javax.swing.JLabel;\r
-import javax.swing.JList;\r
-import javax.swing.JPanel;\r
-import javax.swing.JScrollBar;\r
-import javax.swing.JScrollPane;\r
-import javax.swing.JViewport;\r
-import javax.swing.ScrollPaneConstants;\r
-import javax.swing.border.Border;\r
-import jp.sourceforge.jindolf.corelib.TalkType;\r
-\r
-/**\r
- * 発言ブラウザを内包するPeriodビューワ。\r
- */\r
-@SuppressWarnings("serial")\r
-public class PeriodView extends JPanel implements ItemListener{\r
-\r
-    private static final Color COLOR_SELECT = new Color(0xffff80);\r
-    private static final Color COLOR_NORMALBG = Color.BLACK;\r
-    private static final Color COLOR_SIMPLEBG = Color.WHITE;\r
-\r
-    private Period period;\r
-\r
-    private final Discussion discussion;\r
-    private final JScrollPane scroller = new JScrollPane();\r
-    private final JLabel caption = new JLabel();\r
-    private final JLabel limit = new JLabel();\r
-    private final JComboBox talkSelector = new JComboBox();\r
-    private final DefaultComboBoxModel model = new DefaultComboBoxModel();\r
-\r
-    private DialogPref dialogPref = new DialogPref();\r
-\r
-    /**\r
-     * 発言ブラウザを内包するPeriodビューワを生成する。\r
-     * @param period 日\r
-     */\r
-    public PeriodView(Period period){\r
-        super();\r
-\r
-        this.period = period;\r
-\r
-        this.talkSelector.setEditable(false);\r
-        this.talkSelector.setMaximumRowCount(20);\r
-        this.talkSelector.setModel(this.model);\r
-        this.talkSelector.setRenderer(new AnchorRenderer());\r
-        this.talkSelector.addItemListener(this);\r
-\r
-        this.discussion = new Discussion();\r
-        Border border =\r
-                BorderFactory.createMatteBorder(15, 15, 15, 15, Color.BLACK);\r
-        this.discussion.setBorder(border);\r
-        this.discussion.setPeriod(this.period);\r
-\r
-        JViewport viewPort = this.scroller.getViewport();\r
-        viewPort.setBackground(Color.BLACK);\r
-        viewPort.setView(this.discussion);\r
-\r
-        this.scroller.setHorizontalScrollBarPolicy(\r
-                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);\r
-        this.scroller.setVerticalScrollBarPolicy(\r
-                ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);\r
-\r
-        design();\r
-\r
-        setColorDesign();\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * デザインを行う。\r
-     */\r
-    private void design(){\r
-        LayoutManager layout;\r
-\r
-        JPanel topPanel = new JPanel();\r
-        layout = new GridBagLayout();\r
-        GridBagConstraints constraints = new GridBagConstraints();\r
-        topPanel.setLayout(layout);\r
-        constraints.insets = new Insets(1, 3, 1, 3);\r
-        constraints.weightx = 1.0;\r
-        constraints.anchor = GridBagConstraints.WEST;\r
-        constraints.fill = GridBagConstraints.NONE;\r
-        topPanel.add(this.caption, constraints);\r
-        constraints.weightx = 0.0;\r
-        constraints.anchor = GridBagConstraints.EAST;\r
-        topPanel.add(this.limit, constraints);\r
-        constraints.weightx = 0.0;\r
-        topPanel.add(this.talkSelector, constraints);\r
-\r
-        layout = new BorderLayout();\r
-        setLayout(layout);\r
-        add(topPanel,      BorderLayout.NORTH);\r
-        add(this.scroller, BorderLayout.CENTER);\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * 配色を設定する。\r
-     */\r
-    private void setColorDesign(){\r
-        Color bgColor;\r
-\r
-        if(this.dialogPref.isSimpleMode()){\r
-            bgColor = COLOR_SIMPLEBG;\r
-        }else{\r
-            bgColor = COLOR_NORMALBG;\r
-        }\r
-\r
-        JViewport viewPort = this.scroller.getViewport();\r
-        viewPort.setBackground(bgColor);\r
-\r
-        Border border =\r
-                BorderFactory.createMatteBorder(15, 15, 15, 15, bgColor);\r
-        this.discussion.setBorder(border);\r
-\r
-        repaint();\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * Periodを更新する。\r
-     * 古いPeriodの表示内容は消える。\r
-     * 新しいPeriodの表示内容はまだ反映されない。\r
-     * @param period 新しいPeriod\r
-     */\r
-    public void setPeriod(Period period){\r
-        this.discussion.setPeriod(period);\r
-\r
-        this.period = period;\r
-\r
-        updateTopPanel();\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * 現在のPeriodを返す。\r
-     * @return 現在のPeriod\r
-     */\r
-    public Period getPeriod(){\r
-        return this.discussion.getPeriod();\r
-    }\r
-\r
-    /**\r
-     * 上部のGUI(村名、発言一覧)を、Periodの状態に合わせて更新する。\r
-     */\r
-    private void updateTopPanel(){\r
-        if(this.period == null){\r
-            this.caption.setText("");\r
-            this.limit.setText("");\r
-            this.model.removeAllElements();\r
-            return;\r
-        }\r
-\r
-        Village village = this.period.getVillage();\r
-        String villageName = village.getVillageName();\r
-\r
-        String dayCaption   = this.period.getCaption();\r
-        String limitCaption = this.period.getLimit();\r
-        String account      = this.period.getLoginName();\r
-\r
-        String loginout;\r
-        if(this.period.isFullOpen()){\r
-            loginout = "";\r
-        }else if(account != null){\r
-            loginout = " (ログイン中)";\r
-        }else{\r
-            loginout = " (ログアウト中)";\r
-        }\r
-\r
-        String info = villageName + "村 " + dayCaption + loginout;\r
-        this.caption.setText(info);\r
-        this.limit.setText("更新時刻 " + limitCaption);\r
-\r
-        this.model.removeAllElements();\r
-        this.model.addElement(" ");\r
-        List<Topic> topicList = this.period.getTopicList();\r
-        for(Topic topic : topicList){\r
-            if( ! (topic instanceof Talk) ) continue;\r
-            Talk talk = (Talk) topic;\r
-            if(talk.getTalkCount() <= 0) continue;\r
-            this.model.addElement(talk);\r
-        }\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * フィルタを適用してPeriodの内容を出力する。\r
-     */\r
-    public void showTopics(){\r
-        Period newPeriod = this.discussion.getPeriod();\r
-        setPeriod(newPeriod);\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * フォント描画設定を変更する。\r
-     * @param fontInfo フォント設定\r
-     */\r
-    // TODO スクロール位置の復元\r
-    public void setFontInfo(FontInfo fontInfo){\r
-        this.discussion.setFontInfo(fontInfo);\r
-\r
-        revalidate();\r
-        repaint();\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * 発言表示設定を更新する。\r
-     * @param pref 表示設定\r
-     */\r
-    public void setDialogPref(DialogPref pref){\r
-        this.dialogPref = pref;\r
-        this.discussion.setDialogPref(this.dialogPref);\r
-\r
-        setColorDesign();\r
-        revalidate();\r
-        repaint();\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * ビューポート内の発言ブラウザを返す。\r
-     * @return 内部ブラウザ\r
-     */\r
-    public Discussion getDiscussion(){\r
-        return this.discussion;\r
-    }\r
-\r
-    /**\r
-     * スクロール位置を返す。\r
-     * @return スクロール位置\r
-     */\r
-    public int getVerticalPosition(){\r
-        JScrollBar vt = this.scroller.getVerticalScrollBar();\r
-        int pos = vt.getValue();\r
-        return pos;\r
-    }\r
-\r
-    /**\r
-     * スクロール位置を設定する。\r
-     * @param pos スクロール位置\r
-     */\r
-    public void setVerticalPosition(int pos){\r
-        JScrollBar vt = this.scroller.getVerticalScrollBar();\r
-        vt.setValue(pos);\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * {@inheritDoc}\r
-     * コンボボックス操作のリスナ。\r
-     * @param event コンボボックス操作イベント {@inheritDoc}\r
-     */\r
-    public void itemStateChanged(ItemEvent event){\r
-        if(event.getStateChange() != ItemEvent.SELECTED) return;\r
-\r
-        Object selected = this.talkSelector.getSelectedItem();\r
-        if( ! (selected instanceof Talk) ) return;\r
-        Talk talk = (Talk) selected;\r
-\r
-        scrollToTalk(talk);\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * 任意の発言が表示されるようスクロールする。\r
-     * @param talk 発言\r
-     */\r
-    public void scrollToTalk(Talk talk){\r
-        if(talk == null) return;\r
-        if(talk.getPeriod() != this.period) return;\r
-\r
-        Rectangle rect = this.discussion.getTalkBounds(talk);\r
-        if(rect == null) return;\r
-\r
-        Rectangle showRect = new Rectangle(rect);\r
-        showRect.y -= 15;\r
-        showRect.height = this.scroller.getHeight();\r
-        this.discussion.scrollRectToVisible(showRect);\r
-\r
-        return;\r
-    }\r
-\r
-    /**\r
-     * Talkをアイテムに持つコンボボックス用のセル描画。\r
-     */\r
-    private static class AnchorRenderer extends DefaultListCellRenderer{\r
-\r
-        /**\r
-         * コンストラクタ。\r
-         */\r
-        public AnchorRenderer(){\r
-            super();\r
-            return;\r
-        }\r
-\r
-        /**\r
-         * {@inheritDoc}\r
-         * Talkのアンカー表記と発言者名を描画する。\r
-         * @param list {@inheritDoc}\r
-         * @param value {@inheritDoc}\r
-         * @param index {@inheritDoc}\r
-         * @param isSelected {@inheritDoc}\r
-         * @param cellHasFocus {@inheritDoc}\r
-         * @return {@inheritDoc}\r
-         */\r
-        @Override\r
-        public Component getListCellRendererComponent(\r
-                JList list,\r
-                Object value,\r
-                int index,\r
-                boolean isSelected,\r
-                boolean cellHasFocus ){\r
-            Talk talk = null;\r
-            Object newValue = value;\r
-            if(value instanceof Talk){\r
-                talk = (Talk) value;\r
-                newValue = new StringBuilder()\r
-                          .append(talk.getAnchorNotation())\r
-                          .append(' ')\r
-                          .append(talk.getAvatar().getName())\r
-                          .toString();\r
-            }\r
-\r
-            Component superResult =\r
-                    super.getListCellRendererComponent(list,\r
-                                                       newValue,\r
-                                                       index,\r
-                                                       isSelected,\r
-                                                       cellHasFocus);\r
-\r
-            if(talk != null){\r
-                Color bgColor = null;\r
-                if(isSelected){\r
-                    bgColor = COLOR_SELECT;\r
-                }else{\r
-                    TalkType type = talk.getTalkType();\r
-                    bgColor = TalkDraw.getTypedColor(type);\r
-                }\r
-                superResult.setForeground(Color.BLACK);\r
-                superResult.setBackground(bgColor);\r
-            }\r
-\r
-            return superResult;\r
-        }\r
-    }\r
-\r
-    // TODO フィルタ中の発言をプルダウン選択したらどうあるべきか?\r
-}\r
+/*
+ * period viewer
+ *
+ * License : The MIT License
+ * Copyright(c) 2008 olyutorskii
+ */
+
+package jp.sfjp.jindolf.view;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.LayoutManager;
+import java.awt.Rectangle;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.List;
+import javax.swing.BorderFactory;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollBar;
+import javax.swing.JScrollPane;
+import javax.swing.JViewport;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.border.Border;
+import jp.sfjp.jindolf.data.DialogPref;
+import jp.sfjp.jindolf.data.Period;
+import jp.sfjp.jindolf.data.Talk;
+import jp.sfjp.jindolf.data.Topic;
+import jp.sfjp.jindolf.data.Village;
+import jp.sfjp.jindolf.glyph.Discussion;
+import jp.sfjp.jindolf.glyph.FontInfo;
+import jp.sfjp.jindolf.glyph.TalkDraw;
+import jp.sourceforge.jindolf.corelib.TalkType;
+
+/**
+ * 発言ブラウザを内包するPeriodビューワ。
+ */
+@SuppressWarnings("serial")
+public class PeriodView extends JPanel implements ItemListener{
+
+    private static final Color COLOR_SELECT = new Color(0xffff80);
+    private static final Color COLOR_NORMALBG = Color.BLACK;
+    private static final Color COLOR_SIMPLEBG = Color.WHITE;
+
+    private Period period;
+
+    private final Discussion discussion;
+    private final JScrollPane scroller = new JScrollPane();
+    private final JLabel caption = new JLabel();
+    private final JLabel limit = new JLabel();
+    private final JComboBox<Talk> talkSelector = new JComboBox<>();
+    private final DefaultComboBoxModel<Talk> model =
+            new DefaultComboBoxModel<>();
+
+    private DialogPref dialogPref = new DialogPref();
+
+    /**
+     * 発言ブラウザを内包するPeriodビューワを生成する。
+     * @param period 日
+     */
+    @SuppressWarnings("LeakingThisInConstructor")
+    public PeriodView(Period period){
+        super();
+
+        this.period = period;
+
+        this.talkSelector.setEditable(false);
+        this.talkSelector.setMaximumRowCount(20);
+        this.talkSelector.setModel(this.model);
+        this.talkSelector.setRenderer(new AnchorRenderer());
+        this.talkSelector.addItemListener(this);
+
+        this.discussion = new Discussion();
+        Border border =
+                BorderFactory.createMatteBorder(15, 15, 15, 15, Color.BLACK);
+        this.discussion.setBorder(border);
+        this.discussion.setPeriod(this.period);
+
+        JViewport viewPort = this.scroller.getViewport();
+        viewPort.setBackground(Color.BLACK);
+        viewPort.setView(this.discussion);
+
+        this.scroller.setHorizontalScrollBarPolicy(
+                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+        this.scroller.setVerticalScrollBarPolicy(
+                ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+
+        design();
+
+        setColorDesign();
+
+        return;
+    }
+
+    /**
+     * デザインを行う。
+     */
+    private void design(){
+        LayoutManager layout;
+
+        JPanel topPanel = new JPanel();
+        layout = new GridBagLayout();
+        GridBagConstraints constraints = new GridBagConstraints();
+        topPanel.setLayout(layout);
+        constraints.insets = new Insets(1, 3, 1, 3);
+        constraints.weightx = 1.0;
+        constraints.anchor = GridBagConstraints.WEST;
+        constraints.fill = GridBagConstraints.NONE;
+        topPanel.add(this.caption, constraints);
+        constraints.weightx = 0.0;
+        constraints.anchor = GridBagConstraints.EAST;
+        topPanel.add(this.limit, constraints);
+        constraints.weightx = 0.0;
+        topPanel.add(this.talkSelector, constraints);
+
+        layout = new BorderLayout();
+        setLayout(layout);
+        add(topPanel,      BorderLayout.NORTH);
+        add(this.scroller, BorderLayout.CENTER);
+
+        return;
+    }
+
+    /**
+     * 配色を設定する。
+     */
+    private void setColorDesign(){
+        Color bgColor;
+
+        if(this.dialogPref.isSimpleMode()){
+            bgColor = COLOR_SIMPLEBG;
+        }else{
+            bgColor = COLOR_NORMALBG;
+        }
+
+        JViewport viewPort = this.scroller.getViewport();
+        viewPort.setBackground(bgColor);
+
+        Border border =
+                BorderFactory.createMatteBorder(15, 15, 15, 15, bgColor);
+        this.discussion.setBorder(border);
+
+        repaint();
+
+        return;
+    }
+
+    /**
+     * Periodを更新する。
+     * 古いPeriodの表示内容は消える。
+     * 新しいPeriodの表示内容はまだ反映されない。
+     * @param period 新しいPeriod
+     */
+    public void setPeriod(Period period){
+        this.discussion.setPeriod(period);
+
+        this.period = period;
+
+        updateTopPanel();
+
+        return;
+    }
+
+    /**
+     * 現在のPeriodを返す。
+     * @return 現在のPeriod
+     */
+    public Period getPeriod(){
+        return this.discussion.getPeriod();
+    }
+
+    /**
+     * 上部のGUI(村名、発言一覧)を、Periodの状態に合わせて更新する。
+     */
+    private void updateTopPanel(){
+        if(this.period == null){
+            this.caption.setText("");
+            this.limit.setText("");
+            this.model.removeAllElements();
+            return;
+        }
+
+        Village village = this.period.getVillage();
+        String villageName = village.getVillageName();
+
+        String dayCaption   = this.period.getCaption();
+        String limitCaption = this.period.getLimit();
+        String account      = this.period.getLoginName();
+
+        String loginout;
+        if(this.period.isFullOpen()){
+            loginout = "";
+        }else if(account != null){
+            loginout = " (ログイン中)";
+        }else{
+            loginout = " (ログアウト中)";
+        }
+
+        String info = villageName + "村 " + dayCaption + loginout;
+        this.caption.setText(info);
+        this.limit.setText("更新時刻 " + limitCaption);
+
+        this.model.removeAllElements();
+        this.model.addElement(null);
+        List<Topic> topicList = this.period.getTopicList();
+        for(Topic topic : topicList){
+            if( ! (topic instanceof Talk) ) continue;
+            Talk talk = (Talk) topic;
+            if(talk.getTalkCount() <= 0) continue;
+            this.model.addElement(talk);
+        }
+
+        return;
+    }
+
+    /**
+     * フィルタを適用してPeriodの内容を出力する。
+     */
+    public void showTopics(){
+        Period newPeriod = this.discussion.getPeriod();
+        setPeriod(newPeriod);
+        return;
+    }
+
+    /**
+     * フォント描画設定を変更する。
+     * @param fontInfo フォント設定
+     */
+    // TODO スクロール位置の復元
+    public void setFontInfo(FontInfo fontInfo){
+        this.discussion.setFontInfo(fontInfo);
+
+        revalidate();
+        repaint();
+
+        return;
+    }
+
+    /**
+     * 発言表示設定を更新する。
+     * @param pref 表示設定
+     */
+    public void setDialogPref(DialogPref pref){
+        this.dialogPref = pref;
+        this.discussion.setDialogPref(this.dialogPref);
+
+        setColorDesign();
+        revalidate();
+        repaint();
+
+        return;
+    }
+
+    /**
+     * ビューポート内の発言ブラウザを返す。
+     * @return 内部ブラウザ
+     */
+    public Discussion getDiscussion(){
+        return this.discussion;
+    }
+
+    /**
+     * スクロール位置を返す。
+     * @return スクロール位置
+     */
+    public int getVerticalPosition(){
+        JScrollBar vt = this.scroller.getVerticalScrollBar();
+        int pos = vt.getValue();
+        return pos;
+    }
+
+    /**
+     * スクロール位置を設定する。
+     * @param pos スクロール位置
+     */
+    public void setVerticalPosition(int pos){
+        JScrollBar vt = this.scroller.getVerticalScrollBar();
+        vt.setValue(pos);
+        return;
+    }
+
+    /**
+     * {@inheritDoc}
+     * コンボボックス操作のリスナ。
+     * @param event コンボボックス操作イベント {@inheritDoc}
+     */
+    @Override
+    public void itemStateChanged(ItemEvent event){
+        if(event.getStateChange() != ItemEvent.SELECTED) return;
+
+        Object selected = this.talkSelector.getSelectedItem();
+        if( ! (selected instanceof Talk) ) return;
+        Talk talk = (Talk) selected;
+
+        scrollToTalk(talk);
+
+        return;
+    }
+
+    /**
+     * 任意の発言が表示されるようスクロールする。
+     * @param talk 発言
+     */
+    public void scrollToTalk(Talk talk){
+        if(talk == null) return;
+        if(talk.getPeriod() != this.period) return;
+
+        Rectangle rect = this.discussion.getTalkBounds(talk);
+        if(rect == null) return;
+
+        Rectangle showRect = new Rectangle(rect);
+        showRect.y -= 15;
+        showRect.height = this.scroller.getHeight();
+        this.discussion.scrollRectToVisible(showRect);
+
+        return;
+    }
+
+    /**
+     * Talkをアイテムに持つコンボボックス用のセル描画。
+     */
+    private static class AnchorRenderer extends DefaultListCellRenderer{
+
+        /**
+         * コンストラクタ。
+         */
+        public AnchorRenderer(){
+            super();
+            return;
+        }
+
+        /**
+         * {@inheritDoc}
+         * Talkのアンカー表記と発言者名を描画する。
+         * @param list {@inheritDoc}
+         * @param value {@inheritDoc}
+         * @param index {@inheritDoc}
+         * @param isSelected {@inheritDoc}
+         * @param cellHasFocus {@inheritDoc}
+         * @return {@inheritDoc}
+         */
+        @Override
+        public Component getListCellRendererComponent(
+                JList<?> list,
+                Object value,
+                int index,
+                boolean isSelected,
+                boolean cellHasFocus ){
+            Talk talk = null;
+            Object newValue;
+            if(value instanceof Talk){
+                talk = (Talk) value;
+                newValue = new StringBuilder()
+                          .append(talk.getAnchorNotation())
+                          .append(' ')
+                          .append(talk.getAvatar().getName())
+                          .toString();
+            }else{
+                newValue = " ";
+            }
+
+            Component superResult =
+                    super.getListCellRendererComponent(list,
+                                                       newValue,
+                                                       index,
+                                                       isSelected,
+                                                       cellHasFocus);
+
+            if(talk != null){
+                Color bgColor = null;
+                if(isSelected){
+                    bgColor = COLOR_SELECT;
+                }else{
+                    TalkType type = talk.getTalkType();
+                    bgColor = TalkDraw.getTypedColor(type);
+                }
+                superResult.setForeground(Color.BLACK);
+                superResult.setBackground(bgColor);
+            }
+
+            return superResult;
+        }
+    }
+
+    // TODO フィルタ中の発言をプルダウン選択したらどうあるべきか?
+}