Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Шаблоны и примеры

Главная   Библиотека   Шаблоны и примеры

Java-апплет: альтернатива встроенному представлению

Соков Василий Викторович
ООО Системы качества
sokov@qm-s.com

О возможностях использования такого интерфейсного элемента как представление, кажется, много писать не надо. Не стоит писать и об ограничениях, налагаемых на эти самые возможности в силу определенных правил, которые способствуют высокой скорости доступа к документам базы Notes, но держат в жестких рамках полет фантазии разработчиков
Впрочем, о разработке представлений достаточно полно рассказано в материалах этого проекта:
Динамический отбор документов в представления (перейти >>>)
Как отобразить документы... (перейти >>>)
Проектирование представлений (перейти >>>)
Появление в версии 5 встроенных представлений дало возможность для более интересных решений, но не сняло основных ограничений:
- Для реализации динамического отбора документов существует три возможности - использование Single show category во встроенном представлении или приблизительно похожей по функционалу @-функции @SetViewInfo, замена представлений папками с реализацией их программного наполнения или, начиная с версии R6, встроенной возможностью программного доступа к формуле отбора. Недостаточная гибкость первого варианта (к примеру, тяжело вывести в одной категории документы за произвольный временной отрезок) и сложность поддержки "многопотоковости" в двух других вариантах решения (Представление-то одно, как быть в случае, если нужно сравнить результаты двух "запросов"?) остаются камнем преткновения при проектировании
- По-прежнему невозможно обойти фундаментальные ограничения: в одном представлении отобразить документы из различных баз Notes, в одной строке представления оперировать с данными из нескольких документов
Собственно, как альтернатива представлению, функционирующему по заложенным в него правилам, можно рассматривать самописный элемент дизайна, чей функционал ограничивается лишь фантазией разработчика
Понятное дело, в апплете, "расширяющем" возможности представления, не стоит отказываться от некоторых привычных и удобных функций оригинала
Из наличествующих вариантов моделей - JTable и JTree - в апплете использована модель JTable, по крайней мере пока, ибо иерархию в таблицу вписать будет нелегко, проще их скомбинировать, взяв за основу JTable (дерево JTree в одиночку не подходит, т.к. требуется не просто отображать, скажем, дочерние документы, но и отображать их статусы цветом или иконкой, иметь возможность редактировать эти самые данные аналогично тем функциям, которые есть в представлении).

Скачать пример >>>

Подключение стандартных java-классов и объявление класса апплета
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;
import javax.swing.table.*;
import javax.swing.border.*;

import lotus.domino.*;

