/*
* 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.impl;
import com.intellij.diff.DiffDialogHints;
import com.intellij.diff.util.DiffUserDataKeys;
import com.intellij.diff.util.DiffUtil;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonShortcuts;
import com.intellij.openapi.project.DumbAwareAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.WindowWrapper;
import com.intellij.openapi.ui.WindowWrapperBuilder;
import com.intellij.openapi.util.Disposer;
import com.intellij.util.ImageLoader;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
public abstract class DiffWindowBase {
@Nullable protected final Project myProject;
@NotNull protected final DiffDialogHints myHints;
private DiffRequestProcessor myProcessor;
private WindowWrapper myWrapper;
public DiffWindowBase(@Nullable Project project, @NotNull DiffDialogHints hints) {
myProject = project;
myHints = hints;
}
protected void init() {
if (myWrapper != null) return;
myProcessor = createProcessor();
String dialogGroupKey = myProcessor.getContextUserData(DiffUserDataKeys.DIALOG_GROUP_KEY);
if (dialogGroupKey == null) dialogGroupKey = "DiffContextDialog";
myWrapper = new WindowWrapperBuilder(DiffUtil.getWindowMode(myHints), new MyPanel(myProcessor.getComponent()))
.setProject(myProject)
.setParent(myHints.getParent())
.setDimensionServiceKey(dialogGroupKey)
.setOnShowCallback(new Runnable() {
@Override
public void run() {
myProcessor.updateRequest();
myProcessor.requestFocus(); // TODO: not needed for modal dialogs. Make a flag in WindowWrapperBuilder ?
}
})
.build();
myWrapper.setImage(ImageLoader.loadFromResource("/diff/Diff.png"));
Disposer.register(myWrapper, myProcessor);
new DumbAwareAction() {
public void actionPerformed(final AnActionEvent e) {
myWrapper.close();
}
}.registerCustomShortcutSet(CommonShortcuts.getCloseActiveWindow(), myProcessor.getComponent());
}
public void show() {
init();
myWrapper.show();
}
@NotNull
protected abstract DiffRequestProcessor createProcessor();
//
// Delegate
//
protected void setWindowTitle(@NotNull String title) {
myWrapper.setTitle(title);
}
protected void onAfterNavigate() {
DiffUtil.closeWindow(myWrapper.getWindow(), true, true);
}
//
// Getters
//
protected WindowWrapper getWrapper() {
return myWrapper;
}
protected DiffRequestProcessor getProcessor() {
return myProcessor;
}
private static class MyPanel extends JPanel {
public MyPanel(@NotNull JComponent content) {
super(new BorderLayout());
add(content, BorderLayout.CENTER);
}
@Override
public Dimension getPreferredSize() {
Dimension windowSize = DiffUtil.getDefaultDiffWindowSize();
Dimension size = super.getPreferredSize();
return new Dimension(Math.max(windowSize.width, size.width), Math.max(windowSize.height, size.height));
}
}
}