diff --git a/src/nt/UI/NtUIHelper.java b/src/nt/UI/NtUIHelper.java index 1b1617e..e0c8bf8 100644 --- a/src/nt/UI/NtUIHelper.java +++ b/src/nt/UI/NtUIHelper.java @@ -2,15 +2,13 @@ package nt.UI; import java.awt.Font; import java.awt.FontFormatException; -import java.io.File; import java.io.IOException; -import java.net.URL; public class NtUIHelper { public static Font getSymbolFont() { try { - return Font.createFont(Font.TYPE1_FONT, NtUIHelper.class.getResourceAsStream("/nt/UI/LigatureSymbols-2.11.ttf")); + return Font.createFont(Font.TRUETYPE_FONT, NtUIHelper.class.getResourceAsStream("/nt/UI/LigatureSymbols-2.11.ttf")); } catch (FontFormatException | IOException e) { e.printStackTrace(); } diff --git a/src/nt/UI/control/JSearchBar.java b/src/nt/UI/control/JSearchBar.java index dc2573e..164cb61 100644 --- a/src/nt/UI/control/JSearchBar.java +++ b/src/nt/UI/control/JSearchBar.java @@ -2,22 +2,13 @@ package nt.UI.control; import java.awt.Dimension; import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.TextField; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; import java.io.File; -import java.io.IOException; import javax.swing.DefaultListModel; -import javax.swing.JFrame; import javax.swing.JList; -import javax.swing.JMenuItem; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JWindow; -import javax.swing.SwingUtilities; import nt.UI.control.interfaces.SearchBarFinder; diff --git a/src/nt/UI/control/JSearchBarController.java b/src/nt/UI/control/JSearchBarController.java index 97388d8..94329d7 100644 --- a/src/nt/UI/control/JSearchBarController.java +++ b/src/nt/UI/control/JSearchBarController.java @@ -3,46 +3,33 @@ package nt.UI.control; import java.awt.Font; import java.awt.Window; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.HierarchyBoundsListener; import java.awt.event.HierarchyEvent; -import java.awt.event.InputEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JList; -import javax.swing.JMenuItem; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; -import javax.swing.event.AncestorEvent; -import javax.swing.event.AncestorListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import nt.UI.util.DocumentAdapter; public class JSearchBarController extends KeyAdapter implements DocumentListener, FocusListener, ComponentListener, HierarchyBoundsListener, ListSelectionListener{ private static final String COMPLETION_CANCEL_KEY = "comp.cancel"; - private static final String SELECT_KEY = "comp.select"; private static final KeyStroke COMPLETION_CANCEL_STROKE = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); - private static final KeyStroke SELECT_STROKE = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0); private JSearchBar searchBar; diff --git a/src/nt/UI/control/JSearchTextField.java b/src/nt/UI/control/JSearchTextField.java index 11221c6..159be91 100644 --- a/src/nt/UI/control/JSearchTextField.java +++ b/src/nt/UI/control/JSearchTextField.java @@ -1,25 +1,21 @@ package nt.UI.control; -import javax.swing.JPanel; -import javax.swing.JTextField; -import javax.swing.border.EmptyBorder; -import javax.swing.border.LineBorder; -import javax.swing.text.JTextComponent; - -import nt.UI.NtUIHelper; - import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.event.ActionListener; -import javax.swing.BoxLayout; -import javax.swing.JLabel; -import javax.swing.JButton; -import javax.swing.BorderFactory; import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; +import javax.swing.border.EmptyBorder; +import javax.swing.border.LineBorder; + +import nt.UI.NtUIHelper; public class JSearchTextField extends JPanel{ @@ -35,7 +31,7 @@ public class JSearchTextField extends JPanel{ super(); setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); - Font symbols = NtUIHelper.getSymbolFont(); + Font symbols = NtUIHelper.getSymbolFont().deriveFont(18f); horizontalStrut_1 = Box.createHorizontalStrut(20); add(horizontalStrut_1); diff --git a/src/nt/UI/directory_icn.png b/src/nt/UI/directory_icn.png new file mode 100644 index 0000000..e1437ca Binary files /dev/null and b/src/nt/UI/directory_icn.png differ diff --git a/src/nt/UI/display/ObjListCellRenderer.java b/src/nt/UI/display/ObjListCellRenderer.java new file mode 100644 index 0000000..cf93b79 --- /dev/null +++ b/src/nt/UI/display/ObjListCellRenderer.java @@ -0,0 +1,88 @@ +package nt.UI.display; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.io.File; +import java.net.URL; +import java.util.HashMap; + +import javax.swing.BoxLayout; +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JFileChooser; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.ListCellRenderer; +import javax.swing.filechooser.FileSystemView; + +import javafx.stage.FileChooser; +import nt.UI.util.IconResizer; +import nt.UI.util.Icons; + +public class ObjListCellRenderer implements ListCellRenderer{ + + private HashMap, Icon> mappedIcons = new HashMap<>(); + private Color bgEven = new Color(Integer.decode("#e8e8e8")); + private Color bgOdd = Color.WHITE; + private Color bgSelect = new Color(Integer.decode("#5e87ed")); + + public ObjListCellRenderer() { + putIcon(String.class, Icons.STRING_SYMBOL_URL); + putIcon(Long.class, Icons.NUMBER_SYMBOL_URL); + putIcon(Integer.class, Icons.NUMBER_SYMBOL_URL); + putIcon(Short.class, Icons.NUMBER_SYMBOL_URL); + putIcon(Float.class, Icons.NUMBER_SYMBOL_URL); + putIcon(Double.class, Icons.NUMBER_SYMBOL_URL); + putIcon(Object.class, Icons.OBJECT_SYMBOL_URL); + } + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + if(value == null) { + return null; + } + Icon icon = mappedIcons.get(value.getClass()); + icon = icon==null? new ImageIcon(Icons.FILE_SYMBOL_URL): icon; + + int fHeight = list.getFontMetrics(list.getFont()).getHeight() - 4; + int iWidth = (int)((fHeight / (float)icon.getIconHeight()) * icon.getIconWidth()); + icon = IconResizer.resizeIcon(icon, iWidth, fHeight); + + + JLabel label = new JLabel(value.toString()); + label.setIconTextGap(10); + label.setFont(list.getFont()); + label.setOpaque(true); + label.setIcon(icon); + Color bg = (index % 2)==0?bgEven:bgOdd; + bg = isSelected? bgSelect : bg; + Color fg = isSelected? list.getSelectionForeground() : list.getForeground(); + label.setBackground(bg); + label.setForeground(fg); + return label; + } + + public void putIcon(Class clazz, Icon icon) { + this.mappedIcons.put(clazz, icon); + } + public void putIcon(Class clazz, URL url) { + putIcon(clazz, new ImageIcon(url)); + } + + public Color getBackgroundEven() { + return this.bgEven; + } + public void setBackgroundEven(Color bg) { + this.bgEven = bg; + } + public Color getBackgroundOdd() { + return this.bgOdd; + } + public void setBackgroundOdd(Color bg) { + this.bgOdd = bg; + } +} diff --git a/src/nt/UI/display/ObjTreeCellRenderer.java b/src/nt/UI/display/ObjTreeCellRenderer.java new file mode 100644 index 0000000..a041560 --- /dev/null +++ b/src/nt/UI/display/ObjTreeCellRenderer.java @@ -0,0 +1,69 @@ +package nt.UI.display; + +import java.awt.Color; +import java.awt.Component; +import java.net.URL; +import java.util.HashMap; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JTree; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.TreeCellRenderer; + +import nt.UI.util.IconResizer; +import nt.UI.util.Icons; + +public class ObjTreeCellRenderer implements TreeCellRenderer{ + + private HashMap, Icon> mappedIcons = new HashMap<>(); + private Color bgSelect = new Color(Integer.decode("#5e87ed")); + + public ObjTreeCellRenderer() { + putIcon(String.class, Icons.STRING_SYMBOL_URL); + putIcon(Long.class, Icons.NUMBER_SYMBOL_URL); + putIcon(Integer.class, Icons.NUMBER_SYMBOL_URL); + putIcon(Short.class, Icons.NUMBER_SYMBOL_URL); + putIcon(Float.class, Icons.NUMBER_SYMBOL_URL); + putIcon(Double.class, Icons.NUMBER_SYMBOL_URL); + putIcon(Object.class, Icons.OBJECT_SYMBOL_URL); + } + + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, + boolean leaf, int row, boolean hasFocus) { + if(value == null) { + return null; + } + Class valClass = value.getClass(); + valClass = valClass==DefaultMutableTreeNode.class? ((DefaultMutableTreeNode)value).getUserObject().getClass() : valClass; + Icon icon = leaf?mappedIcons.get(valClass) : expanded? new ImageIcon(Icons.DIRECTORY_SYMBOL_URL) : new ImageIcon(Icons.SUBMODULE_SYMBOL_URL); + icon = icon==null? new ImageIcon(Icons.FILE_SYMBOL_URL): icon; + + int fHeight = tree.getFontMetrics(tree.getFont()).getHeight() - 4; + int iWidth = (int)((fHeight / (float)icon.getIconHeight()) * icon.getIconWidth()); + icon = IconResizer.resizeIcon(icon, iWidth, fHeight); + + JLabel label = new JLabel(value.toString()); + label.setIconTextGap(10); + label.setFont(tree.getFont()); + label.setOpaque(true); + label.setIcon(icon); + Color bg = selected? bgSelect : tree.getBackground(); + Color fg = tree.getForeground(); + label.setBackground(bg); + label.setForeground(fg); + + + return label; + } + + public void putIcon(Class clazz, Icon icon) { + this.mappedIcons.put(clazz, icon); + } + public void putIcon(Class clazz, URL url) { + putIcon(clazz, new ImageIcon(url)); + } + +} diff --git a/src/nt/UI/file_icn.png b/src/nt/UI/file_icn.png new file mode 100644 index 0000000..dd89a05 Binary files /dev/null and b/src/nt/UI/file_icn.png differ diff --git a/src/nt/UI/number_icn.png b/src/nt/UI/number_icn.png new file mode 100644 index 0000000..a42fd57 Binary files /dev/null and b/src/nt/UI/number_icn.png differ diff --git a/src/nt/UI/object_icn.png b/src/nt/UI/object_icn.png new file mode 100644 index 0000000..1e377fc Binary files /dev/null and b/src/nt/UI/object_icn.png differ diff --git a/src/nt/UI/string_icn.png b/src/nt/UI/string_icn.png new file mode 100644 index 0000000..6e47496 Binary files /dev/null and b/src/nt/UI/string_icn.png differ diff --git a/src/nt/UI/submodule_icn.png b/src/nt/UI/submodule_icn.png new file mode 100644 index 0000000..f2a4c17 Binary files /dev/null and b/src/nt/UI/submodule_icn.png differ diff --git a/src/nt/UI/tests/UITestMain.java b/src/nt/UI/tests/UITestMain.java index a429dab..5c777a7 100644 --- a/src/nt/UI/tests/UITestMain.java +++ b/src/nt/UI/tests/UITestMain.java @@ -1,26 +1,28 @@ package nt.UI.tests; -import javax.swing.JFrame; -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; -import javax.swing.plaf.metal.MetalLookAndFeel; - -import nt.UI.NtUIHelper; -import nt.UI.control.JSearchBar; -import nt.UI.control.JSearchTextField; -import nt.UI.control.interfaces.SearchBarFinder; -import javax.swing.BoxLayout; -import java.awt.Component; import java.util.Arrays; import java.util.LinkedList; import java.util.List; -import javax.swing.Box; +import javax.swing.BoxLayout; import javax.swing.JButton; -import javax.swing.JTextField; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JTree; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.plaf.metal.MetalLookAndFeel; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; + +import nt.UI.NtUIHelper; +import nt.UI.control.JSearchBar; +import nt.UI.control.interfaces.SearchBarFinder; +import nt.UI.display.ObjTreeCellRenderer; public class UITestMain extends JFrame{ + private static final long serialVersionUID = 1L; private static final boolean DEBUG_LAF = false; public static void main(String[] args) { @@ -57,17 +59,35 @@ public class UITestMain extends JFrame{ return results.toArray(new String[0]); } })); + + DefaultTreeModel model = new DefaultTreeModel(new DefaultMutableTreeNode("root")); + ((DefaultMutableTreeNode)model.getRoot()).add(new DefaultMutableTreeNode("Hello")); + ((DefaultMutableTreeNode)model.getRoot()).add(new DefaultMutableTreeNode("There")); + ((DefaultMutableTreeNode)model.getRoot()).add(new DefaultMutableTreeNode(new Object())); + ((DefaultMutableTreeNode)model.getRoot()).add(new DefaultMutableTreeNode(1222)); + ((DefaultMutableTreeNode)model.getRoot()).add(new DefaultMutableTreeNode(12222222222L)); + ((DefaultMutableTreeNode)model.getRoot()).add(new DefaultMutableTreeNode(12.232)); + ((DefaultMutableTreeNode)model.getRoot()).add(new DefaultMutableTreeNode(12.4444f)); + ((DefaultMutableTreeNode)model.getRoot()).add(new DefaultMutableTreeNode(new TestFolder())); - Component verticalStrut = Box.createVerticalStrut(300); - getContentPane().add(verticalStrut); + JScrollPane scrollPane = new JScrollPane(); + getContentPane().add(scrollPane); + JTree tree = new JTree(model); + scrollPane.setViewportView(tree); + tree.setCellRenderer(new ObjTreeCellRenderer()); JButton btnBtn = new JButton("btn"); getContentPane().add(btnBtn); - JSearchTextField searchTextField = new JSearchTextField(); - getContentPane().add(searchTextField); - - searchTextField.requestFocus(); } + public class TestFolder { + @Override + public String toString() { + return "Category"; + } + } + + + } diff --git a/src/nt/UI/util/DocumentAdapter.java b/src/nt/UI/util/DocumentAdapter.java deleted file mode 100644 index 662d512..0000000 --- a/src/nt/UI/util/DocumentAdapter.java +++ /dev/null @@ -1,29 +0,0 @@ -package nt.UI.util; - -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; - -public abstract class DocumentAdapter implements DocumentListener{ - - public enum DEType { - INSERT, REMOVE, CHANGE - }; - - @Override - public void insertUpdate(DocumentEvent e) { - documentChanged(e, DEType.INSERT); - } - - @Override - public void removeUpdate(DocumentEvent e) { - documentChanged(e, DEType.REMOVE); - } - - @Override - public void changedUpdate(DocumentEvent e) { - documentChanged(e, DEType.CHANGE); - } - - public abstract void documentChanged(DocumentEvent e, DEType type); - -} diff --git a/src/nt/UI/util/IconResizer.java b/src/nt/UI/util/IconResizer.java new file mode 100644 index 0000000..45e4f18 --- /dev/null +++ b/src/nt/UI/util/IconResizer.java @@ -0,0 +1,31 @@ +package nt.UI.util; + +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.RenderingHints; +import java.awt.image.BufferedImage; + +import javax.swing.Icon; +import javax.swing.ImageIcon; + +public class IconResizer { + + public static Icon resizeIcon(Icon icon, int width, int height) { + Icon newIcon = null; + if(icon != null && ImageIcon.class.isInstance(icon) + && (icon.getIconHeight() != height && icon.getIconWidth() != width)) { + Image img = ((ImageIcon)icon).getImage(); + BufferedImage bImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics2D g2d = bImg.createGraphics(); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g2d.drawImage(img, 0, 0, width, height, null, null); + g2d.dispose(); + newIcon = new ImageIcon(bImg); + }else { + newIcon = icon; + } + return newIcon; + } + +} diff --git a/src/nt/UI/util/Icons.java b/src/nt/UI/util/Icons.java new file mode 100644 index 0000000..15cb153 --- /dev/null +++ b/src/nt/UI/util/Icons.java @@ -0,0 +1,22 @@ +package nt.UI.util; + +import java.net.URL; + +import javax.swing.Icon; +import javax.swing.ImageIcon; + + +public class Icons { + + public static final URL FILE_SYMBOL_URL = Icons.class.getResource("/nt/UI/file_icn.png"); + public static final URL DIRECTORY_SYMBOL_URL = Icons.class.getResource("/nt/UI/directory_icn.png"); + public static final URL STRING_SYMBOL_URL = Icons.class.getResource("/nt/UI/string_icn.png"); + public static final URL NUMBER_SYMBOL_URL = Icons.class.getResource("/nt/UI/number_icn.png"); + public static final URL OBJECT_SYMBOL_URL = Icons.class.getResource("/nt/UI/object_icn.png"); + public static final URL SUBMODULE_SYMBOL_URL = Icons.class.getResource("/nt/UI/submodule_icn.png"); + + public static Icon getIcon(URL icn) { + return new ImageIcon(icn); + } + +}