Eclipse RCP Tutorial 10

작성일: 2010. 10. 27.

원문: http://www.vogella.de/articles/EclipseRCP/article.html Version 5.1

JFace 뷰어

개요

JFace는 사용자 인터페이스를 생성시 자바 객체를 바로 사용할 수 있는 뷰어를 제공한다. 뷰어는 트리, 테이블, 리스트와 콤보박스가 가능하다. 다음에서 콤보 뷰어의 사용 예를 보여줄 것이다. 테이블 뷰어의 자세한 사용법은 Eclipse JFaces Tables 에서 찾을 수 있다.

트리 뷰어의 간략한 사용 예는 JFace Tree Viewer 에서 찾을 수 있다.

콤보뷰어

새로운 RCP 프로젝트 de.vogella.rcp.intro.jfaceviewer 를 만들고 RCP application with a view 템플릿을 선택한다. 다음의 자바 클래스를 생성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package de.vogella.rcp.intro.jfaceviewer;
public class Person {
private String firstName;
private String lastName;
public Person(String firstName, String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}

View.java 를 다음과 같이 변경한다.

package de.vogella.rcp.intro.jfaceviewer;

import org.eclipse.jface.viewers.ArrayContentProvider;

public class View extends ViewPart {
  public static final String ID = "de.vogella.rcp.intro.jfaceviewer.view";

  private ComboViewer viewer;

  public void createPartControl(Composite parent) {
    GridLayout layout = new GridLayout(2, false);
    parent.setLayout(layout);
    Label label = new Label(parent, SWT.NONE);
    label.setText("Select a person:");
    viewer = new ComboViewer(parent, SWT.READ_ONLY);
    viewer.setContentProvider(new ArrayContentProvider());
    viewer.setLabelProvider(new LabelProvider() {
      @Override
      public String getText(Object element) {
        if (element instanceof Person) {
          Person person = (Person) element;
          return person.getFirstName();
        }
      return super.getText(element);
      }
    });
    Person[] persons = new Person[] { new Person("Lars", "Vogel"),
    new Person("Tim", "Taler"), new Person("Jim", "Knopf") };
    // Set set the input to the viewer this input will be send to the
    // content provider
    viewer.setInput(persons);
    // React to the selection of the viewer
    // Note that the viewer return the real object and not just a string
    // representation
    viewer.addSelectionChangedListener(new ISelectionChangedListener() {
      @Override
      public void selectionChanged(SelectionChangedEvent event) {
        IStructuredSelection selection = (IStructuredSelection) event.getSelection();
        System.out.println(((Person) selection.getFirstElement()).getLastName());
      }
    });
    // You can select a object directly via the domain object
    Person person = persons[0];
    viewer.setSelection(new StructuredSelection(person));
  }

