summaryrefslogtreecommitdiff
path: root/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/FrameDialogWrapper.java
blob: f89e28ea8b6b0d154f3530b44ff0c6ea5366144d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package com.intellij.openapi.diff.impl.dir;

import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.FrameWrapper;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.swing.*;

public abstract class FrameDialogWrapper {
  public enum Mode {FRAME, MODAL, NON_MODAL}

  @NotNull
  protected abstract JComponent getPanel();

  @Nullable
  protected String getDimensionServiceKey() {
    return null;
  }

  @Nullable
  protected JComponent getPreferredFocusedComponent() {
    return null;
  }

  @Nullable
  protected String getTitle() {
    return null;
  }

  @Nullable
  protected Project getProject() {
    return null;
  }

  @NotNull
  protected Mode getMode() {
    return Mode.MODAL;
  }

  public void show() {
    switch (getMode()) {
      case FRAME:
        new MyFrameWrapper(getProject(), getMode(), getPanel(), getPreferredFocusedComponent(), getTitle(), getDimensionServiceKey())
          .show();
        return;
      case MODAL:
      case NON_MODAL:
        new MyDialogWrapper(getProject(), getMode(), getPanel(), getPreferredFocusedComponent(), getTitle(), getDimensionServiceKey())
          .show();
        return;
      default:
        throw new IllegalArgumentException(getMode().toString());
    }
  }

  private static class MyDialogWrapper extends DialogWrapper {
    private final JComponent myComponent;
    private final JComponent myPreferredFocusedComponent;
    private final String myDimensionServiceKey;

    public MyDialogWrapper(@Nullable Project project,
                           @NotNull Mode mode,
                           @NotNull JComponent component,
                           @Nullable JComponent preferredFocusedComponent,
                           @Nullable String title,
                           @Nullable String dimensionServiceKey) {
      super(project, true);
      myComponent = component;
      myPreferredFocusedComponent = preferredFocusedComponent;
      myDimensionServiceKey = dimensionServiceKey;

      if (title != null) {
        setTitle(title);
      }
      switch (mode) {
        case MODAL:
          setModal(true);
          break;
        case NON_MODAL:
          setModal(false);
          break;
        default:
          throw new IllegalArgumentException(mode.toString());
      }

      init();
    }

    @Override
    protected JComponent createCenterPanel() {
      return myComponent;
    }

    @Nullable
    @Override
    public JComponent getPreferredFocusedComponent() {
      return myPreferredFocusedComponent;
    }

    @Nullable
    @Override
    protected String getDimensionServiceKey() {
      return myDimensionServiceKey;
    }

    // it is information dialog - no need to OK or Cancel. Close the dialog by clicking the cross button or pressing Esc.
    @NotNull
    @Override
    protected Action[] createActions() {
      return new Action[0];
    }
  }

  private static class MyFrameWrapper extends FrameWrapper {
    public MyFrameWrapper(@Nullable Project project,
                          @NotNull Mode mode,
                          @NotNull JComponent component,
                          @Nullable JComponent preferredFocusedComponent,
                          @Nullable String title,
                          @Nullable String dimensionServiceKey) {
      super(project, dimensionServiceKey);

      assert mode == Mode.FRAME;

      if (title != null) {
        setTitle(title);
      }
      setComponent(component);
      setPreferredFocusedComponent(preferredFocusedComponent);
      closeOnEsc();
    }
  }
}