kopia lustrzana https://github.com/maccasoft/z80-tools
422 wiersze
11 KiB
Java
422 wiersze
11 KiB
Java
/*
|
|
* Copyright (c) 2018 Marco Maccaferri and others.
|
|
* All rights reserved.
|
|
*
|
|
* This program and the accompanying materials are made available under
|
|
* the terms of the Eclipse Public License v1.0 which accompanies this
|
|
* distribution, and is available at
|
|
* http://www.eclipse.org/legal/epl-v10.html
|
|
*/
|
|
|
|
package com.maccasoft.tools;
|
|
|
|
import java.io.File;
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
|
|
import org.eclipse.core.databinding.observable.Realm;
|
|
import org.eclipse.jface.databinding.swt.DisplayRealm;
|
|
import org.eclipse.swt.SWT;
|
|
import org.eclipse.swt.custom.CTabFolder;
|
|
import org.eclipse.swt.events.DisposeEvent;
|
|
import org.eclipse.swt.events.DisposeListener;
|
|
import org.eclipse.swt.events.MenuEvent;
|
|
import org.eclipse.swt.events.MenuListener;
|
|
import org.eclipse.swt.events.SelectionAdapter;
|
|
import org.eclipse.swt.events.SelectionEvent;
|
|
import org.eclipse.swt.graphics.FontMetrics;
|
|
import org.eclipse.swt.graphics.GC;
|
|
import org.eclipse.swt.graphics.Image;
|
|
import org.eclipse.swt.graphics.Rectangle;
|
|
import org.eclipse.swt.layout.FillLayout;
|
|
import org.eclipse.swt.widgets.Composite;
|
|
import org.eclipse.swt.widgets.Display;
|
|
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 com.maccasoft.tools.internal.ImageRegistry;
|
|
|
|
public class Application {
|
|
|
|
public static final String APP_TITLE = "Z80 Tools";
|
|
public static final String APP_VERSION = "0.0.0";
|
|
|
|
Display display;
|
|
Shell shell;
|
|
|
|
CTabFolder tabFolder;
|
|
|
|
public Application() {
|
|
|
|
}
|
|
|
|
public void open() {
|
|
display = Display.getDefault();
|
|
|
|
shell = new Shell(display);
|
|
shell.setText(APP_TITLE);
|
|
|
|
Image[] images = new Image[] {
|
|
ImageRegistry.getImageFromResources("app128.png"),
|
|
ImageRegistry.getImageFromResources("app64.png"),
|
|
ImageRegistry.getImageFromResources("app48.png"),
|
|
ImageRegistry.getImageFromResources("app32.png"),
|
|
ImageRegistry.getImageFromResources("app16.png"),
|
|
};
|
|
shell.setImages(images);
|
|
|
|
Menu menu = new Menu(shell, SWT.BAR);
|
|
createFileMenu(menu);
|
|
createEditMenu(menu);
|
|
createToolsMenu(menu);
|
|
createHelpMenu(menu);
|
|
shell.setMenuBar(menu);
|
|
|
|
Rectangle screen = display.getClientArea();
|
|
|
|
Rectangle rect = new Rectangle(0, 0, (int) ((float) screen.width / (float) screen.height * 800), 800);
|
|
rect.x = (screen.width - rect.width) / 2;
|
|
rect.y = (screen.height - rect.height) / 2;
|
|
if (rect.y < 0) {
|
|
rect.height += rect.y * 2;
|
|
rect.y = 0;
|
|
}
|
|
|
|
shell.setLocation(rect.x, rect.y);
|
|
shell.setSize(rect.width, rect.height);
|
|
|
|
FillLayout layout = new FillLayout();
|
|
layout.marginWidth = layout.marginHeight = 5;
|
|
shell.setLayout(layout);
|
|
|
|
createContents(shell);
|
|
|
|
shell.open();
|
|
|
|
shell.addDisposeListener(new DisposeListener() {
|
|
|
|
@Override
|
|
public void widgetDisposed(DisposeEvent e) {
|
|
ImageRegistry.dispose();
|
|
}
|
|
});
|
|
}
|
|
|
|
void createFileMenu(Menu parent) {
|
|
final Menu menu = new Menu(parent.getParent(), SWT.DROP_DOWN);
|
|
menu.addMenuListener(new MenuListener() {
|
|
|
|
@Override
|
|
public void menuShown(MenuEvent e) {
|
|
MenuItem[] item = menu.getItems();
|
|
for (int i = 0; i < item.length; i++) {
|
|
item[i].dispose();
|
|
}
|
|
populateFileMenu(menu);
|
|
}
|
|
|
|
@Override
|
|
public void menuHidden(MenuEvent e) {
|
|
}
|
|
});
|
|
populateFileMenu(menu);
|
|
|
|
MenuItem item = new MenuItem(parent, SWT.CASCADE);
|
|
item.setText("&File");
|
|
item.setMenu(menu);
|
|
}
|
|
|
|
void populateFileMenu(Menu menu) {
|
|
MenuItem item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("New");
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Open...");
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
new MenuItem(menu, SWT.SEPARATOR);
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Save\tCtrl+S");
|
|
item.setAccelerator(SWT.MOD1 + 'S');
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Save As...");
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Save All\tCtrl+Shift+S");
|
|
item.setAccelerator(SWT.MOD1 + SWT.MOD2 + 'S');
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
new MenuItem(menu, SWT.SEPARATOR);
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Preferences");
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
new MenuItem(menu, SWT.SEPARATOR);
|
|
|
|
populateLruFiles(menu);
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Exit");
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
shell.dispose();
|
|
}
|
|
});
|
|
}
|
|
|
|
void populateLruFiles(Menu menu) {
|
|
int index = 0;
|
|
|
|
Iterator<String> iter = new ArrayList<String>().iterator();
|
|
while (iter.hasNext() && index < 4) {
|
|
final File fileToOpen = new File(iter.next());
|
|
MenuItem item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText(String.format("%d %s", index + 1, fileToOpen.getName()));
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
index++;
|
|
}
|
|
|
|
if (index > 0) {
|
|
new MenuItem(menu, SWT.SEPARATOR);
|
|
}
|
|
}
|
|
|
|
void createEditMenu(Menu parent) {
|
|
Menu menu = new Menu(parent.getParent(), SWT.DROP_DOWN);
|
|
|
|
MenuItem item = new MenuItem(parent, SWT.CASCADE);
|
|
item.setText("&Edit");
|
|
item.setMenu(menu);
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Undo\tCtrl+Z");
|
|
item.setAccelerator(SWT.MOD1 + 'Z');
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Redo\tCtrl+Shift+Z");
|
|
item.setAccelerator(SWT.MOD1 + SWT.MOD2 + 'Z');
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
new MenuItem(menu, SWT.SEPARATOR);
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Cut\tCtrl+X");
|
|
item.setAccelerator(SWT.MOD1 + 'X');
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Copy\tCtrl+C");
|
|
item.setAccelerator(SWT.MOD1 + 'C');
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Paste\tCtrl+V");
|
|
item.setAccelerator(SWT.MOD1 + 'V');
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
new MenuItem(menu, SWT.SEPARATOR);
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Select All\tCtrl+A");
|
|
item.setAccelerator(SWT.MOD1 + 'A');
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
}
|
|
|
|
void createToolsMenu(Menu parent) {
|
|
Menu menu = new Menu(parent.getParent(), SWT.DROP_DOWN);
|
|
|
|
MenuItem item = new MenuItem(parent, SWT.CASCADE);
|
|
item.setText("&Tools");
|
|
item.setMenu(menu);
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Verify / Compile\tCtrl+R");
|
|
item.setAccelerator(SWT.MOD1 + 'R');
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Upload Intel HEX");
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
|
|
new MenuItem(menu, SWT.SEPARATOR);
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("Serial Terminal\tCtrl+Shift+T");
|
|
item.setAccelerator(SWT.MOD1 + SWT.MOD2 + 'T');
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
|
|
}
|
|
});
|
|
}
|
|
|
|
void createHelpMenu(Menu parent) {
|
|
Menu menu = new Menu(parent.getParent(), SWT.DROP_DOWN);
|
|
|
|
MenuItem item = new MenuItem(parent, SWT.CASCADE);
|
|
item.setText("&Help");
|
|
item.setMenu(menu);
|
|
|
|
item = new MenuItem(menu, SWT.PUSH);
|
|
item.setText("About " + APP_TITLE);
|
|
item.addListener(SWT.Selection, new Listener() {
|
|
|
|
@Override
|
|
public void handleEvent(Event e) {
|
|
AboutDialog dlg = new AboutDialog(shell);
|
|
dlg.open();
|
|
}
|
|
});
|
|
}
|
|
|
|
protected void createContents(Composite parent) {
|
|
GC gc = new GC(parent);
|
|
FontMetrics fontMetrics = gc.getFontMetrics();
|
|
gc.dispose();
|
|
|
|
tabFolder = new CTabFolder(parent, SWT.BORDER);
|
|
tabFolder.setTabHeight((int) (fontMetrics.getHeight() * 1.5));
|
|
tabFolder.addSelectionListener(new SelectionAdapter() {
|
|
|
|
@Override
|
|
public void widgetSelected(SelectionEvent e) {
|
|
|
|
}
|
|
});
|
|
}
|
|
|
|
static {
|
|
System.setProperty("SWT_GTK3", "0");
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
final Display display = new Display();
|
|
|
|
Realm.runWithDefault(DisplayRealm.getRealm(display), new Runnable() {
|
|
|
|
@Override
|
|
public void run() {
|
|
try {
|
|
Application app = new Application();
|
|
app.open();
|
|
|
|
while (display.getShells().length != 0) {
|
|
if (!display.readAndDispatch()) {
|
|
display.sleep();
|
|
}
|
|
}
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
return;
|
|
}
|
|
}
|
|
});
|
|
|
|
display.dispose();
|
|
}
|
|
}
|