  /**
  * Passing the focus request to the viewer's control.
  */
  public void setFocus() {
    viewer.getControl().setFocus();
  }
}
Share Comments

Eclipse RCP Tutorial 9

작성일: 2010. 10. 27.

원문: http://www.vogella.de/articles/EclipseRCP/article.html Version 5.1

필드 어시스트와 레이블 데코레이터

필드 어시스트는 텍스트 필드나 콤보 박스와 같이 단순 필드의 가능한 입력과 상태에 대한 정보를 제공하는데 사용될 수 있다. org.eclipse.jface.fieldassist 패키지는 ControlDecorations 와 Content Proposals 두 가지 방법으로 도움을 제공한다.

콘트롤 장식은 콘트롤에 대한 부가적인 정보를 보여주기 위해 SWT 컨트롤에 이미지 장식을 두도록 한다. 이 장식은 사용자가 마우스를 올려 놓았을때 한번 보여지는 내용을 가지고 있을 수 있다. 화면 배치 중에 이 장식들을 보여주기 위한 충반한 공간이 있다고 확신해야 한다.

컨텐트 제안은 필드에 사용자 입력에 대해 가능한 선택을 도와주도록 한다.

de.vogella.rcp.intro.fieldassist 로 새 프로젝트를 생성한다. 예제로 RCP application with a view 를 사용한다. 예제에서 컨텐트 제안은 Cntrl+Space 키 조합으로 특정 키(., #)를 통해 활성화된다.

다음으로 View.java를 바꾼다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package de.vogella.rcp.intro.fieldassist;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.bindings.keys.ParseException;
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.fieldassist.SimpleContentProposalProvider;
import org.eclipse.jface.fieldassist.TextContentAdapter;
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.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;
public class View extends ViewPart {
public static final String ID = "de.vogella.rcp.intro.fieldassist.view";
public void createPartControl(Composite parent) {
GridLayout layout = new GridLayout(2,false);
parent.setLayout(layout);
Label label = new Label(parent, SWT.NONE);
label.setText("Please select a value: ");
Text text = new Text(parent, SWT.BORDER);
createDeco(text, "Use CNTL + SPACE to see possible values");
GridData data = new GridData(GridData.FILL_HORIZONTAL);
text.setLayoutData(data);
ControlDecoration deco = new ControlDecoration(text, SWT.LEFT);
deco.setDescriptionText("Use CNTL + SPACE to see possible values");
deco.setImage(FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_INFORMATION).getImage());
deco.setShowOnlyOnFocus(false);
// Help the user with the possible inputs
// "." and "#" will also activate the content proposals
char[] autoActivationCharacters = new char[] { '.', '#' };
KeyStroke keyStroke;
try {
//
keyStroke = KeyStroke.getInstance("Ctrl+Space");
// assume that myTextControl has already been created in some way
ContentProposalAdapter adapter = new ContentProposalAdapter(text,
new TextContentAdapter(),
new SimpleContentProposalProvider(new String[] {
"ProposalOne", "ProposalTwo", "ProposalThree" }),
keyStroke, autoActivationCharacters);
} catch (ParseException e) {
e.printStackTrace();
}
}
public void setFocus() {
}
private void createDeco(Text text, String s){
}
}

애플리케이션을 실행하고 콘트롤 장식과 컨텐트 제안이 작동하는지 확인한다.

Share Comments

Eclipse RCP Tutorial 8

작성일: 2010. 10. 27.

원문: http://www.vogella.de/articles/EclipseRCP/article.html Version 5.1

개요

뷰와 뷰 파트는 어플리케이션에서 정보를 보여주고 데이터를 변경하는 데에 사용된다. 다음은 어플리케이션에 뷰를 추가하는 방법을 설명한다. de.vogella.rcp.intro.view 라는 이름의 RCP 프로젝트를 생성하라. Hello RCP 템플릿을 사용하라.

뷰 생성하기

플러그인에 org.eclipse.ui.views 확장을 추가한다. 새로운 뷰 확장에 마우스 오른쪽 클릭을 하고 New -> View 를 선택한다. id 는 de.vogella.rcp.intro.view.MyView, 클래스는 de.vogella.rcp.intro.view.MyView 로 설정한다.

class 하이퍼링크를 클릭하여 MyView 클래스를 생성하고 다음의 코드를 작성하라. 그러면 뷰를 사용할 준비가 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package de.vogella.rcp.intro.view;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;
public class MyView extends ViewPart {
@Override
public void createPartControl(Composite parent) {
Text text = new Text(parent, SWT.BORDER);
text.setText("Imagine a fantastic user interface here");
}
@Override
public void setFocus() {
}
}

퍼스펙티브에 뷰 추가하기

당신의 퍼스펙티브에 뷰를 추가해야 한다. 플러그인에 “org.eclipse.ui.perspectiveExtensions” 확장을 추가한다.

오른쪽 클릭을 하고 뷰를 선택한다. id 로 “de.vogella.rcp.intro.view.MyView” 를 기입한다. relative 는 현재 안보이는 편집 영역인 “org.eclipse.ui.editorss” 를 적고 “0.95f” 의 최대 비율을 선택함으로써 모든 여백을 사용한다.

결과

결과를 보기 위해 어플리케이션을 실행한다.

코드를 통해 퍼스펙티브에 뷰를 추가하기

나는 개인적으로 코드 상의 확장점을 더 선호한다. 하지만 “org.eclipse.ui.perspectiveExtensions” 확장점을 사용하는 대신 퍼스펙티브로 코드를 통해 뷰를 추가할 수도 있다. 다음의 변경된 “Perspective.java” 파일을 보자.

1
2
3
4
5
6
7
8
9
10
11
package de.vogella.rcp.intro.view;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;
public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
layout.addView("de.vogella.rcp.intro.view.MyView", IPageLayout.TOP,
IPageLayout.RATIO_MAX, IPageLayout.ID_EDITOR_AREA);
}
}

