java - idea - intellij student
IntelliJ IDEA Plugin Development: guarde grupos de pestañas, guárdelas de forma persistente y vuelva a cargar un conjunto de pestañas si lo solicita el usuario (1)
Actualización 2017
Descontinúo el soporte para este complemento porque IDEA ya admite esa función. Puede guardar y cargar contextos fácilmente como se muestra aquí: https://github.com/alp82/idea-tabsession#discontinued
Actualizar
El complemento está listo y listo y se puede descargar en IDEA -> Configuración -> Complementos. El código fuente está disponible en: https://github.com/alp82/idea-tabsession
Respuesta corta
Para leer qué pestañas están abiertas ahora, use el EditorFactory
y FileDocumentManager
Singletons:
Editor[] editors = EditorFactory.getInstance().getAllEditors();
FileDocumentManager fileDocManager = FileDocumentManager.getInstance();
for(Editor editor : editors) {
VirtualFile vf = fileDocManager.getFile(editor.getDocument());
String path = vf.getCanonicalPath();
System.out.println("path = " + path);
}
Para abrir pestañas use el FileEditorManager
singleton (los files
son una matriz de cadenas de rutas canónicas):
FileEditorManager fileEditorManager = FileEditorManager.getInstance(project);
for(String path : files) {
System.out.println("path = " + path);
VirtualFile vf = LocalFileSystem.getInstance().findFileByPath(path);
fileEditorManager.openFile(vf, true, true);
}
Respuesta larga
Prerrequisitos
- Activar los complementos de desarrollo de complementos, Groovy y UI Designer
- Nuevo proyecto -> IntelliJ IDEA Plugin
Verifique las fuentes de IDEA Community Edition en cualquier carpeta:
git clone git://git.jetbrains.org/idea/community.git idea
Estructura de plugin
Una vez que haya creado su complemento, necesita editar su plugin.xml ubicado en la carpeta META-INF. Modificar el id
, name
y description
.
Necesitamos un archivo de configuración para el almacenamiento persistente. Cree un archivo mystorage.xml
en su carpeta src
. Ahora es el momento de crear los archivos necesarios:
SessionComponent.java (créelo con el asistente Add Project Component
para crear automáticamente la configuración xml necesaria):
@State(
name = "SessionComponent",
storages = {
@Storage(id = "default", file = StoragePathMacros.PROJECT_FILE),
@Storage(id = "dir", file = StoragePathMacros.PROJECT_CONFIG_DIR + "/mystorage.xml", scheme = StorageScheme.DIRECTORY_BASED)
}
)
public class SessionComponent implements ProjectComponent, PersistentStateComponent<SessionState> {
Project project;
SessionState sessionState;
public SessionComponent(Project project) {
this.project = project;
sessionState = new SessionState();
}
public void initComponent() {
// TODO: insert component initialization logic here
}
@Override
public void loadState(SessionState sessionState) {
System.out.println("load sessionState = " + sessionState);
this.sessionState = sessionState;
}
public void projectOpened() {
// called when project is opened
}
public void projectClosed() {
// called when project is being closed
}
@Nullable
@Override
public SessionState getState() {
System.out.println("save sessionState = " + sessionState);
return sessionState;
}
public void disposeComponent() {
// TODO: insert component disposal logic here
}
@NotNull
public String getComponentName() {
return "SessionComponent";
}
public int saveCurrentTabs() {
Editor[] editors = getOpenEditors();
FileEditorManager fileEditorManager = FileEditorManager.getInstance(project);
VirtualFile[] selectedFiles = fileEditorManager.getSelectedFiles();
FileDocumentManager fileDocManager = FileDocumentManager.getInstance();
sessionState.files = new String[editors.length];
int i = 0;
for(Editor editor : editors) {
VirtualFile vf = fileDocManager.getFile(editor.getDocument());
String path = vf.getCanonicalPath();
System.out.println("path = " + path);
if(path.equals(selectedFiles[0].getCanonicalPath())) {
sessionState.focusedFile = path;
}
sessionState.files[i] = path;
i++;
}
return editors.length;
}
public int loadSession() {
closeCurrentTabs();
FileEditorManager fileEditorManager = FileEditorManager.getInstance(project);
for(String path : sessionState.files) {
System.out.println("path = " + path);
VirtualFile vf = LocalFileSystem.getInstance().findFileByPath(path);
fileEditorManager.openFile(vf, true, true);
}
return sessionState.files.length;
}
public void closeCurrentTabs() {
Editor[] editors = getOpenEditors();
FileEditorManager fileEditorManager = FileEditorManager.getInstance(project);
FileDocumentManager fileDocManager = FileDocumentManager.getInstance();
for(Editor editor : editors) {
System.out.println("editor = " + editor);
VirtualFile vf = fileDocManager.getFile(editor.getDocument());
fileEditorManager.closeFile(vf);
}
}
public void showMessage(String htmlText) {
StatusBar statusBar = WindowManager.getInstance().getStatusBar(project);
JBPopupFactory.getInstance()
.createHtmlTextBalloonBuilder(htmlText, MessageType.INFO, null)
.setFadeoutTime(7500)
.createBalloon()
.show(RelativePoint.getCenterOf(statusBar.getComponent()), Balloon.Position.atRight);
}
private Editor[] getOpenEditors() {
return EditorFactory.getInstance().getAllEditors();
}
}
También necesitamos la clase de almacenamiento:
public class SessionState {
public String[] files = new String[0];
public String focusedFile = "";
public String toString() {
String result = "";
for (String file : files) {
result += file + ", ";
}
result += "selected: " + focusedFile;
return result;
}
}
La clase de componente debe tener una entrada en tu plugin.xml como esta:
<project-components>
<component>
<implementation-class>my.package.SessionComponent</implementation-class>
</component>
</project-components>
La clase de componente ofrece toda la funcionalidad necesaria, pero nunca se usa. Por lo tanto, necesitamos acciones para realizar la carga y el ahorro:
Save.java:
public class Save extends AnAction {
public Save() {
super();
}
public void actionPerformed(AnActionEvent event) {
Project project = event.getData(PlatformDataKeys.PROJECT);
SessionComponent sessionComponent = project.getComponent(SessionComponent.class);
int tabCount = sessionComponent.saveCurrentTabs();
String htmlText = "Saved " + String.valueOf(tabCount) + " tabs";
sessionComponent.showMessage(htmlText);
}
}
Load.java:
public class Load extends AnAction {
public Load() {
super();
}
public void actionPerformed(AnActionEvent event) {
Project project = event.getData(PlatformDataKeys.PROJECT);
SessionComponent sessionComponent = project.getComponent(SessionComponent.class);
int tabCount = sessionComponent.loadSession();
String htmlText = "Loaded " + String.valueOf(tabCount) + " tabs";
sessionComponent.showMessage(htmlText);
}
}
Aaand ... ¡Acción!
Lo último que necesitamos es la interfaz de usuario para seleccionar esas acciones. Simplemente ponga esto en su plugin.xml
:
<actions>
<!-- Add your actions here -->
<group id="MyPlugin.SampleMenu" text="_Sample Menu" description="Sample menu">
<add-to-group group-id="MainMenu" anchor="last" />
<action id="MyPlugin.Save" class="my.package.Save" text="_Save" description="A test menu item" />
<action id="MyPlugin.Load" class="my.package.Load" text="_Load" description="A test menu item" />
</group>
</actions>
Implementación de complementos
La funcionalidad básica está lista. Agregaré soporte para múltiples sesiones y algunas otras cosas interesantes antes de implementar este complemento y lanzarlo a la comunidad de código abierto. El enlace será publicado aquí, cuando esté en línea.
Actualmente estoy en movimiento para escribir un complemento IntelliJ. Quiero poder almacenar / restaurar un conjunto de pestañas para cambiar entre diferentes sesiones de pestañas (comparables a los complementos del navegador como Session Manager o Session Buddy ).
Por lo tanto necesito básicamente tres tipos de acciones:
- Lea las pestañas abiertas (¿qué archivo y editor se usa?)
- Almacena esa información de forma persistente como una sesión de pestañas.
- Abre las pestañas de la sesión seleccionada y cierra todas las demás.
Miré las acciones disponibles: IdeActions.java - parece que no hay lo que estoy buscando. Pero tal vez estoy mirando el lugar equivocado. ¿Alguien puede decirme si lo que estoy tratando de lograr es posible y darme algunos consejos en la dirección correcta?
Actualizar
Creé con éxito el complemento y está disponible en Github: http://alp82.github.com/idea-tabsession/
Está disponible en el repositorio oficial de complementos: Tab Session .
Actualización 2
Aquí hay una pregunta de seguimiento relacionada con las ventanas divididas : Recuperación y configuración de la configuración de la ventana dividida