Hi, I put the small app on the GitHub at that link : https://github.com/bgry/netbeans_rcp_tests/tree/master/Workspace_test_netbeans.
Thanks, Bastien De : Geertjan Wielenga [mailto:geertjan.wiele...@googlemail.com] Envoyé : lundi 8 janvier 2018 19:14 À : us...@netbeans.incubator.apache.org Objet : Re: Conditionnal opening of a TopComponent One thing I would do differently is use the layer.xml file rather than doing it like this: CentralLookup.getDefault().lookup(Configuration.class); I.e., if you use FileUtile.getConfigFile, you'll be able to get a folder in the virtual file system: http://bits.netbeans.org/dev/javadoc/org-openide-filesystems/org/openide/filesystems/FileUtil.html#getConfigFile-java.lang.String-<https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fbits.netbeans.org%2Fdev%2Fjavadoc%2Forg-openide-filesystems%2Forg%2Fopenide%2Ffilesystems%2FFileUtil.html%23getConfigFile-java.lang.String-&data=02%7C01%7CBastien.GRYSPEERDT%40eiffage.com%7C3423baae26b140ba855908d556c3ac4e%7C2ed0a394379b4092aaee9dce8bdb4f2d%7C1%7C0%7C636510320878275622&sdata=Ux%2F1Y%2FlHGkyPUV4p3VFrdx8s0nO55QlYfyWAeo5ZJ9w%3D&reserved=0> And then you can enable/disable something there. But, better than discussing this via e-mail back and forth would be for you to put a small app together with the code from your e-mail in a repo on GitHub so that others can take a look at it and suggest alternative approaches. You should also think about whether it is good practice in terms of usability to have a window that appears and disappears automatically -- normally that's not something that you'd want to do programmatically. Gj On Mon, Jan 8, 2018 at 7:13 PM, Geertjan Wielenga <geertjan.wiele...@googlemail.com<mailto:geertjan.wiele...@googlemail.com>> wrote: One thing I would do differently is use the layer.xml file rather than doing it like this: CentralLookup.getDefault().lookup(Configuration.class); I.e., if you use FileUtile.getConfigFile, you'll be able to get a folder in the virtual file system: http://bits.netbeans.org/dev/javadoc/org-openide-filesystems/org/openide/filesystems/FileUtil.html#getConfigFile-java.lang.String-<https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fbits.netbeans.org%2Fdev%2Fjavadoc%2Forg-openide-filesystems%2Forg%2Fopenide%2Ffilesystems%2FFileUtil.html%23getConfigFile-java.lang.String-&data=02%7C01%7CBastien.GRYSPEERDT%40eiffage.com%7C3423baae26b140ba855908d556c3ac4e%7C2ed0a394379b4092aaee9dce8bdb4f2d%7C1%7C0%7C636510320878275622&sdata=Ux%2F1Y%2FlHGkyPUV4p3VFrdx8s0nO55QlYfyWAeo5ZJ9w%3D&reserved=0> And then you can enable/disable something there. But, better than discussing this via e-mail back and forth would be for you to put a small app together with the code from your e-mail in a repo on GitHub so that others can take a look at it and suggest alternative approaches. You should also think about whether it is good practice in terms of usability to have a window that appears and disappears automatically -- normally that's not something that you'd want to do programmatically. Gj On Mon, Jan 8, 2018 at 5:30 PM, GRYSPEERDT Bastien [CLEMESSY] <bastien.gryspee...@eiffage.com<mailto:bastien.gryspee...@eiffage.com>> wrote: Hi, I'm new on netbeans RCP. I created my custom TopComponents with some annotations as follow : @ConvertAsProperties( dtd = "-//project.editor.hmi//EditorShape//EN", autostore = false ) @TopComponent.Description( preferredID = "EditorShapeTopComponent", iconBase = "project/editor/shape_24.png", persistenceType = TopComponent.PERSISTENCE_ALWAYS ) //@TopComponent.Registration(mode<mailto://@TopComponent.Registration(mode> = "leftSlidingSide", openAtStartup = true) @ActionID(category = "Window", id = "project.editor.hmi.EditorShapeTopComponent") //@ActionReference(path = "Menu/Window" /*, position = 333 */) @TopComponent.OpenActionRegistration( displayName = "#CTL_EditorShapeAction", preferredID = "EditorShapeTopComponent" ) @Messages({ "CTL_EditorShapeAction=Formes", "CTL_EditorShapeTopComponent=Formes", "HINT_EditorShapeTopComponent=Formes simples importables" }) public final class EditorShapeTopComponent extends TopComponent { ... } I have a configuration file (properties file) in which a parameter tells if the TopComponent must be activated or not. To manage the visibility of the TopComponent, I do that : public GlobalActionContextProxy() { ... WindowManager.getDefault().invokeWhenUIReady(new Runnable() { @Override public void run() { // Hack to force the current Project selection when the application starts up TopComponent tc = WindowManager.getDefault().findTopComponent(PROJECT_LOGICAL_TAB_ID); if (tc != null) { tc.requestActive(); } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { // Reads the configuration file. Configuration configuration = CentralLookup.getDefault().lookup(Configuration.class); // Here we check that the parameter is the configuration file is to true. if (configuration.getBoolean("withImages", false) == true) { // Adds to Menu. FileObject menuFolder = FileUtil.getConfigFile("Menu/Window"); try { registerAction(SycloneEditorImagePaletteTopComponent.class, Bundle.LBL_SycloneEditorImagePaletteTopComponent(), new ImageIcon(getClass().getResource("/fr/clemessy/ast/syclone/project/synoptic/editor/img_24.png")), menuFolder, 333); } catch (IOException ex) { Exceptions.printStackTrace(ex); } // Adds to left dock. if (!isTopComponentInUserDirCache(SycloneEditorImagePaletteTopComponent.class)) { SycloneEditorImagePaletteTopComponent tcPalette = new SycloneEditorImagePaletteTopComponent(); Mode leftSideMode = WindowManager.getDefault().findMode("leftSlidingSide"); leftSideMode.dockInto(tcPalette); tcPalette.open(); } } else { // Removes the file from the cache : avoid it to be reopened by the persistence manager. removeTopComponentInUserDirCache(SycloneEditorImagePaletteTopComponent.class); } } }); } }); } The method isTopComponentInUserDirCache is as follow : /** * Checks if a component appears in the userdir cache of Netbeans. * * @param <T> : child class of TopComponent. * @param classType : class type. * @return true if the component is in the cache, false otherwise. */ private <T extends TopComponent> boolean isTopComponentInUserDirCache(final Class<T> classType) { boolean isInCache = false; // Gets the directory which contains cache on Components. Path compDirPath = getUserDirComponentsSettingPath(); // It the directory exists, checks if the component has already been opened. File compDirFile = compDirPath.toFile(); if (compDirFile.exists()) { // Gets the files referencing the component. File[] compFiles = compDirFile.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { StringBuilder filenameMatcher = new StringBuilder("^"); filenameMatcher.append(classType.getSimpleName()); filenameMatcher.append("(_\\d*)?"); filenameMatcher.append(".settings$"); return name != null && name.matches(filenameMatcher.toString()); } }); // If there is at least 1 file, the component has already been opened. if (compFiles != null && compFiles.length > 0) { isInCache = true; } } return isInCache; } With this solution, it seems to work but it is not very clean. And when I change the language, the menu item (linked to the TopComponent), which is read from the cache, is not translated. How could I do it in a cleanest way ? The only reason I don’t use annotations on the TopComponent is because I need to tell “open the TopComponent only if it is defined in the configuration file” : is there a way to do it properly ? Thanks, Bastien [http://www.eiffage.com/signature/image.jpg] Cet e-mail et ses éventuelles pièces jointes peuvent contenir des informations confidentielles et sont exclusivement adressés au(x) destinataire(s) mentionné(s) ci-dessus. Toute diffusion, exploitation ou copie sans autorisation de cet e-mail et de ses pièces jointes est strictement interdite. Si vous recevez ce message par erreur, merci de le détruire et d' avertir immédiatement l'expéditeur. EIFFAGE décline toute responsabilité si ce message a été modifié ou falsifié. This message and any attachments may contain confidential information and are established exclusively for his or its recipients. Any use of this message, for which it was not intended, any distribution or any total or partial publication is prohibited unless previously approved. If you receive this message in error, please destroy it and immediately notify the sender thereof. The EIFFAGE Group declines all responsibility concerning this message if it has been altered or tampered with.