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