에디터 / 뷰 상호작용

이클립스 에디터를 사용하고 뷰와 에디터 사이의 통신을 하는 방법을 배우려면 Eclipse Editors 를 보아라.

Share Comments

Eclipse RCP Tutorial 7

작성일: 2010. 10. 27.

원문: http://www.vogella.de/articles/EclipseRCP/article.html Version 5.1

시스템 트레이

다음은 시스템 트레이의 RCP 어플리케이션에 아이콘을 추가하고, 이 아이콘에 메뉴를 추가하는 것이다. 윈도우가 최소화되면 프로그램이 작업표시줄에서 보이지 않게 되는(트레이 아이콘을 통해서만 보임) 기능을 추가한다.

de.vogella.rcp.intro.traytest 라고 프로젝트를 새로 생성한다. Hello RCP 템플릿을 사용한다. 어플리케이션에 de.vogella.rcp.intro.traytest.exitCommand 라는 id 를 가진 명령을 생성한다.

ApplicationWorkbenchWindowAdvisor 클래스를 열고 다음의 코드를 적용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package de.vogella.rcp.intro.traytest;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ShellAdapter;
import org.eclipse.swt.events.ShellEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tray;
import org.eclipse.swt.widgets.TrayItem;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.plugin.AbstractUIPlugin;
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
private IWorkbenchWindow window;
private TrayItem trayItem;
private Image trayImage;
private final static String COMMAND_ID = "de.vogella.rcp.intro.traytest.exitCommand";
public ApplicationWorkbenchWindowAdvisor(
IWorkbenchWindowConfigurer configurer) {
super(configurer);
}
public ActionBarAdvisor createActionBarAdvisor(
IActionBarConfigurer configurer) {
return new ApplicationActionBarAdvisor(configurer);
}
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
configurer.setInitialSize(new Point(400, 300));
configurer.setShowCoolBar(false);
configurer.setShowStatusLine(false);
configurer.setTitle("Hello RCP"); //$NON-NLS-1$
}
// As of here is the new stuff
@Override
public void postWindowOpen() {
super.postWindowOpen();
window = getWindowConfigurer().getWindow();
trayItem = initTaskItem(window);
// Some OS might not support tray items
if (trayItem != null) {
minimizeBehavior();
// Create exit and about action on the icon
hookPopupMenu();
}
}
// Add a listener to the shell
private void minimizeBehavior() {
window.getShell().addShellListener(new ShellAdapter() {
// If the window is minimized hide the window
public void shellIconified(ShellEvent e) {
window.getShell().setVisible(false);
}
});
// If user double-clicks on the tray icons the application will be
// visible again
trayItem.addListener(SWT.DefaultSelection, new Listener() {
public void handleEvent(Event event) {
Shell shell = window.getShell();
if (!shell.isVisible()) {
window.getShell().setMinimized(false);
shell.setVisible(true);
}
}
});
}
// We hook up on menu entry which allows to close the application
private void hookPopupMenu() {
trayItem.addListener(SWT.MenuDetect, new Listener() {
public void handleEvent(Event event) {
Menu menu = new Menu(window.getShell(), SWT.POP_UP);
// Creates a new menu item that terminates the program
// when selected
MenuItem exit = new MenuItem(menu, SWT.NONE);
exit.setText("Goodbye!");
exit.addListener(SWT.Selection, new Listener() {
public void handleEvent(Event event) {
// Lets call our command
IHandlerService handlerService = (IHandlerService) window
.getService(IHandlerService.class);
try {
handlerService.executeCommand(COMMAND_ID, null);
} catch (Exception ex) {
throw new RuntimeException(COMMAND_ID);
}
}
});
// We need to make the menu visible
menu.setVisible(true);
}
});
}
// This methods create the tray item and return a reference
private TrayItem initTaskItem(IWorkbenchWindow window) {
final Tray tray = window.getShell().getDisplay().getSystemTray();
TrayItem trayItem = new TrayItem(tray, SWT.NONE);
trayImage = AbstractUIPlugin.imageDescriptorFromPlugin(
"de.vogella.rcp.intro.traytest", "/icons/alt_about.gif")
.createImage();
trayItem.setImage(trayImage);
trayItem.setToolTipText("TrayItem");
return trayItem;
}
// We need to clean-up after ourself
@Override
public void dispose() {
if (trayImage != null) {
trayImage.dispose();
}
if (trayItem != null) {
trayItem.dispose();
}
}
}

