List of usage examples for com.jgoodies.binding.beans PropertyAdapter PropertyAdapter
public PropertyAdapter(ValueModel beanChannel, String propertyName)
From source file:ambit2.ui.QueryBrowser.java
License:Open Source License
protected JTable addWidgets(T model) { JTable table = new JTable() { @Override//from w w w . j a v a2 s . c o m public TableCellRenderer getCellRenderer(int row, int column) { Object value = getValueAt(row, column); Object renderer = null; if (value != null) { renderer = defaultRenderersByColumnClass.get(value.getClass()); if (renderer == null) { renderer = getDefaultRenderer(value.getClass().getSuperclass()); } } else renderer = super.getCellRenderer(row, column); if (renderer instanceof JLabel) ((JLabel) renderer).setHorizontalAlignment(SwingConstants.RIGHT); return (TableCellRenderer) renderer; } @Override public TableCellEditor getCellEditor(int row, int column) { Object value = getValueAt(row, column); Object editor = null; if (value != null) { editor = defaultEditorsByColumnClass.get(value.getClass()); if (editor != null) { return (TableCellEditor) editor; } else { return getDefaultEditor(value.getClass().getSuperclass()); } } else return super.getCellEditor(row, column); } public void createDefaultColumnsFromModel() { TableModel m = getModel(); BrowserMode mode = BrowserMode.Spreadsheet; if (m instanceof IBrowserMode) mode = ((IBrowserMode) m).getBrowserMode(); else mode = BrowserMode.Spreadsheet; if (m != null) { // Remove any current columns TableColumnModel cm = getColumnModel(); while (cm.getColumnCount() > 0) { cm.removeColumn(cm.getColumn(0)); } for (int i = 0; i < m.getColumnCount(); i++) { EditableHeaderTableColumn newColumn = new EditableHeaderTableColumn(); newColumn.setModelIndex(i); // newColumn.setCellRenderer(cellRenderer); addColumn(newColumn); if ((getColumnClass(i) == Boolean.class) && (m instanceof ISelectableRecords)) { PropertyAdapter selectionAdapter = new PropertyAdapter(this.dataModel, "selection"); SelectionInList<ISelectableRecords.SELECTION_MODE> list = new SelectionInList<ISelectableRecords.SELECTION_MODE>( ISelectableRecords.SELECTION_MODE.values(), selectionAdapter); JComboBox box = BasicComponentFactory.createComboBox(list); AutoCompleteDecorator.decorate(box); ((EditableHeaderTableColumn) newColumn).setHeaderEditor(new DefaultCellEditor(box)); } else { ((EditableHeaderTableColumn) newColumn).setHeaderEditor(new DefaultCellEditor( new JComboBox(new HeaderComboBoxModel(this, i, headerActions)))); } } if (getTableHeader() != null) getTableHeader().setColumnModel(cm); setCellSize(this); } }; }; table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); table.setTableHeader(new EditableHeader(table.getColumnModel(), false)); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); table.setRowSelectionAllowed(true); table.setColumnSelectionAllowed(false); table.setIntercellSpacing(new Dimension(3, 3)); if (model instanceof IBrowserMode) ((IBrowserMode) model).addPropertyChangeListener(getImageRenderer(BrowserMode.Spreadsheet)); table.setDefaultRenderer(Image.class, getImageRenderer(BrowserMode.Spreadsheet)); table.setDefaultRenderer(IMolecule.class, getImageRenderer(BrowserMode.Spreadsheet)); table.setDefaultRenderer(Molecule.class, getImageRenderer(BrowserMode.Spreadsheet)); table.setDefaultRenderer(AtomContainer.class, getImageRenderer(BrowserMode.Spreadsheet)); table.setDefaultRenderer(IAtomContainer.class, getImageRenderer(BrowserMode.Spreadsheet)); table.setDefaultRenderer(SuppleAtomContainer.class, getImageRenderer(BrowserMode.Spreadsheet)); table.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { // show 3d int row = browser_table.rowAtPoint(e.getPoint()); int col = browser_table.columnAtPoint(e.getPoint()); Object value = browser_table.getValueAt(row, col); JPopupMenu menu = new JPopupMenu(); buildPopupMenu(e.getComponent(), value, row, col, menu); menu.show(e.getComponent(), e.getX(), e.getY()); } } }); /* * table.setPreferredScrollableViewportSize(new Dimension( * cellSize.width * 3, (cellSize.height + 30) * 2)); */ ListSelectionListener listener = new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) return; int row = browser_table.getSelectedRow(); int col = browser_table.getSelectedColumn(); // If cell selection is enabled, both row and column change // events are fired if (e.getSource() == browser_table.getSelectionModel() && browser_table.getRowSelectionAllowed()) { row = browser_table.getSelectedRow(); } if (e.getSource() == browser_table.getColumnModel().getSelectionModel() && browser_table.getColumnSelectionAllowed()) { col = browser_table.getSelectedColumn(); } if ((browser_table.getSelectedRow() >= 0) && (browser_table.getSelectedColumn() >= 0)) setRecord(row, col); } }; table.getSelectionModel().addListSelectionListener(listener); table.getColumnModel().getSelectionModel().addListSelectionListener(listener); table.setShowHorizontalLines(BrowserMode.Spreadsheet.showGridHorizontal()); table.setShowVerticalLines(BrowserMode.Spreadsheet.showGridVertical()); table.setGridColor(Color.gray); setCellSize(table); return table; }
From source file:com.salas.bb.dialogs.AdvancedPreferencesPanel.java
License:Open Source License
private void initComponents(ValueModel triggerChannel) { chShowTipsBox = ComponentsFactory.createCheckBox( Strings.message("userprefs.tab.general.show.tip.of.the.day"), new ToggleButtonAdapter( new BufferedValueModel(TipOfTheDayDialog.showingTipsModel(), triggerChannel))); String msg = Strings.message("userprefs.tab.general.check.for.new.versions"); if (ApplicationLauncher.isAutoUpdatesEnabled()) { chDoUpdatesCheck = ComponentsFactory.createCheckBox(msg, new ToggleButtonAdapter(new BufferedValueModel( new PropertyAdapter(userPrefs, UserPreferences.PROP_CHECKING_FOR_UPDATES_ON_STARTUP), triggerChannel))); } else {/*from ww w. jav a2 s. co m*/ msg = msg.replaceAll("&", ""); chDoUpdatesCheck = new JCheckBox(msg); chDoUpdatesCheck.setSelected(true); chDoUpdatesCheck.setEnabled(false); } chAlwaysUseEnglish = ComponentsFactory .createCheckBox(Strings.message("userprefs.tab.advanced.always.use.english"), new ToggleButtonAdapter(new BufferedValueModel( new PropertyAdapter(userPrefs, UserPreferences.PROP_ALWAYS_USE_ENGLISH), triggerChannel))); tfInternetBrowser = new JTextField(); tfInternetBrowser.setDocument(new DocumentAdapter(new BufferedValueModel( new PropertyAdapter(userPrefs, UserPreferences.PROP_INTERNET_BROWSER), triggerChannel))); if (BrowserLauncher.isUsingJWSBrowser()) { tfInternetBrowser.setEnabled(false); tfInternetBrowser.setToolTipText(Strings.message("userprefs.tab.advanced.browser.tooltip.disabled")); } else { tfInternetBrowser.setEnabled(true); tfInternetBrowser.setToolTipText(Strings.message("userprefs.tab.advanced.browser.tooltip.enabled")); } initProxyComponents(triggerChannel); SpinnerModelAdapter spinModelFeedSelectionDelay = new SpinnerModelAdapter(new BoundedRangeAdapter( new BufferedValueModel(new PropertyAdapter(userPrefs, UserPreferences.PROP_FEED_SELECTION_DELAY), triggerChannel), 0, 0, 1000)); spinModelFeedSelectionDelay.setStepSize(100); chAAText = createCheckBox(userPrefs, Strings.message("userprefs.tab.advanced.antialiased.fonts"), UserPreferences.PROP_AA_TEXT); // The following code registers listener on Apply/Accept actions to track down // changes in BlogStarz limits. If changes are detected then channel list is // repainted. saveInitialLimits(); triggerChannel.addValueChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { if (Boolean.TRUE.equals(evt.getNewValue())) doRepaintChannelList(); } }); chShowUnreadButtonMenu = createCheckBox(userPrefs, Strings.message("userprefs.tab.advanced.show.the.unread.buttons.menu"), UserPreferences.PROP_SHOW_UNREAD_BUTTON_MENU); SpinnerModelAdapter spinModelFeedImportLimit = new SpinnerModelAdapter(new BoundedRangeAdapter( new BufferedValueModel(new PropertyAdapter(userPrefs, UserPreferences.PROP_FEED_IMPORT_LIMIT), triggerChannel), 1, 1, UserPreferences.MAX_FEED_IMPORT_LIMITATION)); spinModelFeedImportLimit.setStepSize(100); spinFeedImportLimit = new JSpinner(spinModelFeedImportLimit); initGuideComponents(triggerChannel); chHideOldArticles = createCheckBox(feedRS, Strings.message("userprefs.tab.articles.hide.articles.older.than"), "suppressingOlderThan"); chDisplayFullTitles = createCheckBox(feedRS, Strings.message("userprefs.tab.articles.display.full.titles"), "displayingFullTitles"); chSortingAscending = createCheckBox(feedRS, Strings.message("userprefs.tab.articles.sort.earlier.articles.first"), "sortingAscending"); tfSuppressOlderThan = new JTextField(); tfSuppressOlderThan.setDocument(new DocumentAdapter( new BufferedValueModel(new PropertyAdapter(feedRS, "suppressOlderThanString"), triggerChannel))); chCopyLinksInHREFFormat = createCheckBox(userPrefs, Strings.message("userprefs.tab.articles.use.href.format.for.links.copied.to.clipboard"), UserPreferences.PROP_COPY_LINKS_IN_HREF_FORMAT); chBrowseOnTitleDblClick = createCheckBox(userPrefs, Strings.message("userprefs.tab.articles.browse.on.double.click.over.the.title"), UserPreferences.PROP_BROWSE_ON_DBL_CLICK); chShowAppIconInSystray = createCheckBox(userPrefs, Strings.message("userprefs.tab.advanced.show.appicon.in.systray"), UserPreferences.PROP_SHOW_APPICON_IN_SYSTRAY); chMinimizeToSystray = createCheckBox(userPrefs, Strings.message("userprefs.tab.advanced.minimize.to.systray"), UserPreferences.PROP_MINIMIZE_TO_SYSTRAY); // Dock icon ValueModel modeModel = new BufferedValueModel( new BIDModeToStringConverter(new PropertyAdapter(userPrefs, UserPreferences.PROP_DIB_MODE)), triggerChannel); cbBIDMode = new JComboBox(new ComboBoxAdapter(BIDModeToStringConverter.MODES, modeModel)); }
From source file:com.salas.bb.dialogs.AdvancedPreferencesPanel.java
License:Open Source License
private void initGuideComponents(ValueModel triggerChannel) { // Guide selection mode group ValueModel gsmModel = new BufferedValueModel( new PropertyAdapter(userPrefs, UserPreferences.PROP_GUIDE_SELECTION_MODE), triggerChannel); rbGSMFirst = createRadioButton(gsmModel, UserPreferences.GSM_FIRST_FEED, Strings.message("userprefs.tab.guides.select.first.feed")); rbGSMLastSeen = createRadioButton(gsmModel, UserPreferences.GSM_LAST_SEEN_FEED, Strings.message("userprefs.tab.guides.select.last.seen.feed")); rbGSMNoFeed = createRadioButton(gsmModel, UserPreferences.GSM_NO_FEED, Strings.message("userprefs.tab.guides.select.no.feed")); // Publication chPing = createCheckBox(userPrefs, Strings.message("userprefs.tab.guides.ping.url"), UserPreferences.PROP_PING_ON_RL_PUBLICATION); chPing.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { updatePingURLState();//from w ww . j a va2s . c o m } }); tfPingURL = new JTextField(); tfPingURL.setDocument(new DocumentAdapter(new BufferedValueModel( new PropertyAdapter(userPrefs, UserPreferences.PROP_PING_ON_RL_PUBLICATION_URL), triggerChannel))); updatePingURLState(); String ttPing = Strings.message("userprefs.tab.guides.ping.wording"); chPing.setToolTipText(ttPing); tfPingURL.setToolTipText(ttPing); }
From source file:com.salas.bb.dialogs.AdvancedPreferencesPanel.java
License:Open Source License
/** * Initializes proxy components.// w w w. j a v a 2s.c o m * * @param triggerChannel trigger. */ private void initProxyComponents(ValueModel triggerChannel) { chProxyEnabled = createCheckBox(userPrefs, Strings.message("userprefs.tab.advanced.use.proxy"), UserPreferences.PROP_PROXY_ENABLED); tfProxyHost = new JTextField(); tfProxyHost.setDocument(new DocumentAdapter(new BufferedValueModel( new PropertyAdapter(userPrefs, UserPreferences.PROP_PROXY_HOST), triggerChannel))); lbProxyPort = ComponentsFactory.createLabel(Strings.message("userprefs.tab.advanced.use.proxy.port")); spinProxyPort = new JSpinner(new SpinnerModelAdapter(new BoundedRangeAdapter(new BufferedValueModel( new PropertyAdapter(userPrefs, UserPreferences.PROP_PROXY_PORT), triggerChannel), 80, 80, 65536))); spinProxyPort.setEditor(new JSpinner.NumberEditor(spinProxyPort, "#")); lbProxyExclusions = ComponentsFactory.createLabel(Strings.message("userprefs.tab.advanced.no.proxy.for")); tfProxyExclusions = new JTextField(); tfProxyExclusions.setDocument(new DocumentAdapter(new BufferedValueModel( new PropertyAdapter(userPrefs, UserPreferences.PROP_PROXY_EXCLUSIONS), triggerChannel))); StateUpdatingToggleListener.install(chProxyEnabled, tfProxyHost, lbProxyPort, spinProxyPort, lbProxyExclusions, tfProxyExclusions); }
From source file:com.salas.bb.dialogs.AdvancedPreferencesPanel.java
License:Open Source License
/** * Helper function to create a checkbox. * @param obj Object holding property./*from w ww .j ava 2s . com*/ * @param label Label for checkbox. * @param propertyName Property to save on object. * @return new JCheckbox. */ private JCheckBox createCheckBox(Object obj, String label, String propertyName) { return ComponentsFactory.createCheckBox(label, new ToggleButtonAdapter( new BufferedValueModel(new PropertyAdapter(obj, propertyName), triggerChannel))); }
From source file:com.salas.bb.dialogs.GeneralPreferencesPanel.java
License:Open Source License
private void initComponents(UserPreferences settings, FeedRenderingSettings frs, ValueModel triggerChannel) { chReadOnChanChange = ComponentsFactory.createCheckBox( Strings.message("userprefs.tab.general.when.changing.feeds.mark.all.articles.read"), new ToggleButtonAdapter(new BufferedValueModel( new PropertyAdapter(settings, UserPreferences.PROP_MARK_READ_WHEN_CHANGING_CHANNELS), triggerChannel)));/*from ww w . j av a 2s .co m*/ chReadOnGuideChange = ComponentsFactory.createCheckBox( Strings.message("userprefs.tab.general.when.changing.guides.mark.all.articles.read"), new ToggleButtonAdapter(new BufferedValueModel( new PropertyAdapter(settings, UserPreferences.PROP_MARK_READ_WHEN_CHANGING_GUIDES), triggerChannel))); chReadOnDelay = ComponentsFactory.createCheckBox( Strings.message("userprefs.tab.general.mark.article.as.read.on.delay"), new ToggleButtonAdapter(new BufferedValueModel( new PropertyAdapter(settings, UserPreferences.PROP_MARK_READ_AFTER_DELAY), triggerChannel))); tfReadOnDelaySeconds = new JTextField(); tfReadOnDelaySeconds.setDocument(new DocumentAdapter(new BufferedValueModel( new PropertyAdapter(settings, "markReadAfterSecondsString"), triggerChannel))); configurePurgeControls(settings, triggerChannel); rssPollInterval = new JTextField(); rssPollInterval.setDocument(new DocumentAdapter( new BufferedValueModel(new PropertyAdapter(settings, "rssPollIntervalString"), triggerChannel))); cbTheme = new JComboBox(); ValueModel valueModel = new BufferedValueModel(new PropertyAdapter(frs, RenderingSettingsNames.THEME), triggerChannel); cbTheme.setModel(new ThemeListModel(valueModel)); cbFontFamilies = new JComboBox(); final BufferedValueModel vmMainFont = new BufferedValueModel(new MainFontFamilyValueModel(frs), triggerChannel); cbFontFamilies.setModel(new FontFamiliesListModel(vmMainFont)); valueModel.addValueChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { Theme theme = (Theme) evt.getNewValue(); Font newFont = theme.getMainFontDirect(); vmMainFont.setValue(newFont.getFamily()); } }); chShowToolbar = ComponentsFactory.createCheckBox(Strings.message("userprefs.tab.general.show.toolbar"), new ToggleButtonAdapter(new BufferedValueModel( new PropertyAdapter(settings, UserPreferences.PROP_SHOW_TOOLBAR), triggerChannel))); chShowToolbarLabels = ComponentsFactory .createCheckBox(Strings.message("userprefs.tab.general.show.toolbar.labels"), new ToggleButtonAdapter(new BufferedValueModel( new PropertyAdapter(settings, UserPreferences.PROP_SHOW_TOOLBAR_LABELS), triggerChannel))); chShowToolbar.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onShowToolbar(); } }); onShowToolbar(); }
From source file:com.salas.bb.dialogs.GeneralPreferencesPanel.java
License:Open Source License
/** * Configures the purge controls.//w ww.j a v a2 s . c om * * @param settings settings. * @param triggerChannel trigger. */ private void configurePurgeControls(UserPreferences settings, ValueModel triggerChannel) { PropertyAdapter propCheck, propCount; propCheck = new PropertyAdapter(settings, UserPreferences.PROP_PRESERVE_UNREAD); propCount = new PropertyAdapter(settings, "purgeCountString"); BufferedValueModel modelCheck = null, modelCount; // The order of initialization dictates the order of events upon change. // We need checkbox event to be fired before the count when it wasn't selected initially, // and vice versa when it was. if (!settings.isPreserveUnread()) modelCheck = new BufferedValueModel(propCheck, triggerChannel); modelCount = new BufferedValueModel(propCount, triggerChannel); if (settings.isPreserveUnread()) modelCheck = new BufferedValueModel(propCheck, triggerChannel); chDoNotRemoveUnread = ComponentsFactory.createCheckBox( Strings.message("userprefs.tab.general.do.not.purge.unread.articles"), new ToggleButtonAdapter(modelCheck)); purgeCount = new JTextField(); purgeCount.setDocument(new DocumentAdapter(modelCount)); }
From source file:com.salas.bb.dialogs.ReadingListsPanel.java
License:Open Source License
/** Initializes components. */ private void initComponents() { // Updating/*from w ww .j a va 2 s. c o m*/ rbUpdateManually = ComponentsFactory .createRadioButton(Strings.message("userprefs.tab.readinglists.updates.manual")); rbUpdatePeriodically = ComponentsFactory .createRadioButton(Strings.message("userprefs.tab.readinglists.updates.periodical")); cbUpdatePeriod = new JComboBox(new Object[] { PERIOD_ONCE_PER_RUN, PERIOD_DAILY, PERIOD_HOURLY }); ButtonGroup g1 = new ButtonGroup(); g1.add(rbUpdateManually); g1.add(rbUpdatePeriodically); setUpdatePeriodState(); PeriodMonitor monitor = new PeriodMonitor(new BufferedValueModel( new PropertyAdapter(prefs, UserPreferences.PROP_READING_LIST_UPDATE_PERIOD), triggerChannel)); rbUpdateManually.addChangeListener(monitor); rbUpdatePeriodically.addChangeListener(monitor); cbUpdatePeriod.addItemListener(monitor); ValueModel updatesModel = new BufferedValueModel( new PropertyAdapter(prefs, UserPreferences.PROP_ON_READING_LIST_UPDATE_ACTIONS), triggerChannel); // Applying changes rbChangeSilently = ComponentsFactory.createRadioButton( Strings.message("userprefs.tab.readinglists.action.accept.silently"), new RadioButtonAdapter(updatesModel, new Integer(UserPreferences.RL_UPDATE_NONE))); rbChangeWithNotification = ComponentsFactory.createRadioButton( Strings.message("userprefs.tab.readinglists.action.notify"), new RadioButtonAdapter(updatesModel, new Integer(UserPreferences.RL_UPDATE_NOTIFY))); rbChangeWithConfirmation = ComponentsFactory.createRadioButton( Strings.message("userprefs.tab.readinglists.action.confirm"), new RadioButtonAdapter(updatesModel, new Integer(UserPreferences.RL_UPDATE_CONFIRM))); // Get Latest command actions chUpdateFeeds = ComponentsFactory.createCheckBox( Strings.message("userprefs.tab.readinglists.command.latest.articles"), new ToggleButtonAdapter(new BufferedValueModel( new PropertyAdapter(prefs, UserPreferences.PROP_UPDATE_FEEDS), triggerChannel))); chUpdateReadingLists = ComponentsFactory .createCheckBox(Strings.message("userprefs.tab.readinglists.command.lists.changes"), new ToggleButtonAdapter(new BufferedValueModel( new PropertyAdapter(prefs, UserPreferences.PROP_UPDATE_READING_LISTS), triggerChannel))); new MandatoryCheckBoxController(chUpdateFeeds, chUpdateReadingLists); }
From source file:com.salas.bb.dialogs.StarzPanel.java
License:Open Source License
/** * Helper to create and configure a JSlider. * * @param propertyName name of property to bind to. * * @return newly created JSlider./*from w w w. j a va2 s.co m*/ */ private JSlider createStarzSlider(String propertyName) { JSlider res; res = new JSlider(); res.setOrientation(SwingConstants.HORIZONTAL); res.setMaximum(4); res.setMinimum(0); res.setPaintTicks(true); res.setMajorTickSpacing(1); res.setSnapToTicks(true); res.setModel(new BoundedRangeAdapter( new BufferedValueModel(new PropertyAdapter(preferences, propertyName), triggerChannel), 0, 0, 4)); return res; }
From source file:com.salas.bb.dialogs.TagsPreferencesPanel.java
License:Open Source License
/** * Initializes components.//from w w w . ja v a 2 s .c o m * * @param bbsAllowed <code>TRUE</code> if BB Service selection is allowed. * @param triggerChannel changes commit trigger channel. */ private void initComponents(boolean bbsAllowed, ValueModel triggerChannel) { initRadioButtons(bbsAllowed, triggerChannel); tfDeliciousUser = new JTextField(); tfDeliciousUser.setDocument(new DocumentAdapter(new BufferedValueModel( new PropertyAdapter(this.userPrefs, UserPreferences.PROP_TAGS_DELICIOUS_USER), triggerChannel))); tfDeliciousPassword = new JPasswordField(); tfDeliciousPassword.setDocument(new DocumentAdapter(new BufferedValueModel( new PropertyAdapter(this.userPrefs, UserPreferences.PROP_TAGS_DELICIOUS_PASSWORD), triggerChannel))); ValueModel autoFetchModel = new BufferedValueModel( new PropertyAdapter(userPrefs, UserPreferences.PROP_TAGS_AUTOFETCH), triggerChannel); chAutoFetch = ComponentsFactory.createCheckBox(Strings.message("userprefs.tab.tags.autofetch"), new ToggleButtonAdapter(autoFetchModel)); lbBBSWording = ComponentsFactory .createWrappedMultilineLabel(Strings.message("userprefs.tab.tags.wording.bbservice")); lbDIUWording = ComponentsFactory .createWrappedMultilineLabel(Strings.message("userprefs.tab.tags.wording.delicious")); chPinTagging = ComponentsFactory.createCheckBox("Tag pins with", new ToggleButtonAdapter(new BufferedValueModel( new PropertyAdapter(userPrefs, UserPreferences.PROP_PIN_TAGGING), triggerChannel))); tfPinTags = new JTextField(); tfPinTags.setDocument(new DocumentAdapter(new BufferedValueModel( new PropertyAdapter(userPrefs, UserPreferences.PROP_PIN_TAGS), triggerChannel))); }