Skip to content

Commit 33379e6

Browse files
committed
feat: implement instructions customization feature
1 parent 7f0e0c7 commit 33379e6

File tree

6 files changed

+134
-15
lines changed

6 files changed

+134
-15
lines changed

com.developer.nefarious.zjoule.plugin/plugin.xml

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
<?eclipse version="3.4"?>
33
<plugin>
44

5-
<extension
6-
point="org.eclipse.ui.views">
5+
<extension point="org.eclipse.ui.views">
76
<category
87
name="ABAP Copilot"
98
id="com.developer.nefarious.zjoule.plugin">
@@ -17,16 +16,23 @@
1716
inject="true">
1817
</view>
1918
</extension>
20-
<extension
21-
point="org.eclipse.ui.perspectiveExtensions">
22-
<perspectiveExtension
23-
targetID="org.eclipse.jdt.ui.JavaPerspective">
19+
20+
<extension point="org.eclipse.ui.perspectiveExtensions">
21+
<perspectiveExtension targetID="org.eclipse.jdt.ui.JavaPerspective">
2422
<view
2523
id="com.developer.nefarious.zjoule.plugin.core.ui.ViewListener"
2624
relative="org.eclipse.ui.views.ProblemView"
2725
relationship="stack">
28-
</view>
29-
</perspectiveExtension>
30-
</extension>
26+
</view>
27+
</perspectiveExtension>
28+
</extension>
29+
30+
<extension point="org.eclipse.ui.preferencePages">
31+
<page
32+
id="com.developer.nefarious.zjoule.plugin.core.preferences.PluginPreferencesPage"
33+
name="ABAP Copilot"
34+
class="com.developer.nefarious.zjoule.plugin.core.preferences.PluginPreferencesPage">
35+
</page>
36+
</extension>
3137

3238
</plugin>

com.developer.nefarious.zjoule.plugin/src/com/developer/nefarious/zjoule/plugin/core/Activator.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.developer.nefarious.zjoule.plugin.core;
22

3+
import org.eclipse.jface.preference.IPreferenceStore;
34
import org.eclipse.ui.plugin.AbstractUIPlugin;
45
import org.osgi.framework.BundleContext;
56

@@ -102,4 +103,10 @@ public void stop(final BundleContext context) throws Exception {
102103
plugin = null;
103104
super.stop(context);
104105
}
106+
107+
@Override
108+
protected void initializeDefaultPreferences(final IPreferenceStore store) {
109+
store.setDefault("instructions", "Be a friendly SAP ABAP expert, providing concise answers aligned with best practices and clean-code principles.");
110+
111+
}
105112
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.developer.nefarious.zjoule.plugin.core.functions;
2+
3+
import java.net.MalformedURLException;
4+
import java.net.URI;
5+
import java.net.URISyntaxException;
6+
import java.net.URL;
7+
8+
import org.eclipse.jface.action.Action;
9+
import org.eclipse.jface.preference.PreferenceDialog;
10+
import org.eclipse.jface.resource.ImageDescriptor;
11+
import org.eclipse.ui.ISharedImages;
12+
import org.eclipse.ui.PlatformUI;
13+
import org.eclipse.ui.dialogs.PreferencesUtil;
14+
15+
public class PreferencesHandler extends Action {
16+
17+
private static final String ICON = "platform:/plugin/org.eclipse.egit.ui/icons/obj16/settings.png";
18+
19+
private static final String PREFERENCES_PAGE_ID = "com.developer.nefarious.zjoule.plugin.core.preferences.PluginPreferencesPage";
20+
21+
public static PreferencesHandler create() {
22+
return new PreferencesHandler();
23+
}
24+
25+
private PreferencesHandler() {
26+
setText("Preferences");
27+
setToolTipText("User settings.");
28+
setIcon();
29+
}
30+
31+
@Override
32+
public void run() {
33+
PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(null, PREFERENCES_PAGE_ID, null, null);
34+
if (dialog != null) {
35+
dialog.open();
36+
}
37+
}
38+
39+
private void setIcon() {
40+
try {
41+
URI iconURI = new URI(ICON);
42+
URL iconURL = iconURI.toURL();
43+
setImageDescriptor(ImageDescriptor.createFromURL(iconURL));
44+
} catch (URISyntaxException | MalformedURLException e) {
45+
e.printStackTrace();
46+
setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
47+
}
48+
}
49+
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.developer.nefarious.zjoule.plugin.core.preferences;
2+
3+
import org.eclipse.jface.preference.FieldEditorPreferencePage;
4+
import org.eclipse.jface.preference.StringFieldEditor;
5+
import org.eclipse.swt.SWT;
6+
import org.eclipse.swt.layout.GridData;
7+
import org.eclipse.swt.layout.GridLayout;
8+
import org.eclipse.swt.widgets.Composite;
9+
import org.eclipse.swt.widgets.Group;
10+
import org.eclipse.ui.IWorkbench;
11+
import org.eclipse.ui.IWorkbenchPreferencePage;
12+
13+
import com.developer.nefarious.zjoule.plugin.core.Activator;
14+
15+
public class PluginPreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
16+
17+
public PluginPreferencesPage() {
18+
super(GRID);
19+
setPreferenceStore(Activator.getDefault().getPreferenceStore());
20+
}
21+
22+
@Override
23+
public void init(final IWorkbench workbench) { }
24+
25+
@Override
26+
protected void createFieldEditors() {
27+
28+
Group group = new Group(getFieldEditorParent(), SWT.NONE);
29+
group.setText("Chat Settings");
30+
group.setLayout(new GridLayout(1, false));
31+
group.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
32+
33+
Composite groupContent = new Composite(group, SWT.NONE);
34+
groupContent.setLayout(new GridLayout(1, false));
35+
groupContent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
36+
37+
addField(new StringFieldEditor("instructions", "Instructions:", groupContent));
38+
39+
}
40+
41+
}

