diff options
Diffstat (limited to 'plugins/ui-designer-core/src/com/intellij/designer/AbstractToolWindowManager.java')
-rw-r--r-- | plugins/ui-designer-core/src/com/intellij/designer/AbstractToolWindowManager.java | 302 |
1 files changed, 14 insertions, 288 deletions
diff --git a/plugins/ui-designer-core/src/com/intellij/designer/AbstractToolWindowManager.java b/plugins/ui-designer-core/src/com/intellij/designer/AbstractToolWindowManager.java index cf0961c6feaf..b936ae2814b3 100644 --- a/plugins/ui-designer-core/src/com/intellij/designer/AbstractToolWindowManager.java +++ b/plugins/ui-designer-core/src/com/intellij/designer/AbstractToolWindowManager.java @@ -15,122 +15,24 @@ */ package com.intellij.designer; -import com.intellij.designer.designSurface.DesignerEditorPanel; -import com.intellij.ide.util.PropertiesComponent; -import com.intellij.openapi.actionSystem.ActionGroup; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.DefaultActionGroup; -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.components.ProjectComponent; +import com.intellij.designer.palette.PaletteToolWindowManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.fileEditor.FileEditorManagerEvent; -import com.intellij.openapi.fileEditor.FileEditorManagerListener; import com.intellij.openapi.project.Project; -import com.intellij.openapi.startup.StartupManager; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.openapi.wm.ToolWindow; import com.intellij.openapi.wm.ToolWindowAnchor; -import com.intellij.openapi.wm.ex.ToolWindowEx; -import com.intellij.util.ParameterizedRunnable; -import com.intellij.util.messages.MessageBusConnection; -import com.intellij.util.ui.update.MergingUpdateQueue; -import com.intellij.util.ui.update.Update; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; - /** * @author Alexander Lobas */ -public abstract class AbstractToolWindowManager implements ProjectComponent { - public static final String EDITOR_MODE = "UI_DESIGNER_EDITOR_MODE."; - - private final MergingUpdateQueue myWindowQueue = new MergingUpdateQueue(getComponentName(), 200, true, null); - protected final Project myProject; - protected final FileEditorManager myFileEditorManager; - protected volatile ToolWindow myToolWindow; - private volatile boolean myToolWindowReady; - private volatile boolean myToolWindowDisposed; - - private final PropertiesComponent myPropertiesComponent; - public final String myEditorModeKey; - private ToggleEditorModeAction myLeftEditorModeAction; - private ToggleEditorModeAction myRightEditorModeAction; - - private MessageBusConnection myConnection; - private final FileEditorManagerListener myListener = new FileEditorManagerListener() { - @Override - public void fileOpened(@NotNull FileEditorManager source, @NotNull VirtualFile file) { - bindToDesigner(getActiveDesigner()); - } - - @Override - public void fileClosed(@NotNull FileEditorManager source, @NotNull VirtualFile file) { - ApplicationManager.getApplication().invokeLater(new Runnable() { - @Override - public void run() { - bindToDesigner(getActiveDesigner()); - } - }); - } - - @Override - public void selectionChanged(@NotNull FileEditorManagerEvent event) { - bindToDesigner(getDesigner(event.getNewEditor())); - } - }; - - ////////////////////////////////////////////////////////////////////////////////////////// - // - // ToolWindow - // - ////////////////////////////////////////////////////////////////////////////////////////// - +public abstract class AbstractToolWindowManager extends LightToolWindowManager { protected AbstractToolWindowManager(Project project, FileEditorManager fileEditorManager) { - myProject = project; - myFileEditorManager = fileEditorManager; - myPropertiesComponent = PropertiesComponent.getInstance(myProject); - myEditorModeKey = EDITOR_MODE + getComponentName() + ".STATE"; - } - - @Override - public void projectOpened() { - initToolWindow(); - - StartupManager.getInstance(myProject).registerPostStartupActivity(new Runnable() { - public void run() { - myToolWindowReady = true; - if (getEditorMode() == null) { - initListeners(); - bindToDesigner(getActiveDesigner()); - } - } - }); - } - - @Override - public void projectClosed() { - if (!myToolWindowDisposed) { - disposeComponent(); - myToolWindowDisposed = true; - myToolWindow = null; - } - } - - private void initListeners() { - myConnection = myProject.getMessageBus().connect(myProject); - myConnection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, myListener); - } - - private void removeListeners() { - myConnection.disconnect(); - myConnection = null; + super(project, fileEditorManager); } @Nullable - private static DesignerEditorPanel getDesigner(FileEditor editor) { + @Override + protected DesignerEditorPanelFacade getDesigner(FileEditor editor) { if (editor instanceof DesignerEditor) { DesignerEditor designerEditor = (DesignerEditor)editor; return designerEditor.getDesignerPanel(); @@ -138,196 +40,20 @@ public abstract class AbstractToolWindowManager implements ProjectComponent { return null; } - @Nullable - public DesignerEditorPanel getActiveDesigner() { - for (FileEditor editor : myFileEditorManager.getSelectedEditors()) { - DesignerEditorPanel designer = getDesigner(editor); - if (designer != null) { - return designer; + @Override + protected ToggleEditorModeAction createToggleAction(ToolWindowAnchor anchor) { + return new ToggleEditorModeAction(this, myProject, anchor) { + @Override + protected LightToolWindowManager getOppositeManager() { + AbstractToolWindowManager designerManager = DesignerToolWindowManager.getInstance(myProject); + AbstractToolWindowManager paletteManager = PaletteToolWindowManager.getInstance(myProject); + return myManager == designerManager ? paletteManager : designerManager; } - } - - return null; + }; } @Nullable protected static DesignerCustomizations getCustomizations() { return DesignerCustomizations.EP_NAME.findExtension(DesignerCustomizations.class); } - - private void bindToDesigner(final DesignerEditorPanel designer) { - myWindowQueue.cancelAllUpdates(); - myWindowQueue.queue(new Update("update") { - @Override - public void run() { - if (!myToolWindowReady || myToolWindowDisposed) { - return; - } - if (myToolWindow == null) { - if (designer == null) { - return; - } - initToolWindow(); - } - updateToolWindow(designer); - } - }); - } - - protected abstract void initToolWindow(); - - protected abstract void updateToolWindow(@Nullable DesignerEditorPanel designer); - - protected final void initGearActions() { - ToolWindowEx toolWindow = (ToolWindowEx)myToolWindow; - toolWindow.setAdditionalGearActions(new DefaultActionGroup(createGearActions())); - } - - protected abstract ToolWindowAnchor getAnchor(); - - @Override - public void initComponent() { - } - - @Override - public void disposeComponent() { - } - - ////////////////////////////////////////////////////////////////////////////////////////// - // - // LightToolWindow - // - ////////////////////////////////////////////////////////////////////////////////////////// - - public final ActionGroup createGearActions() { - DefaultActionGroup group = new DefaultActionGroup("In Editor Mode", true); - - if (myLeftEditorModeAction == null) { - myLeftEditorModeAction = new ToggleEditorModeAction(this, myProject, ToolWindowAnchor.LEFT); - } - group.add(myLeftEditorModeAction); - - if (myRightEditorModeAction == null) { - myRightEditorModeAction = new ToggleEditorModeAction(this, myProject, ToolWindowAnchor.RIGHT); - } - group.add(myRightEditorModeAction); - - return group; - } - - public final void bind(DesignerEditorPanel designer) { - if (isEditorMode()) { - myCreateAction.run(designer); - } - } - - public final void dispose(DesignerEditorPanel designer) { - if (isEditorMode()) { - disposeContent(designer); - } - } - - protected final Object getContent(DesignerEditorPanel designer) { - LightToolWindow toolWindow = (LightToolWindow)designer.getClientProperty(getComponentName()); - return toolWindow.getContent(); - } - - protected abstract LightToolWindow createContent(DesignerEditorPanel designer); - - protected final LightToolWindow createContent(DesignerEditorPanel designer, - LightToolWindowContent content, - String title, - Icon icon, - JComponent component, - JComponent focusedComponent, - int defaultWidth, - AnAction[] actions) { - return new LightToolWindow(content, - title, - icon, - component, - focusedComponent, - designer.getContentSplitter(), - getEditorMode(), - this, - myProject, - myPropertiesComponent, - getComponentName(), - defaultWidth, - actions); - } - - protected final void disposeContent(DesignerEditorPanel designer) { - String key = getComponentName(); - LightToolWindow toolWindow = (LightToolWindow)designer.getClientProperty(key); - designer.putClientProperty(key, null); - toolWindow.dispose(); - } - - private final ParameterizedRunnable<DesignerEditorPanel> myCreateAction = new ParameterizedRunnable<DesignerEditorPanel>() { - @Override - public void run(DesignerEditorPanel designer) { - designer.putClientProperty(getComponentName(), createContent(designer)); - } - }; - - private final ParameterizedRunnable<DesignerEditorPanel> myUpdateAnchorAction = new ParameterizedRunnable<DesignerEditorPanel>() { - @Override - public void run(DesignerEditorPanel designer) { - LightToolWindow toolWindow = (LightToolWindow)designer.getClientProperty(getComponentName()); - toolWindow.updateAnchor(getEditorMode()); - } - }; - - private final ParameterizedRunnable<DesignerEditorPanel> myDisposeAction = new ParameterizedRunnable<DesignerEditorPanel>() { - @Override - public void run(DesignerEditorPanel designer) { - disposeContent(designer); - } - }; - - private void runUpdateContent(ParameterizedRunnable<DesignerEditorPanel> action) { - for (FileEditor editor : myFileEditorManager.getAllEditors()) { - DesignerEditorPanel designer = getDesigner(editor); - if (designer != null) { - action.run(designer); - } - } - } - - protected final boolean isEditorMode() { - return getEditorMode() != null; - } - - @Nullable - final ToolWindowAnchor getEditorMode() { - String value = myPropertiesComponent.getValue(myEditorModeKey); - if (value == null) { - return getAnchor(); - } - return value.equals("ToolWindow") ? null : ToolWindowAnchor.fromText(value); - } - - final void setEditorMode(@Nullable ToolWindowAnchor newState) { - ToolWindowAnchor oldState = getEditorMode(); - myPropertiesComponent.setValue(myEditorModeKey, newState == null ? "ToolWindow" : newState.toString()); - - if (oldState != null && newState != null) { - runUpdateContent(myUpdateAnchorAction); - } - else if (newState != null) { - removeListeners(); - updateToolWindow(null); - runUpdateContent(myCreateAction); - } - else { - runUpdateContent(myDisposeAction); - initListeners(); - bindToDesigner(getActiveDesigner()); - } - } - - final ToolWindow getToolWindow() { - return myToolWindow; - } }
\ No newline at end of file |