blob: 5ad9e4465ec53098ca085381db4b8e0fd303f028 [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.designer.propertyTable;
import com.intellij.designer.DesignerBundle;
import com.intellij.designer.designSurface.DesignerEditorPanel;
import com.intellij.designer.designSurface.EditableArea;
import com.intellij.designer.propertyTable.actions.*;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.impl.ActionButton;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.PopupHandler;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.SideBorder;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* @author Alexander Lobas
*/
public final class PropertyTablePanel extends JPanel implements ListSelectionListener {
private static final String BUTTON_KEY = "SWING_BUTTON_KEY";
private final RadPropertyTable myPropertyTable;
private final AnAction[] myActions;
private final JPanel myTabPanel;
private final JPanel myActionPanel;
private PropertyTableTab[] myTabs;
private PropertyTableTab myCurrentTab;
private TablePanelActionPolicy myActionPolicy;
private final JLabel myTitleLabel;
public PropertyTablePanel(final Project project) {
myPropertyTable = new RadPropertyTable(project) {
@Override
protected void updateEditActions() {
updateActions();
}
};
setLayout(new GridBagLayout());
int gridX = 0;
myTitleLabel = new JLabel(DesignerBundle.message("designer.properties.title"));
myTitleLabel.setFont(UIUtil.getLabelFont(UIUtil.FontSize.SMALL));
add(myTitleLabel,
new GridBagConstraints(gridX++, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
new Insets(2, 5, 2, 10), 0, 0)
);
ActionManager actionManager = ActionManager.getInstance();
DefaultActionGroup actionGroup = new DefaultActionGroup();
ShowJavadoc showJavadoc = new ShowJavadoc(myPropertyTable);
showJavadoc.registerCustomShortcutSet(actionManager.getAction(IdeActions.ACTION_QUICK_JAVADOC).getShortcutSet(), myPropertyTable);
actionGroup.add(showJavadoc);
actionGroup.addSeparator();
RestoreDefault restoreDefault = new RestoreDefault(myPropertyTable);
// Don't register ACTION_DELETE on Mac; on Mac, the default delete key is VK_DELETE rather than VK_BACK_SPACE
// which means users end up accidentally restoring to default when trying to edit inside property editors.
if (!SystemInfo.isMac) {
restoreDefault.registerCustomShortcutSet(actionManager.getAction(IdeActions.ACTION_DELETE).getShortcutSet(), myPropertyTable);
}
actionGroup.add(restoreDefault);
actionGroup.add(new ShowExpert(myPropertyTable));
myTabPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
add(myTabPanel,
new GridBagConstraints(gridX++, 0, 1, 1, 1, 0, GridBagConstraints.LINE_START, GridBagConstraints.NONE,
new Insets(2, 0, 2, 0), 0, 0)
);
myActionPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
add(myActionPanel,
new GridBagConstraints(gridX++, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE,
new Insets(2, 0, 2, 2), 0, 0)
);
myActions = actionGroup.getChildren(null);
for (AnAction action : myActions) {
if (action instanceof Separator) {
continue;
}
Presentation presentation = action.getTemplatePresentation();
ActionButton button = new ActionButton(action, presentation, ActionPlaces.UNKNOWN, ActionToolbar.DEFAULT_MINIMUM_BUTTON_SIZE);
myActionPanel.add(button);
presentation.putClientProperty(BUTTON_KEY, button);
}
actionGroup.add(new ShowColumns(myPropertyTable));
PopupHandler.installPopupHandler(myPropertyTable, actionGroup,
ActionPlaces.GUI_DESIGNER_PROPERTY_INSPECTOR_POPUP,
actionManager);
myPropertyTable.getSelectionModel().addListSelectionListener(this);
valueChanged(null);
JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myPropertyTable);
scrollPane.setBorder(IdeBorderFactory.createBorder(SideBorder.TOP));
myPropertyTable.initQuickFixManager(scrollPane.getViewport());
add(scrollPane, new GridBagConstraints(0, 1, gridX, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
new Insets(0, 0, 0, 0), 0, 0));
myPropertyTable.setPropertyTablePanel(this);
addMouseListener(new MouseAdapter() {
public void mouseReleased(final MouseEvent e) {
IdeFocusManager.getInstance(project).requestFocus(myPropertyTable, true);
}
});
}
public void setArea(@Nullable DesignerEditorPanel designer, @Nullable EditableArea area) {
PropertyTableTab[] tabs = designer == null ? null : designer.getPropertyTableTabs();
if (!Comparing.equal(myTabs, tabs)) {
myTabs = tabs;
myTabPanel.removeAll();
if (tabs != null && tabs.length > 1) {
if (!ArrayUtil.contains(myCurrentTab, tabs)) {
myCurrentTab = tabs[0];
}
for (PropertyTableTab tab : tabs) {
myTabPanel.add(new TableTabAction(this, tab).getButton());
}
}
else {
myCurrentTab = null;
}
myTitleLabel.setVisible(myCurrentTab == null);
myTabPanel.revalidate();
}
TablePanelActionPolicy policy = designer == null ? TablePanelActionPolicy.EMPTY : designer.getTablePanelActionPolicy();
if (!Comparing.equal(myActionPolicy, policy)) {
myActionPolicy = policy;
for (AnAction action : myActions) {
if (action instanceof Separator) {
continue;
}
boolean visible = policy.showAction(action);
Presentation presentation = action.getTemplatePresentation();
presentation.setVisible(visible);
JComponent button = (JComponent)presentation.getClientProperty(BUTTON_KEY);
if (button != null) {
button.setVisible(visible);
}
}
myActionPanel.revalidate();
}
myPropertyTable.setArea(designer, area);
}
public RadPropertyTable getPropertyTable() {
return myPropertyTable;
}
@Nullable
public PropertyTableTab getCurrentTab() {
return myCurrentTab;
}
public void setCurrentTab(@NotNull PropertyTableTab currentTab) {
myCurrentTab = currentTab;
for (Component component : myTabPanel.getComponents()) {
ActionButton button = (ActionButton)component;
TableTabAction action = (TableTabAction)button.getAction();
action.updateState();
}
myPropertyTable.update();
}
@Override
public void valueChanged(ListSelectionEvent e) {
updateActions();
}
public void updateActions() {
for (AnAction action : myActions) {
if (action instanceof IPropertyTableAction) {
((IPropertyTableAction)action).update();
}
}
}
}