📄 statusbar.java
字号:
/* * StatusBar.java - The status bar displayed at the bottom of views * :tabSize=8:indentSize=8:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2001, 2004 Slava Pestov * Portions copyright (C) 2001 mike dillon * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */package org.gjt.sp.jedit.gui;//{{{ Importsimport javax.swing.border.*;import javax.swing.text.Segment;import javax.swing.*;import java.awt.event.*;import java.awt.font.*;import java.awt.geom.*;import java.awt.*;import java.text.*;import java.util.Calendar;import java.util.Date;import org.gjt.sp.jedit.io.*;import org.gjt.sp.jedit.textarea.*;import org.gjt.sp.jedit.*;import org.gjt.sp.util.*;//}}}/** * The status bar used to display various information to the user.<p> * * Currently, it is used for the following: * <ul> * <li>Displaying caret position information * <li>Displaying {@link InputHandler#readNextChar(String,String)} prompts * <li>Displaying {@link #setMessage(String)} messages * <li>Displaying I/O progress * <li>Displaying various editor settings * <li>Displaying memory status * </ul> * * @version $Id: StatusBar.java,v 1.64 2004/03/20 06:08:49 spestov Exp $ * @author Slava Pestov * @since jEdit 3.2pre2 */public class StatusBar extends JPanel implements WorkThreadProgressListener{ //{{{ StatusBar constructor public StatusBar(View view) { super(new BorderLayout()); setBorder(new CompoundBorder(new EmptyBorder(4,0,0, (OperatingSystem.isMacOS() ? 18 : 0)), UIManager.getBorder("TextField.border"))); this.view = view; panel = new JPanel(new BorderLayout()); box = new Box(BoxLayout.X_AXIS); panel.add(BorderLayout.EAST,box); add(BorderLayout.CENTER,panel); MouseHandler mouseHandler = new MouseHandler(); caretStatus = new ToolTipLabel(); caretStatus.setToolTipText(jEdit.getProperty("view.status.caret-tooltip")); caretStatus.addMouseListener(mouseHandler); message = new JLabel(" "); setMessageComponent(message); mode = new ToolTipLabel(); mode.setToolTipText(jEdit.getProperty("view.status.mode-tooltip")); mode.addMouseListener(mouseHandler); wrap = new ToolTipLabel(); wrap.setHorizontalAlignment(SwingConstants.CENTER); wrap.setToolTipText(jEdit.getProperty("view.status.wrap-tooltip")); wrap.addMouseListener(mouseHandler); multiSelect = new ToolTipLabel(); multiSelect.setHorizontalAlignment(SwingConstants.CENTER); multiSelect.setToolTipText(jEdit.getProperty("view.status.multi-tooltip")); multiSelect.addMouseListener(mouseHandler); rectSelect = new ToolTipLabel(); rectSelect.setHorizontalAlignment(SwingConstants.CENTER); rectSelect.setToolTipText(jEdit.getProperty("view.status.rect-tooltip")); rectSelect.addMouseListener(mouseHandler); overwrite = new ToolTipLabel(); overwrite.setHorizontalAlignment(SwingConstants.CENTER); overwrite.setToolTipText(jEdit.getProperty("view.status.overwrite-tooltip")); overwrite.addMouseListener(mouseHandler); lineSep = new ToolTipLabel(); lineSep.setHorizontalAlignment(SwingConstants.CENTER); lineSep.setToolTipText(jEdit.getProperty("view.status.linesep-tooltip")); lineSep.addMouseListener(mouseHandler); } //}}} //{{{ propertiesChanged() method public void propertiesChanged() { Color fg = jEdit.getColorProperty("view.status.foreground"); Color bg = jEdit.getColorProperty("view.status.background"); showCaretStatus = jEdit.getBooleanProperty("view.status.show-caret-status"); showEditMode = jEdit.getBooleanProperty("view.status.show-edit-mode"); showFoldMode = jEdit.getBooleanProperty("view.status.show-fold-mode"); showEncoding = jEdit.getBooleanProperty("view.status.show-encoding"); showWrap = jEdit.getBooleanProperty("view.status.show-wrap"); showMultiSelect = jEdit.getBooleanProperty("view.status.show-multi-select"); showRectSelect = jEdit.getBooleanProperty("view.status.show-rect-select"); showOverwrite = jEdit.getBooleanProperty("view.status.show-overwrite"); showLineSeperator = jEdit.getBooleanProperty("view.status.show-line-seperator"); boolean showMemory = jEdit.getBooleanProperty("view.status.show-memory"); boolean showClock = jEdit.getBooleanProperty("view.status.show-clock"); panel.setBackground(bg); panel.setForeground(fg); caretStatus.setBackground(bg); caretStatus.setForeground(fg); message.setBackground(bg); message.setForeground(fg); mode.setBackground(bg); mode.setForeground(fg); wrap.setBackground(bg); wrap.setForeground(fg); multiSelect.setBackground(bg); multiSelect.setForeground(fg); rectSelect.setBackground(bg); rectSelect.setForeground(fg); overwrite.setBackground(bg); overwrite.setForeground(fg); lineSep.setBackground(bg); lineSep.setForeground(fg); // retarded GTK look and feel! Font font = new JLabel().getFont(); //UIManager.getFont("Label.font"); FontMetrics fm = getFontMetrics(font); Dimension dim = null; if (showCaretStatus) { panel.add(BorderLayout.WEST,caretStatus); caretStatus.setFont(font); dim = new Dimension(fm.stringWidth(caretTestStr), fm.getHeight()); caretStatus.setPreferredSize(dim); } else panel.remove(caretStatus); box.removeAll(); if (showEncoding || showEditMode || showFoldMode) box.add(mode); if (showWrap) { dim = new Dimension(Math.max( Math.max(fm.charWidth('-'),fm.charWidth('H')), fm.charWidth('S')) + 1,fm.getHeight()); wrap.setPreferredSize(dim); wrap.setMaximumSize(dim); box.add(wrap); } if (showMultiSelect) { dim = new Dimension( Math.max(fm.charWidth('-'),fm.charWidth('M')) + 1, fm.getHeight()); multiSelect.setPreferredSize(dim); multiSelect.setMaximumSize(dim); box.add(multiSelect); } if (showRectSelect) { dim = new Dimension( Math.max(fm.charWidth('-'),fm.charWidth('R')) + 1, fm.getHeight()); rectSelect.setPreferredSize(dim); rectSelect.setMaximumSize(dim); box.add(rectSelect); } if (showOverwrite) { dim = new Dimension( Math.max(fm.charWidth('-'),fm.charWidth('O')) + 1, fm.getHeight()); overwrite.setPreferredSize(dim); overwrite.setMaximumSize(dim); box.add(overwrite); } if (showLineSeperator) { dim = new Dimension(Math.max( Math.max(fm.charWidth('U'), fm.charWidth('W')), fm.charWidth('M')) + 1, fm.getHeight()); lineSep.setPreferredSize(dim); lineSep.setMaximumSize(dim); box.add(lineSep); } if (showMemory) box.add(new MemoryStatus()); if (showClock) box.add(new Clock()); updateBufferStatus(); updateMiscStatus(); } //}}} //{{{ addNotify() method public void addNotify() { super.addNotify(); VFSManager.getIOThreadPool().addProgressListener(this); } //}}} //{{{ removeNotify() method public void removeNotify() { super.removeNotify(); VFSManager.getIOThreadPool().removeProgressListener(this); } //}}} //{{{ WorkThreadListener implementation //{{{ statusUpdate() method public void statusUpdate(final WorkThreadPool threadPool, int threadIndex) { SwingUtilities.invokeLater(new Runnable() { public void run() { // don't obscure existing message if(message != null && !"".equals(message.getText().trim()) && !currentMessageIsIO) return; int requestCount = threadPool.getRequestCount(); if(requestCount == 0) { setMessageAndClear(jEdit.getProperty( "view.status.io.done")); currentMessageIsIO = true; } else if(requestCount == 1) { setMessage(jEdit.getProperty( "view.status.io-1")); currentMessageIsIO = true; } else { Object[] args = { new Integer(requestCount) }; setMessage(jEdit.getProperty( "view.status.io",args)); currentMessageIsIO = true; } } }); } //}}} //{{{ progressUpdate() method public void progressUpdate(WorkThreadPool threadPool, int threadIndex) { } //}}} //}}} //{{{ setMessageAndClear() method /** * Show a message for a short period of time. * @param message The message * @since jEdit 3.2pre5 */ public void setMessageAndClear(String message) { setMessage(message); tempTimer = new Timer(0,new ActionListener() { public void actionPerformed(ActionEvent evt) { // so if view is closed in the meantime... if(isShowing()) setMessage(null); } }); tempTimer.setInitialDelay(10000); tempTimer.setRepeats(false); tempTimer.start(); } //}}} //{{{ setMessage() method /** * Displays a status message. */ public void setMessage(String message) { if(tempTimer != null) { tempTimer.stop(); tempTimer = null; } setMessageComponent(this.message); if(message == null) { InputHandler inputHandler = view.getInputHandler(); /* if(inputHandler.isRepeatEnabled()) { int repeatCount = inputHandler.getRepeatCount(); this.message.setText(jEdit.getProperty("view.status.repeat", new Object[] { repeatCount == 1 ? "" : String.valueOf(repeatCount) })); } else */ if(view.getMacroRecorder() != null) this.message.setText(jEdit.getProperty("view.status.recording")); else this.message.setText(" "); } else this.message.setText(message); } //}}} //{{{ setMessageComponent() method public void setMessageComponent(Component comp) { currentMessageIsIO = false; if (comp == null || messageComp == comp) { return; } messageComp = comp; panel.add(BorderLayout.CENTER, messageComp); } //}}} //{{{ updateCaretStatus() method public void updateCaretStatus() { //if(!isShowing()) // return; if (showCaretStatus) { Buffer buffer = view.getBuffer(); if(!buffer.isLoaded() || /* can happen when switching buffers sometimes */ buffer != view.getTextArea().getBuffer()) { caretStatus.setText(" "); return; } JEditTextArea textArea = view.getTextArea(); int currLine = textArea.getCaretLine(); // there must be a better way of fixing this... // the problem is that this method can sometimes // be called as a result of a text area scroll // event, in which case the caret position has // not been updated yet. if(currLine >= buffer.getLineCount()) return; // hopefully another caret update will come? int start = textArea.getLineStartOffset(currLine); int dot = textArea.getCaretPosition() - start; // see above if(dot < 0) return; buffer.getText(start,dot,seg); int virtualPosition = MiscUtilities.getVirtualWidth(seg, buffer.getTabSize()); buf.setLength(0); buf.append(Integer.toString(currLine + 1)); buf.append(','); buf.append(Integer.toString(dot + 1)); if (virtualPosition != dot) { buf.append('-'); buf.append(Integer.toString(virtualPosition + 1)); } buf.append(' ');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -