package husacct.graphics.presentation.menubars; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.HashMap; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JSlider; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import husacct.common.enums.DependencyTypeOption; import org.apache.log4j.Logger; import husacct.common.Resource; import husacct.common.help.presentation.HelpableJPanel; import husacct.graphics.domain.figures.BaseFigure; import husacct.graphics.presentation.GraphicsPresentationController; import husacct.graphics.presentation.UserInputListener; import husacct.graphics.presentation.dialogs.GraphicsOptionsDialog; import husacct.graphics.task.DrawingTypesEnum; import husacct.graphics.task.modulelayout.ModuleLayoutsEnum; public class GraphicsMenuBar extends HelpableJPanel implements UserInputListener { private static final long serialVersionUID = -7419378432318031359L; protected Logger logger = Logger.getLogger(GraphicsMenuBar.class); private ArrayList<UserInputListener> listeners = new ArrayList<UserInputListener>(); private HashMap<String, String> icons; private ArrayList<JComponent> actions; private JButton zoomInButton, zoomOutButton, refreshButton, exportToImageButton, optionsDialogButton, showDependenciesButton, showViolationsButton, outOfDateButton, panToolButton, selectToolButton; private JSlider zoomSlider; private GraphicsOptionsDialog graphicsOptionsDialog; private int menuItemMaxHeight = 45; private HashMap<String, String> menuBarLocale; private final ContextMenuButton zoomOptionsMenu; private boolean showDependencyOptions = false; public GraphicsMenuBar(DrawingTypesEnum drawingType) { showDependencyOptions = drawingType == DrawingTypesEnum.IMPLEMENTED_ARCHITECTURE; zoomOptionsMenu = new ContextMenuButton(); icons = new HashMap<String, String>(); icons.put("options", Resource.ICON_OPTIONS); icons.put("zoomIn", Resource.ICON_ZOOM); icons.put("zoomInContext", Resource.ICON_ZOOMCONTEXT); icons.put("zoomOut", Resource.ICON_BACK); icons.put("refresh", Resource.ICON_REFRESH); icons.put("save", Resource.ICON_SAVE); icons.put("dependenciesShow", Resource.ICON_DEPENDENCIES_ACTIVE); icons.put("dependenciesHide", Resource.ICON_DEPENDENCIES_INACTIVE); icons.put("violationsShow", Resource.ICON_VIOLATIONS_ACTIVE); icons.put("violationsHide", Resource.ICON_VIOLATIONS_INACTIVE); icons.put("outofdate", Resource.ICON_OUTOFDATE); icons.put("showFigures", Resource.ICON_FIGURES_SHOW); icons.put("hideFigures", Resource.ICON_FIGURES_HIDE); icons.put("panTool", Resource.ICON_PAN_TOOL); icons.put("selectTool", Resource.ICON_SELECT_TOOL); initializeComponents(); setLayout(new FlowLayout(FlowLayout.LEFT)); actions = new ArrayList<JComponent>(); actions.add(zoomInButton); actions.add(zoomOutButton); actions.add(refreshButton); actions.add(exportToImageButton); actions.add(panToolButton); actions.add(selectToolButton); actions.add(optionsDialogButton); actions.add(showDependenciesButton); actions.add(showViolationsButton); actions.add(zoomSlider); actions.add(outOfDateButton); } private void initializeComponents() { zoomInButton = new JButton(); zoomInButton.setSize(50, menuItemMaxHeight); zoomInButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { zoomIn(); } }); zoomInButton.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { if (SwingUtilities.isRightMouseButton(e) && e.getClickCount() == 1) zoomOptionsMenu.show(zoomInButton, e.getX(), e.getY()); } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } }); add(zoomInButton); setButtonIcon(zoomInButton, "zoomIn"); zoomOutButton = new JButton(); zoomOutButton.setSize(50, menuItemMaxHeight); zoomOutButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { zoomOut(); } }); add(zoomOutButton); setButtonIcon(zoomOutButton, "zoomOut"); refreshButton = new JButton(); refreshButton.setSize(50, menuItemMaxHeight); refreshButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { refreshDrawing(); } }); add(refreshButton); setButtonIcon(refreshButton, "refresh"); showDependenciesButton = new JButton(); showDependenciesButton.setSize(40, menuItemMaxHeight); showDependenciesButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (showDependenciesButton.getToolTipText().equals(menuBarLocale.get("HideDependencies"))) { dependenciesHide(); refreshDrawing(); } else { dependenciesShow(); refreshDrawing(); } } }); add(showDependenciesButton); showViolationsButton = new JButton(); showViolationsButton.setSize(40, menuItemMaxHeight); showViolationsButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (showViolationsButton.getToolTipText().equals(menuBarLocale.get("HideViolations"))) { violationsHide(); refreshDrawing(); } else { violationsShow(); refreshDrawing(); } } }); add(showViolationsButton); exportToImageButton = new JButton(); exportToImageButton.setSize(50, menuItemMaxHeight); exportToImageButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { exportImage(); } }); add(exportToImageButton); setButtonIcon(exportToImageButton, "save"); selectToolButton = new JButton(); selectToolButton.setSize(50, menuItemMaxHeight); selectToolButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { useSelectTool(); selectToolButton.setBorder(BorderFactory.createLineBorder(Color.MAGENTA)); panToolButton.setBorder(BorderFactory.createLineBorder(Color.GRAY)); } }); add(selectToolButton); selectToolButton.setBorder(BorderFactory .createLineBorder(Color.MAGENTA)); setButtonIcon(selectToolButton, "selectTool"); panToolButton = new JButton(); panToolButton.setSize(50, menuItemMaxHeight); panToolButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { usePanTool(); selectToolButton.setBorder(BorderFactory.createLineBorder(Color.GRAY)); panToolButton.setBorder(BorderFactory.createLineBorder(Color.MAGENTA)); } }); add(panToolButton); panToolButton.setBorder(BorderFactory.createLineBorder(Color.GRAY)); setButtonIcon(panToolButton, "panTool"); graphicsOptionsDialog = new GraphicsOptionsDialog(showDependencyOptions); graphicsOptionsDialog.addListener(this); graphicsOptionsDialog.setIcons(icons); optionsDialogButton = new JButton(); optionsDialogButton.setSize(40, menuItemMaxHeight); optionsDialogButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { graphicsOptionsDialog.showDialog(); } }); add(optionsDialogButton); setButtonIcon(optionsDialogButton, "options"); zoomSlider = new JSlider(25, 175, 100); zoomSlider.setSize(50, menuItemMaxHeight); zoomSlider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent ce) { int scale = ((JSlider) ce.getSource()).getValue(); graphicsOptionsDialog.setZoomValue(scale); zoomFactorChanged(scale); } }); add(zoomSlider); outOfDateButton = new JButton(); outOfDateButton.setSize(50, menuItemMaxHeight); setButtonIcon(outOfDateButton, "outofdate"); } public void addListener(UserInputListener listener) { listeners.add(listener); // PresentationController zoomOptionsMenu.addListener(listener); } @Override public void dependenciesHide() { for (UserInputListener listener : listeners) listener.dependenciesHide(); } @Override public void dependenciesShow() { for (UserInputListener listener : listeners) listener.dependenciesShow(); } @Override public void exportImage() { for (UserInputListener listener : listeners) listener.exportImage(); } public double getScaleFactor() { double scaleFactor = zoomSlider.getValue() / 100.0; return scaleFactor; } public void hideOutOfDateWarning() { remove(outOfDateButton); validate(); updateUI(); } @Override public void layoutStrategyChange(ModuleLayoutsEnum selectedStrategyEnum) { for (UserInputListener listener : listeners) listener.layoutStrategyChange(selectedStrategyEnum); } @Override public void librariesHide() { for (UserInputListener l : listeners) l.librariesHide(); } @Override public void librariesShow() { for (UserInputListener l : listeners) l.librariesShow(); } @Override public void moduleHide() { for (UserInputListener listener : listeners) listener.moduleHide(); } @Override public void moduleRestoreHiddenModules() { for (UserInputListener listener : listeners) listener.moduleRestoreHiddenModules(); } @Override public void moduleOpen(String[] paths) { // Not used from this UI } @Override public void propertiesPaneHide(){ } @Override public void propertiesPaneShowDependencies(BaseFigure selectedLine) { } @Override public void propertiesPaneShowUmlLinks(BaseFigure selectedLine){ } @Override public void propertiesPaneShowViolations(BaseFigure selectedLine) { } @Override public void propertiesPaneShowRules(BaseFigure selectedFigure) { } @Override public void proportionalLinesDisable() { for (UserInputListener l : listeners) l.proportionalLinesDisable(); } @Override public void proportionalLinesEnable() { for (UserInputListener l : listeners) l.proportionalLinesEnable(); } @Override public void refreshDrawing() { for (UserInputListener listener : listeners) listener.refreshDrawing(); } public void removeListener(UserInputListener listener) { listeners.remove(listener); } private void setButtonIcon(JButton button, String iconKey) { try { ImageIcon icon = new ImageIcon(Resource.get(icons.get(iconKey))); button.setIcon(icon); button.setMargin(new Insets(1, 5, 1, 5)); } catch (Exception e) { logger.warn("Could not find icon for \"" + iconKey + "\"."); } } public void setDependeciesButtonsToShow() { setButtonIcon(showDependenciesButton, "dependenciesHide"); showDependenciesButton.setToolTipText(menuBarLocale.get("HideDependencies")); graphicsOptionsDialog.setDependeciesButtonsToShow(); } public void setDependeciesButtonToDontShow() { setButtonIcon(showDependenciesButton, "dependenciesShow"); showDependenciesButton.setToolTipText(menuBarLocale.get("ShowDependencies")); graphicsOptionsDialog.setDependeciesButtonToDontShow(); } public void setLocale(HashMap<String, String> locale) { menuBarLocale = locale; try { zoomInButton.setToolTipText(menuBarLocale.get("ZoomIn")); zoomOutButton.setToolTipText(menuBarLocale.get("ZoomOut")); refreshButton.setToolTipText(menuBarLocale.get("Refresh")); exportToImageButton.setToolTipText(menuBarLocale.get("ExportToImage")); optionsDialogButton.setToolTipText(menuBarLocale.get("Options")); outOfDateButton.setToolTipText(menuBarLocale.get("DrawingOutOfDate")); outOfDateButton.setText(menuBarLocale.get("DrawingOutOfDate")); optionsDialogButton.setText(menuBarLocale.get("Options")); graphicsOptionsDialog.setLocale(menuBarLocale); graphicsOptionsDialog.setIcons(icons); } catch (NullPointerException e) { logger.warn("Locale for GraphicsMenuBar is not set properly."); } } public void setOptionsDialogAction(ActionListener listener) { optionsDialogButton.addActionListener(listener); } public void showOutOfDateWarning() { add(outOfDateButton); validate(); updateUI(); } public void setOutOfDateAction(ActionListener listener) { outOfDateButton.addActionListener(listener); } public void setSelectedLayoutStrategyItem(ModuleLayoutsEnum item) { graphicsOptionsDialog.setSelectedLayoutStrategyItem(item); } public void setSmartLinesButtonsToShow() { graphicsOptionsDialog.setSmartLinesButtonsToShow(); } public void setSmartLinesButtonsToDontShow() { graphicsOptionsDialog.setSmartLinesButtonsToDontShow(); } public void setViolationsButtonsToShow() { setButtonIcon(showViolationsButton, "violationsHide"); showViolationsButton.setToolTipText(menuBarLocale.get("HideViolations")); graphicsOptionsDialog.setViolationsButtonsToShow(); } public void setViolationsButtonsToDontShow() { setButtonIcon(showViolationsButton, "violationsShow"); showViolationsButton.setToolTipText(menuBarLocale.get("ShowViolations")); graphicsOptionsDialog.setViolationsButtonsToDontShow(); } @Override public void smartLinesDisable() { for (UserInputListener l : listeners) l.smartLinesDisable(); } @Override public void smartLinesEnable() { for (UserInputListener l : listeners) l.smartLinesEnable(); } public void turnOffBar() { for (JComponent comp : actions) comp.setEnabled(false); graphicsOptionsDialog.turnOff(); validate(); updateUI(); } public void turnOnBar() { for (JComponent comp : actions) comp.setEnabled(true); graphicsOptionsDialog.turnOn(); validate(); updateUI(); } @Override public void usePanTool() { for (UserInputListener l : listeners) l.usePanTool(); } @Override public void useSelectTool() { for (UserInputListener l : listeners) l.useSelectTool(); } @Override public void violationsHide() { for (UserInputListener l : listeners) l.violationsHide(); } @Override public void violationsShow() { for (UserInputListener l : listeners) l.violationsShow(); } @Override public void zoomFactorChanged(double zoomFactor) { zoomSlider.setValue((int) zoomFactor); for (UserInputListener listener : listeners) listener.zoomFactorChanged(zoomFactor); } @Override public void zoomIn() { for (UserInputListener listener : listeners) listener.zoomIn(); } @Override public void zoomTypeChange(String zoomType) { for (UserInputListener listener : listeners) listener.zoomTypeChange(zoomType); } @Override public void zoomOut() { for (UserInputListener listener : listeners) listener.zoomOut(); } @Override public void zoomSliderSetZoomFactor(double zoomFactor) { int value = (int) (zoomFactor * 100); zoomSlider.setValue(value); } public void dependencyTypeChange(DependencyTypeOption option) { for (UserInputListener listener : listeners) if (listener instanceof GraphicsPresentationController) { ((GraphicsPresentationController) listener).dependencyTypeChange(option); } } }