public class appTable extends JApplet implements Runnable{

private int columnCount;
private int rowCount;
private String server;
private String dbname;
private String[] columnHeader;
private String[] columnWidth;
private String[] columnFormula;
private String[][] cellsValues;
private String[] ids;
private JTable table;
private DefaultTableModel model;
private JPopupMenu pm;
private Container contentPane;


Инициализация апплета
public void init(){
getParams();
getTable();

contentPane=getContentPane();

JScrollPane jsp=new JScrollPane(table);
jsp.setBorder(new BevelBorder(BevelBorder.RAISED));

contentPane.add(jsp,BorderLayout.CENTER);
   
if(getParameter("addMenuBar")!=null)
setJMenuBar(getMenuBar());
   
try{
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}
catch(Exception e){e.printStackTrace();}
}

Конструирование окна апплета
private void getTable(){
model=new DefaultTableModel(cellsValues,columnHeader);
table=new JTable(model); // таблица
table.setGridColor(Color.lightGray);// цвет сетки

if(getParameter("addPopupMenu")!=null){
table.add(getPopupMenu()); // добавление меню
table.addMouseListener(new PopupListener()); // добавление обработчика событий мыши
}

if (getParameter("horizScroll")!=null)
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

if (getParameter("multiString")!=null)
table.setDefaultRenderer(table.getColumnClass(0),new JTextCellRenderer());

setColumnWidths();

}

private void setColumnWidths(){
TableColumnModel cmodel=table.getColumnModel();
TableColumn column;
for(int i=0;i<columnCount;i++){
column=cmodel.getColumn(i);
column.setPreferredWidth(Integer.parseInt(columnWidth[i]));
}
}

public void refreshTable(Session session,DocumentCollection dc) throws NotesException{
setCellsValues(session,dc);
model.setDataVector(cellsValues,columnHeader);
setColumnWidths();
table.updateUI();
}

Формирование объектов меню
private JPopupMenu getPopupMenu(){
pm=new JPopupMenu();

JMenuItem open=new JMenuItem(" открыть документ ");
open.addActionListener(new openListener());
open.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn026.gif")));

JMenuItem delete=new JMenuItem(" удалить документ ");
delete.addActionListener(new deleteListener());
delete.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn081.gif")));

JMenuItem edit=new JMenuItem(" изменить документ ");
edit.addActionListener(new editListener());
edit.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn012.gif")));

JMenuItem refresh=new JMenuItem(" обновить данные ");
refresh.addActionListener(new refreshListener());
refresh.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn033.gif")));

edit.setEnabled(getParameter("enableEditing")!=null);
delete.setEnabled(getParameter("enableDeleting")!=null);
open.setEnabled(getParameter("enableOpening")!=null);
refresh.setEnabled(getParameter("enableRefreshing")!=null);

pm.add(open);
pm.add(edit);
pm.addSeparator();
pm.add(delete);
pm.addSeparator();
pm.add(refresh);

return pm;
}

private JMenuBar getMenuBar(){
JMenuBar jmb=new JMenuBar();

JMenu docMenu=new JMenu("Документ");
docMenu.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn001.gif")));

JMenuItem open=new JMenuItem(" открыть ");
open.addActionListener(new openListener());
open.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn026.gif")));

JMenuItem delete=new JMenuItem(" удалить ");
delete.addActionListener(new deleteListener());
delete.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn081.gif")));

JMenuItem edit=new JMenuItem(" изменить ");
edit.addActionListener(new editListener());
edit.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn012.gif")));

JMenuItem refresh=new JMenuItem(" обновить ");
refresh.addActionListener(new refreshListener());
refresh.setIcon(new ImageIcon(getImage(getCodeBase(), "img/vwicn033.gif")));

edit.setEnabled(getParameter("enableEditing")!=null);
delete.setEnabled(getParameter("enableDeleting")!=null);
open.setEnabled(getParameter("enableOpening")!=null);
refresh.setEnabled(getParameter("enableRefreshing")!=null);

docMenu.add(open);
docMenu.add(edit);
docMenu.addSeparator();
docMenu.add(delete);
docMenu.addSeparator();
docMenu.add(refresh);

jmb.add(docMenu);
jmb.setBorder(new BevelBorder(BevelBorder.RAISED));

return jmb;
}


Из классов обработки событий комментариев требует класс открытия документа
Открытие документа реализовано с использованием обработки операционной системой URL-адреса с префиксом notes://
Подробнее об использовании гиперссылки на объект см. здесь >>>
Для того, чтобы передать эту гиперссылку для обработки Windows вызывается выполнение внешней программы - в данном случае, виндовсового Explorer, - и передачи ему Notes-ссылки в качестве параметра командной строки:
process=Runtime.getRuntime().exec("explorer notes://server/dbname/view/docID?OpenDocument")
Собственно, класс обработки этого события выглядит следующим образом:
private class openListener implements ActionListener{
public void actionPerformed(ActionEvent e){
try{
NotesThread.sinitThread();
Session session=NotesFactory.createSession();
Database db=session.getDatabase(server,dbname);

int[] rows=table.getSelectedRows();

Process process=null;
String runPath="explorer " + "notes://" + session.evaluate("@Name([cn];'"+server+"')").firstElement()+ "/"+dbname+"/$defaultview/";

for (int i=0;i<rows.length;i++)
process=Runtime.getRuntime().exec(runPath+ids[rows[i]]+"?OpenDocument");

DocumentCollection dc=db.search(getParameter("searchFormula"));
setCellsValues(session,dc);
}
catch(Exception e2){
e2.printStackTrace();
}
finally{
NotesThread.stermThread();
}
}

Полный код апплета и базу с примером работы апплета читатель найдет в прилагаемом к материалу файле (Скачать пример >>>)
Для корректной работы примера нужно, чтобы в клиенте Notes была включена (Команда Главного меню File -> Preferences -> User Preferences... поле Additional Options) возможность выполнения java-апплетов (Enable Java applets)
И, конечно же, стоит предварительно переподписать дизайн базы или внести соответствующие изменения в ECL рабочей станции
Апплет встроен в форму родительского документа (parentForm)

Читайте на Notesnet.ru:
Java-апплет для визуализации графических объектов >>>
 
  Опубликовано — 12/17/2004 |    



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :


Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU