view src/junotu/TabSimpleSearch.java @ 90:3f068cb07fdf

TabCalendarBoard: Date selection fixes Made 'end' of the range inclusive instead of exclusive, and now setting default spinners to midnight to avoid issues later.
author Fox
date Sun, 19 Feb 2023 02:22:53 +0100
parents e476baaaab2c
children 50af17182cd8
line wrap: on
line source

package junotu;

import java.lang.RuntimeException;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;

import javax.swing.JPanel;
import javax.swing.Box;

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.JScrollBar;
import javax.swing.JPopupMenu;
import javax.swing.JMenuItem;

import junotu.Main;
import junotu.Window.Tab;
import junotu.Window.TabInterface;
import junotu.Card;
import junotu.CardWidget;

public class TabSimpleSearch extends JPanel implements ActionListener, TabInterface {

    public boolean dirty;
    
    private final String KEY_ACTION_COMMIT = "commit";
    
    private JTextField field;
    private JButton create;
    private JButton context;
    private JPopupMenu menu;
    private Box results;
    private JScrollPane scroll;

    private JMenuItem menu_calendar;
    
    public TabSimpleSearch()
    {
	dirty = true;
	
	this.setLayout( new BorderLayout() );

	JPanel top = new JPanel( new BorderLayout() );
	Box buttonBox = Box.createHorizontalBox();
	context = new JButton("=");
	create = new JButton("+");
	field = new JTextField();
	results = Box.createVerticalBox();
	scroll = new JScrollPane( results );

	menu = new JPopupMenu("Menu");
	menu_calendar = menu.add("Calendar board");
	
	context.setFont( new Font( "Monospaced", Font.BOLD, 16 ) );
	create.setFont( new Font( "Monospaced", Font.BOLD, 16 ) );
	field.setFont( new Font( "Monospaced", Font.PLAIN, 16 ) );

	scroll.getVerticalScrollBar().setUnitIncrement(128);

	field.setPreferredSize( new Dimension(32, 32) );
	
	this.add( top, BorderLayout.NORTH );
	top.add( field, BorderLayout.CENTER );
	top.add( buttonBox, BorderLayout.EAST );
	buttonBox.add( context );
	buttonBox.add( create );

	this.add( scroll, BorderLayout.CENTER );

	scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

	create.addActionListener(this);
	context.addActionListener(this);
	menu_calendar.addActionListener(this);

	field.getDocument().addDocumentListener(
						new DocumentListener()
						{
						    @Override
						    public void changedUpdate( DocumentEvent e )
						    {
							updateTitle();
							search();
						    }
						    @Override
						    public void removeUpdate( DocumentEvent e )
						    {
							updateTitle();
							search();
						    }
						    @Override
						    public void insertUpdate( DocumentEvent e )
						    {
							updateTitle();
							search();
						    }
						}
						);

	registerKeyboardAction( this, KEY_ACTION_COMMIT, KeyStroke.getKeyStroke( KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK ), WHEN_IN_FOCUSED_WINDOW );

	field.setToolTipText("Search query.");
	create.setToolTipText("Create new card. Shift-click to open it in a new window.");
	context.setToolTipText("Bring up a menu with more actions.");
	menu_calendar.setToolTipText("Open calendar board.");
	
    }

    private void search() {

	if( !javax.swing.SwingUtilities.isEventDispatchThread() ) {
	    SwingUtilities.invokeLater(
				       new Runnable()
				       {
					   public void run()
					   {
					       search();
					   }
				       }
				       );
	    return;
	}
	
	Card[] cards;

	String text = field.getText();
	if( text.length() > 0 ) {
	    cards = Main.database.searchSimple( field.getText() );
	} else {
	    cards = Main.database.searchTopRecent( 32 );
	}

	System.out.print("Search: Found "+cards.length+" matches.\n");
	
	/* TODO: Reuse widgets. */
	results.removeAll();
	for( Card card : cards ) {
	    CardWidget cardWidget = new CardWidget( card );
	    results.add( cardWidget );
	}
	results.validate();
	results.repaint();

	/* Otherwise scrollup doesn't work. Perhaps because GUI needs to redraw first? */
	SwingUtilities.invokeLater(
				   new Runnable()
				   {
				       public void run()
				       {
					   scrollTop();
				       }
				   }
				   );
    }

    public void refreshSearch()
    {
	search();
	dirty = false;
    }

    private void scrollTop()
    {
	JScrollBar scrollbar = scroll.getVerticalScrollBar();
	scrollbar.setValue(0);
    }
    
    private void updateTitle()
    {
	Window window = (Window)this.getTopLevelAncestor();

	String text = field.getText();

	if( text.length() > 0 ) {
	    window.setTitle( window.preferredTitle( "Search: "+text ) );
	} else {
	    window.setTitle( window.preferredTitle( "Search" ) );
	}
	
    }
    
    private void buttonClickedCreate( boolean newWindow )
    {
	if( newWindow ) {
	    Main.actionCardCreate( Main.windowAdd( Tab.EDIT ) );
	} else {
	    Window window = (Window)this.getTopLevelAncestor();
	    Main.actionCardCreate( window );
	}
    }

    public void actionPerformed( ActionEvent e )
    {
	Object source = e.getSource();
	if( source == this ) {
	    switch( e.getActionCommand() ){

	    case KEY_ACTION_COMMIT: {
		Main.database.databaseCommit();
		break;
	    }

	    }
	} else if( source == create ) {
	    boolean newWindow = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
	    buttonClickedCreate( newWindow );
	} else if( source == context ) {
	    menu.show( (Component)source, 0, 0 );
	} else if( source == menu_calendar ) {
	    Window window = (Window)this.getTopLevelAncestor();
	    window.tabSwitch( Tab.CALENDAR_BOARD );
	}
    }

    public void onSwitchedTo()  {
	if( dirty ) {
	    refreshSearch();
	    dirty = false;
	}
    }
    
}