/*
* MarkerViewer.java - Dockable view of markers in the current buffer
* :tabSize=4:indentSize=4:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 2004 Nicholas O'Leary
*
* 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;
//{{{ Imports
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import org.gjt.sp.jedit.*;
import org.gjt.sp.jedit.EditBus.EBHandler;
import org.gjt.sp.jedit.textarea.JEditTextArea;
import org.gjt.sp.util.GenericGUIUtilities;
import org.gjt.sp.jedit.msg.BufferUpdate;
import org.gjt.sp.jedit.msg.EditPaneUpdate;
import org.gjt.sp.jedit.msg.ViewUpdate;
//}}}
/** Dockable view of markers in the current buffer */
public class MarkerViewer extends JPanel implements ActionListener
{
//{{{ MarkerViewer constructor
public MarkerViewer(View view)
{
super(new BorderLayout());
this.view = view;
Box toolBar = new Box(BoxLayout.X_AXIS);
toolBar.add(new JLabel(GenericGUIUtilities.prettifyMenuLabel(
jEdit.getProperty("markers.label"))));
toolBar.add(Box.createGlue());
RolloverButton addMarker = new RolloverButton(
GUIUtilities.loadIcon("Plus.png"));
addMarker.setToolTipText(GenericGUIUtilities.prettifyMenuLabel(
jEdit.getProperty("add-marker.label")));
addMarker.addActionListener(this);
addMarker.setActionCommand("add-marker");
toolBar.add(addMarker);
previous = new RolloverButton(GUIUtilities.loadIcon("ArrowL.png"));
previous.setToolTipText(GenericGUIUtilities.prettifyMenuLabel(
jEdit.getProperty("prev-marker.label")));
previous.addActionListener(this);
previous.setActionCommand("prev-marker");
toolBar.add(previous);
next = new RolloverButton(GUIUtilities.loadIcon("ArrowR.png"));
next.setToolTipText(GenericGUIUtilities.prettifyMenuLabel(
jEdit.getProperty("next-marker.label")));
next.addActionListener(this);
next.setActionCommand("next-marker");
toolBar.add(next);
clear = new RolloverButton(GUIUtilities.loadIcon("Clear.png"));
clear.setToolTipText(GenericGUIUtilities.prettifyMenuLabel(
jEdit.getProperty("remove-all-markers.label")));
clear.addActionListener(this);
clear.setActionCommand("clear");
toolBar.add(clear);
add(BorderLayout.NORTH, toolBar);
markerList = new JList<Marker>();
markerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
markerList.setCellRenderer(new Renderer());
markerList.addMouseListener(new MouseHandler());
markerList.addKeyListener(new KeyHandler());
markerListScroller = new JScrollPane(markerList);
add(BorderLayout.CENTER, markerListScroller);
refreshList();
} //}}}
//{{{ requestDefaultFocus() method
@SuppressWarnings("deprecation")
public boolean requestDefaultFocus()
{
markerList.requestFocus();
return true;
} //}}}
//{{{ actionPerformed() method
public void actionPerformed(ActionEvent evt)
{
String cmd = evt.getActionCommand();
if (cmd.equals("clear"))
view.getBuffer().removeAllMarkers();
else if (cmd.equals("add-marker"))
view.getEditPane().addMarker();
else if (cmd.equals("next-marker"))
{
view.getEditPane().goToNextMarker(false);
updateSelection();
}
else if (cmd.equals("prev-marker"))
{
view.getEditPane().goToPrevMarker(false);
updateSelection();
}
} //}}}
//{{{ handleEditPaneUpdate() method
@EBHandler
public void handleEditPaneUpdate(EditPaneUpdate epu)
{
if (epu.getEditPane().getView().equals(view) &&
epu.getWhat().equals(EditPaneUpdate.BUFFER_CHANGED))
{
refreshList();
}
} //}}}
//{{{ handleViewUpdate() method
@EBHandler
public void handleViewUpdate(ViewUpdate vu)
{
if (vu.getView().equals(view) &&
vu.getWhat().equals(ViewUpdate.EDIT_PANE_CHANGED))
{
refreshList();
}
} //}}}
//{{{ handleBufferUpdate() method
@EBHandler
public void handleBufferUpdate(BufferUpdate bu)
{
if (view.getBuffer().equals(bu.getBuffer()) &&
(bu.getWhat().equals(BufferUpdate.MARKERS_CHANGED) || bu.getWhat().equals(BufferUpdate.LOADED)))
{
refreshList();
}
}//}}}
//{{{ addNotify() method
public void addNotify()
{
super.addNotify();
EditBus.addToBus(this);
} //}}}
//{{{ removeNotify() method
public void removeNotify()
{
super.removeNotify();
EditBus.removeFromBus(this);
} //}}}
//{{{ Private members
//{{{ Instance variables
private JList<Marker> markerList;
private JScrollPane markerListScroller;
private View view;
private RolloverButton previous;
private RolloverButton next;
private RolloverButton clear;
//}}}
//{{{ refreshList() method
private void refreshList()
{
java.util.Vector<Marker> markers = view.getBuffer().getMarkers();
if (markers.size() > 0)
{
markerListScroller.setViewportView(markerList);
markerList.setListData(markers);
markerList.setEnabled(true);
next.setEnabled(true);
previous.setEnabled(true);
clear.setEnabled(true);
}
else
{
markerListScroller.setViewportView(new JLabel(jEdit.getProperty("no-markers.label")));
next.setEnabled(false);
previous.setEnabled(false);
clear.setEnabled(false);
}
} //}}}
//{{{ goToSelectedMarker() method
private void goToSelectedMarker()
{
Object value = markerList.getSelectedValue();
if(!(value instanceof Marker))
return;
Marker mark = (Marker)value;
view.getTextArea().setCaretPosition(mark.getPosition());
view.toFront();
view.requestFocus();
view.getTextArea().requestFocus();
} //}}}
//{{{ updateSelection() method
private void updateSelection()
{
ListModel model = markerList.getModel();
int currentLine = view.getTextArea().getCaretLine();
Buffer buffer = view.getBuffer();
for (int i = 0; i < model.getSize(); i++)
{
Object o = model.getElementAt(i);
if (o instanceof Marker)
{
Marker mark = (Marker)model.getElementAt(i);
if (buffer.getLineOfOffset(mark.getPosition()) == currentLine)
{
markerList.setSelectedIndex(i);
break;
}
}
}
} //}}}
//}}}
//{{{ Inner classes
//{{{ Renderer Class
class Renderer extends DefaultListCellRenderer
{
public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus)
{
super.getListCellRendererComponent(list,value,
index,isSelected,cellHasFocus);
if(value instanceof Marker)
{
Marker mark = (Marker)value;
JEditTextArea textArea = view.getTextArea();
int pos = textArea.getLineOfOffset(mark.getPosition());
String txt = view.getTextArea().getLineText(pos);
if (txt.equals(""))
txt = jEdit.getProperty("markers.blank-line");
char shortcut_char = mark.getShortcut();
String shortcut = "";
if (shortcut_char > 0)
shortcut = "["+shortcut_char+"]";
setText((pos+1)+" "+shortcut+": "+txt);
}
return this;
}
} //}}}
//{{{ MouseHandler Class
class MouseHandler extends MouseAdapter
{
public void mousePressed(MouseEvent evt)
{
if(evt.isConsumed())
return;
int index = markerList.locationToIndex(evt.getPoint());
markerList.setSelectedIndex(index);
goToSelectedMarker();
}
} //}}}
//{{{ KeyHandler Class
class KeyHandler extends KeyAdapter
{
@Override
public void keyPressed(KeyEvent evt)
{
if(evt.getKeyCode() == KeyEvent.VK_SPACE
|| evt.getKeyCode() == KeyEvent.VK_ENTER)
{
evt.consume();
goToSelectedMarker();
}
}
} //}}}
//}}}
}