package com.niklim.clicktrace.view;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.niklim.clicktrace.Icons;
import com.niklim.clicktrace.OSUtils;
import com.niklim.clicktrace.capture.ScreenUtils;
import com.niklim.clicktrace.model.ScreenShot;
import com.niklim.clicktrace.model.Session;
import com.niklim.clicktrace.view.control.ControlView;
import com.niklim.clicktrace.view.control.ToolbarView;
import com.niklim.clicktrace.view.control.menu.MenuBar;
import com.niklim.clicktrace.view.session.ScreenShotView;
@Singleton
public class MainView {
private static Logger log = LoggerFactory.getLogger(MainView.class);
private static final String APP_NAME = "Clicktrace";
private JFrame frame;
private JScrollPane scrollPane;
@Inject
private ScreenShotView screenShotView;
@Inject
private SplashScreenView splashScreenView;
@Inject
private ControlView controlView;
@Inject
private MenuBar menu;
@Inject
private ToolbarView toolbar;
public MainView() {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (UnsupportedLookAndFeelException e) {
log.error("", e);
} catch (IllegalAccessException e) {
log.error("", e);
} catch (InstantiationException e) {
log.error("", e);
} catch (ClassNotFoundException e) {
log.error("", e);
}
UIManager.put("swing.boldMetal", Boolean.FALSE);
}
@Inject
public void init() {
frame = new JFrame(APP_NAME);
MainFrameHolder.set(frame);
frame.setIconImage(Icons.createIconImage(Icons.APP, ""));
setInitSize();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setJMenuBar(menu.getMenuBar());
}
private void setInitSize() {
Dimension screenSize = ScreenUtils.getPrimarySize();
frame.setBounds((int) (screenSize.getWidth() * 0.1), (int) (screenSize.getHeight() * 0.1),
(int) (screenSize.getWidth() * 0.8), (int) (screenSize.getHeight() * 0.8));
}
private JScrollPane createScrollPane(Component top, Component Bottom) {
JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
splitPane.setEnabled(false);
splitPane.setTopComponent(top);
splitPane.setBottomComponent(Bottom);
scrollPane = new JScrollPane(splitPane, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
return scrollPane;
}
public void open() {
frame.setVisible(true);
}
public void showSplashScreen() {
if (scrollPane != null) {
frame.remove(scrollPane);
}
createScrollPane(controlView.getComponent(), splashScreenView.getPanel());
frame.add(scrollPane);
}
private void showScreenShotView() {
if (scrollPane != null) {
frame.remove(scrollPane);
}
createScrollPane(controlView.getComponent(), screenShotView.getPanel());
frame.add(scrollPane);
}
public void showSession(Session session) {
showWaitingCursor();
showScreenShotView();
changeAppTitle(session);
resetControl(session);
if (session.getShots().size() > 0) {
ScreenShot shot = session.getShots().get(0);
screenShotView.show(shot);
controlView.setActiveScreenShot(shot);
} else {
screenShotView.clear();
}
refresh();
hideWaitingCursor();
}
public void changeAppTitle(Session session) {
frame.setTitle(APP_NAME + " - " + session.getName());
}
public void hideWaitingCursor() {
frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
public void showWaitingCursor() {
frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
}
public void refresh() {
frame.getContentPane().invalidate();
frame.getContentPane().validate();
frame.getContentPane().repaint();
}
public void showScreenShot(ScreenShot screenShot, boolean selected) {
if (screenShot != null) {
showWaitingCursor();
screenShotView.show(screenShot);
controlView.setActiveScreenShotSelected(selected);
controlView.setActiveScreenShot(screenShot);
hideWaitingCursor();
} else {
screenShotView.clear();
}
}
public void hideSession() {
controlView.hide();
screenShotView.clear();
frame.setTitle(APP_NAME);
refresh();
}
public void setSelectedActiveScreenShot(boolean selected) {
controlView.setActiveScreenShotSelected(selected);
}
public JFrame getFrame() {
return frame;
}
public void sessionStateChanged() {
menu.sessionStateChanged();
toolbar.sessionStateChanged();
}
public void resetControl(Session session) {
controlView.showImagesCombobox(session);
if (session.getShots().isEmpty()) {
controlView.hide();
}
refresh();
}
public void hide() {
if (OSUtils.isOnMac() && !OSUtils.isJava6()) {
frame.setExtendedState(JFrame.ICONIFIED);
} else {
frame.setState(JFrame.ICONIFIED);
}
}
public void scrollUp() {
JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue(vertical.getMinimum());
}
public void scrollDown() {
JScrollBar vertical = scrollPane.getVerticalScrollBar();
vertical.setValue(vertical.getMaximum());
}
}