package husacct.graphics.presentation.dialogs; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.HashMap; import javax.swing.BoxLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.border.EmptyBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import husacct.common.enums.DependencyTypeOption; import org.apache.log4j.Logger; import husacct.ServiceProvider; import husacct.common.help.presentation.HelpableJDialog; import husacct.common.locale.ILocaleService; import husacct.graphics.presentation.UserInputListener; import husacct.graphics.presentation.menubars.GraphicsMenuBar; import husacct.graphics.task.modulelayout.ModuleLayoutsEnum; public class GraphicsOptionsDialog extends HelpableJDialog { private static final long serialVersionUID = 4794939901459687332L; protected Logger logger = Logger.getLogger(GraphicsOptionsDialog.class); private ArrayList<UserInputListener> listeners = new ArrayList<UserInputListener>(); private JPanel mainPanel, settingsPanel, globalActionsPanel, figuresActionsPanel, optionsPanel, zoomPanel, layoutStrategyPanel, dependencyPanel; private int menuItemMaxHeight = 45; private JButton zoomInButton, zoomOutButton, refreshButton, exportToImageButton, hideSelectedModulesButton, restoreHiddenModulesButton, okButton, cancelButton; private JCheckBox showDependenciesOptionMenu, showViolationsOptionMenu, smartLinesOptionMenu, showExternalLibraries, enableThickLines; private JComboBox<String> layoutStrategyOptions; private JSlider zoomSlider; private JLabel layoutStrategyLabel, zoomLabel, dependencyLabel; private ArrayList<JComponent> interfaceElements; private HashMap<String, Object> currentSettings; private boolean refreshDrawingRequired = false; private int totalWidth, totalHeight, paddingSize, labelWidth, elementWidth, elementHeight; private HashMap<String, ModuleLayoutsEnum> layoutStrategiesTranslations; private String[] layoutStrategyItems; private HashMap<String, DependencyTypeOption> dependencyOptionTypeTranslations; private String[] dependencyOptionItems; private ILocaleService localeService = ServiceProvider.getInstance().getLocaleService(); private JComboBox<String> toggleDependencyType; private boolean showDependencyOptions; public GraphicsOptionsDialog(boolean showDependencyOptions) { super((GraphicsOptionsDialog) null, true); this.showDependencyOptions = showDependencyOptions; currentSettings = new HashMap<String, Object>(); currentSettings.put("dependencies", true); currentSettings.put("violations", false); currentSettings.put("thickLines", false); //proportionalLineWidth currentSettings.put("smartLines", true); currentSettings.put("libraries", false); currentSettings.put("layoutStrategy", ModuleLayoutsEnum.BASIC_LAYOUT); totalWidth = 550; totalHeight = 290; paddingSize = 10; labelWidth = 110; elementHeight = 20; elementWidth = totalWidth - labelWidth - paddingSize * 2 - 20; mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); add(mainPanel); layoutStrategiesTranslations = new HashMap<String, ModuleLayoutsEnum>(); int i = 0; layoutStrategyItems = new String[ModuleLayoutsEnum.values().length]; for (ModuleLayoutsEnum strategy : ModuleLayoutsEnum.values()) { String translation = localeService.getTranslatedString(strategy.toString()); layoutStrategiesTranslations.put(translation, strategy); layoutStrategyItems[i] = translation; i++; } dependencyOptionTypeTranslations = new HashMap<String, DependencyTypeOption>(); i = 0; dependencyOptionItems = new String[DependencyTypeOption.values().length]; for (DependencyTypeOption optionType : DependencyTypeOption.values()) { String translation = localeService.getTranslatedString(optionType.getType()); dependencyOptionTypeTranslations.put(translation, optionType); dependencyOptionItems[i] = translation; i++; } initGUI(); interfaceElements = new ArrayList<JComponent>(); interfaceElements.add(zoomInButton); interfaceElements.add(zoomOutButton); interfaceElements.add(refreshButton); interfaceElements.add(exportToImageButton); interfaceElements.add(showDependenciesOptionMenu); interfaceElements.add(showViolationsOptionMenu); if (showDependencyOptions) interfaceElements.add(toggleDependencyType); interfaceElements.add(showExternalLibraries); interfaceElements.add(enableThickLines); interfaceElements.add(smartLinesOptionMenu); interfaceElements.add(layoutStrategyOptions); interfaceElements.add(zoomSlider); interfaceElements.add(okButton); interfaceElements.add(cancelButton); } public void addListener(UserInputListener listener) { listeners.add(listener); // Listener is GraphicsMenuBar } public ModuleLayoutsEnum getSelectedLayoutStrategyItem() { ModuleLayoutsEnum selectedStrategy = null; String selectedItem = null; try { selectedItem = (String) layoutStrategyOptions.getSelectedItem(); selectedStrategy = layoutStrategiesTranslations.get(selectedItem); } catch (Exception ex) { logger.debug("Could not find the selected layout strategy \"" + (selectedItem == null ? "null" : selectedItem) + "\"."); } return selectedStrategy; } public void initGUI() { globalActionsPanel = new JPanel(); zoomInButton = new JButton(); zoomInButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (UserInputListener listener : listeners) listener.zoomIn(); } }); globalActionsPanel.add(zoomInButton); zoomOutButton = new JButton(); zoomOutButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (UserInputListener listener : listeners) listener.zoomOut(); } }); globalActionsPanel.add(zoomOutButton); refreshButton = new JButton(); refreshButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (UserInputListener listener : listeners) listener.refreshDrawing(); } }); globalActionsPanel.add(refreshButton); exportToImageButton = new JButton(); exportToImageButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (UserInputListener listener : listeners) listener.exportImage(); } }); globalActionsPanel.add(exportToImageButton); mainPanel.add(globalActionsPanel); figuresActionsPanel = new JPanel(); hideSelectedModulesButton = new JButton(); hideSelectedModulesButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (UserInputListener listener : listeners) listener.moduleHide(); } }); figuresActionsPanel.add(hideSelectedModulesButton); restoreHiddenModulesButton = new JButton(); restoreHiddenModulesButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for (UserInputListener listener : listeners) listener.moduleRestoreHiddenModules(); } }); figuresActionsPanel.add(restoreHiddenModulesButton); mainPanel.add(figuresActionsPanel); optionsPanel = new JPanel(); optionsPanel.setBorder(new EmptyBorder(0, paddingSize, 0, paddingSize)); optionsPanel.setLayout(new GridLayout(3, 1)); showDependenciesOptionMenu = new JCheckBox(); showDependenciesOptionMenu.setPreferredSize(new Dimension(40, menuItemMaxHeight)); showDependenciesOptionMenu.setMaximumSize(new Dimension(40, menuItemMaxHeight)); optionsPanel.add(showDependenciesOptionMenu); showViolationsOptionMenu = new JCheckBox(); showViolationsOptionMenu.setSize(40, menuItemMaxHeight); optionsPanel.add(showViolationsOptionMenu); showExternalLibraries = new JCheckBox(); showExternalLibraries.setSize(40, menuItemMaxHeight); optionsPanel.add(showExternalLibraries); enableThickLines = new JCheckBox(); enableThickLines.setSize(40, menuItemMaxHeight); optionsPanel.add(enableThickLines); smartLinesOptionMenu = new JCheckBox(); smartLinesOptionMenu.setSize(40, menuItemMaxHeight); optionsPanel.add(smartLinesOptionMenu); mainPanel.add(optionsPanel); settingsPanel = new JPanel(); settingsPanel.setLayout(new GridLayout(3, 2)); settingsPanel.setBorder(new EmptyBorder(0, paddingSize, 0, paddingSize)); layoutStrategyPanel = new JPanel(); layoutStrategyPanel.setSize(getWidth(), getHeight()); layoutStrategyPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); layoutStrategyLabel = new JLabel(); layoutStrategyLabel.setPreferredSize(new Dimension(labelWidth, elementHeight)); layoutStrategyPanel.add(layoutStrategyLabel); layoutStrategyOptions = new JComboBox<String>(layoutStrategyItems); layoutStrategyOptions.setPreferredSize(new Dimension(elementWidth, elementHeight)); layoutStrategyPanel.add(layoutStrategyOptions); settingsPanel.add(layoutStrategyPanel); if (showDependencyOptions) { dependencyPanel = new JPanel(); dependencyPanel.setSize(getWidth(), getHeight()); dependencyPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); dependencyLabel = new JLabel(); dependencyLabel.setPreferredSize(new Dimension(labelWidth, elementHeight)); dependencyPanel.add(dependencyLabel); toggleDependencyType = new JComboBox<String>(dependencyOptionItems); toggleDependencyType.setPreferredSize(new Dimension(elementWidth, elementHeight)); toggleDependencyType.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { for(UserInputListener listener : listeners){ if (listener instanceof GraphicsMenuBar){ String selection = (String) toggleDependencyType.getSelectedItem(); DependencyTypeOption option = dependencyOptionTypeTranslations.get(selection); ((GraphicsMenuBar)listener).dependencyTypeChange(option); } } } }); dependencyPanel.add(toggleDependencyType); settingsPanel.add(dependencyPanel); } zoomPanel = new JPanel(); zoomPanel.setSize(getWidth(), getHeight()); zoomPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); zoomLabel = new JLabel(); zoomLabel.setPreferredSize(new Dimension(labelWidth, elementHeight)); zoomPanel.add(zoomLabel); zoomSlider = new JSlider(25, 175, 100); zoomSlider.setPreferredSize(new Dimension(elementWidth, elementHeight)); zoomSlider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent ce) { int scale = ((JSlider) ce.getSource()).getValue(); for (UserInputListener listener : listeners) listener.zoomFactorChanged(scale); } }); zoomPanel.add(zoomSlider); settingsPanel.add(zoomPanel); mainPanel.add(settingsPanel); JPanel confirmPanel = new JPanel(); confirmPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); okButton = new JButton(); okButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setVisible(false); notifyListeners(); if (refreshDrawingRequired) { for (UserInputListener listener : listeners) { listener.refreshDrawing(); } refreshDrawingRequired = false; } } }); confirmPanel.add(okButton); cancelButton = new JButton(); cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { resetUIElementsToCurrentSettings(); setVisible(false); } }); confirmPanel.add(cancelButton); mainPanel.add(confirmPanel); } public void notifyListeners() { for (UserInputListener listener : listeners) { if (showDependenciesOptionMenu.isSelected()) { if (((Boolean) currentSettings.get("dependencies")) != true) { currentSettings.put("dependencies", true); listener.dependenciesShow(); refreshDrawingRequired = true; } } else { if (((Boolean) currentSettings.get("dependencies")) != false) { currentSettings.put("dependencies", false); listener.dependenciesHide(); refreshDrawingRequired = true; } } if (enableThickLines.isSelected()) { if (((Boolean) currentSettings.get("thickLines")) != true) { currentSettings.put("thickLines", true); listener.proportionalLinesEnable(); refreshDrawingRequired = true; } } else { if (((Boolean) currentSettings.get("thickLines")) != false) { currentSettings.put("thickLines", false); listener.proportionalLinesDisable(); refreshDrawingRequired = true; } } if (showViolationsOptionMenu.isSelected()) { if (((Boolean) currentSettings.get("violations")) != true) { currentSettings.put("violations", true); listener.violationsShow(); refreshDrawingRequired = true; } } else { if (((Boolean) currentSettings.get("violations")) != false) { currentSettings.put("violations", false); listener.violationsHide(); refreshDrawingRequired = true; } } if (smartLinesOptionMenu.isSelected()) { if (((Boolean) currentSettings.get("smartLines")) != true) { currentSettings.put("smartLines", true); listener.smartLinesEnable(); refreshDrawingRequired = true; } } else { if (((Boolean) currentSettings.get("smartLines")) != false) { currentSettings.put("smartLines", false); listener.smartLinesDisable(); refreshDrawingRequired = true; } } if (showExternalLibraries.isSelected()) { if (((Boolean) currentSettings.get("libraries")) != true) { currentSettings.put("libraries", true); listener.librariesShow(); refreshDrawingRequired = true; } } else { if (((Boolean) currentSettings.get("libraries")) != false) { currentSettings.put("libraries", false); listener.librariesHide(); refreshDrawingRequired = true; } } ModuleLayoutsEnum selectedStrategy = getSelectedLayoutStrategyItem(); if ((selectedStrategy != null) && !selectedStrategy.toString().equals(currentSettings.get("layoutStrategy").toString())) { currentSettings.put("layoutStrategy", selectedStrategy); listener.layoutStrategyChange(selectedStrategy); refreshDrawingRequired = true; } } } public void removeListener(UserInputListener listener) { listeners.remove(listener); } private void resetUIElementsToCurrentSettings() { showDependenciesOptionMenu.setSelected((Boolean) currentSettings.get("dependencies")); showViolationsOptionMenu.setSelected((Boolean) currentSettings.get("violations")); showExternalLibraries.setSelected((Boolean) currentSettings.get("libraries")); enableThickLines.setSelected((Boolean) currentSettings.get("thickLines")); smartLinesOptionMenu.setSelected((Boolean) currentSettings.get("smartLines")); layoutStrategyOptions.setSelectedItem(localeService.getTranslatedString(currentSettings.get("layoutStrategy").toString())); } public void setDependeciesButtonsToShow() { currentSettings.put("dependencies", true); showDependenciesOptionMenu.setSelected(true); } public void setDependeciesButtonToDontShow() { currentSettings.put("dependencies", false); showDependenciesOptionMenu.setSelected(false); } public void setIcons(HashMap<String, String> icons) { try { ImageIcon icon = new ImageIcon(getClass().getResource( icons.get("zoomIn"))); zoomInButton.setIcon(icon); icon = new ImageIcon(getClass().getResource(icons.get("zoomOut"))); zoomOutButton.setIcon(icon); icon = new ImageIcon(getClass().getResource(icons.get("refresh"))); refreshButton.setIcon(icon); icon = new ImageIcon(getClass().getResource(icons.get("save"))); exportToImageButton.setIcon(icon); icon = new ImageIcon(getClass().getResource( icons.get("hideFigures"))); hideSelectedModulesButton.setIcon(icon); icon = new ImageIcon(getClass().getResource( icons.get("showFigures"))); restoreHiddenModulesButton.setIcon(icon); } catch (NullPointerException e) { logger.warn("Icons are not set properly."); } } // TODO add a button to GraphicsMenuBar to enable libraries public void setLibrariesUIToActive() { currentSettings.put("libraries", true); showExternalLibraries.setSelected(true); } // TODO add a button to GraphicsMenuBar to disable libraries public void setLibrariesUIToInactive() { currentSettings.put("libraries", false); showExternalLibraries.setSelected(false); } public void setThickLinesUIToActive() { currentSettings.put("thickLines", true); enableThickLines.setSelected(true); } public void setThickLinesUIToInactive() { currentSettings.put("thickLines", false); enableThickLines.setSelected(false); } public void setLocale(HashMap<String, String> menuBarLocale) { try { zoomLabel.setText(menuBarLocale.get("Zoom")); if (showDependencyOptions) dependencyLabel.setText(menuBarLocale.get("DependencyTypesOptions")); layoutStrategyLabel.setText(menuBarLocale.get("LayoutStrategy")); zoomInButton.setText(menuBarLocale.get("ZoomIn")); zoomOutButton.setText(menuBarLocale.get("ZoomOut")); refreshButton.setText(menuBarLocale.get("Refresh")); exportToImageButton.setText(menuBarLocale.get("ExportToImage")); showDependenciesOptionMenu.setText(menuBarLocale.get("ShowDependencies")); showViolationsOptionMenu.setText(menuBarLocale.get("ShowViolations")); showExternalLibraries.setText(menuBarLocale.get("ShowExternalLibraries")); //TODO name for checkbox enableThickLines.setText("Proportional Line Width"); okButton.setText(menuBarLocale.get("Ok")); cancelButton.setText(menuBarLocale.get("Cancel")); smartLinesOptionMenu.setText(menuBarLocale.get("LineContextUpdates")); hideSelectedModulesButton.setText(menuBarLocale.get("HideModules")); restoreHiddenModulesButton.setText(menuBarLocale.get("RestoreHiddenModules")); setTitle(menuBarLocale.get("DiagramOptions")); } catch (NullPointerException e) { logger.warn("Locale is not set properly."); } } public void setSelectedLayoutStrategyItem(ModuleLayoutsEnum item) { currentSettings.put("layoutStrategy", item); layoutStrategyOptions.setSelectedItem(localeService .getTranslatedString(item.toString())); } public void setSmartLinesButtonsToShow() { currentSettings.put("smartLines", true); smartLinesOptionMenu.setSelected(true); } public void setSmartLinesButtonsToDontShow() { currentSettings.put("smartLines", false); smartLinesOptionMenu.setSelected(false); } public void setViolationsButtonsToShow() { currentSettings.put("violations", true); showViolationsOptionMenu.setSelected(true); } public void setViolationsButtonsToDontShow() { currentSettings.put("violations", false); showViolationsOptionMenu.setSelected(false); } public void setZoomValue(int value) { zoomSlider.setValue(value); } public void showDialog() { setResizable(false); setAlwaysOnTop(false); setSize(totalWidth, totalHeight); ServiceProvider.getInstance().getControlService().centerDialog(this); setVisible(true); } public void turnOff() { for (JComponent element : interfaceElements) element.setEnabled(false); } public void turnOn() { for (JComponent element : interfaceElements) element.setEnabled(true); } public void hideDependencyToggle() { dependencyPanel.setVisible(false); } }