1 package fr.ifremer.quadrige3.ui.swing.action;
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 import fr.ifremer.quadrige3.ui.swing.ApplicationUIContext;
28 import fr.ifremer.quadrige3.ui.swing.Screen;
29 import fr.ifremer.quadrige3.ui.swing.content.AbstractMainUIHandler;
30
31
32
33
34
35
36
37
38
39 public abstract class AbstractChangeScreenAction extends AbstractMainUIAction {
40
41
42
43
44
45
46 protected Screen screen;
47
48
49
50
51
52
53 protected boolean skipCheckCurrentScreen;
54
55
56
57
58
59
60
61
62 protected AbstractChangeScreenAction(AbstractMainUIHandler handler,
63 boolean hideBody,
64 Screen screen) {
65 super(handler, hideBody);
66 this.screen = screen;
67 }
68
69
70
71
72
73
74 public void setSkipCheckCurrentScreen(boolean skipCheckCurrentScreen) {
75 this.skipCheckCurrentScreen = skipCheckCurrentScreen;
76 }
77
78
79
80
81
82
83 protected void setScreen(Screen screen) {
84 this.screen = screen;
85 }
86
87
88 @Override
89 public boolean prepareAction() throws Exception {
90 boolean result = super.prepareAction();
91 result &= skipCheckCurrentScreen || getHandler().quitCurrentScreen();
92 return result;
93 }
94
95
96 @Override
97 public void doAction() throws Exception {
98
99 ApplicationUIContext context = getContext();
100 Screen previousScreen = context.getScreen();
101
102
103 if (previousScreen != screen) {
104
105 if (previousScreen == null || Screen.HOME.equals(screen)) {
106
107
108 context.getScreenBreadcrumb().clear();
109
110 } else if (doNotTrackThisScreen()) {
111
112
113 if (!Screen.HOME.equals(context.getScreenBreadcrumb().peekLast())) {
114 context.getScreenBreadcrumb().pollLast();
115 }
116
117 } else {
118
119
120 if (!previousScreen.equals(context.getScreenBreadcrumb().peekLast())) {
121 context.getScreenBreadcrumb().addLast(previousScreen);
122 }
123
124 }
125 }
126
127
128 if (screen == null && !(this instanceof CloseApplicationAction)) {
129 screen = Screen.HOME;
130 }
131
132
133 context.setScreen(screen);
134
135 }
136
137
138 @Override
139 public void postFailedAction(Throwable error) {
140 if (error != null) {
141 getContext().setFallBackScreen();
142 }
143 }
144
145
146
147
148
149
150 protected boolean doNotTrackThisScreen() {
151 return false;
152 }
153
154 }