/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * * ident "%Z%%M% %I% %E% SMI" * * Copyright(c) 1999 by Sun Microsystems, Inc. * All rights reserved. * * pmHelpSearchPanel.java * Search help keywords */ package com.sun.admin.pm.client; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.JPanel; import javax.swing.border.*; import javax.swing.event.*; import javax.swing.*; import com.sun.admin.pm.server.*; public class pmHelpSearchPanel extends JPanel { pmHelpController controller; pmHelpSearchQueryPanel queryPanel; pmHelpSearchResultPanel resultPanel; JLabel textPanels[]; public pmHelpSearchPanel(pmHelpController ctrl) { controller = ctrl; // build subpanels queryPanel = new pmHelpSearchQueryPanel(this); resultPanel = new pmHelpSearchResultPanel(this); textPanels = new JLabel[4]; textPanels[0] = new JLabel( pmUtility.getResource("To.find.help.articles...")); textPanels[1] = new JLabel( pmUtility.getResource("enter.keywords.below...")); // lay out top panel this.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.insets = new Insets(5, 5, 5, 5); c.gridwidth = GridBagConstraints.REMAINDER; c.gridx = 0; c.gridy = 0; c.gridheight = 1; // GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; c.weighty = 0.0; JPanel p = new JPanel(); p.setLayout(new GridBagLayout()); GridBagConstraints pc = new GridBagConstraints(); pc.insets = new Insets(5, 5, 0, 5); // pc.fill = GridBagConstraints.HORIZONTAL; pc.weightx = 1.0; pc.anchor = GridBagConstraints.WEST; pc.gridx = 0; pc.gridy = GridBagConstraints.RELATIVE; p.add(textPanels[0], pc); pc.insets = new Insets(0, 5, 5, 5); p.add(textPanels[1], pc); // p.add(textPanels[2]); this.add(p, c); p = new JPanel(); p.setLayout(new BorderLayout()); queryPanel.setBorder(BorderFactory.createEtchedBorder()); p.add(queryPanel, "North"); resultPanel.setBorder(BorderFactory.createEtchedBorder()); p.add(resultPanel, "Center"); // p.setBorder(BorderFactory.createEtchedBorder()); c.gridy = 1; // new stuff c.gridy = GridBagConstraints.RELATIVE; c.gridheight = 0; c.weighty = 1.0; c.weightx = 0.0; c.fill = GridBagConstraints.BOTH; c.anchor = GridBagConstraints.EAST; // end new stuff this.add(p, c); this.setBorder(BorderFactory.createEtchedBorder()); // figure out when we are tabbed or un-tabbed controller.outerPanel.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { JTabbedPane tp = (JTabbedPane) e.getSource(); Debug.info("HELP: Tab event!"); if (!(tp.getSelectedComponent() instanceof com.sun.admin.pm.client.pmHelpSearchPanel)) { Debug.info("HELP: Tab event: resetting default"); /* * controller.frame.getRootPane(). * setDefaultButton( * controller.frame.dismiss); */ /* * System.out.println(controller); * System.out.println(controller.frame); * System.out.println(controller.frame.dismiss); */ if (controller.frame.dismiss != null) controller.frame.dismiss. setAsDefaultButton(); } else { // better to have the tab itself keep focus. // queryPanel.query.requestFocus(); } } }); } // place item titles in search result panel public void setSearchResults(Vector items) { Vector v = new Vector(); if (items.size() == 0) { resultPanel.setListEmpty(true); v.addElement(pmUtility.getResource("Nothing.matched.")); } else { Enumeration e = items.elements(); while (e.hasMoreElements()) { pmHelpItem i = (pmHelpItem) e.nextElement(); v.addElement(i); } resultPanel.setListEmpty(false); } resultPanel.setResultList(v); } } class pmHelpSearchResultPanel extends JPanel { JList resultList = null; pmButton selectButton = null; pmHelpSearchPanel parentPanel = null; protected boolean listEmpty = true; public pmHelpSearchResultPanel(pmHelpSearchPanel par) { parentPanel = par; this.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.insets = new Insets(10, 10, 10, 10); c.fill = GridBagConstraints.NONE; c.weightx = c.weighty = 0.0; c.gridx = 0; c.gridy = 0; c.anchor = GridBagConstraints.NORTHWEST; JLabel promptLabel = new JLabel( pmUtility.getResource("Search.Results:")); /* * MNEMONIC * promptLabel.setDisplayedMnemonic( * pmUtility.getIntResource("Search.Results:.mnemonic")); */ this.add(promptLabel, c); selectButton = new pmButton( pmUtility.getResource("Show")); selectButton.setMnemonic( pmUtility.getIntResource("Show.mnemonic")); selectButton.setEnabled(false); selectButton.addActionListener(new ActionListener() { // load the selected item into view panel public void actionPerformed(ActionEvent e) { pmHelpItem selectedItem = (pmHelpItem) resultList.getSelectedValue(); Debug.info("HELP: Selected " + selectedItem); parentPanel.controller.showHelpItem(selectedItem); } }); c.gridy = 1; c.anchor = GridBagConstraints.SOUTHWEST; this.add(selectButton, c); Vector resultItems = new Vector(); resultList = new JList(resultItems); JScrollPane scrollPane = new JScrollPane(); scrollPane.getViewport().setView(resultList); resultList.setVisibleRowCount(8); promptLabel.setLabelFor(resultList); resultList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (!listEmpty) { selectButton.setEnabled(true); /* * parentPanel.controller.frame. * getRootPane().setDefaultButton(selectButton); */ selectButton.setAsDefaultButton(); } }}); resultList.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { JList l = (JList) e.getSource(); int i = l.locationToIndex(e.getPoint()); Debug.info("HELP: doubleclick index: " + i); if (!listEmpty && i >= 0) { pmHelpItem item = (pmHelpItem) l.getModel(). getElementAt(i); Debug.info("HELP: doubleclick: " + item.tag); parentPanel.controller.showHelpItem(item); } } } }); c.gridwidth = 2; c.gridx = 1; c.gridy = 0; c.weightx = c.weighty = 1.0; c.fill = GridBagConstraints.BOTH; c.anchor = GridBagConstraints.WEST; this.add(scrollPane, c); } public void setResultList(Vector v) { resultList.setListData(v); resultList.setSelectedValue(v.elementAt(0), true); } void setListEmpty(boolean e) { listEmpty = e; selectButton.setEnabled(false); /* * parentPanel.controller.frame.getRootPane(). * setDefaultButton(parentPanel.controller.frame.dismiss); */ parentPanel.controller.frame.dismiss.setAsDefaultButton(); } } class pmHelpSearchQueryPanel extends JPanel { JTextField query; pmButton search; pmHelpSearchPanel parentPanel = null; public pmHelpSearchQueryPanel(pmHelpSearchPanel par) { parentPanel = par; this.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.insets = new Insets(10, 10, 10, 10); c.fill = GridBagConstraints.NONE; c.weightx = c.weighty = 0.0; c.anchor = GridBagConstraints.WEST; c.gridx = 0; c.gridy = 0; c.gridwidth = 1; c.gridheight = 1; JLabel promptLabel = new JLabel(pmUtility.getResource("Keywords:")); /* * MNEMONIC * promptLabel.setDisplayedMnemonic( * pmUtility.getIntResource("Keywords:.mnemonic")); */ this.add(promptLabel, c); search = new pmButton( pmUtility.getResource("Find")); search.setMnemonic( pmUtility.getIntResource("Find.mnemonic")); search.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // parse the keyword strings Vector v = null; StringTokenizer st = null; String s = query.getText(); if (s != null) { v = new Vector(); st = new StringTokenizer(s); while (st.hasMoreTokens()) v.addElement(st.nextToken()); v = getItemsForKeywords(v); parentPanel.setSearchResults(v); if (v != null && v.size() != 0) { Debug.info("HELP: search vector full"); parentPanel.resultPanel.resultList.requestFocus(); } else { Debug.info("HELP: search vector empty"); } } } }); c.fill = GridBagConstraints.NONE; c.gridx = 2; c.gridy = 0; // GridBagConstraints.RELATIVE; this.add(search, c); query = new JTextField(); query.setEditable(true); query.setText(" "); promptLabel.setLabelFor(query); query.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Debug.info("HELP: Action!"); pmHelpSearchQueryPanel.this.search.doClick(); } }); query.getDocument().addDocumentListener(new DocumentListener() { public void changedUpdate(DocumentEvent e) { // ignore } public void insertUpdate(DocumentEvent e) { // make search the default button Debug.info("HELP: search doc inserted update"); pmHelpSearchQueryPanel.this.search.setEnabled(true); /* * parentPanel.controller.frame. * getRootPane().setDefaultButton( * pmHelpSearchQueryPanel.this.search); */ if (pmHelpSearchQueryPanel.this.search != null) pmHelpSearchQueryPanel.this.search. setAsDefaultButton(); } public void removeUpdate(DocumentEvent e) { Debug.info("HELP: search doc removed update"); // restore the default button if (query.getText().length() == 0) { /* * parentPanel.controller.frame. * getRootPane().setDefaultButton( * parentPanel.controller.frame.dismiss); */ if (parentPanel.controller.frame.dismiss != null) parentPanel.controller.frame.dismiss. setAsDefaultButton(); } } }); c.gridwidth = 1; // GridBagConstraints.REMAINDER; c.gridx = 1; c.weightx = 1.0; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.EAST; this.add(query, c); } Vector getItemsForKeywords(Vector keywords) { Vector result = new Vector(); Debug.info("HELP: getItemsForKeywords: " + keywords); Enumeration words = keywords.elements(); while (words.hasMoreElements()) { String s = (String) words.nextElement(); Vector newItems = pmHelpRepository.helpItemsForKeyword(s); Debug.info("HELP: getItemsForKeywords new items: " + newItems); if (newItems != null) { Enumeration items = newItems.elements(); while (items.hasMoreElements()) { pmHelpItem i = (pmHelpItem) items.nextElement(); Debug.info("HELP: getItemsForKeywords result: " + result); Debug.info("HELP: getItemsForKeywords item: " + i); if (!result.contains(i)) result.addElement(i); } } } return result; } }