OSDN Git Service

showing dialog to task-view GUI.
[jindolf/Jindolf.git] / src / main / java / jp / sfjp / jindolf / log / LogFrame.java
1 /*
2  * Log frame
3  *
4  * License : The MIT License
5  * Copyright(c) 2008 olyutorskii
6  */
7
8 package jp.sfjp.jindolf.log;
9
10 import io.github.olyutorskii.quetexj.HeightKeeper;
11 import io.github.olyutorskii.quetexj.MaxTracker;
12 import io.github.olyutorskii.quetexj.MvcFacade;
13 import io.github.olyutorskii.quetexj.SwingLogHandler;
14 import java.awt.Container;
15 import java.awt.Dialog;
16 import java.util.logging.Handler;
17 import javax.swing.Action;
18 import javax.swing.BorderFactory;
19 import javax.swing.BoundedRangeModel;
20 import javax.swing.Box;
21 import javax.swing.BoxLayout;
22 import javax.swing.JButton;
23 import javax.swing.JCheckBox;
24 import javax.swing.JDialog;
25 import javax.swing.JPopupMenu;
26 import javax.swing.JScrollBar;
27 import javax.swing.JScrollPane;
28 import javax.swing.JTextArea;
29 import javax.swing.JToggleButton;
30 import javax.swing.border.Border;
31 import javax.swing.text.Document;
32 import jp.sfjp.jindolf.dxchg.TextPopup;
33 import jp.sfjp.jindolf.util.Monodizer;
34
35 /**
36  * ログ表示ウィンドウ。
37  */
38 @SuppressWarnings("serial")
39 public final class LogFrame extends JDialog {
40
41     private static final int HEIGHT_LIMIT = 5000;
42     private static final int HEIGHT_NEW   = 4000;
43
44     private static final int AROUND_TEXT   = 3;
45     private static final int AROUND_BUTTON = 5;
46
47
48     private final MvcFacade facade;
49
50     private final JScrollPane scrollPane;
51     private final JButton clearButton;
52     private final JButton closeButton;
53     private final JCheckBox trackButton;
54
55     private final Handler handler;
56
57
58     /**
59      * コンストラクタ。
60      */
61     public LogFrame(){
62         super((Dialog)null);
63         // We need unowned dialog
64
65         this.facade = new MvcFacade();
66
67         this.scrollPane = buildScrollPane(this.facade);
68
69         this.clearButton = new JButton();
70         this.closeButton = new JButton();
71         this.trackButton = new JCheckBox();
72
73         setupButtons();
74
75         MaxTracker tracker = this.facade.getMaxTracker();
76         HeightKeeper keeper = this.facade.getHeightKeeper();
77
78         tracker.setTrackingMode(true);
79         keeper.setConditions(HEIGHT_LIMIT, HEIGHT_NEW);
80
81         Handler logHandler = null;
82         if(LogUtils.hasLoggingPermission()){
83             Document document = this.facade.getDocument();
84             logHandler = new SwingLogHandler(document);
85         }
86         this.handler = logHandler;
87
88         setResizable(true);
89         setLocationByPlatform(true);
90         setModal(false);
91
92         design();
93
94         return;
95     }
96
97
98     /**
99      * ログ用スクロール領域を生成する。
100      *
101      * @param facadeArg ファサード
102      * @return スクロール領域
103      */
104     private static JScrollPane buildScrollPane(MvcFacade facadeArg){
105         JScrollPane scrollPane = new JScrollPane();
106
107         JScrollBar vbar = scrollPane.getVerticalScrollBar();
108         BoundedRangeModel rangeModel =
109                 facadeArg.getVerticalBoundedRangeModel();
110         vbar.setModel(rangeModel);
111
112         JTextArea textArea = buildTextArea(facadeArg);
113         scrollPane.setViewportView(textArea);
114
115         return scrollPane;
116     }
117
118     /**
119      * ログ用テキストエリアを生成する。
120      *
121      * @param facadeArg ファサード
122      * @return テキストエリア
123      */
124     private static JTextArea buildTextArea(MvcFacade facadeArg){
125         JTextArea textArea = facadeArg.getTextArea();
126
127         textArea.setEditable(false);
128         textArea.setLineWrap(true);
129         Monodizer.monodize(textArea);
130
131         Border border = BorderFactory.createEmptyBorder(
132                 AROUND_TEXT,
133                 AROUND_TEXT,
134                 AROUND_TEXT,
135                 AROUND_TEXT
136         );
137         textArea.setBorder(border);
138
139         JPopupMenu popup = new TextPopup();
140         textArea.setComponentPopupMenu(popup);
141
142         return textArea;
143     }
144
145
146     /**
147      * ボタンの各種設定。
148      */
149     private void setupButtons(){
150         Action clearAction = this.facade.getClearAction();
151         this.clearButton.setAction(clearAction);
152         this.clearButton.setText("クリア");
153
154         this.closeButton.addActionListener(event -> {
155             if(event.getSource() == this.closeButton){
156                 setVisible(false);
157             }
158         });
159         this.closeButton.setText("閉じる");
160
161         JToggleButton.ToggleButtonModel toggleModel;
162         toggleModel = this.facade.getTrackSwitchButtonModel();
163         this.trackButton.setModel(toggleModel);
164         this.trackButton.setText("末尾に追従");
165
166         return;
167     }
168
169     /**
170      * レイアウトデザインを行う。
171      */
172     private void design(){
173         Box buttonPanel = Box.createHorizontalBox();
174
175         buttonPanel.add(this.clearButton);
176         buttonPanel.add(Box.createHorizontalStrut(AROUND_BUTTON));
177         buttonPanel.add(this.trackButton);
178         buttonPanel.add(Box.createHorizontalGlue());
179         buttonPanel.add(this.closeButton);
180
181         Border border = BorderFactory.createEmptyBorder(
182                 AROUND_BUTTON,
183                 AROUND_BUTTON,
184                 AROUND_BUTTON,
185                 AROUND_BUTTON
186         );
187         buttonPanel.setBorder(border);
188
189         Container content = getContentPane();
190         BoxLayout layout = new BoxLayout(content, BoxLayout.Y_AXIS);
191         content.setLayout(layout);
192
193         content.add(this.scrollPane);
194         content.add(buttonPanel);
195
196         return;
197     }
198
199     /**
200      * ロギングハンドラを返す。
201      *
202      * @return ロギングハンドラ
203      */
204     public Handler getHandler(){
205         return this.handler;
206     }
207
208 }