!7 concept Profile { S name, options; S computerID; // to send clipboard etc (optional) S passwordID; // global ID to send to #1029670 bool hasPassword() { ret nempty(passwordID); } bool hasComputerID() { ret nempty(computerID); } } cmodule2 VNCViewerTrayIcon > DynCRUD { transient TrayIcon trayIcon; switchable bool inProcess; // don't think true works yet transient ReliableSingleThread rstMakeTrayIcon = dm_rst(this, r makeTrayIcon); SimpleCRUD makeCRUD() { var crud = super.makeCRUD(); //crud.editOnDoubleClick = false; ret crud; } start { db(); onConceptsChangeAndNow(r { doLater(2.0, rstMakeTrayIcon) }); } void makeTrayIcon enter { disposeTrayIcon(trayIcon); new L menuItems; // no left-click action for (Profile p : sortConceptsByID(list(Profile))) if (nemptyAfterTrim(p.options)) addAll(menuItems, "VNC to " + p.name, rThread { launch(p) }); add(menuItems, "---"); L withComputerID = filter(p -> p.hasComputerID(), list(Profile)); if (nempty(withComputerID)) { for (Profile p : withComputerID) { addAll(menuItems, "Send clipboard to " + p.name, rThreadEnter { dm_sendClipboardTo_verbose(p.computerID) }); addAll(menuItems, "Grab clipboard from " + p.name, rThreadEnter { dm_grabClipboardFrom_verbose(p.computerID) }); } add(menuItems, "---"); } addAll(menuItems, "VNC Viewer Connection Dialog", rThread { if (inProcess) launchVNCViewer_inProcess(); else launchVNCViewer() }); addAll(menuItems, "Edit Profiles...", rThread dm_activateOSAndModule); pcall { trayIcon = installTrayIcon(#1101468, "Start VNC Viewer", menuItems); } } afterVisualize { // TODO: disable when at beginning/end of list addSelectionDependentButton("Move Up", r { Profile a = selected(), b = itemBefore(list(), a); if (a != null && b != null) swapConceptIDs(a, b); }); addSelectionDependentButton("Move Down", r { Profile a = selected(), b = itemAfter(list(), a); if (a != null && b != null) swapConceptIDs(a, b); }); addSelectionDependentButton("Connect", rThread { launch(selected()); }); tablePopupMenu_first(table(), voidfunc(JPopupMenu menu, int row) { Profile p = selected(), ret if null; addMenuItem(menu, "Connect", r { launch(p) }); if (p.hasPassword()) addMenuItem(menu, "Copy password", rThreadEnter { copyPassword(p) }); if (p.hasComputerID()) addMenuItem(menu, "Send clipboard there", rThreadEnter { dm_sendClipboardTo_verbose(p.computerID) }); }); } void cleanMeUp { disposeTrayIcon(trayIcon); } void copyPassword(Profile p) { dm_copyPasswordForGlobalIDToClipboard(p.passwordID); } void launch(Profile p) { if (p == null) ret; copyPassword(p); if (inProcess) launchVNCViewer_inProcess(p.options); else launchVNCViewer(p.options); } }