/**
 *  InfoPage
 *  Copyright 2010 by Michael Peter Christen; mc@yacy.net, Frankfurt a. M., Germany
 *  First released 05.08.2010 at https://yacy.net
 *  
 *  $LastChangedDate$
 *  $LastChangedRevision$
 *  $LastChangedBy$
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *  
 *  This library 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
 *  Lesser General Public License for more details.
 *  
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program in the file lgpl21.txt
 *  If not, see <http://www.gnu.org/licenses/>.
 */

package net.yacy.gui;

import java.awt.Color;
import java.awt.Font;
import java.awt.LayoutManager;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;

import net.yacy.gui.framework.Browser;
import net.yacy.gui.framework.Layout;
import net.yacy.gui.framework.Switchboard;
import net.yacy.kelondro.util.OS;

public class InfoPage implements Layout {

    private static final String COMMIT_ACTION = "commit";
    
    private static final int width = 500;
    private static final int height = 600;
    private static final int textHeight = 18;
    
    final String host;
    final int port;
    JTextComponent SearchBox;
    
    public InfoPage(String host, int port) {
        this.host = host; this.port = port;
    }
    

    private class CommitAction extends AbstractAction {
        private static final long serialVersionUID = 3630229455629476865L;
        @Override
        public void actionPerformed(ActionEvent ev) {
            //int pos = SearchBox.getSelectionEnd();
            Browser.openBrowser("http://" + host + ":" + port + "/yacysearch.html?display=0&verify=true&contentdom=text&nav=all&maximumRecords=10&startRecord=0&resource=global&urlmaskfilter=.*&prefermaskfilter=&indexof=off&meanCount=5&query=" + SearchBox.getText().replace(' ', '+'));
            SearchBox.setText("");
            //SearchBox..insert(" ", pos);
            //SearchBox.setCaretPosition(pos + 1);
        }
    }
    
    @Override
    public LayoutManager getPage(JComponent context, DocumentListener listener) {
        GroupLayout page = new GroupLayout(context);
        
        //String[] fnames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
        //for (String fname: fnames) System.out.println("font: " + fname);
        
        Font font = Font.decode("SansSerif");
        if (font != null) font = font.deriveFont((float) 14.0); 
        //if (font != null) font = font.deriveFont(Font.BOLD);

        SearchBox = new JTextField();
        SearchBox.setText("search...");
        SearchBox.setCaretPosition(0);
        SearchBox.moveCaretPosition(9);
        SearchBox.setFont(font.deriveFont((float) 14.0).deriveFont(Font.BOLD));
        SearchBox.setSize(width + 4, textHeight);
        SearchBox.setBorder(BorderFactory.createEmptyBorder());
        SearchBox.setBackground(Color.decode("#EEEEDD"));
        SearchBox.getDocument().addDocumentListener(listener);
        InputMap im = SearchBox.getInputMap();
        ActionMap am = SearchBox.getActionMap();
        im.put(KeyStroke.getKeyStroke("ENTER"), COMMIT_ACTION);
        am.put(COMMIT_ACTION, new CommitAction());
        
        Switchboard.InfoBox = new JTextField();
        Switchboard.InfoBox.setBorder(BorderFactory.createTitledBorder(""));
        Switchboard.InfoBox.setSize(width, textHeight);
        Switchboard.InfoBox.setBorder(BorderFactory.createEmptyBorder());
        Switchboard.InfoBox.setBackground(Color.decode("#EEEEDD"));
        Switchboard.InfoBox.setText("search window initialized");
        Switchboard.InfoBox.setFont(font.deriveFont((float) 11.0));
        
        // make the scroll pane that contains the search result
        JComponent mainText = new JEditorPane();
        mainText.setPreferredSize(new java.awt.Dimension(480, 590));
        String infotext =
            "This is a YaCy GUI wrappper.\n\n" +
            "The YaCy administration interface is in your browser\n" +
            "just open http://" + this.host + ":" + this.port + "\n\n" +
            "You may also enter a search term and press enter,\n" +
            "then the query will be opened in your browser\n";
        if (OS.isMacArchitecture) infotext += "\nThe application data on Mac is stored at ~Library/YaCy/\n";
        ((JEditorPane) mainText).setText(infotext);
        //page.add(new splashCanvas());

        //SplashScreen splash = SplashScreen.getSplashScreen(); 
        //Graphics2D g2 = splash.createGraphics();
        //splash.update();
        
        JScrollPane pane = new JScrollPane();
        pane.setViewportView(mainText);
        
        // combine search box and scroll pane
        page.setVerticalGroup(page.createSequentialGroup()
            .addComponent(SearchBox, GroupLayout.PREFERRED_SIZE, textHeight + 4, GroupLayout.PREFERRED_SIZE)
            .addComponent(pane, 0, height, Short.MAX_VALUE) // height
            .addComponent(Switchboard.InfoBox, GroupLayout.PREFERRED_SIZE, textHeight, GroupLayout.PREFERRED_SIZE)
            ); 
        page.setHorizontalGroup(page.createSequentialGroup()
            .addGroup(page.createParallelGroup()
                .addComponent(SearchBox, GroupLayout.Alignment.LEADING, 0, width, Short.MAX_VALUE) // width
                .addComponent(pane, GroupLayout.Alignment.LEADING, 0, width, Short.MAX_VALUE)
                .addComponent(Switchboard.InfoBox, GroupLayout.Alignment.TRAILING, 0, width, Short.MAX_VALUE)));
        return page;
    }
}
