GT-3459 - Updated parentless dialogs to use a visible hidden parent

This commit is contained in:
dragonmacher 2020-01-17 18:51:32 -05:00
parent 6ae0c1ce23
commit e25c7d881a
9 changed files with 69 additions and 32 deletions

View File

@ -38,15 +38,8 @@ public class TextAreaDialog extends DialogComponentProvider {
return sp;
}
public void setOuterDialog(JDialog outerDialog) {
this.outerDialog = outerDialog;
}
@Override
protected void okCallback() {
if (outerDialog != null) {
outerDialog.setVisible(false);
outerDialog = null;
}
close();
}
}

View File

@ -17,9 +17,7 @@ package ghidra.feature.fid.service;
import java.util.Map.Entry;
import javax.swing.JDialog;
import docking.DockingDialog;
import docking.DockingWindowManager;
import ghidra.feature.fid.plugin.TextAreaDialog;
import ghidra.feature.fid.service.FidPopulateResult.Disposition;
@ -70,9 +68,7 @@ public class DefaultFidPopulateResultReporter implements FidPopulateResultReport
}
TextAreaDialog dialog =
new TextAreaDialog("FidDb Popluate Results", buffer.toString(), true);
JDialog d = new DockingDialog(dialog, null);
dialog.setOuterDialog(d);
d.setVisible(true);
DockingWindowManager.showDialog(dialog);
}
}

View File

