/*
* (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.ie.view;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.TitledBorder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import org.openflexo.components.widget.ImageFileSelector;
import org.openflexo.foundation.FlexoEditor;
import org.openflexo.foundation.ie.action.ImportImage;
import org.openflexo.foundation.ie.cl.OperationComponentDefinition;
import org.openflexo.foundation.ie.menu.FlexoItemMenu;
import org.openflexo.foundation.rm.FlexoProject.ImageFile;
import org.openflexo.icon.SEIconLibrary;
import org.openflexo.ie.view.controller.IEController;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.swing.VerticalLayout;
import org.openflexo.view.controller.FlexoController;
/**
* @author gpolet Created on 8 sept. 2005
*/
public class FlexoMenuRootItemView extends FlexoMenuItemView {
protected static final Logger logger = Logger.getLogger(FlexoMenuRootItemView.class.getPackage().getName());
/**
* @param model
*/
public FlexoMenuRootItemView(FlexoItemMenu model, IEController ctrl) {
super(model, ctrl);
add(new GlobalMenuConfigurationPanel());
}
private class GlobalMenuConfigurationPanel extends JPanel {
JCheckBox useDefaultImage;
JFileChooser imageFileChooser;
ImageFileSelector choose;
JTable table;
JScrollPane scrollPane;
JButton addButton;
JButton removeButton;
JLabel image;
JComboBox profilePageList;
/**
*
*/
public GlobalMenuConfigurationPanel() {
super(new VerticalLayout());
initUI();
add(useDefaultImage);
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
panel.add(choose);
panel.add(image);
add(panel);
/*add(scrollPane);
panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
panel.add(addButton);
panel.add(removeButton);
add(panel);*/
TitledBorder b = BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder());
b.setTitle(FlexoLocalization.localizedForKey("global_menu", b));
setBorder(b);
}
private void initUI() {
image = new JLabel();
ImageFile logo = updateLogo();
useDefaultImage = new JCheckBox();
useDefaultImage.setText(FlexoLocalization.localizedForKey("use_default_image", useDefaultImage));
updateCheckbox();
useDefaultImage.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
_model.getNavigationMenu().setUseDefaultImage(useDefaultImage.isSelected());
choose.setEnabled(!useDefaultImage.isSelected());
}
});
TableModel dataModel = new AbstractTableModel() {
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
String s = _model.getNavigationMenu().getButtons();
if (s == null) {
return 0;
}
return s.split(";").length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex > 1) {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Attempt to obtain an object of a column that does not exist: " + columnIndex);
}
return null;
}
if (rowIndex < getRowCount()) {
if (columnIndex == 0) {
return _model.getNavigationMenu().getButtons().split(";")[rowIndex];
} else if (_model.getNavigationMenu().getActions() != null) {
return _model.getNavigationMenu().getActions().split(";")[rowIndex];
} else {
return null;
}
} else {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Attemp to obtain an object of row that does not exist: " + rowIndex);
}
return null;
}
}
};
table = new JTable(dataModel);
scrollPane = new JScrollPane(table);
choose = new ImageFileSelector(_model.getProject(), new ImageFileSelector.ImageImporter() {
@Override
public void importImage(ActionEvent e) {
FlexoEditor editor = FlexoMenuRootItemView.this.controller.getEditor();
ImportImage importImage = ImportImage.actionType.makeNewAction(_model.getProject(), null, editor);
editor.performAction(importImage, e);
}
}, logo, true) {
@Override
public void apply() {
_model.getNavigationMenu().setLogo(getEditedObject());
super.apply();
// TODO: refactor the whole view to use observers (mainly in super-class)
updateLogo();
updateChooserPreferredSize();
}
};
choose.setEnabled(!_model.getNavigationMenu().getUseDefaultImage());
updateChooserPreferredSize();
addButton = new JButton("+");
addButton.setToolTipText(FlexoLocalization.localizedForKey("add_a_button"));
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String s = FlexoController.askForString(FlexoLocalization.localizedForKey("enter_new_button_name"));
if (s == null || s.trim().equals("")) {
return;
} else {
Object[] possibilities = new String[FlexoMenuRootItemView.this._model.getProject().getFlexoComponentLibrary()
.getOperationsComponentList().size()];
Enumeration en = FlexoMenuRootItemView.this._model.getProject().getFlexoComponentLibrary()
.getOperationsComponentList().elements();
int i = 0;
while (en.hasMoreElements()) {
OperationComponentDefinition element = (OperationComponentDefinition) en.nextElement();
possibilities[i++] = element.getComponentName();
}
String da = (String) JOptionPane.showInputDialog(GlobalMenuConfigurationPanel.this,
FlexoLocalization.localizedForKey("choose_a_direct_action"),
FlexoLocalization.localizedForKey("choose_a_direct_action"), JOptionPane.PLAIN_MESSAGE, null,
possibilities, null);
if (da == null) {
da = " ";
}
String b = _model.getNavigationMenu().getButtons();
if (b == null || b.trim().equals("")) {
b = s;
} else {
b += ";" + s;
}
_model.getNavigationMenu().setButtons(b);
b = _model.getNavigationMenu().getActions();
if (b == null || b.trim().equals("")) {
b = da;
} else {
b += ";" + da;
}
_model.getNavigationMenu().setActions(b);
table.revalidate();
table.repaint();
}
}
});
removeButton = new JButton("-");
removeButton.setToolTipText(FlexoLocalization.localizedForKey("remove_a_button"));
removeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (_model.getNavigationMenu().getButtons() == null) {
return;
}
int[] rows = table.getSelectedRows();
String[] s = _model.getNavigationMenu().getButtons().split(";");
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length; i++) {
int j;
for (j = 0; j < rows.length; j++) {
if (rows[j] == i) {
break;
}
}
if (j == rows.length) {
sb.append(s[i]);
if (i + 1 != s.length) {
sb.append(';');
}
}
}
_model.getNavigationMenu().setButtons(sb.toString());
s = _model.getNavigationMenu().getActions().split(";");
sb = new StringBuffer();
for (int i = 0; i < s.length; i++) {
int j;
for (j = 0; j < rows.length; j++) {
if (rows[j] == i) {
break;
}
}
if (j == rows.length) {
sb.append(s[i]);
if (i + 1 != s.length) {
sb.append(';');
}
}
}
_model.getNavigationMenu().setActions(sb.toString());
table.repaint();
}
});
}
/**
*
*/
private void updateCheckbox() {
useDefaultImage.setSelected(_model.getNavigationMenu().getUseDefaultImage());
}
/**
* @return
*/
protected ImageFile updateLogo() {
ImageFile logo = _model.getNavigationMenu().getLogo();
if (logo == null || logo.getImageFile() == null) {
image.setIcon(SEIconLibrary.NO_IMAGE);
} else {
ImageIcon icon = new ImageIcon(logo.getImageFile().getAbsolutePath());
image.setIcon(icon);
}
return logo;
}
/**
*
*/
protected void updateChooserPreferredSize() {
if (choose.getEditedObject() == null) {
choose.getTextField().setPreferredSize(new Dimension(100, 20));
} else {
choose.getTextField().setPreferredSize(null);
}
}
}
}