package bluej.extmgr;
import java.awt.BorderLayout;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import bluej.pkgmgr.Project;
import bluej.prefmgr.PrefPanelListener;
import threadchecker.OnThread;
import threadchecker.Tag;
| This manages the whole preference pane for Extensions
| It will be loaded in the appropriate tab when the register() is called
|
| @author Damiano Bolla: University of Kent at Canterbury
| @author Michael Kolling
|
public class ExtensionPrefManager
implements PrefPanelListener{
private List<ExtensionWrapper> extensionsList;
private final int DO_panelUpdate=1;
private final int DO_loadValues=2;
private final int DO_saveValues=3;
private JPanel drawPanel;
private JPanel rootPanel;
| The manager needs to know the installed extensions
|
public ExtensionPrefManager(List<ExtensionWrapper> i_extensionsList)
{
extensionsList = i_extensionsList;
drawPanel = new JPanel();
drawPanel.setLayout(new BoxLayout(drawPanel,BoxLayout.Y_AXIS));
JPanel middlePanel = new JPanel (new BorderLayout());
middlePanel.add(drawPanel,BorderLayout.NORTH);
JScrollPane drawScroll = new JScrollPane (middlePanel);
drawScroll.setBorder(new EmptyBorder(0,0,0,0));
drawScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
| Add the scroll pane to the root panel
| It needs to use all the available space, otherwise the scroll pane does not
| understand when to draw its scrollbars
|
rootPanel = new JPanel(new BorderLayout());
rootPanel.add(drawScroll,BorderLayout.CENTER);
}
| Return the panel that shows the GUI.
|
public JPanel getPanel()
{
return rootPanel;
}
| This is the looper, I will use some const to decide at the end
| what to do. Just to make code simples and cleaner
| Note that half or more of the code is on Fault managment ...
|
private void doWorkLoop(int doAction)
{
if (doAction == DO_panelUpdate)
drawPanel.removeAll();
synchronized (extensionsList) {
for (ExtensionWrapper wrapper : extensionsList) {
doWorkItem (wrapper, doAction);
}
}
}
| Do some work on one extension wrapper.
| It is either adding panels, saving or loading...
|
private void doWorkItem(ExtensionWrapper aWrapper, int doAction)
{
if (! aWrapper.isValid()) return;
String extensionName = aWrapper.safeGetExtensionName();
switch (doAction) {
case DO_loadValues:
aWrapper.safePrefGenLoadValues();
return;
case DO_saveValues:
aWrapper.safePrefGenSaveValues();
return;
case DO_panelUpdate:
addUserPanel (aWrapper, extensionName);
return;
}
}
| Being here to make code cleaner.
| Given an Extension preference panel add it into the main panel
|
private void addUserPanel(ExtensionWrapper aWrapper, String extensionName)
{
JPanel aPanel = aWrapper.safePrefGenGetPanel();
if (aPanel == null) {
return;
}
JPanel framePanel = new JPanel(new BorderLayout());
framePanel.setBorder(BorderFactory.createTitledBorder(extensionName));
framePanel.add (aPanel,BorderLayout.NORTH);
drawPanel.add (framePanel);
}
| Start the revalidation of the panels associated to the extensions.
|
@OnThread(Tag.Swing)
public void panelRevalidate()
{
}
|
| Needed only to satisfy the implements
|
@OnThread(Tag.FXPlatform)
public void beginEditing(Project project)
{
}
|
| Called by the system when it is time to reload the panel values
|
@OnThread(Tag.FXPlatform)
public void revertEditing(Project project)
{
SwingUtilities.invokeLater(() -> doWorkLoop(DO_loadValues));
}
|
| Called by the system when the user has pressed the OK buton
|
@OnThread(Tag.FXPlatform)
public void commitEditing(Project project)
{
SwingUtilities.invokeLater(() -> doWorkLoop(DO_saveValues));
}
}
top,
use,
map,
class ExtensionPrefManager
. ExtensionPrefManager
. getPanel
. doWorkLoop
. doWorkItem
. addUserPanel
. panelRevalidate
. beginEditing
. revertEditing
. commitEditing
171 neLoCode
+ 23 LoComm