/* * Copyright 2000-2015 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.diff.tools.util.side; import com.intellij.diff.DiffContext; import com.intellij.diff.contents.DiffContent; import com.intellij.diff.contents.EmptyContent; import com.intellij.diff.requests.ContentDiffRequest; import com.intellij.diff.requests.DiffRequest; import com.intellij.diff.tools.holders.EditorHolder; import com.intellij.diff.tools.holders.EditorHolderFactory; import com.intellij.diff.tools.util.DiffDataKeys; import com.intellij.diff.tools.util.SimpleDiffPanel; import com.intellij.diff.tools.util.base.ListenerDiffViewerBase; import com.intellij.diff.util.DiffUtil; import com.intellij.diff.util.Side; import com.intellij.openapi.util.Disposer; import com.intellij.pom.Navigatable; import org.jetbrains.annotations.CalledInAwt; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.List; public abstract class OnesideDiffViewer<T extends EditorHolder> extends ListenerDiffViewerBase { @NotNull protected final SimpleDiffPanel myPanel; @NotNull protected final OnesideContentPanel myContentPanel; @NotNull private final Side mySide; @NotNull private final T myHolder; public OnesideDiffViewer(@NotNull DiffContext context, @NotNull ContentDiffRequest request, @NotNull EditorHolderFactory<T> factory) { super(context, request); mySide = Side.fromRight(myRequest.getContents().get(0) instanceof EmptyContent); myHolder = createEditorHolder(factory); JComponent titlePanels = createTitle(); myContentPanel = new OnesideContentPanel(myHolder, titlePanels); myPanel = new SimpleDiffPanel(myContentPanel, this, context); } @Override protected void onInit() { super.onInit(); myPanel.setPersistentNotifications(DiffUtil.getCustomNotifications(myContext, myRequest)); } @Override @CalledInAwt protected void onDispose() { destroyEditorHolder(); super.onDispose(); } // // Editors // @NotNull protected T createEditorHolder(@NotNull EditorHolderFactory<T> factory) { DiffContent content = mySide.select(myRequest.getContents()); return factory.create(content, myContext); } private void destroyEditorHolder() { Disposer.dispose(myHolder); } @Nullable protected JComponent createTitle() { List<JComponent> simpleTitles = DiffUtil.createSimpleTitles(myRequest); return mySide.select(simpleTitles); } // // Getters // @NotNull @Override public JComponent getComponent() { return myPanel; } @Nullable @Override public JComponent getPreferredFocusedComponent() { if (!myPanel.isGoodContent()) return null; return getEditorHolder().getPreferredFocusedComponent(); } @NotNull public Side getSide() { return mySide; } @NotNull protected DiffContent getContent() { return mySide.select(myRequest.getContents()); } @NotNull protected T getEditorHolder() { return myHolder; } @Nullable @Override public Object getData(@NonNls String dataId) { if (DiffDataKeys.CURRENT_CONTENT.is(dataId)) { return getContent(); } return super.getData(dataId); } // // Misc // @Nullable @Override protected Navigatable getNavigatable() { return getContent().getNavigatable(); } public static <T extends EditorHolder> boolean canShowRequest(@NotNull DiffContext context, @NotNull DiffRequest request, @NotNull EditorHolderFactory<T> factory) { if (!(request instanceof ContentDiffRequest)) return false; List<DiffContent> contents = ((ContentDiffRequest)request).getContents(); if (contents.size() != 2) return false; DiffContent content1 = contents.get(0); DiffContent content2 = contents.get(1); if (content1 instanceof EmptyContent) { return factory.canShowContent(content2, context) && factory.wantShowContent(content2, context); } if (content2 instanceof EmptyContent) { return factory.canShowContent(content1, context) && factory.wantShowContent(content1, context); } return false; } }