This commit is contained in:
Alexey Kudravtsev
2011-09-16 13:20:04 +04:00
parent 49cbd9d274
commit 296c953cff
15 changed files with 85 additions and 79 deletions
@@ -19,7 +19,10 @@
*/
package com.intellij.openapi.project;
import com.intellij.ide.DataManager;
import com.intellij.ide.highlighter.InternalFileType;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
@@ -36,6 +39,7 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.io.File;
public class ProjectUtil {
@@ -134,4 +138,19 @@ public class ProjectUtil {
if (fileType instanceof InternalFileType) return true;
return file.getPath().contains("/"+ DIRECTORY_BASED_PROJECT_DIR +"/");
}
@NotNull
public static Project guessCurrentProject(JComponent component) {
Project project = null;
Project[] openProjects = ProjectManager.getInstance().getOpenProjects();
if (openProjects.length > 0) project = openProjects[0];
if (project == null) {
DataContext dataContext = component == null ? DataManager.getInstance().getDataContext() : DataManager.getInstance().getDataContext(component);
project = PlatformDataKeys.PROJECT.getData(dataContext);
}
if (project == null) {
project = ProjectManager.getInstance().getDefaultProject();
}
return project;
}
}
@@ -18,10 +18,8 @@ package com.intellij.application.options;
import com.intellij.application.options.codeStyle.CodeStyleSchemesModel;
import com.intellij.application.options.codeStyle.LanguageSelector;
import com.intellij.codeStyle.CodeStyleFacade;
import com.intellij.ide.DataManager;
import com.intellij.lang.Language;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.application.ApplicationBundle;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
@@ -35,7 +33,7 @@ import com.intellij.openapi.editor.highlighter.EditorHighlighter;
import com.intellij.openapi.editor.markup.*;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
@@ -183,7 +181,7 @@ public abstract class CodeStyleAbstractPanel implements Disposable {
int currOffs = myEditor.getScrollingModel().getVerticalScrollOffset();
final Project finalProject = getCurrentProject();
final Project finalProject = ProjectUtil.guessCurrentProject(getPanel());
CommandProcessor.getInstance().executeCommand(finalProject, new Runnable() {
public void run() {
replaceText(finalProject);
@@ -197,7 +195,7 @@ public abstract class CodeStyleAbstractPanel implements Disposable {
private int getAdjustedRightMargin() {
int result = getRightMargin();
return result > 0 ? result : CodeStyleFacade.getInstance(getCurrentProject()).getRightMargin();
return result > 0 ? result : CodeStyleFacade.getInstance(ProjectUtil.guessCurrentProject(getPanel())).getRightMargin();
}
protected abstract int getRightMargin();
@@ -294,19 +292,6 @@ public abstract class CodeStyleAbstractPanel implements Disposable {
return psiFile;
}
protected Project getCurrentProject() {
Project project = null;
Project[] openProjects = ProjectManager.getInstance().getOpenProjects();
if (openProjects.length > 0) project = openProjects[0];
if (project == null) {
project = PlatformDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext(getPanel()));
}
if (project == null) {
project = ProjectManager.getInstance().getDefaultProject();
}
return project;
}
private void highlightChanges(Document beforeReformat) {
if (mySkipPreviewHighlighting) {
return;
@@ -593,7 +578,7 @@ public abstract class CodeStyleAbstractPanel implements Disposable {
}
public final void applyPredefinedSettings(@NotNull PredefinedCodeStyle codeStyle) {
CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getCurrentProject()).clone();
CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(ProjectUtil.guessCurrentProject(getPanel())).clone();
codeStyle.apply(settings);
reset(settings);
onSomethingChanged();
@@ -28,6 +28,7 @@ import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeEditorHighlighterProviders;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectUtil;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiFile;
import com.intellij.psi.codeStyle.CodeStyleManager;
@@ -168,7 +169,8 @@ public abstract class MultilanguageCodeStyleAbstractPanel extends CodeStyleAbstr
@Nullable
protected EditorHighlighter createHighlighter(final EditorColorsScheme scheme) {
FileType fileType = getFileType();
return FileTypeEditorHighlighterProviders.INSTANCE.forFileType(fileType).getEditorHighlighter(getCurrentProject(), fileType, null, scheme);
return FileTypeEditorHighlighterProviders.INSTANCE.forFileType(fileType).getEditorHighlighter(
ProjectUtil.guessCurrentProject(getPanel()), fileType, null, scheme);
}
@@ -26,6 +26,7 @@ import com.intellij.openapi.diff.DiffPanel;
import com.intellij.openapi.diff.ex.DiffPanelEx;
import com.intellij.openapi.diff.ex.DiffPanelOptions;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.ExcludingTraversalPolicy;
@@ -45,12 +46,6 @@ public class FileHistoryDialog extends HistoryDialog<FileHistoryDialogModel> {
super(p, gw, f, doInit);
}
@Override
public void dispose() {
myDiffPanel.dispose();
super.dispose();
}
@Override
protected FileHistoryDialogModel createModel(LocalHistoryFacade vcs) {
return new EntireFileHistoryDialogModel(myProject, myGateway, vcs, myFile);
@@ -58,10 +53,9 @@ public class FileHistoryDialog extends HistoryDialog<FileHistoryDialogModel> {
@Override
protected Pair<JComponent, Dimension> createDiffPanel(JPanel root, ExcludingTraversalPolicy traversalPolicy) {
myDiffPanel = DiffManager.getInstance().createDiffPanel(getFrame(), myProject);
myDiffPanel = DiffManager.getInstance().createDiffPanel(getFrame(), myProject,this);
DiffPanelOptions o = ((DiffPanelEx)myDiffPanel).getOptions();
o.setRequestFocusOnNewContent(false);
return Pair.create((JComponent)myDiffPanel.getComponent(), null);
}
@@ -129,7 +129,7 @@ public abstract class DiffElement<T> implements Disposable {
return null;
}
if (request != null) {
myDiffPanel = DiffManager.getInstance().createDiffPanel(parentWindow, project);
myDiffPanel = DiffManager.getInstance().createDiffPanel(parentWindow, project,this);
myDiffPanel.setRequestFocus(false);
myDiffPanel.setDiffRequest(request);
myDiffPanel.setTitle1(getName());
@@ -15,9 +15,11 @@
*/
package com.intellij.openapi.diff;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.editor.markup.MarkupEditorFilter;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import java.awt.*;
@@ -62,6 +64,9 @@ public abstract class DiffManager {
/**
* @param window this window will be disposed, when user clicks on the line number
* You must call Disposer.dispose() when done.
* @deprecated use {@link #createDiffPanel(Window, Project, Disposable)} instead
*/
public abstract DiffPanel createDiffPanel(Window window, Project project);
public abstract DiffPanel createDiffPanel(Window window, Project project, @NotNull Disposable parentDisposable);
}
@@ -23,13 +23,14 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
public class DialogBuilder {
public class DialogBuilder implements Disposable {
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.ui.DialogBuilder");
@NonNls public static final String REQUEST_FOCUS_ENABLED = "requestFocusEnabled";
@@ -40,7 +41,6 @@ public class DialogBuilder {
private String myDimensionServiceKey;
private ArrayList<ActionDescriptor> myActions = null;
private final MyDialogWrapper myDialogWrapper;
private final ArrayList<Disposable> myDisposables = new ArrayList<Disposable>();
private Runnable myCancelOperation = null;
private Runnable myOkOperation = null;
@@ -54,10 +54,16 @@ public class DialogBuilder {
public DialogBuilder(Project project) {
myDialogWrapper = new MyDialogWrapper(project, true);
Disposer.register(myDialogWrapper.getDisposable(), this);
}
public DialogBuilder(Component parent) {
myDialogWrapper = new MyDialogWrapper(parent, true);
Disposer.register(myDialogWrapper.getDisposable(), this);
}
@Override
public void dispose() {
}
private MyDialogWrapper showImpl(boolean isModal) {
@@ -118,8 +124,8 @@ public class DialogBuilder {
return closeAction;
}
public void addDisposable(Disposable disposable) {
myDisposables.add(disposable);
public void addDisposable(@NotNull Disposable disposable) {
Disposer.register(this, disposable);
}
public void setButtonsAlignment(int alignment) {
@@ -292,9 +298,6 @@ public class DialogBuilder {
public void dispose() {
myPreferedFocusComponent = null;
for (Disposable disposable : myDisposables) {
Disposer.dispose(disposable);
}
super.dispose();
}
@@ -45,7 +45,6 @@ public class DiffUtil {
frameWrapper.setImage(ImageLoader.loadFromResource("/diff/Diff.png"));
frameWrapper.setPreferredFocusedComponent(diffPanel.getPreferredFocusedComponent());
frameWrapper.closeOnEsc();
frameWrapper.addDisposable(diffPanel);
}
@Nullable
@@ -22,7 +22,6 @@ import com.intellij.openapi.fileEditor.ex.FileEditorProviderManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
@@ -68,15 +67,9 @@ public class BinaryDiffTool implements DiffTool {
return new Action[]{close};
}
@Override
protected void dispose() {
super.dispose();
Disposer.dispose(myPanel);
}
@Override
protected JComponent createCenterPanel() {
myPanel = DiffManager.getInstance().createDiffPanel(getWindow(), project);
myPanel = DiffManager.getInstance().createDiffPanel(getWindow(), project,getDisposable());
myPanel.setDiffRequest(data);
myPanel.setTitle1(src.getPath());
myPanel.setTitle2(trg.getPath());
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.diff.impl.external;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.diff.DiffManager;
import com.intellij.openapi.diff.DiffPanel;
@@ -26,10 +27,7 @@ import com.intellij.openapi.diff.impl.mergeTool.MergeTool;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.markup.MarkupEditorFilter;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.InvalidDataException;
import com.intellij.openapi.util.JDOMExternalizable;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.WriteExternalException;
import com.intellij.openapi.util.*;
import com.intellij.util.config.*;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
@@ -120,6 +118,13 @@ public class DiffManagerImpl extends DiffManager implements JDOMExternalizable {
return new DiffPanelImpl(window, project, true, true);
}
@Override
public DiffPanel createDiffPanel(Window window, Project project, @NotNull Disposable parentDisposable) {
DiffPanel diffPanel = createDiffPanel(window, project);
Disposer.register(parentDisposable, diffPanel);
return diffPanel;
}
public static DiffManagerImpl getInstanceEx() {
return (DiffManagerImpl)DiffManager.getInstance();
}
@@ -151,10 +156,10 @@ public class DiffManagerImpl extends DiffManager implements JDOMExternalizable {
public AbstractProperty.AbstractPropertyContainer getProperties() { return myProperties; }
public static DiffPanel createDiffPanel(DiffRequest data, Window window) {
static DiffPanel createDiffPanel(DiffRequest data, Window window, @NotNull Disposable parentDisposable) {
DiffPanel diffPanel = null;
try {
diffPanel = DiffManager.getInstance().createDiffPanel(window, data.getProject());
diffPanel = DiffManager.getInstance().createDiffPanel(window, data.getProject(), parentDisposable);
int contentCount = data.getContents().length;
LOG.assertTrue(contentCount == 2, String.valueOf(contentCount));
LOG.assertTrue(data.getContentTitles().length == contentCount);
@@ -162,7 +167,9 @@ public class DiffManagerImpl extends DiffManager implements JDOMExternalizable {
return diffPanel;
}
catch (RuntimeException e) {
if (diffPanel != null) diffPanel.dispose();
if (diffPanel != null) {
Disposer.dispose(diffPanel);
}
throw e;
}
}
@@ -15,6 +15,7 @@
*/
package com.intellij.openapi.diff.impl.external;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CustomShortcutSet;
@@ -22,13 +23,15 @@ import com.intellij.openapi.diff.*;
import com.intellij.openapi.diff.impl.ComparisonPolicy;
import com.intellij.openapi.diff.impl.DiffPanelImpl;
import com.intellij.openapi.diff.impl.DiffUtil;
import com.intellij.openapi.ui.FrameWrapper;
import com.intellij.openapi.keymap.KeymapManager;
import com.intellij.openapi.ui.DialogBuilder;
import com.intellij.openapi.ui.FrameWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.ex.MessagesEx;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -45,10 +48,9 @@ class FrameDiffTool implements DiffTool {
boolean shouldOpenDialog = shouldOpenDialog(hints);
if (shouldOpenDialog) {
final DialogBuilder builder = new DialogBuilder(request.getProject());
DiffPanelImpl diffPanel = createDiffPanelIfShouldShow(request, builder.getWindow());
DiffPanelImpl diffPanel = createDiffPanelIfShouldShow(request, builder.getWindow(), builder);
if (diffPanel == null) return;
builder.setCenterPanel(diffPanel.getComponent());
builder.addDisposable(diffPanel);
builder.setPreferedFocusComponent(diffPanel.getPreferredFocusedComponent());
builder.removeAllActions();
builder.setTitle(request.getWindowTitle());
@@ -61,9 +63,10 @@ class FrameDiffTool implements DiffTool {
}.registerCustomShortcutSet(new CustomShortcutSet(KeymapManager.getInstance().getActiveKeymap().getShortcuts("CloseContent")),
diffPanel.getComponent());
showDiffDialog(builder, hints);
} else {
}
else {
final FrameWrapper frameWrapper = new FrameWrapper(request.getProject(), request.getGroupKey());
DiffPanelImpl diffPanel = createDiffPanelIfShouldShow(request, frameWrapper.getFrame());
DiffPanelImpl diffPanel = createDiffPanelIfShouldShow(request, frameWrapper.getFrame(), frameWrapper);
if (diffPanel == null) return;
frameWrapper.setTitle(request.getWindowTitle());
DiffUtil.initDiffFrame(frameWrapper, diffPanel);
@@ -80,10 +83,10 @@ class FrameDiffTool implements DiffTool {
}
@Nullable
private static DiffPanelImpl createDiffPanelIfShouldShow(DiffRequest request, Window window) {
DiffPanelImpl diffPanel = (DiffPanelImpl)DiffManagerImpl.createDiffPanel(request, window);
private static DiffPanelImpl createDiffPanelIfShouldShow(DiffRequest request, Window window, @NotNull Disposable parentDisposable) {
DiffPanelImpl diffPanel = (DiffPanelImpl)DiffManagerImpl.createDiffPanel(request, window, parentDisposable);
if (checkNoDifferenceAndNotify(diffPanel, request, window)) {
diffPanel.dispose();
Disposer.dispose(diffPanel);
diffPanel = null;
}
return diffPanel;
@@ -106,11 +109,12 @@ class FrameDiffTool implements DiffTool {
if (!Comparing.equal(manager.getComparisonPolicy(), ComparisonPolicy.DEFAULT)) {
ComparisonPolicy oldPolicy = manager.getComparisonPolicy();
manager.setComparisonPolicy(ComparisonPolicy.DEFAULT);
DiffPanel maybeDiffPanel = DiffManagerImpl.createDiffPanel(data, window);
Disposable parentDisposable = Disposer.newDisposable();
DiffPanel maybeDiffPanel = DiffManagerImpl.createDiffPanel(data, window, parentDisposable);
manager.setComparisonPolicy(oldPolicy);
boolean hasDiffs = maybeDiffPanel.hasDifferences();
maybeDiffPanel.dispose();
Disposer.dispose(parentDisposable);
if (hasDiffs) return false;
}
@@ -131,11 +135,9 @@ class FrameDiffTool implements DiffTool {
MessagesEx.error(data.getProject(), e.getMessage()).showNow();
return false;
}
String message;
if (Arrays.equals(bytes1, bytes2))
message = DiffBundle.message("diff.contents.are.identical.message.text");
else
message = DiffBundle.message("diff.contents.have.differences.only.in.line.separators.message.text");
String message = Arrays.equals(bytes1, bytes2)
? DiffBundle.message("diff.contents.are.identical.message.text")
: DiffBundle.message("diff.contents.have.differences.only.in.line.separators.message.text");
Messages.showInfoMessage(data.getProject(), message, DiffBundle.message("no.differences.dialog.title"));
return false;
//return Messages.showDialog(data.getProject(), message + "\nShow diff anyway?", "No Differences", new String[]{"Yes", "No"}, 1,
@@ -537,14 +537,13 @@ public class FileDocumentManagerImpl extends FileDocumentManager implements Appl
request.setContentTitles(UIBundle.message("file.cache.conflict.diff.content.file.system.content"),
UIBundle.message("file.cache.conflict.diff.content.memory.content"));
DialogBuilder diffBuilder = new DialogBuilder(project);
DiffPanelImpl diffPanel = (DiffPanelImpl)DiffManager.getInstance().createDiffPanel(diffBuilder.getWindow(), project);
DiffPanelImpl diffPanel = (DiffPanelImpl)DiffManager.getInstance().createDiffPanel(diffBuilder.getWindow(), project,diffBuilder);
diffPanel.getOptions().setShowSourcePolicy(DiffPanelOptions.ShowSourcePolicy.DONT_SHOW);
diffBuilder.setCenterPanel(diffPanel.getComponent());
diffPanel.setDiffRequest(request);
diffBuilder.addOkAction().setText(UIBundle.message("file.cache.conflict.save.changes.button"));
diffBuilder.addCancelAction();
diffBuilder.setTitle(windowtitle);
diffBuilder.addDisposable(diffPanel);
if (diffBuilder.show() == DialogWrapper.OK_EXIT_CODE) {
builder.getDialogWrapper().close(DialogWrapper.CANCEL_EXIT_CODE);
}
@@ -43,7 +43,7 @@ import javax.swing.*;
* Time: 3:13 PM
*/
public abstract class AbstractRefreshablePanel<T> implements RefreshablePanel {
private final static Logger LOG = Logger.getInstance("#com.intellij.openapi.vcs.changes.AbstractRefreshablePanel");
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.vcs.changes.AbstractRefreshablePanel");
private final Ticket myTicket;
private final DetailsPanel myDetailsPanel;
private final GenericDetailsLoader<Ticket, T> myDetailsLoader;
@@ -128,7 +128,7 @@ public class VcsChangeDetailsManager {
myRequestFromChange = new BinaryDiffRequestFromChange(myProject);
myChangeListManager = ChangeListManager.getInstance(myProject);
myPanel = DiffManager.getInstance().createDiffPanel(null, myProject);
myPanel = DiffManager.getInstance().createDiffPanel(null, myProject,this);
myPanel.enableToolbar(false);
myPanel.removeStatusBar();
DiffPanelOptions o = ((DiffPanelEx)myPanel).getOptions();
@@ -188,7 +188,6 @@ public class VcsChangeDetailsManager {
@Override
protected void disposeImpl() {
Disposer.dispose(myPanel);
}
@Override
@@ -69,14 +69,14 @@ public class VcsHistoryDialog extends DialogWrapper implements DataProvider {
private final DiffPanel myDiffPanel;
private final Project myProject;
private final static ColumnInfo REVISION = new ColumnInfo(VcsBundle.message("column.name.revision.version")) {
private static final ColumnInfo REVISION = new ColumnInfo(VcsBundle.message("column.name.revision.version")) {
public Object valueOf(Object object) {
return ((VcsFileRevision)object).getRevisionNumber();
}
};
private final static ColumnInfo DATE = new ColumnInfo(VcsBundle.message("column.name.revision.list.date")) {
private static final ColumnInfo DATE = new ColumnInfo(VcsBundle.message("column.name.revision.list.date")) {
public Object valueOf(Object object) {
Date date = ((VcsFileRevision)object).getRevisionDate();
if (date == null) return "";
@@ -85,21 +85,21 @@ public class VcsHistoryDialog extends DialogWrapper implements DataProvider {
};
private final static ColumnInfo MESSAGE = new ColumnInfo(VcsBundle.message("column.name.revision.list.message")) {
private static final ColumnInfo MESSAGE = new ColumnInfo(VcsBundle.message("column.name.revision.list.message")) {
public Object valueOf(Object object) {
return ((VcsFileRevision)object).getCommitMessage();
}
};
private final static ColumnInfo AUTHOR = new ColumnInfo(VcsBundle.message("column.name.revision.list.author")) {
private static final ColumnInfo AUTHOR = new ColumnInfo(VcsBundle.message("column.name.revision.list.author")) {
public Object valueOf(Object object) {
return ((VcsFileRevision)object).getAuthor();
}
};
private final static ColumnInfo[] COLUMNS = new ColumnInfo[]{REVISION, DATE, AUTHOR, MESSAGE};
private static final ColumnInfo[] COLUMNS = new ColumnInfo[]{REVISION, DATE, AUTHOR, MESSAGE};
private final TableView myList;
protected final List<VcsFileRevision> myRevisions;
@@ -139,7 +139,7 @@ public class VcsHistoryDialog extends DialogWrapper implements DataProvider {
myList.getEmptyText().setText(VcsBundle.message("history.empty"));
myDiffPanel = DiffManager.getInstance().createDiffPanel(getWindow(), myProject);
myDiffPanel = DiffManager.getInstance().createDiffPanel(getWindow(), myProject,getDisposable());
myRevisions.addAll(session.getRevisionList());
final VcsRevisionNumber currentRevisionNumber = session.getCurrentRevisionNumber();
@@ -315,7 +315,6 @@ public class VcsHistoryDialog extends DialogWrapper implements DataProvider {
public synchronized void dispose() {
myIsDisposed = true;
myDiffPanel.dispose();
super.dispose();
}