diff --git a/platform/lang-impl/src/com/intellij/ide/structureView/impl/TemplateLanguageStructureViewBuilder.java b/platform/lang-impl/src/com/intellij/ide/structureView/impl/TemplateLanguageStructureViewBuilder.java index 53b2d3bdd88c..6a2e4ee20f9d 100644 --- a/platform/lang-impl/src/com/intellij/ide/structureView/impl/TemplateLanguageStructureViewBuilder.java +++ b/platform/lang-impl/src/com/intellij/ide/structureView/impl/TemplateLanguageStructureViewBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * 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. @@ -17,11 +17,9 @@ package com.intellij.ide.structureView.impl; import com.intellij.ide.IdeBundle; import com.intellij.ide.impl.StructureViewWrapperImpl; -import com.intellij.ide.structureView.StructureView; -import com.intellij.ide.structureView.StructureViewBuilder; -import com.intellij.ide.structureView.StructureViewFactoryEx; -import com.intellij.ide.structureView.StructureViewWrapper; +import com.intellij.ide.structureView.*; import com.intellij.ide.structureView.newStructureView.StructureViewComponent; +import com.intellij.ide.util.treeView.smartTree.TreeElement; import com.intellij.lang.Language; import com.intellij.lang.LanguageStructureViewBuilder; import com.intellij.lang.PsiStructureViewFactory; @@ -96,7 +94,7 @@ public abstract class TemplateLanguageStructureViewBuilder implements StructureV if (structureViewWrapper == null) return; Language baseLanguage = provider.getTemplateDataLanguage(); - if (baseLanguage == myTemplateDataLanguage) { + if (baseLanguage == myTemplateDataLanguage && isPsiValid()) { updateBaseLanguageView(); } else { @@ -115,6 +113,23 @@ public abstract class TemplateLanguageStructureViewBuilder implements StructureV PsiManager.getInstance(myProject).addPsiTreeChangeListener(myPsiTreeChangeAdapter); } + private boolean isPsiValid() { + final StructureViewComponent view = (StructureViewComponent)myBaseStructureViewDescriptor.structureView; + if (view.isDisposed()) return false; + + final Object root = view.getTreeStructure().getRootElement(); + if (root instanceof StructureViewComponent.StructureViewTreeElementWrapper) { + final TreeElement value = ((StructureViewComponent.StructureViewTreeElementWrapper)root).getValue(); + if (value instanceof StructureViewTreeElement) { + final Object psi = ((StructureViewTreeElement)value).getValue(); + if (psi instanceof PsiElement) { + return ((PsiElement)psi).isValid(); + } + } + } + return true; + } + @Nullable private TemplateLanguageFileViewProvider getViewProvider() { final FileViewProvider provider = PsiManager.getInstance(myProject).findViewProvider(myVirtualFile); diff --git a/plugins/android/src/org/jetbrains/android/dom/attrs/AttributeDefinition.java b/plugins/android/src/org/jetbrains/android/dom/attrs/AttributeDefinition.java index b0b8af08645c..eb9ba6db9eb0 100644 --- a/plugins/android/src/org/jetbrains/android/dom/attrs/AttributeDefinition.java +++ b/plugins/android/src/org/jetbrains/android/dom/attrs/AttributeDefinition.java @@ -17,6 +17,7 @@ package org.jetbrains.android.dom.attrs; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -27,7 +28,8 @@ public class AttributeDefinition { private final String myName; private final Set myFormats = EnumSet.noneOf(AttributeFormat.class); private final List myValues = new ArrayList(); - + private String myDocValue; + public AttributeDefinition(@NotNull String name) { myName = name; } @@ -60,6 +62,20 @@ public class AttributeDefinition { return ArrayUtil.toStringArray(myValues); } + @Nullable + public String getDocValue() { + return myDocValue; + } + + public void addDocValue(String docValue) { + if (myDocValue == null) { + myDocValue = docValue; + } + else { + myDocValue += "\n" + docValue; + } + } + @Override public String toString() { return myName + " [" + myFormats + ']'; diff --git a/plugins/android/src/org/jetbrains/android/dom/attrs/AttributeDefinitions.java b/plugins/android/src/org/jetbrains/android/dom/attrs/AttributeDefinitions.java index 6de75aa7e727..9007ed6030e2 100644 --- a/plugins/android/src/org/jetbrains/android/dom/attrs/AttributeDefinitions.java +++ b/plugins/android/src/org/jetbrains/android/dom/attrs/AttributeDefinitions.java @@ -17,10 +17,14 @@ package org.jetbrains.android.dom.attrs; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiElement; +import com.intellij.psi.xml.XmlComment; import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.util.containers.HashMap; +import com.intellij.xml.util.XmlUtil; +import com.intellij.xml.util.documentation.XmlDocumentationProvider; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -109,10 +113,21 @@ public class AttributeDefinitions { myAttrs.put(def.getName(), def); } def.addFormats(formats); + parseDocComment(tag, def); parseAndAddValues(def, values); return def; } + private static void parseDocComment(XmlTag tag, AttributeDefinition def) { + PsiElement comment = XmlDocumentationProvider.findPreviousComment(tag); + if (comment != null) { + String docValue = XmlUtil.getCommentText((XmlComment)comment); + if (!StringUtil.isEmpty(docValue)) { + def.addDocValue(docValue); + } + } + } + private static List parseAttrFormat(String formatString) { List result = new ArrayList(); final String[] formats = formatString.split("\\|"); diff --git a/plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml b/plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml index 0530b8a816cc..e63d9004a977 100644 --- a/plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml +++ b/plugins/ui-designer/ui-designer-new/src/META-INF/plugin.xml @@ -15,12 +15,13 @@ - - - - - - + + + + diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/DesignerToolWindowManager.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/DesignerToolWindowManager.java index 2294f89ddf76..a030df6bc597 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/DesignerToolWindowManager.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/DesignerToolWindowManager.java @@ -19,6 +19,7 @@ import com.intellij.designer.componentTree.ComponentTree; import com.intellij.designer.componentTree.ComponentTreeBuilder; import com.intellij.designer.componentTree.TreeEditableArea; import com.intellij.designer.designSurface.DesignerEditorPanel; +import com.intellij.designer.propertyTable.PropertyTable; import com.intellij.designer.propertyTable.PropertyTablePanel; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -155,6 +156,10 @@ public final class DesignerToolWindowManager implements ProjectComponent { return editors.length > 0 ? getDesigner(editors[0]) : null; } + public PropertyTable getPropertyTable() { + return myPropertyTablePanel.getPropertyTable(); + } + private void bindToDesigner(final DesignerEditorPanel designer) { myWindowQueue.cancelAllUpdates(); myWindowQueue.queue(new Update("update") { diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/DesignerActionPanel.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/DesignerActionPanel.java index 8a381e3b2c43..200f2ec2c714 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/DesignerActionPanel.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/DesignerActionPanel.java @@ -25,6 +25,7 @@ import com.intellij.ui.SideBorder; import org.jetbrains.annotations.NonNls; import javax.swing.*; +import java.awt.event.KeyEvent; import java.util.List; /** @@ -32,11 +33,11 @@ import java.util.List; */ public class DesignerActionPanel implements DataProvider { public static final String TOOLBAR = "DesignerToolbar"; - public static final String POPUP = "DesignerPopup"; private final DefaultActionGroup myActionGroup = new DefaultActionGroup(); private final DefaultActionGroup myStaticGroup = new DefaultActionGroup(); private final DefaultActionGroup myDynamicGroup = new DefaultActionGroup(); + private final DefaultActionGroup myPopupGroup = new DefaultActionGroup(); private JComponent myToolbar; private final DesignerEditorPanel myDesigner; private final CommonEditActionsProvider myCommonEditActionsProvider; @@ -50,14 +51,37 @@ public class DesignerActionPanel implements DataProvider { myActionGroup.add(myStaticGroup); myActionGroup.add(myDynamicGroup); - ActionToolbar actionToolbar = ActionManager.getInstance().createActionToolbar(TOOLBAR, myActionGroup, true); + ActionManager actionManager = ActionManager.getInstance(); + ActionToolbar actionToolbar = actionManager.createActionToolbar(TOOLBAR, myActionGroup, true); actionToolbar.setLayoutPolicy(ActionToolbar.WRAP_LAYOUT_POLICY); myToolbar = actionToolbar.getComponent(); myToolbar.setBorder(IdeBorderFactory.createBorder(SideBorder.BOTTOM)); myToolbar.setVisible(false); - registerAction(new SelectAllAction(designer.getSurfaceArea()), "$SelectAll"); + AnAction selectParent = new AnAction("Select Parent", "Select Parent", null) { + @Override + public void actionPerformed(AnActionEvent e) { + myDesigner.getToolProvider().processKeyEvent(new KeyEvent(myDesigner.getSurfaceArea().getNativeComponent(), + KeyEvent.KEY_PRESSED, 0, 0, + KeyEvent.VK_ESCAPE, + (char)KeyEvent.VK_ESCAPE), + myDesigner.getSurfaceArea()); + } + }; + selectParent.registerCustomShortcutSet(KeyEvent.VK_ESCAPE, 0, null); + + SelectAllAction selectAllAction = new SelectAllAction(designer.getSurfaceArea()); + registerAction(selectAllAction, "$SelectAll"); + + myPopupGroup.add(actionManager.getAction("$Cut")); + myPopupGroup.add(actionManager.getAction("$Copy")); + myPopupGroup.add(actionManager.getAction("$Paste")); + myPopupGroup.addSeparator(); + myPopupGroup.add(actionManager.getAction("$Delete")); + myPopupGroup.addSeparator(); + myPopupGroup.add(selectParent); + myPopupGroup.add(selectAllAction); designer.getSurfaceArea().addSelectionListener(new ComponentSelectionListener() { @Override @@ -65,8 +89,6 @@ public class DesignerActionPanel implements DataProvider { updateSelectionActions(area.getSelection()); } }); - - // TODO: support popup } private void registerAction(AnAction action, @NonNls String actionId) { @@ -132,6 +154,10 @@ public class DesignerActionPanel implements DataProvider { } } + public ActionGroup getPopupActions() { + return myPopupGroup; + } + @Override public Object getData(@NonNls String dataId) { if (PlatformDataKeys.DELETE_ELEMENT_PROVIDER.is(dataId) || diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/SelectAllAction.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/SelectAllAction.java index 944e2566307e..a58bfa0f5ec4 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/SelectAllAction.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/actions/SelectAllAction.java @@ -31,6 +31,7 @@ public class SelectAllAction extends AnAction { private final EditableArea myArea; public SelectAllAction(EditableArea area) { + super("Select All", "Select All", null); myArea = area; } diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java index bf2844ab6226..80b8c7b3eb6b 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTree.java @@ -18,9 +18,8 @@ package com.intellij.designer.componentTree; import com.intellij.designer.actions.DesignerActionPanel; import com.intellij.designer.designSurface.FeedbackTreeLayer; import com.intellij.designer.model.RadComponent; -import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.ui.ColoredTreeCellRenderer; -import com.intellij.ui.PopupHandler; import com.intellij.ui.treeStructure.Tree; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NonNls; @@ -56,10 +55,6 @@ public final class ComponentTree extends Tree implements DataProvider { // Install convenient keyboard navigation TreeUtil.installActions(this); - PopupHandler - .installPopupHandler(this, (ActionGroup)ActionManager.getInstance().getAction("UIDesigner.ComponentTreePopupMenu"), - ActionPlaces.GUI_DESIGNER_COMPONENT_TREE_POPUP, ActionManager.getInstance()); - // TODO: F2 should start inplace editing } diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTreeBuilder.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTreeBuilder.java index 90ba8e957d45..e5fecc7c0cd3 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTreeBuilder.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/ComponentTreeBuilder.java @@ -19,6 +19,7 @@ import com.intellij.designer.designSurface.ComponentSelectionListener; import com.intellij.designer.designSurface.DesignerEditorPanel; import com.intellij.designer.designSurface.EditableArea; import com.intellij.ide.util.treeView.AbstractTreeBuilder; +import com.intellij.openapi.actionSystem.ActionGroup; import javax.swing.tree.DefaultTreeModel; @@ -39,7 +40,12 @@ public final class ComponentTreeBuilder extends AbstractTreeBuilder implements C initRootNode(); mySurfaceArea = designer.getSurfaceArea(); - myTreeArea = new TreeEditableArea(tree, this); + myTreeArea = new TreeEditableArea(tree, this) { + @Override + public ActionGroup getPopupActions() { + return mySurfaceArea.getPopupActions(); + } + }; myGlassLayer = new TreeGlassLayer(tree, designer.getToolProvider(), myTreeArea); myExpandStateHandler = new ExpandStateHandler(tree, designer, this); diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/TreeEditableArea.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/TreeEditableArea.java index 2911bb720fb3..067cec734dc9 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/TreeEditableArea.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/componentTree/TreeEditableArea.java @@ -19,6 +19,7 @@ import com.intellij.designer.designSurface.*; import com.intellij.designer.designSurface.tools.InputTool; import com.intellij.designer.model.RadComponent; import com.intellij.ide.util.treeView.AbstractTreeBuilder; +import com.intellij.openapi.actionSystem.ActionPlaces; import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -36,7 +37,7 @@ import java.util.List; /** * @author Alexander Lobas */ -public final class TreeEditableArea implements EditableArea, FeedbackTreeLayer, TreeSelectionListener { +public abstract class TreeEditableArea implements EditableArea, FeedbackTreeLayer, TreeSelectionListener { private final EventListenerList myListenerList = new EventListenerList(); private final ComponentTree myTree; private final AbstractTreeBuilder myTreeBuilder; @@ -238,6 +239,11 @@ public final class TreeEditableArea implements EditableArea, FeedbackTreeLayer, return this; } + @Override + public String getPopupPlace() { + return ActionPlaces.GUI_DESIGNER_COMPONENT_TREE_POPUP; + } + ////////////////////////////////////////////////////////////////////////////////////////// // // FeedbackTreeLayer diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/CaptionPanel.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/CaptionPanel.java index 724960490297..a9b3e8dda142 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/CaptionPanel.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/CaptionPanel.java @@ -21,9 +21,7 @@ import com.intellij.designer.model.FindComponentVisitor; import com.intellij.designer.model.RadComponent; import com.intellij.designer.model.RadVisualComponent; import com.intellij.ide.DeleteProvider; -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.openapi.actionSystem.DataProvider; -import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.actionSystem.*; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.SideBorder; import com.intellij.util.containers.IntArrayList; @@ -50,6 +48,7 @@ public class CaptionPanel extends JLayeredPane implements DataProvider, DeletePr private final EditableArea myArea; private final DecorationLayer myDecorationLayer; private final FeedbackLayer myFeedbackLayer; + private DefaultActionGroup myActionGroup; private final CommonEditActionsProvider myActionsProvider; private final RadVisualComponent myRootComponent; private List myRootChildren = Collections.emptyList(); @@ -125,6 +124,20 @@ public class CaptionPanel extends JLayeredPane implements DataProvider, DeletePr public RadComponent getRootComponent() { return myRootComponent; } + + @Override + public ActionGroup getPopupActions() { + if (myActionGroup == null) { + myActionGroup = new DefaultActionGroup(); + myActionGroup.add(ActionManager.getInstance().getAction("$Delete")); + } + return myActionGroup; + } + + @Override + public String getPopupPlace() { + return "UIDesigner.CaptionPanel"; + } }; add(new GlassLayer(designer.getToolProvider(), myArea), DesignerEditorPanel.LAYER_GLASS); diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/DesignerEditorPanel.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/DesignerEditorPanel.java index 123c06d9be67..f46df3e4126b 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/DesignerEditorPanel.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/DesignerEditorPanel.java @@ -28,7 +28,7 @@ import com.intellij.designer.propertyTable.Property; import com.intellij.diagnostic.LogMessageEx; import com.intellij.diagnostic.errordialog.Attachment; import com.intellij.ide.palette.impl.PaletteManager; -import com.intellij.openapi.actionSystem.DataProvider; +import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; @@ -183,6 +183,16 @@ public abstract class DesignerEditorPanel extends JPanel implements DataProvider public RadComponent getRootComponent() { return myRootComponent; } + + @Override + public ActionGroup getPopupActions() { + return myActionPanel.getPopupActions(); + } + + @Override + public String getPopupPlace() { + return ActionPlaces.GUI_DESIGNER_EDITOR_POPUP; + } }; myPaletteListener = new ListSelectionListener() { diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/EditableArea.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/EditableArea.java index 6e583aa4f587..285dfec7b781 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/EditableArea.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/EditableArea.java @@ -17,6 +17,7 @@ package com.intellij.designer.designSurface; import com.intellij.designer.designSurface.tools.InputTool; import com.intellij.designer.model.RadComponent; +import com.intellij.openapi.actionSystem.ActionGroup; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -52,6 +53,7 @@ public interface EditableArea { void setSelection(@NotNull List components); void deselectAll(); + ////////////////////////////////////////////////////////////////////////////////////////// // // Visual @@ -86,4 +88,8 @@ public interface EditableArea { @Nullable FeedbackTreeLayer getFeedbackTreeLayer(); + + ActionGroup getPopupActions(); + + String getPopupPlace(); } \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/tools/SelectionTool.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/tools/SelectionTool.java index 6e36fe52c841..466a829ac9a1 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/tools/SelectionTool.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/designSurface/tools/SelectionTool.java @@ -17,6 +17,8 @@ package com.intellij.designer.designSurface.tools; import com.intellij.designer.designSurface.EditableArea; import com.intellij.designer.model.RadComponent; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.ActionPopupMenu; import org.jetbrains.annotations.Nullable; import java.awt.event.KeyEvent; @@ -136,6 +138,11 @@ public class SelectionTool extends InputTool { myTracker.mouseUp(event, area); } super.mouseUp(event, area); + if (event.isPopupTrigger()) { + ActionManager actionManager = ActionManager.getInstance(); + ActionPopupMenu popupMenu = actionManager.createActionPopupMenu(area.getPopupPlace(), area.getPopupActions()); + popupMenu.getComponent().show(area.getNativeComponent(), event.getX(), event.getY()); + } } @Override diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTable.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTable.java index e4c9310dd20a..397f6b5ab633 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTable.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTable.java @@ -20,7 +20,6 @@ import com.intellij.designer.designSurface.ComponentSelectionListener; import com.intellij.designer.designSurface.DesignerEditorPanel; import com.intellij.designer.designSurface.EditableArea; import com.intellij.designer.model.RadComponent; -import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; @@ -32,7 +31,6 @@ import com.intellij.util.ThrowableRunnable; import com.intellij.util.ui.EmptyIcon; import com.intellij.util.ui.IndentedIcon; import com.intellij.util.ui.UIUtil; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -54,7 +52,7 @@ import java.util.List; /** * @author Alexander Lobas */ -public final class PropertyTable extends JBTable implements ComponentSelectionListener, DataProvider { +public final class PropertyTable extends JBTable implements ComponentSelectionListener { private static final Logger LOG = Logger.getInstance("#com.intellij.designer.propertyTable"); private final AbstractTableModel myModel = new PropertyTableModel(); @@ -91,8 +89,6 @@ public final class PropertyTable extends JBTable implements ComponentSelectionLi // TODO: ShowJavadocAction - // TODO: Popup menu - // TODO: Updates UI after LAF updated } @@ -136,11 +132,6 @@ public final class PropertyTable extends JBTable implements ComponentSelectionLi return myCellRenderer; } - @Override - public Object getData(@NonNls String dataId) { - return null; //To change body of implemented methods use File | Settings | File Templates. - } - ////////////////////////////////////////////////////////////////////////////////////////// // // @@ -395,7 +386,7 @@ public final class PropertyTable extends JBTable implements ComponentSelectionLi } @Nullable - private Property getSelectionProperty() { + public Property getSelectionProperty() { int selectedRow = getSelectedRow(); if (selectedRow >= 0 && selectedRow < myProperties.size()) { return myProperties.get(selectedRow); @@ -423,7 +414,7 @@ public final class PropertyTable extends JBTable implements ComponentSelectionLi return properties; } - private boolean isDefault(Property property) throws Exception { + public boolean isDefault(Property property) throws Exception { for (RadComponent component : myComponents) { if (!property.isDefaultValue(component)) { return false; diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java index 854c5ad1afcd..7aefd5b82cff 100644 --- a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/PropertyTablePanel.java @@ -16,22 +16,25 @@ package com.intellij.designer.propertyTable; import com.intellij.designer.DesignerBundle; +import com.intellij.designer.propertyTable.actions.IPropertyTableAction; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.impl.ActionButton; -import com.intellij.openapi.util.IconLoader; import com.intellij.ui.IdeBorderFactory; +import com.intellij.ui.PopupHandler; import com.intellij.ui.ScrollPaneFactory; import com.intellij.ui.SideBorder; import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; import java.awt.*; /** * @author Alexander Lobas */ -public final class PropertyTablePanel extends JPanel { - private final DefaultActionGroup myActionGroup = new DefaultActionGroup(); +public final class PropertyTablePanel extends JPanel implements ListSelectionListener { private final PropertyTable myPropertyTable = new PropertyTable(); + private final AnAction[] myActions; public PropertyTablePanel() { setLayout(new GridBagLayout()); @@ -40,46 +43,39 @@ public final class PropertyTablePanel extends JPanel { add(new JLabel(DesignerBundle.message("designer.properties.title")), new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(2, 5, 2, 0), 0, 0)); - createActions(); + ActionGroup actionGroup = (ActionGroup)ActionManager.getInstance().getAction("UIDesigner.PropertyTable"); - AnAction[] actions = myActionGroup.getChildren(null); - for (int i = 0; i < actions.length; i++) { - AnAction action = actions[i]; + PopupHandler.installPopupHandler(myPropertyTable, actionGroup, + ActionPlaces.GUI_DESIGNER_PROPERTY_INSPECTOR_POPUP, + ActionManager.getInstance()); + + myActions = actionGroup.getChildren(null); + for (int i = 0; i < myActions.length; i++) { + AnAction action = myActions[i]; add(new ActionButton(action, action.getTemplatePresentation(), ActionPlaces.UNKNOWN, ActionToolbar.DEFAULT_MINIMUM_BUTTON_SIZE), new GridBagConstraints(i + 1, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.NONE, - new Insets(2, 0, 2, i == actions.length - 1 ? 2 : 0), 0, 0)); + new Insets(2, 0, 2, i == myActions.length - 1 ? 2 : 0), 0, 0)); } + myPropertyTable.getSelectionModel().addListSelectionListener(this); + valueChanged(null); + JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myPropertyTable); scrollPane.setBorder(IdeBorderFactory.createBorder(SideBorder.TOP)); - add(scrollPane, new GridBagConstraints(0, 1, actions.length + 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, + add(scrollPane, new GridBagConstraints(0, 1, myActions.length + 1, 1, 1, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); } - private void createActions() { - String restore = DesignerBundle.message("designer.properties.restore_default"); - myActionGroup.add(new AnAction(restore, restore, IconLoader.getIcon("/actions/reset-to-default.png")) { - @Override - public void actionPerformed(AnActionEvent e) { - myPropertyTable.restoreDefaultValue(); - } - }); - - String expert = DesignerBundle.message("designer.properties.show.expert"); - myActionGroup.add(new ToggleAction(expert, expert, IconLoader.getIcon("/com/intellij/designer/icons/filter.png")) { - @Override - public boolean isSelected(AnActionEvent e) { - return myPropertyTable.isShowExpert(); - } - - @Override - public void setSelected(AnActionEvent e, boolean state) { - myPropertyTable.showExpert(state); - } - }); - } - public PropertyTable getPropertyTable() { return myPropertyTable; } + + @Override + public void valueChanged(ListSelectionEvent e) { + for (AnAction action : myActions) { + if (action instanceof IPropertyTableAction) { + ((IPropertyTableAction)action).update(myPropertyTable); + } + } + } } \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/IPropertyTableAction.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/IPropertyTableAction.java new file mode 100644 index 000000000000..c4585198cfc9 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/IPropertyTableAction.java @@ -0,0 +1,25 @@ +/* + * 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.actions; + +import com.intellij.designer.propertyTable.PropertyTable; + +/** + * @author Alexander Lobas + */ +public interface IPropertyTableAction { + void update(PropertyTable table); +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/RestoreDefault.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/RestoreDefault.java new file mode 100644 index 000000000000..1261283f1599 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/RestoreDefault.java @@ -0,0 +1,66 @@ +/* + * 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.actions; + +import com.intellij.designer.DesignerBundle; +import com.intellij.designer.DesignerToolWindowManager; +import com.intellij.designer.propertyTable.Property; +import com.intellij.designer.propertyTable.PropertyTable; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.util.IconLoader; + +/** + * @author Alexander Lobas + */ +public class RestoreDefault extends AnAction implements IPropertyTableAction { + public RestoreDefault() { + Presentation presentation = getTemplatePresentation(); + String text = DesignerBundle.message("designer.properties.restore_default"); + presentation.setText(text); + presentation.setDescription(text); + presentation.setIcon(IconLoader.getIcon("/actions/reset-to-default.png")); + } + + @Override + public void update(AnActionEvent e) { + PropertyTable table = DesignerToolWindowManager.getInstance(e.getProject()).getPropertyTable(); + setEnabled(table, e.getPresentation()); + } + + @Override + public void update(PropertyTable table) { + setEnabled(table, getTemplatePresentation()); + } + + private static void setEnabled(PropertyTable table, Presentation presentation) { + try { + Property property = table.getSelectionProperty(); + presentation.setEnabled(property != null && !table.isDefault(property)); + } + catch (Exception e) { + presentation.setEnabled(false); + } + } + + + @Override + public void actionPerformed(AnActionEvent e) { + PropertyTable table = DesignerToolWindowManager.getInstance(e.getProject()).getPropertyTable(); + table.restoreDefaultValue(); + } +} \ No newline at end of file diff --git a/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/ShowExpert.java b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/ShowExpert.java new file mode 100644 index 000000000000..7b972ff85967 --- /dev/null +++ b/plugins/ui-designer/ui-designer-new/src/com/intellij/designer/propertyTable/actions/ShowExpert.java @@ -0,0 +1,49 @@ +/* + * 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.actions; + +import com.intellij.designer.DesignerBundle; +import com.intellij.designer.DesignerToolWindowManager; +import com.intellij.designer.propertyTable.PropertyTable; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.actionSystem.ToggleAction; +import com.intellij.openapi.util.IconLoader; + +/** + * @author Alexander Lobas + */ +public class ShowExpert extends ToggleAction { + public ShowExpert() { + Presentation presentation = getTemplatePresentation(); + String text = DesignerBundle.message("designer.properties.show.expert"); + presentation.setText(text); + presentation.setDescription(text); + presentation.setIcon(IconLoader.getIcon("/com/intellij/designer/icons/filter.png")); + } + + @Override + public boolean isSelected(AnActionEvent e) { + PropertyTable table = DesignerToolWindowManager.getInstance(e.getProject()).getPropertyTable(); + return table.isShowExpert(); + } + + @Override + public void setSelected(AnActionEvent e, boolean state) { + PropertyTable table = DesignerToolWindowManager.getInstance(e.getProject()).getPropertyTable(); + table.showExpert(state); + } +} \ No newline at end of file diff --git a/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java b/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java index 127466c1495c..76ad3ac20bd8 100644 --- a/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java +++ b/xml/impl/src/com/intellij/xml/util/documentation/XmlDocumentationProvider.java @@ -248,7 +248,7 @@ public class XmlDocumentationProvider implements DocumentationProvider { } @Nullable - private static PsiElement findPreviousComment(final PsiElement element) { + public static PsiElement findPreviousComment(final PsiElement element) { PsiElement curElement = element; while(curElement!=null && !(curElement instanceof XmlComment)) {