Статьи

Написание плагина Eclipse для PasteBin на основе калитки

Не поймите меня неправильно, Мистик Паст великолепен! Однако, если я на ## калитке и кто-то задает вопрос о каком-то коде, и я знаю, что написал этот код, я хочу быть первым, кто ответит. Я не хочу, чтобы n00b заставлял меня выглядеть как n00b, отвечая первым:)

Так что вместо:

  1. копирование кода в буфер обмена
  2. открывая мой браузер
  3. Навигация к Мистической Пасте
  4. вставлять мой код
  5. выбор языка подсветки синтаксиса
  6. нажав на кнопку отправить
  7. копирование URL для вставленного кода в буфер обмена
  8. вставить это в IRC
  9. удариться головой о стену, потому что кто-то другой бил меня в нее …

Я могу вместо этого:

  1. щелкните правой кнопкой мыши по тексту, который я выделил в редакторе, и выберите «Добавить в Mystic Paste».
  2. вставить URL в IRC

Вот что делает плагин: он берет этот текст, выясняет, в каком типе редактора он находится, и использует эту информацию для определения синтаксиса, публикует код в Mystic Paste и копирует URL-адрес кода в буфер обмена. Boom, теперь шаги a) — i) становятся шагами a) — b).

Вы просто здесь для плагина

Если вы на самом деле не хотите знать, как был написан плагин, но хотите начать его использовать, вы можете скачать его с http://www.mysticpaste.com/plugin , где есть инструкции, чтобы показать вам, как его получить. работать с Eclipse.

Настройка проекта

Хорошо, для вас двоих, которые остались учиться, вот как был создан плагин Mystic Paste Eclipse. Во-первых, запустите Eclipse и выберите File-> New-> Project и выберите « Plug-in Project ».

Eclipse Plug-in Project

Это проведет вас через серию диалогов, я расскажу только о тех, которые имеют смысл. Мы назвали наш проект плагина MysticPasteEclipseProject и дали ему идентификатор плагина com.mysticcoders.mysticpaste. Идентификатор плагина важен для Eclipse, потому что когда ваш плагин загружен, это идентификатор, который уникально идентифицирует его среди тысяч других плагинов, которые составляют платформу Eclipse.

Мастер проекта подключаемого модуля также позволяет выбрать шаблон, с которого начинается новый проект. Наш плагин будет расширять функцию «Всплывающее меню» в Eclipse, это любая функция, которая отображает контекстное меню. Выбранный нами шаблон проекта не совсем тот, который мы хотим, но он будет достаточно близок, поэтому пока выберите шаблон проекта для «Подключаемого модуля с всплывающим меню» и продолжайте.

Шаблон всплывающего меню Eclipse

Далее мастер проекта задаст нам несколько вопросов о «действии» для нашего плагина. Действие, на языке Eclipses, — это класс, в котором находится фактический код, который будет выполняться, когда пользователь нажимает на ваш пункт меню.

Настройка действия Eclipse

Нажмите кнопку Готово и позвольте Eclipse создать скелетный проект для вас.

plugin.xml

plugin.xml — это файл, который Eclipse будет сам читать, чтобы определить, что именно делает ваш плагин. Это новый редактор? Это панель инструментов? Это определяется точкой расширения , указанной в этом файле. Для контекстных меню точкой расширения является org.eclipse.ui.popupMenus, и мастер проекта подключаемого модуля удобно для нас установит это.

Однако, помните выше, я упоминал, что шаблон проекта, который мы выбрали, не был «именно тем, что мы хотим»? Шаблон, который использует Eclipse, предполагает, что контекстное меню должно быть применимо к типам ресурсов , обычно это те узлы, которые вы видите в окне навигации в левой части экрана, когда просматриваете файлы проекта. Вместо этого мы хотим расширить контекстное меню, которое появляется при щелчке правой кнопкой мыши в редакторе.

Итак, вместо нашего файла plugin.xml выглядит так:

   <extension