어플리케이션을 실행하면 시스템 트레이 아이콘을 볼 수 있다. 메뉴와 최소화 동작을 테스트해라. 만약 어플리케이션이 최소화되면 작업표시줄에서 보이지 않게 되고 시스템 트레이에서만 보일 것이다.

Share Comments

Eclipse RCP Tutorial 6

작성일: 2010. 10. 27.

원문: http://www.vogella.de/articles/EclipseRCP/article.html Version 5.1

Commands

#@ 개요

명령은 컴포넌트의 명세를 선언하고 상세 구현으로부터 독립적이다. 명령은 분류할 수 있고 단축키를 할당 할 수 있다. 명령은 메뉴, 툴바 그리고 컨텍스트 메뉴에 사용된다. 다음에서는 메뉴에 명령을 적용하는 방법을 시연할 것이다. 명령에 대한 자세한 내용은 Eclipse Commands - Tutorial 을 보아라.

명령 정의하기

어플리케이션을 종료하는 명령을 만들 것이다. de.vogella.rcp.commands.first 라는 새로운 RCP 프로젝트를 생성하고, Hello RCP 템플릿을 사용한다. plugin.xml 파일을 더블 클릭하고 Extensions 탭을 선택한다. 그리고 Add 버튼을 누른다.

org.eclipse.ui.commands 확장을 검색한다. 그것을 선택하고 Finish 를 누른다.

확장점에 오른쪽 클릭을 하여 New -> Command 를 선택해 새로운 명령을 생성한다.

ID는 de.vogella.rcp.commands.first.commands.Exit 로, 이름은 Exit 로 설정한다. 기본 핸들러로 de.vogella.rcp.commands.first.commands.ExitHandler 클래스를 넣는다. 이 클래스를 생성하기 위해 defaultHAndler 하이퍼링크를 누르고 부모 클래스로 org.eclipse.core.commands.AbstractHandler 를 선택한다.

다음의 코드를 구현한다. 당신의 새로운 명령은 나중에 사용될 준비 상태이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package de.vogella.rcp.commands.first.commands;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.ui.handlers.HandlerUtil;
public class ExitHandler extends AbstractHandler {
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
HandlerUtil.getActiveWorkbenchWindow(event).close();
return null;
}
}

메뉴에서 명령 사용하기

우리가 정의한 명령은 메뉴에서 사용될 것이다. org.eclipse.ui.commands 확장과 비슷하게 어플리케이션에 org.eclipse.ui.menus 확장점을 추가한다. 확장점에서 오른쪽 클릭을 하고 New -> menuContribution 을 선택한다.

location URI 는 menu:org.eclipse.ui.main.menu 라고 하고, 새로운 메뉴 기증을 생성한다. 이 URL이 정확하지 않으면 당신의 메뉴는 보이지 않는다.

메뉴 기증을 오른쪽 클릭하고 New -> Menu 를 선택한다. label 은 File, id 는 fileMenu 로 메뉴를 추가한다.

메뉴를 선택하고, 오른쪽 클릭을 하고, New -> Command 를 선택한다. commandID 는 그대로 둔다. 레이블은 Exit, 툴팁은 Exits the application 으로 설정한다.

