replaced <code></code> with more concise {@code}
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / editor / actions / AbstractToggleUseSoftWrapsAction.java
1 /*
2  * Copyright 2000-2010 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.editor.actions;
17
18 import com.intellij.openapi.actionSystem.AnActionEvent;
19 import com.intellij.openapi.actionSystem.CommonDataKeys;
20 import com.intellij.openapi.actionSystem.ToggleAction;
21 import com.intellij.openapi.editor.Editor;
22 import com.intellij.openapi.editor.EditorFactory;
23 import com.intellij.openapi.editor.EditorSettings;
24 import com.intellij.openapi.editor.LogicalPosition;
25 import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
26 import com.intellij.openapi.editor.impl.SettingsImpl;
27 import com.intellij.openapi.editor.impl.softwrap.SoftWrapAppliancePlaces;
28 import com.intellij.openapi.project.DumbAware;
29 import org.jetbrains.annotations.NotNull;
30 import org.jetbrains.annotations.Nullable;
31
32 import java.awt.*;
33
34 /**
35  * Provides common functionality for {@code 'toggle soft wraps usage'} actions.
36  *
37  * @author Denis Zhdanov
38  * @since Aug 23, 2010 11:33:35 AM
39  */
40 public abstract class AbstractToggleUseSoftWrapsAction extends ToggleAction implements DumbAware {
41
42   private final SoftWrapAppliancePlaces myAppliancePlace;
43   private final boolean myGlobal;
44
45   /**
46    * Creates new {@code AbstractToggleUseSoftWrapsAction} object.
47    * 
48    * @param appliancePlace    defines type of the place where soft wraps are applied
49    * @param global            indicates if soft wraps should be changed for the current editor only or for the all editors
50    *                          used at the target appliance place
51    */
52   public AbstractToggleUseSoftWrapsAction(@NotNull SoftWrapAppliancePlaces appliancePlace, boolean global) {
53     myAppliancePlace = appliancePlace;
54     myGlobal = global;
55   }
56
57   @Override
58   public void update(@NotNull AnActionEvent e) {
59     if (myGlobal) {
60       Editor editor = getEditor(e);
61       if (editor != null) {
62         EditorSettings settings = editor.getSettings();
63         if (settings instanceof SettingsImpl && ((SettingsImpl)settings).getSoftWrapAppliancePlace() != myAppliancePlace) {
64           e.getPresentation().setEnabledAndVisible(false);
65           return;
66         }
67       }
68     }
69     super.update(e);
70   }
71
72   @Override
73   public boolean isSelected(AnActionEvent e) {
74     if (myGlobal) return EditorSettingsExternalizable.getInstance().isUseSoftWraps(myAppliancePlace);
75     Editor editor = getEditor(e);
76     return editor != null && editor.getSettings().isUseSoftWraps();
77   }
78
79   @Override
80   public void setSelected(AnActionEvent e, boolean state) {
81     final Editor editor = getEditor(e);
82     if (editor == null) {
83       return;
84     }
85
86     toggleSoftWraps(editor, myGlobal ? myAppliancePlace : null, state);
87   }
88
89   public static void toggleSoftWraps(@NotNull Editor editor, @Nullable SoftWrapAppliancePlaces places, boolean state) {
90     Point point = editor.getScrollingModel().getVisibleArea().getLocation();
91     LogicalPosition anchorPosition = editor.xyToLogicalPosition(point);
92     int intraLineShift = point.y - editor.logicalPositionToXY(anchorPosition).y;
93
94     if (places != null) {
95       EditorSettingsExternalizable.getInstance().setUseSoftWraps(state, places);
96       EditorFactory.getInstance().refreshAllEditors();
97     }
98     if (editor.getSettings().isUseSoftWraps() != state) {
99       editor.getSettings().setUseSoftWraps(state);
100     }
101
102     editor.getScrollingModel().disableAnimation();
103     editor.getScrollingModel().scrollVertically(editor.logicalPositionToXY(anchorPosition).y + intraLineShift);
104     editor.getScrollingModel().enableAnimation();
105   }
106
107   @Nullable
108   protected Editor getEditor(AnActionEvent e) {
109     return e.getData(CommonDataKeys.EDITOR);
110   }
111 }