From f3ef6956c92996e45bf4c67ad4ade13190677d0e Mon Sep 17 00:00:00 2001 From: dragonmacher Date: Thu, 28 Mar 2019 18:25:09 -0400 Subject: [PATCH] GT-2705 - File Import - review fixes; updated transient project dialogs to not have copy/paste actions etc --- .../core/datamgr/DataTypesActionContext.java | 14 +-- .../ghidra/framework/main/DataTreeDialog.java | 12 +- .../src/main/java/docking/ActionContext.java | 11 +- .../tree/support/GTreeNodeTransferable.java | 119 +++++++++--------- .../datatable/ProjectDataActionContext.java | 17 +++ .../datatable/ProjectDataContextAction.java | 29 ++++- .../ProjectDataContextToggleAction.java | 23 +++- .../ProjectDataTreeContextAction.java | 27 +++- .../main/datatree/DataTreeClipboardUtils.java | 16 +-- .../datatree/DataTreeNodeTransferable.java | 30 ----- .../ProjectDataTreeActionContext.java | 8 +- .../main/datatree/ProjectDataTreePanel.java | 7 +- .../actions/ProjectDataCollapseAction.java | 2 +- .../actions/ProjectDataCopyAction.java | 2 +- .../actions/ProjectDataCutAction.java | 2 +- .../actions/ProjectDataExpandAction.java | 2 +- .../actions/ProjectDataNewFolderAction.java | 6 + .../actions/ProjectDataPasteAction.java | 2 +- .../actions/ProjectDataReadOnlyAction.java | 4 + .../actions/ProjectDataSelectAction.java | 2 +- 20 files changed, 201 insertions(+), 134 deletions(-) delete mode 100644 Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DataTreeNodeTransferable.java diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypesActionContext.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypesActionContext.java index 40aed341b9..4b8ebb9d45 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypesActionContext.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypesActionContext.java @@ -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. @@ -16,6 +15,12 @@ */ package ghidra.app.plugin.core.datamgr; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.tree.TreePath; + +import docking.widgets.tree.GTreeNode; import ghidra.app.context.ProgramActionContext; import ghidra.app.plugin.core.datamgr.archive.ProjectArchive; import ghidra.app.plugin.core.datamgr.tree.DataTypeArchiveGTree; @@ -24,13 +29,6 @@ import ghidra.framework.main.datatable.DomainFileProvider; import ghidra.framework.model.DomainFile; import ghidra.program.model.listing.Program; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.tree.TreePath; - -import docking.widgets.tree.GTreeNode; - public class DataTypesActionContext extends ProgramActionContext implements DomainFileProvider { private final GTreeNode clickedNode; private final boolean isToolbarAction; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/framework/main/DataTreeDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/framework/main/DataTreeDialog.java index cee3dd427a..526202aadd 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/framework/main/DataTreeDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/framework/main/DataTreeDialog.java @@ -26,6 +26,7 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import docking.*; +import docking.event.mouse.GMouseListenerAdapter; import docking.widgets.tree.support.GTreeSelectionEvent; import docking.widgets.tree.support.GTreeSelectionListener; import ghidra.framework.main.datatree.ClearCutAction; @@ -40,7 +41,7 @@ import ghidra.util.layout.PairLayout; * Dialog to open or save domain data items to a new location or name. */ public class DataTreeDialog extends DialogComponentProvider -implements GTreeSelectionListener, ActionListener { + implements GTreeSelectionListener, ActionListener { /** * Dialog type for opening domain data files. @@ -540,10 +541,11 @@ implements GTreeSelectionListener, ActionListener { protected void addTreeListeners() { if (type == OPEN) { - treePanel.addTreeMouseListener(new MouseAdapter() { + + treePanel.addTreeMouseListener(new GMouseListenerAdapter() { @Override - public void mousePressed(MouseEvent e) { - if (e.getClickCount() == 2 && okButton.isEnabled()) { + public void doubleClickTriggered(MouseEvent e) { + if (okButton.isEnabled()) { okCallback(); } } @@ -671,7 +673,7 @@ implements GTreeSelectionListener, ActionListener { // populate the combo box DefaultComboBoxModel model = - (DefaultComboBoxModel) projectComboBox.getModel(); + (DefaultComboBoxModel) projectComboBox.getModel(); model.removeAllElements(); Set map = new HashSet<>(); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/ActionContext.java b/Ghidra/Framework/Docking/src/main/java/docking/ActionContext.java index 3fed77d232..f9d950e63e 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/ActionContext.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/ActionContext.java @@ -47,7 +47,12 @@ public class ActionContext { } /** - * For Testing + * Constructor + * + * @param provider the ComponentProvider that generated this context. + * @param contextObject an optional contextObject that the ComponentProvider can provide + * @param sourceObject an optional source object; this can be anything that actions wish to + * later retrieve */ public ActionContext(ComponentProvider provider, Object contextObject, Object sourceObject) { this(provider, contextObject); @@ -55,8 +60,8 @@ public class ActionContext { } /** - * Returns the {@link #ComponentProvider} that generated this ActionContext - * @return + * Returns the {@link ComponentProvider} that generated this ActionContext + * @return the provider */ public ComponentProvider getComponentProvider() { return provider; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeNodeTransferable.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeNodeTransferable.java index db434c3374..7a517077b1 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeNodeTransferable.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeNodeTransferable.java @@ -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. @@ -19,69 +18,75 @@ package docking.widgets.tree.support; import java.awt.datatransfer.*; import java.io.IOException; import java.util.List; +import java.util.Objects; import docking.widgets.tree.GTreeNode; /** - * A transferable for sharing data via drag/drop and clipboard operations for GTrees. + * A transferable for sharing data via drag/drop and clipboard operations for GTrees */ public class GTreeNodeTransferable implements Transferable { - private final List selectedData; - private final GTreeTransferHandler transferHandler; + private final List selectedData; + private final GTreeTransferHandler transferHandler; - /** - * Creates this transferable based upon the selected data and uses the given transfer - * handler to perform {@link Transferable} operations. - * @param handler the handler used to perform transfer operations. - * @param selectedData The - */ - public GTreeNodeTransferable( GTreeTransferHandler handler, List selectedData) { - this.selectedData = selectedData; - this.transferHandler = handler; - } - - /** - * Returns all of the original selected data contained by this transferable. - * @return all of the original selected data contained by this transferable - */ - public List getAllData() { - return selectedData; - } - - /** - * Gets the transfer data from the selection based upon the given flavor. - * @param transferNodes The nodes from which to get the data. - * @param flavor The flavor of data to retreive from the given selection. - * @return the transfer data from the selection based upon the given flavor. - * @throws UnsupportedFlavorException if the given flavor is not one of the supported flavors - * returned by {@link #getSupportedDataFlavors(List)}. - */ - public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { - return transferHandler.getTransferData(selectedData, flavor); - } - - /** - * Returns the DataFlavors for the types of data that this transferable supports, based upon - * the given selection. - * @param transferNodes The nodes to base the DataFlavor selection upon. - * @return the DataFlavors for the types of data that this transferable supports, based upon - * the given selection. + /** + * Creates this transferable based upon the selected data and uses the given transfer + * handler to perform {@link Transferable} operations + * + * @param handler the handler used to perform transfer operations + * @param selectedData The selected tree nodes */ - public DataFlavor[] getTransferDataFlavors() { - return transferHandler.getSupportedDataFlavors(selectedData); - } + public GTreeNodeTransferable(GTreeTransferHandler handler, List selectedData) { + this.transferHandler = Objects.requireNonNull(handler); + this.selectedData = Objects.requireNonNull(selectedData); + } - /** - * A convenience method to determine if this transferable supports the given flavor. - * @return true if this transferable supports the given flavor. - */ - public boolean isDataFlavorSupported(DataFlavor flavor) { - DataFlavor[] flavors = transferHandler.getSupportedDataFlavors(selectedData); - for(int i=0;i getAllData() { + return selectedData; + } + + /** + * Gets the transfer data from the selection based upon the given flavor + + * @param flavor The flavor of data to retrieve from the given selection. + * @return the transfer data from the selection based upon the given flavor. + * @throws UnsupportedFlavorException if the given flavor is not one of the supported flavors + * returned by {@link #getTransferDataFlavors()} + */ + @Override + public Object getTransferData(DataFlavor flavor) + throws UnsupportedFlavorException, IOException { + return transferHandler.getTransferData(selectedData, flavor); + } + + /** + * Returns the DataFlavors for the types of data that this transferable supports, based upon + * the given selection + * + * @return the DataFlavors for the types of data that this transferable supports, based upon + * the given selection + */ + @Override + public DataFlavor[] getTransferDataFlavors() { + return transferHandler.getSupportedDataFlavors(selectedData); + } + + /** + * A convenience method to determine if this transferable supports the given flavor + * @return true if this transferable supports the given flavor + */ + @Override + public boolean isDataFlavorSupported(DataFlavor flavor) { + DataFlavor[] flavors = transferHandler.getSupportedDataFlavors(selectedData); + for (DataFlavor f : flavors) { + if (f.equals(flavor)) { + return true; + } + } + return false; + } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataActionContext.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataActionContext.java index 179325b06a..c2acecdda6 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataActionContext.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataActionContext.java @@ -30,6 +30,7 @@ public class ProjectDataActionContext extends ActionContext implements DomainFil private Component comp; private boolean isActiveProject; private ProjectData projectData; + private boolean isTransient; public ProjectDataActionContext(ComponentProvider provider, ProjectData projectData, Object contextObject, List selectedFolders, @@ -112,4 +113,20 @@ public class ProjectDataActionContext extends ActionContext implements DomainFil } return false; } + + /** + * Transient data is that which will appear in a temporary project dialog + * @param isTransient true if transient + */ + public void setTransient(boolean isTransient) { + this.isTransient = isTransient; + } + + /** + * Transient data is that which will appear in a temporary project dialog + * @return true if transient + */ + public boolean isTransient() { + return isTransient; + } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataContextAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataContextAction.java index 5e9daa17eb..dd853ebb3a 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataContextAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataContextAction.java @@ -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. @@ -26,20 +25,42 @@ public abstract class ProjectDataContextAction extends DockingAction { } @Override - public final boolean isEnabledForContext(ActionContext actionContext) { + public boolean isEnabledForContext(ActionContext actionContext) { if (!(actionContext instanceof ProjectDataActionContext)) { return false; } + ProjectDataActionContext context = (ProjectDataActionContext) actionContext; + if (ignoreTransientProject(context)) { + return false; + } + return isEnabledForContext(context); } + protected boolean ignoreTransientProject(ProjectDataActionContext context) { + if (supportsTransientProjectData()) { + return false; + } + return context.isTransient(); + } + + /** + * Signals that this action can work on normal project data, as well as transient data. + * Transient data is that which will appear in a temporary project dialog. + * + * @return true if this action works on transient project data + */ + protected boolean supportsTransientProjectData() { + return false; + } + protected boolean isEnabledForContext(ProjectDataActionContext context) { return context.hasOneOrMoreFilesAndFolders(); } @Override - public final void actionPerformed(ActionContext context) { + public void actionPerformed(ActionContext context) { actionPerformed((ProjectDataActionContext) context); } @@ -59,7 +80,7 @@ public abstract class ProjectDataContextAction extends DockingAction { @Override public boolean isAddToPopup(ActionContext context) { - if (!(context instanceof ProjectDataActionContext)) { + if (!isEnabledForContext(context)) { return false; } return isAddToPopup((ProjectDataActionContext) context); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataContextToggleAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataContextToggleAction.java index d1fcb555f5..2b9dc7b39c 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataContextToggleAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataContextToggleAction.java @@ -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. @@ -30,10 +29,32 @@ public abstract class ProjectDataContextToggleAction extends ToggleDockingAction if (!(actionContext instanceof ProjectDataActionContext)) { return false; } + ProjectDataActionContext context = (ProjectDataActionContext) actionContext; + if (ignoreTransientProject(context)) { + return false; + } + return isEnabledForContext(context); } + protected boolean ignoreTransientProject(ProjectDataActionContext context) { + if (supportsTransientProjectData()) { + return false; + } + return context.isTransient(); + } + + /** + * Signals that this action can work on normal project data, as well as transient data. + * Transient data is that which will appear in a temporary project dialog. + * + * @return true if this action works on transient project data + */ + protected boolean supportsTransientProjectData() { + return false; + } + protected boolean isEnabledForContext(ProjectDataActionContext context) { return context.hasOneOrMoreFilesAndFolders(); } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTreeContextAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTreeContextAction.java index 137b73986f..7df40012df 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTreeContextAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTreeContextAction.java @@ -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. @@ -16,9 +15,9 @@ */ package ghidra.framework.main.datatable; -import ghidra.framework.main.datatree.ProjectDataTreeActionContext; import docking.ActionContext; import docking.action.DockingAction; +import ghidra.framework.main.datatree.ProjectDataTreeActionContext; public abstract class ProjectDataTreeContextAction extends DockingAction { @@ -31,10 +30,32 @@ public abstract class ProjectDataTreeContextAction extends DockingAction { if (!(actionContext instanceof ProjectDataTreeActionContext)) { return false; } + ProjectDataTreeActionContext context = (ProjectDataTreeActionContext) actionContext; + if (ignoreTransientProject(context)) { + return false; + } + return isEnabledForContext(context); } + protected boolean ignoreTransientProject(ProjectDataActionContext context) { + if (supportsTransientProjectData()) { + return false; + } + return context.isTransient(); + } + + /** + * Signals that this action can work on normal project data, as well as transient data. + * Transient data is that which will appear in a temporary project dialog. + * + * @return true if this action works on transient project data + */ + protected boolean supportsTransientProjectData() { + return false; + } + protected boolean isEnabledForContext(ProjectDataTreeActionContext context) { return context.hasOneOrMoreFilesAndFolders(); } @@ -60,7 +81,7 @@ public abstract class ProjectDataTreeContextAction extends DockingAction { @Override public boolean isAddToPopup(ActionContext context) { - if (!(context instanceof ProjectDataTreeActionContext)) { + if (!isEnabledForContext(context)) { return false; } return isAddToPopup((ProjectDataTreeActionContext) context); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DataTreeClipboardUtils.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DataTreeClipboardUtils.java index 40cdb3a720..f522152a2a 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DataTreeClipboardUtils.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DataTreeClipboardUtils.java @@ -23,6 +23,7 @@ import javax.swing.tree.TreePath; import docking.dnd.GClipboard; import docking.widgets.tree.GTreeNode; +import docking.widgets.tree.support.GTreeNodeTransferable; import ghidra.util.Msg; /** @@ -35,14 +36,8 @@ public class DataTreeClipboardUtils { * Static instance of a callback handler that is notified when the clipboard is changed * and our data is discarded. */ - private static final ClipboardOwner DATATREE_CLIPBOARD_OWNER = new ClipboardOwner() { - @Override - public void lostOwnership(Clipboard clipboard, Transferable contents) { - // This is called when something other than this class modifies the clipboard - // and our data is discarded. - clearCuttables(contents); - } - }; + private static final ClipboardOwner DATATREE_CLIPBOARD_OWNER = + (clipboard, contents) -> clearCuttables(contents); /** * Pushes the GTreeNodes in the specified TreePath array to the clipboard. @@ -59,8 +54,9 @@ public class DataTreeClipboardUtils { GTreeNode node = (GTreeNode) element.getLastPathComponent(); list.add(node); } - DataTreeNodeTransferable contents = - new DataTreeNodeTransferable(tree.getDragNDropHandler(), list); + + GTreeNodeTransferable contents = + new GTreeNodeTransferable(tree.getDragNDropHandler(), list); try { clipboard.setContents(contents, DATATREE_CLIPBOARD_OWNER); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DataTreeNodeTransferable.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DataTreeNodeTransferable.java deleted file mode 100644 index 793a178278..0000000000 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DataTreeNodeTransferable.java +++ /dev/null @@ -1,30 +0,0 @@ -/* ### - * 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. - * 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 ghidra.framework.main.datatree; - -import java.util.List; - -import docking.widgets.tree.GTreeNode; -import docking.widgets.tree.support.GTreeNodeTransferable; -import docking.widgets.tree.support.GTreeTransferHandler; - -public class DataTreeNodeTransferable extends GTreeNodeTransferable { - public DataTreeNodeTransferable(GTreeTransferHandler handler, List selectedData) { - super(handler, selectedData); - } - -} diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreeActionContext.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreeActionContext.java index 63eba46ece..cffbbc0d28 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreeActionContext.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreeActionContext.java @@ -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. @@ -16,14 +15,13 @@ */ package ghidra.framework.main.datatree; -import ghidra.framework.main.datatable.ProjectDataActionContext; -import ghidra.framework.model.*; - import java.util.List; import javax.swing.tree.TreePath; import docking.ComponentProvider; +import ghidra.framework.main.datatable.ProjectDataActionContext; +import ghidra.framework.model.*; public class ProjectDataTreeActionContext extends ProjectDataActionContext { @@ -52,7 +50,7 @@ public class ProjectDataTreeActionContext extends ProjectDataActionContext { return selectionPaths; } - public DataTree getDataTree() { + public DataTree getTree() { return tree; } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java index 4070ac82c0..a3514f5748 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java @@ -337,8 +337,11 @@ public class ProjectDataTreePanel extends JPanel { } } - return new ProjectDataTreeActionContext(provider, projectData, selectionPaths, - domainFolderList, domainFileList, tree, isActiveProject); + ProjectDataTreeActionContext context = new ProjectDataTreeActionContext(provider, + projectData, selectionPaths, domainFolderList, domainFileList, tree, isActiveProject); + boolean isTransient = tool == null; // null for stand-alone dialog, not the project's tree + context.setTransient(isTransient); + return context; } public DataTree getDataTree() { diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCollapseAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCollapseAction.java index fdec297512..6e60a4ad5b 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCollapseAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCollapseAction.java @@ -33,7 +33,7 @@ public class ProjectDataCollapseAction extends ProjectDataTreeContextAction { @Override protected void actionPerformed(ProjectDataTreeActionContext context) { - DataTree tree = context.getDataTree(); + DataTree tree = context.getTree(); TreePath[] paths = context.getSelectionPaths(); collapse(tree, paths[0]); } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCopyAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCopyAction.java index 858fb08888..c1207ec325 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCopyAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCopyAction.java @@ -40,7 +40,7 @@ public class ProjectDataCopyAction extends ProjectDataCopyCutBaseAction { protected void actionPerformed(ProjectDataTreeActionContext context) { TreePath[] paths = adjustSelectionPaths(context.getSelectionPaths()); - DataTreeClipboardUtils.setClipboardContents(context.getDataTree(), paths); + DataTreeClipboardUtils.setClipboardContents(context.getTree(), paths); } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCutAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCutAction.java index 9341248252..ee80774d39 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCutAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataCutAction.java @@ -40,7 +40,7 @@ public class ProjectDataCutAction extends ProjectDataCopyCutBaseAction { protected void actionPerformed(ProjectDataTreeActionContext context) { TreePath[] paths = adjustSelectionPaths(context.getSelectionPaths()); - DataTreeClipboardUtils.setClipboardContents(context.getDataTree(), paths); + DataTreeClipboardUtils.setClipboardContents(context.getTree(), paths); markNodesCut(paths); } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataExpandAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataExpandAction.java index 393457277e..576ce289c3 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataExpandAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataExpandAction.java @@ -33,7 +33,7 @@ public class ProjectDataExpandAction extends ProjectDataTreeContextAction { @Override protected void actionPerformed(ProjectDataTreeActionContext context) { - DataTree tree = context.getDataTree(); + DataTree tree = context.getTree(); TreePath[] paths = context.getSelectionPaths(); expand(tree, paths[0]); } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataNewFolderAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataNewFolderAction.java index 2e658cf93d..44d8dddf06 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataNewFolderAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataNewFolderAction.java @@ -41,6 +41,12 @@ public class ProjectDataNewFolderAction extends ProjectDataContextAction { markHelpUnnecessary(); } + @Override + protected boolean supportsTransientProjectData() { + // we allow the user to create new folders even in transient projects + return true; + } + @Override protected void actionPerformed(ProjectDataActionContext context) { createNewFolder(context); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataPasteAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataPasteAction.java index 9bbaee00c5..5bf29f7245 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataPasteAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataPasteAction.java @@ -44,7 +44,7 @@ public class ProjectDataPasteAction extends ProjectDataCopyCutBaseAction { GTreeNode node = (GTreeNode) context.getContextObject(); DomainFolderNode destNode = getFolderForNode(node); - paste(context.getDataTree(), destNode); + paste(context.getTree(), destNode); } @Override diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataReadOnlyAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataReadOnlyAction.java index b7e8837547..4ca5086dcf 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataReadOnlyAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataReadOnlyAction.java @@ -50,6 +50,10 @@ public class ProjectDataReadOnlyAction extends ProjectDataContextToggleAction { if (context.getFolderCount() != 0 || context.getFileCount() != 1) { return false; } + if (ignoreTransientProject(context)) { + return false; + } + DomainFile domainFile = context.getSelectedFiles().get(0); setSelected(domainFile.isReadOnly()); return true; diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataSelectAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataSelectAction.java index f584babf9d..f3fa36668e 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataSelectAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataSelectAction.java @@ -36,7 +36,7 @@ public class ProjectDataSelectAction extends ProjectDataTreeContextAction { @Override protected void actionPerformed(ProjectDataTreeActionContext context) { - DataTree tree = context.getDataTree(); + DataTree tree = context.getTree(); TreePath[] paths = context.getSelectionPaths(); GTreeNode node = (GTreeNode) paths[0].getLastPathComponent(); selectAllChildren(tree, node);