f1d6bd3dde053b22d5cde4bb77cf185619bb7f27
[idea/community.git] / platform / lang-impl / src / com / intellij / application / options / codeStyle / arrangement / match / ArrangementMatchingRulesPanel.java
1 /*
2  * Copyright 2000-2012 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.application.options.codeStyle.arrangement.match;
17
18 import com.intellij.application.options.codeStyle.arrangement.ArrangementConstants;
19 import com.intellij.application.options.codeStyle.arrangement.ArrangementNodeDisplayManager;
20 import com.intellij.application.options.codeStyle.arrangement.color.ArrangementColorsProvider;
21 import com.intellij.application.options.codeStyle.arrangement.util.TitleWithToolbar;
22 import com.intellij.openapi.actionSystem.DataProvider;
23 import com.intellij.openapi.application.ApplicationBundle;
24 import com.intellij.psi.codeStyle.arrangement.match.StdArrangementMatchRule;
25 import com.intellij.psi.codeStyle.arrangement.settings.ArrangementStandardSettingsAware;
26 import com.intellij.ui.components.JBScrollPane;
27 import com.intellij.util.ui.GridBag;
28 import org.jetbrains.annotations.NonNls;
29 import org.jetbrains.annotations.NotNull;
30 import org.jetbrains.annotations.Nullable;
31
32 import javax.swing.*;
33 import java.awt.*;
34 import java.util.List;
35
36 /**
37  * @author Denis Zhdanov
38  * @since 10/30/12 5:28 PM
39  */
40 public class ArrangementMatchingRulesPanel extends JPanel implements DataProvider {
41
42   @NotNull private final ArrangementMatchingRulesControl myControl;
43
44   public ArrangementMatchingRulesPanel(@NotNull ArrangementNodeDisplayManager displayManager,
45                                        @NotNull ArrangementColorsProvider colorsProvider,
46                                        @NotNull ArrangementStandardSettingsAware settingsFilter)
47   {
48     super(new GridBagLayout());
49     
50     JBScrollPane scrollPane = new JBScrollPane();
51     final JViewport viewport = scrollPane.getViewport();
52     ArrangementMatchingRulesControl.RepresentationCallback callback = new ArrangementMatchingRulesControl.RepresentationCallback() {
53       @Override
54       public void ensureVisible(@NotNull Rectangle r) {
55         Rectangle visibleRect = viewport.getViewRect();
56         if (r.y <= visibleRect.y) {
57           return;
58         }
59
60         int excessiveHeight = r.y + r.height - (visibleRect.y + visibleRect.height);
61         if (excessiveHeight <= 0) {
62           return;
63         }
64
65         int verticalShift = Math.min(r.y - visibleRect.y, excessiveHeight);
66         if (verticalShift > 0) {
67           viewport.setViewPosition(new Point(visibleRect.x, visibleRect.y + verticalShift));
68         }
69       }
70     };
71     myControl = new ArrangementMatchingRulesControl(displayManager, colorsProvider, settingsFilter, callback);
72     scrollPane.setViewportView(myControl);
73
74     TitleWithToolbar top = new TitleWithToolbar(
75       ApplicationBundle.message("arrangement.settings.section.match"),
76       ArrangementConstants.ACTION_GROUP_MATCHING_RULES_CONTROL_TOOLBAR,
77       ArrangementConstants.MATCHING_RULES_CONTROL_TOOLBAR_PLACE,
78       myControl
79     );
80     add(top, new GridBag().coverLine().fillCellHorizontally().weightx(1));
81     add(scrollPane, new GridBag().fillCell().weightx(1).weighty(1));
82   }
83
84   @NotNull
85   public List<StdArrangementMatchRule> getRules() {
86     return myControl.getRules();
87   }
88   
89   public void setRules(@Nullable List<StdArrangementMatchRule> rules) {
90     myControl.setRules(rules);
91   }
92
93   @Nullable
94   @Override
95   public Object getData(@NonNls String dataId) {
96     if (ArrangementConstants.MATCHING_RULES_CONTROL_KEY.is(dataId)) {
97       return myControl;
98     }
99     return null;
100   }
101 }