/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* 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 3 of the License, or (at your option)
* 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, see http://www.gnu.org/licenses/
*/
package com.bc.ceres.swing.demo;
import com.bc.ceres.glayer.swing.AdjustableViewScrollPane;
import com.bc.ceres.grender.AdjustableView;
import com.bc.ceres.grender.Viewport;
import com.bc.ceres.grender.support.DefaultViewport;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.UIDefaults;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.tree.DefaultTreeCellRenderer;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Window;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.geom.Rectangle2D;
import java.util.Arrays;
import java.util.Comparator;
public class FocusApp {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
// ok
}
JPanel panel = new MyJPanel();
panel.setPreferredSize(new Dimension(512, 512));
AdjustableViewScrollPane viewScrollPane = new AdjustableViewScrollPane(panel);
JFrame jFrame = new JFrame("x");
jFrame.add(viewScrollPane);
JTree tree1 = new JTree(new Object[]{"Aaaaaaaaaaaaa", "B", "C"});
JTree tree2 = new JTree(new Object[]{"Xxxxxxxxxxxxx", "Y", "Z"});
tree1.setCellRenderer(new MyDefaultTreeCellRenderer());
tree2.setCellRenderer(new MyDefaultTreeCellRenderer());
tree1.addFocusListener(new MyFocusListener());
tree2.addFocusListener(new MyFocusListener());
showFrame(tree1);
showFrame(tree2);
JList list1 = new JList(new Object[]{"Aaaaaaaaaaaaa", "B", "C"});
JList list2 = new JList(new Object[]{"Xxxxxxxxxxxxx", "Y", "Z"});
list1.setCellRenderer(new MyDefaultListCellRenderer());
list2.setCellRenderer(new MyDefaultListCellRenderer());
list1.addFocusListener(new MyFocusListener());
list2.addFocusListener(new MyFocusListener());
showFrame(list1);
showFrame(list2);
//showUIDefaults();
}
private static void showUIDefaults() {
UIDefaults uiDefaults = UIManager.getLookAndFeelDefaults();
Object[] keys = uiDefaults.keySet().toArray();
Arrays.sort(keys, new Comparator<Object>() {
@Override
public int compare(Object o1, Object o2) {
return o1.toString().compareTo(o2.toString());
}
});
Object[][] tableData = new Object[keys.length][2];
for (int i = 0; i < keys.length; i++) {
Object key = keys[i];
Object value = uiDefaults.get(key);
System.out.println(key + " = " + value);
tableData[i][0] = key.toString();
tableData[i][1] = value;
}
JTable table = new JTable(tableData, new String[]{"Key", "Value"});
table.getColumnModel().getColumn(1).setCellRenderer(new MyDefaultTableCellRenderer());
JFrame jFrame = new JFrame("LookAndFeelDefaults");
jFrame.add(new JScrollPane(table));
jFrame.setBounds(100, 100, 400, 400);
jFrame.setVisible(true);
}
static int frameNo = 1;
private static void showFrame(JComponent component) {
final JFrame frame = new JFrame("FocusApp-" + frameNo++);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(component, BorderLayout.CENTER);
frame.setBounds(10, 10, 400, 100);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.setVisible(true);
}
});
}
private static class MyDefaultListCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean hasFocus) {
Window window = SwingUtilities.getWindowAncestor(list);
if (window != null && !window.isFocused()) {
hasFocus = isSelected;
isSelected = false;
}
return super.getListCellRendererComponent(list, value, index, isSelected, hasFocus);
}
}
private static class MyDefaultTreeCellRenderer extends DefaultTreeCellRenderer {
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
Window window = SwingUtilities.getWindowAncestor(tree);
if (window != null && !window.isFocused()) {
hasFocus = isSelected;
isSelected = false;
}
return super.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, hasFocus);
}
}
private static class MyFocusListener implements FocusListener {
@Override
public void focusGained(FocusEvent e) {
e.getComponent().repaint();
}
@Override
public void focusLost(FocusEvent e) {
e.getComponent().repaint();
}
}
private static class MyDefaultTableCellRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
setFont(table.getFont());
setBackground(Color.WHITE);
setText(value != null ? value.toString() : "null");
setBorder(null);
setIcon(null);
if (value instanceof javax.swing.plaf.UIResource) {
if (value instanceof Color) {
Color color = (Color) value;
setBackground(color);
setBorder(new LineBorder(Color.WHITE, 2));
} else if (value instanceof Font) {
Font font = (Font) value;
setBackground(Color.WHITE);
setFont(font);
} else if (value instanceof Icon) {
Icon icon = (Icon) value;
// setIcon(icon);
} else if (value instanceof Border) {
Border border = (Border) value;
//setBackground(Color.GRAY);
//setBorder(new CompoundBorder(new EmptyBorder(2, 2, 2, 2), border));
//setText("");
}
}
return this;
}
}
private static class MyJPanel extends JPanel implements AdjustableView {
private DefaultViewport viewport;
public MyJPanel() {
super(new BorderLayout());
viewport = new DefaultViewport();
}
/**
* @return The maximum visible model bounds in model coordinates.
*/
@Override
public Rectangle2D getMaxVisibleModelBounds() {
return null;
}
/**
* @return The default zoom factor.
*
* @see com.bc.ceres.grender.Viewport#getZoomFactor()
*/
@Override
public double getDefaultZoomFactor() {
return 0;
}
/**
* @return The minimum zoom factor.
*
* @see com.bc.ceres.grender.Viewport#getZoomFactor()
*/
@Override
public double getMinZoomFactor() {
return 0.1;
}
/**
* @return The maximum zoom factor.
*
* @see com.bc.ceres.grender.Viewport#getZoomFactor()
*/
@Override
public double getMaxZoomFactor() {
return 10;
}
/**
* @return The viewport.
*/
@Override
public Viewport getViewport() {
return viewport;
}
}
}