@ -18,13 +18,16 @@ package docking;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
import org.apache.commons.collections4.map.LazyMap;
import docking.framework.ApplicationInformationDisplayFactory;
import docking.help.HelpDescriptor;
import generic.util.WindowUtilities;
import ghidra.framework.Application;
import ghidra.util.bean.GGlassPane;
// NOTE: this class has a static focus component variable that is set whenever the dialog gets
@ -51,18 +54,39 @@ public class DockingDialog extends JDialog implements HelpDescriptor {
private WindowAdapter modalFixWindowAdapter;
/**
* Creates a default parent frame that will appear in the OS's task bar. Having this frame
* gives the user something to click when their dialog is lost. We attempt to hide this
* frame offscreen.
*
* Note: we expect to only get here when there is no parent window found. This usually
* only happens during tests and one-off main methods that are not part of a
* running tool.
*
* @param componentProvider the dialog content for this dialog
* @return the hidden frame
*/
private static JFrame createHiddenParentFrame(DialogComponentProvider componentProvider) {
HiddenDockingFrame frame = new HiddenDockingFrame(componentProvider.getTitle());
frame.setBounds(-500, -500, 10, 10);
// we currently don't support icons from DialogComponentProvider
// frame.setIconImage( ... )
//
// Note: we expect to only get here when there is no parent window found. This usually
// only happens during tests and one-off main methods that are not part of a
// running tool
//
HiddenDockingFrame hiddenFrame = new HiddenDockingFrame(Application.getName());
hiddenFrame.setShowingAllowed(true);
List<Image> list = ApplicationInformationDisplayFactory.getWindowIcons();
hiddenFrame.setIconImages(list);
hiddenFrame.setUndecorated(true);
hiddenFrame.setBounds(-500, -500, 10, 10);
// This prevents a window from showing in the taskbar; it is assumed that we the
// window to appear in the taskbar. If clients need this in the future, then we would
// have to make it a value on the DialogComponentProvider
// frame.setHidden( true ); // make invisible
return frame;
hiddenFrame.setVisible(true);
return hiddenFrame;
}
public static DockingDialog createDialog(Window parent, DialogComponentProvider comp,
@ -94,7 +118,7 @@ public class DockingDialog extends JDialog implements HelpDescriptor {
initializeLocationAndSize(centeredOnComponent);
}
public DockingDialog(DialogComponentProvider comp, Component centeredOnComponent) {
private DockingDialog(DialogComponentProvider comp, Component centeredOnComponent) {
super(createHiddenParentFrame(comp), comp.getTitle(), comp.isModal());
init(comp);
initializeLocationAndSize(centeredOnComponent);

View File

@ -1,6 +1,5 @@
/* ###
* IP: GHIDRA
* REVIEWED: YES
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -24,13 +23,23 @@ package docking;
*/
public class HiddenDockingFrame extends DockingFrame {
private boolean showingAllowed;
public HiddenDockingFrame(String name) {
super(name);
}
@Override
void setShowingAllowed(boolean showingAllowed) {
this.showingAllowed = showingAllowed;
}
@SuppressWarnings("deprecation")
@Override
public void show() {
// overridden to make sure nobody ever sees this frame when it's hidden
// overridden to make sure only some clients can show this frame
if (showingAllowed) {
super.show();
}
}
}

View File

@ -16,7 +16,6 @@
package docking.framework;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Objects;
@ -33,14 +32,16 @@ import utility.module.ModuleUtilities;
*/
public class DockingApplicationLayout extends ApplicationLayout {
private static final String NO_RELEASE_NAME = "NO_RELEASE";
/**
* Constructs a new docking application layout object with the given name.
*
* @param name The name of the application.
* @throws FileNotFoundException if there was a problem getting a user directory.
*/
public DockingApplicationLayout(String name) throws FileNotFoundException, IOException {
this(name, null);
public DockingApplicationLayout(String name) throws FileNotFoundException {
this(name, "0.1");
}
/**
@ -51,7 +52,7 @@ public class DockingApplicationLayout extends ApplicationLayout {
* @throws FileNotFoundException if there was a problem getting a user directory.
*/
public DockingApplicationLayout(String name, String version) throws FileNotFoundException {
this(new ApplicationProperties(name, version));
this(new ApplicationProperties(name, version, NO_RELEASE_NAME));
}
/**

View File

@ -344,8 +344,9 @@ public class SplashScreen extends JWindow {
}
public static void main(String[] args) throws Exception {
ApplicationLayout layout = new DockingApplicationLayout("SplashScreen");
ApplicationLayout layout = new DockingApplicationLayout("Splash Screen Main", "1.0");
DockingApplicationConfiguration config = new DockingApplicationConfiguration();
config.setShowSplashScreen(false);
Application.initializeApplication(layout, config);
showSplashScreen();

View File

@ -23,12 +23,16 @@ import javax.swing.text.html.HTMLEditorKit;
import docking.DialogComponentProvider;
import docking.DockingWindowManager;
import docking.framework.DockingApplicationConfiguration;
import docking.framework.DockingApplicationLayout;
import docking.widgets.label.GDLabel;
import ghidra.framework.Application;
import ghidra.util.HTMLUtilities;
import ghidra.util.Msg;
import ghidra.util.layout.VerticalLayout;
import resources.ResourceManager;
import utilities.util.FileUtilities;
import utility.application.ApplicationLayout;
public class UserAgreementDialog extends DialogComponentProvider {
private static final String USER_AGREEMENT_FILENAME = "UserAgreement.html";
@ -108,7 +112,10 @@ public class UserAgreementDialog extends DialogComponentProvider {
close();
}
public static void main(String[] args) {
public static void main(String[] args) throws Exception {
ApplicationLayout layout = new DockingApplicationLayout("User Agreement Main", "1.0");
DockingApplicationConfiguration config = new DockingApplicationConfiguration();
Application.initializeApplication(layout, config);
UserAgreementDialog dialog = new UserAgreementDialog(true, true);
DockingWindowManager.showDialog(null, dialog);
}

View File

@ -151,11 +151,15 @@ public class ApplicationProperties extends Properties {
*
* @param name The application's name.
* @param version The application's version.
* @param releaseName The application's release name.
*/
public ApplicationProperties(String name, String version) {
public ApplicationProperties(String name, String version, String releaseName) {
Objects.requireNonNull(name, "Application name cannot be null");
setProperty(APPLICATION_NAME_PROPERTY, name);
Objects.requireNonNull(releaseName, "Release name cannot be null");
setProperty(RELEASE_NAME_PROPERTY, releaseName);
if (version != null) {
setProperty(APPLICATION_VERSION_PROPERTY, version);
}
@ -245,7 +249,7 @@ public class ApplicationProperties extends Properties {
}
return appVersion;
}
/**
* Gets the application's release name.
*

View File

@ -195,8 +195,10 @@ public class ApplicationVersion implements Comparable<ApplicationVersion> {
patch = parse(versionParts[2], "patch");
}
else {
String plural = version.length() > 1 ? "s" : "";
throw new IllegalArgumentException(
"Version has " + versionParts.length + " parts but 2 or 3 are required");
"Version '" + version + "' has " + versionParts.length +
" part" + plural + " but 2 or 3 are required");
}
}