package com.opticalcobra.storybear.editor;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dialog.ModalityType;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.DateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import com.opticalcobra.storybear.db.Database;
import com.opticalcobra.storybear.main.User;
import com.opticalcobra.storybear.menu.Menu;
import com.opticalcobra.storybear.menu.MenuInnerPanel;
import com.opticalcobra.storybear.menu.Scrollbar;
import com.opticalcobra.storybear.res.FontCache;
import com.opticalcobra.storybear.res.Imagelib;
import com.opticalcobra.storybear.res.Ressources;
import com.opticalcobra.storybear.menu.TextButton;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.text.DateFormatter;
/**
*
* @author Nicolas
*
*/
public class Editor extends MenuInnerPanel {
public static final String EMPTY_TITLE = "<Titel steht hier>";
public static final String EMPTY_STORY = "<Hier Geschichte schreiben>";
public static final FileFilter filter = new FileNameExtensionFilter("StoryBear (.bear)", "bear");
private JLayeredPane baseLayerEditMode, baseLayerStart;
private JTextArea editorEditMode;
private WordSuggestor wordSuggEditMode;
private JTextField headlineEditMode;
private JLabel authorEditMode;
private JLabel dateEditMode;
private JScrollPane scrollpaneEditMode;
private JLabel authorStart, dateStart, titleStart;
private JList<Story> storyList;
private Database db;
private DefaultListModel<Story> storyListModel = new DefaultListModel<Story>();
private Story currentStory;
private Menu menu;
private TextButton renderButton;
private TextButton editButton;
/**
* start editor
*/
public Editor(Menu menu){
this.menu = menu;
db = new Database();
initializeEditMode();
initializeStart();
showStart();
setBounds(0, 0, Menu.innerPanel.width, Menu.innerPanel.height);
}
/**
* show StartPanel
*/
private void showStart() {
loadStories();
authorStart.setText("");
titleStart.setText("");
dateStart.setText("");
editButton.setEnabled(false);
renderButton.setEnabled(false);
baseLayerEditMode.setVisible(false);
baseLayerStart.setVisible(true);
}
/**
* show editor
*/
private void showEditMode() {
// set values
editorEditMode.setText(currentStory.getText());
headlineEditMode.setText(currentStory.getTitle());
authorEditMode.setText("Autor: " + currentStory.getAuthor().getName());
dateEditMode.setText("Datum: " + DateFormat.getDateInstance().format(currentStory.getChangeDate()));
editorEditMode.setForeground(Color.black);
headlineEditMode.setForeground(Color.black);
scrollpaneEditMode.setViewportView(editorEditMode);
wordSuggEditMode.startSuggestions();
// switch panels
baseLayerStart.setVisible(false);
baseLayerEditMode.setVisible(true);
}
/**
* update current story
*/
private Story updateCurrentStory() {
currentStory.setTitle(headlineEditMode.getText());
currentStory.setText(editorEditMode.getText());
currentStory.setChangeDate(new Date());
currentStory.setVersion(1); // TODO: ?
return currentStory;
}
/**
* load stories from database in list model
*/
private void loadStories() {
storyListModel.clear();
List<Story> stories = db.getAllStoriesFromDatabase();
Collections.sort(stories);
for(Story s : stories) {
storyListModel.addElement(s);
}
storyList.setModel(storyListModel);
}
/**
* initialize StartScreen
*/
private void initializeStart() {
baseLayerStart = new JLayeredPane();
baseLayerStart.setBounds(0, 0 ,Menu.innerPanel.width, Menu.innerPanel.height);
add(baseLayerStart);
baseLayerStart.add(addMenuHeadline("Editor", false));
baseLayerStart.add(addMenuHeadlineUnderlining(), false);
// Story-List
storyList = new JList<Story>(storyListModel);
storyList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
storyList.setBackground(Ressources.PAGECOLOR);
storyList.setForeground(Ressources.PAGECOLOR);
storyList.setFont(Menu.fontText[0]);
storyList.setCellRenderer(new StoryListCellRenderer());
storyList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
Story s = storyList.getSelectedValue();
if(s != null) {
authorStart.setText("Autor: "+s.getAuthor());
titleStart.setText(s.getTitle());
dateStart.setText("Datum: "+DateFormat.getDateInstance().format(s.getChangeDate()));
editButton.setEnabled(true);
renderButton.setEnabled(true);
}
}
});
JScrollPane scrollpane = new Scrollbar(Ressources.PAGECOLOR);
scrollpane.setBounds(Menu.leftPageX, (int)(140/Ressources.SCALE), Menu.pageWidth, (int)(590/Ressources.SCALE));
scrollpane.setBackground(Ressources.PAGECOLOR);
scrollpane.setForeground(Ressources.PAGECOLOR);
scrollpane.setBorder(null);
scrollpane.setViewportView(storyList);
baseLayerStart.add(scrollpane);
// Author
authorStart = generateStandardLabel();
authorStart.setFont(Menu.fontHeadline[3]);
authorStart.setBounds(Menu.rightPageX,(int)(180/Ressources.SCALE),Menu.pageWidth,(int)(40/Ressources.SCALE));
baseLayerStart.add(authorStart);
// Date
dateStart = generateStandardLabel();
dateStart.setFont(Menu.fontHeadline[3]);
dateStart.setBounds(Menu.rightPageX, (int)(210/Ressources.SCALE),Menu.pageWidth,(int)(40/Ressources.SCALE));
baseLayerStart.add(dateStart);
// Title
titleStart = generateStandardLabel();
titleStart.setFont(Menu.fontHeadline[1]);
titleStart.setBounds(Menu.rightPageX, (int)(140/Ressources.SCALE),Menu.pageWidth,(int)(40/Ressources.SCALE));
baseLayerStart.add(titleStart);
// Edit-Button
editButton = new TextButton("Bearbeiten", Menu.rightPageXUnscaled, 300, 290, 60);
editButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
currentStory = storyList.getSelectedValue();
showEditMode();
}
});
baseLayerStart.add(editButton);
// new Story
renderButton = new TextButton("Rendern", Menu.rightPageXUnscaled + 290 + 20, 300, 290, 60);
renderButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
currentStory = storyList.getSelectedValue();
if (currentStory != null) {
new Thread(new Runnable() {
@Override
public void run() {
menu.loading.setVisible(true);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
TextAnalyzer analyzer = new TextAnalyzer(menu.loading);
analyzer.analyzeText(currentStory);
menu.loading.setVisible(false);
}
}).start();
}
showStart();
}
});
baseLayerStart.add(renderButton);
// Import-Button
TextButton importButton = new TextButton("Importieren", Menu.leftPageXUnscaled, 760, 290, 60);
importButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser choose = new JFileChooser();
choose.addChoosableFileFilter(filter);
choose.setFileFilter(filter);
if (choose.showOpenDialog(Editor.this) == JFileChooser.APPROVE_OPTION) {
try {
FileInputStream f = new FileInputStream(choose.getSelectedFile());
ObjectInputStream o = new ObjectInputStream(f);
Story s = (Story) o.readObject();
db.insertStoryToDatabase(s);
f.close();
o.close();
} catch (IOException | ClassNotFoundException e1) {
e1.printStackTrace();
}
}
showStart();
}
});
baseLayerStart.add(importButton);
// new Story
TextButton newButton = new TextButton("Neue Geschichte", Menu.leftPageXUnscaled + 290 + 20, 760, 290, 60);
newButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
Story s = new Story();
s.setTitle("Unbenannte Geschichte");
s.setAuthor(User.getCurrentUser());
s.setChangeDate(new Date());
s.setText("");
s.setVersion(1);
db.insertStoryToDatabase(s);
showStart();
}
});
baseLayerStart.add(newButton);
}
/**
* initialize edit mode
*/
private void initializeEditMode() {
baseLayerEditMode = new JLayeredPane();
baseLayerEditMode.setBounds(0, 0 ,Menu.innerPanel.width, Menu.innerPanel.height);
add(baseLayerEditMode);
// WordSuggestor
wordSuggEditMode = new WordSuggestor();
wordSuggEditMode.setBounds((int)(40/Ressources.SCALE), (int)(335/Ressources.SCALE), (int)(600/Ressources.SCALE), (int)(520/Ressources.SCALE));
wordSuggEditMode.setVisible(true);
// Headline
headlineEditMode = new JTextField();
headlineEditMode.setBounds((int)(40/Ressources.SCALE), (int)(25/Ressources.SCALE), (int)(600/Ressources.SCALE), (int)(80/Ressources.SCALE));
headlineEditMode.setFont(Menu.fontHeadline[0]);
headlineEditMode.setOpaque(false);
headlineEditMode.setBorder(null);
headlineEditMode.setVisible(true);
headlineEditMode.addFocusListener(new EmptyTextFieldListener(EMPTY_TITLE, Color.GRAY, Color.BLACK).initializeCallerTextComponent(headlineEditMode));
JLabel headlineUnderscore = new JLabel(new ImageIcon(Imagelib.getInstance().loadDesignImage("menu_headline_underscore")));
headlineUnderscore.setBounds((int)(40/Ressources.SCALE), (int)(140/Ressources.SCALE), (int)(600/Ressources.SCALE), (int)(70/Ressources.SCALE));
// Scrollpane
scrollpaneEditMode = new Scrollbar(Ressources.PAGECOLOR);
scrollpaneEditMode.setBounds((int)((1100-350)/Ressources.SCALE), (int)(10/Ressources.SCALE), (int)(600/Ressources.SCALE), (int)(820/Ressources.SCALE));
scrollpaneEditMode.setBackground(Ressources.PAGECOLOR);
scrollpaneEditMode.setForeground(Ressources.PAGECOLOR);
scrollpaneEditMode.setBorder(null);
// Editor
editorEditMode = new JTextArea();
editorEditMode.setBounds((int)((1100-350)/Ressources.SCALE), (int)(10/Ressources.SCALE), (int)(600/Ressources.SCALE), (int)(800/Ressources.SCALE));
editorEditMode.setBackground(Ressources.PAGECOLOR);
editorEditMode.setBorder(null);
editorEditMode.setLineWrap(true);
editorEditMode.setWrapStyleWord(true);
editorEditMode.setForeground(Color.black);
editorEditMode.setFont(Menu.fontHeadline[3]);
// Author
authorEditMode = new JLabel();
authorEditMode.setText("Autor: ");
authorEditMode.setFont(Menu.fontText[0]);
authorEditMode.setBounds((int)(40/Ressources.SCALE),(int)(215/Ressources.SCALE),(int)(200/Ressources.SCALE),(int)(30/Ressources.SCALE));
authorEditMode.setVisible(true);
// Date
dateEditMode = new JLabel();
dateEditMode.setText("Datum: ");
dateEditMode.setFont(Menu.fontText[0]);
dateEditMode.setBounds((int)(440/Ressources.SCALE),(int)(215/Ressources.SCALE),(int)(200/Ressources.SCALE),(int)(30/Ressources.SCALE));
dateEditMode.setHorizontalAlignment(SwingConstants.RIGHT);
dateEditMode.setVisible(true);
// Start
TextButton start = new TextButton("zur�ck", 40, 265, 195, 60);
baseLayerEditMode.add(start);
start.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseClicked(MouseEvent e) {
showStart();
}
});
// Export/ Share
TextButton export = new TextButton("Exportieren", 40+195+10, 265, 195, 60);
export.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateCurrentStory();
JFileChooser choose = new JFileChooser();
choose.addChoosableFileFilter(filter);
choose.setFileFilter(filter);
if (choose.showSaveDialog(Editor.this) == JFileChooser.APPROVE_OPTION) {
try {
FileOutputStream fos = new FileOutputStream(choose.getSelectedFile()+".bear");
ObjectOutputStream o = new ObjectOutputStream(fos);
o.writeObject(currentStory);
o.close();
fos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
});
// Save
TextButton save = new TextButton("Speichern", 40+2*(195+10), 265, 195, 60);
save.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateCurrentStory();
db.updateStory(currentStory);
showEditMode();
}
});
baseLayerEditMode.add(headlineUnderscore);
baseLayerEditMode.add(save);
baseLayerEditMode.add(headlineEditMode);
baseLayerEditMode.add(scrollpaneEditMode);
baseLayerEditMode.add(wordSuggEditMode);
baseLayerEditMode.add(dateEditMode);
baseLayerEditMode.add(authorEditMode);
baseLayerEditMode.add(export);
}
/**
* Cell Renderer for list of stories
*/
private class StoryListCellRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel c = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
c.setText(((Story)value).getTitle());
c.setBackground(new Color(0,0,0,0));
c.setForeground(Color.black);
c.setBorder(null);
c.setCursor(Ressources.CURSORCLICKABLE);
if (isSelected) {
c.setForeground(Ressources.MENUCOLORSELECTED);
}
return c;
}
}
}