/******************************************************************************
* Copyright: GPL v3 *
* *
* This program 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. *
* *
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>. *
******************************************************************************/
package dba.gui.auxClasses.toolBars;
import dba.gui.auxClasses.GuiLogic;
import dba.gui.auxClasses.RelationDetailsView;
import dba.gui.auxClasses.RelationView;
import dba.gui.auxClasses.feedback.FeedbackbarPanel;
import dba.gui.auxClasses.jGraph.JGraphView;
import dba.options.FeedbackEnum;
import dba.utils.GetIcons;
import dba.utils.Localization;
import dbaCore.data.TimeLine;
import dbaCore.data.events.ChangeListener;
import dbaCore.data.events.Time;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.Observable;
import java.util.Observer;
/**
* Class which extends JToolBar and implements Observer. Listens to
* zoom changes from JGraph Panel
*
* @author Andreas Freitag
*/
public class ToolBar extends JToolBar implements Observer {
GetIcons getIcons;
Localization locale;
private static final long serialVersionUID = -4014383640978265021L;
private GuiLogic guiLogic;
private RelationView relationView;
private RelationDetailsView relationDetailView;
private JButton btnUndo;
private JButton btnRedo;
private JComboBox<String> cmbZoom;
private boolean allowCmbZoom;
private FeedbackbarPanel feedbackbarPanel;
/**
* Defaultconstructor to create Toolbar
*/
public ToolBar(RelationView relView, RelationDetailsView relDetailView, GuiLogic logic) {
super();
feedbackbarPanel = FeedbackbarPanel.getInstance();
guiLogic = logic;
getIcons = GetIcons.getInstance();
locale = Localization.getInstance();
relationView = relView;
relationDetailView = relDetailView;
allowCmbZoom = true;
setLayout(new FlowLayout(FlowLayout.LEFT));
TimeLine.getInstance().addChangeListener(new ChangeListener() {
@Override
public void Change(dbaCore.data.events.Change change) {
if (change.getTime() == Time.AFTERCHANGE) {
btnUndo.setEnabled(TimeLine.getInstance().getBackwardPossible());
btnRedo.setEnabled(TimeLine.getInstance().getForwardPossible());
}
}
});
JButton btnNew = new JButton(getIcons.getTbNew());
JButton btnOpen = new JButton(getIcons.getTbOpen());
JButton btnSave = new JButton(getIcons.getTbSave());
btnUndo = new JButton(getIcons.getTbUndo());
btnRedo = new JButton(getIcons.getTbRedo());
cmbZoom = new JComboBox<>(relationView.getZoomFactors());
btnNew.setToolTipText(locale.getString("GUI_New"));
btnOpen.setToolTipText(locale.getString("GUI_Open"));
btnSave.setToolTipText(locale.getString("GUI_Save"));
btnUndo.setToolTipText(locale.getString("GUI_Undo"));
btnRedo.setToolTipText(locale.getString("GUI_Redo"));
cmbZoom.setToolTipText(locale.getString("GUI_ZoomFactor"));
cmbZoom.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 16));
cmbZoom.setPreferredSize(new Dimension(88, 29));
cmbZoom.setEditable(true);
((JTextField)cmbZoom.getEditor().getEditorComponent()).setHorizontalAlignment(JTextField.CENTER);
cmbZoom.getEditor().getEditorComponent().addFocusListener(
new FocusListener(){
public void focusGained(FocusEvent arg0) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
((JTextField) cmbZoom.getEditor().getEditorComponent()).selectAll();
}
});
}
public void focusLost(FocusEvent arg0) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
((JTextField) cmbZoom.getEditor().getEditorComponent()).setCaretPosition(0);
}
});
}
});
relationView.addObserver(this);
relationDetailView.addObserver(this);
btnNew.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
FeedbackEnum returnVal = guiLogic.newDatabase();
if (returnVal == FeedbackEnum.SUCCESSFUL) {
feedbackbarPanel.showFeedback(locale.getString("FB_NewDB"), FeedbackEnum.SUCCESSFUL);
}
}
});
btnOpen.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
FeedbackEnum returnVal = guiLogic.open();
if (returnVal == FeedbackEnum.FAILED) {
feedbackbarPanel.showFeedback(locale.getString("FB_OpenFailed"), FeedbackEnum.FAILED);
}
}
});
btnSave.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
FeedbackEnum returnVal = guiLogic.save();
if (returnVal == FeedbackEnum.SUCCESSFUL) {
feedbackbarPanel.showFeedback(locale.getString("FB_Save"), FeedbackEnum.SUCCESSFUL);
} else if (returnVal == FeedbackEnum.FAILED) {
feedbackbarPanel.showFeedback(locale.getString("FB_SaveFailed"), FeedbackEnum.FAILED);
}
}
});
btnUndo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
guiLogic.undo();
}
});
btnRedo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
guiLogic.redo();
}
});
cmbZoom.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (allowCmbZoom) {
relationView.zoom((String) cmbZoom.getSelectedItem());
relationDetailView.zoom((String) cmbZoom.getSelectedItem());
}
}
});
add(btnNew);
add(btnOpen);
add(btnSave);
add(btnUndo);
add(btnRedo);
add(cmbZoom);
setFloatable(false);
}
public void updateZoom(Object observable) {
if (observable instanceof JGraphView) {
updateComboZoom(((JGraphView) observable).getZoomFactors());
}
}
/**
* Updates the selectable zoom-factors
*/
private void updateComboZoom(String[] zoomFactors) {
allowCmbZoom = false;
cmbZoom.removeAllItems();
for (String zoomFactor : zoomFactors) {
cmbZoom.addItem(zoomFactor);
}
allowCmbZoom = true;
}
@Override
public void update(Observable arg0, Object arg1) {
if (arg1 != null) {
updateZoom(arg1);
}
}
}