Merge remote-tracking branch 'origin/master'

This commit is contained in:
Ilya.Kazakevich
2014-10-13 19:12:16 +04:00
35 changed files with 411 additions and 243 deletions
+1 -1
View File
@@ -191,7 +191,7 @@ libraryLicense(name: "Jaxen", version: "", license: "modified Apache", url: "htt
libraryLicense(name: "JavaHelp", version: "2.0_02", license: "included as license/javahelp_license.html in IntelliJ IDEA distribution", url: "http://java.sun.com/products/javahelp/")
libraryLicense(name: "Java-WebSocket", libraryName: "java_websocket.jar", version: "1.4.0 Trunk", license: "MIT", url: "https://github.com/TooTallNate/Java-WebSocket", licenseUrl:"https://github.com/TooTallNate/Java-WebSocket/blob/master/LICENSE")
libraryLicense(name: "Apache XML Graphics Commons", libraryName: "xmlgraphics-commons-1.3.1.jar", version: "1.3.1", license: "Apache 2.0", url: "http://xmlgraphics.apache.org/commons/", licenseUrl:"http://www.apache.org/licenses/LICENSE-2.0")
libraryLicense(name: "SnuggleTeX", libraryName: "snuggletex-core-1.3-SNAPSHOT.jar", version: "1.3 (with patches by JetBrains)", license: "BSD", url: "http://snuggletex.sourceforge.net/", licenseUrl:"http://snuggletex.sourceforge.net/maven/license.html")
libraryLicense(name: "SnuggleTeX", version: "1.3 (with patches by JetBrains)", license: "BSD", url: "http://snuggletex.sourceforge.net/", licenseUrl:"http://snuggletex.sourceforge.net/maven/license.html")
libraryLicense(name: "JEuclid", libraryName: "jeuclid-core-3.1.9.jar", version: "3.1.9", license: "Apache 2.0", url: "http://jeuclid.sourceforge.net", licenseUrl:"http://sourceforge.net/p/jeuclid/code/ci/default/tree/LICENSE.txt")
libraryLicense(name: "JCIP Annotations", libraryName: "jcip", license: "Creative Commons Attribution License", url: "http://www.jcip.net", licenseUrl: "http://creativecommons.org/licenses/by/2.5")
libraryLicense(name: "JDOM", version: "1.1 (with patches by JetBrains)", license: "modified Apache", url: "http://www.jdom.org/", licenseUrl: "http://www.jdom.org/docs/faq.html#a0030")
@@ -43,7 +43,10 @@ public class ShowStructureSettingsAction extends AnAction implements DumbAware {
if (project == null) {
project = ProjectManager.getInstance().getDefaultProject();
}
showDialog(project);
}
static void showDialog(Project project) {
if (Registry.is("ide.new.project.settings")) {
new SingleConfigurableEditor(project, ProjectStructureConfigurable.getInstance(project), OptionsEditorDialog.DIMENSION_KEY) {
@Nullable
@@ -17,17 +17,12 @@ package com.intellij.ide.actions;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.options.ShowSettingsUtil;
import com.intellij.openapi.options.newEditor.OptionsEditorDialog;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ex.ProjectManagerEx;
import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable;
public class TemplateProjectStructureAction extends AnAction implements DumbAware {
@Override
public void actionPerformed(final AnActionEvent e) {
Project defaultProject = ProjectManagerEx.getInstanceEx().getDefaultProject();
ShowSettingsUtil.getInstance().editConfigurable(defaultProject, OptionsEditorDialog.DIMENSION_KEY, ProjectStructureConfigurable.getInstance(defaultProject));
ShowStructureSettingsAction.showDialog(ProjectManagerEx.getInstanceEx().getDefaultProject());
}
}
@@ -847,6 +847,25 @@ public class PsiBuilderImpl extends UserDataHolderBase implements PsiBuilder {
clearCachedTokenType();
}
/**
*
* @return true if there are error elements created and not dropped after marker was created
*/
public boolean hasErrorsAfter(Marker marker) {
assert marker instanceof StartMarker;
int idx = myProduction.lastIndexOf(marker);
if (idx < 0) {
LOG.error("The marker must be added before checked for errors.");
}
for (int i = idx+1; i < myProduction.size(); ++i) {
ProductionMarker m = myProduction.get(i);
if (m instanceof ErrorItem || m instanceof DoneWithErrorMarker) {
return true;
}
}
return false;
}
@SuppressWarnings({"SuspiciousMethodCalls"})
public void drop(Marker marker) {
final DoneMarker doneMarker = ((StartMarker)marker).myDoneMarker;
@@ -28,7 +28,6 @@ import com.intellij.openapi.fileEditor.impl.LoadTextUtil;
import com.intellij.openapi.progress.ProgressIndicatorProvider;
import com.intellij.openapi.ui.Queryable;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.NonPhysicalFileSystem;
@@ -503,24 +502,23 @@ public class PsiDirectoryImpl extends PsiElementBase implements PsiDirectory, Qu
CheckUtil.checkWritable(this);
if (element instanceof PsiDirectory) {
String name = ((PsiDirectory)element).getName();
PsiDirectory[] subpackages = getSubdirectories();
for (PsiDirectory dir : subpackages) {
if (Comparing.strEqual(dir.getName(), name)) {
throw new IncorrectOperationException(VfsBundle.message("dir.already.exists.error", dir.getVirtualFile().getPresentableUrl()));
}
}
checkName(name, getSubdirectories(), "dir.already.exists.error");
}
else if (element instanceof PsiFile) {
String name = ((PsiFile)element).getName();
PsiFile[] files = getFiles();
for (PsiFile file : files) {
if (Comparing.strEqual(file.getName(), name, SystemInfo.isFileSystemCaseSensitive)) {
throw new IncorrectOperationException(VfsBundle.message("file.already.exists.error", file.getVirtualFile().getPresentableUrl()));
}
}
checkName(name, getFiles(), "file.already.exists.error");
}
else {
throw new IncorrectOperationException();
throw new IncorrectOperationException(element.getClass().getName());
}
}
private void checkName(String name, PsiFileSystemItem[] items, String key) {
boolean caseSensitive = getVirtualFile().getFileSystem().isCaseSensitive();
for (PsiFileSystemItem item : items) {
if (Comparing.strEqual(item.getName(), name, caseSensitive)) {
throw new IncorrectOperationException(VfsBundle.message(key, item.getVirtualFile().getPresentableUrl()));
}
}
}
@@ -34,19 +34,8 @@ class LoadingIcon extends JBImageIcon {
private static final String LOADING_ICON = "/icons/loading.gif";
private static final Logger LOG = Logger.getInstance(LoadingIcon.class);
private final int myWidth;
private final int myHeight;
private final int myDeltaX;
private final int myDeltaY;
LoadingIcon(@NotNull Image image, int width, int height) {
LoadingIcon(@NotNull Image image) {
super(image);
int myOriginalWidth = image.getWidth(null);
int myOriginalHeight = image.getHeight(null);
myWidth = Math.max(width, myOriginalWidth);
myHeight = Math.max(height, myOriginalHeight);
myDeltaX = (myWidth - myOriginalWidth) / 2 - 2;
myDeltaY = (myHeight - myOriginalHeight) / 2 + 2;
}
@NotNull
@@ -56,33 +45,18 @@ class LoadingIcon extends JBImageIcon {
LOG.error("Couldn't load image: " + LOADING_ICON);
return createEmpty(width, height);
}
return new LoadingIcon(image, width, height);
return new LoadingIcon(image);
}
@NotNull
static LoadingIcon createEmpty(int width, int height) {
return new LoadingIcon(UIUtil.createImage(width, height, Transparency.TRANSLUCENT), width, height);
return new LoadingIcon(UIUtil.createImage(width, height, Transparency.TRANSLUCENT));
}
void setObserver(@NotNull JTree tree, @NotNull TreeNode treeNode) {
setImageObserver(new NodeImageObserver(tree, treeNode));
}
@Override
public final synchronized void paintIcon(final Component c, final Graphics g, final int x, final int y) {
super.paintIcon(c, g, x + myDeltaX, y + myDeltaY);
}
@Override
public int getIconHeight() {
return myHeight;
}
@Override
public int getIconWidth() {
return myWidth;
}
private static class NodeImageObserver implements ImageObserver {
@NotNull private final JTree myTree;
@NotNull private final DefaultTreeModel myModel;
@@ -355,6 +355,9 @@ public class PushLog extends JPanel implements TypeSafeDataProvider {
if (!(value instanceof DefaultMutableTreeNode)) {
return;
}
myCheckbox.setBorder(null); //checkBox may have no border by default, but insets are not null,
// it depends on LaF, OS and isItRenderedPane, see com.intellij.ide.ui.laf.darcula.ui.DarculaCheckBoxBorder.
// null border works as expected always.
if (value instanceof RepositoryNode) {
//todo simplify, remove instance of
myCheckbox.setVisible(((RepositoryNode)value).isCheckboxVisible());
@@ -27,7 +27,6 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
@@ -40,7 +39,8 @@ public class RepositoryNode extends CheckedTreeNode implements EditableTreeNode,
@NotNull private final RepositoryWithBranchPanel myRepositoryPanel;
@Nullable private Future<AtomicReference<OutgoingResult>> myFuture;
protected final int myLoadingIconWidth;
protected final int myCheckBoxHGap;
private final int myCheckBoxVGap;
public RepositoryNode(@NotNull RepositoryWithBranchPanel repositoryPanel, @NotNull CheckBoxModel model, boolean enabled) {
super(repositoryPanel);
@@ -48,10 +48,9 @@ public class RepositoryNode extends CheckedTreeNode implements EditableTreeNode,
setChecked(false);
setEnabled(enabled);
myRepositoryPanel = repositoryPanel;
Dimension size = new JCheckBox().getPreferredSize();
myLoadingIconWidth = size.width;
myLoadingIcon = LoadingIcon.create(myLoadingIconWidth, size.height);
myLoadingIcon = myRepositoryPanel.getLoadingIcon();
myCheckBoxHGap = myRepositoryPanel.getLoadingIconAndCheckBoxGapH();
myCheckBoxVGap = myRepositoryPanel.getLoadingIconAndCheckBoxGapV();
}
@Override
@@ -71,25 +70,44 @@ public class RepositoryNode extends CheckedTreeNode implements EditableTreeNode,
@Override
public void render(@NotNull ColoredTreeCellRenderer renderer) {
int repoFixedWidth = 120;
int borderHOffset = myRepositoryPanel.getHBorderOffset(renderer);
int borderVOffset = myRepositoryPanel.getVBorderOffset(renderer);
if (myLoading.get()) {
renderer.setIcon(myLoadingIcon);
renderer.setIconOnTheRight(false);
repoFixedWidth += myLoadingIconWidth;
int checkBoxWidth = myRepositoryPanel.getCheckBoxWidth();
repoFixedWidth += checkBoxWidth;
if (myCheckBoxHGap > 0) {
renderer.append("");
renderer.appendFixedTextFragmentWidth(checkBoxWidth + renderer.getIconTextGap() + borderHOffset);
}
if (myCheckBoxVGap > 0) {
int shiftV = myCheckBoxVGap - borderVOffset;
renderer.setBorder(new EmptyBorder(shiftV / 2, 0, shiftV / 2, 0));
}
}
renderer.append(getRepoName(renderer, repoFixedWidth), SimpleTextAttributes.GRAY_ATTRIBUTES);
else {
if (myCheckBoxHGap <= 0) {
renderer.append("");
renderer.appendFixedTextFragmentWidth(myRepositoryPanel.calculateRendererShiftH(renderer));
}
if (myCheckBoxVGap <= 0) {
int shiftV = -myCheckBoxVGap + borderVOffset;
renderer.setBorder(new EmptyBorder(shiftV / 2, 0, shiftV / 2, 0));
}
}
renderer.append(getRepoName(renderer, repoFixedWidth), isChecked() ? SimpleTextAttributes.REGULAR_ATTRIBUTES : SimpleTextAttributes.GRAY_ATTRIBUTES);
renderer.appendFixedTextFragmentWidth(repoFixedWidth);
renderer.append(myRepositoryPanel.getSourceName(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
renderer.append(myRepositoryPanel.getArrow(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
renderer.append(myRepositoryPanel.getSourceName(), isChecked() ? SimpleTextAttributes.REGULAR_ATTRIBUTES : SimpleTextAttributes.GRAY_ATTRIBUTES);
renderer.append(myRepositoryPanel.getArrow(), isChecked() ? SimpleTextAttributes.REGULAR_ATTRIBUTES : SimpleTextAttributes.GRAY_ATTRIBUTES);
PushTargetPanel pushTargetPanel = myRepositoryPanel.getTargetPanel();
pushTargetPanel.render(renderer);
Insets insets = BorderFactory.createEmptyBorder().getBorderInsets(pushTargetPanel);
renderer.setBorder(new EmptyBorder(insets));
}
@NotNull
private String getRepoName(@NotNull ColoredTreeCellRenderer renderer, int maxWidth) {
String name = myRepositoryPanel.getRepositoryName();
return GraphicsUtil.stringWidth(name, renderer.getFont()) > maxWidth - UIUtil.DEFAULT_VGAP ? name + " " : name;
return GraphicsUtil.stringWidth(name, renderer.getFont()) > maxWidth - UIUtil.DEFAULT_HGAP ? name + " " : name;
}
@Override
@@ -23,6 +23,7 @@ import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.ui.ValidationInfo;
import com.intellij.openapi.ui.popup.util.PopupUtil;
import com.intellij.ui.ColoredTreeCellRenderer;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.ui.components.JBCheckBox;
import com.intellij.ui.components.JBLabel;
@@ -32,6 +33,7 @@ import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -46,6 +48,11 @@ public class RepositoryWithBranchPanel<T extends PushTarget> extends NonOpaquePa
private final JLabel myRepositoryLabel;
private final ColoredTreeCellRenderer myTextRenderer;
@NotNull private final List<RepositoryNodeListener<T>> myListeners = ContainerUtil.createLockFreeCopyOnWriteList();
private final int myCheckBoxLoadingIconGapH;
private final int myCheckBoxLoadingIconGapV;
private final LoadingIcon myLoadingIcon;
private final int myCheckBoxWidth;
public RepositoryWithBranchPanel(@NotNull final Project project, @NotNull String repoName,
@NotNull String sourceName, @NotNull PushTargetPanel<T> destPushTargetPanelComponent) {
@@ -54,6 +61,7 @@ public class RepositoryWithBranchPanel<T extends PushTarget> extends NonOpaquePa
myRepositoryCheckbox = new JBCheckBox();
myRepositoryCheckbox.setFocusable(false);
myRepositoryCheckbox.setOpaque(false);
myRepositoryCheckbox.setBorder(null);
myRepositoryCheckbox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(@NotNull ActionEvent e) {
@@ -89,6 +97,14 @@ public class RepositoryWithBranchPanel<T extends PushTarget> extends NonOpaquePa
return error == null;
}
});
JCheckBox emptyBorderCheckBox = new JCheckBox();
emptyBorderCheckBox.setBorder(null);
Dimension size = emptyBorderCheckBox.getPreferredSize();
myCheckBoxWidth = size.width;
myLoadingIcon = LoadingIcon.create(myCheckBoxWidth, size.height);
myCheckBoxLoadingIconGapH = myCheckBoxWidth - myLoadingIcon.getIconWidth();
myCheckBoxLoadingIconGapV = size.height - myLoadingIcon.getIconHeight();
}
private void layoutComponents() {
@@ -122,17 +138,24 @@ public class RepositoryWithBranchPanel<T extends PushTarget> extends NonOpaquePa
boolean hasFocus) {
Rectangle bounds = tree.getPathBounds(tree.getPathForRow(row));
invalidate();
myTextRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
if (!(value instanceof SingleRepositoryNode)) {
RepositoryNode node = (RepositoryNode)value;
myRepositoryCheckbox.setSelected(node.isChecked());
myRepositoryCheckbox.setVisible(true);
myTextRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
if (myCheckBoxLoadingIconGapH < 0) {
myTextRenderer.append("");
myTextRenderer.appendFixedTextFragmentWidth(calculateRendererShiftH(myTextRenderer));
}
myTextRenderer.append(getRepositoryName(), SimpleTextAttributes.GRAY_ATTRIBUTES);
myTextRenderer.appendFixedTextFragmentWidth(120);
}
else {
myTextRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
SingleRepositoryNode singleRepositoryNode = ((SingleRepositoryNode)value);
myRepositoryCheckbox.setVisible(false);
myTextRenderer.setIcon(singleRepositoryNode.getEmptyIcon());
myTextRenderer.setIconOnTheRight(false);
myTextRenderer.append("");
}
myTextRenderer.append(getSourceName(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
myTextRenderer.append(getArrow(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
@@ -168,6 +191,38 @@ public class RepositoryWithBranchPanel<T extends PushTarget> extends NonOpaquePa
public PushTargetPanel getTargetPanel() {
return myDestPushTargetPanelComponent;
}
public LoadingIcon getLoadingIcon() {
return myLoadingIcon;
}
public int getCheckBoxWidth() {
return myCheckBoxWidth;
}
public int getLoadingIconAndCheckBoxGapH() {
return myCheckBoxLoadingIconGapH;
}
public int calculateRendererShiftH(@NotNull SimpleColoredComponent coloredRenderer) {
int borderOffset = getHBorderOffset(coloredRenderer);
return -myCheckBoxLoadingIconGapH + coloredRenderer.getIconTextGap() + coloredRenderer.getIpad().left + borderOffset;
}
public int getHBorderOffset(@NotNull SimpleColoredComponent coloredRenderer) {
Border border = coloredRenderer.getMyBorder();
return border != null ? border.getBorderInsets(coloredRenderer).left : 0;
}
public int getLoadingIconAndCheckBoxGapV() {
return myCheckBoxLoadingIconGapV;
}
public int getVBorderOffset(@NotNull SimpleColoredComponent coloredRenderer) {
Border border = coloredRenderer.getMyBorder();
return border != null ? border.getBorderInsets(coloredRenderer).top : 0;
}
}
@@ -28,7 +28,8 @@ public class SingleRepositoryNode extends RepositoryNode {
public SingleRepositoryNode(@NotNull RepositoryWithBranchPanel repositoryPanel, @NotNull CheckBoxModel model) {
super(repositoryPanel, model, true);
myRepositoryPanel = repositoryPanel;
myEmptyIcon = LoadingIcon.createEmpty(myLoadingIcon.getIconWidth(), myLoadingIcon.getIconHeight());
myEmptyIcon =
LoadingIcon.createEmpty(repositoryPanel.getLoadingIcon().getIconWidth(), repositoryPanel.getLoadingIcon().getIconHeight());
}
@Override
@@ -36,17 +37,18 @@ public class SingleRepositoryNode extends RepositoryNode {
return false;
}
public LoadingIcon getEmptyIcon() {
return myEmptyIcon;
}
@Override
public void fireOnSelectionChange(boolean isSelected) {
}
@Override
public void render(@NotNull ColoredTreeCellRenderer renderer) {
renderer.setIcon(myLoading.get() ? myLoadingIcon : myEmptyIcon);
renderer.setIcon(myLoading.get() ? myRepositoryPanel.getLoadingIcon() : myEmptyIcon);
renderer.setIconOnTheRight(false);
renderer.append("");
renderer.appendFixedTextFragmentWidth(myLoadingIconWidth);
renderer.append(myRepositoryPanel.getSourceName(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
renderer.append(myRepositoryPanel.getArrow(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
PushTargetPanel pushTargetPanel = myRepositoryPanel.getTargetPanel();
@@ -35,10 +35,7 @@ public class VcsBranchEditorListener extends LinkMouseListenerBase {
public void mouseMoved(MouseEvent e) {
Component component = (Component)e.getSource();
Object tag = getTagAt(e);
if (tag != null && tag instanceof PushTargetPanel) {
component.setCursor(Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR));
}
else if (tag != null && tag instanceof TextWithLinkNode) {
if (tag instanceof PushTargetPanel || tag instanceof TextWithLinkNode) {
component.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
else {
@@ -187,23 +187,11 @@ public class ReformatCodeAction extends AnAction implements DumbAware {
}
if (rearrangeEntries && file != null && editor != null) {
final ArrangementEngine engine = ServiceManager.getService(project, ArrangementEngine.class);
try {
final PsiFile finalFile = file;
SelectionModel selectionModel = editor.getSelectionModel();
final TextRange rangeToUse = selectionModel.hasSelection()
? TextRange.create(selectionModel.getSelectionStart(), selectionModel.getSelectionEnd())
: TextRange.create(0, editor.getDocument().getTextLength());
CommandProcessor.getInstance().executeCommand(project, new Runnable() {
@Override
public void run() {
engine.arrange(editor, finalFile, Collections.singleton(rangeToUse));
}
}, getTemplatePresentation().getText(), null);
}
finally {
PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument());
}
SelectionModel selectionModel = editor.getSelectionModel();
final TextRange rangeToUse = selectionModel.hasSelection()
? TextRange.create(selectionModel.getSelectionStart(), selectionModel.getSelectionEnd())
: TextRange.create(0, editor.getDocument().getTextLength());
new RearrangeCodeProcessor(project, file, Collections.singleton(rangeToUse)).run();
}
}
@@ -24,7 +24,6 @@ import com.intellij.ui.ColorUtil;
import com.intellij.ui.Gray;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.tabs.TabInfo;
import com.intellij.ui.tabs.TabsUtil;
import com.intellij.ui.tabs.UiDecorator;
import com.intellij.ui.tabs.impl.JBTabsImpl;
import com.intellij.ui.tabs.impl.TabLabel;
@@ -75,7 +74,7 @@ public class
int _y = effectiveBounds.y + insets.top + 3;
int _width = effectiveBounds.width - insets.left - insets.right;
int _height = effectiveBounds.height - insets.top - insets.bottom - 3;
_height -= TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT;
_height -= getActiveTabUnderlineHeight();
if (dark) {
g2d.setPaint(UIUtil.getGradientPaint(_x, _y, ColorUtil.shift(UIUtil.getListBackground(), 1.3), _x, _y + effectiveBounds.height, UIUtil.getPanelBackground()));
g2d.fillRect(_x, _y, _width, _height);
@@ -122,7 +121,7 @@ public class
Rectangle rectangle;
int y = r2.y + insets.top;
int height = maxLength - insets.top - insets.bottom;
height -= TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT;
height -= getActiveTabUnderlineHeight();
rectangle = new Rectangle(maxOffset, y, r2.width - maxOffset - insets.left - insets.right, height);
@@ -194,7 +193,7 @@ public class
shape.insets = shape.path.transformInsets(getLayoutInsets());
shape.labelPath = shape.path.createTransform(r);
shape.labelBottomY = shape.labelPath.getMaxY() - shape.labelPath.deltaY(TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT - 1);
shape.labelBottomY = shape.labelPath.getMaxY() - shape.labelPath.deltaY(getActiveTabUnderlineHeight() - 1);
shape.labelTopY = shape.labelPath.getY() + shape.labelPath.deltaY(1);
shape.labelLeftX = shape.labelPath.getX();
shape.labelRightX = shape.labelPath.getMaxX() - shape.labelPath.deltaX(1);
@@ -210,8 +209,8 @@ public class
int lastX = shape.path.getWidth() - shape.path.deltaX(shape.insets.right);
shape.path.lineTo(lastX, shape.labelBottomY);
shape.path.lineTo(lastX, shape.labelBottomY + shape.labelPath.deltaY(TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT - 1));
shape.path.lineTo(leftX, shape.labelBottomY + shape.labelPath.deltaY(TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT - 1));
shape.path.lineTo(lastX, shape.labelBottomY + shape.labelPath.deltaY(getActiveTabUnderlineHeight() - 1));
shape.path.lineTo(leftX, shape.labelBottomY + shape.labelPath.deltaY(getActiveTabUnderlineHeight() - 1));
shape.path.closePath();
shape.fillPath = shape.path.copy();
@@ -298,7 +297,7 @@ public class
@Override
public Dimension getPreferredSize() {
Dimension result = super.getPreferredSize();
result.height += TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT;
result.height += myTabs.getActiveTabUnderlineHeight();
return result;
}
}
@@ -26,7 +26,6 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.wm.IdeFocusManager;
import com.intellij.ui.tabs.JBTabsPosition;
import com.intellij.ui.tabs.TabInfo;
import com.intellij.ui.tabs.TabsUtil;
import com.intellij.ui.tabs.impl.singleRow.ScrollableSingleRowLayout;
import com.intellij.ui.tabs.impl.singleRow.SingleRowLayout;
import com.intellij.ui.tabs.impl.table.TableLayout;
@@ -98,9 +97,11 @@ public class JBEditorTabs extends JBTabsImpl {
@Override
public boolean hasUnderline() {
return true;
return isSingleRow();
}
protected void doPaintInactive(Graphics2D g2d,
boolean leftGhostExists,
TabLabel label,
@@ -116,14 +117,14 @@ public class JBEditorTabs extends JBTabsImpl {
if ((!isSingleRow() /* for multiline */) || (isSingleRow() && isHorizontalTabs())) {
if (isSingleRow() && getPosition() == JBTabsPosition.bottom) {
_y += TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT;
_y += getActiveTabUnderlineHeight();
} else {
if (isSingleRow()) {
_height -= TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT;
_height -= getActiveTabUnderlineHeight();
} else {
TabInfo info = label.getInfo();
if (((TableLayout)getEffectiveLayout()).isLastRow(info)) {
_height -= TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT;
_height -= getActiveTabUnderlineHeight();
}
}
}
@@ -131,7 +132,19 @@ public class JBEditorTabs extends JBTabsImpl {
final boolean vertical = getTabsPosition() == JBTabsPosition.left || getTabsPosition() == JBTabsPosition.right;
final Color tabColor = label.getInfo().getTabColor();
final Composite oldComposite = g2d.getComposite();
//if (label != getSelectedLabel()) {
// g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.9f));
//}
getPainter().doPaintInactive(g2d, effectiveBounds, _x, _y, _width, _height, tabColor, row, column, vertical);
//g2d.setComposite(oldComposite);
}
@Override
public int getActiveTabUnderlineHeight() {
return hasUnderline() ? super.getActiveTabUnderlineHeight() : 1;
}
JBEditorTabsPainter getPainter() {
@@ -186,9 +199,9 @@ public class JBEditorTabs extends JBTabsImpl {
int y = r2.y + insets.top;
int height = maxLength - insets.top - insets.bottom;
if (getTabsPosition() == JBTabsPosition.bottom) {
y = r2.height - height - insets.top + TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT;
y = r2.height - height - insets.top + getActiveTabUnderlineHeight();
} else {
height -= TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT;
height -= getActiveTabUnderlineHeight();
}
rectangle = new Rectangle(maxOffset, y, r2.width - maxOffset - insets.left - insets.right, height);
@@ -229,7 +242,7 @@ public class JBEditorTabs extends JBTabsImpl {
shape.insets = shape.path.transformInsets(getLayoutInsets());
shape.labelPath = shape.path.createTransform(getSelectedLabel().getBounds());
shape.labelBottomY = shape.labelPath.getMaxY() - shape.labelPath.deltaY(TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT - 1);
shape.labelBottomY = shape.labelPath.getMaxY() - shape.labelPath.deltaY(getActiveTabUnderlineHeight() - 1);
shape.labelTopY =
shape.labelPath.getY() + (getPosition() == JBTabsPosition.top || getPosition() == JBTabsPosition.bottom ? shape.labelPath.deltaY(1) : 0) ;
shape.labelLeftX = shape.labelPath.getX() + (getPosition() == JBTabsPosition.top || getPosition() == JBTabsPosition.bottom ? 0 : shape.labelPath.deltaX(
@@ -247,8 +260,8 @@ public class JBEditorTabs extends JBTabsImpl {
int lastX = shape.path.getWidth() - shape.path.deltaX(shape.insets.right);
shape.path.lineTo(lastX, shape.labelBottomY);
shape.path.lineTo(lastX, shape.labelBottomY + shape.labelPath.deltaY(TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT - 1));
shape.path.lineTo(leftX, shape.labelBottomY + shape.labelPath.deltaY(TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT - 1));
shape.path.lineTo(lastX, shape.labelBottomY + shape.labelPath.deltaY(getActiveTabUnderlineHeight() - 1));
shape.path.lineTo(leftX, shape.labelBottomY + shape.labelPath.deltaY(getActiveTabUnderlineHeight() - 1));
shape.path.closePath();
shape.fillPath = shape.path.copy();
@@ -345,6 +345,10 @@ public class JBTabsImpl extends JComponent
return this;
}
public int getActiveTabUnderlineHeight() {
return TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT;
}
public boolean isEditorTabs() {
return false;
}
@@ -53,7 +53,7 @@ public class TabLabel extends JPanel {
private boolean myCentered;
private final Wrapper myLabelPlaceholder = new Wrapper(false);
private final JBTabsImpl myTabs;
protected final JBTabsImpl myTabs;
private BufferedImage myInactiveStateImage;
private Rectangle myLastPaintedInactiveImageBounds;
@@ -241,7 +241,12 @@ public class TabLabel extends JPanel {
}
});
final Composite oldComposite = ((Graphics2D)g).getComposite();
if (myTabs instanceof JBEditorTabs && !myTabs.isSingleRow() && myTabs.getSelectedInfo() != myInfo) {
((Graphics2D)g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f));
}
super.paint(g);
((Graphics2D)g).setComposite(oldComposite);
doTranslate(new PairConsumer<Integer, Integer>() {
@Override
@@ -253,7 +258,7 @@ public class TabLabel extends JPanel {
protected int getNonSelectedOffset() {
if (myTabs.isEditorTabs() && (myTabs.isSingleRow() || ((TableLayout)myTabs.getEffectiveLayout()).isLastRow(getInfo()))) {
return -TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT / 2 + 1;
return -myTabs.getActiveTabUnderlineHeight() / 2 + 1;
}
return 1;
}
@@ -275,7 +280,7 @@ public class TabLabel extends JPanel {
switch (pos) {
case top:
case bottom:
if (myTabs.hasUnderline()) size.height += TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT - 1;
if (myTabs.hasUnderline()) size.height += myTabs.getActiveTabUnderlineHeight() - 1;
break;
case left:
case right:
@@ -18,7 +18,6 @@ package com.intellij.ui.tabs.impl.singleRow;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.tabs.JBTabsPosition;
import com.intellij.ui.tabs.TabInfo;
import com.intellij.ui.tabs.TabsUtil;
import com.intellij.ui.tabs.impl.*;
import org.jetbrains.annotations.Nullable;
@@ -50,8 +49,8 @@ public class SingleRowLayout extends TabLayout {
protected int getIconY(Rectangle iconRec) {
final int shift;
switch (myTabs.getTabsPosition()) {
case bottom: shift = TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT; break;
case top: shift = -(TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT / 2); break;
case bottom: shift = myTabs.getActiveTabUnderlineHeight(); break;
case top: shift = -(myTabs.getActiveTabUnderlineHeight() / 2); break;
default: shift = 0;
}
return super.getIconY(iconRec) + shift;
@@ -16,7 +16,6 @@
package com.intellij.ui.tabs.impl.table;
import com.intellij.ui.tabs.TabInfo;
import com.intellij.ui.tabs.TabsUtil;
import com.intellij.ui.tabs.impl.JBTabsImpl;
import com.intellij.ui.tabs.impl.LayoutPassInfo;
import com.intellij.ui.tabs.impl.TabLabel;
@@ -103,10 +102,10 @@ public class TableLayout extends TabLayout {
toMove.add(data.table.get(i));
}
for (TableRow eachMove : toMove) {
data.table.remove(eachMove);
data.table.add(0, eachMove);
}
//for (TableRow eachMove : toMove) {
// data.table.remove(eachMove);
// data.table.add(0, eachMove);
//}
return data;
@@ -131,7 +130,7 @@ public class TableLayout extends TabLayout {
int eachY = insets.top;
int eachX;
int row = 0;
final int tabUnderlineFix = myTabs.isEditorTabs() ? TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT : 0;
final int tabUnderlineFix = myTabs.isEditorTabs() ? myTabs.getActiveTabUnderlineHeight() : 0;
for (TableRow eachRow : data.table) {
eachX = insets.left;
@@ -41,6 +41,7 @@ public class FormBuilder {
private int myVerticalGap;
private int myHorizontalGap;
private int myFormLeftIndent;
public FormBuilder() {
myPanel = new JPanel(new GridBagLayout());
@@ -49,6 +50,7 @@ public class FormBuilder {
myAlignLabelOnRight = false;
myVerticalGap = DEFAULT_VGAP;
myHorizontalGap = DEFAULT_HGAP;
myFormLeftIndent = 0;
}
public static FormBuilder createFormBuilder() {
@@ -143,7 +145,7 @@ public class FormBuilder {
c.weighty = 0;
c.fill = NONE;
c.anchor = getLabelAnchor(component, false);
c.insets = new Insets(topInset, myIndent, DEFAULT_VGAP, 0);
c.insets = new Insets(topInset, myIndent + myFormLeftIndent, DEFAULT_VGAP, 0);
if (label != null) myPanel.add(label, c);
@@ -153,7 +155,7 @@ public class FormBuilder {
c.weighty = getWeightY(component);
c.fill = getFill(component);
c.anchor = WEST;
c.insets = new Insets(label == null ? topInset : 0, myIndent, 0, 0);
c.insets = new Insets(label == null ? topInset : 0, myIndent + myFormLeftIndent, 0, 0);
myPanel.add(component, c);
@@ -167,7 +169,7 @@ public class FormBuilder {
c.weighty = 0;
c.fill = NONE;
c.anchor = getLabelAnchor(component, true);
c.insets = new Insets(topInset, myIndent, 0, myHorizontalGap);
c.insets = new Insets(topInset, myIndent + myFormLeftIndent, 0, myHorizontalGap);
myPanel.add(label, c);
@@ -176,7 +178,7 @@ public class FormBuilder {
c.weighty = getWeightY(component);
c.fill = getFill(component);
c.anchor = WEST;
c.insets = new Insets(topInset, 0, 0, 0);
c.insets = new Insets(topInset, myIndent, 0, 0);
myPanel.add(component, c);
@@ -237,8 +239,17 @@ public class FormBuilder {
return this;
}
/**
* @deprecated use {@code setHorizontalGap} or {@code setFormLeftIndent}, to be removed in IDEA 16
*/
@Deprecated
public FormBuilder setIndent(int indent) {
myIndent = indent;
return this;
}
public FormBuilder setFormLeftIndent(int formLeftIndent) {
myFormLeftIndent = formLeftIndent;
return this;
}
}
@@ -49,9 +49,11 @@ import java.net.URLEncoder;
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -216,7 +218,7 @@ public class ITNProxy {
HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();
connection.setSSLSocketFactory(ourSslContext.getSocketFactory());
if (!SystemInfo.isJavaVersionAtLeast("1.7") || !SystemProperties.getBooleanProperty("jsse.enableSNIExtension", true)) {
if (!(SystemInfo.isJavaVersionAtLeast("1.7") && SystemProperties.getBooleanProperty("jsse.enableSNIExtension", true))) {
connection.setHostnameVerifier(new EaHostnameVerifier(url.getHost(), "ftp.intellij.net"));
}
@@ -243,10 +245,15 @@ public class ITNProxy {
KeyStore ks = KeyStore.getInstance(CertificateUtil.JKS);
ks.load(null, null);
ks.setCertificateEntry("JetBrains CA", ca);
TrustManagerFactory tmf = TrustManagerFactory.getInstance(CertificateUtil.X509);
tmf.init(ks);
TrustManagerFactory jbTmf = TrustManagerFactory.getInstance(CertificateUtil.X509);
jbTmf.init(ks);
TrustManagerFactory sysTmf = TrustManagerFactory.getInstance(CertificateUtil.X509);
sysTmf.init((KeyStore)null);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
TrustManager composite = new CompositeX509TrustManager(jbTmf.getTrustManagers(), sysTmf.getTrustManagers());
ctx.init(null, new TrustManager[]{composite}, null);
return ctx;
}
@@ -274,6 +281,46 @@ public class ITNProxy {
}
}
private static class CompositeX509TrustManager implements X509TrustManager {
private final List<X509TrustManager> myManagers = ContainerUtil.newArrayList();
public CompositeX509TrustManager(TrustManager[]... managerSets) {
for (TrustManager[] set : managerSets) {
for (TrustManager manager : set) {
if (manager instanceof X509TrustManager) {
myManagers.add((X509TrustManager)manager);
}
}
}
}
@Override
public void checkClientTrusted(X509Certificate[] certificates, String s) throws CertificateException {
throw new UnsupportedOperationException();
}
@Override
public void checkServerTrusted(X509Certificate[] certificates, String s) throws CertificateException {
for (X509TrustManager manager : myManagers) {
try {
manager.checkServerTrusted(certificates, s);
return;
}
catch (CertificateException ignored) { }
}
throw new CertificateException("No trusting managers found for " + s);
}
@Override
public X509Certificate[] getAcceptedIssuers() {
List<X509Certificate> result = ContainerUtil.newArrayList();
for (X509TrustManager manager : myManagers) {
ContainerUtil.addAll(result, manager.getAcceptedIssuers());
}
return result.toArray(new X509Certificate[result.size()]);
}
}
@SuppressWarnings("SpellCheckingInspection") private static final String JB_CA_CERT =
"-----BEGIN CERTIFICATE-----\n" +
"MIIFvjCCA6agAwIBAgIQMYHnK1dpIZVCoitWqBwhXjANBgkqhkiG9w0BAQsFADBn\n" +
@@ -59,7 +59,12 @@ class ConfigurableEditor extends AbstractEditor implements AnActionListener, AWT
private final MergingUpdateQueue myQueue = new MergingUpdateQueue("SettingsModification", 1000, false, this, this, this);
private final IdentityHashMap<Configurable, JComponent> myConfigurableContent = new IdentityHashMap<Configurable, JComponent>();
private final JLabel myErrorLabel = new JLabel();
private final AbstractAction myApplyAction;
private final AbstractAction myApplyAction = new AbstractAction(CommonBundle.getApplyButtonText()) {
@Override
public void actionPerformed(ActionEvent event) {
apply();
}
};
private final AbstractAction myResetAction = new AbstractAction(RESET_NAME) {
@Override
public void actionPerformed(ActionEvent event) {
@@ -71,14 +76,9 @@ class ConfigurableEditor extends AbstractEditor implements AnActionListener, AWT
};
private Configurable myConfigurable;
ConfigurableEditor(Disposable parent, Configurable configurable, boolean showApplyButton) {
ConfigurableEditor(Disposable parent, Configurable configurable) {
super(parent);
myApplyAction = !showApplyButton ? null : new AbstractAction(CommonBundle.getApplyButtonText()) {
@Override
public void actionPerformed(ActionEvent event) {
apply();
}
};
myApplyAction.setEnabled(false);
myResetAction.putValue(Action.SHORT_DESCRIPTION, RESET_DESCRIPTION);
myResetAction.setEnabled(false);
myErrorLabel.setOpaque(true);
@@ -179,9 +179,7 @@ class ConfigurableEditor extends AbstractEditor implements AnActionListener, AWT
void updateCurrent(Configurable configurable, boolean reset) {
boolean modified = configurable != null && configurable.isModified();
if (myApplyAction != null) {
myApplyAction.setEnabled(modified);
}
myApplyAction.setEnabled(modified);
myResetAction.setEnabled(modified);
if (!modified && reset) {
setError(null);
@@ -45,18 +45,22 @@ import java.util.ArrayList;
public final class SettingsDialog extends DialogWrapper implements DataProvider {
private final String myDimensionServiceKey;
private final AbstractEditor myEditor;
private boolean myApplyButtonNeeded;
private boolean myResetButtonNeeded;
public SettingsDialog(Project project, @NotNull String key, @NotNull Configurable configurable, boolean showApplyButton) {
super(project, true);
myDimensionServiceKey = key;
myEditor = new ConfigurableEditor(myDisposable, configurable, showApplyButton);
myEditor = new ConfigurableEditor(myDisposable, configurable);
myApplyButtonNeeded = showApplyButton;
init(configurable);
}
public SettingsDialog(@NotNull Component parent, @NotNull String key, @NotNull Configurable configurable, boolean showApplyButton) {
super(parent, true);
myDimensionServiceKey = key;
myEditor = new ConfigurableEditor(myDisposable, configurable, showApplyButton);
myEditor = new ConfigurableEditor(myDisposable, configurable);
myApplyButtonNeeded = showApplyButton;
init(configurable);
}
@@ -64,6 +68,7 @@ public final class SettingsDialog extends DialogWrapper implements DataProvider
super(project, true);
myDimensionServiceKey = "SettingsEditor";
myEditor = new SettingsEditor(myDisposable, project, groups, configurable, filter);
myApplyButtonNeeded = true;
init(null);
}
@@ -125,11 +130,11 @@ public final class SettingsDialog extends DialogWrapper implements DataProvider
actions.add(getOKAction());
actions.add(getCancelAction());
Action apply = myEditor.getApplyAction();
if (apply != null) {
if (apply != null && myApplyButtonNeeded) {
actions.add(apply);
}
Action reset = myEditor.getResetAction();
if (reset != null) {
if (reset != null && myResetButtonNeeded) {
actions.add(reset);
}
actions.add(getHelpAction());
@@ -144,7 +144,7 @@ final class SettingsEditor extends AbstractEditor implements DataProvider {
mySearch.repaint();
}
});
myEditor = new ConfigurableEditor(this, null, true) {
myEditor = new ConfigurableEditor(this, null) {
@Override
boolean apply() {
checkModified(myFilter.myContext.getCurrentConfigurable());
@@ -65,11 +65,11 @@ public class JBTabsPaneImpl implements TabbedPane, SwingConstants {
maxOffset++;
g2d.setPaint(UIUtil.getPanelBackground());
if (getFirstTabOffset() > 0) {
g2d.fillRect(clip.x, clip.y, clip.x + getFirstTabOffset() - 1, clip.y + maxLength - TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT);
g2d.fillRect(clip.x, clip.y, clip.x + getFirstTabOffset() - 1, clip.y + maxLength - getActiveTabUnderlineHeight());
}
g2d.fillRect(clip.x + maxOffset, clip.y, clip.width - maxOffset, clip.y + maxLength - TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT);
g2d.fillRect(clip.x + maxOffset, clip.y, clip.width - maxOffset, clip.y + maxLength - getActiveTabUnderlineHeight());
g2d.setPaint(new JBColor(Gray._181, UIUtil.getPanelBackground()));
g2d.drawLine(clip.x + maxOffset, clip.y + maxLength - TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT, clip.x + clip.width, clip.y + maxLength - TabsUtil.ACTIVE_TAB_UNDERLINE_HEIGHT);
g2d.drawLine(clip.x + maxOffset, clip.y + maxLength - getActiveTabUnderlineHeight(), clip.x + clip.width, clip.y + maxLength - getActiveTabUnderlineHeight());
g2d.setPaint(UIUtil.getPanelBackground());
g2d.drawLine(clip.x, clip.y + maxLength, clip.width, clip.y + maxLength);
}
@@ -3061,25 +3061,4 @@ public class UIUtil {
textField.setColumns(4);
}
public static <T> Border makeChameleonBorder(final Border border, final Condition<T> conditionToShow, final T checker) {
return new Border() {
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
if (conditionToShow.value(checker)) {
border.paintBorder(c, g, x, y, width, height);
}
}
@Override
public Insets getBorderInsets(Component c) {
return border.getBorderInsets(c);
}
@Override
public boolean isBorderOpaque() {
return border.isBorderOpaque() && conditionToShow.value(checker);
}
};
}
}
@@ -18,15 +18,14 @@ package com.intellij.vcs.log.ui.frame;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.util.ProgressWindow;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkHtmlRenderer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.BrowserHyperlinkListener;
import com.intellij.ui.IdeBorderFactory;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.components.JBLabel;
import com.intellij.ui.components.JBLoadingPanel;
import com.intellij.ui.components.JBScrollPane;
import com.intellij.ui.components.JBTextField;
import com.intellij.ui.components.panels.NonOpaquePanel;
import com.intellij.util.containers.ContainerUtil;
@@ -47,6 +46,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
@@ -86,7 +86,12 @@ class DetailsPanel extends JPanel implements ListSelectionListener {
myRefsPanel = new RefsPanel(colorManager);
myHashAuthorPanel = new DataPanel(logDataHolder.getProject(), false);
final JScrollPane scrollPane = ScrollPaneFactory.createScrollPane();
final JScrollPane scrollPane = new JBScrollPane() {
@Override
public Border getBorder() {
return getVerticalScrollBar().isVisible() ? super.getBorder() : null;
}
};
myMessageDataPanel = new DataPanel(logDataHolder.getProject(), true) {
@Override
public Dimension getPreferredSize() {
@@ -96,12 +101,6 @@ class DetailsPanel extends JPanel implements ListSelectionListener {
}
};
scrollPane.setViewportView(myMessageDataPanel);
scrollPane.setBorder(UIUtil.makeChameleonBorder(scrollPane.getBorder(), new Condition<JScrollBar>() {
@Override
public boolean value(JScrollBar bar) {
return bar != null && bar.isVisible();
}
}, scrollPane.getVerticalScrollBar()));
myContainingBranchesPanel = new ContainingBranchesPanel();
myMessagePanel = new MessagePanel();
@@ -113,17 +112,21 @@ class DetailsPanel extends JPanel implements ListSelectionListener {
myLoadingPanel.add(header, BorderLayout.NORTH);
myLoadingPanel.add(scrollPane, BorderLayout.CENTER);
myLoadingPanel.add(myContainingBranchesPanel, BorderLayout.SOUTH);
myLoadingPanel.setBackground(UIUtil.getTableBackground());
myLoadingPanel.setOpaque(false);
setLayout(new CardLayout());
add(myLoadingPanel, STANDARD_LAYER);
add(myMessagePanel, MESSAGE_LAYER);
setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
setBackground(UIUtil.getTableBackground());
showMessage("No commits selected");
}
@Override
public Color getBackground() {
return UIUtil.getTableBackground();
}
void updateDataPack(@NotNull VisiblePack dataPack) {
myDataPack = dataPack;
}
@@ -192,6 +195,7 @@ class DetailsPanel extends JPanel implements ListSelectionListener {
myProject = project;
addHyperlinkListener(BrowserHyperlinkListener.INSTANCE);
setOpaque(false);
putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
}
void setData(@Nullable VcsFullCommitDetails commit) {
@@ -263,17 +267,25 @@ class DetailsPanel extends JPanel implements ListSelectionListener {
myLoadingComponent = new NonOpaquePanel(new BorderLayout());
myLoadingComponent.add(new AsyncProcessIcon("Loading..."), BorderLayout.WEST);
myLoadingComponent.add(Box.createHorizontalGlue(), BorderLayout.CENTER);
myBranchesList = new JBTextField("");
myBranchesList.setEditable(false);
myBranchesList.setBorder(IdeBorderFactory.createEmptyBorder()); // setting border to null may mean "use default border" while setting empty border means we do not want a border
if (UIUtil.isUnderIntelliJLaF()) {
myBranchesList.setBackground(UIUtil.getPanelBackground());
} else if (UIUtil.isUnderGTKLookAndFeel()) {
// setting border to empty does not help with gtk l&f
// so I just cover it completely with my line border
myBranchesList.setBorder(new LineBorder(UIUtil.getTextFieldBackground(), 3));
}
myBranchesList = new JBTextField("") {
private final Border gtkBorder = new LineBorder(UIUtil.getTextFieldBackground(), 3) {
@Override
public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
lineColor = UIUtil.getTextFieldBackground();
super.paintBorder(c, g, x, y, width, height);
}
};
private final Border emptyBorder = IdeBorderFactory.createEmptyBorder();
@Override
public Border getBorder() {
// setting border to empty does not help with gtk l&f
// so I just cover it completely with my line border
return UIUtil.isUnderGTKLookAndFeel() ? gtkBorder : emptyBorder;
}
};
myBranchesList.setOpaque(false);
myBranchesList.setEditable(false);
setOpaque(false);
setLayout(new BorderLayout());
add(label, BorderLayout.WEST);
+4 -28
View File
@@ -26,41 +26,17 @@
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<library name="SnuggleTeX">
<CLASSES>
<root url="jar://$MODULE_DIR$/lib/batik.jar!/" />
<root url="jar://$MODULE_DIR$/lib/commons-io-1.4.jar!/" />
<root url="jar://$MODULE_DIR$/lib/jeuclid-core-3.1.9.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/lib/snuggletex-core-1.3-SNAPSHOT.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/lib/xmlgraphics-commons-1.3.1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/lib/commons-io-1.4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>
</module>
Binary file not shown.
@@ -0,0 +1,4 @@
## This is hand-edited. Add all of the non-auto-generated definitions
3A6:varPhi:ALPHA
3C6:varphi:ALPHA
02248:thickapprox:REL
@@ -1,7 +1,10 @@
package org.jetbrains.plugins.ipnb;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.BrowserHyperlinkListener;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.text.MarkdownUtil;
import com.petebevin.markdown.MarkdownProcessor;
import net.sourceforge.jeuclid.MathMLParserSupport;
import net.sourceforge.jeuclid.context.LayoutContextImpl;
@@ -29,6 +32,7 @@ import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.Hashtable;
@@ -49,8 +53,22 @@ public class IpnbUtils {
"padding: 8px 35px 8px 14px;" +
"border: 1px solid #fbeed5;}";
public static String markdown2Html(@NotNull final String description) {
return ourMarkdownProcessor.markdown(description);
private static final String ourAlertSuccessRule = ".alert-success{ background-color: #dff0d8;\n" +
"color: #468847;" +
"padding: 8px 35px 8px 14px;" +
"border: 1px solid #d6e9c6;}";
private static final String ourAlertErrorRule = ".alert-error{ background-color: #f2dede;\n" +
"color: #b94a48;" +
"padding: 8px 35px 8px 14px;" +
"border: 1px solid #eed3d7;}";
public static String markdown2Html(@NotNull String description) {
description = StringUtil.replace(description, "class=\"alert alert-success\"", "class=\"alert-success\"");
description = StringUtil.replace(description, "class=\"alert alert-error\"", "class=\"alert-error\"");
ArrayList<String> lines = ContainerUtil.newArrayList(description.split("\n|\r|\r\n"));
MarkdownUtil.replaceHeaders(lines);
return ourMarkdownProcessor.markdown(StringUtil.join(lines, "\n"));
}
public static void addLatexToPanel(@NotNull final String source, @NotNull final JPanel panel) {
@@ -61,6 +79,8 @@ public class IpnbUtils {
sheet.addRule(ourBodyRule);
sheet.addRule(ourCodeRule);
sheet.addRule(ourAlertRule);
sheet.addRule(ourAlertSuccessRule);
sheet.addRule(ourAlertErrorRule);
editorPane.setEditable(false);
@@ -75,6 +95,7 @@ public class IpnbUtils {
}
});
editorPane.addHyperlinkListener(new BrowserHyperlinkListener());
//TODO: jump to the section (see User Interface#Utilities)
panel.add(editorPane);
}
@@ -137,8 +158,8 @@ public class IpnbUtils {
markdown.append(charAt);
}
if (formula.length() != 0) {
addFormula(formula.toString(), editorPane, imageIndex);
result.append("<img src=\"").append(ourImagePrefix).append(imageIndex).append(".jpg\">");
addFormula(formula.toString(), editorPane, imageIndex, result);
imageIndex += 1;
formula = new StringBuilder();
}
@@ -146,12 +167,12 @@ public class IpnbUtils {
if (inEnd && charAt == '}') {
inMultiStringCode -= 1;
inEnd = false;
}
}
if (formula.length() != 0) {
addFormula(formula.toString(), editorPane, imageIndex);
result.append("<img src=\"").append(ourImagePrefix).append(imageIndex).append(".jpg\">");
addFormula(formula.toString(), editorPane, imageIndex, result);
}
if (markdown.length() != 0) {
result.append(markdown.toString());
@@ -159,7 +180,7 @@ public class IpnbUtils {
return markdown2Html(result.toString());
}
private static void addFormula(@NotNull final String formulaText, JEditorPane editorPane, int imageIndex) {
private static void addFormula(@NotNull final String formulaText, JEditorPane editorPane, int imageIndex, StringBuilder result) {
final SnuggleEngine engine = new SnuggleEngine();
engine.getPackages().add(0, IpnbTexPackageDefinitions.getPackage());
@@ -206,5 +227,10 @@ public class IpnbUtils {
catch (ParserConfigurationException e) {
LOG.error(e);
}
if (formulaText.startsWith("$$") || formulaText.startsWith("\\begin")) {
result.append("<p style = \"text-align:center;\"><img src=\"").append(ourImagePrefix).append(imageIndex).append(".jpg\"/></p>");
}
else
result.append("<img src=\"").append(ourImagePrefix).append(imageIndex).append(".jpg\">");
}
}
@@ -44,7 +44,7 @@ public class IpnbEditorUtil {
public enum PromptType { In, Out, None }
public static Dimension PROMPT_SIZE = new Dimension(80, 30);
public static int PANEL_WIDTH = 900;
public static int PANEL_WIDTH = (int)(Toolkit.getDefaultToolkit().getScreenSize().width * 0.5);
public static Editor createPythonCodeEditor(@NotNull final Project project, @NotNull final IpnbCodeSourcePanel codeSourcePanel) {
final EditorFactory editorFactory = EditorFactory.getInstance();
@@ -107,12 +107,28 @@ public class IpnbFileEditor extends UserDataHolderBase implements FileEditor, Te
private JPanel createControlPanel() {
final JPanel controlPanel = new JPanel();
controlPanel.setBackground(IpnbEditorUtil.getBackground());
addSaveButton(controlPanel);
addAddButton(controlPanel);
addCutButton(controlPanel);
addCopyButton(controlPanel);
addPasteButton(controlPanel);
addRunButton(controlPanel);
final JPanel savePanel = new JPanel(new GridBagLayout());
savePanel.setBackground(IpnbEditorUtil.getBackground());
addSaveButton(savePanel);
controlPanel.add(savePanel);
final JPanel addPanel = new JPanel(new GridBagLayout());
addPanel.setBackground(IpnbEditorUtil.getBackground());
addAddButton(addPanel);
controlPanel.add(addPanel);
final JPanel editorPanel = new JPanel(new GridBagLayout());
editorPanel.setBackground(IpnbEditorUtil.getBackground());
addCutButton(editorPanel);
addCopyButton(editorPanel);
addPasteButton(editorPanel);
controlPanel.add(editorPanel);
final JPanel runPanel = new JPanel(new GridBagLayout());
runPanel.setBackground(IpnbEditorUtil.getBackground());
addRunButton(runPanel);
controlPanel.add(runPanel);
myCellTypeCombo = new ComboBox(ourCellTypes);
@@ -146,6 +162,7 @@ public class IpnbFileEditor extends UserDataHolderBase implements FileEditor, Te
action.runCell(myIpnbFilePanel, true);
}
});
myRunCellButton.setToolTipText("Run Cell");
controlPanel.add(myRunCellButton);
}
@@ -156,7 +173,7 @@ public class IpnbFileEditor extends UserDataHolderBase implements FileEditor, Te
final IpnbSaveAction action = (IpnbSaveAction)ActionManager.getInstance().getAction("IpnbSaveAction");
action.saveAndCheckpoint(IpnbFileEditor.this);
}
}, AllIcons.Actions.Menu_saveall);
}, AllIcons.Actions.Menu_saveall, "Save and Checkpoint");
}
private void addCutButton(@NotNull final JPanel controlPanel) {
@@ -166,7 +183,7 @@ public class IpnbFileEditor extends UserDataHolderBase implements FileEditor, Te
final IpnbCutCellAction action = (IpnbCutCellAction)ActionManager.getInstance().getAction("IpnbCutCellAction");
action.cutCell(myIpnbFilePanel);
}
}, AllIcons.Actions.Menu_cut);
}, AllIcons.Actions.Menu_cut, "Cut Cell");
}
private void addCopyButton(@NotNull final JPanel controlPanel) {
@@ -176,7 +193,7 @@ public class IpnbFileEditor extends UserDataHolderBase implements FileEditor, Te
final IpnbCopyCellAction action = (IpnbCopyCellAction)ActionManager.getInstance().getAction("IpnbCopyCellAction");
action.copyCell(myIpnbFilePanel);
}
}, AllIcons.Actions.Copy);
}, AllIcons.Actions.Copy, "Copy Cell");
}
private void addPasteButton(@NotNull final JPanel controlPanel) {
@@ -186,15 +203,19 @@ public class IpnbFileEditor extends UserDataHolderBase implements FileEditor, Te
final IpnbPasteCellAction action = (IpnbPasteCellAction)ActionManager.getInstance().getAction("IpnbPasteCellAction");
action.pasteCell(myIpnbFilePanel);
}
}, AllIcons.Actions.Menu_paste);
}, AllIcons.Actions.Menu_paste, "Paste Cell Below");
}
private static void addButton(@NotNull final JPanel controlPanel, @NotNull final ActionListener listener, @NotNull final Icon icon) {
private static void addButton(@NotNull final JPanel controlPanel,
@NotNull final ActionListener listener,
@NotNull final Icon icon,
@NotNull final String tooltip) {
final JButton button = new JButton();
button.setBackground(IpnbEditorUtil.getBackground());
button.setPreferredSize(new Dimension(30, 30));
button.setIcon(icon);
button.addActionListener(listener);
button.setToolTipText(tooltip);
controlPanel.add(button);
}
@@ -205,7 +226,7 @@ public class IpnbFileEditor extends UserDataHolderBase implements FileEditor, Te
final IpnbAddCellAction action = (IpnbAddCellAction)ActionManager.getInstance().getAction("IpnbAddCellAction");
action.addCell(myIpnbFilePanel);
}
}, AllIcons.General.Add);
}, AllIcons.General.Add, "Insert Cell Below");
}
public JButton getRunCellButton() {
@@ -282,6 +282,7 @@ public class IpnbFilePanel extends JPanel implements Scrollable, DataProvider {
if (mySelectedCell != null && e.getID() == KeyEvent.KEY_PRESSED) {
if (e.getKeyCode() == KeyEvent.VK_ENTER) {
mySelectedCell.switchToEditing();
repaint();
}
int index = myIpnbPanels.indexOf(mySelectedCell);
final Rectangle rect = getVisibleRect();
@@ -346,7 +347,14 @@ public class IpnbFilePanel extends JPanel implements Scrollable, DataProvider {
super.paintComponent(g);
if (mySelectedCell != null) {
g.setColor(mySelectedCell.isEditing() ? JBColor.GREEN : JBColor.GRAY);
g.drawRoundRect(100, mySelectedCell.getTop() - 1, getWidth() - 200, mySelectedCell.getHeight() + 2, 5, 5);
if (mySelectedCell instanceof IpnbCodePanel) {
g.drawRoundRect(mySelectedCell.getX() - 50, mySelectedCell.getTop() - 1,
mySelectedCell.getWidth() + 145 - IpnbEditorUtil.PROMPT_SIZE.width, mySelectedCell.getHeight() + 2, 5, 5);
}
else {
g.drawRoundRect(mySelectedCell.getX() - IpnbEditorUtil.PROMPT_SIZE.width - 55, mySelectedCell.getTop() - 1,
mySelectedCell.getWidth() + 150, mySelectedCell.getHeight() + 2, 5, 5);
}
}
}
@@ -3,24 +3,31 @@ package org.jetbrains.plugins.ipnb.editor.panels;
import org.w3c.dom.Element;
import uk.ac.ed.ph.snuggletex.SnugglePackage;
import uk.ac.ed.ph.snuggletex.dombuilding.CommandHandler;
import uk.ac.ed.ph.snuggletex.dombuilding.EqnArrayHandler;
import uk.ac.ed.ph.snuggletex.internal.DOMBuilder;
import uk.ac.ed.ph.snuggletex.internal.SnuggleParseException;
import uk.ac.ed.ph.snuggletex.semantics.Interpretation;
import uk.ac.ed.ph.snuggletex.tokens.CommandToken;
import uk.ac.ed.ph.snuggletex.tokens.FlowToken;
import java.util.List;
import static uk.ac.ed.ph.snuggletex.definitions.Globals.ALL_MODES;
import static uk.ac.ed.ph.snuggletex.definitions.Globals.MATH_MODE_ONLY;
import static uk.ac.ed.ph.snuggletex.definitions.LaTeXMode.MATH;
import static uk.ac.ed.ph.snuggletex.definitions.TextFlowContext.START_NEW_XHTML_BLOCK;
public final class IpnbTexPackageDefinitions {
private static final SnugglePackage ourPackage;
public static SnugglePackage getPackage() {
public static SnugglePackage getPackage() {
return ourPackage;
}
static {
private static String ourMathCharacters = "org/jetbrains/plugins/ipnb/math-characters.txt";
static {
ourPackage = new SnugglePackage("Ipnb");
ourPackage.addComplexCommandSameArgMode("dot", false, 1, MATH_MODE_ONLY, new CommandHandler() {
@@ -38,5 +45,8 @@ public final class IpnbTexPackageDefinitions {
builder.appendMathMLOperatorElement(parentElement, "\u03c0");
}
}, null);
ourPackage.addEnvironment("eqnarray", ALL_MODES, MATH, Interpretation.TABULAR, new EqnArrayHandler(), START_NEW_XHTML_BLOCK);
ourPackage.loadMathCharacterDefinitions(ourMathCharacters);
}
}
@@ -65,7 +65,7 @@ public class IpnbCodeSourcePanel extends IpnbPanel<JComponent, IpnbCodeCell> imp
@Override
protected JComponent createViewPanel() {
final JPanel panel = new JPanel(new VerticalFlowLayout(FlowLayout.LEFT, true, true));
final JPanel panel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TOP, true, true));
panel.setBackground(UIUtil.isUnderDarcula() ? IpnbEditorUtil.getBackground() : Gray._247);
if (mySource.startsWith("%")) {