/* * MarkersProvider.java - Markers menu * :tabSize=4:indentSize=4:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2001, 2003 Slava Pestov * * 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.menu; //{{{ Imports import javax.swing.*; import java.awt.event.*; import java.awt.*; import java.util.List; import org.gjt.sp.jedit.*; //}}} public class MarkersProvider implements DynamicMenuProvider { //{{{ updateEveryTime() method public boolean updateEveryTime() { return true; } //}}} //{{{ update() method public void update(JMenu menu) { final View view = GUIUtilities.getView(menu); Buffer buffer = view.getBuffer(); List<Marker> markers = buffer.getMarkers(); if(markers.isEmpty()) { JMenuItem mi = new JMenuItem(jEdit.getProperty( "no-markers.label")); mi.setEnabled(false); menu.add(mi); return; } int maxItems = jEdit.getIntegerProperty("menu.spillover",20); JMenu current = menu; for(int i = 0; i < markers.size(); i++) { final Marker marker = markers.get(i); int lineNo = buffer.getLineOfOffset(marker.getPosition()); if(current.getItemCount() >= maxItems && i != markers.size() - 1) { //current.addSeparator(); JMenu newCurrent = new JMenu( jEdit.getProperty( "common.more")); current.add(newCurrent); current = newCurrent; } JMenuItem mi = new MarkersMenuItem(buffer, lineNo,marker.getShortcut()); mi.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { view.getTextArea().setCaretPosition( marker.getPosition()); } }); current.add(mi); } } //}}} //{{{ MarkersMenuItem class static class MarkersMenuItem extends JMenuItem { //{{{ MarkersMenuItem constructor MarkersMenuItem(Buffer buffer, int lineNo, char shortcut) { String text = buffer.getLineText(lineNo).trim(); if(text.length() == 0) text = jEdit.getProperty("markers.blank-line"); setText((lineNo + 1) + ": " + text); shortcutProp = "goto-marker.shortcut"; MarkersMenuItem.this.shortcut = shortcut; } //}}} //{{{ getPreferredSize() method public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); String shortcut = getShortcut(); if(shortcut != null) { d.width += (getFontMetrics(acceleratorFont) .stringWidth(shortcut) + 15); } return d; } //}}} //{{{ paint() method public void paint(Graphics g) { super.paint(g); String shortcut = getShortcut(); if(shortcut != null) { g.setFont(acceleratorFont); g.setColor(getModel().isArmed() ? acceleratorSelectionForeground : acceleratorForeground); FontMetrics fm = g.getFontMetrics(); Insets insets = getInsets(); g.drawString(shortcut,getWidth() - (fm.stringWidth( shortcut) + insets.right + insets.left + 5), getFont().getSize() + (insets.top - 1) /* XXX magic number */); } } //}}} //{{{ Private members private String shortcutProp; private char shortcut; private static Font acceleratorFont; private static Color acceleratorForeground; private static Color acceleratorSelectionForeground; //{{{ getShortcut() method private String getShortcut() { if(shortcut == '\0') return null; else { String shortcutPrefix = jEdit.getProperty(shortcutProp); if(shortcutPrefix == null) return null; else { return shortcutPrefix + ' ' + shortcut; } } } //}}} //{{{ Class initializer static { acceleratorFont = UIManager.getFont("MenuItem.acceleratorFont"); acceleratorFont = new Font("Monospaced", acceleratorFont.getStyle(), acceleratorFont.getSize()); acceleratorForeground = UIManager .getColor("MenuItem.acceleratorForeground"); acceleratorSelectionForeground = UIManager .getColor("MenuItem.acceleratorSelectionForeground"); } //}}} //}}} } //}}} }