diff options
Diffstat (limited to 'platform/platform-api/src/com/intellij/openapi/ui')
7 files changed, 289 insertions, 27 deletions
diff --git a/platform/platform-api/src/com/intellij/openapi/ui/Banner.java b/platform/platform-api/src/com/intellij/openapi/ui/Banner.java index 3f4a92aec5ff..8dbe02228bae 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/Banner.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/Banner.java @@ -16,6 +16,8 @@ package com.intellij.openapi.ui; import com.intellij.icons.AllIcons; +import com.intellij.openapi.options.OptionsBundle; +import com.intellij.openapi.project.Project; import com.intellij.ui.components.labels.LinkLabel; import com.intellij.ui.components.labels.LinkListener; import com.intellij.ui.components.panels.NonOpaquePanel; @@ -35,7 +37,7 @@ import java.util.Set; class Banner extends NonOpaquePanel implements PropertyChangeListener{ private int myBannerMinHeight; private final JComponent myText = new MyText(); - + private final JLabel myProjectIcon = new JLabel(AllIcons.General.ProjectConfigurableBanner, SwingConstants.LEFT); private final NonOpaquePanel myActionsPanel = new NonOpaquePanel(new FlowLayout(FlowLayout.RIGHT, 2, 2)); private final Map<Action, LinkLabel> myActions = new HashMap<Action, LinkLabel>(); @@ -45,7 +47,10 @@ class Banner extends NonOpaquePanel implements PropertyChangeListener{ setBorder(new EmptyBorder(2, 6, 2, 4)); - add(myText, BorderLayout.CENTER); + myProjectIcon.setVisible(false); + myProjectIcon.setBorder(new EmptyBorder(0, 12, 0, 4)); + add(myText, BorderLayout.WEST); + add(myProjectIcon, BorderLayout.CENTER); add(myActionsPanel, BorderLayout.EAST); } @@ -112,6 +117,17 @@ class Banner extends NonOpaquePanel implements PropertyChangeListener{ repaint(); } + public void forProject(Project project) { + if (project != null) { + myProjectIcon.setVisible(true); + myProjectIcon.setText(OptionsBundle.message(project.isDefault() + ? "configurable.default.project.tooltip" + : "configurable.current.project.tooltip")); + } else { + myProjectIcon.setVisible(false); + } + } + public void setText(@NotNull final String... text) { myText.removeAll(); for (int i = 0; i < text.length; i++) { diff --git a/platform/platform-api/src/com/intellij/openapi/ui/ComboBoxTableRenderer.java b/platform/platform-api/src/com/intellij/openapi/ui/ComboBoxTableRenderer.java index 5d2ecafb1b7e..c02f27af5d4b 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/ComboBoxTableRenderer.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/ComboBoxTableRenderer.java @@ -46,6 +46,7 @@ public class ComboBoxTableRenderer<T> extends JLabel implements TableCellRendere private WeakReference<ListPopup> myPopupRef; private ChangeEvent myChangeEvent = null; private T myValue; + private boolean myPaintArrow = true; protected EventListenerList myListenerList = new EventListenerList(); @@ -80,6 +81,10 @@ public class ComboBoxTableRenderer<T> extends JLabel implements TableCellRendere return null; } + public void setPaintArrow(final boolean paintArrow) { + myPaintArrow = paintArrow; + } + protected Runnable onChosen(@NotNull final T value) { stopCellEditing(value); @@ -94,7 +99,7 @@ public class ComboBoxTableRenderer<T> extends JLabel implements TableCellRendere protected void paintComponent(Graphics g) { super.paintComponent(g); - if (!StringUtil.isEmpty(getText())) { + if (!StringUtil.isEmpty(getText()) && myPaintArrow) { final Rectangle r = getBounds(); final Insets i = getInsets(); final int x = r.width - i.right - AllIcons.General.ArrowDown.getIconWidth(); diff --git a/platform/platform-api/src/com/intellij/openapi/ui/DetailsComponent.java b/platform/platform-api/src/com/intellij/openapi/ui/DetailsComponent.java index 34aaa93d2741..463d950ae900 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/DetailsComponent.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/DetailsComponent.java @@ -16,7 +16,7 @@ package com.intellij.openapi.ui; -import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.project.Project; import com.intellij.ui.components.panels.NonOpaquePanel; import com.intellij.ui.components.panels.Wrapper; import com.intellij.util.ArrayUtil; @@ -45,15 +45,21 @@ public class DetailsComponent { private final NonOpaquePanel myBanner; private String[] myBannerText; - private boolean myDetailsEnabled = !Registry.is("ide.new.project.settings"); + private boolean myDetailsEnabled; private String[] myPrefix; private String[] myText; private final Wrapper myContentGutter = new Wrapper(); - private boolean myPaintBorder = !Registry.is("ide.new.project.settings"); + private boolean myPaintBorder; public DetailsComponent() { + this(true, true); + } + + public DetailsComponent(boolean detailsEnabled, boolean paintBorder) { + myDetailsEnabled = detailsEnabled; + myPaintBorder = paintBorder; myComponent = new JPanel(new BorderLayout()) { @Override protected void paintComponent(final Graphics g) { @@ -110,7 +116,7 @@ public class DetailsComponent { myBanner = new NonOpaquePanel(new BorderLayout()); myBannerLabel = new Banner(); - if (!Registry.is("ide.new.project.settings")) { + if (myDetailsEnabled) { myBanner.add(myBannerLabel, BorderLayout.CENTER); } @@ -174,6 +180,9 @@ public class DetailsComponent { } } + public void forProject(Project project) { + myBannerLabel.forProject(project); + } public void setPrefix(@Nullable String... prefix) { myPrefix = prefix; diff --git a/platform/platform-api/src/com/intellij/openapi/ui/FixedComboBoxEditor.java b/platform/platform-api/src/com/intellij/openapi/ui/FixedComboBoxEditor.java index 25c52c75b077..6ef25dddb5bc 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/FixedComboBoxEditor.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/FixedComboBoxEditor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2014 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,6 +17,7 @@ package com.intellij.openapi.ui; import com.intellij.openapi.util.SystemInfo; import com.intellij.ui.Gray; +import com.intellij.util.ReflectionUtil; import com.intellij.util.ui.MacUIUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; @@ -34,7 +35,6 @@ import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.lang.reflect.Field; import java.lang.reflect.Method; /** @@ -118,17 +118,7 @@ public class FixedComboBoxEditor implements ComboBoxEditor { final ComboBoxUI ui = comboBox.getUI(); ComboPopup popup = null; if (ui instanceof BasicComboBoxUI) { - try { - final Field popupField = BasicComboBoxUI.class.getDeclaredField("popup"); - popupField.setAccessible(true); - popup = (ComboPopup)popupField.get(ui); - } - catch (NoSuchFieldException e1) { - popup = null; - } - catch (IllegalAccessException e1) { - popup = null; - } + popup = ReflectionUtil.getField(BasicComboBoxUI.class, ui, ComboPopup.class, "popup"); } return popup; diff --git a/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java b/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java index 816349ed1c37..6c13964d5789 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java @@ -111,7 +111,7 @@ public abstract class MasterDetailsComponent implements Configurable, DetailsCom protected MyNode myRoot = new MyRootNode(); protected Tree myTree = new Tree(); - private final DetailsComponent myDetails = new DetailsComponent(); + private final DetailsComponent myDetails = new DetailsComponent(!Registry.is("ide.new.project.settings"), !Registry.is("ide.new.project.settings")); protected JPanel myWholePanel; public JPanel myNorthPanel = new JPanel(new BorderLayout()); @@ -131,12 +131,9 @@ public abstract class MasterDetailsComponent implements Configurable, DetailsCom protected MasterDetailsComponent(MasterDetailsState state) { myState = state; - mySplitter = new JBSplitter(false, .2f); + mySplitter = Registry.is("ide.new.project.settings") ? new OnePixelSplitter(false, .2f) : new JBSplitter(false, .2f); mySplitter.setSplitterProportionKey("ProjectStructure.SecondLevelElements"); mySplitter.setHonorComponentsMinimumSize(true); - if (Registry.is("ide.new.project.settings")) { - mySplitter.setOnePixelMode(); - } installAutoScroll(); reInitWholePanelIfNeeded(); @@ -300,6 +297,7 @@ public abstract class MasterDetailsComponent implements Configurable, DetailsCom @NotNull public JComponent createComponent() { + myTree.updateUI(); reInitWholePanelIfNeeded(); updateSelectionFromTree(); @@ -962,7 +960,11 @@ public abstract class MasterDetailsComponent implements Configurable, DetailsCom myPreselection != null ? myPreselection.getDefaultIndex() : 0, true); final ListPopup listPopup = popupFactory.createListPopup(step); listPopup.setHandleAutoSelectionBeforeShow(true); - listPopup.showUnderneathOf(myNorthPanel); + if (e instanceof AnActionButton.AnActionEventWrapper) { + ((AnActionButton.AnActionEventWrapper)e).showPopup(listPopup); + } else { + listPopup.showUnderneathOf(myNorthPanel); + } } } diff --git a/platform/platform-api/src/com/intellij/openapi/ui/NamedConfigurable.java b/platform/platform-api/src/com/intellij/openapi/ui/NamedConfigurable.java index 12b84f8db465..e619473197e7 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/NamedConfigurable.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/NamedConfigurable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 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. @@ -18,10 +18,12 @@ package com.intellij.openapi.ui; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.options.Configurable; +import com.intellij.openapi.util.registry.Registry; import com.intellij.ui.DocumentAdapter; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import javax.swing.border.EmptyBorder; import javax.swing.event.DocumentEvent; import java.awt.*; @@ -55,6 +57,11 @@ public abstract class NamedConfigurable<T> implements Configurable { } }); } + if (Registry.is("ide.new.project.settings")) { + myNamePanel.setBorder(new EmptyBorder(10, 10, 6, 10)); + } else { + myNamePanel.setBorder(new EmptyBorder(0,0,0,0)); + } } public boolean isNameEditable() { diff --git a/platform/platform-api/src/com/intellij/openapi/ui/OnePixelDivider.java b/platform/platform-api/src/com/intellij/openapi/ui/OnePixelDivider.java new file mode 100644 index 000000000000..2b0097005dc1 --- /dev/null +++ b/platform/platform-api/src/com/intellij/openapi/ui/OnePixelDivider.java @@ -0,0 +1,233 @@ +/* + * Copyright 2000-2014 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.openapi.ui; + +import com.intellij.openapi.Disposable; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.util.Weighted; +import com.intellij.openapi.wm.IdeGlassPane; +import com.intellij.openapi.wm.IdeGlassPaneUtil; +import com.intellij.ui.Gray; +import com.intellij.ui.JBColor; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * @author Konstantin Bulenkov + */ +public class OnePixelDivider extends Divider { + private boolean myVertical; + private Splitter mySplitter; + private boolean myResizeEnabled; + private boolean mySwitchOrientationEnabled; + protected Point myPoint; + private IdeGlassPane myGlassPane; + private final MouseAdapter myListener = new MyMouseAdapter(); + private Disposable myDisposable; + + public OnePixelDivider(boolean vertical, Splitter splitter) { + super(new GridBagLayout()); + mySplitter = splitter; + myResizeEnabled = true; + mySwitchOrientationEnabled = false; + setFocusable(false); + enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK); + //setOpaque(false); + setOrientation(vertical); + setBackground(new JBColor(Gray._153.withAlpha(128), Gray._100.withAlpha(128))); + } + + @Override + public void addNotify() { + super.addNotify(); + init(); + } + + @Override + public void removeNotify() { + super.removeNotify(); + if (myDisposable != null && !Disposer.isDisposed(myDisposable)) { + Disposer.dispose(myDisposable); + } + } + + private boolean dragging = false; + private class MyMouseAdapter extends MouseAdapter implements Weighted { + @Override + public void mousePressed(MouseEvent e) { + dragging = isInDragZone(e); + _processMouseEvent(e); + } + + boolean isInDragZone(MouseEvent e) { + final MouseEvent event = getTargetEvent(e); + final Point p = event.getPoint(); + final int r = Math.abs(isVertical() ? p.y : p.x); + return r < 6; + } + + @Override + public void mouseReleased(MouseEvent e) { + _processMouseEvent(e); + dragging = false; + } + + @Override + public void mouseMoved(MouseEvent e) { + final OnePixelDivider divider = OnePixelDivider.this; + if (isInDragZone(e)) { + myGlassPane.setCursor(divider.getCursor(), divider); + } else { + myGlassPane.setCursor(null, divider); + } + _processMouseMotionEvent(e); + } + + @Override + public void mouseDragged(MouseEvent e) { + _processMouseMotionEvent(e); + } + @Override + public double getWeight() { + return 1; + } + private void _processMouseMotionEvent(MouseEvent e) { + MouseEvent event = getTargetEvent(e); + if (event == null) { + myGlassPane.setCursor(null, myListener); + return; + } + + processMouseMotionEvent(event); + if (event.isConsumed()) { + e.consume(); + } + } + + private void _processMouseEvent(MouseEvent e) { + MouseEvent event = getTargetEvent(e); + if (event == null) { + myGlassPane.setCursor(null, myListener); + return; + } + + processMouseEvent(event); + if (event.isConsumed()) { + e.consume(); + } + } + } + + private MouseEvent getTargetEvent(MouseEvent e) { + return SwingUtilities.convertMouseEvent(e.getComponent(), e, this); + } + + private void init() { + myGlassPane = IdeGlassPaneUtil.find(this); + myDisposable = Disposer.newDisposable(); + myGlassPane.addMouseMotionPreprocessor(myListener, myDisposable); + myGlassPane.addMousePreprocessor(myListener, myDisposable); + } + + public void setOrientation(boolean vertical) { + removeAll(); + myVertical = vertical; + final int cursorType = isVertical() ? Cursor.N_RESIZE_CURSOR : Cursor.W_RESIZE_CURSOR; + setCursor(Cursor.getPredefinedCursor(cursorType)); + } + + @Override + protected void processMouseMotionEvent(MouseEvent e) { + super.processMouseMotionEvent(e); + if (!myResizeEnabled) return; + if (MouseEvent.MOUSE_DRAGGED == e.getID() && dragging) { + myPoint = SwingUtilities.convertPoint(this, e.getPoint(), mySplitter); + float proportion; + final float firstMinProportion = getMinProportion(mySplitter.getFirstComponent()); + final float secondMinProportion = getMinProportion(mySplitter.getSecondComponent()); + if (isVertical()) { + if (getHeight() > 0) { + proportion = Math.min(1.0f, Math + .max(.0f, Math.min(Math.max(firstMinProportion, (float)myPoint.y / (float)mySplitter.getHeight()), 1 - secondMinProportion))); + mySplitter.setProportion(proportion); + } + } + else { + if (getWidth() > 0) { + proportion = Math.min(1.0f, Math.max(.0f, Math.min( + Math.max(firstMinProportion, (float)myPoint.x / (float)mySplitter.getWidth()), 1 - secondMinProportion))); + mySplitter.setProportion(proportion); + } + } + } + } + + private float getMinProportion(JComponent component) { + if (component != null && + mySplitter.getFirstComponent() != null && + mySplitter.getFirstComponent().isVisible() && + mySplitter.getSecondComponent() != null && + mySplitter.getSecondComponent().isVisible()) { + if (isVertical()) { + return (float)component.getMinimumSize().height / (float)(mySplitter.getHeight() - 1); + } else { + return (float)component.getMinimumSize().width / (float)(mySplitter.getWidth() - 1); + } + } + + return 0.0f; + } + + @Override + protected void processMouseEvent(MouseEvent e) { + super.processMouseEvent(e); + if (e.getID() == MouseEvent.MOUSE_CLICKED) { + if (mySwitchOrientationEnabled + && e.getClickCount() == 1 + && SwingUtilities.isLeftMouseButton(e) && (SystemInfo.isMac ? e.isMetaDown() : e.isControlDown())) { + mySplitter.setOrientation(!mySplitter.getOrientation()); + } + if (myResizeEnabled && e.getClickCount() == 2) { + mySplitter.setProportion(.5f); + } + } + } + + public void setResizeEnabled(boolean resizeEnabled) { + myResizeEnabled = resizeEnabled; + if (!myResizeEnabled) { + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + else { + setCursor(isVertical() ? + Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR) : + Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR)); + } + } + + public void setSwitchOrientationEnabled(boolean switchOrientationEnabled) { + mySwitchOrientationEnabled = switchOrientationEnabled; + } + + + public boolean isVertical() { + return myVertical; + } +} |