Skip to content

Commit b332c2a

Browse files
hansonrhansonr
authored andcommitted
allows windows to be "un"disposed
1 parent c505a80 commit b332c2a

File tree

9 files changed

+143
-62
lines changed

9 files changed

+143
-62
lines changed

sources/net.sf.j2s.java.core/src/java/awt/JSDialog.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
*/
2828
package java.awt;
2929

30+
import java.awt.Dialog.ModalityType;
3031
import java.awt.event.ComponentEvent;
3132
import java.awt.event.HierarchyEvent;
3233
import java.awt.event.WindowEvent;
@@ -35,6 +36,8 @@
3536
import java.util.ArrayList;
3637
import java.util.Iterator;
3738

39+
import swingjs.plaf.JSDialogUI;
40+
3841
/**
3942
* A Dialog is a top-level window with a title and a border
4043
* that is typically used to take some form of input from the user.
@@ -839,10 +842,14 @@ private boolean conditionalShow(Component toFocus, Long time) {
839842

840843
closeSplashScreen();
841844

842-
// synchronized (getTreeLock()) {
845+
if (ui != null && ((JSDialogUI) ui).isDisposed)
846+
addNotify();
847+
// synchronized (getTreeLock()) {
843848
// if (peer == null) {
844849
// addNotify();
845850
// }
851+
852+
846853
validate();
847854
if (visible) {
848855
toFront();

sources/net.sf.j2s.java.core/src/java/awt/Window.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
//import java.util.logging.Logger;
5959
import swingjs.JSUtil;
6060
import swingjs.plaf.JSComponentUI;
61+
import swingjs.plaf.JSWindowUI;
6162

6263
/**
6364
*
@@ -890,6 +891,9 @@ public void setVisible(boolean b) {
890891
@Override
891892
@Deprecated
892893
public void show() {
894+
895+
if (ui != null && ((JSWindowUI) ui).isDisposed)
896+
addNotify();
893897
// if (peer == null) {
894898
// addNotify();
895899
// }

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSComponentUI.java

Lines changed: 25 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.awt.Point;
1616
import java.awt.Rectangle;
1717
import java.awt.Toolkit;
18+
import java.awt.Window;
1819
import java.awt.dnd.DropTarget;
1920
import java.awt.dnd.peer.DropTargetPeer;
2021
import java.awt.event.KeyEvent;
@@ -642,7 +643,7 @@ public void installJS() {
642643
*/
643644
private void uninstallJS() {
644645

645-
System.out.println("uninstallJS " + id);
646+
//System.out.println("uninstallJS " + id);
646647

647648
// window closing will fire this with c == null
648649

@@ -658,7 +659,7 @@ private void uninstallJS() {
658659
if (outerNode != null) {
659660
DOMNode.dispose(outerNode);
660661
outerNode = null;
661-
}
662+
}
662663
}
663664

664665
protected JQueryObject $(Object node) {
@@ -1145,32 +1146,6 @@ private void updatePropertyAncestor(boolean fromButtonListener) {
11451146
p = (JComponent) p.getParent();
11461147
}
11471148
}
1148-
1149-
1150-
//
1151-
// @Override
1152-
// public void propertyChange(PropertyChangeEvent e) {
1153-
// // old
1154-
// String prop = e.getPropertyName();
1155-
// if (prop == "ancestor") {
1156-
// JComponent p = (JComponent) jc.getParent();
1157-
// while (p != null) {
1158-
// JSComponentUI parentui = (JSComponentUI) (p == null ? null : p.getUI());
1159-
// if (parentui != null)
1160-
// parentui.setTainted();
1161-
// p = (JComponent) p.getParent();
1162-
// }
1163-
//
1164-
// if (e.getNewValue() == null)
1165-
// return;
1166-
// if (isDisposed && c.visible && e.getNewValue() != null)
1167-
// setVisible(true);
1168-
// }
1169-
// propertyChangedCUI(prop);
1170-
// }
1171-
//
1172-
//
1173-
11741149

