⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sendimtabwindow.java

📁 lumaQQ的源文件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
				enterMenu.setLocation(btnSend.getParent().toDisplay(bound.x, bound.y + bound.height));
				// 显示菜单
				enterMenu.setVisible(true);
            }
		});
        
		// 聊天记录面板
		viewer = new RecordViewer(container, new FriendRecordProvider(null), main);
		viewer.setFont(res.getDefaultFont());
		viewer.setVisible(false);
		viewer.setRecordManager(main.getRecordManager());
		viewer.setBackground(container.getBackground());
		gd = new GridData(GridData.FILL_HORIZONTAL);
		gd.horizontalSpan = 2;
		gd.heightHint = 200;
		gd.exclude = true;
		viewer.setLayoutData(gd);
		// tableitem双击事件监听器
		viewer.addSelectionListener(
			new SelectionAdapter() {
				public void widgetDefaultSelected(SelectionEvent e) {
					IIMContainer container = getActiveContainer();
					if(container != null)
						container.appendText(viewer.getSelectedText());
				}
			}
		);
		
		// 初始化
		initEnterMenu();
		
        return container;
	}
    
    /**
     * 	切换到下一个标签
     */
    protected void nextTab() {
    	int index = folder.getSelectionIndex();
    	if(index == -1 || index >= folder.getItemCount() - 1) {
    		if(folder.getItemCount() > 0) {
    			folder.setSelection(0);
    			onTabSelection();
    		}
    	} else if(folder.getItemCount() > index + 1) {
    		folder.setSelection(index + 1);
    		onTabSelection();
    	}
	}
    
    /**
     * 切换到上一标签
     */
    protected void previousTab() {
    	int index = folder.getSelectionIndex();
    	if(index == -1 || index == 0) {
    		if(folder.getItemCount() > 0) {
    			folder.setSelection(folder.getItemCount() - 1);
    			onTabSelection();
    		}
    	} else if(index > 0) {
    		folder.setSelection(index - 1);
    		onTabSelection();
    	} 
    }    
	
	/**
	 * 切换到下一个有消息未读的tab,如果没有,则保持不变
	 */
	protected void nextUnreadTab() {
		int count = folder.getItemCount();
    	int index = folder.getSelectionIndex();
    	if(index == -1 || index >= folder.getItemCount() - 1) {
  			for(int i = 0; i < count; i++) {
				if(getContainer(i).getUnreadCount() > 0) {
	    			folder.setSelection(i);
	    			onTabSelection();
	    			return;
				}
			}
    	} else if(count > index + 1) {
  			for(int i = index + 1; i < count; i++) {
				if(getContainer(i).getUnreadCount() > 0) {
	    			folder.setSelection(i);
	    			onTabSelection();
	    			return;
				}
			}
 			for(int i = 0; i < index; i++) {
				if(getContainer(i).getUnreadCount() > 0) {
	    			folder.setSelection(i);
	    			onTabSelection();
	    			return;
				}
			}
    	}
	}

	/**
     * @return
     * 		活动消息容器
     */
    protected IIMContainer getActiveContainer() {
		CTabItem tab = folder.getSelection();
		if(tab == null)
			return null;
		
		return (IIMContainer)tab.getControl();
	}
    
    /**
     * 得到第index个container
     * 
     * @param index
     * @return
     */
    private IIMContainer getContainer(int index) {
    	CTabItem tab = folder.getItem(index);
    	return (IIMContainer)tab.getControl();
    }

	/**
     * 清空相关数据
     * 
     * @param container
     */
    protected void clearContainerRegistry(IIMContainer container) {
		main.getClient().removeQQListener(container);
		model2container.remove(container.getModel());
		model2tab.remove(container.getModel());
		id2model.remove(container.getId());
		container.release();
	}

	/* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#getInitialSize()
     */
	@Override
    protected Point getInitialSize() {
        return new Point(500, 470);
    }
	
    /* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#getShellStyle()
     */
	@Override
    protected int getShellStyle() {
		int onTop = main.getOptionHelper().isIMOnTop() ? SWT.ON_TOP : SWT.NONE;
		if(LumaQQ.IS_GTK)
			return SWT.NO_TRIM | SWT.NO_BACKGROUND | onTop;
		else
			return SWT.SHELL_TRIM | onTop;
    }
	
    /* (non-Javadoc)
     * @see org.eclipse.jface.window.Window#getInitialLocation(org.eclipse.swt.graphics.Point)
     */
    protected Point getInitialLocation(Point initialSize) {
		// 缺省实现是把窗口居中
		Rectangle displayRect = main.getDisplay().getClientArea();
		int y = (displayRect.height - initialSize.y) / 2 - 100;
		if(y < 0)
			y = 0;
		return new Point((displayRect.width - initialSize.x) / 2, y);
    }

	/**
	 * 显示/隐藏聊天记录
	 */
	protected void showRecord() {
		IIMContainer container = getActiveContainer();
		if(container == null)
			return;
		
        GridData gd = (GridData)viewer.getLayoutData();
        Shell shell = getShell();
		if(gd.exclude) {
			gd.exclude = false;		
			refreshRecord(container);
		} else {
			gd.exclude = true;
		}
        if(!shell.getMaximized()) {
			Point p = shell.getSize();
			shell.setSize(p.x, p.y + (gd.exclude ? -205 : 205));						    
		}  
		viewer.setVisible(!gd.exclude);
        viewer.getParent().layout();
        shell.layout();
	}

	/**
	 * 刷新聊天记录
	 * 
	 * @param container
	 */
	private void refreshRecord(IIMContainer container) {
		IRecordProvider provider = viewer.getProvider();
		Model model = container.getModel();
		if(model instanceof User && !(provider instanceof FriendRecordProvider))
			viewer.setProvider(new FriendRecordProvider((User)model));
		else if(model instanceof Cluster && !(provider instanceof ClusterRecordProvider))
			viewer.setProvider(new ClusterRecordProvider((Cluster)model));
		else
			viewer.getProvider().setModel(model);
		viewer.refreshRecord();
	}
	
    /**
     * 设置窗口激活
     */
    public void setActive() {
        getShell().setActive();
    }
    
	public boolean isActive() {
		return active;
	}
    
    /**
     * 设置最小化状态
     * 
     * @param b
     */
    public void setMinimized(boolean b) {
        getShell().setMinimized(b);
    }

    /**
     * 设置焦点
     */
    public void setFocus() {
        getShell().setFocus();
    }
    
    /**
     * 添加标签页
     */
    public IIMContainer addTabIM(Model model) {
    	if(hasContainer(model))
    		return model2container.get(model);
    	
    	CTabItem tab = new CTabItem(folder, SWT.CLOSE);
    	IIMContainer container = null;    	
    	if(model instanceof User)
    		container = new NormalIMContainer(folder);
    	else
    		container = new ClusterIMContainer(folder);
    	container.setModel(model);
    	container.setMainShell(main);
    	container.setKeyHandler(keyHandler);
    	tab.setControl(container.getComposite());
    	tab.setImage(container.getHead());
    	tab.setText(container.getDisplayedName());
    	
    	model2tab.put(model, tab);
    	model2container.put(model, container);
    	id2model.put(container.getId(), model);

    	if(folder.getItemCount() == 1) {
    		folder.setSelection(tab);
    		onTabSelection();    		
    	}
    	
    	if(viewer.getVisible())
    		refreshRecord(container);
    	
    	container.setKeyboardFocus();
    	main.getClient().addQQListener(container);
    	container.init();
    	return container;
    }
    
    /**
     * @param id
     * 		Model的id
     * @return
     * 		true标明已经有了这个im容器
     */
    protected boolean hasContainer(int id) {
    	return id2model.containsKey(id);
    }
    
    /**
     * @param model
     * 		Model
     * @return
     * 		true标明已经有了这个im容器
     */
    public boolean hasContainer(Model model) {
    	return model2tab.containsKey(model);
    }
    
    /**
     * 刷新tab显示
     * 
     * @param model
     */
    public void refreshTab(Model model) {
    	CTabItem tab = model2tab.get(model);
    	if(tab == null)
    		return;
    	
    	IIMContainer container = model2container.get(model);
    	if(container == null)
    		return;
    	
    	container.setModel(model);
    	tab.setImage(container.getHead());
    	tab.setText(container.getDisplayedName());
    }
    
    /**
     * 激活一个容器
     * 
     * @param model
     * 		Model
     */
    public void activeContainer(Model model) {
    	IIMContainer container = model2container.get(model);
    	if(container == null)
    		return;
    	CTabItem newActiveTab = model2tab.get(model);
    	if(newActiveTab == null)
    		return;

    	folder.setSelection(newActiveTab);
    	((IIMContainer)newActiveTab.getControl()).setKeyboardFocus();
    }
    
    /**
     * 推入一个消息
     * 
     * @param model
     * 		Model
     * @param packet
     * 		消息包对象
     */
    public void putMessage(Model model, ReceiveIMPacket packet) {
    	IIMContainer container = model2container.get(model);
    	if(container == null)
    		container = addTabIM(model);
    	
    	container.putMessage(packet);
    	if(!container.isActiveContainer())
    		refreshTabText(container);
    }

    @Override
    protected Shell getParentShell() {
    	return null;
    }
    
	/**
	 * @param container
	 */
	private void refreshTabText(IIMContainer container) {
		Model m = container.getModel();
		CTabItem tab = model2tab.get(m);
		if(tab != null) {
			StringBuilder sb = new StringBuilder();
			if(container.getUnreadCount() > 0) {
				sb.append('(')
					.append(container.getUnreadCount())
					.append(')')				
					.append(' ');
			};
			sb.append(container.getDisplayedName());
			tab.setText(sb.toString());    			
		}
	}

	/**
	 * 当前tab改变后调用此方法
	 */
	private void onTabSelection() {
		IIMContainer container = getActiveContainer();
		if(activeContainer != null) {
			activeContainer.setActive(false);
			refreshTabText(activeContainer);
		}
		activeContainer = container;
		if(activeContainer != null) {
			activeContainer.setActive(true);
			refreshTabText(activeContainer);
		}
		
		container.setKeyboardFocus();
		if(viewer.getVisible()) {
			if(container != null && container.getModel() != viewer.getProvider().getModel())
				refreshRecord(container);
		}
	}
	
    /**
     * 停止闪烁图标
     */
    protected void stopBlinkImage() {
        blinkRunnable.setStop(true);
    }
    
    /**
     * 开始闪烁图标
     */
    public void startBlinkImage() {
        if(!blinkRunnable.isStop()) return;
        blinkRunnable.setStop(false);
        main.getDisplay().timerExec(0, blinkRunnable);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -