*/
private Backend backend;
+ /**
+ * Get the Backend.
+ *
+ * @return the Backend
+ */
+ public final Backend getBackend() {
+ return backend;
+ }
+
/**
* Get the Screen.
*
* @param y row position
*/
private void invertCell(final int x, final int y) {
- synchronized (getScreen()) {
- CellAttributes attr = getScreen().getAttrXY(x, y);
- attr.setForeColor(attr.getForeColor().invert());
- attr.setBackColor(attr.getBackColor().invert());
- getScreen().putAttrXY(x, y, attr, false);
+ if (debugThreads) {
+ System.err.printf("invertCell() %d %d\n", x, y);
}
+ CellAttributes attr = getScreen().getAttrXY(x, y);
+ attr.setForeColor(attr.getForeColor().invert());
+ attr.setBackColor(attr.getBackColor().invert());
+ getScreen().putAttrXY(x, y, attr, false);
}
/**
}
if (!repaint) {
- if ((oldMouseX != mouseX) || (oldMouseY != mouseY)) {
- // The only thing that has happened is the mouse moved.
- // Clear the old position and draw the new position.
- invertCell(oldMouseX, oldMouseY);
- invertCell(mouseX, mouseY);
- oldMouseX = mouseX;
- oldMouseY = mouseY;
+ if (debugThreads) {
+ System.err.printf("drawAll() !repaint\n");
}
- if (getScreen().isDirty()) {
- backend.flushScreen();
+ synchronized (getScreen()) {
+ if ((oldMouseX != mouseX) || (oldMouseY != mouseY)) {
+ // The only thing that has happened is the mouse moved.
+ // Clear the old position and draw the new position.
+ invertCell(oldMouseX, oldMouseY);
+ invertCell(mouseX, mouseY);
+ oldMouseX = mouseX;
+ oldMouseY = mouseY;
+ }
+ if (getScreen().isDirty()) {
+ backend.flushScreen();
+ }
+ return;
}
- return;
}
if (debugThreads) {
// Draw the mouse pointer
invertCell(mouseX, mouseY);
+ oldMouseX = mouseX;
+ oldMouseY = mouseY;
// Place the cursor if it is visible
TWidget activeWidget = null;
}
// Flush the screen contents
- backend.flushScreen();
+ if (getScreen().isDirty()) {
+ backend.flushScreen();
+ }
repaint = false;
}
// wait until either the backend or the consumer threads have
// something to do.
try {
+ if (debugThreads) {
+ System.err.println("sleep " + timeout + " millis");
+ }
synchronized (this) {
this.wait(timeout);
}
if (event instanceof TKeypressEvent) {
TKeypressEvent keypress = (TKeypressEvent) event;
- // See if this key matches an accelerator, and if so dispatch the
- // menu event.
- TKeypress keypressLowercase = keypress.getKey().toLowerCase();
- TMenuItem item = null;
- synchronized (accelerators) {
- item = accelerators.get(keypressLowercase);
+ // See if this key matches an accelerator, and is not being
+ // shortcutted by the active window, and if so dispatch the menu
+ // event.
+ boolean windowWillShortcut = false;
+ for (TWindow window: windows) {
+ if (window.isActive()) {
+ if (window.isShortcutKeypress(keypress.getKey())) {
+ // We do not process this key, it will be passed to
+ // the window instead.
+ windowWillShortcut = true;
+ }
+ }
}
- if (item != null) {
- if (item.isEnabled()) {
- // Let the menu item dispatch
- item.dispatch();
- return;
+
+ if (!windowWillShortcut) {
+ TKeypress keypressLowercase = keypress.getKey().toLowerCase();
+ TMenuItem item = null;
+ synchronized (accelerators) {
+ item = accelerators.get(keypressLowercase);
+ }
+ if (item != null) {
+ if (item.isEnabled()) {
+ // Let the menu item dispatch
+ item.dispatch();
+ return;
+ }
}
}
+
// Handle the keypress
if (onKeypress(keypress)) {
return;
return false;
}
+ /**
+ * Display the about dialog.
+ */
+ protected void showAboutDialog() {
+ messageBox("About", "Jexer Version " +
+ this.getClass().getPackage().getImplementationVersion(),
+ TMessageBox.Type.OK);
+ }
+
/**
* Method that TApplication subclasses can override to handle menu
* events.
closeAllWindows();
return true;
}
+ if (menu.getId() == TMenu.MID_ABOUT) {
+ showAboutDialog();
+ return true;
+ }
return false;
}
*
* @param event new event to add to the queue
*/
- public final void addMenuEvent(final TInputEvent event) {
+ public final void postMenuEvent(final TInputEvent event) {
synchronized (fillEventQueue) {
fillEventQueue.add(event);
}
return windowMenu;
}
+ /**
+ * Convenience function to add a default "Help" menu.
+ *
+ * @return the new menu
+ */
+ public final TMenu addHelpMenu() {
+ TMenu helpMenu = addMenu("&Help");
+ helpMenu.addDefaultItem(TMenu.MID_HELP_CONTENTS);
+ helpMenu.addDefaultItem(TMenu.MID_HELP_INDEX);
+ helpMenu.addDefaultItem(TMenu.MID_HELP_SEARCH);
+ helpMenu.addDefaultItem(TMenu.MID_HELP_PREVIOUS);
+ helpMenu.addDefaultItem(TMenu.MID_HELP_HELP);
+ helpMenu.addDefaultItem(TMenu.MID_HELP_ACTIVE_FILE);
+ helpMenu.addSeparator();
+ helpMenu.addDefaultItem(TMenu.MID_ABOUT);
+ return helpMenu;
+ }
+
/**
* Close all open windows.
*/
if (activeMenu != null) {
return;
}
-
- synchronized (windows) {
- for (TWindow window: windows) {
- closeWindow(window);
- }
+ while (windows.size() > 0) {
+ closeWindow(windows.get(0));
}
}