z80-tools/src/com/maccasoft/tools/Application.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();
}
}