From a3205a1cceae21bdd812b68dde59d425a5564e33 Mon Sep 17 00:00:00 2001 From: Niclas Thobaben Date: Wed, 20 Jun 2018 17:09:48 +0200 Subject: [PATCH] implemented JSearchBar --- src/nt/UI/LigatureSymbols-2.11.ttf | Bin 0 -> 83340 bytes src/nt/UI/control/JSearchBar.java | 113 +++++++++- src/nt/UI/control/JSearchBarController.java | 202 ++++++++++++++++++ src/nt/UI/control/JSearchTextField.java | 105 +++++++++ .../control/interfaces/SearchBarFinder.java | 7 + src/nt/UI/tests/UITestMain.java | 71 ++++++ src/nt/UI/util/DocumentAdapter.java | 29 +++ 7 files changed, 526 insertions(+), 1 deletion(-) create mode 100644 src/nt/UI/LigatureSymbols-2.11.ttf create mode 100644 src/nt/UI/control/JSearchBarController.java create mode 100644 src/nt/UI/control/JSearchTextField.java create mode 100644 src/nt/UI/control/interfaces/SearchBarFinder.java create mode 100644 src/nt/UI/tests/UITestMain.java create mode 100644 src/nt/UI/util/DocumentAdapter.java diff --git a/src/nt/UI/LigatureSymbols-2.11.ttf b/src/nt/UI/LigatureSymbols-2.11.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0338d4cb96778b7fa2636b8bd55ec1753c9db200 GIT binary patch literal 83340 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 1) { + this.dropDown.putItems(tokens); + if(!this.dropDown.isVisible()) { + this.dropDown.setVisible(true); + } + }else { + if(this.dropDown.isVisible()) { + this.dropDown.setVisible(false); + } + } + } + protected void startCompletion() { + this.completionActive = true; + this.dropDown.setVisible(true); + } + protected void stopCompletion() { + this.completionActive = false; + this.dropDown.setVisible(false); + } + + protected class SearchDropDown extends JWindow{ + + private static final long serialVersionUID = 1L; + private static final int ROW_COUNT = 5; + + protected DefaultListModel data = new DefaultListModel<>(); + protected JList list = new JList<>(data); + protected JScrollPane scrollPane = new JScrollPane(list); + + public SearchDropDown() { + this.list.setVisibleRowCount(ROW_COUNT); + setAlwaysOnTop(true); + add(this.scrollPane); + } + + public void putItems(String[] tokens) { + this.data.clear(); + for(String token : tokens) { + this.data.addElement(token); + } + positionMenu(); + } + + public void positionMenu() { + JSearchBar parent = JSearchBar.this; + if(parent.isShowing()) { + if (this.list.getFixedCellHeight() < 0) { + this.list.setFixedCellHeight(this.getFontMetrics(this.getFont()).getHeight() + 2); + } + int x, y, width, height; + Dimension dim = parent.getSize(); + x = parent.getLocationOnScreen().x; + y = parent.getLocationOnScreen().y + dim.height; + width = dim.width; + height = this.list.getFixedCellHeight() * ROW_COUNT; + setSize(new Dimension(width, height)); + setLocation(x, y); + } + } + } + } diff --git a/src/nt/UI/control/JSearchBarController.java b/src/nt/UI/control/JSearchBarController.java new file mode 100644 index 0000000..413e6a0 --- /dev/null +++ b/src/nt/UI/control/JSearchBarController.java @@ -0,0 +1,202 @@ +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; + + protected JSearchBarController(JSearchBar searchBar) { + this.searchBar = searchBar; + + searchBar.txtSearch.addFocusListener(this); + searchBar.txtSearch.addKeyListener(this); + searchBar.txtSearch.getDocument().addDocumentListener(this); + InputMap inputMap = searchBar.txtSearch.getInputMap(); + inputMap.put(COMPLETION_CANCEL_STROKE, COMPLETION_CANCEL_KEY); + + ActionMap actionMap = searchBar.txtSearch.getActionMap(); + actionMap.put(COMPLETION_CANCEL_KEY, new AbstractAction() { + private static final long serialVersionUID = 1L; + @Override + public void actionPerformed(ActionEvent e) { + setDefaultState(); + } + }); + + searchBar.txtSearch.addComponentListener(this); + searchBar.txtSearch.addHierarchyBoundsListener(this); + searchBar.addActionListener(e -> setDefaultState()); + + searchBar.dropDown.list.addListSelectionListener(this); + + } + + protected void setDefaultState() { + JTextField txt = this.searchBar.txtSearch; + this.searchBar.showCancelButton(false); + txt.setText("search"); + txt.setFont(txt.getFont().deriveFont(Font.ITALIC)); + this.searchBar.repaint(); + this.searchBar.stopCompletion(); + Window win = SwingUtilities.getWindowAncestor(searchBar); + if(win != null) { + win.requestFocus(); + } + } + protected void setEnteredState() { + JTextField txt = this.searchBar.txtSearch; + this.searchBar.showCancelButton(true); + txt.setFont(txt.getFont().deriveFont(Font.PLAIN)); + } + + @Override + public void focusGained(FocusEvent e) { + JTextField bar = this.searchBar.txtSearch; + if(bar.getText().toLowerCase().equals("search")) { + bar.setText(""); + } + setEnteredState(); + } + + @Override + public void focusLost(FocusEvent e) { + JTextField bar = this.searchBar.txtSearch; + if(bar.getText().isEmpty() || bar.getText().toLowerCase().equals("search")) { + setDefaultState(); + }else { + setEnteredState(); + } + this.searchBar.stopCompletion(); + } + + @Override + public void keyPressed(KeyEvent e) { + if(this.searchBar.completionActive) { + JList list = searchBar.dropDown.list; + int index = list.getSelectedIndex(); + if(e.getKeyCode() == KeyEvent.VK_DOWN) { + index = index >= list.getModel().getSize()? list.getModel().getSize()-1:++index; + }else if(e.getKeyCode() == KeyEvent.VK_UP) { + index = index <= -1? -1 : --index; + } + list.setSelectedIndex(index); + list.ensureIndexIsVisible(index); + } + } + + @Override + public void componentResized(ComponentEvent e) { + if(this.searchBar.completionActive) { + this.searchBar.dropDown.positionMenu(); + } + } + + @Override + public void componentMoved(ComponentEvent e) { + if(this.searchBar.completionActive) { + this.searchBar.dropDown.positionMenu(); + } + } + + @Override + public void componentShown(ComponentEvent e) { + + } + + @Override + public void componentHidden(ComponentEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void ancestorMoved(HierarchyEvent e) { + if(this.searchBar.completionActive) { + this.searchBar.stopCompletion(); + } + } + + @Override + public void ancestorResized(HierarchyEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void valueChanged(ListSelectionEvent e) { + String val = searchBar.dropDown.list.getSelectedValue(); + if(val != null) { + JTextField field = searchBar.txtSearch; + field.setText(val); + field.setCaretPosition(field.getText().length()); + } + + } + + @Override + public void insertUpdate(DocumentEvent e) { + if(searchBar.txtSearch.getDocument().getLength() > 0) { + if(!searchBar.completionActive) { + searchBar.startCompletion(); + } + searchBar.doCompletion(); + }else { + searchBar.stopCompletion(); + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + searchBar.doCompletion(); + + } + + @Override + public void changedUpdate(DocumentEvent e) { + // TODO Auto-generated method stub + + } + + +} diff --git a/src/nt/UI/control/JSearchTextField.java b/src/nt/UI/control/JSearchTextField.java new file mode 100644 index 0000000..47ec2e8 --- /dev/null +++ b/src/nt/UI/control/JSearchTextField.java @@ -0,0 +1,105 @@ +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 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.SwingConstants; +import javax.swing.SwingUtilities; + +public class JSearchTextField extends JPanel{ + + + private static final long serialVersionUID = 1L; + private JLabel lblLens; + protected JTextField txtSearch; + protected JButton btnCancel; + private Component horizontalStrut; + private Component horizontalStrut_1; + + public JSearchTextField() { + super(); + setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); + + Font symbols = new Font("LigatureSymbols", Font.PLAIN, 18); + + horizontalStrut_1 = Box.createHorizontalStrut(20); + add(horizontalStrut_1); + lblLens = new JLabel("\uE116"); + lblLens.setFont(symbols); + add(lblLens); + + horizontalStrut = Box.createHorizontalStrut(10); + add(horizontalStrut); + + txtSearch = new JTextField() { + private static final long serialVersionUID = 1L; + + @Override + public void setText(String txt) { + + } + + }; + txtSearch.setText("search"); + txtSearch.setBorder(new EmptyBorder(0, 0, 0, 0)); + txtSearch.setBackground(getBackground()); + add(txtSearch); + txtSearch.setColumns(10); + + btnCancel = new JButton("\uE10f"); + btnCancel.setHorizontalAlignment(SwingConstants.RIGHT); + btnCancel.setBorderPainted(false); + btnCancel.setFont(symbols); + btnCancel.setOpaque(false); + btnCancel.setVisible(false); + add(btnCancel); + + setBorder(new LineBorder(Color.LIGHT_GRAY)); + setPreferredSize(btnCancel.getPreferredSize()); + setMinimumSize(btnCancel.getMinimumSize()); + } + + public void addActionListener(ActionListener l) { + this.btnCancel.addActionListener(l); + } + public void removeActionListener(ActionListener l) { + this.btnCancel.removeActionListener(l); + } + public void showCancelButton(boolean b) { + this.btnCancel.setVisible(b); + System.out.println(b); + revalidate(); + + } + + @Override + public void setBackground(Color bg) { + super.setBackground(bg); + for(Component c : getComponents()) { + c.setBackground(bg); + } + } + + @Override + public void setForeground(Color fg) { + super.setForeground(fg); + for(Component c : getComponents()) { + c.setForeground(fg); + } + } + + +} diff --git a/src/nt/UI/control/interfaces/SearchBarFinder.java b/src/nt/UI/control/interfaces/SearchBarFinder.java new file mode 100644 index 0000000..0189abd --- /dev/null +++ b/src/nt/UI/control/interfaces/SearchBarFinder.java @@ -0,0 +1,7 @@ +package nt.UI.control.interfaces; + +public interface SearchBarFinder { + + public String[] getSearchResults(String token); + +} diff --git a/src/nt/UI/tests/UITestMain.java b/src/nt/UI/tests/UITestMain.java new file mode 100644 index 0000000..690a0eb --- /dev/null +++ b/src/nt/UI/tests/UITestMain.java @@ -0,0 +1,71 @@ +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.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.JButton; +import javax.swing.JTextField; + +public class UITestMain extends JFrame{ + + private static final boolean DEBUG_LAF = false; + + public static void main(String[] args) { + if(DEBUG_LAF) { + try { + UIManager.setLookAndFeel(new MetalLookAndFeel()); + } catch (UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + } + + + UITestMain frame = new UITestMain(); + frame.setVisible(true); + } + + public UITestMain() { + setSize(400,400); + setDefaultCloseOperation(EXIT_ON_CLOSE); + getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); + getContentPane().add(new JSearchBar(new SearchBarFinder() { + + @Override + public String[] getSearchResults(String token) { + List list = Arrays.asList("a aa aaa aaaa b bb bbb bbbb bbbbb ab aabb bbaa baba".split(" ")); + LinkedList results = new LinkedList<>(); + for(String tok : list) { + if(tok.startsWith(token)) { + System.out.println(tok + " " + token); + results.add(tok); + } + } + return results.toArray(new String[0]); + } + })); + + Component verticalStrut = Box.createVerticalStrut(300); + getContentPane().add(verticalStrut); + + JButton btnBtn = new JButton("btn"); + getContentPane().add(btnBtn); + + JSearchTextField searchTextField = new JSearchTextField(); + getContentPane().add(searchTextField); + + searchTextField.requestFocus(); + } + +} diff --git a/src/nt/UI/util/DocumentAdapter.java b/src/nt/UI/util/DocumentAdapter.java new file mode 100644 index 0000000..662d512 --- /dev/null +++ b/src/nt/UI/util/DocumentAdapter.java @@ -0,0 +1,29 @@ +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); + +}