Hello,
when my DefaultMultipleCDockable is minimize I want to hide externalize and maximize button, when the frame return visible (normalize) I want to view this button.
There isn’t a method that make action invisible/visible.
I tried with this code but it doesn’t work
public class WMSMultipleStateListener implements CDockableStateListener {
private CAction externalizeAction = null;
private CAction maximizeAction = null;
private boolean externalizeVisible = false;
private boolean maximizeVisible = false;
public WMSMultipleStateListener(DefaultMultipleCDockable wmsDockable) {
this.externalizeAction = wmsDockable.getAction(CDockable.ACTION_KEY_EXTERNALIZE);
this.maximizeAction = wmsDockable.getAction(CDockable.ACTION_KEY_MAXIMIZE);
if (externalizeAction != null) {
externalizeVisible = true;
}
if (maximizeAction != null) {
maximizeVisible = true;
}
}
private void addAction(DefaultMultipleCDockable wmsDockable) {
if (!externalizeVisible && externalizeAction != null) {
wmsDockable.putAction(CDockable.ACTION_KEY_EXTERNALIZE, externalizeAction);
externalizeVisible = true;
}
if (!maximizeVisible && maximizeAction != null) {
wmsDockable.putAction(CDockable.ACTION_KEY_MAXIMIZE, maximizeAction);
maximizeVisible = true;
}
}
public void minimized(CDockable cd) {
DefaultMultipleCDockable wmsDockable = (DefaultMultipleCDockable) cd;
if (externalizeVisible && externalizeAction != null) {
wmsDockable.removeAction(externalizeAction);
externalizeVisible = false;
}
if (maximizeVisible && maximizeAction != null) {
wmsDockable.removeAction(maximizeAction);
maximizeVisible = false;
}
}
public void maximized(CDockable cd) {
addAction((DefaultMultipleCDockable) cd);
}
public void normalized(CDockable cd) {
addAction((DefaultMultipleCDockable) cd);
}
public void externalized(CDockable cd) {
addAction((DefaultMultipleCDockable) cd);
}
public void visibilityChanged(CDockable cd) {}
}
/* into costructor of my dockable */
WMSMultipleStateListener stateListener = new WMSMultipleStateListener(this);
this.addCDockableStateListener(stateListener);
The method wmsDockable.getAction(CDockable.ACTION_KEY_EXTERNALIZE);
always returns null
A DefaultCDockable contains two collections of actions:
a list of actions: that is where you use “addAction”, “removeAction” and “getAction(int)”.
a map of actions: that is where you use “putAction” and “getAction(String)”
The map of actions is usually empty, the framework translates an empty entry as “use a default action”. Only by setting a non-null value you can influence the action. That is the reason why neither “getAction” nor “putAction” could work in your listener.
In order to make an action invisible you need to put an invisible, non-null action into the map. Luckily there exists an action called “CBlank” which was written exactly for that purpose.
Also you can add the listener directly to CControl and don’t have to remember adding it to each of your Dockables. That makes life a bit easier (its optional).
You could then end up with an application like the example below:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import bibliothek.gui.dock.common.CControl;
import bibliothek.gui.dock.common.CLocation;
import bibliothek.gui.dock.common.DefaultSingleCDockable;
import bibliothek.gui.dock.common.action.predefined.CBlank;
import bibliothek.gui.dock.common.event.CDockableStateListener;
import bibliothek.gui.dock.common.intern.CDockable;
import bibliothek.gui.dock.common.intern.DefaultCDockable;
public class Dock21 {
public static void main( String[] args ){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CControl control = new CControl(frame);
// ****** registering your listener ****** //
control.addStateListener(new WMSMultipleStateListener());
frame.add(control.getContentArea(), BorderLayout.CENTER);
frame.setSize(new Dimension(700, 700));
frame.setLocationRelativeTo(null);
DefaultSingleCDockable red = create(control, "Red", Color.RED);
DefaultSingleCDockable green = create(control, "Green", Color.GREEN);
control.add(red);
control.add(green);
red.setLocation(CLocation.base().normal());
green.setLocation(CLocation.base().normal().south(0.5));
red.setVisible(true);
green.setVisible(true);
frame.setVisible(true);
}
public static DefaultSingleCDockable create( CControl control, String title, Color color ){
JPanel panel = new JPanel();
panel.setOpaque(true);
panel.setBackground(color);
final DefaultSingleCDockable singleDockable = new DefaultSingleCDockable(title, title, panel);
return singleDockable;
}
// ********* Your listener ******* //
public static class WMSMultipleStateListener implements CDockableStateListener {
public void setVisible( CDockable cd, boolean visible ){
if( cd instanceof DefaultCDockable ) {
DefaultCDockable dockable = (DefaultCDockable) cd;
if( visible ) {
dockable.putAction(CDockable.ACTION_KEY_MAXIMIZE, null);
dockable.putAction(CDockable.ACTION_KEY_EXTERNALIZE, null);
}
else {
dockable.putAction(CDockable.ACTION_KEY_MAXIMIZE, CBlank.BLANK);
dockable.putAction(CDockable.ACTION_KEY_EXTERNALIZE, CBlank.BLANK);
}
}
}
public void minimized( CDockable cd ){
setVisible(cd, false);
}
public void maximized( CDockable cd ){
setVisible(cd, true);
}
public void normalized( CDockable cd ){
setVisible(cd, true);
}
public void externalized( CDockable cd ){
setVisible(cd, true);
}
public void visibilityChanged( CDockable cd ){
// ignore
}
}
}