mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-122891 Presentation mode: TW layout on exit is recalculated based on fullscreen sizes
This commit is contained in:
+26
-15
@@ -27,6 +27,7 @@ import com.intellij.openapi.editor.ex.EditorEx;
|
||||
import com.intellij.openapi.editor.ex.util.EditorUtil;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.ActionCallback;
|
||||
import com.intellij.openapi.wm.ToolWindow;
|
||||
import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
|
||||
import com.intellij.openapi.wm.impl.DesktopLayout;
|
||||
@@ -52,15 +53,16 @@ public class TogglePresentationModeAction extends AnAction implements DumbAware
|
||||
|
||||
@Override
|
||||
public void actionPerformed(AnActionEvent e){
|
||||
UISettings settings = UISettings.getInstance();
|
||||
Project project = e.getProject();
|
||||
final UISettings settings = UISettings.getInstance();
|
||||
final Project project = e.getProject();
|
||||
|
||||
settings.PRESENTATION_MODE = !settings.PRESENTATION_MODE;
|
||||
|
||||
if (project != null) {
|
||||
if (settings.PRESENTATION_MODE && project != null) {
|
||||
hideToolWindows(project);
|
||||
}
|
||||
|
||||
|
||||
settings.fireUISettingsChanged();
|
||||
|
||||
UIDefaults defaults = UIManager.getDefaults();
|
||||
@@ -84,6 +86,7 @@ public class TogglePresentationModeAction extends AnAction implements DumbAware
|
||||
oldFonts.clear();
|
||||
}
|
||||
|
||||
ActionCallback callback = ActionCallback.DONE;
|
||||
if (project != null) {
|
||||
Window window = IdeFrameImpl.getActiveFrame();
|
||||
if (window instanceof IdeFrameImpl) {
|
||||
@@ -91,27 +94,35 @@ public class TogglePresentationModeAction extends AnAction implements DumbAware
|
||||
final PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(project);
|
||||
if (settings.PRESENTATION_MODE) {
|
||||
propertiesComponent.setValue("full.screen.before.presentation.mode", String.valueOf(frame.isInFullScreen()));
|
||||
frame.toggleFullScreen(true);
|
||||
callback = frame.toggleFullScreen(true);
|
||||
} else {
|
||||
if (frame.isInFullScreen()) {
|
||||
final String value = propertiesComponent.getValue("full.screen.before.presentation.mode");
|
||||
frame.toggleFullScreen("true".equalsIgnoreCase(value));
|
||||
callback = frame.toggleFullScreen("true".equalsIgnoreCase(value));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
callback.doWhenProcessed(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
int fontSize = settings.PRESENTATION_MODE
|
||||
? settings.PRESENTATION_MODE_FONT_SIZE
|
||||
: EditorColorsManager.getInstance().getGlobalScheme().getEditorFontSize();
|
||||
for (Editor editor : EditorFactory.getInstance().getAllEditors()) {
|
||||
if (editor instanceof EditorEx) {
|
||||
((EditorEx)editor).setFontSize(fontSize);
|
||||
}
|
||||
}
|
||||
UISettings.getInstance().fireUISettingsChanged();
|
||||
LafManager.getInstance().updateUI();
|
||||
EditorUtil.reinitSettings();
|
||||
|
||||
int fontSize = settings.PRESENTATION_MODE
|
||||
? settings.PRESENTATION_MODE_FONT_SIZE
|
||||
: EditorColorsManager.getInstance().getGlobalScheme().getEditorFontSize();
|
||||
for (Editor editor : EditorFactory.getInstance().getAllEditors()) {
|
||||
if (editor instanceof EditorEx) {
|
||||
((EditorEx)editor).setFontSize(fontSize);
|
||||
if (!settings.PRESENTATION_MODE && project != null) {
|
||||
hideToolWindows(project);
|
||||
}
|
||||
}
|
||||
}
|
||||
UISettings.getInstance().fireUISettingsChanged();
|
||||
LafManager.getInstance().updateUI();
|
||||
EditorUtil.reinitSettings();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -15,10 +15,13 @@
|
||||
*/
|
||||
package com.intellij.openapi.wm.ex;
|
||||
|
||||
import com.intellij.openapi.util.ActionCallback;
|
||||
import com.intellij.openapi.wm.IdeFrame;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public interface IdeFrameEx extends IdeFrame {
|
||||
boolean isInFullScreen();
|
||||
|
||||
void toggleFullScreen(boolean state);
|
||||
@NotNull
|
||||
ActionCallback toggleFullScreen(boolean state);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
package com.intellij.openapi.wm.impl;
|
||||
|
||||
import com.intellij.openapi.Disposable;
|
||||
import com.intellij.openapi.util.ActionCallback;
|
||||
import com.intellij.openapi.util.SystemInfo;
|
||||
import com.intellij.ui.ScreenUtil;
|
||||
import com.intellij.ui.mac.MacMainFrameDecorator;
|
||||
@@ -36,7 +37,7 @@ public abstract class IdeFrameDecorator implements Disposable {
|
||||
|
||||
public abstract boolean isInFullScreen();
|
||||
|
||||
public abstract void toggleFullScreen(boolean state);
|
||||
public abstract ActionCallback toggleFullScreen(boolean state);
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
@@ -83,11 +84,11 @@ public abstract class IdeFrameDecorator implements Disposable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toggleFullScreen(boolean state) {
|
||||
if (myFrame == null) return;
|
||||
public ActionCallback toggleFullScreen(boolean state) {
|
||||
if (myFrame == null) return ActionCallback.REJECTED;
|
||||
|
||||
GraphicsDevice device = ScreenUtil.getScreenDevice(myFrame.getBounds());
|
||||
if (device == null) return;
|
||||
if (device == null) return ActionCallback.REJECTED;
|
||||
|
||||
try {
|
||||
myFrame.getRootPane().putClientProperty(ScreenUtil.DISPOSE_TEMPORARY, Boolean.TRUE);
|
||||
@@ -112,6 +113,7 @@ public abstract class IdeFrameDecorator implements Disposable {
|
||||
|
||||
notifyFrameComponents(state);
|
||||
}
|
||||
return ActionCallback.DONE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,11 +140,12 @@ public abstract class IdeFrameDecorator implements Disposable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toggleFullScreen(boolean state) {
|
||||
public ActionCallback toggleFullScreen(boolean state) {
|
||||
if (myFrame != null) {
|
||||
myRequestedState = state;
|
||||
X11UiUtil.toggleFullScreenMode(myFrame);
|
||||
}
|
||||
return ActionCallback.DONE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ import com.intellij.openapi.application.ex.ApplicationManagerEx;
|
||||
import com.intellij.openapi.project.DumbAwareRunnable;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.project.ProjectManager;
|
||||
import com.intellij.openapi.util.ActionCallback;
|
||||
import com.intellij.openapi.util.Disposer;
|
||||
import com.intellij.openapi.util.Key;
|
||||
import com.intellij.openapi.util.SystemInfo;
|
||||
@@ -539,15 +540,17 @@ public class IdeFrameImpl extends JFrame implements IdeFrameEx, DataProvider {
|
||||
return myFrameDecorator != null && myFrameDecorator.isInFullScreen();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public void toggleFullScreen(boolean state) {
|
||||
public ActionCallback toggleFullScreen(boolean state) {
|
||||
if (myFrameDecorator != null) {
|
||||
myFrameDecorator.toggleFullScreen(state);
|
||||
return myFrameDecorator.toggleFullScreen(state);
|
||||
}
|
||||
IdeFrame[] frames = WindowManager.getInstance().getAllProjectFrames();
|
||||
for (IdeFrame frame : frames) {
|
||||
((IdeFrameImpl)frame).updateBorder();
|
||||
}
|
||||
return ActionCallback.DONE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -23,6 +23,7 @@ import com.intellij.openapi.application.ex.ApplicationInfoEx;
|
||||
import com.intellij.openapi.application.impl.ApplicationInfoImpl;
|
||||
import com.intellij.openapi.application.impl.LaterInvocator;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.ActionCallback;
|
||||
import com.intellij.openapi.util.BuildNumber;
|
||||
import com.intellij.openapi.util.SystemInfo;
|
||||
import com.intellij.openapi.wm.impl.IdeFrameDecorator;
|
||||
@@ -31,6 +32,7 @@ import com.intellij.ui.CustomProtocolHandler;
|
||||
import com.intellij.ui.mac.foundation.Foundation;
|
||||
import com.intellij.ui.mac.foundation.ID;
|
||||
import com.intellij.ui.mac.foundation.MacUtil;
|
||||
import com.intellij.util.EventDispatcher;
|
||||
import com.intellij.util.Function;
|
||||
import com.sun.jna.Callback;
|
||||
import com.sun.jna.Pointer;
|
||||
@@ -42,6 +44,7 @@ import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.EventListener;
|
||||
import java.util.LinkedList;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
@@ -56,7 +59,12 @@ public class MacMainFrameDecorator extends IdeFrameDecorator implements UISettin
|
||||
|
||||
private final FullscreenQueue<Runnable> myFullscreenQueue = new FullscreenQueue<Runnable>();
|
||||
|
||||
private class FullscreenQueue <T extends Runnable> {
|
||||
private final EventDispatcher<FSListener> myDispatcher = EventDispatcher.create(FSListener.class);
|
||||
|
||||
private interface FSListener extends FullScreenListener, EventListener {}
|
||||
private static class FSAdapter extends FullScreenAdapter implements FSListener {}
|
||||
|
||||
private static class FullscreenQueue <T extends Runnable> {
|
||||
|
||||
private boolean waitingForAppKit = false;
|
||||
private LinkedList<Runnable> queueModel = new LinkedList<Runnable>();
|
||||
@@ -225,8 +233,29 @@ public class MacMainFrameDecorator extends IdeFrameDecorator implements UISettin
|
||||
if (!FULL_SCREEN_AVAILABLE) return;
|
||||
|
||||
FullScreenUtilities.setWindowCanFullScreen(frame, true);
|
||||
// Native fullscreen listener can be set only once
|
||||
FullScreenUtilities.addFullScreenListenerTo(frame, new FullScreenListener() {
|
||||
@Override
|
||||
public void windowEnteringFullScreen(AppEvent.FullScreenEvent event) {
|
||||
myDispatcher.getMulticaster().windowEnteringFullScreen(event);
|
||||
}
|
||||
|
||||
FullScreenUtilities.addFullScreenListenerTo(frame, new FullScreenAdapter() {
|
||||
@Override
|
||||
public void windowEnteredFullScreen(AppEvent.FullScreenEvent event) {
|
||||
myDispatcher.getMulticaster().windowEnteredFullScreen(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void windowExitingFullScreen(AppEvent.FullScreenEvent event) {
|
||||
myDispatcher.getMulticaster().windowExitingFullScreen(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void windowExitedFullScreen(AppEvent.FullScreenEvent event) {
|
||||
myDispatcher.getMulticaster().windowExitedFullScreen(event);
|
||||
}
|
||||
});
|
||||
myDispatcher.addListener(new FSAdapter() {
|
||||
@Override
|
||||
public void windowEnteredFullScreen(AppEvent.FullScreenEvent event) {
|
||||
// We can get the notification when the frame has been disposed
|
||||
@@ -328,13 +357,27 @@ public class MacMainFrameDecorator extends IdeFrameDecorator implements UISettin
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toggleFullScreen(final boolean state) {
|
||||
if (!SystemInfo.isMacOSLion || myFrame == null || myInFullScreen == state) return;
|
||||
public ActionCallback toggleFullScreen(final boolean state) {
|
||||
if (!SystemInfo.isMacOSLion || myFrame == null || myInFullScreen == state) return ActionCallback.REJECTED;
|
||||
final ActionCallback callback = new ActionCallback();
|
||||
myDispatcher.addListener(new FSAdapter() {
|
||||
@Override
|
||||
public void windowExitedFullScreen(AppEvent.FullScreenEvent event) {
|
||||
callback.setDone();
|
||||
myDispatcher.removeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void windowEnteredFullScreen(AppEvent.FullScreenEvent event) {
|
||||
callback.setDone();
|
||||
myDispatcher.removeListener(this);
|
||||
}
|
||||
});
|
||||
|
||||
myFullscreenQueue.runOrEnqueue( new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
try {
|
||||
requestToggleFullScreenMethod.invoke(Application.getApplication(),myFrame);
|
||||
}
|
||||
catch (IllegalAccessException e) {
|
||||
@@ -345,6 +388,7 @@ public class MacMainFrameDecorator extends IdeFrameDecorator implements UISettin
|
||||
}
|
||||
}
|
||||
});
|
||||
return callback;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user