point="org.eclipse.ui.popupMenus">
<objectContribution
objectClass="#CompilationUnitEditorContext"
id="com.mysticcoders.mysticpaste.contribution1">
<menu
label="group.add"
path="additions"
id="com.mysticcoders.mysticpaste.menu1">
<separator
name="group1">
</separator>
</menu>
<action
label="Add to Mystic Paste"
class="com.mysticcoders.mysticpaste.popup.actions.MysticPasteAction"
menubarPath="a.menu1/group1"
enablesFor="1"
id="com.mysticcoders.mysticpaste.newAction">
</action>
</objectContribution>
</extension>

 

Вместо этого мы хотим заменить тег «objectContribution» на тег «viewerContribution» и все вместе удалить тег «menu» следующим образом:

   <extension
point="org.eclipse.ui.popupMenus">
<viewerContribution
targetID="#CompilationUnitEditorContext"
id="com.mysticcoders.mysticpaste.actions.compilationuniteditor">
<action
label="%Add_to_MysticPaste.name"
icon="$nl$/icons/mystic16.png"
class="com.mysticcoders.mysticpaste.popup.actions.MysticPasteAction"
menubarPath="group.add"
id="com.mysticcoders.mysticpaste.popup.actions.MysticPasteAction.JAVA5" />
</viewerContribution>
</extension>

 

 

Теперь то, что я показываю вам выше, является фактическим готовым продуктом, и если вы не знакомы с плагинами Eclipse, это, вероятно, не очень много. Вот рассечение элементов:

   <extension
point="org.eclipse.ui.popupMenus">

 

Точки расширения — это места в Eclipse, которые могут быть «Расширенными». По сути, это просто идентификаторы плагинов в Eclipse, которые позволяют расширяться. Идентификатор для контекстных меню — «org.eclipse.ui.popupMenus».

<viewerContribution
targetID="#CompilationUnitEditorContext"
id="com.mysticcoders.mysticpaste.actions.compilationuniteditor">

 

Вклад зрителей (в отличие от вкладов объектов) определяет, к какому типу «вещи» в Eclipse будет добавлен вклад. В нашем случае нам нужен вклад зрителя, потому что редакторы — это тип зрителя. TargetID может показаться немного странным, но на самом деле это предопределенная константа используется Eclipse , чтобы указать «любой редактор , который имеет код , который может быть скомпилирован». Для нас это означает «редактор Java», поэтому наш вклад в расширение всплывающего меню предназначен для редакторов Java. Идентификатор , уникальный идентификатор , который наш вклад известен в Eclipse , с помощью, он не должен соответствовать пакет в проекте или что — нибудь, он просто должен быть уникальным для плагинов.

<action
label="%Add_to_MysticPaste.name"
icon="$nl$/icons/mystic16.png"
class="com.mysticcoders.mysticpaste.popup.actions.MysticPasteAction"
menubarPath="group.add"
id="com.mysticcoders.mysticpaste.popup.actions.MysticPasteAction.JAVA5" />

 

«Действие» будет классом, который загружается Eclipse, когда кто-то нажимает на элемент меню, который мы добавили. Вы можете видеть, что класс «выполняется» определяется полностью определенным классом, который вы вводите в качестве значения для атрибута класса. Он должен расширять IEditorActionDelegate, это не тот класс, который для вас настроил мастер проекта плагина, поэтому вам придется его изменить.

menubarPath — это заранее заданная настройка обозначения для области контекстного меню, в которой содержится пункт меню «Добавить в фрагменты», я подумал, что «Добавить в Mystic Paste» проделал очень похожую работу, поэтому решил, что пункт меню будет там.

