import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

import vtk.vtkActor;
import vtk.vtkAlgorithmOutput;
import vtk.vtkCanvas;
import vtk.vtkCutter;
import vtk.vtkDataSetMapper;
import vtk.vtkDataSetReader;
import vtk.vtkImplicitPlaneWidget;
import vtk.vtkInteractorStyleTrackballCamera;
import vtk.vtkOutlineFilter;
import vtk.vtkPlane;

public class MyCutWidget {
	private vtkImplicitPlaneWidget boxw;
	private vtkCutter cutter;
	private boolean widgetOn;

	public MyCutWidget() {
		vtkCanvas panel = new vtkCanvas();
		//
		vtkDataSetReader reader = new vtkDataSetReader();
		reader.SetFileName("image.txt");
		reader.Update();
		reader.CloseVTKFile();
		widgetOn = true;

		// vtkDataSet data = reader.GetOutput();
		vtkAlgorithmOutput output = reader.GetOutputPort();
		vtkDataSetMapper mapper = new vtkDataSetMapper();
		vtkActor actor = new vtkActor();

		vtkDataSetMapper boundMapper = new vtkDataSetMapper();
		vtkActor boundActor = new vtkActor();

		//
		cutter = new vtkCutter();
		vtkPlane plan = new vtkPlane();
		plan.SetOrigin(0, 0, 0);
		plan.SetNormal(0, 0, 1);

		cutter.SetCutFunction(plan);
		cutter.SetInputConnection(output);
		mapper.SetInputConnection(cutter.GetOutputPort());

		vtkOutlineFilter outlinefilter = new vtkOutlineFilter();
		outlinefilter.SetInputConnection(output);

		boundMapper.SetInputConnection(outlinefilter.GetOutputPort());

		boxw = new vtkImplicitPlaneWidget();

		actor.SetMapper(mapper);
		boundActor.SetMapper(boundMapper);

		panel.setInteractorStyle(new vtkInteractorStyleTrackballCamera());

		boxw.SetInteractor(panel.getIren());
		boxw.SetPlaceFactor(1.0);

		boxw.SetProp3D(boundActor);
		boxw.PlaceWidget();

		boxw.AddObserver("InteractionEvent", this, "myCallBack");

		boxw.On();

		panel.GetRenderer().AddActor(actor);
		panel.GetRenderer().AddActor(boundActor);

		//
		JFrame f = new JFrame("Widget Test");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setSize(500, 500);
		f.setLocationRelativeTo(null);
		f.getContentPane().setLayout(new BorderLayout());
		f.getContentPane().add(panel, BorderLayout.CENTER);
		f.setVisible(true);

	}

	public void myCallBack() {
		vtkPlane plane = new vtkPlane();
		boxw.GetPlane(plane);
		cutter.SetCutFunction(plane);
		boxw.SetDrawPlane(0);
	}

	public static void main(String[] args) {
		new MyCutWidget();
	}
}
