Initial commit
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 983 B |
@@ -0,0 +1,20 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.ui.editors.text.TextEditor;
|
||||
|
||||
public class $editorClass$ extends TextEditor {
|
||||
|
||||
private ColorManager colorManager;
|
||||
|
||||
public $editorClass$() {
|
||||
super();
|
||||
colorManager = new ColorManager();
|
||||
setSourceViewerConfiguration(new XMLConfiguration(colorManager));
|
||||
setDocumentProvider(new XMLDocumentProvider());
|
||||
}
|
||||
public void dispose() {
|
||||
colorManager.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package $packageName$;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import org.eclipse.swt.graphics.Color;
|
||||
import org.eclipse.swt.graphics.RGB;
|
||||
import org.eclipse.swt.widgets.Display;
|
||||
|
||||
public class ColorManager {
|
||||
|
||||
protected Map fColorTable = new HashMap(10);
|
||||
|
||||
public void dispose() {
|
||||
Iterator e = fColorTable.values().iterator();
|
||||
while (e.hasNext())
|
||||
((Color) e.next()).dispose();
|
||||
}
|
||||
public Color getColor(RGB rgb) {
|
||||
Color color = (Color) fColorTable.get(rgb);
|
||||
if (color == null) {
|
||||
color = new Color(Display.getCurrent(), rgb);
|
||||
fColorTable.put(rgb, color);
|
||||
}
|
||||
return color;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.swt.graphics.RGB;
|
||||
|
||||
public interface IXMLColorConstants {
|
||||
RGB XML_COMMENT = new RGB(128, 0, 0);
|
||||
RGB PROC_INSTR = new RGB(128, 128, 128);
|
||||
RGB STRING = new RGB(0, 128, 0);
|
||||
RGB DEFAULT = new RGB(0, 0, 0);
|
||||
RGB TAG = new RGB(0, 0, 128);
|
||||
}
|
||||
@@ -0,0 +1,138 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.text.BadLocationException;
|
||||
import org.eclipse.jface.text.DocumentEvent;
|
||||
import org.eclipse.jface.text.IDocument;
|
||||
import org.eclipse.jface.text.IRegion;
|
||||
import org.eclipse.jface.text.ITypedRegion;
|
||||
import org.eclipse.jface.text.Region;
|
||||
import org.eclipse.jface.text.TextAttribute;
|
||||
import org.eclipse.jface.text.TextPresentation;
|
||||
import org.eclipse.jface.text.presentation.IPresentationDamager;
|
||||
import org.eclipse.jface.text.presentation.IPresentationRepairer;
|
||||
import org.eclipse.jface.util.Assert;
|
||||
import org.eclipse.swt.custom.StyleRange;
|
||||
|
||||
public class NonRuleBasedDamagerRepairer
|
||||
implements IPresentationDamager, IPresentationRepairer {
|
||||
|
||||
/** The document this object works on */
|
||||
protected IDocument fDocument;
|
||||
/** The default text attribute if non is returned as data by the current token */
|
||||
protected TextAttribute fDefaultTextAttribute;
|
||||
|
||||
/**
|
||||
* Constructor for NonRuleBasedDamagerRepairer.
|
||||
*/
|
||||
public NonRuleBasedDamagerRepairer(TextAttribute defaultTextAttribute) {
|
||||
Assert.isNotNull(defaultTextAttribute);
|
||||
|
||||
fDefaultTextAttribute = defaultTextAttribute;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see IPresentationRepairer#setDocument(IDocument)
|
||||
*/
|
||||
public void setDocument(IDocument document) {
|
||||
fDocument = document;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the end offset of the line that contains the specified offset or
|
||||
* if the offset is inside a line delimiter, the end offset of the next line.
|
||||
*
|
||||
* @param offset the offset whose line end offset must be computed
|
||||
* @return the line end offset for the given offset
|
||||
* @exception BadLocationException if offset is invalid in the current document
|
||||
*/
|
||||
protected int endOfLineOf(int offset) throws BadLocationException {
|
||||
|
||||
IRegion info = fDocument.getLineInformationOfOffset(offset);
|
||||
if (offset <= info.getOffset() + info.getLength())
|
||||
return info.getOffset() + info.getLength();
|
||||
|
||||
int line = fDocument.getLineOfOffset(offset);
|
||||
try {
|
||||
info = fDocument.getLineInformation(line + 1);
|
||||
return info.getOffset() + info.getLength();
|
||||
} catch (BadLocationException x) {
|
||||
return fDocument.getLength();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see IPresentationDamager#getDamageRegion(ITypedRegion, DocumentEvent, boolean)
|
||||
*/
|
||||
public IRegion getDamageRegion(
|
||||
ITypedRegion partition,
|
||||
DocumentEvent event,
|
||||
boolean documentPartitioningChanged) {
|
||||
if (!documentPartitioningChanged) {
|
||||
try {
|
||||
|
||||
IRegion info =
|
||||
fDocument.getLineInformationOfOffset(event.getOffset());
|
||||
int start = Math.max(partition.getOffset(), info.getOffset());
|
||||
|
||||
int end =
|
||||
event.getOffset()
|
||||
+ (event.getText() == null
|
||||
? event.getLength()
|
||||
: event.getText().length());
|
||||
|
||||
if (info.getOffset() <= end
|
||||
&& end <= info.getOffset() + info.getLength()) {
|
||||
// optimize the case of the same line
|
||||
end = info.getOffset() + info.getLength();
|
||||
} else
|
||||
end = endOfLineOf(end);
|
||||
|
||||
end =
|
||||
Math.min(
|
||||
partition.getOffset() + partition.getLength(),
|
||||
end);
|
||||
return new Region(start, end - start);
|
||||
|
||||
} catch (BadLocationException x) {
|
||||
}
|
||||
}
|
||||
|
||||
return partition;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see IPresentationRepairer#createPresentation(TextPresentation, ITypedRegion)
|
||||
*/
|
||||
public void createPresentation(
|
||||
TextPresentation presentation,
|
||||
ITypedRegion region) {
|
||||
addRange(
|
||||
presentation,
|
||||
region.getOffset(),
|
||||
region.getLength(),
|
||||
fDefaultTextAttribute);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds style information to the given text presentation.
|
||||
*
|
||||
* @param presentation the text presentation to be extended
|
||||
* @param offset the offset of the range to be styled
|
||||
* @param length the length of the range to be styled
|
||||
* @param attr the attribute describing the style of the range to be styled
|
||||
*/
|
||||
protected void addRange(
|
||||
TextPresentation presentation,
|
||||
int offset,
|
||||
int length,
|
||||
TextAttribute attr) {
|
||||
if (attr != null)
|
||||
presentation.addStyleRange(
|
||||
new StyleRange(
|
||||
offset,
|
||||
length,
|
||||
attr.getForeground(),
|
||||
attr.getBackground(),
|
||||
attr.getStyle()));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.text.rules.*;
|
||||
|
||||
public class TagRule extends MultiLineRule {
|
||||
|
||||
public TagRule(IToken token) {
|
||||
super("<", ">", token);
|
||||
}
|
||||
protected boolean sequenceDetected(
|
||||
ICharacterScanner scanner,
|
||||
char[] sequence,
|
||||
boolean eofAllowed) {
|
||||
int c = scanner.read();
|
||||
if (sequence[0] == '<') {
|
||||
if (c == '?') {
|
||||
// processing instruction - abort
|
||||
scanner.unread();
|
||||
return false;
|
||||
}
|
||||
if (c == '!') {
|
||||
scanner.unread();
|
||||
// comment - abort
|
||||
return false;
|
||||
}
|
||||
} else if (sequence[0] == '>') {
|
||||
scanner.unread();
|
||||
}
|
||||
return super.sequenceDetected(scanner, sequence, eofAllowed);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.text.IDocument;
|
||||
import org.eclipse.jface.text.ITextDoubleClickStrategy;
|
||||
import org.eclipse.jface.text.TextAttribute;
|
||||
import org.eclipse.jface.text.presentation.IPresentationReconciler;
|
||||
import org.eclipse.jface.text.presentation.PresentationReconciler;
|
||||
import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
|
||||
import org.eclipse.jface.text.rules.Token;
|
||||
import org.eclipse.jface.text.source.ISourceViewer;
|
||||
import org.eclipse.jface.text.source.SourceViewerConfiguration;
|
||||
|
||||
public class XMLConfiguration extends SourceViewerConfiguration {
|
||||
private XMLDoubleClickStrategy doubleClickStrategy;
|
||||
private XMLTagScanner tagScanner;
|
||||
private XMLScanner scanner;
|
||||
private ColorManager colorManager;
|
||||
|
||||
public XMLConfiguration(ColorManager colorManager) {
|
||||
this.colorManager = colorManager;
|
||||
}
|
||||
public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
|
||||
return new String[] {
|
||||
IDocument.DEFAULT_CONTENT_TYPE,
|
||||
XMLPartitionScanner.XML_COMMENT,
|
||||
XMLPartitionScanner.XML_TAG };
|
||||
}
|
||||
public ITextDoubleClickStrategy getDoubleClickStrategy(
|
||||
ISourceViewer sourceViewer,
|
||||
String contentType) {
|
||||
if (doubleClickStrategy == null)
|
||||
doubleClickStrategy = new XMLDoubleClickStrategy();
|
||||
return doubleClickStrategy;
|
||||
}
|
||||
|
||||
protected XMLScanner getXMLScanner() {
|
||||
if (scanner == null) {
|
||||
scanner = new XMLScanner(colorManager);
|
||||
scanner.setDefaultReturnToken(
|
||||
new Token(
|
||||
new TextAttribute(
|
||||
colorManager.getColor(IXMLColorConstants.DEFAULT))));
|
||||
}
|
||||
return scanner;
|
||||
}
|
||||
protected XMLTagScanner getXMLTagScanner() {
|
||||
if (tagScanner == null) {
|
||||
tagScanner = new XMLTagScanner(colorManager);
|
||||
tagScanner.setDefaultReturnToken(
|
||||
new Token(
|
||||
new TextAttribute(
|
||||
colorManager.getColor(IXMLColorConstants.TAG))));
|
||||
}
|
||||
return tagScanner;
|
||||
}
|
||||
|
||||
public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
|
||||
PresentationReconciler reconciler = new PresentationReconciler();
|
||||
|
||||
DefaultDamagerRepairer dr =
|
||||
new DefaultDamagerRepairer(getXMLTagScanner());
|
||||
reconciler.setDamager(dr, XMLPartitionScanner.XML_TAG);
|
||||
reconciler.setRepairer(dr, XMLPartitionScanner.XML_TAG);
|
||||
|
||||
dr = new DefaultDamagerRepairer(getXMLScanner());
|
||||
reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
|
||||
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
|
||||
|
||||
NonRuleBasedDamagerRepairer ndr =
|
||||
new NonRuleBasedDamagerRepairer(
|
||||
new TextAttribute(
|
||||
colorManager.getColor(IXMLColorConstants.XML_COMMENT)));
|
||||
reconciler.setDamager(ndr, XMLPartitionScanner.XML_COMMENT);
|
||||
reconciler.setRepairer(ndr, XMLPartitionScanner.XML_COMMENT);
|
||||
|
||||
return reconciler;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.jface.text.IDocument;
|
||||
import org.eclipse.jface.text.IDocumentPartitioner;
|
||||
import org.eclipse.jface.text.rules.DefaultPartitioner;
|
||||
import org.eclipse.ui.editors.text.FileDocumentProvider;
|
||||
|
||||
public class XMLDocumentProvider extends FileDocumentProvider {
|
||||
|
||||
protected IDocument createDocument(Object element) throws CoreException {
|
||||
IDocument document = super.createDocument(element);
|
||||
if (document != null) {
|
||||
IDocumentPartitioner partitioner =
|
||||
new DefaultPartitioner(
|
||||
new XMLPartitionScanner(),
|
||||
new String[] {
|
||||
XMLPartitionScanner.XML_TAG,
|
||||
XMLPartitionScanner.XML_COMMENT });
|
||||
partitioner.connect(document);
|
||||
document.setDocumentPartitioner(partitioner);
|
||||
}
|
||||
return document;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.text.*;
|
||||
|
||||
public class XMLDoubleClickStrategy implements ITextDoubleClickStrategy {
|
||||
protected ITextViewer fText;
|
||||
|
||||
public void doubleClicked(ITextViewer part) {
|
||||
int pos = part.getSelectedRange().x;
|
||||
|
||||
if (pos < 0)
|
||||
return;
|
||||
|
||||
fText = part;
|
||||
|
||||
if (!selectComment(pos)) {
|
||||
selectWord(pos);
|
||||
}
|
||||
}
|
||||
protected boolean selectComment(int caretPos) {
|
||||
IDocument doc = fText.getDocument();
|
||||
int startPos, endPos;
|
||||
|
||||
try {
|
||||
int pos = caretPos;
|
||||
char c = ' ';
|
||||
|
||||
while (pos >= 0) {
|
||||
c = doc.getChar(pos);
|
||||
if (c == '\\') {
|
||||
pos -= 2;
|
||||
continue;
|
||||
}
|
||||
if (c == Character.LINE_SEPARATOR || c == '\"')
|
||||
break;
|
||||
--pos;
|
||||
}
|
||||
|
||||
if (c != '\"')
|
||||
return false;
|
||||
|
||||
startPos = pos;
|
||||
|
||||
pos = caretPos;
|
||||
int length = doc.getLength();
|
||||
c = ' ';
|
||||
|
||||
while (pos < length) {
|
||||
c = doc.getChar(pos);
|
||||
if (c == Character.LINE_SEPARATOR || c == '\"')
|
||||
break;
|
||||
++pos;
|
||||
}
|
||||
if (c != '\"')
|
||||
return false;
|
||||
|
||||
endPos = pos;
|
||||
|
||||
int offset = startPos + 1;
|
||||
int len = endPos - offset;
|
||||
fText.setSelectedRange(offset, len);
|
||||
return true;
|
||||
} catch (BadLocationException x) {
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
protected boolean selectWord(int caretPos) {
|
||||
|
||||
IDocument doc = fText.getDocument();
|
||||
int startPos, endPos;
|
||||
|
||||
try {
|
||||
|
||||
int pos = caretPos;
|
||||
char c;
|
||||
|
||||
while (pos >= 0) {
|
||||
c = doc.getChar(pos);
|
||||
if (!Character.isJavaIdentifierPart(c))
|
||||
break;
|
||||
--pos;
|
||||
}
|
||||
|
||||
startPos = pos;
|
||||
|
||||
pos = caretPos;
|
||||
int length = doc.getLength();
|
||||
|
||||
while (pos < length) {
|
||||
c = doc.getChar(pos);
|
||||
if (!Character.isJavaIdentifierPart(c))
|
||||
break;
|
||||
++pos;
|
||||
}
|
||||
|
||||
endPos = pos;
|
||||
selectRange(startPos, endPos);
|
||||
return true;
|
||||
|
||||
} catch (BadLocationException x) {
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void selectRange(int startPos, int stopPos) {
|
||||
int offset = startPos + 1;
|
||||
int length = stopPos - offset;
|
||||
fText.setSelectedRange(offset, length);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.text.rules.*;
|
||||
|
||||
public class XMLPartitionScanner extends RuleBasedPartitionScanner {
|
||||
public final static String XML_DEFAULT = "__xml_default";
|
||||
public final static String XML_COMMENT = "__xml_comment";
|
||||
public final static String XML_TAG = "__xml_tag";
|
||||
|
||||
public XMLPartitionScanner() {
|
||||
|
||||
IToken xmlComment = new Token(XML_COMMENT);
|
||||
IToken tag = new Token(XML_TAG);
|
||||
|
||||
IPredicateRule[] rules = new IPredicateRule[2];
|
||||
|
||||
rules[0] = new MultiLineRule("<!--", "-->", xmlComment);
|
||||
rules[1] = new TagRule(tag);
|
||||
|
||||
setPredicateRules(rules);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.text.rules.*;
|
||||
import org.eclipse.jface.text.*;
|
||||
|
||||
public class XMLScanner extends RuleBasedScanner {
|
||||
|
||||
public XMLScanner(ColorManager manager) {
|
||||
IToken procInstr =
|
||||
new Token(
|
||||
new TextAttribute(
|
||||
manager.getColor(IXMLColorConstants.PROC_INSTR)));
|
||||
|
||||
IRule[] rules = new IRule[2];
|
||||
//Add rule for processing instructions
|
||||
rules[0] = new SingleLineRule("<?", "?>", procInstr);
|
||||
// Add generic whitespace rule.
|
||||
rules[1] = new WhitespaceRule(new XMLWhitespaceDetector());
|
||||
|
||||
setRules(rules);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.text.*;
|
||||
import org.eclipse.jface.text.rules.*;
|
||||
|
||||
public class XMLTagScanner extends RuleBasedScanner {
|
||||
|
||||
public XMLTagScanner(ColorManager manager) {
|
||||
IToken string =
|
||||
new Token(
|
||||
new TextAttribute(manager.getColor(IXMLColorConstants.STRING)));
|
||||
|
||||
IRule[] rules = new IRule[3];
|
||||
|
||||
// Add rule for double quotes
|
||||
rules[0] = new SingleLineRule("\"", "\"", string, '\\');
|
||||
// Add a rule for single quotes
|
||||
rules[1] = new SingleLineRule("'", "'", string, '\\');
|
||||
// Add generic whitespace rule.
|
||||
rules[2] = new WhitespaceRule(new XMLWhitespaceDetector());
|
||||
|
||||
setRules(rules);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.text.rules.IWhitespaceDetector;
|
||||
|
||||
public class XMLWhitespaceDetector implements IWhitespaceDetector {
|
||||
|
||||
public boolean isWhitespace(char c) {
|
||||
return (c == ' ' || c == '\t' || c == '\n' || c == '\r');
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 983 B |
@@ -0,0 +1,64 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.action.IAction;
|
||||
import org.eclipse.jface.viewers.ISelection;
|
||||
import org.eclipse.ui.IWorkbenchWindow;
|
||||
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
|
||||
import org.eclipse.jface.dialogs.MessageDialog;
|
||||
|
||||
/**
|
||||
* Our sample action implements workbench action delegate.
|
||||
* The action proxy will be created by the workbench and
|
||||
* shown in the UI. When the user tries to use the action,
|
||||
* this delegate will be created and execution will be
|
||||
* delegated to it.
|
||||
* @see IWorkbenchWindowActionDelegate
|
||||
*/
|
||||
public class $className$ implements IWorkbenchWindowActionDelegate {
|
||||
private IWorkbenchWindow window;
|
||||
/**
|
||||
* The constructor.
|
||||
*/
|
||||
public $className$() {
|
||||
}
|
||||
|
||||
/**
|
||||
* The action has been activated. The argument of the
|
||||
* method represents the 'real' action sitting
|
||||
* in the workbench UI.
|
||||
* @see IWorkbenchWindowActionDelegate#run
|
||||
*/
|
||||
public void run(IAction action) {
|
||||
MessageDialog.openInformation(
|
||||
window.getShell(),
|
||||
"$pluginName$",
|
||||
"$message$");
|
||||
}
|
||||
|
||||
/**
|
||||
* Selection in the workbench has been changed. We
|
||||
* can change the state of the 'real' action here
|
||||
* if we want, but this can only happen after
|
||||
* the delegate has been created.
|
||||
* @see IWorkbenchWindowActionDelegate#selectionChanged
|
||||
*/
|
||||
public void selectionChanged(IAction action, ISelection selection) {
|
||||
}
|
||||
|
||||
/**
|
||||
* We can use this method to dispose of any system
|
||||
* resources we previously allocated.
|
||||
* @see IWorkbenchWindowActionDelegate#dispose
|
||||
*/
|
||||
public void dispose() {
|
||||
}
|
||||
|
||||
/**
|
||||
* We will cache window object in order to
|
||||
* be able to provide parent shell for the message dialog.
|
||||
* @see IWorkbenchWindowActionDelegate#init
|
||||
*/
|
||||
public void init(IWorkbenchWindow window) {
|
||||
this.window = window;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Main Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Main Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Sub Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Sub Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Sub Topic 2</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Sub Topic 2</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Main Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Main Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Sub Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Sub Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Sub Topic 2</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Sub Topic 2</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Main Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Main Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Main Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Main Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Sub Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Sub Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Sub Topic 2</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Sub Topic 2</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Main Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Main Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Sub Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Sub Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Sub Topic 2</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Sub Topic 2</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Sub Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Sub Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Main Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Main Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Sub Topic</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Sub Topic</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Sub Topic 2</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Sub Topic 2</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>Table of Contents</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Table of Contents</h1>
|
||||
Please enter your text here.
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?NLS TYPE="org.eclipse.help.toc"?>
|
||||
|
||||
<toc label="Concepts" link_to="toc.xml#concepts">
|
||||
<topic label="Main Topic" href="html/concepts/maintopic.html">
|
||||
<topic label="Sub Topic" href="html/concepts/subtopic.html" />
|
||||
</topic>
|
||||
<topic label="Main Topic 2">
|
||||
<topic label="Sub Topic 2" href="html/concepts/subtopic2.html" />
|
||||
</topic>
|
||||
</toc>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?NLS TYPE="org.eclipse.help.toc"?>
|
||||
|
||||
<toc label="Getting Started" link_to="toc.xml#gettingstarted">
|
||||
<topic label="Main Topic" href="html/gettingstarted/maintopic.html">
|
||||
<topic label="Sub Topic" href="html/gettingstarted/subtopic.html" />
|
||||
</topic>
|
||||
<topic label="Main Topic 2">
|
||||
<topic label="Sub Topic 2" href="html/gettingstarted/subtopic2.html" />
|
||||
</topic>
|
||||
</toc>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?NLS TYPE="org.eclipse.help.toc"?>
|
||||
|
||||
<toc label="Reference" link_to="toc.xml#reference">
|
||||
<topic label="Main Topic" href="html/reference/maintopic.html">
|
||||
<topic label="Sub Topic" href="html/reference/subtopic.html" />
|
||||
</topic>
|
||||
<topic label="Main Topic 2">
|
||||
<topic label="Sub Topic 2" href="html/reference/subtopic2.html" />
|
||||
</topic>
|
||||
</toc>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?NLS TYPE="org.eclipse.help.toc"?>
|
||||
|
||||
<toc label="Samples" link_to="toc.xml#samples">
|
||||
<topic label="Main Topic" href="html/samples/maintopic.html">
|
||||
<topic label="Sub Topic" href="html/samples/subtopic.html" />
|
||||
</topic>
|
||||
<topic label="Main Topic 2">
|
||||
<topic label="Sub Topic 2" href="html/samples/subtopic2.html" />
|
||||
</topic>
|
||||
</toc>
|
||||
@@ -0,0 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?NLS TYPE="org.eclipse.help.toc"?>
|
||||
|
||||
<toc label="Tasks" link_to="toc.xml#tasks">
|
||||
<topic label="Main Topic" href="html/tasks/maintopic.html">
|
||||
<topic label="Sub Topic" href="html/tasks/subtopic.html" />
|
||||
</topic>
|
||||
<topic label="Main Topic 2">
|
||||
<topic label="Sub Topic 2" href="html/tasks/subtopic2.html" />
|
||||
</topic>
|
||||
</toc>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?NLS TYPE="org.eclipse.help.toc"?>
|
||||
|
||||
<toc label="Test TOC" topic="html/toc.html">
|
||||
<link toc="toc.xml" />
|
||||
</toc>
|
||||
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?NLS TYPE="org.eclipse.help.toc"?>
|
||||
|
||||
%if isPrimary
|
||||
<toc label="$tocLabel$" topic="html/toc.html">
|
||||
%else
|
||||
<toc label="$tocLabel$">
|
||||
%endif
|
||||
%if isPrimary && gettingStarted
|
||||
<topic label="Getting Started">
|
||||
<anchor id="gettingstarted"/>
|
||||
</topic>
|
||||
%endif
|
||||
%if isPrimary && concepts
|
||||
<topic label="Concepts">
|
||||
<anchor id="concepts"/>
|
||||
</topic>
|
||||
%endif
|
||||
%if isPrimary && tasks
|
||||
<topic label="Tasks">
|
||||
<anchor id="tasks"/>
|
||||
</topic>
|
||||
%endif
|
||||
%if isPrimary && reference
|
||||
<topic label="Reference">
|
||||
<anchor id="reference"/>
|
||||
</topic>
|
||||
%endif
|
||||
%if isPrimary && samples
|
||||
<topic label="Samples">
|
||||
<anchor id="samples"/>
|
||||
</topic>
|
||||
%endif
|
||||
%if isPrimary && (gettingStarted || concepts || tasks || reference || samples)
|
||||
%else
|
||||
<topic label="Main Topic" href="html/maintopic.html">
|
||||
<topic label="Sub Topic" href="html/subtopic.html"/>
|
||||
</topic>
|
||||
<topic label="Main Topic 2"/>
|
||||
%endif
|
||||
</toc>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 983 B |
@@ -0,0 +1,102 @@
|
||||
package $packageName$;
|
||||
|
||||
|
||||
import org.eclipse.ui.IActionBars;
|
||||
import org.eclipse.ui.IEditorPart;
|
||||
import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
|
||||
import org.eclipse.ui.texteditor.ITextEditor;
|
||||
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
|
||||
import org.eclipse.ui.IWorkbenchActionConstants;
|
||||
import org.eclipse.jface.action.*;
|
||||
import org.eclipse.jface.dialogs.MessageDialog;
|
||||
import org.eclipse.ui.PlatformUI;
|
||||
import org.eclipse.ui.ISharedImages;
|
||||
|
||||
/**
|
||||
* Manages the installation/deinstallation of global actions for multi-page editors.
|
||||
* Responsible for the redirection of global actions to the active editor.
|
||||
* Multi-page contributor replaces the contributors for the individual editors in the multi-page editor.
|
||||
*/
|
||||
public class $contributorClassName$ extends MultiPageEditorActionBarContributor {
|
||||
private IEditorPart activeEditorPart;
|
||||
private Action sampleAction;
|
||||
/**
|
||||
* Creates a multi-page contributor.
|
||||
*/
|
||||
public $contributorClassName$() {
|
||||
super();
|
||||
createActions();
|
||||
}
|
||||
/**
|
||||
* Returns the action registed with the given text editor.
|
||||
* @return IAction or null if editor is null.
|
||||
*/
|
||||
protected IAction getAction(ITextEditor editor, String actionID) {
|
||||
return (editor == null ? null : editor.getAction(actionID));
|
||||
}
|
||||
/* (non-JavaDoc)
|
||||
* Method declared in AbstractMultiPageEditorActionBarContributor.
|
||||
*/
|
||||
|
||||
public void setActivePage(IEditorPart part) {
|
||||
if (activeEditorPart == part)
|
||||
return;
|
||||
|
||||
activeEditorPart = part;
|
||||
|
||||
IActionBars actionBars = getActionBars();
|
||||
if (actionBars != null) {
|
||||
|
||||
ITextEditor editor = (part instanceof ITextEditor) ? (ITextEditor) part : null;
|
||||
|
||||
actionBars.setGlobalActionHandler(
|
||||
IWorkbenchActionConstants.DELETE,
|
||||
getAction(editor, ITextEditorActionConstants.DELETE));
|
||||
actionBars.setGlobalActionHandler(
|
||||
IWorkbenchActionConstants.UNDO,
|
||||
getAction(editor, ITextEditorActionConstants.UNDO));
|
||||
actionBars.setGlobalActionHandler(
|
||||
IWorkbenchActionConstants.REDO,
|
||||
getAction(editor, ITextEditorActionConstants.REDO));
|
||||
actionBars.setGlobalActionHandler(
|
||||
IWorkbenchActionConstants.CUT,
|
||||
getAction(editor, ITextEditorActionConstants.CUT));
|
||||
actionBars.setGlobalActionHandler(
|
||||
IWorkbenchActionConstants.COPY,
|
||||
getAction(editor, ITextEditorActionConstants.COPY));
|
||||
actionBars.setGlobalActionHandler(
|
||||
IWorkbenchActionConstants.PASTE,
|
||||
getAction(editor, ITextEditorActionConstants.PASTE));
|
||||
actionBars.setGlobalActionHandler(
|
||||
IWorkbenchActionConstants.SELECT_ALL,
|
||||
getAction(editor, ITextEditorActionConstants.SELECT_ALL));
|
||||
actionBars.setGlobalActionHandler(
|
||||
IWorkbenchActionConstants.FIND,
|
||||
getAction(editor, ITextEditorActionConstants.FIND));
|
||||
actionBars.setGlobalActionHandler(
|
||||
IWorkbenchActionConstants.BOOKMARK,
|
||||
getAction(editor, ITextEditorActionConstants.BOOKMARK));
|
||||
actionBars.updateActionBars();
|
||||
}
|
||||
}
|
||||
private void createActions() {
|
||||
sampleAction = new Action() {
|
||||
public void run() {
|
||||
MessageDialog.openInformation(null, "$pluginName$", "Sample Action Executed");
|
||||
}
|
||||
};
|
||||
sampleAction.setText("Sample Action");
|
||||
sampleAction.setToolTipText("Sample Action tool tip");
|
||||
sampleAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
|
||||
getImageDescriptor(ISharedImages.IMG_OBJS_TASK_TSK));
|
||||
}
|
||||
public void contributeToMenu(IMenuManager manager) {
|
||||
IMenuManager menu = new MenuManager("Editor &Menu");
|
||||
manager.prependToGroup(IWorkbenchActionConstants.MB_ADDITIONS, menu);
|
||||
menu.add(sampleAction);
|
||||
}
|
||||
public void contributeToToolBar(IToolBarManager manager) {
|
||||
manager.add(new Separator());
|
||||
manager.add(sampleAction);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,238 @@
|
||||
package $packageName$;
|
||||
|
||||
|
||||
import java.io.StringWriter;
|
||||
import java.text.Collator;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import org.eclipse.core.resources.IMarker;
|
||||
import org.eclipse.core.resources.IResourceChangeEvent;
|
||||
import org.eclipse.core.resources.IResourceChangeListener;
|
||||
import org.eclipse.core.resources.ResourcesPlugin;
|
||||
import org.eclipse.core.runtime.IProgressMonitor;
|
||||
import org.eclipse.jface.dialogs.ErrorDialog;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.custom.StyledText;
|
||||
import org.eclipse.swt.events.SelectionAdapter;
|
||||
import org.eclipse.swt.events.SelectionEvent;
|
||||
import org.eclipse.swt.graphics.Font;
|
||||
import org.eclipse.swt.graphics.FontData;
|
||||
import org.eclipse.swt.layout.FillLayout;
|
||||
import org.eclipse.swt.layout.GridData;
|
||||
import org.eclipse.swt.layout.GridLayout;
|
||||
import org.eclipse.swt.widgets.Button;
|
||||
import org.eclipse.swt.widgets.Composite;
|
||||
import org.eclipse.swt.widgets.Display;
|
||||
import org.eclipse.swt.widgets.FontDialog;
|
||||
import org.eclipse.ui.*;
|
||||
import org.eclipse.ui.editors.text.TextEditor;
|
||||
import org.eclipse.ui.part.FileEditorInput;
|
||||
import org.eclipse.ui.part.MultiPageEditorPart;
|
||||
|
||||
/**
|
||||
* An example showing how to create a multi-page editor.
|
||||
* This example has 3 pages:
|
||||
* <ul>
|
||||
* <li>page 0 contains a nested text editor.
|
||||
* <li>page 1 allows you to change the font used in page 2
|
||||
* <li>page 2 shows the words in page 0 in sorted order
|
||||
* </ul>
|
||||
*/
|
||||
public class $editorClassName$ extends MultiPageEditorPart implements IResourceChangeListener{
|
||||
|
||||
/** The text editor used in page 0. */
|
||||
private TextEditor editor;
|
||||
|
||||
/** The font chosen in page 1. */
|
||||
private Font font;
|
||||
|
||||
/** The text widget used in page 2. */
|
||||
private StyledText text;
|
||||
/**
|
||||
* Creates a multi-page editor example.
|
||||
*/
|
||||
public $editorClassName$() {
|
||||
super();
|
||||
ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
|
||||
}
|
||||
/**
|
||||
* Creates page 0 of the multi-page editor,
|
||||
* which contains a text editor.
|
||||
*/
|
||||
void createPage0() {
|
||||
try {
|
||||
editor = new TextEditor();
|
||||
int index = addPage(editor, getEditorInput());
|
||||
setPageText(index, editor.getTitle());
|
||||
} catch (PartInitException e) {
|
||||
ErrorDialog.openError(
|
||||
getSite().getShell(),
|
||||
"Error creating nested text editor",
|
||||
null,
|
||||
e.getStatus());
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Creates page 1 of the multi-page editor,
|
||||
* which allows you to change the font used in page 2.
|
||||
*/
|
||||
void createPage1() {
|
||||
|
||||
Composite composite = new Composite(getContainer(), SWT.NONE);
|
||||
GridLayout layout = new GridLayout();
|
||||
composite.setLayout(layout);
|
||||
layout.numColumns = 2;
|
||||
|
||||
Button fontButton = new Button(composite, SWT.NONE);
|
||||
GridData gd = new GridData(GridData.BEGINNING);
|
||||
gd.horizontalSpan = 2;
|
||||
fontButton.setLayoutData(gd);
|
||||
fontButton.setText("Change Font...");
|
||||
|
||||
fontButton.addSelectionListener(new SelectionAdapter() {
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
setFont();
|
||||
}
|
||||
});
|
||||
|
||||
int index = addPage(composite);
|
||||
setPageText(index, "Properties");
|
||||
}
|
||||
/**
|
||||
* Creates page 2 of the multi-page editor,
|
||||
* which shows the sorted text.
|
||||
*/
|
||||
void createPage2() {
|
||||
Composite composite = new Composite(getContainer(), SWT.NONE);
|
||||
FillLayout layout = new FillLayout();
|
||||
composite.setLayout(layout);
|
||||
text = new StyledText(composite, SWT.H_SCROLL | SWT.V_SCROLL);
|
||||
text.setEditable(false);
|
||||
|
||||
int index = addPage(composite);
|
||||
setPageText(index, "Preview");
|
||||
}
|
||||
/**
|
||||
* Creates the pages of the multi-page editor.
|
||||
*/
|
||||
protected void createPages() {
|
||||
createPage0();
|
||||
createPage1();
|
||||
createPage2();
|
||||
}
|
||||
/**
|
||||
* The <code>MultiPageEditorPart</code> implementation of this
|
||||
* <code>IWorkbenchPart</code> method disposes all nested editors.
|
||||
* Subclasses may extend.
|
||||
*/
|
||||
public void dispose() {
|
||||
ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
|
||||
super.dispose();
|
||||
}
|
||||
/**
|
||||
* Saves the multi-page editor's document.
|
||||
*/
|
||||
public void doSave(IProgressMonitor monitor) {
|
||||
getEditor(0).doSave(monitor);
|
||||
}
|
||||
/**
|
||||
* Saves the multi-page editor's document as another file.
|
||||
* Also updates the text for page 0's tab, and updates this multi-page editor's input
|
||||
* to correspond to the nested editor's.
|
||||
*/
|
||||
public void doSaveAs() {
|
||||
IEditorPart editor = getEditor(0);
|
||||
editor.doSaveAs();
|
||||
setPageText(0, editor.getTitle());
|
||||
setInput(editor.getEditorInput());
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* Method declared on IEditorPart
|
||||
*/
|
||||
public void gotoMarker(IMarker marker) {
|
||||
setActivePage(0);
|
||||
getEditor(0).gotoMarker(marker);
|
||||
}
|
||||
/**
|
||||
* The <code>MultiPageEditorExample</code> implementation of this method
|
||||
* checks that the input is an instance of <code>IFileEditorInput</code>.
|
||||
*/
|
||||
public void init(IEditorSite site, IEditorInput editorInput)
|
||||
throws PartInitException {
|
||||
if (!(editorInput instanceof IFileEditorInput))
|
||||
throw new PartInitException("Invalid Input: Must be IFileEditorInput");
|
||||
super.init(site, editorInput);
|
||||
}
|
||||
/* (non-Javadoc)
|
||||
* Method declared on IEditorPart.
|
||||
*/
|
||||
public boolean isSaveAsAllowed() {
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Calculates the contents of page 2 when the it is activated.
|
||||
*/
|
||||
protected void pageChange(int newPageIndex) {
|
||||
super.pageChange(newPageIndex);
|
||||
if (newPageIndex == 2) {
|
||||
sortWords();
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Closes all project files on project close.
|
||||
*/
|
||||
public void resourceChanged(final IResourceChangeEvent event){
|
||||
if(event.getType() == IResourceChangeEvent.PRE_CLOSE){
|
||||
Display.getDefault().asyncExec(new Runnable(){
|
||||
public void run(){
|
||||
IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages();
|
||||
for (int i = 0; i<pages.length; i++){
|
||||
if(((FileEditorInput)editor.getEditorInput()).getFile().getProject().equals(event.getResource())){
|
||||
IEditorPart editorPart = pages[i].findEditor((FileEditorInput)editor.getEditorInput());
|
||||
pages[i].closeEditor(editorPart,true);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Sets the font related data to be applied to the text in page 2.
|
||||
*/
|
||||
void setFont() {
|
||||
FontDialog fontDialog = new FontDialog(getSite().getShell());
|
||||
fontDialog.setFontList(text.getFont().getFontData());
|
||||
FontData fontData = fontDialog.open();
|
||||
if (fontData != null) {
|
||||
if (font != null)
|
||||
font.dispose();
|
||||
font = new Font(text.getDisplay(), fontData);
|
||||
text.setFont(font);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Sorts the words in page 0, and shows them in page 2.
|
||||
*/
|
||||
void sortWords() {
|
||||
|
||||
String editorText =
|
||||
editor.getDocumentProvider().getDocument(editor.getEditorInput()).get();
|
||||
|
||||
StringTokenizer tokenizer =
|
||||
new StringTokenizer(editorText, " \t\n\r\f!@#\u0024%^&*()-_=+`~[]{};:'\",.<>/?|\\");
|
||||
ArrayList editorWords = new ArrayList();
|
||||
while (tokenizer.hasMoreTokens()) {
|
||||
editorWords.add(tokenizer.nextToken());
|
||||
}
|
||||
|
||||
Collections.sort(editorWords, Collator.getInstance());
|
||||
StringWriter displayText = new StringWriter();
|
||||
for (int i = 0; i < editorWords.size(); i++) {
|
||||
displayText.write(((String) editorWords.get(i)));
|
||||
displayText.write(System.getProperty("line.separator"));
|
||||
}
|
||||
text.setText(displayText.toString());
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 983 B |
@@ -0,0 +1,149 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||
import org.eclipse.jface.wizard.Wizard;
|
||||
import org.eclipse.ui.INewWizard;
|
||||
import org.eclipse.ui.IWorkbench;
|
||||
import org.eclipse.core.runtime.*;
|
||||
import org.eclipse.jface.operation.*;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import org.eclipse.jface.dialogs.MessageDialog;
|
||||
import org.eclipse.jface.viewers.ISelection;
|
||||
import org.eclipse.core.resources.*;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import java.io.*;
|
||||
import org.eclipse.ui.*;
|
||||
|
||||
/**
|
||||
* This is a sample new wizard. Its role is to create a new file
|
||||
* resource in the provided container. If the container resource
|
||||
* (a folder or a project) is selected in the workspace
|
||||
* when the wizard is opened, it will accept it as the target
|
||||
* container. The wizard creates one file with the extension
|
||||
* "$extension$". If a sample multi-page editor (also available
|
||||
* as a template) is registered for the same extension, it will
|
||||
* be able to open it.
|
||||
*/
|
||||
|
||||
public class $wizardClassName$ extends Wizard implements INewWizard {
|
||||
private $wizardPageClassName$ page;
|
||||
private ISelection selection;
|
||||
|
||||
/**
|
||||
* Constructor for $wizardClassName$.
|
||||
*/
|
||||
public $wizardClassName$() {
|
||||
super();
|
||||
setNeedsProgressMonitor(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adding the page to the wizard.
|
||||
*/
|
||||
|
||||
public void addPages() {
|
||||
page = new $wizardPageClassName$(selection);
|
||||
addPage(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called when 'Finish' button is pressed in
|
||||
* the wizard. We will create an operation and run it
|
||||
* using wizard as execution context.
|
||||
*/
|
||||
public boolean performFinish() {
|
||||
final String containerName = page.getContainerName();
|
||||
final String fileName = page.getFileName();
|
||||
IRunnableWithProgress op = new IRunnableWithProgress() {
|
||||
public void run(IProgressMonitor monitor) throws InvocationTargetException {
|
||||
try {
|
||||
doFinish(containerName, fileName, monitor);
|
||||
} catch (CoreException e) {
|
||||
throw new InvocationTargetException(e);
|
||||
} finally {
|
||||
monitor.done();
|
||||
}
|
||||
}
|
||||
};
|
||||
try {
|
||||
getContainer().run(true, false, op);
|
||||
} catch (InterruptedException e) {
|
||||
return false;
|
||||
} catch (InvocationTargetException e) {
|
||||
Throwable realException = e.getTargetException();
|
||||
MessageDialog.openError(getShell(), "Error", realException.getMessage());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* The worker method. It will find the container, create the
|
||||
* file if missing or just replace its contents, and open
|
||||
* the editor on the newly created file.
|
||||
*/
|
||||
|
||||
private void doFinish(
|
||||
String containerName,
|
||||
String fileName,
|
||||
IProgressMonitor monitor)
|
||||
throws CoreException {
|
||||
// create a sample file
|
||||
monitor.beginTask("Creating " + fileName, 2);
|
||||
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
|
||||
IResource resource = root.findMember(new Path(containerName));
|
||||
if (!resource.exists() || !(resource instanceof IContainer)) {
|
||||
throwCoreException("Container \"" + containerName + "\" does not exist.");
|
||||
}
|
||||
IContainer container = (IContainer) resource;
|
||||
final IFile file = container.getFile(new Path(fileName));
|
||||
try {
|
||||
InputStream stream = openContentStream();
|
||||
if (file.exists()) {
|
||||
file.setContents(stream, true, true, monitor);
|
||||
} else {
|
||||
file.create(stream, true, monitor);
|
||||
}
|
||||
stream.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
monitor.worked(1);
|
||||
monitor.setTaskName("Opening file for editing...");
|
||||
getShell().getDisplay().asyncExec(new Runnable() {
|
||||
public void run() {
|
||||
IWorkbenchPage page =
|
||||
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
|
||||
try {
|
||||
page.openEditor(file);
|
||||
} catch (PartInitException e) {
|
||||
}
|
||||
}
|
||||
});
|
||||
monitor.worked(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* We will initialize file contents with a sample text.
|
||||
*/
|
||||
|
||||
private InputStream openContentStream() {
|
||||
String contents =
|
||||
"This is the initial file contents for *.$extension$ file that should be word-sorted in the Preview page of the multi-page editor";
|
||||
return new ByteArrayInputStream(contents.getBytes());
|
||||
}
|
||||
|
||||
private void throwCoreException(String message) throws CoreException {
|
||||
IStatus status =
|
||||
new Status(IStatus.ERROR, "$pluginId$", IStatus.OK, message, null);
|
||||
throw new CoreException(status);
|
||||
}
|
||||
|
||||
/**
|
||||
* We will accept the selection in the workbench to see if
|
||||
* we can initialize from it.
|
||||
* @see IWorkbenchWizard#init(IWorkbench, IStructuredSelection)
|
||||
*/
|
||||
public void init(IWorkbench workbench, IStructuredSelection selection) {
|
||||
this.selection = selection;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,160 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.wizard.WizardPage;
|
||||
import org.eclipse.swt.widgets.*;
|
||||
import org.eclipse.swt.layout.*;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.core.resources.*;
|
||||
import org.eclipse.core.runtime.Path;
|
||||
import org.eclipse.swt.events.*;
|
||||
import org.eclipse.ui.dialogs.ContainerSelectionDialog;
|
||||
import org.eclipse.jface.viewers.*;
|
||||
|
||||
/**
|
||||
* The "New" wizard page allows setting the container for
|
||||
* the new file as well as the file name. The page
|
||||
* will only accept file name without the extension OR
|
||||
* with the extension that matches the expected one ($extension$).
|
||||
*/
|
||||
|
||||
public class $wizardPageClassName$ extends WizardPage {
|
||||
private Text containerText;
|
||||
private Text fileText;
|
||||
private ISelection selection;
|
||||
|
||||
/**
|
||||
* Constructor for SampleNewWizardPage.
|
||||
* @param pageName
|
||||
*/
|
||||
public $wizardPageClassName$(ISelection selection) {
|
||||
super("wizardPage");
|
||||
setTitle("Multi-page Editor File");
|
||||
setDescription("This wizard creates a new file with *.$extension$ extension that can be opened by a multi-page editor.");
|
||||
this.selection = selection;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see IDialogPage#createControl(Composite)
|
||||
*/
|
||||
public void createControl(Composite parent) {
|
||||
Composite container = new Composite(parent, SWT.NULL);
|
||||
GridLayout layout = new GridLayout();
|
||||
container.setLayout(layout);
|
||||
layout.numColumns = 3;
|
||||
layout.verticalSpacing = 9;
|
||||
Label label = new Label(container, SWT.NULL);
|
||||
label.setText("&Container:");
|
||||
|
||||
containerText = new Text(container, SWT.BORDER | SWT.SINGLE);
|
||||
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
|
||||
containerText.setLayoutData(gd);
|
||||
containerText.addModifyListener(new ModifyListener() {
|
||||
public void modifyText(ModifyEvent e) {
|
||||
dialogChanged();
|
||||
}
|
||||
});
|
||||
|
||||
Button button = new Button(container, SWT.PUSH);
|
||||
button.setText("Browse...");
|
||||
button.addSelectionListener(new SelectionAdapter() {
|
||||
public void widgetSelected(SelectionEvent e) {
|
||||
handleBrowse();
|
||||
}
|
||||
});
|
||||
label = new Label(container, SWT.NULL);
|
||||
label.setText("&File name:");
|
||||
|
||||
fileText = new Text(container, SWT.BORDER | SWT.SINGLE);
|
||||
gd = new GridData(GridData.FILL_HORIZONTAL);
|
||||
fileText.setLayoutData(gd);
|
||||
fileText.addModifyListener(new ModifyListener() {
|
||||
public void modifyText(ModifyEvent e) {
|
||||
dialogChanged();
|
||||
}
|
||||
});
|
||||
initialize();
|
||||
dialogChanged();
|
||||
setControl(container);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests if the current workbench selection is a suitable
|
||||
* container to use.
|
||||
*/
|
||||
|
||||
private void initialize() {
|
||||
if (selection!=null && selection.isEmpty()==false && selection instanceof IStructuredSelection) {
|
||||
IStructuredSelection ssel = (IStructuredSelection)selection;
|
||||
if (ssel.size()>1) return;
|
||||
Object obj = ssel.getFirstElement();
|
||||
if (obj instanceof IResource) {
|
||||
IContainer container;
|
||||
if (obj instanceof IContainer)
|
||||
container = (IContainer)obj;
|
||||
else
|
||||
container = ((IResource)obj).getParent();
|
||||
containerText.setText(container.getFullPath().toString());
|
||||
}
|
||||
}
|
||||
fileText.setText("$initialFileName$");
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses the standard container selection dialog to
|
||||
* choose the new value for the container field.
|
||||
*/
|
||||
|
||||
private void handleBrowse() {
|
||||
ContainerSelectionDialog dialog =
|
||||
new ContainerSelectionDialog(
|
||||
getShell(),
|
||||
ResourcesPlugin.getWorkspace().getRoot(),
|
||||
false,
|
||||
"Select new file container");
|
||||
if (dialog.open() == ContainerSelectionDialog.OK) {
|
||||
Object[] result = dialog.getResult();
|
||||
if (result.length == 1) {
|
||||
containerText.setText(((Path)result[0]).toOSString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures that both text fields are set.
|
||||
*/
|
||||
|
||||
private void dialogChanged() {
|
||||
String container = getContainerName();
|
||||
String fileName = getFileName();
|
||||
|
||||
if (container.length() == 0) {
|
||||
updateStatus("File container must be specified");
|
||||
return;
|
||||
}
|
||||
if (fileName.length() == 0) {
|
||||
updateStatus("File name must be specified");
|
||||
return;
|
||||
}
|
||||
int dotLoc = fileName.lastIndexOf('.');
|
||||
if (dotLoc != -1) {
|
||||
String ext = fileName.substring(dotLoc + 1);
|
||||
if (ext.equalsIgnoreCase("$extension$") == false) {
|
||||
updateStatus("File extension must be \"$extension$\"");
|
||||
return;
|
||||
}
|
||||
}
|
||||
updateStatus(null);
|
||||
}
|
||||
|
||||
private void updateStatus(String message) {
|
||||
setErrorMessage(message);
|
||||
setPageComplete(message == null);
|
||||
}
|
||||
|
||||
public String getContainerName() {
|
||||
return containerText.getText();
|
||||
}
|
||||
public String getFileName() {
|
||||
return fileText.getText();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.action.IAction;
|
||||
import org.eclipse.jface.dialogs.MessageDialog;
|
||||
import org.eclipse.jface.viewers.ISelection;
|
||||
import org.eclipse.swt.widgets.Shell;
|
||||
import org.eclipse.ui.IObjectActionDelegate;
|
||||
import org.eclipse.ui.IWorkbenchPart;
|
||||
|
||||
public class $actionClass$ implements IObjectActionDelegate {
|
||||
|
||||
/**
|
||||
* Constructor for Action1.
|
||||
*/
|
||||
public $actionClass$() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
|
||||
*/
|
||||
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @see IActionDelegate#run(IAction)
|
||||
*/
|
||||
public void run(IAction action) {
|
||||
Shell shell = new Shell();
|
||||
MessageDialog.openInformation(
|
||||
shell,
|
||||
"$pluginName$",
|
||||
"$actionLabel$ was executed.");
|
||||
}
|
||||
|
||||
/**
|
||||
* @see IActionDelegate#selectionChanged(IAction, ISelection)
|
||||
*/
|
||||
public void selectionChanged(IAction action, ISelection selection) {
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.jface.preference.*;
|
||||
import org.eclipse.ui.IWorkbenchPreferencePage;
|
||||
import org.eclipse.ui.IWorkbench;
|
||||
import $fullPluginClassName$;
|
||||
import org.eclipse.jface.preference.IPreferenceStore;
|
||||
|
||||
/**
|
||||
* This class represents a preference page that
|
||||
* is contributed to the Preferences dialog. By
|
||||
* subclassing <samp>FieldEditorPreferencePage</samp>, we
|
||||
* can use the field support built into JFace that allows
|
||||
* us to create a page that is small and knows how to
|
||||
* save, restore and apply itself.
|
||||
* <p>
|
||||
* This page is used to modify preferences only. They
|
||||
* are stored in the preference store that belongs to
|
||||
* the main plug-in class. That way, preferences can
|
||||
* be accessed directly via the preference store.
|
||||
*/
|
||||
|
||||
%Options in the template
|
||||
%hasDefault
|
||||
|
||||
public class $pageClassName$
|
||||
extends FieldEditorPreferencePage
|
||||
implements IWorkbenchPreferencePage {
|
||||
public static final String P_PATH = "pathPreference";
|
||||
public static final String P_BOOLEAN = "booleanPreference";
|
||||
public static final String P_CHOICE = "choicePreference";
|
||||
public static final String P_STRING = "stringPreference";
|
||||
|
||||
public $pageClassName$() {
|
||||
super(GRID);
|
||||
%if hasDefault
|
||||
setPreferenceStore($pluginClassName$.getDefault().getPreferenceStore());
|
||||
%else
|
||||
setPreferenceStore($pluginClassName$.getDefault().getPreferenceStore());
|
||||
%endif
|
||||
setDescription("A demonstration of a preference page implementation");
|
||||
initializeDefaults();
|
||||
}
|
||||
/**
|
||||
* Sets the default values of the preferences.
|
||||
*/
|
||||
private void initializeDefaults() {
|
||||
IPreferenceStore store = getPreferenceStore();
|
||||
store.setDefault(P_BOOLEAN, true);
|
||||
store.setDefault(P_CHOICE, "choice2");
|
||||
store.setDefault(P_STRING, "Default value");
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the field editors. Field editors are abstractions of
|
||||
* the common GUI blocks needed to manipulate various types
|
||||
* of preferences. Each field editor knows how to save and
|
||||
* restore itself.
|
||||
*/
|
||||
|
||||
public void createFieldEditors() {
|
||||
addField(new DirectoryFieldEditor(P_PATH,
|
||||
"&Directory preference:", getFieldEditorParent()));
|
||||
addField(
|
||||
new BooleanFieldEditor(
|
||||
P_BOOLEAN,
|
||||
"&An example of a boolean preference",
|
||||
getFieldEditorParent()));
|
||||
|
||||
addField(new RadioGroupFieldEditor(
|
||||
P_CHOICE,
|
||||
"An example of a multiple-choice preference",
|
||||
1,
|
||||
new String[][] { { "&Choice 1", "choice1" }, {
|
||||
"C&hoice 2", "choice2" }
|
||||
}, getFieldEditorParent()));
|
||||
addField(
|
||||
new StringFieldEditor(P_STRING, "A &text preference:", getFieldEditorParent()));
|
||||
}
|
||||
|
||||
public void init(IWorkbench workbench) {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
package $packageName$;
|
||||
|
||||
import org.eclipse.core.resources.IResource;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.core.runtime.QualifiedName;
|
||||
import org.eclipse.swt.SWT;
|
||||
import org.eclipse.swt.layout.GridData;
|
||||
import org.eclipse.swt.layout.GridLayout;
|
||||
import org.eclipse.swt.widgets.Composite;
|
||||
import org.eclipse.swt.widgets.Control;
|
||||
import org.eclipse.swt.widgets.Label;
|
||||
import org.eclipse.swt.widgets.Text;
|
||||
import org.eclipse.ui.dialogs.PropertyPage;
|
||||
|
||||
public class $className$ extends PropertyPage {
|
||||
|
||||
private static final String PATH_TITLE = "Path:";
|
||||
private static final String OWNER_TITLE = "&Owner:";
|
||||
private static final String OWNER_PROPERTY = "OWNER";
|
||||
private static final String DEFAULT_OWNER = "John Doe";
|
||||
|
||||
private static final int TEXT_FIELD_WIDTH = 50;
|
||||
|
||||
private Text ownerText;
|
||||
|
||||
/**
|
||||
* Constructor for SamplePropertyPage.
|
||||
*/
|
||||
public $className$() {
|
||||
super();
|
||||
}
|
||||
|
||||
private void addFirstSection(Composite parent) {
|
||||
Composite composite = createDefaultComposite(parent);
|
||||
|
||||
//Label for path field
|
||||
Label pathLabel = new Label(composite, SWT.NONE);
|
||||
pathLabel.setText(PATH_TITLE);
|
||||
|
||||
// Path text field
|
||||
Text pathValueText = new Text(composite, SWT.WRAP | SWT.READ_ONLY);
|
||||
pathValueText.setText(((IResource) getElement()).getFullPath().toString());
|
||||
}
|
||||
|
||||
private void addSeparator(Composite parent) {
|
||||
Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
|
||||
GridData gridData = new GridData();
|
||||
gridData.horizontalAlignment = GridData.FILL;
|
||||
gridData.grabExcessHorizontalSpace = true;
|
||||
separator.setLayoutData(gridData);
|
||||
}
|
||||
|
||||
private void addSecondSection(Composite parent) {
|
||||
Composite composite = createDefaultComposite(parent);
|
||||
|
||||
// Label for owner field
|
||||
Label ownerLabel = new Label(composite, SWT.NONE);
|
||||
ownerLabel.setText(OWNER_TITLE);
|
||||
|
||||
// Owner text field
|
||||
ownerText = new Text(composite, SWT.SINGLE | SWT.BORDER);
|
||||
GridData gd = new GridData();
|
||||
gd.widthHint = convertWidthInCharsToPixels(TEXT_FIELD_WIDTH);
|
||||
ownerText.setLayoutData(gd);
|
||||
|
||||
// Populate owner text field
|
||||
try {
|
||||
String owner =
|
||||
((IResource) getElement()).getPersistentProperty(
|
||||
new QualifiedName("", OWNER_PROPERTY));
|
||||
ownerText.setText((owner != null) ? owner : DEFAULT_OWNER);
|
||||
} catch (CoreException e) {
|
||||
ownerText.setText(DEFAULT_OWNER);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see PreferencePage#createContents(Composite)
|
||||
*/
|
||||
protected Control createContents(Composite parent) {
|
||||
Composite composite = new Composite(parent, SWT.NONE);
|
||||
GridLayout layout = new GridLayout();
|
||||
composite.setLayout(layout);
|
||||
GridData data = new GridData(GridData.FILL);
|
||||
data.grabExcessHorizontalSpace = true;
|
||||
composite.setLayoutData(data);
|
||||
|
||||
addFirstSection(composite);
|
||||
addSeparator(composite);
|
||||
addSecondSection(composite);
|
||||
return composite;
|
||||
}
|
||||
|
||||
private Composite createDefaultComposite(Composite parent) {
|
||||
Composite composite = new Composite(parent, SWT.NULL);
|
||||
GridLayout layout = new GridLayout();
|
||||
layout.numColumns = 2;
|
||||
composite.setLayout(layout);
|
||||
|
||||
GridData data = new GridData();
|
||||
data.verticalAlignment = GridData.FILL;
|
||||
data.horizontalAlignment = GridData.FILL;
|
||||
composite.setLayoutData(data);
|
||||
|
||||
return composite;
|
||||
}
|
||||
|
||||
protected void performDefaults() {
|
||||
// Populate the owner text field with the default value
|
||||
ownerText.setText(DEFAULT_OWNER);
|
||||
}
|
||||
|
||||
public boolean performOk() {
|
||||
// store the value in the owner text field
|
||||
try {
|
||||
((IResource) getElement()).setPersistentProperty(
|
||||
new QualifiedName("", OWNER_PROPERTY),
|
||||
ownerText.getText());
|
||||
} catch (CoreException e) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 983 B |
@@ -0,0 +1,384 @@
|
||||
package $packageName$;
|
||||
|
||||
% if viewType =="treeViewer"
|
||||
import java.util.ArrayList;
|
||||
% endif
|
||||
|
||||
import org.eclipse.swt.widgets.Composite;
|
||||
import org.eclipse.ui.part.*;
|
||||
import org.eclipse.jface.viewers.*;
|
||||
import org.eclipse.swt.graphics.Image;
|
||||
import org.eclipse.jface.action.*;
|
||||
import org.eclipse.jface.dialogs.MessageDialog;
|
||||
import org.eclipse.ui.*;
|
||||
import org.eclipse.swt.widgets.Menu;
|
||||
import org.eclipse.swt.SWT;
|
||||
% if viewType == "treeViewer"
|
||||
import org.eclipse.core.runtime.IAdaptable;
|
||||
% endif
|
||||
|
||||
|
||||
/**
|
||||
* This sample class demonstrates how to plug-in a new
|
||||
* workbench view. The view shows data obtained from the
|
||||
* model. The sample creates a dummy model on the fly,
|
||||
* but a real implementation would connect to the model
|
||||
* available either in this or another plug-in (e.g. the workspace).
|
||||
* The view is connected to the model using a content provider.
|
||||
* <p>
|
||||
* The view uses a label provider to define how model
|
||||
* objects should be presented in the view. Each
|
||||
* view can present the same model objects using
|
||||
* different labels and icons, if needed. Alternatively,
|
||||
* a single label provider can be shared between views
|
||||
* in order to ensure that objects of the same type are
|
||||
* presented in the same way everywhere.
|
||||
* <p>
|
||||
*/
|
||||
% Options in the template:
|
||||
%
|
||||
% packageName
|
||||
% className
|
||||
% viewName
|
||||
% viewCategoryId
|
||||
% viewCategoryName
|
||||
% viewType
|
||||
% doubleClick
|
||||
% popup
|
||||
% localToolbar
|
||||
% localPulldown
|
||||
% sorter
|
||||
% filter
|
||||
% drillDown
|
||||
|
||||
public class $className$ extends ViewPart {
|
||||
%if viewType == "tableViewer"
|
||||
private TableViewer viewer;
|
||||
%else
|
||||
% if viewType == "treeViewer"
|
||||
private TreeViewer viewer;
|
||||
private DrillDownAdapter drillDownAdapter;
|
||||
% endif
|
||||
%endif
|
||||
%if (localToolbar || localPulldown || popup)
|
||||
private Action action1;
|
||||
private Action action2;
|
||||
%endif
|
||||
%if doubleClick
|
||||
private Action doubleClickAction;
|
||||
%endif
|
||||
|
||||
/*
|
||||
* The content provider class is responsible for
|
||||
* providing objects to the view. It can wrap
|
||||
* existing objects in adapters or simply return
|
||||
* objects as-is. These objects may be sensitive
|
||||
* to the current input of the view, or ignore
|
||||
* it and always show the same content
|
||||
* (like Task List, for example).
|
||||
*/
|
||||
|
||||
%if viewType == "tableViewer"
|
||||
class ViewContentProvider implements IStructuredContentProvider {
|
||||
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
|
||||
}
|
||||
public void dispose() {
|
||||
}
|
||||
public Object[] getElements(Object parent) {
|
||||
return new String[] { "One", "Two", "Three" };
|
||||
}
|
||||
}
|
||||
%else
|
||||
% if viewType =="treeViewer"
|
||||
class TreeObject implements IAdaptable {
|
||||
private String name;
|
||||
private TreeParent parent;
|
||||
|
||||
public TreeObject(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
public void setParent(TreeParent parent) {
|
||||
this.parent = parent;
|
||||
}
|
||||
public TreeParent getParent() {
|
||||
return parent;
|
||||
}
|
||||
public String toString() {
|
||||
return getName();
|
||||
}
|
||||
public Object getAdapter(Class key) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class TreeParent extends TreeObject {
|
||||
private ArrayList children;
|
||||
public TreeParent(String name) {
|
||||
super(name);
|
||||
children = new ArrayList();
|
||||
}
|
||||
public void addChild(TreeObject child) {
|
||||
children.add(child);
|
||||
child.setParent(this);
|
||||
}
|
||||
public void removeChild(TreeObject child) {
|
||||
children.remove(child);
|
||||
child.setParent(null);
|
||||
}
|
||||
public TreeObject [] getChildren() {
|
||||
return (TreeObject [])children.toArray(new TreeObject[children.size()]);
|
||||
}
|
||||
public boolean hasChildren() {
|
||||
return children.size()>0;
|
||||
}
|
||||
}
|
||||
|
||||
class ViewContentProvider implements IStructuredContentProvider,
|
||||
ITreeContentProvider {
|
||||
private TreeParent invisibleRoot;
|
||||
|
||||
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
|
||||
}
|
||||
public void dispose() {
|
||||
}
|
||||
public Object[] getElements(Object parent) {
|
||||
if (parent.equals(getViewSite())) {
|
||||
if (invisibleRoot==null) initialize();
|
||||
return getChildren(invisibleRoot);
|
||||
}
|
||||
return getChildren(parent);
|
||||
}
|
||||
public Object getParent(Object child) {
|
||||
if (child instanceof TreeObject) {
|
||||
return ((TreeObject)child).getParent();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
public Object [] getChildren(Object parent) {
|
||||
if (parent instanceof TreeParent) {
|
||||
return ((TreeParent)parent).getChildren();
|
||||
}
|
||||
return new Object[0];
|
||||
}
|
||||
public boolean hasChildren(Object parent) {
|
||||
if (parent instanceof TreeParent)
|
||||
return ((TreeParent)parent).hasChildren();
|
||||
return false;
|
||||
}
|
||||
/*
|
||||
* We will set up a dummy model to initialize tree heararchy.
|
||||
* In a real code, you will connect to a real model and
|
||||
* expose its hierarchy.
|
||||
*/
|
||||
private void initialize() {
|
||||
TreeObject to1 = new TreeObject("Leaf 1");
|
||||
TreeObject to2 = new TreeObject("Leaf 2");
|
||||
TreeObject to3 = new TreeObject("Leaf 3");
|
||||
TreeParent p1 = new TreeParent("Parent 1");
|
||||
p1.addChild(to1);
|
||||
p1.addChild(to2);
|
||||
p1.addChild(to3);
|
||||
|
||||
TreeObject to4 = new TreeObject("Leaf 4");
|
||||
TreeParent p2 = new TreeParent("Parent 2");
|
||||
p2.addChild(to4);
|
||||
|
||||
TreeParent root = new TreeParent("Root");
|
||||
root.addChild(p1);
|
||||
root.addChild(p2);
|
||||
|
||||
invisibleRoot = new TreeParent("");
|
||||
invisibleRoot.addChild(root);
|
||||
}
|
||||
}
|
||||
% endif
|
||||
%endif
|
||||
%if viewType == "tableViewer"
|
||||
class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
|
||||
public String getColumnText(Object obj, int index) {
|
||||
return getText(obj);
|
||||
}
|
||||
public Image getColumnImage(Object obj, int index) {
|
||||
return getImage(obj);
|
||||
}
|
||||
public Image getImage(Object obj) {
|
||||
return PlatformUI.getWorkbench().
|
||||
getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
|
||||
}
|
||||
}
|
||||
%else
|
||||
class ViewLabelProvider extends LabelProvider {
|
||||
|
||||
public String getText(Object obj) {
|
||||
return obj.toString();
|
||||
}
|
||||
public Image getImage(Object obj) {
|
||||
String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
|
||||
if (obj instanceof TreeParent)
|
||||
imageKey = ISharedImages.IMG_OBJ_FOLDER;
|
||||
return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
|
||||
}
|
||||
}
|
||||
%endif
|
||||
%if sorter
|
||||
class NameSorter extends ViewerSorter {
|
||||
}
|
||||
%endif
|
||||
|
||||
/**
|
||||
* The constructor.
|
||||
*/
|
||||
public $className$() {
|
||||
}
|
||||
|
||||
/**
|
||||
* This is a callback that will allow us
|
||||
* to create the viewer and initialize it.
|
||||
*/
|
||||
public void createPartControl(Composite parent) {
|
||||
%if viewType =="tableViewer"
|
||||
viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
|
||||
%else
|
||||
% if viewType =="treeViewer"
|
||||
viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
|
||||
drillDownAdapter = new DrillDownAdapter(viewer);
|
||||
% endif
|
||||
%endif
|
||||
viewer.setContentProvider(new ViewContentProvider());
|
||||
viewer.setLabelProvider(new ViewLabelProvider());
|
||||
%if sorter
|
||||
viewer.setSorter(new NameSorter());
|
||||
%endif
|
||||
viewer.setInput(getViewSite());
|
||||
%if (localToolbar || localPulldown || popup)
|
||||
makeActions();
|
||||
%endif
|
||||
%if popup
|
||||
hookContextMenu();
|
||||
%endif
|
||||
%if doubleClick
|
||||
hookDoubleClickAction();
|
||||
%endif
|
||||
%if (localToolbar || localPulldown)
|
||||
contributeToActionBars();
|
||||
%endif
|
||||
}
|
||||
|
||||
%if popup
|
||||
private void hookContextMenu() {
|
||||
MenuManager menuMgr = new MenuManager("#PopupMenu");
|
||||
menuMgr.setRemoveAllWhenShown(true);
|
||||
menuMgr.addMenuListener(new IMenuListener() {
|
||||
public void menuAboutToShow(IMenuManager manager) {
|
||||
$className$.this.fillContextMenu(manager);
|
||||
}
|
||||
});
|
||||
Menu menu = menuMgr.createContextMenu(viewer.getControl());
|
||||
viewer.getControl().setMenu(menu);
|
||||
getSite().registerContextMenu(menuMgr, viewer);
|
||||
}
|
||||
%endif
|
||||
|
||||
%if (localToolbar || localPulldown)
|
||||
private void contributeToActionBars() {
|
||||
IActionBars bars = getViewSite().getActionBars();
|
||||
%if localPulldown
|
||||
fillLocalPullDown(bars.getMenuManager());
|
||||
%endif
|
||||
%if localToolbar
|
||||
fillLocalToolBar(bars.getToolBarManager());
|
||||
%endif
|
||||
}
|
||||
%endif
|
||||
|
||||
%if localPulldown
|
||||
private void fillLocalPullDown(IMenuManager manager) {
|
||||
manager.add(action1);
|
||||
manager.add(new Separator());
|
||||
manager.add(action2);
|
||||
}
|
||||
%endif
|
||||
|
||||
%if popup
|
||||
private void fillContextMenu(IMenuManager manager) {
|
||||
manager.add(action1);
|
||||
manager.add(action2);
|
||||
% if viewType == "treeViewer"
|
||||
manager.add(new Separator());
|
||||
drillDownAdapter.addNavigationActions(manager);
|
||||
% endif
|
||||
// Other plug-ins can contribute there actions here
|
||||
manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
|
||||
}
|
||||
%endif
|
||||
|
||||
%if localToolbar
|
||||
private void fillLocalToolBar(IToolBarManager manager) {
|
||||
manager.add(action1);
|
||||
manager.add(action2);
|
||||
% if viewType == "treeViewer"
|
||||
manager.add(new Separator());
|
||||
drillDownAdapter.addNavigationActions(manager);
|
||||
% endif
|
||||
}
|
||||
%endif
|
||||
|
||||
%if (localToolbar || localPulldown || popup)
|
||||
private void makeActions() {
|
||||
action1 = new Action() {
|
||||
public void run() {
|
||||
showMessage("Action 1 executed");
|
||||
}
|
||||
};
|
||||
action1.setText("Action 1");
|
||||
action1.setToolTipText("Action 1 tooltip");
|
||||
action1.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
|
||||
getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
|
||||
|
||||
action2 = new Action() {
|
||||
public void run() {
|
||||
showMessage("Action 2 executed");
|
||||
}
|
||||
};
|
||||
action2.setText("Action 2");
|
||||
action2.setToolTipText("Action 2 tooltip");
|
||||
action2.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
|
||||
getImageDescriptor(ISharedImages.IMG_OBJS_TASK_TSK));
|
||||
% if doubleClick
|
||||
doubleClickAction = new Action() {
|
||||
public void run() {
|
||||
ISelection selection = viewer.getSelection();
|
||||
Object obj = ((IStructuredSelection)selection).getFirstElement();
|
||||
showMessage("Double-click detected on "+obj.toString());
|
||||
}
|
||||
};
|
||||
% endif
|
||||
}
|
||||
%endif
|
||||
|
||||
%if doubleClick
|
||||
private void hookDoubleClickAction() {
|
||||
viewer.addDoubleClickListener(new IDoubleClickListener() {
|
||||
public void doubleClick(DoubleClickEvent event) {
|
||||
doubleClickAction.run();
|
||||
}
|
||||
});
|
||||
}
|
||||
%endif
|
||||
private void showMessage(String message) {
|
||||
MessageDialog.openInformation(
|
||||
viewer.getControl().getShell(),
|
||||
"$viewName$",
|
||||
message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Passing the focus request to the viewer's control.
|
||||
*/
|
||||
public void setFocus() {
|
||||
viewer.getControl().setFocus();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user