Eclipse插件:如何输出字符串到控制台

首先定义一个控制台类(继承自MessageConsole),以及一个输出带链接的字符串的帮助类。

 

package com.shansun.easycmd.controls;

import java.io.IOException;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.MessageConsole;
import org.eclipse.ui.console.MessageConsoleStream;

public class MavenConsole extends MessageConsole {

	final public static String MAVEN_CONSOLE_NAME = "Maven Tools";

	int addStrLen;

	static class DocChangeListener implements IDocumentListener {

		int lenBeforeChange;

		int expectedlen;

		final MavenConsole mvnConsole;

		final MavenHyperLink mvnLink;

		public DocChangeListener(MavenConsole console, MavenHyperLink link, int lenWanted) {
			mvnConsole = console;
			mvnLink = link;
			expectedlen = lenWanted;
		}

		public void documentAboutToBeChanged(DocumentEvent event) {}

		public void documentChanged(final DocumentEvent event) {
			int strLenAfterChange = event.getDocument().getLength();
			if (strLenAfterChange >= expectedlen) {
				Job job = new Job("MavenMessageConsole.addLinkToConsole") {
					public IStatus run(IProgressMonitor monitor) {
						try {
							mvnConsole.addHyperlink(mvnLink, expectedlen - mvnLink.getText().length(), mvnLink.getText().length());
						} catch (Exception e) {}

						return Status.OK_STATUS;
					}
				};
				job.schedule();
				event.getDocument().removeDocumentListener(this);
			}
		}
	}

	public MavenConsole() {
		super(MAVEN_CONSOLE_NAME, null);
		addStrLen = 0;
	}

	public void clearConsole() {
		super.clearConsole();
		this.addStrLen = 0;
	}

	public void printToConsole(final String msg, final Color color) {
		final MessageConsoleStream stream = this.newMessageStream();
		this.activate();
		if (color != null) stream.setColor(color);
		addStrLen += msg.length();
		stream.println(msg); // "\n" will take length 1, so use print, not println
		try {
	        stream.flush();
        } catch (IOException e) {
	        e.printStackTrace();
        }
	}

	public void addLinkToConsole(final MavenHyperLink link, Color color) {
		if (link.valid()) {
			try {
				final MavenConsole console = this;
				final int currentStrLen = addStrLen;
				printToConsole(link.getText(), color);
				console.getDocument().addDocumentListener(new DocChangeListener(console, link, currentStrLen + link.getText().length()));

			} catch (Exception e) {}
		}
	}

	public static MavenConsole getMavenConsole() {
		IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
		IConsole[] curConsoles = manager.getConsoles();
		for (IConsole co : curConsoles) {
			if (co.getName().equals(MAVEN_CONSOLE_NAME))
			    return (MavenConsole) co;
		}
		MavenConsole myConsole = new MavenConsole();
		manager.addConsoles(new IConsole[] { myConsole });
		return myConsole;
	}
}

 

package com.shansun.easycmd.controls;

import java.net.URL;

import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.console.IHyperlink;

public class MavenHyperLink implements IHyperlink {

	String text;

	URL url;

	public MavenHyperLink(String text, String urlStr) {
		try {
			this.text = text;
			this.url = new URL(urlStr);
		} catch (Exception e) {
			this.url = null;
		}
	}

	public boolean valid() {
		return this.text != null && this.url != null;
	}

	public String getText() {
		return this.text;
	}

	public void linkActivated() {
		try {
			if (url != null)
			    PlatformUI.getWorkbench().getBrowserSupport().createBrowser("TestConsole").openURL(url);
		} catch (Exception e) {}
	}

	public void linkEntered() {}

	public void linkExited() {}

}

 下面介绍如何在代码中使用这两个类:

private void doMavenInWindows(boolean isDir, String osPath) {
		final Color colorBlue = Display.getDefault().getSystemColor(SWT.COLOR_BLUE);
		Color colorRed = Display.getDefault().getSystemColor(SWT.COLOR_RED);
		Color colorBlack = Display.getDefault().getSystemColor(SWT.COLOR_BLACK);

		final MavenConsole myConsole = MavenConsole.getMavenConsole();
		myConsole.printToConsole(osPath, colorBlue);
		try {
			final String mavenExePath = Activator.getMavenExe();
			if (mavenExePath == null) return;
			try {
				myConsole.clearConsole();
				myConsole.setBackground(colorBlack);
				String cmd = mavenExePath + " clean deploy -Dmaven.test.skip=true";
				Process proc = null;
				if (isDir) {
					proc = Runtime.getRuntime().exec(cmd, null, new File(osPath));
				} else {
					int index1 = osPath.lastIndexOf('/');
					int index2 = osPath.lastIndexOf('\\');
					int index = Math.max(index1, index2);
					String realPath = osPath.substring(0, index);
					proc = Runtime.getRuntime().exec(cmd, null, new File(realPath));
				}
				InputStream is = proc.getInputStream();
				InputStreamReader isr = new InputStreamReader(is, "GBK");
				final BufferedReader br = new BufferedReader(isr);
				myConsole.printToConsole("Maven Tools v1.0, Made By Lanbo.xj", colorRed);
				Job job = new Job("MavenMessageConsole.addLinkToConsole") {
					public IStatus run(IProgressMonitor monitor) {
						String line = null;
						try {
							while ((line = br.readLine()) != null) {
								final String tmpLine = line;
								myConsole.printToConsole(tmpLine, colorBlue);
							}
							return Status.OK_STATUS;
						} catch (IOException e) {
							e.printStackTrace();
						}
						return Status.CANCEL_STATUS;
					}
				};
				job.schedule();
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 

 

你可能感兴趣的:(eclipse,maven,.net,UI)