package husacct.control.presentation.viewcontrol; import husacct.ServiceProvider; import husacct.common.services.IServiceListener; import husacct.control.task.MainController; import java.awt.Dimension; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyVetoException; import javax.swing.DesktopManager; import javax.swing.ImageIcon; import javax.swing.JInternalFrame; import javax.swing.JToggleButton; import javax.swing.WindowConstants; import javax.swing.event.InternalFrameAdapter; import javax.swing.event.InternalFrameEvent; import org.apache.log4j.Logger; abstract public class InternalFrameController { private MainController mainController; private JInternalFrame internalFrame; private ImageIcon frameIcon; private String stringIdentifier; private TaskBar taskBar; private JToggleButton toggleButton; public static final Dimension defaultDimension = new Dimension(950, 600); private static Point lastStartPosition = new Point(-19, -19); private static Point positionIncrement = new Point(20, 20); private Point startPosition = new Point(0, 0); private boolean isMaximixed = true; // Listeners private InternalFrameAdapter internalFrameAdapter; private MouseAdapter internalFrameMouseAdapter; private ToolBarButtonListener toggleButtonContextClickListener; private ActionListener toggleButtonActionListener; private Logger logger = Logger.getLogger(InternalFrameController.class); public InternalFrameController(MainController mainController, ImageIcon frameIcon, String stringIdentifier){ this.mainController = mainController; this.frameIcon = frameIcon; this.stringIdentifier = stringIdentifier; } public void setLocaleListener(){ ServiceProvider.getInstance().getLocaleService().addServiceListener(new IServiceListener() { @Override public void update() { if(internalFrame != null){ internalFrame.setTitle(getTitle()); if(ServiceProvider.getInstance().getControlService().isGuiEnabled()) { toggleButton.setText(internalFrame.getTitle()); } } } }); } public void showView(){ JInternalFrame newInternalFrame = getNewInternalFrame(); if (newInternalFrame != null) { if ((newInternalFrame == internalFrame)) { if (internalFrame.isClosed() == false) { setInternalFrameAndButtonVisible(); } else { addInternalFrame(newInternalFrame); } } else { calculateNewStartPosition(); addInternalFrame(newInternalFrame); } } } private void addInternalFrame(JInternalFrame newInternalFrame){ try { closeInternalFrame(); // To clean-up internalFrame = newInternalFrame; if (internalFrame != null) { if ((mainController.getMainGui() != null) && (mainController.getMainGui().getDesktopPane() != null) && (mainController.getMainGui().getTaskBar() != null)) { internalFrame.setVisible(true); mainController.getMainGui().getDesktopPane().add(internalFrame); taskBar = mainController.getMainGui().getTaskBar(); setupFrame(); createToggleButton(); internalFrame.setBounds(startPosition.x, startPosition.y, InternalFrameController.defaultDimension.width, InternalFrameController.defaultDimension.height); internalFrame.setMaximum(isMaximixed); internalFrame.setVisible(true); activateInternalFrame(); mainController.getMainGui().revalidate(); mainController.getMainGui().getDesktopPane().repaint(); } } } catch (Exception e) { e.printStackTrace(); logger.error(" Exception: " + e.getMessage()); } } private void setupFrame(){ internalFrame.setTitle(getTitle()); internalFrame.setMaximizable(true); internalFrame.setResizable(true); internalFrame.setIconifiable(true); internalFrame.setFrameIcon(frameIcon); internalFrame.setClosable(true); internalFrame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); addListenersToInternalFrame(); } public void setInternalFrameAndButtonInvisible(){ if (internalFrame != null) { deactivateInternalFrame(); internalFrame.setVisible(false); taskBar.removeToggleButton(toggleButton); if ((mainController.getMainGui() != null) && (mainController.getMainGui().getDesktopPane() != null)) { mainController.getMainGui().getDesktopPane().validate(); mainController.getMainGui().repaint(); // In case a scrollbar is added to the taskbar, or removed. } } } public void setInternalFrameAndButtonVisible(){ if (internalFrame != null) { internalFrame.setVisible(true); taskBar.addToggleButton(toggleButton); activateInternalFrame(); if ((mainController.getMainGui() != null) && (mainController.getMainGui().getDesktopPane() != null)) { mainController.getMainGui().getDesktopPane().validate(); mainController.getMainGui().repaint(); // In case a scrollbar is added to the taskbar, or removed. } } } private void closeInternalFrame(){ if (internalFrame != null) { isMaximixed = internalFrame.isMaximum(); // Store current setting; used while internal frame is added again internalFrame.dispose(); removeListenersFromInternalFrame(); if ((mainController.getMainGui() != null) && (mainController.getMainGui().getDesktopPane() != null)) { mainController.getMainGui().getDesktopPane().remove(internalFrame); mainController.getMainGui().getDesktopPane().validate(); } if (ServiceProvider.getInstance().getControlService().isGuiEnabled()) { removeToggleButton(); } internalFrame = null; } } public void closeFrame(){ if(internalFrame != null) { closeInternalFrame(); } } public JInternalFrame getInternalFrame() { return internalFrame; } // Abstract method, overridden by ViewController with a call to the specific method. abstract public JInternalFrame getNewInternalFrame(); private String getTitle(){ return ServiceProvider.getInstance().getLocaleService().getTranslatedString(stringIdentifier); } public static void resetLastStartPosition() { lastStartPosition = new Point(-19, -19); } private void calculateNewStartPosition(){ if(internalFrame == null){ // Only do it the first time for a specific internal frame. int newX = InternalFrameController.lastStartPosition.x + InternalFrameController.positionIncrement.x; int newY = InternalFrameController.lastStartPosition.y + InternalFrameController.positionIncrement.y; InternalFrameController.lastStartPosition = new Point(newX, newY); startPosition = new Point(newX, newY); } } private void addListenersToInternalFrame() { internalFrameAdapter = new InternalFrameAdapter() { @Override public void internalFrameActivated(InternalFrameEvent e) { activateInternalFrame(); } @Override public void internalFrameDeactivated(InternalFrameEvent e) { deactivateInternalFrame(); } @Override public void internalFrameClosing(InternalFrameEvent e) { setInternalFrameAndButtonInvisible(); } @Override public void internalFrameClosed(InternalFrameEvent e) { } @Override public void internalFrameOpened(InternalFrameEvent e) { activateInternalFrame(); } @Override public void internalFrameIconified(InternalFrameEvent e){ iconifyInternalFrame(); } @Override public void internalFrameDeiconified(InternalFrameEvent e){ deIconifyInternalFrame(); } }; internalFrame.addInternalFrameListener(internalFrameAdapter); internalFrameMouseAdapter = new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { activateInternalFrame(); } }; internalFrame.addMouseListener(internalFrameMouseAdapter); } private void removeListenersFromInternalFrame() { internalFrame.removeInternalFrameListener(internalFrameAdapter); internalFrame.removeMouseListener(internalFrameMouseAdapter); } private void activateInternalFrame(){ try { if ((internalFrame != null) && (internalFrame.getDesktopPane() != null)) { if ( internalFrame.isIcon() == true) { internalFrame.setIcon(false); } internalFrame.toFront(); internalFrame.setSelected(true); DesktopManager manager = internalFrame.getDesktopPane().getDesktopManager(); manager.activateFrame(internalFrame); } } catch (Exception event) { logger.error(event.getMessage()); event.printStackTrace(); } toggleButton.setSelected(true); } private void deactivateInternalFrame(){ try { internalFrame.setSelected(false); DesktopManager manager = internalFrame.getDesktopPane().getDesktopManager(); manager.deactivateFrame(internalFrame); } catch (Exception event) { logger.error(event.getMessage()); } toggleButton.setSelected(false); } public void iconifyInternalFrame(){ try { internalFrame.setIcon(true); DesktopManager manager = internalFrame.getDesktopPane().getDesktopManager(); manager.iconifyFrame(internalFrame); internalFrame.setVisible(false); } catch (Exception event) { logger.error(event.getMessage()); } deactivateInternalFrame(); } private void deIconifyInternalFrame(){ try { internalFrame.setIcon(false); DesktopManager manager = internalFrame.getDesktopPane().getDesktopManager(); manager.deiconifyFrame(internalFrame); internalFrame.setVisible(true); } catch (Exception event) { logger.error(event.getMessage()); } activateInternalFrame(); } public void maximizeInternalFrame() { try { internalFrame.setMaximum(true); activateInternalFrame(); } catch (PropertyVetoException e) { logger.error(e.getMessage()); } } public void restoreInternalFrame() { try { internalFrame.setMaximum(false); activateInternalFrame(); } catch (PropertyVetoException e) { logger.error(e.getMessage()); } } /* * Adding a button to the taskbar may cause the appearance of scrollbars, which causes a change in size of the taskbar. */ private void createToggleButton() { toggleButton = new JToggleButton(internalFrame.getTitle()); toggleButton.setIcon(internalFrame.getFrameIcon()); taskBar.addToggleButton(toggleButton); // Add listeners to toggleButton toggleButtonContextClickListener = new ToolBarButtonListener(this); toggleButton.addMouseListener(toggleButtonContextClickListener); toggleButtonActionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent event) { activateInternalFrame(); } }; toggleButton.addActionListener(toggleButtonActionListener); } /* * Removing the button from the taskbar may cause the disappearance of scrollbars, which causes a change in size of the taskbar. */ private void removeToggleButton() { taskBar.removeToggleButton(toggleButton); toggleButton.removeMouseListener(toggleButtonContextClickListener); toggleButton.removeActionListener(toggleButtonActionListener); } }