위의 과정을 통해 plugin.xml 파일에 다음과 같은 결과를 얻을 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
id="application"
point="org.eclipse.core.runtime.applications">
<application>
<run
class="de.vogella.rcp.commands.first.Application">
</run>
</application>
</extension>
<extension
point="org.eclipse.ui.perspectives">
<perspective
name="RCP Perspective"
class="de.vogella.rcp.commands.first.Perspective"
id="de.vogella.rcp.commands.first.perspective">
</perspective>
</extension>
<extension
point="org.eclipse.ui.commands">
<command
defaultHandler="de.vogella.rcp.commands.first.commands.ExitHandler"
id="de.vogella.rcp.commands.first.commands.Exit"
name="Exit">
</command>
</extension>
<extension
point="org.eclipse.ui.menus">
<menuContribution
locationURI="menu:org.eclipse.ui.main.menu">
<menu
id="fileMenu"
label="File">
<command
commandId="de.vogella.rcp.commands.first.commands.Exit"
label="Exit"
style="push"
tooltip="Exit the application">
</command>
</menu>
</menuContribution>
</extension>
</plugin>

예제를 실행한다. file 메뉴를 보게 될 것이고, Exit 항목을 선택하면 어플리케이션은 종료할 것이다.

Share Comments

Eclipse RCP Tutorial 4, 5

작성일: 2010. 10. 27.

원문: http://www.vogella.de/articles/EclipseRCP/article.html Version 5.1

동작 과정과 어드바이저

이클립스 RCP 어플리케이션을 시작하는 동안 이클립스 런타임은 org.eclipse.core.runtime.application 확장점을 통해 정의된 클래스를 평가할 것이다. 이 클래스는 로드되고 생성되고 워크벤치를 실행할 것이다. 워크벤치는 WorkbenchAdvisor 를 통해 설정된다. 워크벤치는 WorkbenchWindowAdvisor 를 통해 설정된 WorkbenchWindow 를 실행할 것이다. 이 WorkbenchWindow 는 ActionBarAdvisor 를 통해 시작 설정된 어플리케이션의 툴바를 생성할 것이다.

각 어드바이저는 어플리케이션의 특정 행동을 설정하도록 한다. 예를 들어, 워크벤치 어드바이저는 preStartUp() 과 preShutdown() 메소드를 오버라이딩 함으로써 시작이나 종료시 특정 행동을 수행하도록 한다.

동작 설정하기

개요

이클립스의 동작 설정은 당신의 어플리케이션이 시작될 환경을 정의한다. 예를들어, 컴파일러 플래그, 플러그인(클래스 패스) 종속성 등. 때때로 동작 환경은 실행 환경 이라고도 불린다. 만약 당신이 RCP 어플리케이션을 시작한다면 동작 설정은 자동으로 생성될 것이다.

동작 설정을 보고 변경하기 위해 MANIFEST.MF 파일을 선택하고, 오른쪽 클릭해서 Run As -> Run Configurations 를 선택한다.

location 필드는 RCP 어플리케이션을 실행하기 위한 필요한 파일들이 생성될 곳을 나타낸다.

런타임 설정 검사하기

Plug-ins 탭의 Validate plug-ins prior to launching 을 선택한다. 이것은 당신의 실행 설정에 필요한 플러그인을 모두 가지고 있는지 검사할 것이다. 만약 플러그인이 빠졌다고 보고되면, Add Required-Plug-Ins 버튼을 눌러 보아라.

Arguments 탭에서 -consoleLog 인자를 찾을 수 있을 것이다. 이 옵션은 콘솔 뷰에서 RCP 어플리케이션의 에러를 볼 수 있도록 하며, 문제를 인식하는데 많은 도움이 될 것이다.

Share Comments

Eclipse RCP Tutorial 3

작성일: 2010. 10. 27.

원문: http://www.vogella.de/articles/EclipseRCP/article.html Version 5.1

처음으로 RCP 어플리케이션 생성하기

다음은 간단한 RCP 어플리케이션을 생성하는 방법에 대한 빠른 설명을 제시한다.

RCP 어플리케이션 생성하기

이클립스에서 File -> New Project 를 선택한다. 리스트에서 Plug-In Project 를 선택한다.

플러그인 이름을 de.vogella.rcp.intro.first 라고 적는다.

Next 을 누르고 다음에 나오는 설정을 적는다. RCP 어플리케이션을 만들것이므로 Would you like to create a rich client application 질문에 Yes 를 선택한다.

Next 를 누르고, Hello RCP 템플릿을 선택한다.

