/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * 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 * trunk/opends/resource/legal-notices/OpenDS.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 * * * Copyright 2008-2009 Sun Microsystems, Inc. */ package org.opends.guitools.controlpanel.ui; import static org.opends.messages.AdminToolMessages.*; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import javax.swing.Box; import javax.swing.ButtonGroup; import javax.swing.JPanel; import org.opends.guitools.controlpanel.datamodel.Action; import org.opends.guitools.controlpanel.datamodel.Category; import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent; import org.opends.guitools.controlpanel.ui.components.ActionButton; import org.opends.guitools.controlpanel.ui.components.CategoryPanel; import org.opends.guitools.controlpanel.util.Utilities; import org.opends.messages.Message; /** * The panel on the left side of the main Control Center dialog. It contains * all the actions on the pane divided in categories. * */ public class MainActionsPane extends StatusGenericPanel { private static final long serialVersionUID = 7616418700758530191L; /** * Default constructor. * */ public MainActionsPane() { super(); setBackground(ColorAndFontConstants.greyBackground); GridBagConstraints gbc1 = new GridBagConstraints(); gbc1.gridx = 0; gbc1.gridy = 0; gbc1.fill = GridBagConstraints.HORIZONTAL; gbc1.weightx = 1; ArrayList<Category> categories = createCategories(); ButtonGroup group = new ButtonGroup(); int maxWidth = 0; final Map<Action, GenericFrame> frames = new HashMap<Action, GenericFrame>(); ArrayList<ActionButton> actions = new ArrayList<ActionButton>(); for(Category category: categories) { JPanel categoryPanel = new JPanel(new GridBagLayout()); GridBagConstraints gbc2 = new GridBagConstraints(); gbc2.gridx = 0; gbc2.gridy = 0; gbc2.weightx = 1; gbc2.fill = GridBagConstraints.HORIZONTAL; for (Action action : category.getActions()) { final ActionButton b = new ActionButton(action); actions.add(b); b.addActionListener(new ActionListener() { /** * {@inheritDoc} */ public void actionPerformed(ActionEvent ev) { // Constructs the panels using reflection. Action action = b.getActionObject(); GenericFrame frame = frames.get(action); if (frame == null) { Class<? extends StatusGenericPanel> panelClass = action.getAssociatedPanelClass(); try { Constructor<? extends StatusGenericPanel> constructor = panelClass.getDeclaredConstructor(); StatusGenericPanel panel = constructor.newInstance(); if (getInfo() != null) { panel.setInfo(getInfo()); } frame = createFrame(panel); frames.put(action, frame); Utilities.centerGoldenMean(frame, Utilities.getFrame(MainActionsPane.this)); } catch (Throwable t) { // Bug t.printStackTrace(); } } if (!frame.isVisible()) { frame.setVisible(true); } else { frame.toFront(); } } }); categoryPanel.add(b, gbc2); gbc2.gridy++; group.add(b); maxWidth = Math.max(maxWidth, b.getPreferredSize().width); } CategoryPanel p = new CategoryPanel(categoryPanel, category); maxWidth = Math.max(maxWidth, p.getPreferredSize().width); p.setExpanded(false); add(p, gbc1); gbc1.gridy++; if (category.getName().equals( INFO_CTRL_PANEL_CATEGORY_DIRECTORY_DATA.get())) { p.setExpanded(true); } } add(Box.createHorizontalStrut(maxWidth), gbc1); gbc1.gridy ++; gbc1.weighty = 1.0; add(Box.createVerticalGlue(), gbc1); createActionButtonListeners(actions); } /** * {@inheritDoc} */ public Component getPreferredFocusComponent() { return null; } /** * Creates the frame to be displayed using the provided panel. * @param panel the panel that will be contained in the frame. * @return the frame to be displayed using the provided panel. */ protected GenericFrame createFrame(StatusGenericPanel panel) { return new GenericFrame(panel); } /** * Creates the categories contained by this panel. * @return the categories contained by this panel. */ protected ArrayList<Category> createCategories() { ArrayList<Category> categories = new ArrayList<Category>(); Message[][] labels; if (Utilities.isWindows()) { labels = new Message[][] { { INFO_CTRL_PANEL_CATEGORY_DIRECTORY_DATA.get(), INFO_CTRL_PANEL_ACTION_MANAGE_ENTRIES.get(), INFO_CTRL_PANEL_ACTION_NEW_BASEDN.get(), INFO_CTRL_PANEL_ACTION_IMPORT_LDIF.get(), INFO_CTRL_PANEL_ACTION_EXPORT_LDIF.get(), INFO_CTRL_PANEL_ACTION_BACKUP.get(), INFO_CTRL_PANEL_ACTION_RESTORE.get() }, { INFO_CTRL_PANEL_CATEGORY_SCHEMA.get(), INFO_CTRL_PANEL_ACTION_MANAGE_SCHEMA.get() }, { INFO_CTRL_PANEL_CATEGORY_INDEXES.get(), INFO_CTRL_PANEL_ACTION_MANAGE_INDEXES.get(), INFO_CTRL_PANEL_ACTION_VERIFY_INDEXES.get(), INFO_CTRL_PANEL_ACTION_REBUILD_INDEXES.get() }, { INFO_CTRL_PANEL_CATEGORY_MONITORING.get(), INFO_CTRL_PANEL_BROWSE_GENERAL_MONITORING.get(), INFO_CTRL_PANEL_CONNECTION_HANDLER_MONITORING.get(), INFO_CTRL_PANEL_MANAGE_TASKS.get() }, { INFO_CTRL_PANEL_CATEGORY_RUNTIME_OPTIONS.get(), INFO_CTRL_PANEL_ACTION_JAVA_SETTINGS.get(), INFO_CTRL_PANEL_ACTION_WINDOWS_SERVICE.get() } }; } else { labels = new Message[][] { { INFO_CTRL_PANEL_CATEGORY_DIRECTORY_DATA.get(), INFO_CTRL_PANEL_ACTION_MANAGE_ENTRIES.get(), INFO_CTRL_PANEL_ACTION_NEW_BASEDN.get(), INFO_CTRL_PANEL_ACTION_IMPORT_LDIF.get(), INFO_CTRL_PANEL_ACTION_EXPORT_LDIF.get(), INFO_CTRL_PANEL_ACTION_BACKUP.get(), INFO_CTRL_PANEL_ACTION_RESTORE.get() }, { INFO_CTRL_PANEL_CATEGORY_SCHEMA.get(), INFO_CTRL_PANEL_ACTION_MANAGE_SCHEMA.get() }, { INFO_CTRL_PANEL_CATEGORY_INDEXES.get(), INFO_CTRL_PANEL_ACTION_MANAGE_INDEXES.get(), INFO_CTRL_PANEL_ACTION_VERIFY_INDEXES.get(), INFO_CTRL_PANEL_ACTION_REBUILD_INDEXES.get() }, { INFO_CTRL_PANEL_CATEGORY_MONITORING.get(), INFO_CTRL_PANEL_BROWSE_GENERAL_MONITORING.get(), INFO_CTRL_PANEL_CONNECTION_HANDLER_MONITORING.get(), INFO_CTRL_PANEL_MANAGE_TASKS.get() }, { INFO_CTRL_PANEL_CATEGORY_RUNTIME_OPTIONS.get(), INFO_CTRL_PANEL_ACTION_JAVA_SETTINGS.get() } }; } ArrayList<Class<? extends StatusGenericPanel>> classes = new ArrayList<Class<? extends StatusGenericPanel>>(); classes.add(BrowseEntriesPanel.class); classes.add(NewBaseDNPanel.class); classes.add(ImportLDIFPanel.class); classes.add(ExportLDIFPanel.class); classes.add(BackupPanel.class); classes.add(RestorePanel.class); classes.add(BrowseSchemaPanel.class); classes.add(BrowseIndexPanel.class); classes.add(VerifyIndexPanel.class); classes.add(RebuildIndexPanel.class); classes.add(BrowseGeneralMonitoringPanel.class); classes.add(ConnectionHandlerMonitoringPanel.class); classes.add(ManageTasksPanel.class); classes.add(JavaPropertiesPanel.class); if (Utilities.isWindows()) { classes.add(WindowsServicePanel.class); } int classIndex = 0; for (int i=0; i<labels.length; i++) { Category category = new Category(); category.setName(labels[i][0]); for (int j=1; j<labels[i].length; j++) { Action action = new Action(); action.setName(labels[i][j]); action.setAssociatedPanel(classes.get(classIndex)); classIndex ++; category.getActions().add(action); } categories.add(category); } return categories; } /** * This is required because in some desktops we might encounter a case * where several actions are highlighted. * @param actions the actions */ private void createActionButtonListeners( final Collection<ActionButton> actions) { ActionListener actionListener = new ActionListener() { /** * {@inheritDoc} */ public void actionPerformed(ActionEvent ev) { for (ActionButton button : actions) { if (ev.getSource() == button) { button.actionPerformed(ev); break; } } } }; MouseAdapter mouseListener = new MouseAdapter() { /** * {@inheritDoc} */ public void mousePressed(MouseEvent ev) { for (ActionButton button : actions) { if (ev.getSource() == button) { button.mousePressed(ev); break; } } } /** * {@inheritDoc} */ public void mouseReleased(MouseEvent ev) { for (ActionButton button : actions) { if (ev.getSource() == button) { button.mouseReleased(ev); break; } } } /** * {@inheritDoc} */ public void mouseExited(MouseEvent ev) { for (ActionButton button : actions) { if (ev.getSource() == button) { button.mouseExited(ev); break; } } } /** * {@inheritDoc} */ public void mouseEntered(MouseEvent ev) { for (ActionButton button : actions) { if (ev.getSource() == button) { button.mouseEntered(ev); } else { button.mouseExited(ev); } } } }; for (ActionButton button : actions) { button.addActionListener(actionListener); button.addMouseListener(mouseListener); } } /** * {@inheritDoc} */ public Message getTitle() { return null; } /** * {@inheritDoc} */ public void configurationChanged(ConfigurationChangeEvent ev) { } /** * {@inheritDoc} */ public void okClicked() { } }