4 * License : The MIT License
5 * Copyright(c) 2008 olyutorskii
8 package jp.sfjp.jindolf.log;
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;
38 @SuppressWarnings("serial")
39 public final class LogFrame extends JDialog {
41 private static final int HEIGHT_LIMIT = 5000;
42 private static final int HEIGHT_NEW = 4000;
44 private static final int AROUND_TEXT = 3;
45 private static final int AROUND_BUTTON = 5;
48 private final MvcFacade facade;
50 private final JScrollPane scrollPane;
51 private final JButton clearButton;
52 private final JButton closeButton;
53 private final JCheckBox trackButton;
55 private final Handler handler;
63 // We need unowned dialog
65 this.facade = new MvcFacade();
67 this.scrollPane = buildScrollPane(this.facade);
69 this.clearButton = new JButton();
70 this.closeButton = new JButton();
71 this.trackButton = new JCheckBox();
75 MaxTracker tracker = this.facade.getMaxTracker();
76 HeightKeeper keeper = this.facade.getHeightKeeper();
78 tracker.setTrackingMode(true);
79 keeper.setConditions(HEIGHT_LIMIT, HEIGHT_NEW);
81 Handler logHandler = null;
82 if(LogUtils.hasLoggingPermission()){
83 Document document = this.facade.getDocument();
84 logHandler = new SwingLogHandler(document);
86 this.handler = logHandler;
89 setLocationByPlatform(true);
101 * @param facadeArg ファサード
104 private static JScrollPane buildScrollPane(MvcFacade facadeArg){
105 JScrollPane scrollPane = new JScrollPane();
107 JScrollBar vbar = scrollPane.getVerticalScrollBar();
108 BoundedRangeModel rangeModel =
109 facadeArg.getVerticalBoundedRangeModel();
110 vbar.setModel(rangeModel);
112 JTextArea textArea = buildTextArea(facadeArg);
113 scrollPane.setViewportView(textArea);
121 * @param facadeArg ファサード
124 private static JTextArea buildTextArea(MvcFacade facadeArg){
125 JTextArea textArea = facadeArg.getTextArea();
127 textArea.setEditable(false);
128 textArea.setLineWrap(true);
129 Monodizer.monodize(textArea);
131 Border border = BorderFactory.createEmptyBorder(
137 textArea.setBorder(border);
139 JPopupMenu popup = new TextPopup();
140 textArea.setComponentPopupMenu(popup);
149 private void setupButtons(){
150 Action clearAction = this.facade.getClearAction();
151 this.clearButton.setAction(clearAction);
152 this.clearButton.setText("クリア");
154 this.closeButton.addActionListener(event -> {
155 if(event.getSource() == this.closeButton){
159 this.closeButton.setText("閉じる");
161 JToggleButton.ToggleButtonModel toggleModel;
162 toggleModel = this.facade.getTrackSwitchButtonModel();
163 this.trackButton.setModel(toggleModel);
164 this.trackButton.setText("末尾に追従");
172 private void design(){
173 Box buttonPanel = Box.createHorizontalBox();
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);
181 Border border = BorderFactory.createEmptyBorder(
187 buttonPanel.setBorder(border);
189 Container content = getContentPane();
190 BoxLayout layout = new BoxLayout(content, BoxLayout.Y_AXIS);
191 content.setLayout(layout);
193 content.add(this.scrollPane);
194 content.add(buttonPanel);
204 public Handler getHandler(){