Вы заметите странные вещи, такие как% Add_to_MysticPaste.name и $ nl $ / icons / mystic16.png. Вы найдете все виды нетрадиционного синтаксиса, такого как этот, в платформе Eclipse, и обычно вам нужно копаться, чтобы выяснить, что именно это все означает. Что ж, в случае% Add_to_MysticPaste.name это говорит Eclipse, что нужно искать файл plugin.properties, связанный с вашим плагином, и вставлять значение для ключа Add_to_MysticPaste.name. Для $ nl $ / icons / mystic16.png это говорит Eclipse о замене токена $ nl $ на путь к базовой директории вашего плагина при загрузке в Eclipse. На самом деле, он указывает на «интернационализированный» базовый путь, но пока не беспокойтесь об этом, значок Mystic Paste не зависит от языка. Важный: чтобы использовать значения из plugin.properties в вашем файле plugin.xml, вы должны добавить следующую строку в META-INF / MANIFEST.INF: Bundle-Localization: plugin

Наконец, у нас есть идентификатор для действия, опять же просто сделайте что-то уникальное. В нашем случае я добавил .JAVA5 в конец своего идентификатора, чтобы, когда пользователь щелкает по нему, я знал, какой синтаксис языка использовать при вставке выбранного кода в Mystic Paste, запрашивая идентификатор действия во время выполнения. То, что не изображено выше, это тот факт, что в реальном проекте есть несколько разделов viewerContribution для различных типов редакторов в Eclipse, и к каждому действию к его идентификатору добавляется <lang type>, чтобы помочь мне определить, какой язык поддерживает редактор.

Код

Код для Mystic Paste действительно довольно прост. Мы берем выделенный текст в редакторе и выполняем HTTP-запрос POST к сервлету, который настраивается в веб-приложении Mystic Paste. Сервлет принимает содержимое пасты, а также тип языка.

Единственное, что нужно сделать, это добавить зависимости для клиента Commons Http . Это делается с помощью редактора plugin.xml и добавления jar-зависимостей в ваш проект следующим образом:

Построить зависимости
Зависимости сборки

Сам код довольно прост, тем более что автор фактически задокументировал код!

package com.mysticcoders.mysticpaste.popup.actions;
/**
* Implements an Action Delegate which responds to a context menu item click<br/>
* <br/>
* The delegate posts the selected text to the Mystic Paste webapplication, then places the url for the page
* where the user can view their paste onto the clipboard. A "Balloon Tip" is shown after a successful paste.
*
* @author Craig Tataryn
*
*/
public class MysticPasteAction implements IEditorActionDelegate {
private String selectionText = null;
private int selectionStart = 0;
private Shell shell;
ResourceBundle bundle = null;
public MysticPasteAction() {
super();
bundle = ResourceBundle.getBundle("plugin");
}
public void setActiveEditor(IAction action, IEditorPart editorPart) {
shell = editorPart.getSite().getShell();
}
/**
* Code which executes when the menu item is clicked. Code selected is pasted to the Mystic Paste
* web application, the view URL is put on the clipboard and an informational message is shown in a
* balloon tip.
*/
public void run(IAction action) {
System.out.println("run called");
if (this.selectionText != null && !this.selectionText.trim().equals("")) {
//the action is setup in plugin.xml with an ID that ends in .<lang type>
String type = action.getId().substring(action.getId().lastIndexOf('.') + 1);
String url = submitPaste(this.selectionText, type);
Clipboard cb = new Clipboard(this.shell.getDisplay());
cb.setContents(new Object[] {url}, new Transfer[] {TextTransfer.getInstance()});
cb.dispose();
showUrlBox();
}
}
/**
* Decides whether or not to enable the mystic paste menu item in the context menu
* depending on whether there is selected text. Unfortunately, because of how eclipse
* lazy loads things, this method isn't fired until the menu item is clicked for the
* first time, so you can never grey out the item before it is clicked.
*/
public void selectionChanged(IAction action, ISelection selection) {
System.out.println("selectionChanged called");
if (ITextSelection.class.isAssignableFrom(selection.getClass())) {
ITextSelection txtSelection = (ITextSelection) selection;
if (txtSelection == null || txtSelection.isEmpty() || txtSelection.getText().trim().equals("")) {
action.setEnabled(false);
this.selectionText = null;
this.selectionStart = 0;
} else {
action.setEnabled(true);
this.selectionText = txtSelection.getText();
this.selectionStart = txtSelection.getStartLine();
}
}
}
/**
* Submits the selected text to the Mystic Paste web application. Web application
* urls and other information are stored in the plugin.properties file.<br/>
* <br/>
* The language type for the selected text is determined by the action's id as setup
* in plugin.xml. For instance, the action for the Java editor will have an id that ends
* with .JAVA. The xml editor's action ID ends in .XML, and so on. The default is TEXT.
* @param content
* @param type
* @return
*/
private String submitPaste(String content, String type) {
String url = bundle.getString("mysticpaste.url");
String newPasteContext = bundle.getString("mysticpaste.new");
String contentParam = bundle.getString("mysticpaste.content.param");
String langParam = bundle.getString("mysticpaste.language.param");
String retString = null;
HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(url + newPasteContext);
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair(langParam, type));
nvps.add(new BasicNameValuePair(contentParam, content));
try {
post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
HttpResponse response = httpClient.execute(post);
HttpEntity entity = response.getEntity();
retString = EntityUtils.toString(entity, HTTP.UTF_8);
retString = url + bundle.getString("mysticpaste.view") + retString;
System.out.println(retString);
} catch (ClientProtocolException e) {
e.printStackTrace();
MessageDialog.openInformation(
shell,
"MysticPaste Plug-in",
"Sorry, we couldn't contact Mystic Paste");
} catch (IOException e) {
e.printStackTrace();
MessageDialog.openInformation(
shell,
"MysticPaste Plug-in",
"Sorry, we couldn't contact Mystic Paste");
}
return retString;
}
/**
* Shows an informational "balloon tip" at the bottom of the screen
*/
private void showUrlBox() {
Rectangle bounds = shell.getDisplay().getPrimaryMonitor().getClientArea();
ToolTip tip = new ToolTip(shell, SWT.BALLOON | SWT.ICON_INFORMATION);
tip.setAutoHide(true);
tip.setText("Your selection has been copied to to Mystic Paste");
tip.setMessage("The Url is on your clipboard");
tip.setLocation(bounds.width, bounds.height);
tip.setVisible(true);
}
}


 

