/* * BrowserColorsOptionPane.java - Browser colors options panel * :tabSize=4:indentSize=4:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright (C) 2001, 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.EmptyBorder; import javax.swing.event.*; import javax.swing.table.*; import javax.swing.*; import java.awt.event.*; import java.awt.*; import java.util.*; import java.util.List; import org.gjt.sp.jedit.gui.RolloverButton; import org.gjt.sp.jedit.*; //}}} //{{{ BrowserColorsOptionPane class /** * Browser color editor. * @author Slava Pestov * @version $Id: BrowserColorsOptionPane.java 22665 2013-01-11 16:25:33Z kpouer $ */ public class BrowserColorsOptionPane extends AbstractOptionPane { //{{{ BrowserColorsOptionPane constructor public BrowserColorsOptionPane() { super("browser.colors"); } //}}} //{{{ Protected members //{{{ _init() method protected void _init() { setLayout(new BorderLayout()); colorsModel = new BrowserColorsModel(); colorsTable = new JTable(colorsModel); colorsTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); colorsTable.getTableHeader().setReorderingAllowed(false); colorsTable.addMouseListener(new MouseHandler()); colorsTable.getSelectionModel().addListSelectionListener( new SelectionHandler()); TableColumnModel tcm = colorsTable.getColumnModel(); tcm.getColumn(1).setCellRenderer(new BrowserColorsModel.ColorRenderer()); Dimension d = colorsTable.getPreferredSize(); d.height = Math.min(d.height,200); JScrollPane scroller = new JScrollPane(colorsTable); scroller.setPreferredSize(d); add(BorderLayout.CENTER,scroller); 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("common.add")); add.addActionListener(actionHandler); buttons.add(add); buttons.add(Box.createHorizontalStrut(6)); remove = new RolloverButton(GUIUtilities.loadIcon("Minus.png")); remove.setToolTipText(jEdit.getProperty("common.remove")); remove.addActionListener(actionHandler); buttons.add(remove); buttons.add(Box.createHorizontalStrut(6)); moveUp = new RolloverButton(GUIUtilities.loadIcon("ArrowU.png")); moveUp.setToolTipText(jEdit.getProperty("common.moveUp")); moveUp.addActionListener(actionHandler); buttons.add(moveUp); buttons.add(Box.createHorizontalStrut(6)); moveDown = new RolloverButton(GUIUtilities.loadIcon("ArrowD.png")); moveDown.setToolTipText(jEdit.getProperty("common.moveDown")); moveDown.addActionListener(actionHandler); buttons.add(moveDown); buttons.add(Box.createGlue()); add(BorderLayout.SOUTH,buttons); updateEnabled(); } //}}} //{{{ _save() method protected void _save() { colorsModel.save(); } //}}} //}}} //{{{ Private members private BrowserColorsModel colorsModel; private JTable colorsTable; private JButton add; private JButton remove; private JButton moveUp; private JButton moveDown; //{{{ updateEnabled() method private void updateEnabled() { int selectedRow = colorsTable.getSelectedRow(); remove.setEnabled(selectedRow != -1); moveUp.setEnabled(selectedRow > 0); moveDown.setEnabled(selectedRow != -1 && selectedRow != colorsModel.getRowCount() - 1); } //}}} //{{{ setSelectedRow() method private void setSelectedRow(int row) { colorsTable.getSelectionModel().setSelectionInterval(row,row); colorsTable.scrollRectToVisible(colorsTable.getCellRect(row,0,true)); } //}}} //}}} //{{{ SelectionHandler class class SelectionHandler implements ListSelectionListener { public void valueChanged(ListSelectionEvent evt) { updateEnabled(); } } //}}} //{{{ ActionHandler class class ActionHandler implements ActionListener { public void actionPerformed(ActionEvent evt) { Object source = evt.getSource(); if(source == add) { colorsModel.add(); } else if(source == remove) { int selectedRow = colorsTable.getSelectedRow(); colorsModel.remove(selectedRow); updateEnabled(); } else if(source == moveUp) { int selectedRow = colorsTable.getSelectedRow(); if(selectedRow != 0) { colorsModel.moveUp(selectedRow); setSelectedRow(selectedRow - 1); } updateEnabled(); } else if(source == moveDown) { int selectedRow = colorsTable.getSelectedRow(); if(selectedRow != colorsTable.getRowCount() - 1) { colorsModel.moveDown(selectedRow); setSelectedRow(selectedRow + 1); } updateEnabled(); } } } //}}} //{{{ MouseHandler class class MouseHandler extends MouseAdapter { public void mouseClicked(MouseEvent evt) { Point p = evt.getPoint(); int row = colorsTable.rowAtPoint(p); int column = colorsTable.columnAtPoint(p); if(row == -1 || column != 1) return; Color color = JColorChooser.showDialog( BrowserColorsOptionPane.this, jEdit.getProperty("colorChooser.title"), (Color)colorsModel.getValueAt(row,1)); if(color != null) colorsModel.setValueAt(color,row,1); } } //}}} } //}}} //{{{ BrowserColorsModel class class BrowserColorsModel extends AbstractTableModel { //{{{ BrowserColorsModel constructor BrowserColorsModel() { entries = new ArrayList<Entry>(); int i = 0; String glob; while((glob = jEdit.getProperty("vfs.browser.colors." + i + ".glob")) != null) { entries.add(new Entry(glob, jEdit.getColorProperty( "vfs.browser.colors." + i + ".color", Color.black))); i++; } } //}}} //{{{ add() method void add() { entries.add(new Entry("",UIManager.getColor("Tree.foreground"))); fireTableRowsInserted(entries.size() - 1,entries.size() - 1); } //}}} //{{{ remove() method void remove(int index) { entries.remove(index); fireTableRowsDeleted(entries.size(),entries.size()); } //}}} //{{{ moveUp() method public void moveUp(int index) { Entry entry = entries.get(index); entries.remove(index); entries.add(index - 1,entry); fireTableRowsUpdated(index - 1,index); } //}}} //{{{ moveDown() method public void moveDown(int index) { Entry entry = entries.get(index); entries.remove(index); entries.add(index + 1,entry); fireTableRowsUpdated(index,index + 1); } //}}} //{{{ save() method void save() { int i; for(i = 0; i < entries.size(); i++) { Entry entry = entries.get(i); jEdit.setProperty("vfs.browser.colors." + i + ".glob", entry.glob); jEdit.setColorProperty("vfs.browser.colors." + i + ".color", entry.color); } jEdit.unsetProperty("vfs.browser.colors." + i + ".glob"); jEdit.unsetProperty("vfs.browser.colors." + i + ".color"); } //}}} //{{{ getColumnCount() method public int getColumnCount() { return 2; } //}}} //{{{ getRowCount() method public int getRowCount() { return entries.size(); } //}}} //{{{ getValueAt() method public Object getValueAt(int row, int col) { Entry entry = entries.get(row); switch(col) { case 0: return entry.glob; case 1: return entry.color; default: return null; } } //}}} //{{{ isCellEditable() method public boolean isCellEditable(int row, int col) { return col == 0; } //}}} //{{{ setValueAt() method public void setValueAt(Object value, int row, int col) { Entry entry = entries.get(row); if(col == 0) entry.glob = (String)value; else entry.color = (Color)value; fireTableRowsUpdated(row,row); } //}}} //{{{ getColumnName() method public String getColumnName(int index) { switch(index) { case 0: return jEdit.getProperty("options.browser.colors.glob"); case 1: return jEdit.getProperty("options.browser.colors.color"); default: return null; } } //}}} //{{{ getColumnClass() method public Class getColumnClass(int col) { switch(col) { case 0: return String.class; case 1: return Color.class; default: throw new InternalError(); } } //}}} private List<Entry> entries; //{{{ Entry class private static class Entry { String glob; Color color; Entry(String glob, Color color) { this.glob = glob; this.color = color; } } //}}} //{{{ ColorRenderer class static class ColorRenderer extends JLabel implements TableCellRenderer { //{{{ ColorRenderer constructor ColorRenderer() { setOpaque(true); setBorder(SyntaxHiliteOptionPane.noFocusBorder); } //}}} //{{{ getTableCellRendererComponent() method public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean cellHasFocus, int row, int col) { if (isSelected) { setBackground(table.getSelectionBackground()); setForeground(table.getSelectionForeground()); } else { setBackground(table.getBackground()); setForeground(table.getForeground()); } if (value != null) setBackground((Color)value); setBorder(cellHasFocus ? UIManager.getBorder( "Table.focusCellHighlightBorder") : SyntaxHiliteOptionPane.noFocusBorder); return this; } //}}} } //}}} } //}}}