/* * 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 - 2001 by Sun Microsystems, Inc. * All rights reserved. * * pmHelpDetailPanel.java * View a help article */ package com.sun.admin.pm.client; import java.awt.*; import java.awt.event.*; import java.util.*; import java.io.*; import java.net.URL; import javax.swing.JPanel; import javax.swing.border.*; import javax.swing.event.*; import javax.swing.*; import com.sun.admin.pm.server.*; class pmHelpLoc { public pmHelpItem item; public Point pos; public pmHelpLoc(pmHelpItem i) { this(i, new Point(0, 0)); } public pmHelpLoc(pmHelpItem i, Point p) { item = i; pos = p; } public pmHelpLoc() { this(null, new Point(0, 0)); } } public class pmHelpDetailPanel extends JPanel { pmHelpController controller; pmHelpSeeAlsoPanel seeAlsoPanel; pmHelpViewPanel viewPanel; pmHelpLoc history[]; int historyIndex; int historyLast; static final int MAX_HISTORY_ITEMS = 101; public pmHelpDetailPanel(pmHelpController ctrl) { controller = ctrl; // build subpanels seeAlsoPanel = new pmHelpSeeAlsoPanel(this); viewPanel = new pmHelpViewPanel(this); // 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 = 2; // GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; c.weighty = 6.0; c.insets = new Insets(5, 5, 0, 5); this.add(viewPanel, c); c.gridy = GridBagConstraints.RELATIVE; // c.gridheight = GridBagConstraints.REMAINDER; c.gridheight = 0; c.weighty = 0.0; c.weightx = 1.0; c.fill = GridBagConstraints.BOTH; c.anchor = GridBagConstraints.WEST; c.insets = new Insets(0, 5, 5, 5); this.add(seeAlsoPanel, c); this.setBorder(BorderFactory.createEtchedBorder()); history = new pmHelpLoc[MAX_HISTORY_ITEMS]; historyIndex = 0; historyLast = 0; // manage focus 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.pmHelpDetailPanel)) { Debug.info("HELP: Tab event: resetting default"); /* * controller.frame.getRootPane(). * setDefaultButton( * controller.frame.dismiss); */ if (controller.frame.dismiss != null) controller.frame.dismiss. setAsDefaultButton(); } } }); addFocusListener(new FocusAdapter() { public void focusGained(FocusEvent e) { Debug.info("HELP: detailPanel gained focus"); if (controller.frame.dismiss != null) controller.frame.dismiss. setAsDefaultButton(); } }); } // ask parent controller to show item public void showItem(String tag) { controller.showHelpItem(tag); } public void showHistoryBackItem() { Debug.message("HELP: showHistoryBackItem: index = " + historyIndex + " last = " + historyLast + "\n\thistory = " + history); // assuming item already visible, preserve its position history[historyIndex].pos = viewPanel.getPos(); Debug.info("back: pos is " + history[historyIndex].pos); if (historyIndex > 1) { pmHelpLoc l = history [--historyIndex]; pmHelpItem item = l.item; Point p = l.pos; loadItem(item, p); } viewPanel.setNavButtons(historyIndex, historyLast); } public void showHistoryForwardItem() { Debug.message("HELP: showHistoryForwardItem: index = " + historyIndex + " last = " + historyLast + "\n\thistory = " + history); // assuming already an item visible, preserve its position history[historyIndex].pos = viewPanel.getPos(); Debug.info("HELP: fwd: pos is " + history[historyIndex].pos); if (historyIndex < historyLast) { pmHelpLoc l = history [++historyIndex]; pmHelpItem item = l.item; Point p = l.pos; loadItem(item, p); } viewPanel.setNavButtons(historyIndex, historyLast); } /* * load the help item * internal */ protected pmHelpItem loadItem(pmHelpItem item) { return loadItem(item, new Point(0, 0)); } protected pmHelpItem loadItem(pmHelpItem item, Point pos) { Debug.message("HELP: View: loadItem " + item.tag); seeAlsoPanel.setItems(item.seealso); Debug.info("loadItem: pos is " + pos); viewPanel.setItem(item.title, item.content); viewPanel.setPos(pos); return item; } /* * load the help item corresponding to the specified tag * external - called from helpController * note that this is how see-also items are loadedes */ public pmHelpItem loadItemForTag(String tag) { pmHelpItem item; if (tag == null || (item = pmHelpRepository.helpItemForTag(tag)) == null) { Debug.warning("HELP: View: item not found"); loadEmptyItem(tag); return null; } Debug.info("loadItem(before): index = " + historyIndex + ", last = " + historyLast); // if there's already an item visible, preserve its position if (historyIndex != 0 && historyLast != 0) history[historyIndex].pos = viewPanel.getPos(); loadItem(item); Debug.info("HELP: loadItemForTag: index = " + historyIndex + " last = " + historyLast + "\n\thistory = " + history); /* * make the new item the latest in history. * if the history length is maxed out, the new item * will replace the item that's currently last. */ if (historyIndex < history.length - 1) { // init pos to 0,0 history [++historyIndex] = new pmHelpLoc(item); } else { // replace last item history [historyIndex] = new pmHelpLoc(item); } historyLast = historyIndex; viewPanel.setNavButtons(historyIndex, historyLast); Debug.info("loadItem(after): index = " + historyIndex + ", last = " + historyLast); return item; } private void loadEmptyItem(String itm) { String msg = new String( pmUtility.getResource("Item.not.found:") + itm); viewPanel.setItem(msg, new pmHelpContent( pmUtility.getResource("No.information.available."))); seeAlsoPanel.setItems(null); } } class pmHelpSeeAlsoPanel extends JPanel { pmHelpDetailPanel parentPanel = null; Vector seeAlsoItems = null; JComboBox theComboBox = null; pmButton selectButton = null; private void layoutBox() { JPanel p = new JPanel(); p.setLayout(new BorderLayout(5, 0)); p.add(new JPanel(), "North"); p.add(new JPanel(), "South"); p.add(new JLabel( pmUtility.getResource("See.also:")), "West"); theComboBox = new JComboBox(); Font f = theComboBox.getFont(); Font fb = new Font(f.getName(), f.PLAIN, f.getSize()); theComboBox.setFont(fb); theComboBox.setPreferredSize( new Dimension(200, theComboBox.getPreferredSize().height)); theComboBox.setMinimumSize( new Dimension(20, theComboBox.getPreferredSize().height)); theComboBox.setMaximumSize( new Dimension(300, theComboBox.getPreferredSize().height)); theComboBox.setEnabled(false); /* * theComboBox.addActionListener(new ActionListener() { * public void actionPerformed(ActionEvent e) { * JComboBox src = (JComboBox) e.getSource(); * System.out.println("Combo: action = " + * e.getActionCommand()); * System.out.println("Combo: mod = " + * e.getModifiers()); * System.out.println("Combo: param = " + * e.paramString()); * System.out.println("Combo: item = " + * src.getSelectedItem()); * } * }); */ p.add(theComboBox, "Center"); selectButton = new pmButton( pmUtility.getResource("Show")); selectButton.setMnemonic( pmUtility.getIntResource("Show.mnemonic")); selectButton.setEnabled(false); p.add(selectButton, "East"); selectButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { pmHelpItem i = (pmHelpItem) theComboBox.getSelectedItem(); Debug.message("HELP: got button: item is " + i); // parentPanel.loadItemForTag(i.tag); parentPanel.showItem(i.tag); } }); JPanel pp = new JPanel(); pp.setLayout(new BorderLayout(5, 0)); pp.add(p, "Center"); this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); this.add(Box.createHorizontalStrut(10)); this.add(pp); this.add(Box.createHorizontalStrut(10)); this.add(Box.createHorizontalGlue()); } public pmHelpSeeAlsoPanel(pmHelpDetailPanel p) { parentPanel = p; layoutBox(); this.setBorder(BorderFactory.createEtchedBorder()); } /* * set the titles of the pmHelpItems whose tags are * passed into see-also combo box */ public void setItems(Vector tags) { clearItems(); if (tags == null) return; Enumeration e = tags.elements(); while (e.hasMoreElements()) { pmHelpItem i = pmHelpRepository.helpItemForTag((String) e.nextElement()); if (i != null) theComboBox.addItem(i); } selectButton.setEnabled(true); theComboBox.setEnabled(true); // repaint(); } public void clearItems() { if (theComboBox.getItemCount() > 0) theComboBox.removeAllItems(); selectButton.setEnabled(false); theComboBox.setEnabled(false); } } class pmHelpViewPanel extends JPanel { // JTextArea helpView; JEditorPane helpView; JScrollPane scrollPane; pmHelpHelpOnPanel titlePanel; pmHelpDetailPanel parentPanel; pmButton backButton; pmButton forwardButton; public pmHelpViewPanel(pmHelpDetailPanel par) { parentPanel = par; // helpView = new JTextArea(10, 32); // helpView.setLineWrap(true); helpView = new JEditorPane(); helpView.setContentType("text/html"); helpView.setEditable(false); helpView.setEnabled(false); helpView.setDisabledTextColor(Color.blue); scrollPane = new JScrollPane(helpView); this.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.insets = new Insets(5, 10, 5, 10); c.gridwidth = GridBagConstraints.REMAINDER; c.gridx = 0; c.gridy = 0; c.gridheight = 1; c.fill = GridBagConstraints.HORIZONTAL; c.weightx = 1.0; // c.weighty = 1.0; c.weighty = 0.05; titlePanel = new pmHelpHelpOnPanel(); this.add(titlePanel, c); c.gridy = 1; c.gridheight = 1; c.gridwidth = GridBagConstraints.REMAINDER; c.weightx = 1.0; c.weighty = 6.0; c.fill = GridBagConstraints.BOTH; c.insets = new Insets(5, 10, 5, 10); // c.insets = new Insets(5, 5, 5, 5); // NEW this.add(scrollPane, c); this.setBorder(BorderFactory.createEtchedBorder()); /* */ try { helpView.setPage(new URL("file:///test.html")); } catch (Exception x) { Debug.info("setPage caught: " + x); } /* */ // navigation buttons JPanel p = new JPanel(); p.setLayout(new GridBagLayout()); GridBagConstraints pc = new GridBagConstraints(); // pc.insets = new Insets(2, 2, 2, 2); // pc.fill = GridBagConstraints.HORIZONTAL; pc.weightx = 1.0; pc.weighty = 1.0; pc.gridx = 0; pc.anchor = GridBagConstraints.WEST; backButton = new pmButton( pmUtility.getResource("Back")); backButton.setMnemonic( pmUtility.getIntResource("Back.mnemonic")); p.add(backButton, pc); backButton.setEnabled(false); backButton.setDefaultCapable(false); backButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { parentPanel.showHistoryBackItem(); } }); pc.gridx = 1; pc.anchor = GridBagConstraints.EAST; forwardButton = new pmButton( pmUtility.getResource("Forward")); forwardButton.setMnemonic( pmUtility.getIntResource("Forward.mnemonic")); p.add(forwardButton, pc); forwardButton.setEnabled(false); forwardButton.setDefaultCapable(false); forwardButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { parentPanel.showHistoryForwardItem(); } }); c.gridy = GridBagConstraints.RELATIVE; c.gridheight = 1; // GridBagConstraints.REMAINDER; c.gridwidth = GridBagConstraints.REMAINDER; c.weightx = 1.0; // c.weighty = 1.0; c.weighty = 0.05; // NEW c.fill = GridBagConstraints.BOTH; c.insets = new Insets(0, 10, 5, 10); // c.insets = new Insets(0, 10, 5, 10); c.insets = new Insets(5, 10, 5, 10); // NEW add(p, c); } public void setItem(String title, pmHelpContent content) { helpView.setText(content.getText()); // scrollPane.getViewport().setViewPosition(new Point(0, 0)); titlePanel.helpTopic.setText(title); } public void setPos(Point p) { scrollPane.getViewport().setViewPosition(p); } public Point getPos() { return scrollPane.getViewport().getViewPosition(); } public void setNavButtons(int index, int last) { Debug.message("HELP: NavButtons " + index + " " + last); if (last > index) forwardButton.setEnabled(true); else forwardButton.setEnabled(false); if (index > 1 && last > 1) backButton.setEnabled(true); else backButton.setEnabled(false); } } class pmJTextField extends JTextField { public boolean isFocusable() { return false; } } class pmHelpHelpOnPanel extends JPanel { pmJTextField helpTopic; public pmHelpHelpOnPanel() { helpTopic = new pmJTextField(); helpTopic.setEditable(false); helpTopic.setText("Default help topic"); helpTopic.setBackground(Color.white); Font f = helpTopic.getFont(); Font fb = new Font(f.getName(), Font.BOLD, f.getSize()); helpTopic.setFont(fb); this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); JPanel p = new JPanel(); p.setLayout(new BorderLayout(5, 0)); p.add(new JLabel( pmUtility.getResource("Help.on:")), "West"); p.add(helpTopic, "Center"); JPanel pp = new JPanel(); pp.setLayout(new BorderLayout(0, 0)); pp.add(p, "Center"); // this.add(Box.createHorizontalStrut(5)); this.add(pp); // this.add(Box.createHorizontalStrut(5)); this.add(Box.createHorizontalGlue()); // this.setBorder(BorderFactory.createEtchedBorder()); } }