4807812e50477dd7e7823a287155dfed8c7b76be
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / fileEditor / impl / EditorEmptyTextPainter.java
1 /*
2  * Copyright 2000-2014 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.fileEditor.impl;
17
18 import com.intellij.ide.actions.ActivateToolWindowAction;
19 import com.intellij.ide.actions.ShowFilePathAction;
20 import com.intellij.openapi.actionSystem.IdeActions;
21 import com.intellij.openapi.actionSystem.Shortcut;
22 import com.intellij.openapi.keymap.KeymapManager;
23 import com.intellij.openapi.keymap.KeymapUtil;
24 import com.intellij.openapi.keymap.MacKeymapUtil;
25 import com.intellij.openapi.project.Project;
26 import com.intellij.openapi.util.Couple;
27 import com.intellij.openapi.util.SystemInfo;
28 import com.intellij.openapi.util.text.StringUtil;
29 import com.intellij.openapi.wm.ToolWindow;
30 import com.intellij.openapi.wm.ToolWindowId;
31 import com.intellij.openapi.wm.ToolWindowManager;
32 import com.intellij.openapi.wm.impl.IdeFrameImpl;
33 import com.intellij.ui.Gray;
34 import com.intellij.ui.JBColor;
35 import com.intellij.util.PairFunction;
36 import com.intellij.util.ui.GraphicsUtil;
37 import com.intellij.util.ui.UIUtil;
38
39 import javax.swing.*;
40 import java.awt.*;
41
42 /**
43  * @author gregsh
44  */
45 public class EditorEmptyTextPainter {
46
47   public void paintEmptyText(final EditorsSplitters splitters, Graphics g) {
48     boolean isDarkBackground = UIUtil.isUnderDarcula();
49     UIUtil.applyRenderingHints(g);
50     GraphicsUtil.setupAntialiasing(g, true, false);
51     g.setColor(new JBColor(isDarkBackground ? Gray._230 : Gray._80, Gray._160));
52     g.setFont(UIUtil.getLabelFont().deriveFont(isDarkBackground ? 24f : 20f));
53
54     UIUtil.TextPainter painter = new UIUtil.TextPainter().withLineSpacing(1.5f);
55     painter.withShadow(true, new JBColor(Gray._200.withAlpha(100), Gray._0.withAlpha(255)));
56
57     painter.appendLine("No files are open").underlined(new JBColor(Gray._150, Gray._180));
58
59     advertiseActions(splitters, painter);
60
61     painter.draw(g, new PairFunction<Integer, Integer, Couple<Integer>>() {
62       @Override
63       public Couple<Integer> fun(Integer width, Integer height) {
64         Dimension s = splitters.getSize();
65         return Couple.of((s.width - width) / 2, (s.height - height) / 2);
66       }
67     });
68   }
69
70   protected void advertiseActions(EditorsSplitters splitters, UIUtil.TextPainter painter) {
71     appendSearchEverywhere(painter);
72     appendToolWindow(painter, "Open Project View", ToolWindowId.PROJECT_VIEW, splitters);
73     appendAction(painter, "Open a file by name", getActionShortcutText("GotoFile"));
74     appendAction(painter, "Open Recent Files", getActionShortcutText(IdeActions.ACTION_RECENT_FILES));
75     appendAction(painter, "Open Navigation Bar", getActionShortcutText("ShowNavBar"));
76     appendLine(painter, "Drag and Drop file(s) here from " + ShowFilePathAction.getFileManagerName());
77   }
78
79   protected void appendSearchEverywhere(UIUtil.TextPainter painter) {
80     Shortcut[] shortcuts = KeymapManager.getInstance().getActiveKeymap().getShortcuts(IdeActions.ACTION_SEARCH_EVERYWHERE);
81     if (shortcuts.length == 0) {
82       appendAction(painter, "Search Everywhere", "Double " + (SystemInfo.isMac ? MacKeymapUtil.SHIFT : "Shift"));
83     }
84     else {
85       appendAction(painter, "Search Everywhere", KeymapUtil.getShortcutsText(shortcuts));
86     }
87   }
88
89   protected void appendToolWindow(UIUtil.TextPainter painter, String action, String toolWindowId, EditorsSplitters splitters) {
90     if (!isToolwindowVisible(splitters, toolWindowId)) {
91       String activateActionId = ActivateToolWindowAction.getActionIdForToolWindow(toolWindowId);
92       appendAction(painter, action, getActionShortcutText(activateActionId));
93     }
94   }
95
96   protected void appendAction(UIUtil.TextPainter painter, String action, String shortcut) {
97     if (StringUtil.isEmpty(shortcut)) return;
98     appendLine(painter, action + " with " + "<shortcut>" + shortcut + "</shortcut>");
99   }
100
101   protected void appendLine(UIUtil.TextPainter painter, String line) {
102     painter.appendLine(line).smaller().withBullet();
103   }
104
105   protected String getActionShortcutText(String actionId) {
106     return KeymapUtil.getFirstKeyboardShortcutText(actionId);
107   }
108
109   protected static boolean isToolwindowVisible(EditorsSplitters splitters, String toolwindowId) {
110     final Window frame = SwingUtilities.getWindowAncestor(splitters);
111     if (frame instanceof IdeFrameImpl) {
112       final Project project = ((IdeFrameImpl)frame).getProject();
113       if (project != null) {
114         if (!project.isInitialized()) return true;
115         ToolWindow toolWindow = ToolWindowManager.getInstance(project).getToolWindow(toolwindowId);
116         return toolWindow != null && toolWindow.isVisible();
117       }
118     }
119
120     return false;
121   }
122 }