/*
* StatusBarOptionPane.java - Tool bar options panel
* :tabSize=4:indentSize=4:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 2008-2012 Matthieu Casanova
* Portions Copyright (C) 2000-2002 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.options;
//{{{ Imports
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
import org.gjt.sp.jedit.gui.*;
import org.gjt.sp.util.GenericGUIUtilities;
import org.gjt.sp.jedit.*;
//}}}
/**
* Status bar editor.
* @author Matthieu Casanova
* @version $Id$
*/
public class StatusBarOptionPane extends AbstractOptionPane
{
//{{{ StatusBarOptionPane constructor
public StatusBarOptionPane()
{
super("status");
} //}}}
//{{{ _init() method
@Override
protected void _init()
{
setLayout(new BorderLayout());
//{{{ North
JPanel checkboxPanel = new JPanel(new GridLayout(2,1));
showStatusbar = new JCheckBox(jEdit.getProperty(
"options.status.visible"));
showStatusbar.setSelected(jEdit.getBooleanProperty("view.status.visible"));
checkboxPanel.add(showStatusbar);
showStatusbarPlain = new JCheckBox(jEdit.getProperty(
"options.status.plainview.visible"));
showStatusbarPlain.setSelected(jEdit.getBooleanProperty("view.status.plainview.visible"));
checkboxPanel.add(showStatusbarPlain);
checkboxPanel.add(new JLabel(jEdit.getProperty(
"options.status.caption")));
JPanel previewPanel = new JPanel();
previewStatusBar = new JLabel();
previewPanel.add(previewStatusBar);
JPanel north = new JPanel(new GridLayout(2,1));
north.add(checkboxPanel);
north.add(previewPanel);
add(north, BorderLayout.NORTH);
//}}}
//{{{ Options panel
AbstractOptionPane optionsPanel = new AbstractOptionPane("Status Options");
/* Foreground color */
optionsPanel.addComponent(jEdit.getProperty("options.status.foreground"),
foregroundColor = new ColorWellButton(
jEdit.getColorProperty("view.status.foreground")),
GridBagConstraints.VERTICAL);
/* Background color */
optionsPanel.addComponent(jEdit.getProperty("options.status.background"),
backgroundColor = new ColorWellButton(
jEdit.getColorProperty("view.status.background")),
GridBagConstraints.VERTICAL);
/* Memory foreground color */
optionsPanel.addComponent(jEdit.getProperty("options.status.memory.foreground"),
memForegroundColor = new ColorWellButton(
jEdit.getColorProperty("view.status.memory.foreground")),
GridBagConstraints.VERTICAL);
/* Memory background color */
optionsPanel.addComponent(jEdit.getProperty("options.status.memory.background"),
memBackgroundColor = new ColorWellButton(
jEdit.getColorProperty("view.status.memory.background")),
GridBagConstraints.VERTICAL);
optionsPanel.addSeparator();
optionsPanel.addComponent(new JLabel(jEdit.getProperty("options.status.caret.title", "Caret position display options:")));
/*
Caret position format: lineno,dot-virtual (caretpos/bufferlength)
view.status.show-caret-linenumber -- true shows line number for caret (lineno)
view.status.show-caret-dot -- true shows offset in line for caret (dot)
view.status.show-caret-virtual -- true shows virtual offset in line for caret (virtual)
view.status.show-caret-offset -- true shows caret offset from start of buffer (caretpos)
view.status.show-caret-bufferlength -- true shows length of buffer (bufferlength)
*/
showCaretLineNumber = new JCheckBox(jEdit.getProperty("options.status.caret.linenumber", "Show caret line number"),
jEdit.getBooleanProperty("view.status.show-caret-linenumber", true));
showCaretLineNumber.setName("showCaretLineNumber");
showCaretDot = new JCheckBox(jEdit.getProperty("options.status.caret.dot", "Show caret offset from start of line"),
jEdit.getBooleanProperty("view.status.show-caret-dot", true));
showCaretDot.setName("showCaretDot");
showCaretVirtual = new JCheckBox(jEdit.getProperty("options.status.caret.virtual", "Show caret virtual offset from start of line"),
jEdit.getBooleanProperty("view.status.show-caret-virtual", true));
showCaretVirtual.setName("showCaretVirtual");
showCaretOffset = new JCheckBox(jEdit.getProperty("options.status.caret.offset", "Show caret offset from start of file"),
jEdit.getBooleanProperty("view.status.show-caret-offset", true));
showCaretOffset.setName("showCaretOffset");
showCaretBufferLength = new JCheckBox(jEdit.getProperty("options.status.caret.bufferlength", "Show length of file"),
jEdit.getBooleanProperty("view.status.show-caret-bufferlength", true));
showCaretBufferLength.setName("showCaretBufferLength");
optionsPanel.addComponent(showCaretLineNumber);
optionsPanel.addComponent(showCaretDot);
optionsPanel.addComponent(showCaretVirtual);
optionsPanel.addComponent(showCaretOffset);
optionsPanel.addComponent(showCaretBufferLength);
//}}}
//{{{ widgets panel
String statusbar = jEdit.getProperty("view.status");
StringTokenizer st = new StringTokenizer(statusbar);
listModel = new DefaultListModel<String>();
while (st.hasMoreTokens())
{
String token = st.nextToken();
listModel.addElement(token);
}
list = new JList<String>(listModel);
list.setCellRenderer(new WidgetListCellRenderer());
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.addListSelectionListener(new ListHandler());
JPanel widgetsPanel = new JPanel(new BorderLayout());
widgetsPanel.add(new JScrollPane(list), BorderLayout.CENTER);
//}}}
//{{{ Create buttons
JPanel buttons = new JPanel();
buttons.setBorder(new EmptyBorder(3,0,0,0));
buttons.setLayout(new BoxLayout(buttons,BoxLayout.X_AXIS));
ActionHandler actionHandler = new ActionHandler();
add = new RolloverButton(GUIUtilities.loadIcon("Plus.png"));
add.setToolTipText(jEdit.getProperty("options.status.add"));
add.addActionListener(actionHandler);
buttons.add(add);
buttons.add(Box.createHorizontalStrut(6));
remove = new RolloverButton(GUIUtilities.loadIcon("Minus.png"));
remove.setToolTipText(jEdit.getProperty("options.status.remove"));
remove.addActionListener(actionHandler);
buttons.add(remove);
buttons.add(Box.createHorizontalStrut(6));
moveUp = new RolloverButton(GUIUtilities.loadIcon("ArrowU.png"));
moveUp.setToolTipText(jEdit.getProperty("options.status.moveUp"));
moveUp.addActionListener(actionHandler);
buttons.add(moveUp);
buttons.add(Box.createHorizontalStrut(6));
moveDown = new RolloverButton(GUIUtilities.loadIcon("ArrowD.png"));
moveDown.setToolTipText(jEdit.getProperty("options.status.moveDown"));
moveDown.addActionListener(actionHandler);
buttons.add(moveDown);
buttons.add(Box.createHorizontalStrut(6));
edit = new RolloverButton(GUIUtilities.loadIcon("ButtonProperties.png"));
edit.setToolTipText(jEdit.getProperty("options.status.edit"));
edit.addActionListener(actionHandler);
buttons.add(edit);
buttons.add(Box.createGlue());
//}}}
updateButtons();
widgetsPanel.add(buttons, BorderLayout.SOUTH);
JTabbedPane tabs = new JTabbedPane();
tabs.addTab("Options",optionsPanel);
tabs.add("Widgets", widgetsPanel);
add(tabs, BorderLayout.CENTER);
updatePreview();
} ///}}}
//{{{ _save() method
@Override
protected void _save()
{
jEdit.setColorProperty("view.status.foreground",foregroundColor
.getSelectedColor());
jEdit.setColorProperty("view.status.background",backgroundColor
.getSelectedColor());
jEdit.setColorProperty("view.status.memory.foreground",memForegroundColor
.getSelectedColor());
jEdit.setColorProperty("view.status.memory.background",memBackgroundColor
.getSelectedColor());
jEdit.setBooleanProperty("view.status.visible",showStatusbar
.isSelected());
jEdit.setBooleanProperty("view.status.plainview.visible",showStatusbarPlain
.isSelected());
StringBuilder buf = new StringBuilder();
for(int i = 0; i < listModel.getSize(); i++)
{
if(i != 0)
buf.append(' ');
String widgetName = (String) listModel.elementAt(i);
buf.append(widgetName);
}
jEdit.setProperty("view.status",buf.toString());
jEdit.setBooleanProperty("view.status.show-caret-linenumber", showCaretLineNumber.isSelected());
jEdit.setBooleanProperty("view.status.show-caret-dot", showCaretDot.isSelected());
jEdit.setBooleanProperty("view.status.show-caret-virtual", showCaretVirtual.isSelected());
jEdit.setBooleanProperty("view.status.show-caret-offset", showCaretOffset.isSelected());
jEdit.setBooleanProperty("view.status.show-caret-bufferlength", showCaretBufferLength.isSelected());
} //}}}
//{{{ Private members
//{{{ Instance variables
private ColorWellButton foregroundColor;
private ColorWellButton backgroundColor;
private ColorWellButton memForegroundColor;
private ColorWellButton memBackgroundColor;
private JCheckBox showStatusbar;
private JCheckBox showStatusbarPlain;
private DefaultListModel<String> listModel;
private JLabel previewStatusBar;
private JList<String> list;
private RolloverButton add;
private RolloverButton remove;
private RolloverButton moveUp, moveDown;
private RolloverButton edit;
private JCheckBox showCaretLineNumber;
private JCheckBox showCaretDot;
private JCheckBox showCaretVirtual;
private JCheckBox showCaretOffset;
private JCheckBox showCaretBufferLength;
//}}}
//{{{ updateButtons() method
private void updateButtons()
{
int index = list.getSelectedIndex();
remove.setEnabled(index != -1 && listModel.getSize() != 0);
moveUp.setEnabled(index > 0);
moveDown.setEnabled(index != -1 && index != listModel.getSize() - 1);
edit.setEnabled(index != -1);
} //}}}
//{{{ updateButtons() method
/**
* Update the preview
*/
private void updatePreview()
{
StringBuilder buf = new StringBuilder();
for(int i = 0; i < listModel.getSize(); i++)
{
if (i != 0)
buf.append(' ');
String widgetName = (String) listModel.elementAt(i);
String sample = jEdit.getProperty("statusbar."+widgetName+".sample",widgetName);
buf.append(sample);
}
previewStatusBar.setText(buf.toString());
} //}}}
//}}}
//{{{ Inner classes
//{{{ ActionHandler class
private class ActionHandler implements ActionListener
{
@Override
public void actionPerformed(ActionEvent evt)
{
Object source = evt.getSource();
if(source == add)
{
WidgetSelectionDialog dialog = new WidgetSelectionDialog(StatusBarOptionPane.this);
String value = dialog.getValue();
if (value == null || value.isEmpty())
return;
int index = list.getSelectedIndex();
if(index == -1)
index = listModel.getSize();
else
index++;
listModel.insertElementAt(value, index);
list.setSelectedIndex(index);
list.ensureIndexIsVisible(index);
updatePreview();
}
else if(source == remove)
{
int index = list.getSelectedIndex();
listModel.removeElementAt(index);
if(listModel.getSize() != 0)
{
if(listModel.getSize() == index)
list.setSelectedIndex(index-1);
else
list.setSelectedIndex(index);
}
updateButtons();
updatePreview();
}
else if(source == moveUp)
{
int index = list.getSelectedIndex();
Object selected = list.getSelectedValue();
listModel.removeElementAt(index);
listModel.insertElementAt(selected.toString(), index-1);
list.setSelectedIndex(index-1);
list.ensureIndexIsVisible(index-1);
updatePreview();
}
else if(source == moveDown)
{
int index = list.getSelectedIndex();
Object selected = list.getSelectedValue();
listModel.removeElementAt(index);
listModel.insertElementAt(selected.toString(), index+1);
list.setSelectedIndex(index+1);
list.ensureIndexIsVisible(index+1);
updatePreview();
}
else if(source == edit)
{
Object selectedValue = list.getSelectedValue();
if (selectedValue == null)
return;
WidgetSelectionDialog dialog = new WidgetSelectionDialog(StatusBarOptionPane.this,
String.valueOf(selectedValue));
String value = dialog.getValue();
if (value == null || value.isEmpty())
return;
int index = list.getSelectedIndex();
listModel.remove(index);
listModel.insertElementAt(value, index);
list.setSelectedIndex(index);
list.ensureIndexIsVisible(index);
updatePreview();
}
}
} //}}}
//{{{ ListHandler class
private class ListHandler implements ListSelectionListener
{
@Override
public void valueChanged(ListSelectionEvent evt)
{
updateButtons();
}
} //}}}
private static class WidgetListCellRenderer extends DefaultListCellRenderer
{
@Override
public Component getListCellRendererComponent(JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus)
{
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value == null)
return this;
String widget = String.valueOf(value);
String label = jEdit.getProperty("statusbar."+widget+".label", widget);
setText(label);
return this;
}
}
//}}}
//{{{ WidgetSelectionDialog class
private class WidgetSelectionDialog extends EnhancedDialog
{
private final JButton ok;
private final JButton cancel;
private final JTextField labelField;
private final JLabel labelLabel;
private final JRadioButton labelRadio;
private final JComboBox<String> widgetCombo;
private final JLabel widgetLabel;
private final JRadioButton widgetRadio;
private String value;
//{{{ WidgetSelectionDialog constructors
WidgetSelectionDialog(Component comp, String value)
{
super(GenericGUIUtilities.getParentDialog(comp), jEdit.getProperty("options.status.edit.title"), true);
ButtonGroup buttonGroup = new ButtonGroup();
labelRadio = new JRadioButton(jEdit.getProperty("options.status.edit.labelRadioButton"));
widgetRadio = new JRadioButton(jEdit.getProperty("options.status.edit.widgetRadioButton"));
buttonGroup.add(labelRadio);
buttonGroup.add(widgetRadio);
labelLabel = new JLabel(jEdit.getProperty("options.status.edit.labelLabel"));
labelField = new JTextField();
widgetLabel = new JLabel(jEdit.getProperty("options.status.edit.widgetLabel"));
String[] allWidgets = ServiceManager.getServiceNames("org.gjt.sp.jedit.gui.statusbar.StatusWidgetFactory");
Arrays.sort(allWidgets);
boolean valueIsWidget = value != null && Arrays.binarySearch(allWidgets, value) >= 0;
Vector<String> widgets = new Vector<String>(allWidgets.length);
Set<String> usedWidget = new HashSet<String>(listModel.getSize());
for (int i = 0; i < listModel.getSize(); i++)
{
usedWidget.add((String) listModel.get(i));
}
for (String widget : allWidgets)
{
if (!usedWidget.contains(widget) || (valueIsWidget && widget.equals(value)))
widgets.add(widget);
}
widgetCombo = new JComboBox<String>(widgets);
widgetCombo.setRenderer(new WidgetListCellRenderer());
ActionHandler actionHandler = new ActionHandler();
labelRadio.addActionListener(actionHandler);
widgetRadio.addActionListener(actionHandler);
//{{{ south panel
JPanel southPanel = new JPanel();
southPanel.setLayout(new BoxLayout(southPanel,BoxLayout.X_AXIS));
southPanel.setBorder(new EmptyBorder(12,0,0,0));
southPanel.add(Box.createGlue());
ok = new JButton(jEdit.getProperty("common.ok"));
ok.addActionListener(actionHandler);
getRootPane().setDefaultButton(ok);
southPanel.add(ok);
southPanel.add(Box.createHorizontalStrut(6));
cancel = new JButton(jEdit.getProperty("common.cancel"));
cancel.addActionListener(actionHandler);
southPanel.add(cancel);
southPanel.add(Box.createGlue());
//}}}
labelField.setEnabled(false);
widgetRadio.setSelected(true);
JPanel content = new JPanel(new BorderLayout());
content.setBorder(new EmptyBorder(12,12,12,12));
setContentPane(content);
JPanel center = new JPanel();
center.setLayout(new BoxLayout(center,BoxLayout.Y_AXIS));
center.add(labelRadio);
JPanel p = new JPanel(new BorderLayout());
p.add(labelLabel, BorderLayout.WEST);
p.add(labelField);
center.add(p);
center.add(widgetRadio);
p = new JPanel(new BorderLayout());
p.add(widgetLabel, BorderLayout.WEST);
p.add(widgetCombo);
if (widgets.isEmpty())
{
labelRadio.setSelected(true);
widgetRadio.setEnabled(false);
widgetLabel.setEnabled(false);
widgetCombo.setEnabled(false);
}
center.add(p);
if (valueIsWidget)
{
widgetRadio.setSelected(true);
widgetCombo.setSelectedItem(value);
}
else
{
labelRadio.setSelected(true);
labelField.setText(value);
labelField.setEnabled(true);
widgetCombo.setEnabled(false);
}
getContentPane().add(center, BorderLayout.CENTER);
getContentPane().add(southPanel, BorderLayout.SOUTH);
pack();
setLocationRelativeTo(GenericGUIUtilities.getParentDialog(comp));
setVisible(true);
}
WidgetSelectionDialog(Component comp)
{
this(comp, null);
} //}}}
//{{{ ok() method
@Override
public void ok()
{
if (widgetRadio.isSelected())
{
value = (String) widgetCombo.getSelectedItem();
}
else
{
value = labelField.getText().trim();
}
dispose();
} //}}}
//{{{ cancel() method
@Override
public void cancel()
{
value = null;
dispose();
} //}}}
//{{{ getValue() method
public String getValue()
{
return value;
} //}}}
//{{{ ActionHandler class
private class ActionHandler implements ActionListener
{
//{{{ actionPerformed() method
@Override
public void actionPerformed(ActionEvent evt)
{
Object source = evt.getSource();
if (source == ok)
{
ok();
}
else if (source == cancel)
{
cancel();
}
else if (source == labelRadio)
{
labelField.setEnabled(true);
widgetCombo.setEnabled(false);
validate();
}
else if (source == widgetRadio)
{
labelField.setEnabled(false);
widgetCombo.setEnabled(true);
validate();
}
} //}}}
} //}}}
} //}}}
}