package husacct.graphics.presentation; import javax.swing.JInternalFrame; import javax.swing.SwingWorker; import husacct.common.enums.DependencyTypeOption; import org.apache.log4j.Logger; import husacct.ServiceProvider; import husacct.analyse.IAnalyseService; import husacct.common.dto.DependencyDTO; import husacct.common.dto.RuleDTO; import husacct.common.dto.UmlLinkDTO; import husacct.common.dto.ViolationDTO; import husacct.common.locale.ILocaleService; import husacct.common.services.IServiceListener; import husacct.define.IDefineService; import husacct.graphics.domain.DrawingView; import husacct.graphics.domain.figures.BaseFigure; import husacct.graphics.task.DrawingController; import husacct.graphics.task.DrawingSettingsHolder; import husacct.graphics.task.DrawingTypesEnum; import husacct.graphics.task.modulelayout.ModuleLayoutsEnum; import husacct.validate.IValidateService; public class GraphicsPresentationController implements UserInputListener{ private DrawingTypesEnum drawingType; private DrawingController drawingController; private DrawingSettingsHolder drawingsSettingsHolder; private DrawingView drawingView; private GraphicsFrame graphicsFrame; private IAnalyseService analyseService; private IDefineService defineService; private ILocaleService localeService; private IValidateService validateService; private Logger logger = Logger.getLogger(GraphicsPresentationController.class); public GraphicsPresentationController(DrawingTypesEnum typeOfDrawing) { try { this.drawingType = typeOfDrawing; drawingController = DrawingController.getController(drawingType); if (drawingController == null) { logger.error(" Exception: DrawingController not initialized"); } else { drawingsSettingsHolder = drawingController.getDrawingSettingsHolder(); drawingView = drawingController.getDrawingView(); drawingView.addListener(this); if (ServiceProvider.getInstance().getControlService().isGuiEnabled()) { graphicsFrame = new GraphicsFrame(this); loadDefaultSettings(); } } if (ServiceProvider.getInstance().getControlService().isGuiEnabled()) { initializeServices(); } } catch(Exception e) { logger.error(" Exception: " + e.getMessage()); e.printStackTrace(); } } private void initializeServices() { try { analyseService = ServiceProvider.getInstance().getAnalyseService(); analyseService.addServiceListener(new IServiceListener() { @Override public void update() { GraphicsPresentationController.this.graphicsFrame.showOutOfDateWarning(); //GraphicsPresentationController.this.drawArchitectureTopLevel(); } }); defineService = ServiceProvider.getInstance().getDefineService(); defineService.addServiceListener(new IServiceListener() { @Override public void update() { if (GraphicsPresentationController.this.drawingType == DrawingTypesEnum.INTENDED_ARCHITECTURE) { GraphicsPresentationController.this.graphicsFrame.showOutOfDateWarning(); } } }); localeService = ServiceProvider.getInstance().getLocaleService(); localeService.addServiceListener(new IServiceListener() { @Override public void update() { // In case language is changed in central Options dialogue. GraphicsPresentationController.this.graphicsFrame.refreshFrame(); } }); this.validateService = ServiceProvider.getInstance().getValidateService(); this.validateService.addServiceListener(new IServiceListener() { @Override public void update() { if (GraphicsPresentationController.this.drawingsSettingsHolder.areViolationsShown()) { GraphicsPresentationController.this.graphicsFrame.showOutOfDateWarning(); //GraphicsPresentationController.this.refreshDrawing(); } } }); } catch(Exception e) { logger.error(" Exception: " + e.getMessage()); } } // Main services interacting with DrawingController // Creates a drawing of the top-level modules of the architecture public void drawArchitectureTopLevel() { if (drawingView != null) { graphicsFrame.attachDrawingViewAndShowDrawing(drawingView); executeDrawingTask("drawArchitectureTopLevel", new String[] {}); } } /* * Detaches drawingView from the presentation, creates a new drawing, and attaches drawingView afterwards. * SwingWorker is used to create separate threads for the drawing tasks. * DrawingView, including a drawing, is detached and attached to prevent thread synchronization problems. */ private void executeDrawingTask(String drawingTask, String[] paths) { if (drawingView != null) { // Needed to prevent synchronization problems, e.g. after an update of an analyse, define, or validate task. try { graphicsFrame.detachDrawingViewAndShowLoadingScreen(); drawingView = null; SwingWorker<DrawingView, Void> worker = new SwingWorker<DrawingView, Void>() { @Override public DrawingView doInBackground() { switch (drawingTask) { case "drawArchitectureTopLevel": drawingView = drawingController.drawArchitectureTopLevel(); break; case "moduleOpen": drawingView = drawingController.moduleOpen(paths); break; case "refreshDrawing": drawingView = drawingController.refreshDrawing(); break; case "zoomIn": drawingView = drawingController.zoomIn(); break; case "zoomOut": drawingView = drawingController.zoomOut(); break; default: drawingView = drawingController.refreshDrawing(); break; } return drawingView; } @Override public void done() { try { drawingView = get(); graphicsFrame.attachDrawingViewAndShowDrawing(drawingView); } catch (InterruptedException ignore) {} catch (java.util.concurrent.ExecutionException e) { logger.error(" Exception: " + e.getMessage()); } } }; worker.execute(); } catch(Exception e) { logger.error(" Exception: " + e.getMessage()); } } } // Creates a drawing of the contents of the selected path (in the GraphicsLocationBar). @Override public void moduleOpen(String[] paths) { executeDrawingTask("moduleOpen", paths); } // Updates the drawing to reflect the current settings and/or changes within analyse/define/validate. @Override public void refreshDrawing(){ executeDrawingTask("refreshDrawing", new String[] {}); } // Zooms-in on one or several selected modules. DrawingView knows which modules are selected. @Override public void zoomIn() { executeDrawingTask("zoomIn", new String[] {}); } // Zooms-out @Override public void zoomOut() { executeDrawingTask("zoomOut", new String[] {}); } // Other methods and services public boolean areDependenciesShown() { return drawingsSettingsHolder.areDependenciesShown(); } public boolean areSmartLinesOn() { return drawingsSettingsHolder.areSmartLinesOn(); } public boolean areViolationsShown() { return drawingsSettingsHolder.areViolationsShown(); } public boolean areExternalLibrariesShown() { return drawingsSettingsHolder.areExternalLibrariesShown(); } public boolean areLinesThick(){ return drawingsSettingsHolder.areLinesProportionalWide(); } @Override public void dependenciesHide() { if (drawingsSettingsHolder.areDependenciesShown()) { drawingsSettingsHolder.dependenciesHide(); graphicsFrame.getGraphicsMenuBar().setDependeciesButtonToDontShow(); } } @Override public void dependenciesShow() { if (!drawingsSettingsHolder.areDependenciesShown()) { drawingsSettingsHolder.dependenciesShow(); graphicsFrame.getGraphicsMenuBar().setDependeciesButtonsToShow(); } } @Override public void exportImage() { // To do: move from drawingView to presentation or control class drawingView.getDrawingHusacct().showExportToImagePanel(); } public String[] getCurrentPaths() { return drawingsSettingsHolder.getCurrentPaths(); } public JInternalFrame getGraphicsFrame() { return graphicsFrame; } public ModuleLayoutsEnum getLayoutStrategy() { return drawingController.getLayoutStrategy(); } @Override public void layoutStrategyChange(ModuleLayoutsEnum selectedStrategyEnum) { drawingController.layoutStrategyChange(selectedStrategyEnum); } private void loadDefaultSettings() { drawingsSettingsHolder.dependenciesShow(); graphicsFrame.getGraphicsMenuBar().setDependeciesButtonsToShow(); drawingsSettingsHolder.librariesHide(); // Initializes in GraphicsOptionsDialogue with this setting. drawingsSettingsHolder.proportionalLinesDisable(); drawingsSettingsHolder.smartLinesEnable(); graphicsFrame.turnOnSmartLines(); drawingsSettingsHolder.violationsHide(); graphicsFrame.setViolationsButtonsToDontShow(); graphicsFrame.setSelectedLayout(drawingController.getLayoutStrategy()); } @Override public void librariesHide() { if (drawingsSettingsHolder.areExternalLibrariesShown()) { drawingsSettingsHolder.librariesHide(); } } @Override public void librariesShow() { if (!drawingsSettingsHolder.areExternalLibrariesShown()) { drawingsSettingsHolder.librariesShow(); } } @Override public void moduleHide() { drawingView.hideSelectedFigures(); } @Override public void moduleRestoreHiddenModules() { drawingView.restoreHiddenFigures(); } @Override public void proportionalLinesDisable() { if (drawingsSettingsHolder.areLinesProportionalWide()) { drawingsSettingsHolder.proportionalLinesDisable(); } } @Override public void proportionalLinesEnable() { if (!drawingsSettingsHolder.areLinesProportionalWide()) { drawingsSettingsHolder.proportionalLinesEnable(); } } @Override public void propertiesPaneHide(){ graphicsFrame.hideProperties(); } @Override public void propertiesPaneShowDependencies(BaseFigure selectedLine) { DependencyDTO[] dependencyDTOs = drawingController.getDependenciesOfLine(selectedLine); graphicsFrame.showDependenciesProperties(dependencyDTOs); } @Override public void propertiesPaneShowUmlLinks(BaseFigure selectedLine){ UmlLinkDTO[] umlLinkDTOs = drawingController.getUMLLinksOfLine(selectedLine); graphicsFrame.showUMLLinkProperties(umlLinkDTOs); } @Override public void propertiesPaneShowViolations(BaseFigure selectedLine) { ViolationDTO[] violationDTOs = drawingController.getViolationsOfLine(selectedLine); graphicsFrame.showViolationsProperties(violationDTOs); } @Override public void propertiesPaneShowRules(BaseFigure selectedFigure) { if (drawingType.equals(DrawingTypesEnum.MODULE_RULE_ARCHITECTURE)) { RuleDTO[] ruleDTOs = drawingController.getRulesOfFigure(selectedFigure); if(ruleDTOs.length > 0) graphicsFrame.showRulesProperties(ruleDTOs); else graphicsFrame.hideProperties(); } else graphicsFrame.hideProperties(); } @Override public void smartLinesDisable() { if (drawingsSettingsHolder.areSmartLinesOn()) { drawingsSettingsHolder.smartLinesDisable(); graphicsFrame.setSmartLinesButtonsToDontShow(); } } @Override public void smartLinesEnable() { if (!drawingsSettingsHolder.areSmartLinesOn()) { drawingsSettingsHolder.smartLinesEnable(); graphicsFrame.turnOnSmartLines(); } } @Override public void violationsHide() { if (drawingsSettingsHolder.areViolationsShown()) { drawingsSettingsHolder.violationsHide(); graphicsFrame.setViolationsButtonsToDontShow(); } } @Override public void violationsShow() { if (validateService.isValidated()) { if (!drawingsSettingsHolder.areViolationsShown()) { drawingsSettingsHolder.violationsShow(); graphicsFrame.setViolationsButtonsToShow(); } } else { drawingsSettingsHolder.violationsHide(); graphicsFrame.setViolationsButtonsToDontShow(); } } @Override public void usePanTool() { drawingView.usePanTool(); } @Override public void useSelectTool() { drawingView.useSelectTool(); } @Override public void zoomFactorChanged(double zoomFactor) { double scaleFactor = graphicsFrame.getGraphicsMenuBar().getScaleFactor(); //Needed in case the event is fired from DrawingView drawingController.zoomFactorChanged(scaleFactor); } @Override public void zoomSliderSetZoomFactor(double zoomFactor) { graphicsFrame.zoomSliderSetZoomFactor(zoomFactor); } @Override public void zoomTypeChange(String zoomType) { drawingsSettingsHolder.zoomTypeChange(zoomType); } public void dependencyTypeChange(DependencyTypeOption option){ drawingsSettingsHolder.setSelectedDependencyOption(option); refreshDrawing(); } public DrawingTypesEnum getDrawingType() { return drawingType; } }