com.developer.nefarious.zjoule.plugin/src/com/developer/nefarious/zjoule/plugin/core/ui/ViewListener.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.developer.nefarious.zjoule.plugin.core.functions.ClearHandler;
1919
import com.developer.nefarious.zjoule.plugin.core.functions.LoginHandler;
2020
import com.developer.nefarious.zjoule.plugin.core.functions.LogoutHandler;
21+
import com.developer.nefarious.zjoule.plugin.core.functions.PreferencesHandler;
2122
import com.developer.nefarious.zjoule.plugin.core.functions.PromptHandler;
2223
import com.developer.nefarious.zjoule.plugin.core.utils.SystemProvider;
2324

@@ -131,6 +132,7 @@ private void setUpToolbar() {
131132
toolbar.add(LoginHandler.create(shell, browser));
132133
IMenuManager menu = getMenu();
133134
menu.add(ClearHandler.create(browser));
135+
menu.add(PreferencesHandler.create());
134136
menu.add(new Separator());
135137
menu.add(LogoutHandler.create(browser));
136138
}

com.developer.nefarious.zjoule.test/src/com/developer/nefarious/zjoule/test/core/ui/ViewListenerTest.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.developer.nefarious.zjoule.plugin.core.functions.ClearHandler;
3838
import com.developer.nefarious.zjoule.plugin.core.functions.LoginHandler;
3939
import com.developer.nefarious.zjoule.plugin.core.functions.LogoutHandler;
40+
import com.developer.nefarious.zjoule.plugin.core.functions.PreferencesHandler;
4041
import com.developer.nefarious.zjoule.plugin.core.functions.PromptHandler;
4142
import com.developer.nefarious.zjoule.plugin.core.ui.BrowserFactory;
4243
import com.developer.nefarious.zjoule.plugin.core.ui.IViewRender;
@@ -66,7 +67,9 @@ public class ViewListenerTest {
6667

6768
private MockedStatic<LogoutHandler> mockedStaticLogoutHandler;
6869

69-
private MockedStatic<SystemProvider> mockedSystemProvider;
70+
private MockedStatic<SystemProvider> mockedStaticSystemProvider;
71+
72+
private MockedStatic<PreferencesHandler> mockedStaticPreferencesHandler;
7073

7174
@Mock
7275
private Shell mockShell;
@@ -100,6 +103,9 @@ public class ViewListenerTest {
100103

101104
@Mock
102105
private LogoutHandler mockLogoutHandler;
106+
107+
@Mock
108+
private PreferencesHandler mockPreferencesHandler;
103109

104110
@BeforeEach
105111
public void setUp() {
@@ -114,7 +120,8 @@ public void setUp() {
114120
mockedStaticLoginHandler = mockStatic(LoginHandler.class);
115121
mockedStaticClearHandler = mockStatic(ClearHandler.class);
116122
mockedStaticLogoutHandler = mockStatic(LogoutHandler.class);
117-
mockedSystemProvider = mockStatic(SystemProvider.class);
123+
mockedStaticSystemProvider = mockStatic(SystemProvider.class);
124+
mockedStaticPreferencesHandler = mockStatic(PreferencesHandler.class);
118125

119126
mockedStaticSelectionListener.when(() -> SelectionListener.create(mockBrowser)).thenReturn(mockSelectionListener);
120127
mockedStaticViewRender.when(ViewRender::create).thenReturn(mockViewRender);
@@ -124,6 +131,7 @@ public void setUp() {
124131
mockedStaticLoginHandler.when(() -> LoginHandler.create(mockShell, mockBrowser)).thenReturn(mockLoginHandler);
125132
mockedStaticClearHandler.when(() -> ClearHandler.create(mockBrowser)).thenReturn(mockClearHandler);
126133
mockedStaticLogoutHandler.when(() -> LogoutHandler.create(mockBrowser)).thenReturn(mockLogoutHandler);
134+
mockedStaticPreferencesHandler.when(PreferencesHandler::create).thenReturn(mockPreferencesHandler);
127135

128136
cut = spy(new ViewListener());
129137
cut.setShell(mockShell);
@@ -132,7 +140,7 @@ public void setUp() {
132140
@Test
133141
public void shouldPlumbPartControlForWindows() {
134142
// Arrange
135-
mockedSystemProvider.when(SystemProvider::getCurrentSystem).thenReturn("Windows 95");
143+
mockedStaticSystemProvider.when(SystemProvider::getCurrentSystem).thenReturn("Windows 95");
136144
mockedStaticBrowserFactory.when(() -> BrowserFactory.create(mockParent, SWT.EDGE)).thenReturn(mockBrowser);
137145

138146
String mockBuildResult = "html-text";
@@ -171,14 +179,15 @@ public void shouldPlumbPartControlForWindows() {
171179

172180
verify(mockToolBarManager).add(mockLoginHandler);
173181
verify(mockMenuManager).add(mockClearHandler);
182+
verify(mockMenuManager).add(mockPreferencesHandler);
174183
verify(mockMenuManager).add(any(Separator.class));
175184
verify(mockMenuManager).add(mockLogoutHandler);
176185
}
177186

178187
@Test
179188
public void shouldPlumbPartControlForOtherSystems() {
180189
// Arrange
181-
mockedSystemProvider.when(SystemProvider::getCurrentSystem).thenReturn("Mac OS");
190+
mockedStaticSystemProvider.when(SystemProvider::getCurrentSystem).thenReturn("Mac OS");
182191
mockedStaticBrowserFactory.when(() -> BrowserFactory.create(mockParent, SWT.WEBKIT)).thenReturn(mockBrowser);
183192

184193
String mockBuildResult = "html-text";
@@ -217,6 +226,7 @@ public void shouldPlumbPartControlForOtherSystems() {
217226

218227
verify(mockToolBarManager).add(mockLoginHandler);
219228
verify(mockMenuManager).add(mockClearHandler);
229+
verify(mockMenuManager).add(mockPreferencesHandler);
220230
verify(mockMenuManager).add(any(Separator.class));
221231
verify(mockMenuManager).add(mockLogoutHandler);
222232
}
@@ -251,8 +261,11 @@ public void tearDown() {
251261
if (mockedStaticLogoutHandler != null) {
252262
mockedStaticLogoutHandler.close();
253263
}
254-
if (mockedSystemProvider != null) {
255-
mockedSystemProvider.close();
264+
if (mockedStaticSystemProvider != null) {
265+
mockedStaticSystemProvider.close();
266+
}
267+
if (mockedStaticPreferencesHandler != null) {
268+
mockedStaticPreferencesHandler.close();
256269
}
257270
}
258271
//CHECKSTYLE:ON CyclomaticComplexity

0 commit comments

Comments
 (0)