11751150
@Override
11761151
public void propertyChange(PropertyChangeEvent e) {
@@ -1331,7 +1306,7 @@ protected void setMnemonic(int newValue) {
13311306
* has been disposed; will need to reattach it if it ever becomes visible again.
13321307
*
13331308
*/
1334-
private boolean isDisposed;
1309+
public boolean isDisposed;
13351310

13361311
/**
13371312
* table cell renderer component
@@ -2716,13 +2691,16 @@ public FontMetrics getFontMetrics(Font font) {
27162691

27172692
@Override
27182693
public void dispose() {
2694+
//System.out.println("JSCUI dispose " + id);
27192695
if (isUIDisabled)
27202696
return;
27212697
if (cellComponent != null) {
27222698
DOMNode.setVisible(domNode, false);
27232699
return;
27242700
}
27252701
isDisposed = true;
2702+
// notice that we do not delete domNode, only detach it
2703+
// and remove its listeners.
27262704
DOMNode.dispose(domNode);
27272705
if (domNode != outerNode)
27282706
DOMNode.dispose(outerNode);
@@ -2734,19 +2712,22 @@ public void dispose() {
27342712
* This control has been added back to some other node after being disposed of.
27352713
* So now we need to undo that.
27362714
*
2737-
* @param node
2715+
* @param nodef
27382716
*/
2739-
private void undisposeUI(DOMNode node) {
2740-
if (c.getParent() != null) {
2717+
protected void undisposeUI(DOMNode node) {
2718+
Container parent = c.getParent();
2719+
// node will be null for Window, including Dialog
2720+
if (node != null && parent != null) {
27412721
JSComponentUI ui = (JSComponentUI) c.getParent().getUI();
27422722
if (ui.containerNode != null)
27432723
appendChild(ui.containerNode, node);
27442724
}
2745-
27462725
// menu separators have domNode == outerNode
27472726
// cell renderers will set their domNode to null;
2748-
if (outerNode != null && domNode != null && domNode != outerNode)
2727+
if (outerNode != null && domNode != null && domNode != outerNode) {
27492728
appendChild(outerNode, domNode);
2729+
//System.out.println("JSCUI undispose reattached");
2730+
}
27502731
isDisposed = false;
27512732
}
27522733

@@ -2977,8 +2958,7 @@ public Insets getInsets() {
29772958

29782959
@Override
29792960
public void beginValidate() {
2980-
// TODO Auto-generated method stub
2981-
2961+
System.out.println("JSCUI beginValidate " + id);
29822962
}
29832963

29842964
@Override
@@ -3184,7 +3164,15 @@ public void setRenderer(JSComponent rendererComponent, int width, int height) {
31843164
public void reinstallUI(JComponent oldC, JComponent newC) {
31853165
uninstallUI(oldC);
31863166
uninstallJS();
3187-
if (newC != null) {
3167+
if (newC== null) {
3168+
// // Frame or Dialog.dispose()
3169+
// if (outerNode != null) {
3170+
// DOMNode.dispose(outerNode);
3171+
// outerNode = null;
3172+
// domNode = null;
3173+
// isDisposed = true;
3174+
// }
3175+
} else {
31883176
// JPopupMenu
31893177
installJS();
31903178
installUI(newC);

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSFrameUI.java

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ public DOMNode updateDOMNode() {
8989
h = defaultHeight;
9090
DOMNode.setSize(frameNode, w, h);
9191
DOMNode.setTopLeftAbsolute(frameNode, 0, 0);
92-
setJ2sMouseHandler();
9392
titleBarNode = newDOMObject("div", id + "_titlebar");
9493
DOMNode.setTopLeftAbsolute(titleBarNode, 0, 0);
9594
DOMNode.setStyles(titleBarNode, "background-color", "#E0E0E0", "height", "20px", "font-size", "14px",
@@ -106,12 +105,13 @@ public DOMNode updateDOMNode() {
106105
DOMNode.setTopLeftAbsolute(closerWrap, 0, 0);
107106
DOMNode.setStyles(closerWrap, "text-align", "right");
108107

109-
closerNode = newDOMObject("label", id + "_closer", "innerHTML", "X");
110-
DOMNode.setStyles(closerNode, "width", "20px", "height", "20px", "position", "absolute", "text-align",
111-
"center", "right", "0px");
112-
bindJQueryEvents(closerNode, "click mouseenter mouseout", SOME_MOUSE_EVENT);
113-
if (!frame.isUndecorated())
108+
if (!frame.isUndecorated()) {
109+
closerNode = newDOMObject("label", id + "_closer", "innerHTML", "X");
110+
DOMNode.setStyles(closerNode, "width", "20px", "height", "20px", "position", "absolute", "text-align",
111+
"center", "right", "0px");
114112
frameNode.appendChild(titleBarNode);
113+
}
114+
bindWindowEvents();
115115
if (isModal) {
116116
modalNode = DOMNode.createElement("div", id + "_modaldiv");
117117
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
@@ -332,18 +332,20 @@ public void propertyChange(PropertyChangeEvent e) {
332332
public void setVisible(boolean b) {
333333
if (isDummyFrame)
334334
b = false;
335-
super.setVisible(b);
336-
if (isModal) {
337-
if (b) {
338-
$(body).after(modalNode);
339-
addClass(modalNode, "swingjs-window"); // so as to slip into z-index ranking
340-
String sz = DOMNode.getStyle(domNode, "z-index");
341-
int z = (( /** @j2sNative +sz || */getZIndex(null))) - 1;
342-
DOMNode.setZ(modalNode, z);
343-
}
344-
DOMNode.setVisible(modalNode, b);
345-
}
346-
DOMNode.setVisible(domNode, b);
335+
super.setVisible(b);
336+
if (isModal) {
337+
if (b) {
338+
$(body).after(modalNode);
339+
addClass(modalNode, "swingjs-window"); // so as to slip into z-index ranking
340+
@SuppressWarnings("unused")
341+
String sz = DOMNode.getStyle(domNode, "z-index");
342+
int z = (( /** @j2sNative +sz || */
343+
getZIndex(null))) - 1;
344+
DOMNode.setZ(modalNode, z);
345+
}
346+
DOMNode.setVisible(modalNode, b);
347+
}
348+
DOMNode.setVisible(domNode, b);
347349
}
348350

349351
}

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSListUI.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,13 @@ public DOMNode updateDOMNode() {
140140
return updateDOMNodeCUI();
141141
}
142142

143+
@Override
144+
protected void undisposeUI(DOMNode node) {
145+
super.undisposeUI(node);
146+
bindJSKeyEvents(focusNode, true);
147+
}
148+
149+
143150
@Override
144151
public boolean handleJSEvent(Object target, int eventType, Object jQueryEvent) {
145152
switch (eventType) {

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSTextFieldUI.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ public DOMNode updateDOMNode() {
4141
return super.updateDOMNode();
4242
}
4343

44+
@Override
45+
protected void undisposeUI(DOMNode node) {
46+
super.undisposeUI(node);
47+
bindJSKeyEvents(focusNode, true);
48+
}
49+
4450
@Override
4551
protected Dimension getCSSAdjustment(boolean addingCSS) {
4652
return new Dimension(0, addingCSS ? 0 : -2);

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSTextViewUI.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,16 @@ protected void setupViewNode() {
3030
focusNode = enableNode = textNode = domNode;
3131
DOMNode.setStyles(domNode, "resize", "none", "margin", "0px", "padding", "0px","scrollbar-width", "thin"); // otherwise it overflows
3232
DOMNode.setStyles(domNode, "box-sizing", "border-box");
33-
bindJSKeyEvents(domNode, true);
33+
bindJSKeyEvents(focusNode, true);
3434
}
3535

36+
@Override
37+
protected void undisposeUI(DOMNode node) {
38+
super.undisposeUI(node);
39+
bindJSKeyEvents(focusNode, true);
40+
}
41+
42+
3643
// AS_NEEDED NEVER ALWAYS
3744
private final String[] overflows = new String[] { "auto", "hidden", "scroll" };
3845

sources/net.sf.j2s.java.core/src/swingjs/plaf/JSWindowUI.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.awt.image.BufferedImage;
1616
import java.awt.peer.WindowPeer;
1717

18+
import javax.swing.JComponent;
1819
import javax.swing.JWindow;
1920

2021
import swingjs.JSAppletViewer;
@@ -83,6 +84,7 @@ public DOMNode updateDOMNode() {
8384
if (domNode == null) {
8485
containerNode = domNode = newDOMObject("div", id);
8586
setWindowClass();
87+
bindWindowEvents();
8688
}
8789
return domNode;
8890
}
@@ -202,10 +204,46 @@ public void repositionSecurityWarning() {
202204

203205
@Override
204206
public void dispose() {
207+
System.out.println("window disposed");
205208
J2S.unsetMouse(domNode);
206-
DOMNode.dispose(outerNode);
207209
if (modalNode != null)
208210
DOMNode.dispose(modalNode);
211+
super.dispose();
212+
}
213+
214+
@Override
215+
public void beginValidate() {
216+
if (isDisposed) {
217+
setChildVisibilities(window);
218+
}
219+
}
220+
221+
@Override
222+
public void endValidate() {
223+
if (isDisposed) {
224+
undisposeUI(null);
225+
bindWindowEvents();
226+
isDisposed = false;
227+
}
228+
}
229+
230+
protected void bindWindowEvents() {
231+
setJ2sMouseHandler();
232+
if (closerNode != null)
233+
bindJQueryEvents(closerNode, "click mouseenter mouseout", SOME_MOUSE_EVENT);
234+
}
235+
236+
private static void setChildVisibilities(JComponent jc) {
237+
for (int i = jc.getComponentCount(); --i >= 0;) {
238+
JComponent c = (JComponent) jc.getComponent(i);
239+
setChildVisibilities(c);
240+
}
241+
JSComponentUI ui = (JSComponentUI) jc.ui;
242+
// ui.isTainted = true;
243+
// ui.domNode = null;
244+
// ui.updateDOMNode();
245+
if (jc.isVisible())
246+
ui.setVisible(true);
209247
}
210248

211249
@Override

0 commit comments

Comments
 (0)