/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.sgmodule.view;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import org.openflexo.FlexoCst;
import org.openflexo.foundation.DataModification;
import org.openflexo.foundation.FlexoEditor;
import org.openflexo.foundation.FlexoModelObject;
import org.openflexo.foundation.FlexoObservable;
import org.openflexo.foundation.FlexoObserver;
import org.openflexo.foundation.ObjectDeleted;
import org.openflexo.foundation.action.FlexoActionSource;
import org.openflexo.foundation.cg.dm.CGRepositoryConnected;
import org.openflexo.foundation.cg.dm.CGRepositoryDisconnected;
import org.openflexo.foundation.cg.dm.LogAdded;
import org.openflexo.foundation.sg.SourceRepository;
import org.openflexo.generator.action.GenerateSourceCode;
import org.openflexo.generator.action.SynchronizeRepositoryCodeGeneration;
import org.openflexo.generator.action.WriteModifiedGeneratedFiles;
import org.openflexo.icon.GeneratorIconLibrary;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.sgmodule.SGCst;
import org.openflexo.sgmodule.controller.SGController;
import org.openflexo.swing.FlexoFileChooser;
import org.openflexo.swing.JConsole;
import org.openflexo.toolbox.LogListener;
import org.openflexo.toolbox.ToolBox;
import org.openflexo.view.ModuleView;
import org.openflexo.view.controller.model.FlexoPerspective;
import org.openflexo.view.listener.FlexoActionButton;
/**
*
* @author sylvain
*/
public class SourceRepositoryModuleView extends JPanel implements ModuleView<SourceRepository>, FlexoObserver, LogListener,
FlexoActionSource {
protected static final Logger logger = Logger.getLogger(SourceRepositoryModuleView.class.getPackage().getName());
protected SGController controller;
protected SourceRepository sourceRepository;
protected JLabel generationPath;
private ConsolePanel consolePanel;
protected JConsole console;
private boolean listenerAdded = false;
protected JButton chooseFileButton;
protected JButton chooseReaderFileButton;
protected JButton chooseWarLocationButton;
protected JButton generateButton;
protected JButton warButton;
public class ConsolePanel extends JPanel {
protected JButton clearButton;
public ConsolePanel(JConsole console) {
super(new BorderLayout());
JPanel north = new JPanel(new FlowLayout(FlowLayout.RIGHT));
clearButton = new JButton(GeneratorIconLibrary.CANCEL_ICON);
clearButton.setText(FlexoLocalization.localizedForKey("clear", clearButton));
clearButton.setToolTipText(FlexoLocalization.localizedForKey("clear_console"));
clearButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SourceRepositoryModuleView.this.console.clear();
}
});
north.add(clearButton);
north.validate();
add(console, BorderLayout.CENTER);
add(north, BorderLayout.NORTH);
validate();
}
}
/**
* @param _process
*
*/
public SourceRepositoryModuleView(SourceRepository repository, SGController ctrl) {
super(new BorderLayout());
sourceRepository = repository;
repository.addObserver(this);
this.controller = ctrl;
/* JPanel firstPanel = new JPanel(new FlowLayout());
chooseFileButton = new GeneratorButton(new ImageIconResource("Resources/backup.gif"));
chooseFileButton.setText(sourceRepository.getDirectory()!=null?sourceRepository.getDirectory().getAbsolutePath():FlexoLocalization.localizedForKey("undefined"));
chooseFileButton.setPreferredSize(new Dimension(400,80));
chooseFileButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
FlexoFileChooser fileChooser = new FlexoFileChooser(SwingUtilities.getWindowAncestor(chooseFileButton));
fileChooser.setCurrentDirectory(sourceRepository.getDirectory());
fileChooser.setDialogType(JFileChooser.CUSTOM_DIALOG);
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
controller.dismountWindowsOnTop(null);
int returnVal = fileChooser.showDialog(FlexoLocalization.localizedForKey("select"));
if(returnVal == JFileChooser.APPROVE_OPTION) {
sourceRepository.setDirectory(fileChooser.getSelectedFile());
}
controller.remountWindowsOnTop();
}
});
firstPanel.add(chooseFileButton);
generateButton = new GeneratorButton(new ImageIconResource("Resources/wolips.gif"));
generateButton.setText(FlexoLocalization.localizedForKey("generateButton", generateButton));
generateButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
if (SynchronizeRepositoryCodeGeneration.actionType.isEnabled(sourceRepository, null,controller.getEditor())) {
SynchronizeRepositoryCodeGeneration action = SynchronizeRepositoryCodeGeneration.actionType.makeNewAction(sourceRepository, null,controller.getEditor());
action.doAction();
} else
warButton.setEnabled(false);
}
});
firstPanel.add(generateButton);
chooseFileButton.setEnabled(repository.isEnabled());
generateButton.setEnabled(SynchronizeRepositoryCodeGeneration.actionType.isEnabled(repository,null,controller.getEditor()));
*/
console = new JConsole();
if (controller.getProjectGenerator(sourceRepository) != null) {
controller.getProjectGenerator(sourceRepository).addToLogListeners(this);
listenerAdded = true;
}
if (sourceRepository.isEnabled()) {
// console.setText(controller.getProjectGenerator(codeRepository).getLogs().toString());
} else if (console != null) {
console.clear();
console.log(FlexoLocalization.localizedForKey("repository_disconnected"), Color.BLUE);
}
console.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
console.setFont(FlexoCst.CODE_FONT);
console.setForeground(Color.DARK_GRAY);
console.setEditable(false);
// add(firstPanel,BorderLayout.NORTH);
// add(new JScrollPane(console),BorderLayout.CENTER);
add(new ViewHeader(), BorderLayout.NORTH);
if (console != null) {
consolePanel = new ConsolePanel(console);
add(consolePanel, BorderLayout.CENTER);
}
validate();
// repaint();
}
private class GeneratorButton extends JButton {
public GeneratorButton(Icon icon) {
super(icon);
if (ToolBox.getPLATFORM() == ToolBox.MACOS) {
setBorder(BorderFactory.createEtchedBorder());
setBackground(Color.WHITE);
}
setHorizontalTextPosition(SwingConstants.CENTER);
setVerticalTextPosition(SwingConstants.BOTTOM);
setPreferredSize(new Dimension(100, 80));
}
@Override
public void setText(String text) {
if (text == null) {
super.setText("Select a file");
} else {
super.setText(text);
}
}
/*public void setEnabled(boolean aBoolean)
{
super.setEnabled(aBoolean);
setForeground(aBoolean?Color.BLACK:Color.GRAY);
}*/
}
/**
* Overrides getPerspective
*
* @see org.openflexo.view.ModuleView#getPerspective()
*/
@Override
public FlexoPerspective getPerspective() {
return controller.CODE_GENERATION_PERSPECTIVE;
}
@Override
public void update(FlexoObservable observable, DataModification dataModification) {
if (observable == sourceRepository /*|| observable == sourceRepository.getReaderRepository()*/) {
if (dataModification instanceof ObjectDeleted) {
deleteModuleView();
return;
}
if (dataModification.propertyName() != null && dataModification.propertyName().equals("warDirectory")) {
// chooseWarLocationButton.setText(sourceRepository.getWarDirectory()!=null?sourceRepository.getWarDirectory().getAbsolutePath():FlexoLocalization.localizedForKey("undefined"));
} else if (dataModification.propertyName() != null && dataModification.propertyName().equals("directory")) {
chooseFileButton.setText(sourceRepository.getDirectory() != null ? sourceRepository.getDirectory().getAbsolutePath()
: FlexoLocalization.localizedForKey("undefined"));
} else if (dataModification instanceof LogAdded) {
// console.setText(controller.getProjectGenerator(codeRepository).getLogs().toString());
} else if (dataModification instanceof CGRepositoryConnected) {
if (sourceRepository.isEnabled()) {
if (!listenerAdded) {
controller.getProjectGenerator(sourceRepository).addToLogListeners(this);
listenerAdded = true;
}
console.log(FlexoLocalization.localizedForKey("repository_connected"), Color.BLUE);
}
} else if (dataModification instanceof CGRepositoryDisconnected) {
if (!sourceRepository.isEnabled()) {
if (listenerAdded) {
controller.getProjectGenerator(sourceRepository).removeFromLogListeners(this);
listenerAdded = false;
}
console.log(FlexoLocalization.localizedForKey("repository_disconnected"), Color.BLUE);
}
}
}
// generateButton.setEnabled(SynchronizeRepositoryCodeGeneration.actionType.isEnabled(sourceRepository,null,controller.getEditor()));
// warButton.setEnabled(GenerateWAR.actionType.isEnabled(codeRepository, null,_controller));
}
/**
* Overrides getRepresentedObject
*
* @see org.openflexo.view.ModuleView#getRepresentedObject()
*/
@Override
public SourceRepository getRepresentedObject() {
return sourceRepository;
}
/**
* Overrides delete
*
* @see org.openflexo.view.ModuleView#deleteModuleView()
*/
@Override
public void deleteModuleView() {
controller.removeModuleView(this);
sourceRepository.deleteObserver(this);
}
/**
* Overrides willShow
*
* @see org.openflexo.view.ModuleView#willShow()
*/
@Override
public void willShow() {
}
/**
* Overrides willHide
*
* @see org.openflexo.view.ModuleView#willHide()
*/
@Override
public void willHide() {
}
/**
* Returns flag indicating if this view is itself responsible for scroll management When not, Flexo will manage it's own scrollbar for
* you
*
* @return
*/
@Override
public boolean isAutoscrolled() {
return true;
}
public JConsole getConsole() {
return console;
}
@Override
public void err(String line) {
console.log(line, Color.RED);
}
@Override
public void warn(String line) {
console.log(line, Color.ORANGE);
}
@Override
public void log(String line) {
console.log(line, Color.BLACK);
}
@Override
public FlexoModelObject getFocusedObject() {
return getRepresentedObject();
}
@Override
public Vector getGlobalSelection() {
return null;
}
@Override
public FlexoEditor getEditor() {
return controller.getEditor();
}
protected class ViewHeader extends JPanel {
JButton chooseFileButton;
JLabel title;
JLabel subTitle;
JLabel subTitle2;
JPanel controlPanel;
Vector<FlexoActionButton> actionButtons = new Vector<FlexoActionButton>();
protected ViewHeader() {
super(new BorderLayout());
chooseFileButton = new JButton(GeneratorIconLibrary.BACKUP_ICON);
chooseFileButton.setBorder(BorderFactory.createEmptyBorder());
chooseFileButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
FlexoFileChooser fileChooser = new FlexoFileChooser(SwingUtilities.getWindowAncestor(chooseFileButton));
fileChooser.setCurrentDirectory(sourceRepository.getDirectory());
fileChooser.setDialogType(JFileChooser.CUSTOM_DIALOG);
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fileChooser.showDialog(FlexoLocalization.localizedForKey("select"));
if (returnVal == JFileChooser.APPROVE_OPTION) {
sourceRepository.setDirectory(fileChooser.getSelectedFile());
}
}
});
/*icon = new JLabel(IconLibrary.BIG_SOURCE_REPOSITORY_ICON);
icon.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
add(icon,BorderLayout.WEST);*/
add(chooseFileButton, BorderLayout.WEST);
title = new JLabel(FlexoLocalization.localizedForKey("source_repository") + " " + getRepresentedObject().getName(),
SwingConstants.LEFT);
// title.setVerticalAlignment(JLabel.BOTTOM);
title.setFont(SGCst.HEADER_FONT);
title.setForeground(Color.BLACK);
title.setBorder(BorderFactory.createEmptyBorder(5, 10, 0, 10));
subTitle = new JLabel(getRepresentedObject().getDirectory().getAbsolutePath(), SwingConstants.LEFT);
// title.setVerticalAlignment(JLabel.BOTTOM);
subTitle.setFont(SGCst.SUB_TITLE_FONT);
subTitle.setForeground(Color.GRAY);
subTitle.setBorder(BorderFactory.createEmptyBorder(0, 10, 5, 10));
subTitle2 = new JLabel(FlexoLocalization.localizedForKey("implementation_model") + ": "
+ getRepresentedObject().getImplementationModel().getName(), SwingConstants.LEFT);
// title.setVerticalAlignment(JLabel.BOTTOM);
subTitle2.setFont(SGCst.NORMAL_FONT);
subTitle2.setForeground(Color.BLACK);
subTitle2.setBorder(BorderFactory.createEmptyBorder(0, 10, 5, 10));
JPanel labelsPanel = new JPanel(new GridLayout(3, 1));
labelsPanel.add(title);
labelsPanel.add(subTitle2);
labelsPanel.add(subTitle);
add(labelsPanel, BorderLayout.CENTER);
controlPanel = new JPanel(new FlowLayout());
FlexoActionButton synchronizeAction = new FlexoActionButton(SynchronizeRepositoryCodeGeneration.actionType, "synchronize",
SourceRepositoryModuleView.this, controller);
FlexoActionButton generateAction = new FlexoActionButton(GenerateSourceCode.actionType, "generate",
SourceRepositoryModuleView.this, controller);
FlexoActionButton writeAction = new FlexoActionButton(WriteModifiedGeneratedFiles.actionType, "write_files",
SourceRepositoryModuleView.this, controller);
actionButtons.add(synchronizeAction);
actionButtons.add(generateAction);
actionButtons.add(writeAction);
controlPanel.add(synchronizeAction);
controlPanel.add(generateAction);
controlPanel.add(writeAction);
controlPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
add(controlPanel, BorderLayout.EAST);
update();
}
protected void update() {
title.setText(FlexoLocalization.localizedForKey("source_repository") + " " + getRepresentedObject().getName());
subTitle.setText(getRepresentedObject().getDirectory().getAbsolutePath());
subTitle2.setText(FlexoLocalization.localizedForKey("implementation_model") + " "
+ getRepresentedObject().getImplementationModel().getName());
for (FlexoActionButton button : actionButtons) {
button.update();
}
}
}
}