/*
* (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.cgmodule.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.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.cgmodule.controller.GeneratorController;
import org.openflexo.foundation.DataModification;
import org.openflexo.foundation.FlexoObservable;
import org.openflexo.foundation.FlexoObserver;
import org.openflexo.foundation.ObjectDeleted;
import org.openflexo.foundation.cg.CGRepository;
import org.openflexo.foundation.cg.dm.CGRepositoryConnected;
import org.openflexo.foundation.cg.dm.CGRepositoryDisconnected;
import org.openflexo.foundation.cg.dm.LogAdded;
import org.openflexo.generator.action.GenerateWAR;
import org.openflexo.generator.action.SynchronizeRepositoryCodeGeneration;
import org.openflexo.icon.GeneratorIconLibrary;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.swing.FlexoFileChooser;
import org.openflexo.swing.JConsole;
import org.openflexo.swing.JConsoleOutputStream;
import org.openflexo.toolbox.LogListener;
import org.openflexo.toolbox.ToolBox;
import org.openflexo.view.ModuleView;
import org.openflexo.view.controller.model.FlexoPerspective;
/**
*
* @author sylvain
*/
public class CGRepositoryModuleView extends JPanel implements ModuleView<CGRepository>, FlexoObserver, LogListener {
protected static final Logger logger = Logger.getLogger(CGRepositoryModuleView.class.getPackage().getName());
protected GeneratorController controller;
protected CGRepository codeRepository;
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) {
CGRepositoryModuleView.this.console.clear();
}
});
north.add(clearButton);
north.validate();
add(console, BorderLayout.CENTER);
add(north, BorderLayout.NORTH);
validate();
}
}
/**
* @param _process
*
*/
public CGRepositoryModuleView(CGRepository repository, GeneratorController ctrl) {
super(new BorderLayout());
codeRepository = repository;
repository.addObserver(this);
this.controller = ctrl;
JPanel bigButtonsPanel = new JPanel(new GridLayout(repository.includeReader() ? 3 : 2, 1));
JPanel firstPanel = new JPanel(new FlowLayout());
chooseFileButton = new GeneratorButton(GeneratorIconLibrary.BACKUP_ICON);
chooseFileButton.setText(codeRepository.getDirectory() != null ? codeRepository.getDirectory().getAbsolutePath()
: FlexoLocalization.localizedForKey("undefined"));
chooseFileButton.setPreferredSize(new Dimension(400, 80));
chooseFileButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
FlexoFileChooser fileChooser = new FlexoFileChooser(SwingUtilities.getWindowAncestor(chooseFileButton));
fileChooser.setCurrentDirectory(codeRepository.getDirectory());
fileChooser.setDialogType(JFileChooser.CUSTOM_DIALOG);
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fileChooser.showDialog(FlexoLocalization.localizedForKey("select"));
if (returnVal == JFileChooser.APPROVE_OPTION) {
codeRepository.setDirectory(fileChooser.getSelectedFile());
}
}
});
firstPanel.add(chooseFileButton);
generateButton = new GeneratorButton(GeneratorIconLibrary.WOLIPS_ICON);
generateButton.setText(FlexoLocalization.localizedForKey("generateButton", generateButton));
generateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (SynchronizeRepositoryCodeGeneration.actionType.isEnabled(codeRepository, null)) {
SynchronizeRepositoryCodeGeneration action = SynchronizeRepositoryCodeGeneration.actionType.makeNewAction(
codeRepository, null, controller.getEditor());
action.doAction();
} else {
warButton.setEnabled(false);
}
}
});
firstPanel.add(generateButton);
bigButtonsPanel.add(firstPanel);
JPanel secondPanel = new JPanel(new FlowLayout());
chooseWarLocationButton = new GeneratorButton(GeneratorIconLibrary.BACKUP_ICON);
chooseWarLocationButton.setText(codeRepository.getWarDirectory() != null ? codeRepository.getWarDirectory().getAbsolutePath()
: FlexoLocalization.localizedForKey("undefined"));
chooseWarLocationButton.setPreferredSize(new Dimension(400, 80));
chooseWarLocationButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
FlexoFileChooser fileChooser = new FlexoFileChooser(SwingUtilities.getWindowAncestor(warButton));
fileChooser.setCurrentDirectory(codeRepository.getWarDirectory());
fileChooser.setDialogType(JFileChooser.CUSTOM_DIALOG);
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fileChooser.showDialog(FlexoLocalization.localizedForKey("select"));
if (returnVal == JFileChooser.APPROVE_OPTION) {
codeRepository.setWarDirectory(fileChooser.getSelectedFile());
}
}
});
secondPanel.add(chooseWarLocationButton);
warButton = new GeneratorButton(GeneratorIconLibrary.TOMCAT_ICON);
warButton.setText(FlexoLocalization.localizedForKey("generateWarButton", warButton));
warButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (GenerateWAR.actionType.isEnabled(codeRepository, null)) {
GenerateWAR action = GenerateWAR.actionType.makeNewAction(codeRepository, null, controller.getEditor());
action.setCustomErrStream(new JConsoleOutputStream(console, Color.RED));
action.setCustomOutStream(new JConsoleOutputStream(console, Color.BLACK));
action.doAction();
} else {
warButton.setEnabled(false);
}
}
});
secondPanel.add(warButton);
bigButtonsPanel.add(secondPanel);
if (repository.includeReader()) {
chooseReaderFileButton = new GeneratorButton(GeneratorIconLibrary.BACKUP_ICON);
chooseReaderFileButton.setText(codeRepository.getReaderRepository().getDirectory() != null ? codeRepository
.getReaderRepository().getDirectory().getAbsolutePath() : FlexoLocalization.localizedForKey("undefined"));
chooseReaderFileButton.setPreferredSize(new Dimension(400, 80));
chooseReaderFileButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
FlexoFileChooser fileChooser = new FlexoFileChooser(SwingUtilities.getWindowAncestor(chooseReaderFileButton));
fileChooser.setCurrentDirectory(codeRepository.getReaderRepository().getDirectory());
fileChooser.setDialogType(JFileChooser.CUSTOM_DIALOG);
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int returnVal = fileChooser.showDialog(FlexoLocalization.localizedForKey("select"));
if (returnVal == JFileChooser.APPROVE_OPTION) {
codeRepository.getReaderRepository().setDirectory(fileChooser.getSelectedFile());
}
}
});
}
// chooseFileButton.setEnabled(repository.isEnabled());
// chooseWarLocationButton.setEnabled(repository.isEnabled());
console = new JConsole();
if (controller.getProjectGenerator(codeRepository) != null) {
controller.getProjectGenerator(codeRepository).addToLogListeners(this);
listenerAdded = true;
}
if (codeRepository.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(bigButtonsPanel, BorderLayout.NORTH);
// add(new JScrollPane(console),BorderLayout.CENTER);
if (console != null) {
consolePanel = new ConsolePanel(console);
add(consolePanel, BorderLayout.CENTER);
}
updateButtons();
revalidate();
// repaint();
}
private void updateButtons() {
generateButton.setEnabled(SynchronizeRepositoryCodeGeneration.actionType.isEnabled(codeRepository, null));
warButton.setEnabled(GenerateWAR.actionType.isEnabled(codeRepository, null));
}
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_GENERATOR_PERSPECTIVE;
}
@Override
public void update(final FlexoObservable observable, final DataModification dataModification) {
if (!SwingUtilities.isEventDispatchThread()) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
update(observable, dataModification);
}
});
return;
}
if (observable == codeRepository || observable == codeRepository.getReaderRepository()) {
if (observable == codeRepository && dataModification instanceof ObjectDeleted) {
deleteModuleView();
return;
}
if (dataModification.propertyName() != null && dataModification.propertyName().equals("warDirectory")) {
chooseWarLocationButton.setText(codeRepository.getWarDirectory() != null ? codeRepository.getWarDirectory()
.getAbsolutePath() : FlexoLocalization.localizedForKey("undefined"));
} else if (dataModification.propertyName() != null && dataModification.propertyName().equals("directory")) {
chooseFileButton.setText(codeRepository.getDirectory() != null ? codeRepository.getDirectory().getAbsolutePath()
: FlexoLocalization.localizedForKey("undefined"));
} else if (dataModification instanceof LogAdded) {
// console.setText(controller.getProjectGenerator(codeRepository).getLogs().toString());
} else if (dataModification instanceof CGRepositoryConnected) {
if (codeRepository.isEnabled()) {
if (!listenerAdded) {
controller.getProjectGenerator(codeRepository).addToLogListeners(this);
listenerAdded = true;
}
console.log(FlexoLocalization.localizedForKey("repository_connected"), Color.BLUE);
}
} else if (dataModification instanceof CGRepositoryDisconnected) {
if (!codeRepository.isEnabled()) {
if (listenerAdded) {
controller.getProjectGenerator(codeRepository).removeFromLogListeners(this);
listenerAdded = false;
}
console.log(FlexoLocalization.localizedForKey("repository_disconnected"), Color.BLUE);
}
}
}
updateButtons();
}
/**
* Overrides getRepresentedObject
*
* @see org.openflexo.view.ModuleView#getRepresentedObject()
*/
@Override
public CGRepository getRepresentedObject() {
return codeRepository;
}
/**
* Overrides delete
*
* @see org.openflexo.view.ModuleView#deleteModuleView()
*/
@Override
public void deleteModuleView() {
controller.removeModuleView(this);
codeRepository.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);
}
}