/*
* Copyright 2003-2012 Yusuke Yamamoto
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package samurai.swing;
import samurai.tail.LogMonitor;
import samurai.tail.MultipleLogWatcher;
import samurai.util.GUIResourceBundle;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.SystemColor;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetListener;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class SamuraiPanel extends JPanel implements LogMonitor, RemoveListener {
private static ImageIcon monitoringIcon = new ImageIcon(SamuraiPanel.class.getResource("images/monitoring.gif"));
private static ImageIcon readingIcon = new ImageIcon(SamuraiPanel.class.getResource("images/reading.gif"));
/*package*/static ImageIcon stoppedIcon = new ImageIcon(SamuraiPanel.class.getResource("images/stopped.gif"));
private List<LogRenderer> logRenderers = new ArrayList<LogRenderer>(3);
private static GUIResourceBundle resources = GUIResourceBundle.getInstance();
BorderLayout borderLayout1 = new BorderLayout();
public TileTabPanel<JPanel> tab = new TileTabPanel<JPanel>(true);
// private LogWatcher logWatcher = new LogWatcher();
private MultipleLogWatcher logWatcher;// = new MultipleLogWatcher();
private Context context = null;
public SamuraiPanel(Context context, KeyListener listener, String encoding) {
this.context = context;
setEncoding(encoding);
this.setLayout(borderLayout1);
tab.setShowTitleWithSingleComponent(false);
logRenderers.add(new ThreadDumpPanel(this, context));
logRenderers.add(new GraphPanel(this, context));
logRenderers.add(new LogPanel(this));
this.add(tab, BorderLayout.CENTER);
context.setIcon(this.stoppedIcon, this);
addKeyListener(listener);
tab.addKeyListener(listener);
for (LogRenderer renderer : logRenderers) {
addKeyListenerToComponents(listener, renderer);
context.getConfig().addTarget(renderer);
}
setDragNotAccepting();
// logWatcher.addLogMonitor(this);
// for (LogRenderer renderer : logRenderers) {
// logWatcher.addLogMonitor(renderer);
// }
//// logWatcher.setDebug(true);
// logWatcher.start();
}
private void addKeyListenerToComponents(KeyListener listener, Component component) {
component.addKeyListener(listener);
if (component instanceof Container) {
Container container = (Container) component;
for (int i = 0; i < container.getComponentCount(); i++) {
addKeyListenerToComponents(listener, container.getComponent(i));
}
}
}
/*package*/ void setDroptargetListener(DropTargetListener listener) {
DropTarget target = new DropTarget(this, DnDConstants.ACTION_REFERENCE, listener);
for (LogRenderer renderer : logRenderers) {
addDropTargetListenerToComponents(listener, renderer);
}
setDragNotAccepting();
}
private void addDropTargetListenerToComponents(DropTargetListener listener, Component component) {
DropTarget target = new DropTarget(component, DnDConstants.ACTION_REFERENCE, listener);
if (component instanceof Container) {
Container container = (Container) component;
for (int i = 0; i < container.getComponentCount(); i++) {
addDropTargetListenerToComponents(listener, container.getComponent(i));
}
}
}
private boolean empty = true;
public boolean isEmpty() {
return empty;
}
public void clearBuffer(){
if(!empty){
for (LogRenderer renderer : logRenderers) {
renderer.clearBuffer();
}
}
}
public synchronized void close() {
// if (null != logWatcher) {
// this.logWatcher.kill();
// logWatcher = null;
// }
if (null != logWatcher) {
this.logWatcher.kill();
logWatcher = null;
}
// logWatcher.setFiles(new File[0]);
context.setText(resources.getMessage("MainFrame.untitled"), this);
for (LogRenderer renderer : logRenderers) {
renderer.close();
}
context.setIcon(this.stoppedIcon, this);
empty = true;
this.currentFile = null;
}
/*package*/ void addPane(final String name, final JPanel component) {
if (SwingUtilities.isEventDispatchThread() || !this.isDisplayable()) {
tab.addComponent(name, component);
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
tab.addComponent(name, component);
}
});
}
}
/*package*/ void removePane(final JPanel component) {
if (SwingUtilities.isEventDispatchThread()) {
tab.removeComponent(component);
} else {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
tab.removeComponent(component);
}
});
}
}
private List<File> currentFile = null;
public List<File> getCurrentFile() {
return this.currentFile;
}
public synchronized void openFiles(File[] files) {
if (0 < files.length) {
List<File> fileList = new ArrayList<File>(files.length);
for (int i = 0; i < files.length; i++) {
if (!files[i].isDirectory()) {
fileList.add(files[i]);
}
}
java.util.Collections.sort(fileList);
openFiles(fileList);
}
}
private String encoding;
private String actualEncoding;
public void setEncoding(String encoding) {
if (!encoding.equals(this.encoding)) {
this.encoding = encoding;
if (encoding.equals("SYSTEM_DEFAULT")) {
this.actualEncoding = System.getProperty("file.encoding");
} else {
this.actualEncoding = encoding;
}
if (null != logWatcher) {
reload();
}
}
}
public String getEncoding(){
return encoding;
}
private void openFiles(List<File> files) {
this.close();
// logWatcher = new LogWatcher((File[])files.toArray(new File[]{}));
// logWatcher.addLogMonitor(this);
// for (LogRenderer renderer : logRenderers) {
// logWatcher.addLogMonitor(renderer);
// }
// logWatcher.setDebug(true);
// logWatcher.start();
currentFile = files;
if (null != currentFile) {
context.setText(files.get(0).getName(), this);
context.setTemporaryStatus(resources.getMessage("LogPanel.monitoring", files.get(0).getName()));
empty = false;
} else {
context.setText(resources.getMessage("MainFrame.untitled"), this);
empty = true;
}
logWatcher = new MultipleLogWatcher(files.toArray(new File[]{}), actualEncoding);
logWatcher.addLogMonitor(this);
for (LogRenderer renderer : logRenderers) {
logWatcher.addLogMonitor(renderer);
}
// logWatcher.setDebug(true);
logWatcher.start();
// logWatcher.setFiles((File[])files.toArray(new File[]{}));
}
public void reload() {
openFiles(currentFile);
}
/*package*/ void setIcon(ImageIcon icon, JComponent component) {
for (int i = 0; i < tab.getComponentSize(); i++) {
Component theComponent = tab.getComponentAt(i);
if (component == theComponent) {
tab.setIconAt(i, icon);
break;
}
}
}
public void onLine(File file, String line, long filePointer) {
}
public void logStarted(File file, long filepointer) {
context.setIcon(this.readingIcon, this);
}
public void logEnded(File file, long filepointer) {
context.setIcon(this.stoppedIcon, this);
}
public void logWillEnd(File file, long filepointer) {
context.setIcon(this.monitoringIcon, this);
}
public void logContinued(File file, long filepointer) {
context.setIcon(this.readingIcon, this);
}
public void onException(File file, IOException ioe) {
}
public Component getSelectedComponent() {
return this.tab.getSelectedComponent();
}
public void willBeRemoved() {
close();
}
Border lineBorder = new LineBorder(SystemColor.textHighlight, 2, true);
Border emptyBorder = new EmptyBorder(2, 2, 2, 2);
/*package*/void setDragAccepting() {
setBorder(lineBorder);
}
/*package*/ void setDragNotAccepting() {
setBorder(emptyBorder);
}
}