Return-Path: Delivered-To: apmail-incubator-chemistry-commits-archive@minotaur.apache.org Received: (qmail 36846 invoked from network); 22 Jul 2010 11:20:52 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 22 Jul 2010 11:20:52 -0000 Received: (qmail 41196 invoked by uid 500); 22 Jul 2010 11:20:52 -0000 Delivered-To: apmail-incubator-chemistry-commits-archive@incubator.apache.org Received: (qmail 41077 invoked by uid 500); 22 Jul 2010 11:20:50 -0000 Mailing-List: contact chemistry-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: chemistry-dev@incubator.apache.org Delivered-To: mailing list chemistry-commits@incubator.apache.org Received: (qmail 41042 invoked by uid 99); 22 Jul 2010 11:20:48 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 22 Jul 2010 11:20:48 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 22 Jul 2010 11:20:37 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 7A86D2388A64; Thu, 22 Jul 2010 11:19:12 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: svn commit: r966582 [1/3] - in /incubator/chemistry/opencmis-swingclient/trunk: ./ src/ src/main/ src/main/assembly/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/chemistry/ src/main/java/org/apache/chemistry/open... Date: Thu, 22 Jul 2010 11:19:11 -0000 To: chemistry-commits@incubator.apache.org From: fmui@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100722111912.7A86D2388A64@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: fmui Date: Thu Jul 22 11:19:09 2010 New Revision: 966582 URL: http://svn.apache.org/viewvc?rev=966582&view=rev Log: initial CMIS Swing Client code Added: incubator/chemistry/opencmis-swingclient/trunk/ incubator/chemistry/opencmis-swingclient/trunk/pom.xml (with props) incubator/chemistry/opencmis-swingclient/trunk/src/ incubator/chemistry/opencmis-swingclient/trunk/src/main/ incubator/chemistry/opencmis-swingclient/trunk/src/main/assembly/ incubator/chemistry/opencmis-swingclient/trunk/src/main/assembly/client-assembly.xml (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientFrame.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientHelper.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientWriterAppender.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateDocumentDialog.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateFolderDialog.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderPanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderTable.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/InfoDialog.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LogFrame.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LoginDialog.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/QueryFrame.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/RepositoryInfoFrame.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/SwingClient.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/TypesFrame.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/actions/ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/actions/CancelCheckOutPanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/actions/CheckInPanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/actions/CheckOutPanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/actions/DeleteContentStreamPanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/actions/DeletePanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/actions/DeleteTreePanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/actions/MovePanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/actions/SetContentStreamPanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/details/ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/details/ACLTable.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/details/AbstractDetailsTable.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/details/ActionsPanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/details/DetailsTabs.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/details/ObjectPanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/details/PolicyTable.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/details/PropertyTable.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/details/RelationshipTable.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/details/RenditionTable.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/details/VersionTable.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/model/ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/model/ClientModel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/model/ClientModelEvent.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/model/ClientSession.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/model/FolderListener.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/model/MIMETypes.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/model/ObjectListener.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/swing/ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/swing/ActionPanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/swing/CreateDialog.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/swing/InfoPanel.java (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/ incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/META-INF/ incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/META-INF/README (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/ incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/connect.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/document.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/folder.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/info.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/log.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/newdocument.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/newfolder.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/policy.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/query.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/relationship.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/repository-info.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/images/types.png (with props) incubator/chemistry/opencmis-swingclient/trunk/src/main/resources/log4j.properties (with props) Added: incubator/chemistry/opencmis-swingclient/trunk/pom.xml URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/pom.xml?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/pom.xml (added) +++ incubator/chemistry/opencmis-swingclient/trunk/pom.xml Thu Jul 22 11:19:09 2010 @@ -0,0 +1,209 @@ + + + + + + + 4.0.0 + + + org.apache + apache + 7 + + + + + org.apache.chemistry.opencmis.swingclient + chemistry-opencmis-swingclient + OpenCMIS Swing Client + 0.1.0-incubating-SNAPSHOT + jar + + + The Apache Software Foundation + http://www.apache.org/ + + + http://incubator.apache.org/chemistry/ + + Hudson Zones Apache + http://hudson.zones.apache.org/hudson/view/Chemistry/ + + 2010 + + OpenCMIS Swing Client is a CMIS desktop client. + + + + + Apache 2 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + scm:svn:http://svn.apache.org/repos/asf/incubator/chemistry/opencmis-swingclient/trunk + scn:svn:https://svn.apache.org/repos/asf/incubator/chemistry/opencmis-swingclient/trunk + http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk + + + + Jira + https://issues.apache.org/jira/browse/CMIS + + + + + Chemistry Development List + chemistry-dev-subscribe@incubator.apache.org + chemistry-dev-unsubscribe@incubator.apache.org + chemistry-dev@incubator.apache.org + + http://mail-archives.apache.org/mod_mbox/incubator-chemistry-dev/ + + + + Chemistry Source Control List + chemistry-commits-subscribe@incubator.apache.org + chemistry-commits-unsubscribe@incubator.apache.org + chemistry-commits@incubator.apache.org + + http://mail-archives.apache.org/mod_mbox/incubator-chemistry-commits/ + + + + + + + Florian Müller + fmui + + committer + + fmui@apache.org + + + + + + UTF-8 + 1.5 + 1.5 + + + + + + + maven-assembly-plugin + 2.2-beta-5 + + + + + + true + maven-compiler-plugin + + ${maven.compile.target} + ${maven.compile.source} + UTF-8 + + + + true + maven-source-plugin + 2.1 + + + attach-sources + + jar-no-fork + + + + + true + + + + maven-resources-plugin + 2.3 + + UTF-8 + false + + + + maven-eclipse-plugin + + true + true + . + + + + maven-jar-plugin + + + false + + org.apache.chemistry.opencmis.swingclient.SwingClient + true + lib/ + + + ${maven.compile.source} + ${maven.compile.target} + + + + + + maven-assembly-plugin + + + src/main/assembly/client-assembly.xml + + + + + + + + + org.apache.chemistry.opencmis + chemistry-opencmis-client-impl + 0.2.0-incubating-SNAPSHOT + + + log4j + log4j + 1.2.16 + + + + org.apache + apache-jar-resource-bundle + 1.4 + provided + + + + Propchange: incubator/chemistry/opencmis-swingclient/trunk/pom.xml ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/assembly/client-assembly.xml URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/assembly/client-assembly.xml?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/assembly/client-assembly.xml (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/assembly/client-assembly.xml Thu Jul 22 11:19:09 2010 @@ -0,0 +1,61 @@ + + + + + bin + + zip + tar.gz + + false + + + + ${project.build.directory}/classes/META-INF + + + README* + LICENSE* + NOTICE* + DEPENDENCIES* + + + + + ${project.build.directory} + + *.jar + + + *source* + + + + + + + lib + false + runtime + + + + Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/assembly/client-assembly.xml ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientFrame.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientFrame.java?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientFrame.java (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientFrame.java Thu Jul 22 11:19:09 2010 @@ -0,0 +1,244 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.chemistry.opencmis.swingclient; + +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JToolBar; + +import org.apache.chemistry.opencmis.swingclient.details.DetailsTabs; +import org.apache.chemistry.opencmis.swingclient.model.ClientModel; +import org.apache.chemistry.opencmis.swingclient.model.ClientSession; + +public class ClientFrame extends JFrame { + + private static final long serialVersionUID = 1L; + + private static final String WINDOW_TITLE = "CMIS Swing Client"; + + private static final int BUTTON_CONNECT = 0; + private static final int BUTTON_REPOSITORY_INFO = 1; + private static final int BUTTON_TYPES = 2; + private static final int BUTTON_QUERY = 3; + private static final int BUTTON_CREATE_DOCUMENT = 4; + private static final int BUTTON_CREATE_FOLDER = 5; + private static final int BUTTON_LOG = 8; + private static final int BUTTON_INFO = 9; + + private LoginDialog loginDialog; + private LogFrame logFrame; + private InfoDialog infoDialog; + + private JToolBar toolBar; + private JButton[] toolbarButton; + + private FolderPanel folderPanel; + private DetailsTabs detailsTabs; + + private ClientModel model; + + public ClientFrame() { + super(); + + model = new ClientModel(); + createGUI(); + showLoginForm(); + } + + private void createGUI() { + setTitle(WINDOW_TITLE); + setPreferredSize(new Dimension(1000, 600)); + setMinimumSize(new Dimension(200, 60)); + + setLayout(new BorderLayout()); + + final ClientFrame thisFrame = this; + loginDialog = new LoginDialog(this); + logFrame = new LogFrame(); + infoDialog = new InfoDialog(this); + + Container pane = getContentPane(); + + toolBar = new JToolBar("CMIS Toolbar", JToolBar.HORIZONTAL); + + toolbarButton = new JButton[10]; + + toolbarButton[BUTTON_CONNECT] = new JButton("Connection", ClientHelper + .getIcon("connect.png")); + toolbarButton[BUTTON_CONNECT].addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + showLoginForm(); + } + }); + + toolBar.add(toolbarButton[BUTTON_CONNECT]); + + toolBar.addSeparator(); + + toolbarButton[BUTTON_REPOSITORY_INFO] = new JButton("Repository Info", + ClientHelper.getIcon("repository-info.png")); + toolbarButton[BUTTON_REPOSITORY_INFO].setEnabled(false); + toolbarButton[BUTTON_REPOSITORY_INFO] + .addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new RepositoryInfoFrame(model); + } + }); + + toolBar.add(toolbarButton[BUTTON_REPOSITORY_INFO]); + + toolbarButton[BUTTON_TYPES] = new JButton("Types", ClientHelper + .getIcon("types.png")); + toolbarButton[BUTTON_TYPES].setEnabled(false); + toolbarButton[BUTTON_TYPES].addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new TypesFrame(model); + } + }); + + toolBar.add(toolbarButton[BUTTON_TYPES]); + + toolbarButton[BUTTON_QUERY] = new JButton("Query", ClientHelper + .getIcon("query.png")); + toolbarButton[BUTTON_QUERY].setEnabled(false); + toolbarButton[BUTTON_QUERY].addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new QueryFrame(model); + } + }); + + toolBar.add(toolbarButton[BUTTON_QUERY]); + + toolBar.addSeparator(); + + toolbarButton[BUTTON_CREATE_DOCUMENT] = new JButton("Create Document", + ClientHelper.getIcon("newdocument.png")); + toolbarButton[BUTTON_CREATE_DOCUMENT].setEnabled(false); + toolbarButton[BUTTON_CREATE_DOCUMENT] + .addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new CreateDocumentDialog(thisFrame, model); + } + }); + + toolBar.add(toolbarButton[BUTTON_CREATE_DOCUMENT]); + + toolbarButton[BUTTON_CREATE_FOLDER] = new JButton("Create Folder", + ClientHelper.getIcon("newfolder.png")); + toolbarButton[BUTTON_CREATE_FOLDER].setEnabled(false); + toolbarButton[BUTTON_CREATE_FOLDER] + .addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + new CreateFolderDialog(thisFrame, model); + } + }); + + toolBar.add(toolbarButton[BUTTON_CREATE_FOLDER]); + + toolBar.addSeparator(); + + toolbarButton[BUTTON_LOG] = new JButton("Log", ClientHelper + .getIcon("log.png")); + toolbarButton[BUTTON_LOG].addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + logFrame.showFrame(); + } + }); + + toolBar.add(toolbarButton[BUTTON_LOG]); + + toolbarButton[BUTTON_INFO] = new JButton("Info", ClientHelper + .getIcon("info.png")); + toolbarButton[BUTTON_INFO].addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + infoDialog.showDialog(); + } + }); + + toolBar.add(toolbarButton[BUTTON_INFO]); + + pane.add(toolBar, BorderLayout.PAGE_START); + + folderPanel = new FolderPanel(model); + detailsTabs = new DetailsTabs(model); + + JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, + folderPanel, new JScrollPane(detailsTabs)); + + pane.add(split, BorderLayout.CENTER); + + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + pack(); + + split.setDividerLocation(500); + + setLocationRelativeTo(null); + setVisible(true); + } + + private void showLoginForm() { + loginDialog.showDialog(); + if (!loginDialog.isCanceled()) { + ClientSession clientSession = loginDialog.getClientSession(); + + model.setClientSession(clientSession); + + try { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + model.loadFolder(clientSession.getSession().getRepositoryInfo() + .getRootFolderId(), false); + model.loadObject(clientSession.getSession().getRepositoryInfo() + .getRootFolderId()); + + toolbarButton[BUTTON_REPOSITORY_INFO].setEnabled(true); + toolbarButton[BUTTON_TYPES].setEnabled(true); + toolbarButton[BUTTON_QUERY].setEnabled(model.supportsQuery()); + toolbarButton[BUTTON_CREATE_DOCUMENT].setEnabled(true); + toolbarButton[BUTTON_CREATE_FOLDER].setEnabled(true); + + setTitle(WINDOW_TITLE + + " - " + + clientSession.getSession().getRepositoryInfo() + .getName()); + } catch (Exception ex) { + toolbarButton[BUTTON_REPOSITORY_INFO].setEnabled(false); + toolbarButton[BUTTON_TYPES].setEnabled(false); + toolbarButton[BUTTON_QUERY].setEnabled(false); + toolbarButton[BUTTON_CREATE_DOCUMENT].setEnabled(false); + toolbarButton[BUTTON_CREATE_FOLDER].setEnabled(false); + + ClientHelper.showError(null, ex); + + setTitle(WINDOW_TITLE); + } finally { + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + } + } +} Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientFrame.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientHelper.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientHelper.java?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientHelper.java (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientHelper.java Thu Jul 22 11:19:09 2010 @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.chemistry.opencmis.swingclient; + +import java.awt.Component; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URL; +import java.util.GregorianCalendar; + +import javax.swing.ImageIcon; +import javax.swing.JFileChooser; +import javax.swing.JOptionPane; + +import org.apache.chemistry.opencmis.client.api.Document; +import org.apache.chemistry.opencmis.commons.data.ContentStream; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class ClientHelper { + + private static Log log = LogFactory.getLog(ClientHelper.class); + + public static void showError(Component parent, Exception ex) { + log.error(ex.getClass().getSimpleName() + ": " + ex.getMessage(), ex); + + JOptionPane.showMessageDialog(parent, ex.getClass().getSimpleName() + + "\n" + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); + } + + public static ImageIcon getIcon(String name) { + URL imageURL = ClientHelper.class.getResource("/images/" + name); + if (imageURL != null) { + return new ImageIcon(imageURL); + } + + return null; + } + + public static String getDateString(GregorianCalendar cal) { + if (cal == null) { + return "-"; + } + + return cal.getTime().toString(); + } + + public static void download(Component component, Document doc, + String streamId) { + String filename = doc.getContentStreamFileName(); + + if (filename == null) { + return; + } + + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setSelectedFile(new File(filename)); + + int chooseResult = fileChooser.showDialog(component, "Download"); + if (chooseResult == JFileChooser.APPROVE_OPTION) { + InputStream inStream = null; + OutputStream outStream = null; + try { + ContentStream content = doc.getContentStream(streamId); + inStream = new BufferedInputStream(content.getStream()); + outStream = new FileOutputStream(fileChooser.getSelectedFile()); + + byte[] buffer = new byte[4096]; + int b; + while ((b = inStream.read(buffer)) > -1) { + outStream.write(buffer, 0, b); + } + } catch (Exception e) { + showError(component, e); + } finally { + if (inStream != null) { + try { + inStream.close(); + } catch (IOException e) { + } + } + if (outStream != null) { + try { + outStream.close(); + } catch (IOException e) { + } + } + } + } + } +} Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientHelper.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientWriterAppender.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientWriterAppender.java?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientWriterAppender.java (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientWriterAppender.java Thu Jul 22 11:19:09 2010 @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.chemistry.opencmis.swingclient; + +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; + +import org.apache.log4j.WriterAppender; +import org.apache.log4j.spi.LoggingEvent; + +public class ClientWriterAppender extends WriterAppender { + + private static JTextArea logTextArea = null; + + public static void setTextArea(JTextArea textArea) { + logTextArea = textArea; + } + + @Override + public void append(LoggingEvent loggingEvent) { + if (logTextArea == null) { + return; + } + + final String message = layout.format(loggingEvent); + + SwingUtilities.invokeLater(new Runnable() { + public void run() { + logTextArea.append(message); + } + }); + } +} Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/ClientWriterAppender.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateDocumentDialog.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateDocumentDialog.java?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateDocumentDialog.java (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateDocumentDialog.java Thu Jul 22 11:19:09 2010 @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.chemistry.opencmis.swingclient; + +import java.awt.BorderLayout; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; + +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import org.apache.chemistry.opencmis.commons.definitions.DocumentTypeDefinition; +import org.apache.chemistry.opencmis.commons.enums.BaseTypeId; +import org.apache.chemistry.opencmis.commons.enums.VersioningState; +import org.apache.chemistry.opencmis.swingclient.model.ClientModel; +import org.apache.chemistry.opencmis.swingclient.swing.CreateDialog; + +public class CreateDocumentDialog extends CreateDialog { + + private static final long serialVersionUID = 1L; + + private JTextField nameField; + private JComboBox typeBox; + private JTextField filenameField; + private JComboBox versioningStateBox; + + public CreateDocumentDialog(Frame owner, ClientModel model) { + super(owner, "Create Document", model); + createGUI(); + } + + private void createGUI() { + final CreateDocumentDialog thisDialog = this; + + nameField = new JTextField(60); + createRow("Name:", nameField, 0); + + typeBox = new JComboBox(getTypes(BaseTypeId.CMIS_DOCUMENT.value())); + typeBox.setSelectedIndex(0); + typeBox.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + DocumentTypeDefinition type = (DocumentTypeDefinition) ((ObjectTypeItem) typeBox + .getSelectedItem()).getObjectType(); + if (type.isVersionable()) { + versioningStateBox.setSelectedItem(VersioningState.MAJOR); + } else { + versioningStateBox.setSelectedItem(VersioningState.NONE); + } + } + }); + + createRow("Type:", typeBox, 1); + + JPanel filePanel = new JPanel(new BorderLayout()); + + filenameField = new JTextField(30); + filePanel.add(filenameField, BorderLayout.CENTER); + + JButton browseButton = new JButton("Browse"); + browseButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent event) { + JFileChooser fileChooser = new JFileChooser(); + int chooseResult = fileChooser.showDialog(filenameField, + "Select"); + if (chooseResult == JFileChooser.APPROVE_OPTION) { + if (fileChooser.getSelectedFile().isFile()) { + filenameField.setText(fileChooser.getSelectedFile() + .getAbsolutePath()); + if (nameField.getText().trim().length() == 0) { + nameField.setText(fileChooser.getSelectedFile() + .getName()); + } + } + } + } + }); + filePanel.add(browseButton, BorderLayout.LINE_END); + + createRow("File:", filePanel, 2); + + versioningStateBox = new JComboBox(new Object[] { VersioningState.NONE, + VersioningState.MAJOR, VersioningState.MINOR, + VersioningState.CHECKEDOUT }); + if (((DocumentTypeDefinition) ((ObjectTypeItem) typeBox + .getSelectedItem()).getObjectType()).isVersionable()) { + versioningStateBox.setSelectedItem(VersioningState.MAJOR); + } else { + versioningStateBox.setSelectedItem(VersioningState.NONE); + } + createRow("Versioning State:", versioningStateBox, 3); + + JButton createButton = new JButton("Create Document"); + createButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent event) { + String name = nameField.getText(); + String type = ((ObjectTypeItem) typeBox.getSelectedItem()) + .getObjectType().getId(); + String filename = filenameField.getText(); + + try { + getClientModel().createDocument( + name, + type, + filename, + (VersioningState) versioningStateBox + .getSelectedItem()); + getClientModel().reloadFolder(); + + thisDialog.setVisible(false); + thisDialog.dispose(); + } catch (Exception e) { + ClientHelper.showError(null, e); + } + } + }); + createRow("", createButton, 4); + + showDialog(); + } +} Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateDocumentDialog.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateFolderDialog.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateFolderDialog.java?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateFolderDialog.java (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateFolderDialog.java Thu Jul 22 11:19:09 2010 @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.chemistry.opencmis.swingclient; + +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JTextField; + +import org.apache.chemistry.opencmis.commons.enums.BaseTypeId; +import org.apache.chemistry.opencmis.swingclient.model.ClientModel; +import org.apache.chemistry.opencmis.swingclient.swing.CreateDialog; + +public class CreateFolderDialog extends CreateDialog { + + private static final long serialVersionUID = 1L; + + private JTextField nameField; + private JComboBox typeBox; + + public CreateFolderDialog(Frame owner, ClientModel model) { + super(owner, "Create Folder", model); + createGUI(); + } + + private void createGUI() { + final CreateFolderDialog thisDialog = this; + + nameField = new JTextField(60); + createRow("Name:", nameField, 0); + + typeBox = new JComboBox(getTypes(BaseTypeId.CMIS_FOLDER.value())); + typeBox.setSelectedIndex(0); + createRow("Type:", typeBox, 1); + + JButton createButton = new JButton("Create Folder"); + createButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent event) { + String name = nameField.getText(); + String type = ((ObjectTypeItem) typeBox.getSelectedItem()) + .getObjectType().getId(); + + try { + getClientModel().createFolder(name, type); + getClientModel().reloadFolder(); + + thisDialog.setVisible(false); + thisDialog.dispose(); + } catch (Exception e) { + ClientHelper.showError(null, e); + } + } + }); + createRow("", createButton, 3); + + showDialog(); + } +} Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/CreateFolderDialog.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderPanel.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderPanel.java?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderPanel.java (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderPanel.java Thu Jul 22 11:19:09 2010 @@ -0,0 +1,158 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.chemistry.opencmis.swingclient; + +import java.awt.BorderLayout; +import java.awt.Cursor; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; + +import org.apache.chemistry.opencmis.client.api.Folder; +import org.apache.chemistry.opencmis.swingclient.model.ClientModel; +import org.apache.chemistry.opencmis.swingclient.model.ClientModelEvent; +import org.apache.chemistry.opencmis.swingclient.model.FolderListener; + +public class FolderPanel extends JPanel implements FolderListener { + + private static final long serialVersionUID = 1L; + + private ClientModel model; + + private String parentId; + + private JButton upButton; + private JTextField pathField; + private JButton goButton; + private FolderTable folderTable; + + public FolderPanel(ClientModel model) { + super(); + + this.model = model; + model.addFolderListener(this); + createGUI(); + } + + public void folderLoaded(ClientModelEvent event) { + Folder currentFolder = event.getClientModel().getCurrentFolder(); + + if (currentFolder != null) { + String path = currentFolder.getPath(); + pathField.setText(path); + + Folder parent = currentFolder.getFolderParent(); + if (parent == null) { + parentId = null; + upButton.setEnabled(false); + } else { + parentId = parent.getId(); + upButton.setEnabled(true); + } + } else { + pathField.setText("???"); + parentId = null; + upButton.setEnabled(false); + } + } + + private void createGUI() { + setLayout(new BorderLayout()); + + JPanel panel = new JPanel(); + // panel.setLayout(new FlowLayout(FlowLayout.LEFT, 2, 3)); + panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); + panel.setBorder(BorderFactory.createEmptyBorder(3, 0, 2, 0)); + + upButton = new JButton("up"); + upButton.setEnabled(false); + upButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + model.loadFolder(parentId, false); + model.loadObject(model.getCurrentFolder().getId()); + } catch (Exception ex) { + ClientHelper.showError(null, ex); + return; + } finally { + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + } + }); + panel.add(upButton); + + pathField = new JTextField(""); + pathField.addKeyListener(new KeyListener() { + public void keyTyped(KeyEvent e) { + } + + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + loadFolder(); + } + } + + public void keyPressed(KeyEvent e) { + } + }); + panel.add(pathField); + + goButton = new JButton("go"); + goButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + loadFolder(); + } + }); + panel.add(goButton); + + add(panel, BorderLayout.PAGE_START); + + folderTable = new FolderTable(model); + folderTable.setFillsViewportHeight(true); + model.addFolderListener(folderTable); + + add(new JScrollPane(folderTable), BorderLayout.CENTER); + } + + private void loadFolder() { + try { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + String id = pathField.getText().trim(); + if (id.length() == 0) { + id = "/"; + } + model.loadFolder(id, id.startsWith("/")); + model.loadObject(model.getCurrentFolder().getId()); + } catch (Exception ex) { + ClientHelper.showError(null, ex); + return; + } finally { + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + } +} Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderPanel.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderTable.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderTable.java?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderTable.java (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderTable.java Thu Jul 22 11:19:09 2010 @@ -0,0 +1,235 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.chemistry.opencmis.swingclient; + +import java.awt.Cursor; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.ImageIcon; +import javax.swing.JTable; +import javax.swing.ListSelectionModel; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableColumn; + +import org.apache.chemistry.opencmis.client.api.CmisObject; +import org.apache.chemistry.opencmis.client.api.Document; +import org.apache.chemistry.opencmis.client.api.Folder; +import org.apache.chemistry.opencmis.commons.enums.BaseTypeId; +import org.apache.chemistry.opencmis.swingclient.model.ClientModel; +import org.apache.chemistry.opencmis.swingclient.model.ClientModelEvent; +import org.apache.chemistry.opencmis.swingclient.model.FolderListener; + +public class FolderTable extends JTable implements FolderListener { + + private static final long serialVersionUID = 1L; + + private static final String[] COLUMN_NAMES = { "", "Name", "Type", + "Content Type", "Size", "Creation Date", "Created by", + "Modification Date", "Modified by", "Id" }; + private static final int[] COLUMN_WIDTHS = { 24, 200, 150, 150, 80, 200, + 100, 200, 100, 300 }; + + private ClientModel model; + + private Map icons; + + public FolderTable(final ClientModel model) { + super(); + + this.model = model; + + setModel(new FolderTableModel()); + + setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + setAutoResizeMode(AUTO_RESIZE_OFF); + setAutoCreateRowSorter(true); + + for (int i = 0; i < COLUMN_WIDTHS.length; i++) { + TableColumn column = getColumnModel().getColumn(i); + column.setPreferredWidth(COLUMN_WIDTHS[i]); + } + + getSelectionModel().addListSelectionListener( + new ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + if (e.getValueIsAdjusting()) { + return; + } + + int row = getSelectedRow(); + if (row > -1) { + String id = model.getCurrentChildren().get( + getSelectedRow()).getId(); + + try { + setCursor(Cursor + .getPredefinedCursor(Cursor.WAIT_CURSOR)); + model.loadObject(id); + } catch (Exception ex) { + ClientHelper.showError(null, ex); + return; + } finally { + setCursor(Cursor + .getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + } + } + }); + + addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + doAction(); + } + } + }); + + addKeyListener(new KeyListener() { + public void keyTyped(KeyEvent e) { + } + + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + doAction(); + } + } + + public void keyPressed(KeyEvent e) { + } + }); + + loadIcons(); + } + + private void loadIcons() { + icons = new HashMap(); + icons.put(BaseTypeId.CMIS_DOCUMENT, ClientHelper + .getIcon("document.png")); + icons.put(BaseTypeId.CMIS_FOLDER, ClientHelper.getIcon("folder.png")); + icons.put(BaseTypeId.CMIS_RELATIONSHIP, ClientHelper + .getIcon("relationship.png")); + icons.put(BaseTypeId.CMIS_POLICY, ClientHelper.getIcon("policy.png")); + } + + public void folderLoaded(ClientModelEvent event) { + event.getClientModel().getCurrentChildren(); + + ((FolderTableModel) getModel()).fireTableDataChanged(); + } + + private void doAction() { + int row = getSelectedRow(); + if ((row > -1) && (row < model.getCurrentChildren().size())) { + CmisObject object = model.getCurrentChildren().get(row); + + if (object instanceof Document) { + download((Document) object); + } else if (object instanceof Folder) { + try { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + model.loadFolder(object.getId(), false); + } catch (Exception ex) { + ClientHelper.showError(null, ex); + return; + } finally { + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + } + } + } + + private void download(Document doc) { + ClientHelper.download(this.getParent(), doc, null); + } + + class FolderTableModel extends AbstractTableModel { + + private static final long serialVersionUID = 1L; + + public String getColumnName(int columnIndex) { + return COLUMN_NAMES[columnIndex]; + } + + public int getColumnCount() { + return COLUMN_NAMES.length; + } + + public int getRowCount() { + return model.getCurrentChildren().size(); + } + + public Object getValueAt(int rowIndex, int columnIndex) { + CmisObject obj = model.getCurrentChildren().get(rowIndex); + + switch (columnIndex) { + case 0: + return icons.get(obj.getBaseTypeId()); + case 1: + return obj.getName(); + case 2: + return obj.getType().getId(); + case 3: + if (obj instanceof Document) { + return ((Document) obj).getContentStreamMimeType(); + } else { + return null; + } + case 4: + if (obj instanceof Document) { + return ((Document) obj).getContentStreamLength(); + } else { + return null; + } + case 5: + return (obj.getCreationDate() == null ? null : ClientHelper + .getDateString(obj.getCreationDate())); + case 6: + return obj.getCreatedBy(); + case 7: + return (obj.getLastModificationDate() == null ? null + : ClientHelper.getDateString(obj + .getLastModificationDate())); + case 8: + return obj.getLastModifiedBy(); + case 9: + return obj.getId(); + } + + return ""; + } + + @Override + public Class getColumnClass(int columnIndex) { + if (columnIndex == 0) { + return ImageIcon.class; + } else if (columnIndex == 4) { + return Long.class; + } + + return String.class; + } + } +} Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/FolderTable.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/InfoDialog.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/InfoDialog.java?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/InfoDialog.java (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/InfoDialog.java Thu Jul 22 11:19:09 2010 @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.chemistry.opencmis.swingclient; + +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.TextArea; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +import javax.swing.BoxLayout; +import javax.swing.JDialog; +import javax.swing.JFrame; + +public class InfoDialog extends JDialog { + + private static final long serialVersionUID = 1L; + + public InfoDialog(Frame owner) { + super(owner, "Info", true); + createGUI(); + } + + private void createGUI() { + setPreferredSize(new Dimension(600, 400)); + setMinimumSize(new Dimension(200, 60)); + + setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)); + + StringBuilder readme = new StringBuilder(); + + InputStream stream = getClass().getResourceAsStream("/META-INF/README"); + if (stream != null) { + try { + BufferedReader br = new BufferedReader(new InputStreamReader( + stream)); + + String s = null; + while ((s = br.readLine()) != null) { + readme.append(s); + readme.append('\n'); + } + + br.close(); + } catch (Exception e) { + } + } else { + readme.append("CMIS Swing Client"); + } + + TextArea ta = new TextArea(readme.toString()); + ta.setEditable(false); + add(ta); + + setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); + pack(); + setLocationRelativeTo(null); + } + + public void showDialog() { + setVisible(true); + } + + public void hideDialog() { + setVisible(false); + } +} Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/InfoDialog.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LogFrame.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LogFrame.java?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LogFrame.java (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LogFrame.java Thu Jul 22 11:19:09 2010 @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.chemistry.opencmis.swingclient; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; + +public class LogFrame extends JFrame { + + private static final long serialVersionUID = 1L; + + private static final String WINDOW_TITLE = "CMIS Client Logging"; + + private JTextArea logTextArea; + + public LogFrame() { + super(); + createGUI(); + } + + private void createGUI() { + setTitle(WINDOW_TITLE); + setPreferredSize(new Dimension(800, 600)); + setMinimumSize(new Dimension(200, 60)); + + setLayout(new BorderLayout()); + + logTextArea = new JTextArea(); + logTextArea.setEditable(false); + logTextArea.setFont(new Font("Monospaced", Font.PLAIN, 12)); + logTextArea.setLineWrap(true); + logTextArea.setWrapStyleWord(true); + add(new JScrollPane(logTextArea), BorderLayout.CENTER); + + JPanel inputPanel = new JPanel(new FlowLayout()); + add(inputPanel, BorderLayout.PAGE_END); + + JButton clearButton = new JButton("Clear"); + clearButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + logTextArea.setText(""); + } + }); + inputPanel.add(clearButton); + + String[] levels = new String[] { Level.ALL.toString(), Level.TRACE.toString(), Level.DEBUG.toString(), + Level.INFO.toString(), Level.WARN.toString(), Level.ERROR.toString(), Level.FATAL.toString(), + Level.OFF.toString() }; + + final JComboBox levelBox = new JComboBox(levels); + levelBox.setSelectedItem(Logger.getRootLogger().getLevel().toString()); + levelBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Logger.getRootLogger().setLevel(Level.toLevel(levelBox.getSelectedItem().toString())); + } + }); + inputPanel.add(levelBox); + + setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); + pack(); + + setLocationRelativeTo(null); + setVisible(false); + + ClientWriterAppender.setTextArea(logTextArea); + } + + public void showFrame() { + setVisible(true); + } +} Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LogFrame.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LoginDialog.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LoginDialog.java?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LoginDialog.java (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LoginDialog.java Thu Jul 22 11:19:09 2010 @@ -0,0 +1,269 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.chemistry.opencmis.swingclient; + +import java.awt.Container; +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; + +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JTextField; + +import org.apache.chemistry.opencmis.client.api.Repository; +import org.apache.chemistry.opencmis.commons.enums.BindingType; +import org.apache.chemistry.opencmis.swingclient.model.ClientSession; + +public class LoginDialog extends JDialog { + + public static final String SYSPROP_URL = "swingclient.url"; + public static final String SYSPROP_USER = "swingclient.user"; + public static final String SYSPROP_PASSWORD = "swingclient.password"; + + private static final long serialVersionUID = 1L; + + private JTextField urlField; + private JRadioButton bindingAtomButton; + private JRadioButton bindingWebServicesButton; + private JTextField usernameField; + private JPasswordField passwordField; + private JButton connectButton; + private JButton loginButton; + private JComboBox repositoryBox; + + private boolean canceled = true; + + private ClientSession clientSession; + + public LoginDialog(Frame owner) { + super(owner, "Login", true); + createGUI(); + } + + private void createGUI() { + setPreferredSize(new Dimension(500, 250)); + + Container pane = getContentPane(); + + pane.setLayout(new GridBagLayout()); + + urlField = createTextField(pane, "URL:", 1); + urlField.setText(System.getProperty(SYSPROP_URL, "")); + + createBindingButtons(pane, 2); + + usernameField = createTextField(pane, "Username:", 3); + usernameField.setText(System.getProperty(SYSPROP_USER, "")); + + passwordField = createPasswordField(pane, "Password:", 4); + passwordField.setText(System.getProperty(SYSPROP_PASSWORD, "")); + + connectButton = createButton(pane, "Connect", 5); + + createRepositoryBox(pane, 6); + + loginButton = createButton(pane, "Login", 7); + loginButton.setEnabled(false); + + connectButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + repositoryBox.removeAllItems(); + + try { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + createClientSession(); + + List repositories = clientSession + .getRepositories(); + if (repositories.size() > 0) { + + for (Repository repository : repositories) { + repositoryBox.addItem(repository.getName() + " (" + + repository.getId() + ")"); + } + + repositoryBox.setEnabled(true); + loginButton.setEnabled(true); + } else { + repositoryBox.setEnabled(false); + loginButton.setEnabled(false); + } + } catch (Exception ex) { + repositoryBox.setEnabled(false); + loginButton.setEnabled(false); + + ClientHelper.showError(getOwner(), ex); + } finally { + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + } + }); + + loginButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + clientSession.createSession(repositoryBox + .getSelectedIndex()); + canceled = false; + hideDialog(); + } catch (Exception ex) { + repositoryBox.setEnabled(false); + loginButton.setEnabled(false); + + ClientHelper.showError(getOwner(), ex); + } + } + }); + + setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); + pack(); + setLocationRelativeTo(null); + } + + private JTextField createTextField(Container pane, String label, int row) { + JTextField textField = new JTextField(60); + JLabel textLabel = new JLabel(label); + textLabel.setLabelFor(textField); + + GridBagConstraints c = new GridBagConstraints(); + c.anchor = GridBagConstraints.LINE_START; + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = row; + pane.add(textLabel, c); + c.gridx = 1; + c.ipadx = 400; + pane.add(textField, c); + + return textField; + } + + private JPasswordField createPasswordField(Container pane, String label, + int row) { + JPasswordField textField = new JPasswordField(60); + JLabel textLabel = new JLabel(label); + textLabel.setLabelFor(textField); + + GridBagConstraints c = new GridBagConstraints(); + c.anchor = GridBagConstraints.LINE_START; + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = row; + pane.add(textLabel, c); + c.gridx = 1; + pane.add(textField, c); + + return textField; + } + + private void createBindingButtons(Container pane, int row) { + JPanel bindingContainer = new JPanel(); + bindingAtomButton = new JRadioButton("AtomPub", true); + bindingWebServicesButton = new JRadioButton("Web Services", false); + ButtonGroup bindingGroup = new ButtonGroup(); + bindingGroup.add(bindingAtomButton); + bindingGroup.add(bindingWebServicesButton); + bindingContainer.add(bindingAtomButton); + bindingContainer.add(bindingWebServicesButton); + JLabel bindingLabel = new JLabel("Binding:"); + + GridBagConstraints c = new GridBagConstraints(); + c.anchor = GridBagConstraints.LINE_START; + c.gridx = 0; + c.gridy = row; + pane.add(bindingLabel, c); + c.gridx = 1; + pane.add(bindingContainer, c); + } + + private JButton createButton(Container pane, String label, int row) { + JButton button = new JButton(label); + + GridBagConstraints c = new GridBagConstraints(); + c.anchor = GridBagConstraints.CENTER; + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 1; + c.gridy = row; + pane.add(button, c); + + return button; + } + + private void createRepositoryBox(Container pane, int row) { + repositoryBox = new JComboBox(); + repositoryBox.setEnabled(false); + JLabel boxLabel = new JLabel("Repository:"); + boxLabel.setLabelFor(repositoryBox); + + GridBagConstraints c = new GridBagConstraints(); + c.anchor = GridBagConstraints.LINE_START; + c.fill = GridBagConstraints.HORIZONTAL; + c.gridx = 0; + c.gridy = row; + pane.add(boxLabel, c); + c.gridx = 1; + pane.add(repositoryBox, c); + } + + public void createClientSession() { + String url = urlField.getText(); + BindingType binding = bindingAtomButton.isSelected() ? BindingType.ATOMPUB + : BindingType.WEBSERVICES; + String username = usernameField.getText(); + String password = new String(passwordField.getPassword()); + + clientSession = new ClientSession(url, binding, username, password); + } + + public void showDialog() { + clientSession = null; + canceled = true; + + repositoryBox.removeAllItems(); + repositoryBox.setEnabled(false); + loginButton.setEnabled(false); + + setVisible(true); + } + + public void hideDialog() { + setVisible(false); + } + + public ClientSession getClientSession() { + return clientSession; + } + + public boolean isCanceled() { + return canceled; + } +} Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/LoginDialog.java ------------------------------------------------------------------------------ svn:eol-style = native Added: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/QueryFrame.java URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/QueryFrame.java?rev=966582&view=auto ============================================================================== --- incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/QueryFrame.java (added) +++ incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/QueryFrame.java Thu Jul 22 11:19:09 2010 @@ -0,0 +1,345 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.chemistry.opencmis.swingclient; + +import java.awt.Cursor; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.datatransfer.Transferable; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Map; + +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JFormattedTextField; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.JTable; +import javax.swing.JTextArea; +import javax.swing.table.AbstractTableModel; +import javax.swing.text.NumberFormatter; + +import org.apache.chemistry.opencmis.client.api.ItemIterable; +import org.apache.chemistry.opencmis.client.api.QueryResult; +import org.apache.chemistry.opencmis.commons.data.PropertyData; +import org.apache.chemistry.opencmis.swingclient.model.ClientModel; + +public class QueryFrame extends JFrame { + + private static final long serialVersionUID = 1L; + + private static final String WINDOW_TITLE = "CMIS Query"; + private static final String DEFAULT_QUERY = "SELECT * FROM cmis:document"; + + private ClientModel model; + + private JTextArea queryText; + private JFormattedTextField maxHitsField; + private JCheckBox searchAllVersionsCheckBox; + private JTable resultsTable; + private JLabel queryTimeLabel; + + public QueryFrame(ClientModel model) { + super(); + + this.model = model; + createGUI(); + } + + private void createGUI() { + setTitle(WINDOW_TITLE + " - " + model.getRepositoryName()); + setPreferredSize(new Dimension(800, 600)); + setMinimumSize(new Dimension(200, 60)); + + setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS)); + + // input + JPanel inputPanel = new JPanel(); + inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.LINE_AXIS)); + + queryText = new JTextArea(DEFAULT_QUERY, 5, 60); + inputPanel.add(queryText); + + JPanel inputPanel2 = new JPanel(); + inputPanel2.setPreferredSize(new Dimension(160, 100)); + inputPanel2.setMaximumSize(inputPanel.getPreferredSize()); + inputPanel2.setLayout(new GridBagLayout()); + + GridBagConstraints c = new GridBagConstraints(); + c.fill = GridBagConstraints.HORIZONTAL; + + JButton queryButton = new JButton("Query"); + queryButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + doQuery(); + } + }); + + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 2; + inputPanel2.add(queryButton, c); + + maxHitsField = new JFormattedTextField(new NumberFormatter()); + maxHitsField.setValue(new Integer(100)); + maxHitsField.setColumns(5); + + JLabel maxHitsLabel = new JLabel("Max hits:"); + maxHitsLabel.setLabelFor(maxHitsField); + + c.gridx = 0; + c.gridy = 1; + c.gridwidth = 1; + inputPanel2.add(maxHitsLabel, c); + c.gridx = 1; + c.gridy = 1; + c.gridwidth = 1; + inputPanel2.add(maxHitsField, c); + + searchAllVersionsCheckBox = new JCheckBox("search all versions", false); + c.gridx = 0; + c.gridy = 2; + c.gridwidth = 2; + inputPanel2.add(searchAllVersionsCheckBox, c); + + queryTimeLabel = new JLabel("(-- hits in -- seconds)"); + c.gridx = 0; + c.gridy = 3; + c.gridwidth = 2; + inputPanel2.add(queryTimeLabel, c); + + inputPanel.add(inputPanel2); + + // table + resultsTable = new JTable(); + resultsTable.setFillsViewportHeight(true); + resultsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + + final JPopupMenu popup = new JPopupMenu(); + JMenuItem menuItem = new JMenuItem("Copy to clipboard"); + popup.add(menuItem); + + menuItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + StringBuilder sb = new StringBuilder(); + int rows = resultsTable.getModel().getColumnCount(); + for (int row = 0; row < rows; row++) { + int cols = resultsTable.getModel().getColumnCount(); + for (int col = 0; col < cols; col++) { + sb.append(resultsTable.getModel().getValueAt(row, col)); + sb.append("|"); + } + sb.append("\n"); + } + + Clipboard clipboard = Toolkit.getDefaultToolkit() + .getSystemClipboard(); + Transferable transferable = new StringSelection(sb.toString()); + clipboard.setContents(transferable, null); + } + }); + + resultsTable.addMouseListener(new MouseListener() { + public void mouseExited(MouseEvent e) { + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseClicked(MouseEvent e) { + } + + public void mousePressed(MouseEvent e) { + maybeShowPopup(e); + } + + public void mouseReleased(MouseEvent e) { + maybeShowPopup(e); + } + + private void maybeShowPopup(MouseEvent e) { + if (e.isPopupTrigger()) { + popup.show(e.getComponent(), e.getX(), e.getY()); + } + } + }); + + add(new JSplitPane(JSplitPane.VERTICAL_SPLIT, inputPanel, + new JScrollPane(resultsTable))); + + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + pack(); + + setLocationRelativeTo(null); + setVisible(true); + } + + private synchronized void doQuery() { + String text = queryText.getText(); + text.replace('\n', ' '); + + ItemIterable results = null; + + try { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + int maxHits = 1000; + try { + maxHitsField.commitEdit(); + maxHits = ((Number) maxHitsField.getValue()).intValue(); + } catch (Exception e) { + } + + results = model.query(text, searchAllVersionsCheckBox.isSelected(), + maxHits); + + ResultTableModel rtm = new ResultTableModel(); + + long startTime = System.currentTimeMillis(); + + int row = 0; + for (QueryResult qr : results.getPage(maxHits)) { + rtm.setColumnCount(Math.max(rtm.getColumnCount(), qr + .getProperties().size())); + + for (PropertyData prop : qr.getProperties()) { + rtm + .setValue(row, prop.getQueryName(), prop + .getFirstValue()); + } + + row++; + } + rtm.setRowCount(row); + + long stopTime = System.currentTimeMillis(); + float time = ((float) (stopTime - startTime)) / 1000f; + queryTimeLabel + .setText("(" + row + " hits in " + time + " seconds)"); + + resultsTable.setModel(rtm); + } catch (Exception ex) { + ClientHelper.showError(null, ex); + return; + } finally { + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + } + + static class ResultTableModel extends AbstractTableModel { + + private static final long serialVersionUID = 1L; + + private int columnCount = 0; + private int rowCount = 0; + private Map columnMapping = new HashMap(); + private Map> data = new HashMap>(); + private Map> columnClass = new HashMap>(); + + public ResultTableModel() { + } + + public void setColumnCount(int columnCount) { + this.columnCount = columnCount; + } + + public int getColumnCount() { + return columnCount; + } + + public void setRowCount(int rowCount) { + this.rowCount = rowCount; + } + + public int getRowCount() { + return rowCount; + } + + public void setValue(int rowIndex, String queryName, Object value) { + Integer col = columnMapping.get(queryName); + if (col == null) { + col = columnMapping.size(); + columnMapping.put(queryName, columnMapping.size()); + } + + if (value == null) { + return; + } + + if (value instanceof GregorianCalendar) { + value = ClientHelper.getDateString((GregorianCalendar) value); + } + + columnClass.put(col, value.getClass()); + + Map row = data.get(rowIndex); + if (row == null) { + row = new HashMap(); + data.put(rowIndex, row); + } + + row.put(col, value); + } + + public Object getValueAt(int rowIndex, int columnIndex) { + Map row = data.get(rowIndex); + if (row == null) { + return null; + } + + return row.get(columnIndex); + } + + @Override + public String getColumnName(int column) { + for (Map.Entry e : columnMapping.entrySet()) { + if (e.getValue().equals(column)) { + return e.getKey(); + } + } + + return "?"; + } + + @Override + public Class getColumnClass(int columnIndex) { + Class clazz = columnClass.get(columnIndex); + if (clazz != null) { + return clazz; + } + + return String.class; + } + } +} Propchange: incubator/chemistry/opencmis-swingclient/trunk/src/main/java/org/apache/chemistry/opencmis/swingclient/QueryFrame.java ------------------------------------------------------------------------------ svn:eol-style = native