I've been struggling with TopComponentGroup semantics. Basically, I have a TopComponent class A, and a singleton TopComponent B that displays property sheets relating to A. So, in my window system delcarations, I make a group containing the singleton B.
The trick is, when do I call open() and close() on the TopComponentGroup? The conventional wisdom is to have:
protected void componentActivated() {
super.componentActivated();
TopComponentGroup group = WindowManager.getDefault().findTopComponentGroup(TC_GROUP);
if (group != null) {
group.open();
}
}
protected void componentDeactivated() {
TopComponentGroup group = WindowManager.getDefault().findTopComponentGroup(TC_GROUP);
if (group != null) {
group.close();
}
}
This, however, doesn't work. For one thing, when I click on B, I am deactivating A. Therefore, clicking on B makes it disappear!
My next thought was to use componentShowing() and componentHidden() instead of activated/deactivated. But, if I have 2 A's showing in different modes, that paradigm breaks down.
Long story short(er), this is what I ended up with, and it seems to work:
protected void componentActivated() {
super.componentActivated();
TopComponentGroup group = WindowManager.getDefault().findTopComponentGroup(TC_GROUP);
if (group != null) {
group.open();
}
}
protected void componentHidden() {
Mode m = WindowManager.getDefault().findMode(this);
if (m == null) {
// if the component is hiding because it is being closed,
// we must back off to assuming the editor mode
m = WindowManager.getDefault().findMode(EDITOR_MODE);
}
TopComponent selected = m.getSelectedTopComponent();
if (selected == null || !(selected instanceof PageEditor)) {
// close the TC_GROUP
TopComponentGroup group = WindowManager.getDefault().findTopComponentGroup(TC_GROUP);
if (group != null)
group.close();
}
}