Next 를 누르고, Add branding&quot;을 선택하고, &quot;Finish 를 누른다.

마침내 아래의 프로젝트 구조를 가지는 프로젝트가 생성될 것이다. 프로젝트 구조에 대한 첫 느낌을 얻기위해 자바 파일들과 특히 다른 파일들을 훑어보아라.

RCP 어플리케이션 실행하기

MANIFEST.MF 파일을 더블클릭하여 연다. 에디터를 보게될 것이고, Overview 탭이 선택되어 있을 것이다. Launch an Eclipse Application 링크를 클릭한다.

결과로 다음과 같은 모습을 볼 것이다.

당신의 첫 RCP 어플리케이션이 만들어진 것에 대해 축하한다.

Share Comments

Eclipse RCP Tutorial 2

작성일: 2010. 10. 27.

원문: http://www.vogella.de/articles/EclipseRCP/article.html Version 5.1

설치하기

설치하기

Eclipse.org 홈페이지에서 DOWNLOADS 를 클릭한다. Eclipse for RCP/Plug-in Developers 패키지를 다운로드 한다. 하드 디스크에 압축을 푼다. 이클립스 경로에는 특수 문자나 공백을 피한다.

이클립스 자바 IDE 업데이트하기

이미 이클립스 자바 IDE 배포판을 다운 받았을 경우, RCP 개발에 필요한 플러그인을 인스톨하기 위해 이클립스 업데이트 매니저를 이용할 수 있다. 업데이트 매니저를 사용하는 자세한 사항은 Eclipse Update Manager 에서 참고하라.

헬리오스 업데이트 사이트에서 General Purpose Tools -> Eclipse Plug-in Development EnvironmentEclipse RCP Plug-in Developer Resources 를 설치한다. 이 기능들을 보기 위해 아마도 Group items by category 플래그를 없애야 할 것이다.

Share Comments

Eclipse RCP Tutorial 1

작성일: 2010. 10. 27.

원문: http://www.vogella.de/articles/EclipseRCP/article.html Version 5.1

이클립스 RCP

이 튜토리얼은 이클립스 RCP 어플리케이션을 개발하는 방법을 적고있다. 이클립스 3.6(헬리오스)에 기반을 두고 있다.

이클립스 RCP

다음에 나오는 내용은 이미 이클립스 IDE를 사용하는 방법을 안다고 가정하고 있다.

개요

이클립스 RCP 는 개발자가 이클립스 플랫폼을 이용하여 유연하고 확장성있는 데스크탑 어플리케이션을 작성하도록 한다. 이클립스는 플러그인 아키텍처를 기반으로 설계되었다. 플러그인은 이클립스에서 배포와 설치가 가능한 가장 작은 소프트웨어 컴포넌트이다. 이 아키텍처는 이클립스 어플리케이션이 서드 파티에 의해 확장될 수 있도록 한다. 이클립스 RCP 는 독립형 어플리케이션에도 동일한 모듈 개념을 제공한다.

이클립스 IDE의 컴포넌트들은 일반적으로 다음과 같다.

이클립스 RCP 어플리케이션은 이들 컴포넌트들의 부분들을 사용하는 것을 결정할 수 있다. 이것은 양식없는 이클립스 기반의 어플리케이션을 설계하는 것을 가능하게 하고, 단지 런타임만 필요하다. 이클립스 RCP 어플리케이션은 일반적으로 다음을 사용한다.

이클립스 RCP 어플리케이션(UI 포함)을 작성하고 실행하기 위해 필요한 최소한의 플러그인은 “org.eclipse.core.runtime” 과 “org.eclipse.ui” 이다.

OSGI 런타임은 모듈형 어플리케이션을 구동할 수 있는 프레임워크를 제공한다. SWT 는 이클립스에서 사용되는 표준 UI 컴포넌트 라이브러리이고 JFace 는 SWT 위에서 편리한 API 를 제공한다. 워크벤치는 다른 모든 UI 컴포넌트들이 보여지는 어플리케이션의 프레임을 제공한다.

이클립스 RCP 아키텍처