Создание баночки плагинов

Создать банку плагина довольно просто. Просто зайдите в File-> Export-> Deployable плагины и фрагменты и следуйте указаниям мастера

Построить банку

Установка банки

Найдите, где в вашей файловой системе установлен Eclipse. Под этим каталогом должна быть папка «dropins», где должен находиться jar, который вы создали (или скачали) для плагина. Перезапустите Eclipse и вуаля! Примечание : на Mac вам нужно будет щелкнуть правой кнопкой мыши на Eclipse.app и выбрать «Показать содержимое пакета», папка dropins будет доступна через всплывающее окно Finder.

Заключение

Надеюсь, это даст вам хорошее представление о том, как был построен плагин Mystic Paste Eclipse. Вероятно, объяснение заняло больше времени, чем кодирование. При этом программирование для Eclipse не для слабонервных. Я в значительной степени «кодирую отладчиком», когда мне приходится создавать плагины Eclipse, многие API-интерфейсы окружены интерфейсами с одним методом, вы действительно никогда не узнаете, с каким реальным объектом вы имеете дело, пока не осмотрите его во время выполнения ,

 

Mystic Coders, LLC занимается веб-магией с 2000 года. Mystic — агентство по разработке программного обеспечения с полным набором услуг, специализирующееся на разработке корпоративных приложений на Java. Они обычно участвуют в разработке программного обеспечения корпоративного уровня для крупных и малых компаний и имеют опыт работы в различных отраслях, включая проекты b2b, b2c и государственные проекты. Mystic работала с крупными компаниями, такими как LeapFrog, Nestlé, Harrah’s Entertainment и Лос-Анджелесское бюро конвенций и посетителей, среди других. Эндрю Ломбарди, технический директор Mystic, может выступать с речами.


Для получения дополнительной информации о Mystic, проверьте нас на http://www.mysticcoders.com