/* //paragraph [1] Title: [{\Large \bf \begin{center}] [\end{center}}] //paragraph [10] Footnote: [{\footnote{] [}}] //[ue] [\"{u}] //[ae] [\"{a}] //[oe] [\"{o}] //[TOC] [\tableofcontents] [1] PictureViewer: Class Definitions Dezember 2004 Christian Bohnebuck, Uwe Hartmann, Marion Langen and Holger M[ue]nx during Prof. G[ue]ting's practical course 'Extensible Database Systems' at Fernuniversit[ae]t Hagen. [TOC] 1 Introduction See the documentation of ~PictureAlgebra.h~ for a general introduction to the Picture algebra. This module is part of a SECONDO viewer ~PictureViewer~ which shows ~picture~ objects and their ~histograms~. related files: secondo/Javagui/viewer/pictureviewer/makefile secondo/Javagui/viewer/pictureviewer/PictureViewable.java secondo/Javagui/viewer/pictureviewer/PictureIcon.java secondo/Javagui/viewer/pictureviewer/PictureTable.java secondo/Javagui/viewer/pictureviewer/DisplayPicture.java secondo/Javagui/viewer/makefile secondo/Javagui/viewer/PictureViewer.java secondo/Javagui/gui.cfg secondo/Javagui/viewer/pictureviewer/DisplayHistogram.java 2 Includes and other preparations */ package viewer; import viewer.pictureviewer.*; import sj.lang.*; import javax.swing.*; import javax.swing.table.*; import java.awt.*; import java.util.*; import gui.*; import java.awt.event.*; import javax.swing.event.*; import tools.*; import java.io.*; import java.awt.image.*; import java.lang.*; import viewer.hoese.algebras.Dsplfilepath; /* 3 Class PictureViewer The class PictureViewer is an implementation of SecondoViewer. It displays relations, pictures and histograms. */ public class PictureViewer extends SecondoViewer { private JComboBox ComboBox; private JScrollPane tableScroll; private JScrollPane pictureScroll; private JPanel picturePanel; private DisplayPicture pictuPane; private JScrollPane metaScroll; private JScrollPane histogramScroll; private JTextArea metaText; private JPanel histogramPanel; private DisplayHistogram histoPane; private JComboBox zoomBox; private Vector Tables; private JPanel dummy = new JPanel(); // to show nothing private PictureTable CurrentTable; private int lastRow = -1; private int lastCol = -1; // the value of MAX_TEXT_LENGTH must be greater then five private final static int MAX_TEXT_LENGTH=100; private Dsplfilepath fileView = new Dsplfilepath(); private ListExpr filepathtype = ListExpr.symbolAtom("filepath"); /* 3.1 Constructor ~PictureViewer~ It creates all displays for relations, pictures, histograms and jpeg-metadata. */ public PictureViewer(){ /** creates a new PictureViewer **/ Tables = new Vector(); CurrentTable = null; tableScroll = new JScrollPane(); JPanel leftPane = new JPanel(new BorderLayout()); pictureScroll = new JScrollPane(); picturePanel = new JPanel(); metaScroll = new JScrollPane(); // // ComboBox - contains each command // ComboBox = new JComboBox(); ComboBox.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent evt){ showSelectedObject(); }}); // // Define objects for the graphics (Picture & Histogram) // Is there any other method ? // histoPane = new DisplayHistogram(); pictuPane = new DisplayPicture(); // // The lowPane component is divided in two parts: // One component shows the metadata and the other // my histograms ! // JSplitPane lowPane = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, metaScroll, histoPane ); lowPane.setOneTouchExpandable(true); lowPane.setResizeWeight( 0.6 ); metaText = new JTextArea( "" ); metaText.setEditable(false); metaText.setFont(new Font("Monospaced", Font.PLAIN, 10)); metaScroll.setViewportView( metaText ); // // The left part of the Visual Panel // leftPane.add( tableScroll ,BorderLayout.CENTER); // // The right part of the VisualPanel // This component is also divided in two parts: // The pictureScroll & lowPane part // JSplitPane rightPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, pictureScroll, lowPane); rightPane.setOneTouchExpandable(true); rightPane.setResizeWeight(0.65); // // VisualPanel - the main Panel of the main frame ! // It is divided in two parts. The left & right part ! // JSplitPane VisualPanel = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, leftPane, rightPane ); VisualPanel.setOneTouchExpandable(true); VisualPanel.setResizeWeight(0.4); // // The picturePanel component contains the Picture ! // pictureScroll.setViewportView( picturePanel ); picturePanel = new JPanel(new BorderLayout()); picturePanel.add( pictuPane ); // Combo box for zooming zoomBox = new JComboBox(pictuPane.getZoomNames()); zoomBox.setSelectedIndex(0); zoomBox.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent evt){ if (CurrentTable.getRowCount() == 1 && CurrentTable.getColumnCount()==1) displayTableObject(0, 0); else if (lastRow >= 0 && lastCol >= 0) displayTableObject(lastRow, lastCol); }}); // JPanel for both combo boxes JPanel comboBoxPanel = new JPanel(); comboBoxPanel.setLayout(new BorderLayout()); comboBoxPanel.add(ComboBox, BorderLayout.CENTER); comboBoxPanel.add(zoomBox, BorderLayout.EAST); // // Main Frame // setLayout(new BorderLayout()); add(comboBoxPanel,BorderLayout.NORTH); add(VisualPanel,BorderLayout.CENTER); clearAllView(); } /* 3.2 Function ~clearAllView~ This methode removes all displayed Objects from all displays */ private void clearAllView() { histoPane.removeall( ); pictuPane.removeall( ); metaText.setText("" ); tableScroll.setViewportView(dummy); // // Show no data // pictureScroll.setViewportView( picturePanel ); metaScroll.setViewportView( metaText ); histoPane.repaint(); lastRow = -1; lastCol = -1; } /* 3.3 Function ~displayTableObject~ This methode displays picture and histogram of selected row and selected column */ public void displayTableObject( int row, int col) { if(CurrentTable==null) return; Vector phVec; Dimension dim = pictureScroll.getSize(null); if (CurrentTable.getColumnType(col).equals("picture") ){ // // Get the PictureIcon of the chosen picture. This // PictureIcon contains the ListExpr and therefore // an image and the metadata could be displayed. // PictureIcon pp = CurrentTable.getPictureIcon(row,col); if (pp != null) { pictuPane.setZoom(zoomBox.getSelectedIndex()); pictuPane.set(pp.getListExpr(), dim.getWidth(), dim.getHeight()); metaText.setText( pp.getMetaData() ); } else { pictuPane.removeall(); metaText.setText( "" ); } phVec = CurrentTable.getHistogramColumns(col); } else if (CurrentTable.getColumnType(col).equals("histogram") ) { // // Try to find the appripriate picture // int picCol = CurrentTable.getPictureColumn( col ); // // A picture was found! // if ( picCol >= 0 ) { PictureIcon pp = CurrentTable.getPictureIcon( row, picCol ); if (pp != null) { pictuPane.setZoom(zoomBox.getSelectedIndex()); pictuPane.set(pp.getListExpr(), dim.getWidth(), dim.getHeight()); metaText.setText( pp.getMetaData() ); } else { pictuPane.removeall(); metaText.setText( "" ); } col = picCol; phVec = CurrentTable.getHistogramColumns(col); } else { // // There's no picture, nevertheless, show the // histogram (only this one)! // phVec = CurrentTable.getHistogramColumns(col, true); // Remove currently displayed picture.& meta data pictuPane.removeall(); metaText.setText("" ); } }if (CurrentTable.getColumnType(col).equals("filepath") ){ Dsplfilepath fileView = (Dsplfilepath) CurrentTable.getValueAt(row,col); fileView.displayExtern(); phVec = new Vector(); } else { // there is nothing to do ! // return; } // // Ok, show them my histograms ! // // Try to find the appropriate histograms. These // elements should be displayed as well ! // //Vector phVec = CurrentTable.getHistogramColumns(col); // // Show all histogram which were found // histoPane.init(); for ( int i=0; i= 1 ) { LE = LE.first(); if(LE.isAtom() ) if( LE.atomType()==ListExpr.SYMBOL_ATOM) return LE.symbolValue().trim(); } return ""; } /* 3.8 Function ~getExprPicIcon~ This methode creates an element for the table to store as picture */ private PictureIcon getExprPicIcon(ListExpr Elem) { if (Elem.listLength() != 5) return null; return new PictureIcon(Elem.fifth().textValue(), Elem); } /* 3.9 Function ~tuplereport~ This methode creates a new table as result of ListExpr. */ private PictureTable tuplereport(ListExpr LE) { String reltyp = getExprType( LE ); // // The specified ListExpr can be a picture, a histogram // or a relation. Everything else is not interesting ! // if ( (reltyp.equals("picture") )){ Vector stt = new Vector(); stt.add( "picture" ); PictureIcon pi = getExprPicIcon( LE.second() ); Vector v = new Vector(); v.add( pi ); Vector vv= new Vector(); vv.add(v); return new PictureTable( vv, stt, stt, this); } else if ( (reltyp.equals("histogram") )){ Vector v = new Vector(); v.add( getExprHistogram( LE.second() ) ); Vector vv= new Vector(); vv.add(v); Vector stty = new Vector(); stty.add( "histogram" ); return new PictureTable( vv, stty, stty, this); } else if ( !(reltyp.equals("rel") || reltyp.equals("mrel") ) ) return null; // // In case it is a relation // Vector names = new Vector(); Vector types = new Vector(); interpretTuple( LE, names, types); Vector values = getTupleValues( LE, types); return new PictureTable(values, names, types, this); } /* 3.9 Function ~showSelectedObject~ This methode shows the table of the selected object */ private void showSelectedObject(){ clearAllView(); int index = ComboBox.getSelectedIndex(); if(index>=0) { CurrentTable = (PictureTable)Tables.get(index); tableScroll.setViewportView(CurrentTable); if (CurrentTable!=null) if (CurrentTable.getRowCount()==1 && CurrentTable.getColumnCount()==1) { displayTableObject( 0, 0); } } else { tableScroll.setViewportView(dummy); } lastRow = -1; lastCol = -1; } /* 3.10 Function ~addObject~ This methode adds an Objects to the viewer, stores it and displays it. */ public boolean addObject(SecondoObject o){ if (!canDisplay(o)) return false; if (isDisplayed(o)){ selectObject(o); } else { PictureTable NTable = tuplereport(o.toListExpr()); if(NTable==null) return false; else{ Tables.add(NTable); ComboBox.addItem(o.getName()); selectObject(o); } } return true; } /* 3.11 Function ~getIndexOf~ This methode returns the index in ComboBox of S, if S not exists in ComboBox -1 is returned */ private int getIndexOf(String S){ int count = ComboBox.getItemCount(); int pos = -1; for(int i=0;i=0){ ComboBox.removeItemAt(index); Tables.remove(index); showSelectedObject(); } } /* 3.13 Function ~removeAll~ This methode removes all objects from this viewer */ public void removeAll(){ ComboBox.removeAllItems(); Tables.clear(); showSelectedObject(); } /* 3.14 Function ~getDisplayQuality~ This methode return the ability of this viewer for SO. */ public double getDisplayQuality(SecondoObject SO){ if(!canDisplay(SO)){ return 0; } // the list structure is checked at this point // thereby we can avoid a lot of tests ListExpr type = SO.toListExpr().first(); // picture or attribute if(type.isAtom()){ return 0.9; } // relation ListExpr attributes = type.second().second(); while(!attributes.isEmpty()){ String attrtype = attributes.first().second().symbolValue(); if(attrtype.equals("histogram") || attrtype.equals("picture")){ return 0.9; } attributes=attributes.rest(); } return 0.2; // not appropriate for only standard-realations } /* 3.15 Function ~canDisplay~ This methode returns true for realtions, pictures and histograms. */ public boolean canDisplay(SecondoObject o){ ListExpr LE = o.toListExpr(); if (LE.listLength() != 2) return false; ListExpr first = LE.first(); ListExpr second = LE.second(); // // We can also show Picture- and Histogram-Objects ! // if ( first.isAtom()) { if ( first.symbolValue().equals("picture") || first.symbolValue().equals("histogram" )) return true; else return false; } // // Check for relation // if ( first.listLength() != 2 ) return false; ListExpr rel = first.first(); ListExpr rfirst = first.second(); if ( rfirst.listLength() != 2 ) return false; ListExpr tuple = rfirst.first(); ListExpr attrlist = rfirst.second(); if ( ( rel.atomType() != ListExpr.SYMBOL_ATOM ) || ( ! rel.symbolValue().equals("rel") ) || ( tuple.atomType() !=ListExpr.SYMBOL_ATOM ) || ( ! tuple.symbolValue().equals("tuple")) || ( attrlist.atomType() != ListExpr.NO_ATOM ) ) { Reporter.debug( "canDisplay(): rel expected" ); return false; } if ( attrlist.listLength() == 0 ) { Reporter.debug( "canDisplay(): no attributes" ); return false; } boolean parameterOK = true; while( ! attrlist.isEmpty() ) { ListExpr elem = attrlist.first(); if (!((elem.second().atomType() == ListExpr.SYMBOL_ATOM ) && ((elem.second().symbolValue().equals("int")) || (elem.second().symbolValue().equals("real")) || (elem.second().symbolValue().equals("bool")) || (elem.second().symbolValue().equals("string")) || (elem.second().symbolValue().equals("filepath")) || (elem.second().symbolValue().equals("picture")) || (elem.second().symbolValue().equals("histogram")) || (elem.second().symbolValue().equals("instant")) ))) { Reporter.debug( "canDisplay(): unexpected parameter" ); parameterOK = false; break; } attrlist = attrlist.rest(); } if ( !parameterOK ) return false; Reporter.debug( "canDisplay(): Each Parameter is valid" ); return true; } /* 3.16 Function ~isDisplayed~ This methode checks whether o displayed */ public boolean isDisplayed(SecondoObject o){ return getIndexOf(o.getName())>=0; } /* 3.17 Function ~selectObject~ hightlighting of o */ public boolean selectObject(SecondoObject O){ int index = getIndexOf(O.getName()); if (index<0) return false; else{ ComboBox.setSelectedIndex(index); showSelectedObject(); return true; } } /* 3.18 Function ~getMenuVector~ This Methode returns that no menuevector is used. */ public MenuVector getMenuVector() { return null; } /* 3.19 Function ~setViewerControl~ This Methode sets the Control for this viewer. */ public void setViewerControl(ViewerControl VC){ this.VC = VC; } /* 3.21 Function ~getName~ This Methode returns the name of this Viewer. */ public String getName(){ return "PictureViewer"; } }