이클립스의 가장 중요한 아키텍처상의 특징은 플러그인 아키텍처이다. 이클립스 어플리케이션은 API와 종속성이의되어 있는 수많은 플러그인으로 구성되어있다. 이 아키텍처는 OSGI 의 참조 구현인 Equinox 런타임 환경을 기초로 하고 있다. 이클립스는 “Plugin” 이라는 용어를 사용하고 OSGI 는 “bundle” 이라는 용어를 사용하지만, 두 용어의 뜻은 같다. OSGI는 이클립스 플러그인이 다음을 정의하도록 한다.

  • their API - 다른 플러그인이 사용할 수 있는 공개된 클래스들
  • their 종속성 - 플러그인이 정확히 동작할 수 있는데 필수적인 패키지나 플러그인들

각 플러그인은 다른 플러그인들을 통해 기능을 기여하는 것이 가능하도록 정의하는 확장점을 정의하고 있다. 플러그인은 확장(이 확장점을 기능적으로 제공하는)을 이용할 수 있다.

확장과 확장점은 plugin.xml 파일에 기술된다. 이 파일은 PDE(플러그인 개발 환경)을 통해 편집될 수 있는 XML 파일이다. PDE 는 이 파일을 편집할 수 있는 사용자 인터페이스를 제공한다. 이 확장들은 이클립스 RCP 어플리케이션이 구동될 때 수집된다. 확장점의 정보는 디스크립터로 불리는 것으로 변환되고 레지스트리에 저장된다.

이클립스 RCP 어플리케이션의 주요 컴포넌트

이클립스 RCP 어플리케이션은 다음의 요소들을 필요로 한다. 컴포넌트의 정의는 이 튜토리얼의 후반부에서 설명될 것이다.

  • 메인 프로그램 - RCP 메인 어플리케이션 클래스는 IApplication 인터페이스를 구현한다. 이 클래스는 표준 자바 어플리케이션을 위한 메인 메소드와 동일하다고 볼 수 있다. 이클립스는 어플리케이션 클래스가 org.eclipse.core.runtime.application 확장점을 통해서 정의되는 것을 기대한다.
  • 퍼스펙티브 - 퍼스펙티브는 org.eclipse.ui.perspective 에서 확장된다.
  • 워크벤치 어드바이저 - 어플리케이션의 외형(메뉴, 툴바, 퍼스펙티브 등등)을 제어하는 보이지 않는 기술적 컴포넌트이다.

설정 파일

이클립스 RCP 어플리케이션은 두 개의 주요 설정 파일을 가진다.

  • MANIFEST.MF - OSGI 설정 정보를 포함한다.
  • plugin.xml - 확장과 확장점에 대한 정보
Share Comments

제5회 대학생 프로그래밍 경시대회 문제 B KTX

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class KTX {
public static void main(String[] args) {
//int[] order = {3, 2, 1};
int[] order = {2, 4, 5, 3, 1};
System.out.println(isOrder(order));
}
public static boolean isOrder(int[] order) {
int route1 = -1, route2 = -1; // 두 우회로에 있는 열차의 등급(현재는 비어있다.)
int grade = 1; // 현재 도착해야 하는 열차의 등급
for(int i = 0; i < order.length; i++) {
// 선두 열차가 현재 최고 등급이라면 지나간다.
if(order[i] == grade) {
grade++;
}
// 처음 우회로에 현재 최고 등급의 열차가 있으면 지나간다.
else if(route1 == grade) {
route1 = -1;
grade++;
}
// 다음 우회로에 현재 최고 등급의 열차가 있으면 지나간다.
else if(route2 == grade) {
route2 = -1;
grade++;
}
// 처음 우회로가 비어있으면 거기로 보낸다.
else if(route1 == -1) {
route1 = order[i];
}
// 두번째 우회로가 비어있으면 거기로 보낸다.
else if(route2 == -1) {
route2 = order[i];
}
// 위의 모든 경우가 아니라면 순서대로 보내는 것은 불가능이다.
else {
return false;
}
}
// 모든 열차가 지나갔다면 순서대로 보내는 것이 성공했다.
return true;
}
}

주절주절

이 문제도 너무 옛날에 풀어서 정확히 기억이 안난다. 시간나면 다시 풀어보아야겠다.

Share Comments