History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/java/awt/ModalEventFilter.java (1 of 18352 files). Show all

Unified · Split

java/pkg/java/awt/ModalEventFilter.java+216−0
@@ -0,0 +1,216 @@
1+/*
2+ * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
3+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+ *
5+ * This code is free software; you can redistribute it and/or modify it
6+ * under the terms of the GNU General Public License version 2 only, as
7+ * published by the Free Software Foundation. Oracle designates this
8+ * particular file as subject to the "Classpath" exception as provided
9+ * by Oracle in the LICENSE file that accompanied this code.
10+ *
11+ * This code is distributed in the hope that it will be useful, but WITHOUT
12+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+ * version 2 for more details (a copy is included in the LICENSE file that
15+ * accompanied this code).
16+ *
17+ * You should have received a copy of the GNU General Public License version
18+ * 2 along with this work; if not, write to the Free Software Foundation,
19+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+ *
21+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+ * or visit www.oracle.com if you need additional information or have any
23+ * questions.
24+ */
25+package java.awt;
26+
27+import java.awt.event.*;
28+
29+import sun.awt.AppContext;
30+
31+abstract class ModalEventFilter implements EventFilter {
32+
33+ protected Dialog modalDialog;
34+ protected boolean disabled;
35+
36+ protected ModalEventFilter(Dialog modalDialog) {
37+ this.modalDialog = modalDialog;
38+ disabled = false;
39+ }
40+
41+ Dialog getModalDialog() {
42+ return modalDialog;
43+ }
44+
45+ public FilterAction acceptEvent(AWTEvent event) {
46+ if (disabled || !modalDialog.isVisible()) {
47+ return FilterAction.ACCEPT;
48+ }
49+ int eventID = event.getID();
50+ if ((eventID >= MouseEvent.MOUSE_FIRST &&
51+ eventID <= MouseEvent.MOUSE_LAST) ||
52+ (eventID >= ActionEvent.ACTION_FIRST &&
53+ eventID <= ActionEvent.ACTION_LAST) ||
54+ eventID == WindowEvent.WINDOW_CLOSING)
55+ {
56+ Object o = event.getSource();
57+ if (o instanceof sun.awt.ModalExclude) {
58+ // Exclude this object from modality and
59+ // continue to pump it's events.
60+ } else if (o instanceof Component) {
61+ Component c = (Component)o;
62+ while ((c != null) && !(c instanceof Window)) {
63+ c = c.getParent_NoClientCode();
64+ }
65+ if (c != null) {
66+ return acceptWindow((Window)c);
67+ }
68+ }
69+ }
70+ return FilterAction.ACCEPT;
71+ }
72+
73+ protected abstract FilterAction acceptWindow(Window w);
74+
75+ // When a modal dialog is hidden its modal filter may not be deleted from
76+ // EventDispatchThread event filters immediately, so we need to mark the filter
77+ // as disabled to prevent it from working. Simple checking for visibility of
78+ // the modalDialog is not enough, as it can be hidden and then shown again
79+ // with a new event pump and a new filter
80+ void disable() {
81+ disabled = true;
82+ }
83+
84+ int compareTo(ModalEventFilter another) {
85+ Dialog anotherDialog = another.getModalDialog();
86+ // check if modalDialog is from anotherDialog's hierarchy
87+ // or vice versa
88+ Component c = modalDialog;
89+ while (c != null) {
90+ if (c == anotherDialog) {
91+ return 1;
92+ }
93+ c = c.getParent_NoClientCode();
94+ }
95+ c = anotherDialog;
96+ while (c != null) {
97+ if (c == modalDialog) {
98+ return -1;
99+ }
100+ c = c.getParent_NoClientCode();
101+ }
102+ // check if one dialog blocks (directly or indirectly) another
103+ Dialog blocker = modalDialog.getModalBlocker();
104+ while (blocker != null) {
105+ if (blocker == anotherDialog) {
106+ return -1;
107+ }
108+ blocker = blocker.getModalBlocker();
109+ }
110+ blocker = anotherDialog.getModalBlocker();
111+ while (blocker != null) {
112+ if (blocker == modalDialog) {
113+ return 1;
114+ }
115+ blocker = blocker.getModalBlocker();
116+ }
117+ // compare modality types
118+ return modalDialog.getModalityType().compareTo(anotherDialog.getModalityType());
119+ }
120+
121+ static ModalEventFilter createFilterForDialog(Dialog modalDialog) {
122+ switch (modalDialog.getModalityType()) {
123+ case DOCUMENT_MODAL: return new DocumentModalEventFilter(modalDialog);
124+ case APPLICATION_MODAL: return new ApplicationModalEventFilter(modalDialog);
125+ case TOOLKIT_MODAL: return new ToolkitModalEventFilter(modalDialog);
126+ }
127+ return null;
128+ }
129+
130+ private static class ToolkitModalEventFilter extends ModalEventFilter {
131+
132+ private AppContext appContext;
133+
134+ ToolkitModalEventFilter(Dialog modalDialog) {
135+ super(modalDialog);
136+ appContext = modalDialog.appContext;
137+ }
138+
139+ protected FilterAction acceptWindow(Window w) {
140+ if (w.isModalExcluded(Dialog.ModalExclusionType.TOOLKIT_EXCLUDE)) {
141+ return FilterAction.ACCEPT;
142+ }
143+ if (w.appContext != appContext) {
144+ return FilterAction.REJECT;
145+ }
146+ while (w != null) {
147+ if (w == modalDialog) {
148+ return FilterAction.ACCEPT_IMMEDIATELY;
149+ }
150+ w = w.getOwner();
151+ }
152+ return FilterAction.REJECT;
153+ }
154+ }
155+
156+ private static class ApplicationModalEventFilter extends ModalEventFilter {
157+
158+ private AppContext appContext;
159+
160+ ApplicationModalEventFilter(Dialog modalDialog) {
161+ super(modalDialog);
162+ appContext = modalDialog.appContext;
163+ }
164+
165+ protected FilterAction acceptWindow(Window w) {
166+ if (w.isModalExcluded(Dialog.ModalExclusionType.APPLICATION_EXCLUDE)) {
167+ return FilterAction.ACCEPT;
168+ }
169+ if (w.appContext == appContext) {
170+ while (w != null) {
171+ if (w == modalDialog) {
172+ return FilterAction.ACCEPT_IMMEDIATELY;
173+ }
174+ w = w.getOwner();
175+ }
176+ return FilterAction.REJECT;
177+ }
178+ return FilterAction.ACCEPT;
179+ }
180+ }
181+
182+ private static class DocumentModalEventFilter extends ModalEventFilter {
183+
184+ private Window documentRoot;
185+
186+ DocumentModalEventFilter(Dialog modalDialog) {
187+ super(modalDialog);
188+ documentRoot = modalDialog.getDocumentRoot();
189+ }
190+
191+ protected FilterAction acceptWindow(Window w) {
192+ // application- and toolkit-excluded windows are blocked by
193+ // document-modal dialogs from their child hierarchy
194+ if (w.isModalExcluded(Dialog.ModalExclusionType.APPLICATION_EXCLUDE)) {
195+ Window w1 = modalDialog.getOwner();
196+ while (w1 != null) {
197+ if (w1 == w) {
198+ return FilterAction.REJECT;
199+ }
200+ w1 = w1.getOwner();
201+ }
202+ return FilterAction.ACCEPT;
203+ }
204+ while (w != null) {
205+ if (w == modalDialog) {
206+ return FilterAction.ACCEPT_IMMEDIATELY;
207+ }
208+ if (w == documentRoot) {
209+ return FilterAction.REJECT;
210+ }
211+ w = w.getOwner();
212+ }
213+ return FilterAction.ACCEPT;
214+ }
215+ }
216+}